1
1
use std:: sync:: Arc ;
2
2
3
+ use async_trait:: async_trait;
3
4
use futures:: channel:: mpsc;
4
- use futures:: { FutureExt , Stream } ;
5
+ use futures:: { SinkExt , Stream } ;
5
6
use oneshot;
7
+ use vortex_buffer:: ByteBuffer ;
6
8
use vortex_error:: { VortexResult , vortex_err} ;
7
- use vortex_layout:: segments:: { PendingSegment , SegmentId , SegmentReader , SharedPendingSegment } ;
9
+ use vortex_layout:: segments:: { AsyncSegmentReader , SegmentId } ;
8
10
9
11
use crate :: segments:: SegmentRequest ;
10
12
@@ -29,7 +31,7 @@ impl SegmentChannel {
29
31
}
30
32
31
33
/// Returns a reader for the segment cache.
32
- pub fn reader ( & self ) -> Arc < dyn SegmentReader + ' static > {
34
+ pub fn reader ( & self ) -> Arc < dyn AsyncSegmentReader + ' static > {
33
35
Arc :: new ( SegmentChannelReader ( self . request_send . clone ( ) ) )
34
36
}
35
37
@@ -41,8 +43,9 @@ impl SegmentChannel {
41
43
42
44
struct SegmentChannelReader ( mpsc:: UnboundedSender < SegmentRequest > ) ;
43
45
44
- impl SegmentReader for SegmentChannelReader {
45
- fn get ( & self , id : SegmentId ) -> VortexResult < Arc < dyn PendingSegment > > {
46
+ #[ async_trait]
47
+ impl AsyncSegmentReader for SegmentChannelReader {
48
+ async fn get ( & self , id : SegmentId ) -> VortexResult < ByteBuffer > {
46
49
// Set up a channel to send the segment back to the caller.
47
50
let ( send, recv) = oneshot:: channel ( ) ;
48
51
@@ -52,12 +55,17 @@ impl SegmentReader for SegmentChannelReader {
52
55
// Send a request to the segment channel.
53
56
self . 0
54
57
. clone ( )
55
- . unbounded_send ( SegmentRequest { id, callback : send } )
58
+ . send ( SegmentRequest { id, callback : send } )
59
+ . await
56
60
. map_err ( |e| vortex_err ! ( "Failed to request segment {} {:?}" , id, e) ) ?;
57
61
58
62
// Await the callback
59
- Ok ( Arc :: new ( SharedPendingSegment :: new ( recv. map ( |r| {
60
- r. unwrap_or_else ( |_recv| Err ( vortex_err ! ( "Segment request handler was dropped" ) ) )
61
- } ) ) ) )
63
+ match recv. await {
64
+ Ok ( result) => result,
65
+ Err ( _canceled) => {
66
+ // The sender was dropped before returning a result to us
67
+ Err ( vortex_err ! ( "Segment request handler was dropped {}" , id, ) )
68
+ }
69
+ }
62
70
}
63
71
}
0 commit comments