fix(context): snapshot message converters to prevent ConcurrentModificationException - #1445
Open
akenra wants to merge 1 commit into
Open
fix(context): snapshot message converters to prevent ConcurrentModificationException#1445akenra wants to merge 1 commit into
akenra wants to merge 1 commit into
Conversation
…cationException SmartCompositeMessageConverter iterated the live converters list exposed by CompositeMessageConverter.getConverters(), while external integrations such as spring-cloud-stream's StreamBridge can structurally modify that same list at runtime via SimpleFunctionRegistry.addMessageConverters(), causing a ConcurrentModificationException during toMessage()/fromMessage(). Iterate over a snapshot of the converters list taken at the start of each conversion so concurrent mutation of the underlying list no longer breaks the iteration. Fixes spring-cloudgh-1442 Signed-off-by: akenra <37288280+akenra@users.noreply.github.com>
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.
Hi @olegz!
This PR addresses gh-1442 - a
ConcurrentModificationExceptioninSmartCompositeMessageConverterthat surfaces intermittently under concurrent load (e.g. via spring-cloud-stream'sStreamBridge).The root cause is that
SmartCompositeMessageConverteriterated the live converters list returned byCompositeMessageConverter.getConverters(), while external integrations can structurally modify that same list at runtime (throughSimpleFunctionRegistry.addMessageConverters()), so a fail-fast iterator racing withaddAll(0, ...)throwsConcurrentModificationException.What I did:
fromMessage/toMessageiteration sites, instead of the live list.getConverters()stays the live mutable list so external mutations keep working unchanged.SmartCompositeMessageConverterTestswith a deterministic reproduction: the mutation is forced to happen while the iteration is suspended (both in-loop and cross-thread via a latch handshake), so the test fails withConcurrentModificationExceptionon the previous code and passes with the snapshot fix.Fixes gh-1442