@@ -141,8 +141,7 @@ type headerRequest struct {
141
141
cancel chan struct {} // Channel to track sync cancellation
142
142
stale chan struct {} // Channel to signal the request was dropped
143
143
144
- head uint64 // Head number of the requested batch of headers
145
- chain BlockChain
144
+ head uint64 // Head number of the requested batch of headers
146
145
}
147
146
148
147
// headerResponse is an already verified remote response to a header request.
@@ -202,7 +201,6 @@ type backfiller interface {
202
201
type skeleton struct {
203
202
db ethdb.Database // Database backing the skeleton
204
203
filler backfiller // Chain syncer suspended/resumed by head events
205
- chain BlockChain
206
204
207
205
peers * peerSet // Set of peers we can sync from
208
206
idles map [string ]* peerConnection // Set of idle peers in the current sync cycle
@@ -229,7 +227,7 @@ type skeleton struct {
229
227
230
228
// newSkeleton creates a new sync skeleton that tracks a potentially dangling
231
229
// header chain until it's linked into an existing set of blocks.
232
- func newSkeleton (chain BlockChain , db ethdb.Database , peers * peerSet , drop peerDropFn , filler backfiller ) * skeleton {
230
+ func newSkeleton (db ethdb.Database , peers * peerSet , drop peerDropFn , filler backfiller ) * skeleton {
233
231
sk := & skeleton {
234
232
db : db ,
235
233
filler : filler ,
@@ -239,7 +237,6 @@ func newSkeleton(chain BlockChain, db ethdb.Database, peers *peerSet, drop peerD
239
237
headEvents : make (chan * headUpdate ),
240
238
terminate : make (chan chan error ),
241
239
terminated : make (chan struct {}),
242
- chain : chain ,
243
240
}
244
241
go sk .startup ()
245
242
return sk
@@ -349,7 +346,7 @@ func (s *skeleton) Sync(head *types.Header, final *types.Header, force bool) err
349
346
// sync is the internal version of Sync that executes a single sync cycle, either
350
347
// until some termination condition is reached, or until the current cycle merges
351
348
// with a previously aborted run.
352
- func (s * skeleton ) sync (head * types.Header ) (header * types.Header , err error ) {
349
+ func (s * skeleton ) sync (head * types.Header ) (* types.Header , error ) {
353
350
// If we're continuing a previous merge interrupt, just access the existing
354
351
// old state without initing from disk.
355
352
if head == nil {
@@ -390,27 +387,6 @@ func (s *skeleton) sync(head *types.Header) (header *types.Header, err error) {
390
387
log .Error ("Latest filled block is not available" )
391
388
return
392
389
}
393
- // if the skeleton just linked up and the current snap/full block is within
394
- // the range of the skeleton, the skeleton forked
395
- newlyLinked :=
396
- rawdb .HasHeader (s .db , s .progress .Subchains [0 ].Next , s .progress .Subchains [0 ].Tail - 1 ) &&
397
- rawdb .HasBody (s .db , s .progress .Subchains [0 ].Next , s .progress .Subchains [0 ].Tail - 1 ) &&
398
- rawdb .HasReceipts (s .db , s .progress .Subchains [0 ].Next , s .progress .Subchains [0 ].Tail - 1 ) && ! linked
399
- if newlyLinked && filled .Number .Uint64 () >= s .progress .Subchains [0 ].Tail {
400
- // TODO: this could also happen if the skeleton was reverted back to a block already in the filled history?
401
- // ^probably/definitely not but need to verify
402
-
403
- // revert the chain to the shared ancestor
404
- ancestor , err := s .findSkeletonAncestor (filled )
405
- if err != nil {
406
- log .Crit ("Failed to find skeleton ancestor" , "err" , err )
407
- }
408
- if err = s .chain .SetHead (ancestor ); err != nil {
409
- log .Crit ("Failed to rewind chain" , "err" , err )
410
- }
411
- filled = s .chain .CurrentSnapBlock ()
412
- }
413
-
414
390
// If something was filled, try to delete stale sync helpers. If
415
391
// unsuccessful, warn the user, but not much else we can do (it's
416
392
// a programming error, just let users report an issue and don't
@@ -1156,6 +1132,16 @@ func (s *skeleton) cleanStales(filled *types.Header) error {
1156
1132
if number + 1 == s .progress .Subchains [0 ].Tail {
1157
1133
return nil
1158
1134
}
1135
+ // If the latest fill was on a different subchain, it means the backfiller
1136
+ // was interrupted before it got to do any meaningful work, no cleanup
1137
+ header := rawdb .ReadSkeletonHeader (s .db , filled .Number .Uint64 ())
1138
+ if header == nil {
1139
+ log .Debug ("Filled header outside of skeleton range" , "number" , number , "head" , s .progress .Subchains [0 ].Head , "tail" , s .progress .Subchains [0 ].Tail )
1140
+ return nil
1141
+ } else if header .Hash () != filled .Hash () {
1142
+ log .Debug ("Filled header on different sidechain" , "number" , number , "filled" , filled .Hash (), "skeleton" , header .Hash ())
1143
+ return nil
1144
+ }
1159
1145
var (
1160
1146
start uint64
1161
1147
end uint64
@@ -1270,21 +1256,3 @@ func (s *skeleton) Bounds() (head *types.Header, tail *types.Header, final *type
1270
1256
func (s * skeleton ) Header (number uint64 ) * types.Header {
1271
1257
return rawdb .ReadSkeletonHeader (s .db , number )
1272
1258
}
1273
-
1274
- // find the common ancestor header of the skeleton chain and the snap block
1275
- func (s * skeleton ) findSkeletonAncestor (filledHeader * types.Header ) (uint64 , error ) {
1276
- for {
1277
- if filledHeader .Hash () == s .Header (filledHeader .Number .Uint64 ()).Hash () {
1278
- return filledHeader .Number .Uint64 (), nil
1279
- }
1280
- if filledHeader .Number .Uint64 () == s .progress .Subchains [0 ].Tail - 1 {
1281
- if filledHeader .Hash () == s .progress .Subchains [0 ].Next {
1282
- return filledHeader .Number .Uint64 (), nil
1283
- }
1284
- break
1285
- }
1286
- filledHeader = s .chain .GetHeaderByHash (filledHeader .ParentHash )
1287
- }
1288
- log .Crit ("absolutely should not happen: the chain of the filled header and the skeleton chain must have a common ancestor" )
1289
- return 0 , nil
1290
- }
0 commit comments