@@ -274,15 +274,21 @@ func (s *stateSync) Cancel() error {
274
274
// receive data from peers, rather those are buffered up in the downloader and
275
275
// pushed here async. The reason is to decouple processing from data receipt
276
276
// and timeouts.
277
- func (s * stateSync ) loop () error {
277
+ func (s * stateSync ) loop () ( err error ) {
278
278
// Listen for new peer events to assign tasks to them
279
279
newPeer := make (chan * peerConnection , 1024 )
280
280
peerSub := s .d .peers .SubscribeNewPeers (newPeer )
281
281
defer peerSub .Unsubscribe ()
282
+ defer func () {
283
+ cerr := s .commit (true )
284
+ if err == nil {
285
+ err = cerr
286
+ }
287
+ }()
282
288
283
289
// Keep assigning new tasks until the sync completes or aborts
284
290
for s .sched .Pending () > 0 {
285
- if err : = s .commit (false ); err != nil {
291
+ if err = s .commit (false ); err != nil {
286
292
return err
287
293
}
288
294
s .assignTasks ()
@@ -307,14 +313,14 @@ func (s *stateSync) loop() error {
307
313
s .d .dropPeer (req .peer .id )
308
314
}
309
315
// 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 {
311
317
log .Warn ("Node data write error" , "err" , err )
312
318
return err
313
319
}
314
320
req .peer .SetNodeDataIdle (len (req .response ))
315
321
}
316
322
}
317
- return s . commit ( true )
323
+ return nil
318
324
}
319
325
320
326
func (s * stateSync ) commit (force bool ) error {
@@ -323,7 +329,9 @@ func (s *stateSync) commit(force bool) error {
323
329
}
324
330
start := time .Now ()
325
331
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
+ }
327
335
if err := b .Write (); err != nil {
328
336
return fmt .Errorf ("DB write error: %v" , err )
329
337
}
0 commit comments