@@ -169,6 +169,11 @@ impl ReplicatedBlockStream {
169
169
}
170
170
171
171
async fn next_packet ( & mut self ) -> Result < Option < Bytes > > {
172
+ // We've finished this read, just return None
173
+ if self . len == 0 {
174
+ return Ok ( None ) ;
175
+ }
176
+
172
177
let ( header, data) = loop {
173
178
if self . listener . is_none ( ) {
174
179
let ( connection, checksum_info) = self . select_next_datanode ( ) . await ?;
@@ -196,12 +201,6 @@ impl ReplicatedBlockStream {
196
201
}
197
202
} ;
198
203
199
- if self . len == 0 {
200
- let conn = self . listener . take ( ) . unwrap ( ) . await . unwrap ( ) ?;
201
- DATANODE_CACHE . release ( conn) ;
202
- return Ok ( None ) ;
203
- }
204
-
205
204
let packet_offset = if self . offset > header. offset_in_block as usize {
206
205
self . offset - header. offset_in_block as usize
207
206
} else {
@@ -212,6 +211,12 @@ impl ReplicatedBlockStream {
212
211
self . offset += packet_len;
213
212
self . len -= packet_len;
214
213
214
+ // We've consumed the whole read, there should be no more packets and the listener should complete
215
+ if self . len == 0 {
216
+ let conn = self . listener . take ( ) . unwrap ( ) . await . unwrap ( ) ?;
217
+ DATANODE_CACHE . release ( conn) ;
218
+ }
219
+
215
220
Ok ( Some (
216
221
data. slice ( packet_offset..( packet_offset + packet_len) ) ,
217
222
) )
@@ -227,13 +232,15 @@ impl ReplicatedBlockStream {
227
232
let packet = connection. read_packet ( ) . await ?;
228
233
let header = packet. header . clone ( ) ;
229
234
let data = packet. get_data ( & checksum_info) ?;
230
- let empty_packet = data. is_empty ( ) ;
231
- sender. send ( Ok ( ( header, data) ) ) . await . unwrap ( ) ;
232
235
233
- if empty_packet {
236
+ // If the packet is empty it means it's the last packet
237
+ // so tell the DataNode the read was a success and finish this task
238
+ if data. is_empty ( ) {
234
239
connection. send_read_success ( ) . await ?;
235
240
break ;
236
241
}
242
+
243
+ sender. send ( Ok ( ( header, data) ) ) . await . unwrap ( ) ;
237
244
}
238
245
Ok ( connection)
239
246
} )
0 commit comments