2121
2222#include < atomic>
2323#include < limits>
24+ #include < set>
2425
2526#include " BitSet.h"
27+ #include " ChunkMessageIdImpl.h"
2628#include " ClientConnection.h"
2729#include " Commands.h"
2830#include " LogUtils.h"
@@ -42,6 +44,14 @@ void AckGroupingTracker::doImmediateAck(const MessageId& msgId, ResultCallback c
4244 }
4345 return ;
4446 }
47+ if (auto chunkMessageId =
48+ std::dynamic_pointer_cast<ChunkMessageIdImpl>(Commands::getMessageIdImpl (msgId))) {
49+ auto msgIdList = chunkMessageId->moveChunkedMessageIds ();
50+ doImmediateAck (std::set<MessageId>(std::make_move_iterator (msgIdList.begin ()),
51+ std::make_move_iterator (msgIdList.end ())),
52+ callback);
53+ return ;
54+ }
4555 const auto & ackSet = Commands::getMessageIdImpl (msgId)->getBitSet ();
4656 if (waitResponse_) {
4757 const auto requestId = requestIdSupplier_ ();
@@ -84,29 +94,43 @@ void AckGroupingTracker::doImmediateAck(const std::set<MessageId>& msgIds, Resul
8494 return ;
8595 }
8696
97+ std::set<MessageId> ackMsgIds;
98+
99+ for (const auto & msgId : msgIds) {
100+ if (auto chunkMessageId =
101+ std::dynamic_pointer_cast<ChunkMessageIdImpl>(Commands::getMessageIdImpl (msgId))) {
102+ auto msgIdList = chunkMessageId->moveChunkedMessageIds ();
103+ doImmediateAck (std::set<MessageId>(std::make_move_iterator (msgIdList.begin ()),
104+ std::make_move_iterator (msgIdList.end ())),
105+ callback);
106+ } else {
107+ ackMsgIds.insert (msgId);
108+ }
109+ }
110+
87111 if (Commands::peerSupportsMultiMessageAcknowledgement (cnx->getServerProtocolVersion ())) {
88112 if (waitResponse_) {
89113 const auto requestId = requestIdSupplier_ ();
90- cnx->sendRequestWithId (Commands::newMultiMessageAck (consumerId_, msgIds , requestId), requestId)
114+ cnx->sendRequestWithId (Commands::newMultiMessageAck (consumerId_, ackMsgIds , requestId), requestId)
91115 .addListener ([callback](Result result, const ResponseData&) {
92116 if (callback) {
93117 callback (result);
94118 }
95119 });
96120 } else {
97- cnx->sendCommand (Commands::newMultiMessageAck (consumerId_, msgIds ));
121+ cnx->sendCommand (Commands::newMultiMessageAck (consumerId_, ackMsgIds ));
98122 if (callback) {
99123 callback (ResultOk);
100124 }
101125 }
102126 } else {
103- auto count = std::make_shared<std::atomic<size_t >>(msgIds .size ());
127+ auto count = std::make_shared<std::atomic<size_t >>(ackMsgIds .size ());
104128 auto wrappedCallback = [callback, count](Result result) {
105129 if (--*count == 0 && callback) {
106130 callback (result);
107131 }
108132 };
109- for (auto && msgId : msgIds ) {
133+ for (auto && msgId : ackMsgIds ) {
110134 doImmediateAck (msgId, wrappedCallback, CommandAck_AckType_Individual);
111135 }
112136 }
0 commit comments