GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — [connectors] Retry DynamoDB writes through throttling and report health by bestouff · Pull Request #7736 · feldera/feldera

Conversation

@bestouff

@bestouff bestouff commented Oct 30, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

Closes #7595.

A BatchWriteItem request that failed with a service error, throttling included, was returned at once: the chunk was dropped as soon as the AWS SDK's own three attempts ran out. Only unprocessed items in a successful response were retried. The transactional writer retried every error, the permanent ones too, forever when max_retries was null. Neither reported the health of the sink. A chunk that gave up also failed the worker's next flush before that flush sent its own chunk, so the rest of the step was lost and never counted.

What changes

The connector classifies a failed request before it decides what to do with it:

Error Action
Throttling, timeout, network, 5xx, transient or stale credentials Retry, budgeted by max_retries
Transaction cancelled by a transient item error, or by a reason this connector does not know Retry the rest
Validation, missing table, denied access, bad config Drop the chunk at once
  • One max_retries budget covers unprocessed items, transient cancellations and retryable request errors in both write modes. null retries until DynamoDB recovers.
  • The retryable code lists come from aws-runtime, which the DynamoDB SDK already pulls in, so they cannot drift from the SDK's own retry behaviour. UnrecognizedClientException and ExpiredTokenException are retried too, since the SDK's identity cache refreshes the credentials on a later attempt.
  • A credential-provider failure comes as a dispatch failure with no retry kind, so the source chain decides: only InvalidConfiguration is permanent.
  • A chunk that gives up no longer drops the rest of its step. The worker holds the errors of finished chunks until the batch ends, every flush still sends its own chunk, and the rows that landed are counted whether or not a chunk of the step failed.
  • Diagnostics keep the service's code, message, throttling reasons, cancellation reasons and request id, and drop the raw HTTP response.

Health and metrics

The chunk writers of one endpoint share a RetryHealth that publishes the sink:

State When
Unchanged A chunk has retried for less than 10 seconds: a retry under load is no outage
Unhealthy, with the cause A chunk has retried for 10 seconds or more
Unhealthy, with the failure A chunk gave up; this outranks the cause of a retry in progress
Healthy No chunk retries and a chunk has landed

A pipeline stop releases the count without a report. New gauge dynamodb_output_retrying_chunks shows the chunks retrying now; dynamodb_output_retries_total now counts retries as they start; dynamodb_output_transact_write_failures_total counts every failed request, retried or not.

Tests

  • Unit tests drive a wiremock DynamoDB through throttling, partial success, cancellation reasons, credential failures, the exact budget, the health threshold, concurrent retries, a failure beside a retry loop and shutdown. wiremock is an optional dependency under the testing feature.
  • Five connector-suite cases run the real controller: health through a throttling outage, a stop during an outage that never ends, and a permanent failure in the middle of a step, the last two in both write modes.
  • Fourteen reverts (batch retry, classifier, health report, retry count, guard drop, transactional fallback, the threshold, the failure precedence, the reclassified codes, the flush that kept bailing, the skipped output counters, and more) each make the named test fail.
  • No manual run against AWS: DynamoDB Local never throttles, so the throttling paths are covered by the wiremock server and the controller suite only.

Docs: max_retries description and a new "Retries and health" section in the DynamoDB sink page, plus a changelog entry.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@bestouff
bestouff force-pushed the issue-7595 branch 2 times, most recently from 1cf852f to bb7d3a6 Compare October 30, 2026 15:38
@bestouff
bestouff requested a review from ryzhyk October 30, 2026 15:45
@ryzhyk

ryzhyk commented Oct 30, 2026

Copy link
Copy Markdown
Contributor

I asked claude to investigate specific areas of this PR. It found some issues. Some of them need your judgement call.

