[ https://issues.apache.org/jira/browse/ARTEMIS-3766?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17518514#comment-17518514 ]
Iliya Grushevskiy commented on ARTEMIS-3766: -------------------------------------------- It seems that expiration information of the message on B should be removed (or moved to different property) during mirroring, because B should just reflect state of A and not control it. However once A is no longer available B will not perform same operations on messages as A would. But it seems more reasonable than trying to replicate both state and behavior of source and even after loosing A one can examine left messages on that custom ttl property and set actual ttl. > Race condition with Dual Mirror and Expiry > ------------------------------------------ > > Key: ARTEMIS-3766 > URL: https://issues.apache.org/jira/browse/ARTEMIS-3766 > Project: ActiveMQ Artemis > Issue Type: Bug > Affects Versions: 2.21.0 > Reporter: Stephen Baker > Priority: Major > > When dual mirroring is in play there is a race condition which can result in > missing or duplicate messages on the brokers. > > Scenario 1: > # Bring up two artemis instances with broker-connection mirroring between > each other. (A and B) > # Send a message to A with a short TTL (I used 30 seconds in my test) > # After the message mirrors but before it expires, pause the Mirror queue on > both sides > # Wait for the message to expire, and the reaper thread to pick it up > # Observe that on both sides the message has moved to the ExpiryQueue. In > the Mirror queue there are 2 messages on A (a message destined to the > ExpiryQueue and an ack on the original message). On B there is a single > message in the mirror, which is the message to the expiry queue. > # Resume the mirror, I'm not sure the order matters, but I did B and then A. > # Observe that on A there is a single message in the ExpiryQueue, but on B > there are now 2 messages in the expiry queue. > Scenario 2: > # Bring up two artemis instances with broker-connection mirroring between > each other. (A and B). On A disable the reaper thread by setting > `<message-expiry-scan-period>-1</message-expiry-scan-period>` > # Send a message to A with a short TTL > # Wait for the TTL to expire > # On B the message moves to the ExpiryQueue, on A the message ends > disappears (no longer in the ExpiryQueue nor the original queue) -- This message was sent by Atlassian Jira (v8.20.1#820001)