@@ -3,6 +3,7 @@ use std::collections::VecDeque;
3
3
use tokio:: sync:: mpsc:: { UnboundedSender , unbounded_channel} ;
4
4
5
5
use super :: compute_node_prelude:: * ;
6
+ use crate :: async_primitives:: wait_group:: WaitGroup ;
6
7
use crate :: morsel:: SourceToken ;
7
8
8
9
// TODO: replace this with an out-of-core buffering solution.
@@ -138,9 +139,10 @@ impl ComputeNode for MultiplexerNode {
138
139
let buffered_source_token = buffered_source_token. clone ( ) ;
139
140
join_handles. push ( scope. spawn_task ( TaskPriority :: High , async move {
140
141
loop {
141
- let Ok ( morsel) = receiver. recv ( ) . await else {
142
+ let Ok ( mut morsel) = receiver. recv ( ) . await else {
142
143
break ;
143
144
} ;
145
+ drop ( morsel. take_consume_token ( ) ) ;
144
146
145
147
let mut anyone_interested = false ;
146
148
let mut active_listener_interested = false ;
@@ -154,11 +156,7 @@ impl ComputeNode for MultiplexerNode {
154
156
Err ( _) => * buf_sender = Listener :: Inactive ,
155
157
} ,
156
158
Listener :: Buffering ( b) => {
157
- // Make sure to count buffered morsels as
158
- // consumed to not block the source.
159
- let mut m = morsel. clone ( ) ;
160
- m. take_consume_token ( ) ;
161
- b. push_front ( m) ;
159
+ b. push_front ( morsel. clone ( ) ) ;
162
160
anyone_interested = true ;
163
161
} ,
164
162
Listener :: Inactive => { } ,
@@ -185,23 +183,28 @@ impl ComputeNode for MultiplexerNode {
185
183
if let Some ( ( buf, mut rx) ) = opt_buf_recv {
186
184
let mut sender = send_port. take ( ) . unwrap ( ) . serial ( ) ;
187
185
186
+ let wait_group = WaitGroup :: default ( ) ;
188
187
let buffered_source_token = buffered_source_token. clone ( ) ;
189
188
join_handles. push ( scope. spawn_task ( TaskPriority :: High , async move {
190
189
// First we try to flush all the old buffered data.
191
190
while let Some ( mut morsel) = buf. pop_back ( ) {
192
191
morsel. replace_source_token ( buffered_source_token. clone ( ) ) ;
192
+ morsel. set_consume_token ( wait_group. token ( ) ) ;
193
193
if sender. send ( morsel) . await . is_err ( )
194
194
|| buffered_source_token. stop_requested ( )
195
195
{
196
196
break ;
197
197
}
198
+ wait_group. wait ( ) . await ;
198
199
}
199
200
200
201
// Then send along data from the multiplexer.
201
- while let Some ( morsel) = rx. recv ( ) . await {
202
+ while let Some ( mut morsel) = rx. recv ( ) . await {
203
+ morsel. set_consume_token ( wait_group. token ( ) ) ;
202
204
if sender. send ( morsel) . await . is_err ( ) {
203
205
break ;
204
206
}
207
+ wait_group. wait ( ) . await ;
205
208
}
206
209
Ok ( ( ) )
207
210
} ) ) ;
0 commit comments