The most important one is the data loss issue (section 3). Apparently this is not a new behavior, but it seems wrong, and needs fixing in this or separate PR.


  1. Misclassified errors
  • ExpiredTokenException and UnrecognizedClientException are treated as permanent (probe, status 400 and 403). The chunk is dropped at once, even with max_retries: null.
    • AWS lists UnrecognizedClientException as "OK to retry: Yes".
    • The ExpiredTokenException message says to get a new token and try again. The SDK fetches fresh credentials on a later attempt.
    • Neither code is in a retry list, so helpers::classify_sdk_error falls through to Permanent: /Users/leonid/projects/feldera.pr7736/crates/connectors/src/integrated/dynamodb/helpers.rs:91
  • An unknown transaction cancellation code is treated as permanent (probe), dropping the whole transaction. This contradicts the PR's own rule that unknown failures are retried. Low risk today: all seven documented codes are handled. /Users/leonid/projects/feldera.pr7736/crates/connectors/src/integrated/dynamodb/helpers.rs:582
  1. Data lost while success is declared

One permanent failure silently drops the rest of the worker's step (confirmed end to end). This is old behavior in batch mode. The PR exposes transactional mode to it, because that mode used to retry permanent errors forever (stalling instead of losing data).

  • Setup: 10 records, batch_size: 2, max_retries: null, and ValidationException on the chunk holding record 1.
  • Result: 4 records landed and 2 were counted in failed_items. The other 4 were never sent and never counted, and health ended Ok(()).
  • Mechanism: DynamoDBWorker::flush picks up the earlier chunk's error and returns before sending its own chunk. DynamoDBWorker::encode_cursor then stops encoding at push_request(..)?.
    • /Users/leonid/projects/feldera.pr7736/crates/connectors/src/integrated/dynamodb/output.rs:305
    • /Users/leonid/projects/feldera.pr7736/crates/connectors/src/integrated/dynamodb/output.rs:496
  • Reporting: the controller logs this as an encode error that names only the 2 dropped items.
  • Variant: if the end-of-step flush is the one that picks up the error, the next step's batch_start_inner discards the unsent chunk (probe).
  • Fix: flush should always send its chunk and hold other chunks' errors until batch_end_inner.
  1. Incorrectly reported metrics
  • dynamodb_output_transact_write_failures_total: the help text says "failed and were retried", but it also counts permanent failures that are never retried. It also skips cancellations caused only by condition failures. /Users/leonid/projects/feldera.pr7736/crates/connectors/src/integrated/dynamodb/metrics.rs:160
  • dynamodb_output_failed_items_total: it misses the section 3 losses and chunks abandoned at a stop, though the docs say it "counts the records discarded".
  • transmitted_records and transmitted_bytes (old behavior): if any chunk in a step fails, DynamoDBOutputEndpoint::batch_end skips output_buffer. The chunks that did land in that step then go uncounted. /Users/leonid/projects/feldera.pr7736/crates/connectors/src/integrated/dynamodb/output.rs:836
  1. Missing test coverage
  • No test pins health on a partial success or a TransactionConflict, which is your question.
  • No endpoint-level test has a permanent failure in the middle of a step. That gap hides section 3.
  • No test covers the auth codes or an unknown cancellation code.
  • a_failure_beside_a_retry_loop_stays_unhealthy_until_the_loop_lands lets the slow chunk succeed straight away, so it never checks whether the failure survives a further retry. It doesn't.
  • stop_during_an_unbounded_outage collects errors but never asserts on them, which is how the stop-time error goes unnoticed.
  • Every endpoint and controller test uses threads: 1. Nothing checks that all workers of an endpoint share one health tracker.
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

ryzhyk
ryzhyk reviewed Oct 30, 2026
View reviewed changes
Comment thread docs.feldera.com/docs/connectors/sinks/dynamodb.md Resolved

Uh oh!

There was an error while loading. Please reload this page.

@bestouff
bestouff force-pushed the issue-7595 branch from f02bb62 to 036d383 Compare November 2, 2026 15:54
@bestouff
bestouff marked this pull request as draft November 2, 2026 17:45
@bestouff
bestouff force-pushed the issue-7595 branch from 47b0963 to 6d8ebe6 Compare November 3, 2026 17:06
@bestouff
bestouff marked this pull request as ready for review November 3, 2026 17:07
mythical-fred-oss[bot]
mythical-fred-oss Bot reviewed Nov 3, 2026
View reviewed changes
Comment thread crates/connectors/src/integrated/dynamodb/output.rs
}

