-
Notifications
You must be signed in to change notification settings - Fork 636
fix(store-client): stop retrying after DEADLINE_EXCEEDED and honour thread interrupts in NodeTxExecutor #3204
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
SebastianGruza
wants to merge
4
commits into
apache:master
Choose a base branch
from
SebastianGruza:fix/store-client-retry-interrupt
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
920bbbd
fix(store-client): stop retrying a commit after DEADLINE_EXCEEDED and…
SebastianGruza 4350ef9
test(store-client): cover retry classification, deadline fail-fast an…
SebastianGruza 8adf522
fix(store-client): decide retry on every failure of a parallel commit…
SebastianGruza b588aa8
fix(store-client): retry DEADLINE_EXCEEDED exactly once so a moved pa…
SebastianGruza File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
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.
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.
🧹 Two of the new interrupt exits drop the
InterruptedException, so the server cannot tell them apart from a store failure.Evidence:
:409-410throwsHgStoreClientException.of("Interrupted before retry " + i)with no cause.:456-458uses the store failuretas the cause and discardse. Neither has anInterruptedExceptionas its root cause.CANCELLED, and theInterruptedExceptionis its cause: grpc-stub 1.39.0ClientCalls.blockingUnaryCallcallscall.cancel("Thread interrupted", e).HugeException.isInterrupted()only checks the root cause (HugeException.java:56-61).HugeTask.fail()relies on it so that a cancelled task is not recorded as failed (HugeTask.java:351-355). Take a task that is cancelled while its thread is between store calls or in the retry sleep. It now logs a WARN with a stack trace. If the worker reachesfail()beforecancel()sets CANCELLED (:323interrupts,:336sets the status), the task is stored as FAILED andcancel()returns false, soDistributedTaskScheduler.cancel()does not save CANCELLED (:317-321). Before this change the loop swallowed the interrupt and carried on, so this path did not exist.Requested change: make
InterruptedExceptionthe root cause on both exits. For example, useHgStoreClientException.of("Interrupted before retry " + i, new InterruptedException()). In the sleep handler, useHgStoreClientException.of("Interrupted while waiting to retry: " + t.getMessage(), e)and attachtwithaddSuppressed. Then extendtestInterruptStopsRetryingandtestInterruptBeforeCallSkipsTheAttemptto assert the root cause.