@@ -478,9 +478,7 @@ impl Database {
478
478
Err ( Error :: Sync ( err) ) => {
479
479
// Retry the sync because we are ahead of the server and we need to push some older
480
480
// frames.
481
- if let Some ( SyncError :: InvalidPushFrameNoLow ( _, _) ) =
482
- err. downcast_ref :: < SyncError > ( )
483
- {
481
+ if let Some ( SyncError :: InvalidPushFrameNoLow ( _, _) ) = err. downcast_ref ( ) {
484
482
tracing:: debug!( "got InvalidPushFrameNo, retrying push" ) ;
485
483
self . try_push ( & mut sync_ctx, & conn) . await
486
484
} else {
@@ -492,6 +490,22 @@ impl Database {
492
490
} else {
493
491
self . try_pull ( & mut sync_ctx, & conn) . await
494
492
}
493
+ . or_else ( |err| {
494
+ let Error :: Sync ( err) = err else {
495
+ return Err ( err) ;
496
+ } ;
497
+
498
+ // TODO(levy): upcasting should be done *only* at the API boundary, doing this in
499
+ // internal code just sucks.
500
+ let Some ( SyncError :: HttpDispatch ( _) ) = err. downcast_ref ( ) else {
501
+ return Err ( Error :: Sync ( err) ) ;
502
+ } ;
503
+
504
+ Ok ( crate :: database:: Replicated {
505
+ frame_no : None ,
506
+ frames_synced : 0 ,
507
+ } )
508
+ } )
495
509
}
496
510
497
511
#[ cfg( feature = "sync" ) ]
@@ -557,37 +571,29 @@ impl Database {
557
571
) -> Result < crate :: database:: Replicated > {
558
572
let generation = sync_ctx. generation ( ) ;
559
573
let mut frame_no = sync_ctx. durable_frame_num ( ) + 1 ;
560
- conn. wal_insert_begin ( ) ?;
561
574
562
- let mut err = None ;
575
+ let insert_handle = conn . wal_insert_handle ( ) ? ;
563
576
564
577
loop {
565
578
match sync_ctx. pull_one_frame ( generation, frame_no) . await {
566
579
Ok ( Some ( frame) ) => {
567
- conn . wal_insert_frame ( & frame) ?;
580
+ insert_handle . insert ( & frame) ?;
568
581
frame_no += 1 ;
569
582
}
570
583
Ok ( None ) => {
571
- break ;
584
+ sync_ctx. write_metadata ( ) . await ?;
585
+ return Ok ( crate :: database:: Replicated {
586
+ frame_no : None ,
587
+ frames_synced : 1 ,
588
+ } ) ;
572
589
}
573
- Err ( e ) => {
574
- tracing:: debug!( "pull_one_frame error: {:?}" , e ) ;
575
- err . replace ( e ) ;
576
- break ;
590
+ Err ( err ) => {
591
+ tracing:: debug!( "pull_one_frame error: {:?}" , err ) ;
592
+ sync_ctx . write_metadata ( ) . await ? ;
593
+ return Err ( err ) ;
577
594
}
578
595
}
579
596
}
580
- conn. wal_insert_end ( ) ?;
581
- sync_ctx. write_metadata ( ) . await ?;
582
-
583
- if let Some ( err) = err {
584
- Err ( err)
585
- } else {
586
- Ok ( crate :: database:: Replicated {
587
- frame_no : None ,
588
- frames_synced : 1 ,
589
- } )
590
- }
591
597
}
592
598
593
599
pub ( crate ) fn path ( & self ) -> & str {
0 commit comments