/// The errors held since the last batch end, joined into one.
fn take_write_errors(&mut self) -> Option<anyhow::Error> {

@mythical-fred-oss mythical-fred-oss Bot Nov 3, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pitfall (medium): write_errors has no bound now that a mid-step flush no longer bails. If every chunk fails permanently (for example a missing table or denied access), every chunk of the step sends its request, and each failure is joined into one string here and logged with its own warn!. I ran a QA test with 2000 chunks of 1 item against ResourceNotFoundException: 2000 requests and a 434 KB error message. A step of 1M rows at batch_size=25 would make about 9 MB, sent to output_transport_error and the logs. Could you dedupe the errors by cause, or keep the first N plus a count ("…and 39 998 more")? Stopping the step after the first permanent error would also avoid the pointless requests.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
mythical-fred-oss[bot]
mythical-fred-oss Bot reviewed Nov 3, 2026
View reviewed changes
Comment thread crates/connectors/src/integrated/dynamodb/helpers.rs
// The credentials the request carried are stale or not yet valid: a
// rotated role, a key that is still propagating, a token past its
// expiry. The SDK's identity cache refreshes them on a later attempt.
"UnrecognizedClientException",

@mythical-fred-oss mythical-fred-oss Bot Nov 3, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pitfall (medium): DynamoDB also returns UnrecognizedClientException for a static aws_access_key_id that is simply wrong (a typo or a deleted key), not only for a stale one. With this list, that misconfiguration retries for the whole budget (about a minute by default) and forever with max_retries: null. It only looks like a slow throttle (the cause shows after 10 s), and nothing drops it at once. That contradicts the docs, which say "denied access, or an invalid credential configuration, discards the chunk at once". Could you retry these codes only when credentials come from a refreshing provider (not static keys), or cap them at a few retries whatever the budget? At minimum, document the behaviour.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
mythical-fred-oss[bot]
mythical-fred-oss Bot reviewed Nov 3, 2026
View reviewed changes
Comment thread crates/connectors/src/integrated/dynamodb/test.rs Outdated
);
assert_eq!(gate.entered(), 1);
assert_eq!(harness.metric("dynamodb_output_retrying_chunks"), 1.0);
assert!(harness.publisher.reports().is_empty());

@mythical-fred-oss mythical-fred-oss Bot Nov 3, 2026

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

flaky (medium): This assertion races a 500 ms wall-clock timer. The overdue timeout starts when the chunk enters its delay, before gate.entered() returns. If the test thread is descheduled for more than 500 ms between that recv and this check (as happens on a loaded CI runner), the report has already landed and the test fails. It passed 15/15 for me under CPU load, but the window is real. The unit test a_retry_counts_without_a_report already covers "no report before the threshold", so I suggest dropping this line (and making the poll loop below do the work). Alternatively, use a threshold large enough that a stall can't reach it.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@mythical-fred-oss

mythical-fred-oss Bot commented Nov 3, 2026

Copy link
Copy Markdown
Contributor

Review summary: DynamoDB retry classification + health

What I ran

Check Result
cargo test -p dbsp_connectors --features with-dynamodb --lib dynamodb 58 pass. 1 fail (dynamodb_progress_counter_batch_start_resets) needs DynamoDB Local; environmental, not this PR
cargo test -p static-connectors --test connector_suites (the 5 new controller cases + dynamodb_retried_write_resends_every_sql_type), ×3 all pass, 3/3 runs. The pre-existing buffer_flushes_by_* cases need DynamoDB Local
a_long_retry_loop_turns_unhealthy_after_the_threshold ×15 under full CPU load 15/15 pass, but the timing window is real (see inline)
QA: every chunk of a 2000-chunk step hits a permanent error 2000 requests and a 434 KB joined error (see inline)
pre-commit run timed out installing hooks here; not verified

Gates

  • Tests, docs (sink page + changelog), SQL type coverage (all-types retry test), deps (Apache/MIT, wiremock test-only under testing), no unsafe, no workflow changes: OK.
  • Flaky tests (medium): one wall-clock 500 ms race in a unit test. The zero-tolerance gate asks for a fix before merge.

