@@ -274,16 +274,19 @@ 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
+ err = s .commit (true )
284
+ }()
282
285
283
286
// Keep assigning new tasks until the sync completes or aborts
284
287
for s .sched .Pending () > 0 {
285
- if err : = s .commit (false ); err != nil {
286
- return err
288
+ if err = s .commit (false ); err != nil {
289
+ return
287
290
}
288
291
s .assignTasks ()
289
292
// Tasks assigned, wait for something to happen
@@ -307,14 +310,14 @@ func (s *stateSync) loop() error {
307
310
s .d .dropPeer (req .peer .id )
308
311
}
309
312
// Process all the received blobs and check for stale delivery
310
- if err : = s .process (req ); err != nil {
313
+ if err = s .process (req ); err != nil {
311
314
log .Warn ("Node data write error" , "err" , err )
312
- return err
315
+ return
313
316
}
314
317
req .peer .SetNodeDataIdle (len (req .response ))
315
318
}
316
319
}
317
- return s . commit ( true )
320
+ return
318
321
}
319
322
320
323
func (s * stateSync ) commit (force bool ) error {
@@ -323,7 +326,10 @@ func (s *stateSync) commit(force bool) error {
323
326
}
324
327
start := time .Now ()
325
328
b := s .d .stateDB .NewBatch ()
326
- s .sched .Commit (b )
329
+ // Ignore empty write.
330
+ if written , err := s .sched .Commit (b ); written == 0 || err != nil {
331
+ return err
332
+ }
327
333
if err := b .Write (); err != nil {
328
334
return fmt .Errorf ("DB write error: %v" , err )
329
335
}
0 commit comments