Skip to content

[Fix] Gate RocketMQ 5 POP broker ACK on distribution completion (#5295) - #5316

Open
zhang-arvin wants to merge 1 commit into
apache:developfrom
zhang-arvin:fix/5295-pop-broker-ack-barrier
Open

[Fix] Gate RocketMQ 5 POP broker ACK on distribution completion (#5295)#5316
zhang-arvin wants to merge 1 commit into
apache:developfrom
zhang-arvin:fix/5295-pop-broker-ack-barrier

Conversation

@zhang-arvin

Copy link
Copy Markdown

What changes were proposed in this pull request

Fix #5295: Gate RocketMQ 5 POP broker ACK on distribution completion.

Problem

Previously, a single mqAck callback was shared across all deliveries of a frame. In BROADCAST/MULTICAST mode, the first client ACK would immediately ACK the broker, even if other required targets had not yet received or acknowledged the message.

Solution

Introduce a broker-ACK barrier using an AtomicInteger counter:

  • All deliveries of the same frame share a single counter initialized to targets.size()
  • Broker ACK fires only when all deliveries have ACKed (counter reaches 0)
  • LOAD_BALANCE (1 target): 1 ACK → broker ACK
  • BROADCAST (N targets): N ACKs → broker ACK
  • MULTICAST (matched targets): all matched ACKs → broker ACK

Changes

  • eventmesh-runtime/.../UniIngressService.java: Replace the shared mqAck callback with a barrier that counts down remaining ACKs before firing the broker ACK

Verification

  • In BROADCAST mode, the first of multiple client ACKs does not ACK the POP message at the broker
  • The final required ACK executes exactly one broker ACK
  • Duplicate and out-of-order ACKs do not execute multiple broker ACKs (guarded by ReliableDispatcher.ack's idempotency)
  • Runtime failure before completion causes broker redelivery after POP invisible time

…letion

Previously, a single mqAck callback was shared across all deliveries of a
frame. In BROADCAST/MULTICAST mode, the first client ACK would
immediately ACK the broker, even if other required targets had not
yet received or acknowledged the message.

Introduce a broker-ACK barrier using an AtomicInteger counter:
- All deliveries of the same frame share a single counter
- Broker ACK fires only when all deliveries have ACKed
- LOAD_BALANCE (1 target): 1 ACK -> broker ACK
- BROADCAST (N targets): N ACKs -> broker ACK
- MULTICAST (matched targets): all matched ACKs -> broker ACK

Fixes apache#5295

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Welcome to the Apache EventMesh community!!
This is your first PR in our project. We're very excited to have you onboard contributing. Your contributions are greatly appreciated!

Please make sure that the changes are covered by tests.
We will be here shortly.
Let us know if you need any help!

Want to get closer to the community?

WeChat Assistant WeChat Public Account Slack
Join Slack Chat

Mailing Lists:

Name Description Subscribe Unsubscribe Archive
Users User support and questions mailing list Subscribe Unsubscribe Mail Archives
Development Development related discussions Subscribe Unsubscribe Mail Archives
Commits All commits to repositories Subscribe Unsubscribe Mail Archives
Issues Issues or PRs comments and reviews Subscribe Unsubscribe Mail Archives

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Gate RocketMQ 5 POP broker ACK on distribution completion

1 participant