Issues

  • pitfall (medium): UnrecognizedClientException is retryable, so a wrong static key retries for the whole budget, or forever with null. This contradicts the docs.
  • pitfall (medium): errors from failed chunks pile up with no bound now that a flush no longer stops the step.
  • missing (medium): no test for a permanent error on many chunks in one step, i.e. the size of the error and the log. A test for a large step against a missing table would pin the fix down.
  • tech-debt (low): dynamodb_region() treats an empty AWS_REGION as set. Unrelated to this PR, but it makes the new suite cases fail in environments that export an empty AWS_REGION.
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bestouff
bestouff force-pushed the issue-7595 branch from 6d8ebe6 to e18aa1b Compare November 3, 2026 17:43
@bestouff
bestouff requested a review from ryzhyk November 3, 2026 17:43
bestouff added 4 commits November 3, 2026 20:58
@bestouff
[connectors] Retry DynamoDB writes through throttling and report health
32b6601
A `BatchWriteItem` request that failed with a service error, throttling
included, was returned at once: the chunk was dropped as soon as the AWS
SDK's own three attempts ran out. Only unprocessed items in a successful
response were retried. The transactional writer retried every error, the
permanent ones too, forever when `max_retries` was null. Neither reported
the health of the sink.

Classify a failed request before deciding what to do with it:

| Error                                                   | Action        |
|---------------------------------------------------------|---------------|
| Throttling, timeout, network, 5xx, transient credentials | Retry, budgeted |
| Transaction cancelled by a transient item error         | Retry the rest |
| Validation, missing table, denied access, bad config    | Drop at once  |

One `max_retries` budget covers unprocessed items, transient
cancellations and retryable request errors in both write modes. A
credential-provider failure comes as a dispatch failure with no retry
kind, so the source chain decides: only `InvalidConfiguration` is
permanent. Diagnostics keep the service's code, message, throttling
reasons and request id, and drop the raw HTTP response.

The chunk writers of one endpoint share a `RetryHealth` that publishes
the sink unhealthy while a chunk retries, with the cause, unhealthy
after a chunk gives up, and healthy once no chunk retries and a chunk
has landed. A pipeline stop releases the count without a report. The
gauge `dynamodb_output_retrying_chunks` shows the chunks retrying now,
and `dynamodb_output_retries_total` counts retries as they start.

The retry loops get a delay seam, and the tests drive a wiremock
DynamoDB through throttling, partial success, cancellation reasons,
credential failures, the exact budget, concurrent retries and shutdown.
Three connector-suite cases run the real controller: health through a
throttling outage, and a stop during an outage that never ends, in both
write modes. With the batch retry, the classifier or the health report
reverted, the matching tests fail.

Closes #7595.

Signed-off-by: Xavier Bestel <[email protected]>
@bestouff
[connectors] Use the SDK's retryable code lists for DynamoDB
31f0677
The throttling and transient error code lists were copied from
`aws-runtime`, which is already in the dependency graph of the DynamoDB
SDK and exports both lists. A copy drifts from the SDK's own retry
behaviour when the SDK extends its list. Depend on the crate under
`with-dynamodb`, like the other SDK crates the classifier names, and
read the lists from it.

Signed-off-by: Xavier Bestel <[email protected]>
@bestouff
[connectors] Preserve DynamoDB diagnostics and test recovery
96e1e25
Transaction cancellations lost the item reasons that explain why a write
was rejected, and response errors still included the raw HTTP response.
Keep cancellation codes and messages, and describe response errors using
their source chain, status, and request ID. Omit returned item data.

Hold the controller test's mock outage until it has checked health and
retry metrics. Compile the no-op health publisher and its import only in
test builds, so production lint fixes cannot break the connector suites.

Add regression coverage for cancellation details and response formatting.
Validate with 53 DynamoDB unit tests, 47 connector integration tests against
DynamoDB Local, five recovery-test repetitions, and all-target Clippy with
warnings denied.

Signed-off-by: Xavier Bestel <[email protected]>
@bestouff
[connectors] Keep a DynamoDB step after one chunk fails, report healt…
c82f565
…h late

A chunk that gave up failed the worker's next flush before that flush
sent its own chunk, and the encode loop stopped at the failed push. The
rest of the step was never sent and never counted, while the error named
only the chunk that failed. Hold the errors of finished chunks in the
worker until the batch ends, so that a flush always sends its chunk, and
count the rows that landed in a step whether or not a chunk of it gave up.

Report the endpoint unhealthy once a chunk has retried for ten seconds
rather than at its first retry: a partial response under load is no
outage. The report comes during the wait when the threshold falls inside
it. A failure that no later chunk has cleared outranks the cause of a
retry in progress, since lost records matter more.

