@@ -478,9 +478,7 @@ impl Database {
478478 Err ( Error :: Sync ( err) ) => {
479479 // Retry the sync because we are ahead of the server and we need to push some older
480480 // frames.
481- if let Some ( SyncError :: InvalidPushFrameNoLow ( _, _) ) =
482- err. downcast_ref :: < SyncError > ( )
483- {
481+ if let Some ( SyncError :: InvalidPushFrameNoLow ( _, _) ) = err. downcast_ref ( ) {
484482 tracing:: debug!( "got InvalidPushFrameNo, retrying push" ) ;
485483 self . try_push ( & mut sync_ctx, & conn) . await
486484 } else {
@@ -492,6 +490,22 @@ impl Database {
492490 } else {
493491 self . try_pull ( & mut sync_ctx, & conn) . await
494492 }
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+ } )
495509 }
496510
497511 #[ cfg( feature = "sync" ) ]
@@ -557,37 +571,29 @@ impl Database {
557571 ) -> Result < crate :: database:: Replicated > {
558572 let generation = sync_ctx. generation ( ) ;
559573 let mut frame_no = sync_ctx. durable_frame_num ( ) + 1 ;
560- conn. wal_insert_begin ( ) ?;
561574
562- let mut err = None ;
575+ let insert_handle = conn . wal_insert_handle ( ) ? ;
563576
564577 loop {
565578 match sync_ctx. pull_one_frame ( generation, frame_no) . await {
566579 Ok ( Some ( frame) ) => {
567- conn . wal_insert_frame ( & frame) ?;
580+ insert_handle . insert ( & frame) ?;
568581 frame_no += 1 ;
569582 }
570583 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+ } ) ;
572589 }
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 ) ;
577594 }
578595 }
579596 }
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- }
591597 }
592598
593599 pub ( crate ) fn path ( & self ) -> & str {
0 commit comments