Details
Description
With multiple concurrent transacted sends, transaction synchronisation after completions are used to update the cursors.
These happen independent of the order that the store is updated, and hence the store order index.
When the cache is exhausted, a callback to the store to mark the end of caching assumes matching order. If scheduling has swapped the order, it is possible to mark the order index past what is cached and it is possible to skip a dispatch. Alternatively it is possible to mark too early which results in duplicate dispatch if the audit is disabled or exhausted.
The senario that exposed this occurrence used concurrent transacted sends to 100 destinations with slow consumers. Leaving scope for out of order processing and ensuring that the cache is exhausted.
Using a large destination memory limit or systemUsage limit or useCache=false policy entry will avoid this problem. The order is only important when the cache is exhausted.
In the skipped case, the message appears on the queue but is not consumable, however it is consumable after a restart.
The proper fix is to ensure cursors are updated in the same order as the store.
Attachments
Issue Links
- is related to
-
AMQ-2868 NegativeQueueTest and JDBC variant - intermittent failure - missing message when cache exhausted
- Resolved
-
AMQ-3470 Unable to pick up messages anymore, messages are lost - Looking for key xyz but not found in fileMap
- Closed
- relates to
-
AMQ-6164 queue sendLock prevents concurrent journal updates
- Resolved
- requires
-
AMQ-4535 activemq configured with leveldb commit fail when accessed by PutGet f-tion from IBM Perf Harness
- Resolved