@@ -7,13 +7,15 @@ use std::fmt::Formatter;
7
7
use std:: io:: SeekFrom ;
8
8
use std:: sync:: Arc ;
9
9
10
+ use anyerror:: AnyError ;
10
11
use futures:: future:: FutureExt ;
11
12
pub ( crate ) use replication_session_id:: ReplicationSessionId ;
12
13
use tokio:: io:: AsyncRead ;
13
14
use tokio:: io:: AsyncReadExt ;
14
15
use tokio:: io:: AsyncSeek ;
15
16
use tokio:: io:: AsyncSeekExt ;
16
17
use tokio:: sync:: mpsc;
18
+ use tokio:: sync:: oneshot;
17
19
use tokio:: task:: JoinHandle ;
18
20
use tokio:: time:: sleep;
19
21
use tokio:: time:: timeout;
@@ -45,6 +47,8 @@ use crate::RPCTypes;
45
47
use crate :: RaftNetwork ;
46
48
use crate :: RaftNetworkFactory ;
47
49
use crate :: RaftTypeConfig ;
50
+ use crate :: StorageError ;
51
+ use crate :: StorageIOError ;
48
52
use crate :: ToStorageResult ;
49
53
50
54
/// The handle to a spawned replication stream.
@@ -169,7 +173,7 @@ where
169
173
repl_id = id;
170
174
match r_action {
171
175
Payload :: Logs ( log_id_range) => self . send_log_entries ( id, log_id_range) . await ,
172
- Payload :: Snapshot ( snapshot ) => self . stream_snapshot ( id, snapshot ) . await ,
176
+ Payload :: Snapshot ( snapshot_rx ) => self . stream_snapshot ( id, snapshot_rx ) . await ,
173
177
}
174
178
}
175
179
} ;
@@ -447,13 +451,33 @@ where
447
451
}
448
452
}
449
453
450
- #[ tracing:: instrument( level = "trace " , skip ( self , snapshot ) ) ]
454
+ #[ tracing:: instrument( level = "info " , skip_all ) ]
451
455
async fn stream_snapshot (
452
456
& mut self ,
453
457
id : u64 ,
454
- mut snapshot : Snapshot < C :: NodeId , C :: Node , SM :: SnapshotData > ,
458
+ rx : oneshot :: Receiver < Option < Snapshot < C :: NodeId , C :: Node , SM :: SnapshotData > > > ,
455
459
) -> Result < ( ) , ReplicationError < C :: NodeId , C :: Node > > {
456
- tracing:: debug!( id = display( id) , snapshot = debug( & snapshot. meta) , "stream_snapshot" , ) ;
460
+ tracing:: info!( id = display( id) , "{}" , func_name!( ) ) ;
461
+
462
+ let snapshot = rx. await . map_err ( |e| {
463
+ let io_err = StorageIOError :: read_snapshot ( None , AnyError :: error ( e) ) ;
464
+ StorageError :: IO { source : io_err }
465
+ } ) ?;
466
+
467
+ tracing:: info!(
468
+ "received snapshot: id={}; meta:{}" ,
469
+ id,
470
+ snapshot. as_ref( ) . map( |x| & x. meta) . summary( )
471
+ ) ;
472
+
473
+ let mut snapshot = match snapshot {
474
+ None => {
475
+ let io_err = StorageIOError :: read_snapshot ( None , AnyError :: error ( "snapshot not found" ) ) ;
476
+ let sto_err = StorageError :: IO { source : io_err } ;
477
+ return Err ( ReplicationError :: StorageError ( sto_err) ) ;
478
+ }
479
+ Some ( x) => x,
480
+ } ;
457
481
458
482
let err_x = || ( ErrorSubject :: Snapshot ( Some ( snapshot. meta . signature ( ) ) ) , ErrorVerb :: Read ) ;
459
483
@@ -572,8 +596,8 @@ where
572
596
Payload :: Logs ( log_id_range) => {
573
597
format ! ( "Logs{{id={}, {}}}" , self . id, log_id_range)
574
598
}
575
- Payload :: Snapshot ( snapshot ) => {
576
- format ! ( "Snapshot{{id={}, {}}} " , self . id, snapshot . meta . summary ( ) )
599
+ Payload :: Snapshot ( _ ) => {
600
+ format ! ( "Snapshot{{id={}}} " , self . id)
577
601
}
578
602
}
579
603
}
@@ -592,10 +616,10 @@ where
592
616
}
593
617
}
594
618
595
- fn new_snapshot ( id : u64 , snapshot : Snapshot < NID , N , SD > ) -> Self {
619
+ fn new_snapshot ( id : u64 , snapshot_rx : oneshot :: Receiver < Option < Snapshot < NID , N , SD > > > ) -> Self {
596
620
Self {
597
621
id,
598
- payload : Payload :: Snapshot ( snapshot ) ,
622
+ payload : Payload :: Snapshot ( snapshot_rx ) ,
599
623
}
600
624
}
601
625
}
@@ -610,7 +634,7 @@ where
610
634
SD : AsyncRead + AsyncSeek + Send + Unpin + ' static ,
611
635
{
612
636
Logs ( LogIdRange < NID > ) ,
613
- Snapshot ( Snapshot < NID , N , SD > ) ,
637
+ Snapshot ( oneshot :: Receiver < Option < Snapshot < NID , N , SD > > > ) ,
614
638
}
615
639
616
640
impl < NID , N , SD > Debug for Payload < NID , N , SD >
@@ -624,8 +648,8 @@ where
624
648
Self :: Logs ( log_id_range) => {
625
649
write ! ( f, "Logs({})" , log_id_range)
626
650
}
627
- Self :: Snapshot ( snapshot ) => {
628
- write ! ( f, "Snapshot({:?})" , snapshot . meta )
651
+ Self :: Snapshot ( _ ) => {
652
+ write ! ( f, "Snapshot()" )
629
653
}
630
654
}
631
655
}
@@ -665,8 +689,8 @@ where
665
689
Self :: Data ( Data :: new_logs ( id, log_id_range) )
666
690
}
667
691
668
- pub ( crate ) fn snapshot ( id : u64 , snapshot : Snapshot < NID , N , SD > ) -> Self {
669
- Self :: Data ( Data :: new_snapshot ( id, snapshot ) )
692
+ pub ( crate ) fn snapshot ( id : u64 , snapshot_rx : oneshot :: Receiver < Option < Snapshot < NID , N , SD > > > ) -> Self {
693
+ Self :: Data ( Data :: new_snapshot ( id, snapshot_rx ) )
670
694
}
671
695
}
672
696
0 commit comments