@@ -114,9 +114,7 @@ ReceivedMessageQueue::ReceivedMessageQueue(
114114 assert (fine_grained_channel_size > 0 );
115115 msg_channels_for_fine_grained_shuffle.reserve (fine_grained_channel_size);
116116 for (size_t i = 0 ; i < fine_grained_channel_size; ++i)
117- // / these are unbounded queues
118- msg_channels_for_fine_grained_shuffle.push_back (
119- std::make_shared<LooseBoundedMPMCQueue<ReceivedMessagePtr>>(std::numeric_limits<size_t >::max ()));
117+ msg_channels_for_fine_grained_shuffle.emplace_back (std::make_unique<MSGUnboundedQueue>());
120118 }
121119}
122120
@@ -133,7 +131,7 @@ MPMCQueueResult ReceivedMessageQueue::pop(size_t stream_id, ReceivedMessagePtr &
133131
134132 if (res == MPMCQueueResult::OK )
135133 {
136- if (recv_msg->getRemainingConsumers ()-> fetch_sub (1 ) == 1 )
134+ if (recv_msg->getRemainingConsumers (). fetch_sub (1 ) == 1 )
137135 {
138136#ifndef NDEBUG
139137 ReceivedMessagePtr original_msg;
@@ -145,12 +143,21 @@ MPMCQueueResult ReceivedMessageQueue::pop(size_t stream_id, ReceivedMessagePtr &
145143 " The result of 'grpc_recv_queue->tryPop' is definitely not EMPTY." );
146144 if likely (original_msg != nullptr )
147145 RUNTIME_CHECK_MSG (
148- * original_msg->getRemainingConsumers () == 0 ,
146+ original_msg->getRemainingConsumers () == 0 ,
149147 " Fine grained receiver pop a message that is not full consumed, remaining consumer: {}" ,
150- * original_msg->getRemainingConsumers ());
148+ original_msg->getRemainingConsumers ());
151149#else
152150 grpc_recv_queue.tryDequeue ();
153151#endif
152+ ExchangeReceiverMetric::subDataSizeMetric (*data_size_in_queue, recv_msg->getPacket ().ByteSizeLong ());
153+ }
154+ }
155+ else
156+ {
157+ if constexpr (!need_wait)
158+ {
159+ if (res == MPMCQueueResult::EMPTY )
160+ setNotifyFuture (msg_channels_for_fine_grained_shuffle[stream_id].get ());
154161 }
155162 }
156163 }
@@ -160,13 +167,20 @@ MPMCQueueResult ReceivedMessageQueue::pop(size_t stream_id, ReceivedMessagePtr &
160167 res = grpc_recv_queue.pop (recv_msg);
161168 else
162169 res = grpc_recv_queue.tryPop (recv_msg);
163- }
164170
165- if (res == MPMCQueueResult::OK )
166- {
167- ExchangeReceiverMetric::subDataSizeMetric (*data_size_in_queue, recv_msg->getPacket ().ByteSizeLong ());
171+ if (res == MPMCQueueResult::OK )
172+ {
173+ ExchangeReceiverMetric::subDataSizeMetric (*data_size_in_queue, recv_msg->getPacket ().ByteSizeLong ());
174+ }
175+ else
176+ {
177+ if constexpr (!need_wait)
178+ {
179+ if (res == MPMCQueueResult::EMPTY )
180+ setNotifyFuture (&grpc_recv_queue);
181+ }
182+ }
168183 }
169-
170184 return res;
171185}
172186
0 commit comments