Retry `UnrecognizedClientException` and `ExpiredTokenException`, which
the SDK's identity cache clears on a later attempt, and retry a
transaction cancelled by a reason this connector does not know; only
`ValidationError` ends a transaction for good. Describe
`transact_write_failures_total` as every failed request, retried or not.

Tests cover the mid-step failure in both write modes through the
controller, the threshold, the failure precedence, the reclassified
codes, two workers sharing one health tracker, and the errors a stop
may report.

Signed-off-by: Xavier Bestel <[email protected]>
@bestouff
bestouff force-pushed the issue-7595 branch from e18aa1b to c82f565 Compare November 3, 2026 20:26
ryzhyk
ryzhyk approved these changes Nov 3, 2026
View reviewed changes

@ryzhyk ryzhyk left a comment

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for resolving all the issues.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

bestouff reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
@bestouff
bestouff added this pull request to the merge queue Nov 3, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 4, 2026

Uh oh!

There was an error while loading. Please reload this page.

@mythical-fred-oss mythical-fred-oss Bot mentioned this pull request Nov 4, 2026
Flaky: dynamodb retry_tests fail intermittently in merge queue (a_long_retry_loop_turns_unhealthy_after_the_threshold, the_retry_budget_is_exact) #7828
Closed
@mythical-fred-oss

mythical-fred-oss Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

Verdict: likely flaky test, not a bug in this PR's logic. Moderate confidence — I could not reproduce it.

Evidence

  • Failed job: Adapter Tests / Test Adapters (aarch64)
  • Two new tests from this PR's own c82f565 commit failed:
    • retry_tests::a_long_retry_loop_turns_unhealthy_after_the_threshold — panics at test.rs:3161, assertion failed: harness.publisher.reports().is_empty()
    • retry_tests::the_retry_budget_is_exact — panics at test.rs:2664, expected 1 BatchWriteItem request, got 2
Check Result
cargo test -p dbsp_connectors --lib ...retry_tests:: at PR tip, 13 runs (some under synthetic CPU load) all green
Retry-budget logic (exhausted() check in helpers.rs) reads correct: checked before any retry is sent
Prior merge-queue runs for this PR none — this was the first

The a_long_retry_loop_turns_unhealthy_after_the_threshold test asserts no health report exists immediately after a chunk enters its first retry wait, racing a 500ms real-wall-clock threshold — a tight margin that a loaded CI runner could plausibly blow through. the_retry_budget_is_exact has no real delay so is harder to explain the same way; possibly a connection-level retry outside the connector's own loop.

Next step: filed #7828 with the details. Re-queueing is likely to pass — if it fails the same way again, it's worth tightening the 500ms margin in that test rather than chasing the connector code.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bestouff
bestouff added this pull request to the merge queue Nov 4, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 4, 2026

Uh oh!

There was an error while loading. Please reload this page.

@mythical-fred-oss

mythical-fred-oss Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

Re-failure of #7828 — same flaky test, fix pushed.

  • Failed job: Adapter Tests (aarch64)
  • Same assertion as the first occurrence: retry_tests::a_long_retry_loop_turns_unhealthy_after_the_threshold panics at test.rs:3161, assertion failed: harness.publisher.reports().is_empty() (log lines 1704-1727).

This test races a 500ms real-wall-clock unhealthy_after threshold: it asserts no health report exists immediately after the chunk enters its retry wait, but that assertion runs on a separate OS thread that can lose the scheduler on a busy runner for long enough to blow past 500ms. #7828 (filed after the first occurrence) already flagged this as the likely cause and suggested widening the margin if it recurred — it just did.

Fix: widened the threshold from 500ms to 3s on fred/observe-7736-41850195763 (0df319db0). Verified 3/3 plain runs and a run under ~60 concurrent CPU-saturating processes, all green; full retry_tests suite still passes.

Take it with:

git fetch origin fred/observe-7736-41850195763
git cherry-pick 0df319db0ef69e7a8f5bc6c648f06c2a0908ce2e

Compare: issue-7595...fred/observe-7736-41850195763

