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.
IMPORTANT: All PRs must be linked to an issue (except for extremely trivial and straightforward changes).
Fixes #2361
Description
We use the recommended way for mutual exclusion: link
Solution: Wrap the
FhirSynchronizer#synchronize
withmutex.withLock
mutex.withLock will suspend the successive invocations of
FhirSynchronizer#synchronize
, without blocking the thread, until the lock is released. Hence all work requests will be processed - and in FIFO order.Alternative(s) considered
Alternative: One alternative involves using a ReentrantLock within a try-catch-finally block. This approach essentially replicates mutex-like behavior to manage concurrent access to shared resources. It would require maintaining a job queue to handle work requests sequentially. Without a queue, workers would need to return Result.retry, leading to repeated attempts every 30 seconds.
Another alternative was to wrap
FhirSyncWorker#doWork
with mutex.withLock but based on this comment and also for the fact that FhirSynchronizer#synchronize should run sequentially irrespective of whether FhirSyncWorker uses it or not.Type
Bug fix
Screenshots (if applicable)
Checklist
./gradlew spotlessApply
and./gradlew spotlessCheck
to check my code follows the style guide of this project../gradlew check
and./gradlew connectedCheck
to test my changes locally.