[client][fix] Deduplicate insertIfNotExists lookups with same key in same batch to prevent deadlock#2907
Open
Prajwal-banakar wants to merge 1 commit intoapache:mainfrom
Conversation
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Purpose
Linked issue: close #2874
When
lookup.insert-if-not-exists=trueandlookup.async=true, multiple lookups for the same key can land in the sameLookupBatchwithin a single drain cycle. The server acquires a row-level latch per key during insert —two entries for the same key in one RPC batch cause a deadlock in the server-side handler, leaving
LookupQueryfutures never completed and hanging theAsyncWaitOperatorindefinitely, resulting in a 60s timeout.This did not affect
async=falsebecause sync lookups execute sequentially via.get(), so the same key never appears twice in one drain cycle.Brief change log
LookupSender.sendLookupRequest, wheninsertIfNotExists=true, duplicate lookups for the same key bytes within the same batch are detected usingByteBufferkey comparison. The duplicate's future is chained to the first lookup's future instead of being added to the RPC batch, ensuring only one server-side entry is sent per unique key per drain cycle.Tests
Flink119TableSourceITCase#testLookupInsertIfNotExists(existing test, previously flaky withasync=true, now passes consistently with-Dsurefire.rerunFailingTestsCount=5)API and Format
No API or storage format changes.
Documentation
No new feature introduced. Bug fix only.