Logged the recurrence on #7828 as well.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bestouff
bestouff added this pull request to the merge queue Nov 4, 2026
@bestouff bestouff mentioned this pull request Nov 4, 2026
[connectors] Fix the flaky DynamoDB retry tests (#7828) #7838
Merged
@bestouff
bestouff removed this pull request from the merge queue due to a manual request Nov 4, 2026
mythical-fred-oss Bot and others added 3 commits November 4, 2026 20:09
@mythical-fred-oss @bestouff
[connectors] Widen the unhealthy_after margin in a_long_retry_loop_tu…
ac8c49c
…rns_unhealthy_after_the_threshold

The test asserted that reports() was still empty right after the chunk
entered its retry wait, racing a 500ms real-wall-clock threshold. On a
busy CI runner the test thread can lose the scheduler for that long
before it gets to the assertion, so the health report had already
landed. Raise the threshold to 3s to give the check a realistic margin;
the test's own 10s bound on the opposite wait still leaves plenty of
room for the report to show up.

Seen twice in the merge queue for #7736 (runs 41750935279 and
41850195763), tracked in #7828.

Signed-off-by: mythical-fred-oss[bot] <319348225+mythical-fred-oss[bot]@users.noreply.github.com>
@bestouff
[connectors] Give each DynamoDB mock test its own server, not a poole…
e5babd2
…d one

`MockServer::start()` hands out servers from a pool and recycles them
when a test drops its server. A chunk writer that a failed test leaves
behind on the shared runtime can send one more request, which then lands
on the recycled server of whichever test picked it up next, and that
test counts it as its own. In CI, `the_retry_budget_is_exact` saw two
requests instead of one right after
`a_long_retry_loop_turns_unhealthy_after_the_threshold` failed.

`MockServer::builder().start()` returns a server that is not pooled, so
a stray request only ever reaches the server of the test that made it.

Reproduced with a panic injected after the chunk entered its retry and
the released task delayed by 100 ms: 5 of 10 runs broke another retry
test with the pooled server, 0 of 10 with this change.

Refs #7828.
@bestouff
[connectors] Assert the early health check only before the threshold
0cb9f7a
The timer that reports a long retry loop unhealthy starts at the chunk's
first retry, which is after the test calls `write_batch`. So an instant
taken before that call bounds the timer: while less than the threshold
has passed since then, no report can exist yet, and the assertion holds
by construction. A runner that stalls past the threshold skips the check
instead of failing it, so the test no longer races a wall clock.

Refs #7828.
@bestouff
bestouff enabled auto-merge November 4, 2026 19:09
@bestouff
bestouff disabled auto-merge November 4, 2026 19:09
@bestouff
bestouff enabled auto-merge November 4, 2026 19:09
@bestouff
Merge branch 'main' into issue-7595
156819d
@bestouff
bestouff disabled auto-merge November 4, 2026 19:10
@bestouff
bestouff added this pull request to the merge queue Nov 4, 2026
Merged via the queue into main with commit cb37e8c Nov 5, 2026
1 check passed

Uh oh!

There was an error while loading. Please reload this page.

@bestouff
bestouff deleted the issue-7595 branch November 5, 2026 01:32
Karakatiza666 pushed a commit to AnnaZhand/feldera that referenced this pull request Nov 5, 2026
@mythical-fred-oss @bestouff
[connectors] Widen the unhealthy_after margin in a_long_retry_loop_tu…
93757e9
…rns_unhealthy_after_the_threshold

The test asserted that reports() was still empty right after the chunk
entered its retry wait, racing a 500ms real-wall-clock threshold. On a
busy CI runner the test thread can lose the scheduler for that long
before it gets to the assertion, so the health report had already
landed. Raise the threshold to 3s to give the check a realistic margin;
the test's own 10s bound on the opposite wait still leaves plenty of
room for the report to show up.

Seen twice in the merge queue for feldera#7736 (runs 41750935279 and
41850195763), tracked in feldera#7828.

Signed-off-by: mythical-fred-oss[bot] <319348225+mythical-fred-oss[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@mythical-fred-oss mythical-fred-oss[bot] mythical-fred-oss[bot] left review comments
@ryzhyk ryzhyk ryzhyk approved these changes

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

[connectors] DynamoDB: retry on throttling errors

Uh oh!

There was an error while loading. Please reload this page.

2 participants

@bestouff @ryzhyk
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.