@@ -274,15 +274,21 @@ func (s *stateSync) Cancel() error {
274274// receive data from peers, rather those are buffered up in the downloader and
275275// pushed here async. The reason is to decouple processing from data receipt
276276// and timeouts.
277- func (s * stateSync ) loop () error {
277+ func (s * stateSync ) loop () ( err error ) {
278278 // Listen for new peer events to assign tasks to them
279279 newPeer := make (chan * peerConnection , 1024 )
280280 peerSub := s .d .peers .SubscribeNewPeers (newPeer )
281281 defer peerSub .Unsubscribe ()
282+ defer func () {
283+ cerr := s .commit (true )
284+ if err == nil {
285+ err = cerr
286+ }
287+ }()
282288
283289 // Keep assigning new tasks until the sync completes or aborts
284290 for s .sched .Pending () > 0 {
285- if err : = s .commit (false ); err != nil {
291+ if err = s .commit (false ); err != nil {
286292 return err
287293 }
288294 s .assignTasks ()
@@ -307,14 +313,14 @@ func (s *stateSync) loop() error {
307313 s .d .dropPeer (req .peer .id )
308314 }
309315 // Process all the received blobs and check for stale delivery
310- if err : = s .process (req ); err != nil {
316+ if err = s .process (req ); err != nil {
311317 log .Warn ("Node data write error" , "err" , err )
312318 return err
313319 }
314320 req .peer .SetNodeDataIdle (len (req .response ))
315321 }
316322 }
317- return s . commit ( true )
323+ return nil
318324}
319325
320326func (s * stateSync ) commit (force bool ) error {
@@ -323,7 +329,9 @@ func (s *stateSync) commit(force bool) error {
323329 }
324330 start := time .Now ()
325331 b := s .d .stateDB .NewBatch ()
326- s .sched .Commit (b )
332+ if written , err := s .sched .Commit (b ); written == 0 || err != nil {
333+ return err
334+ }
327335 if err := b .Write (); err != nil {
328336 return fmt .Errorf ("DB write error: %v" , err )
329337 }
0 commit comments