OSDN Git Service

fix fast sync skeleton limit error when chain fork (#391)
authoryahtoo <yahtoo.ma@gmail.com>
Thu, 29 Aug 2019 05:31:20 +0000 (13:31 +0800)
committerPaladz <yzhu101@uottawa.ca>
Thu, 29 Aug 2019 05:31:20 +0000 (13:31 +0800)
netsync/chainmgr/fast_sync.go
netsync/chainmgr/fast_sync_test.go

index c2e7bc0..5565987 100644 (file)
@@ -93,7 +93,7 @@ func (fs *fastSync) createFetchBlocksTasks(stopBlock *types.Block) ([]*fetchBloc
                return nil, errNoMainSkeleton
        }
 
-       if len(mainSkeleton) < minSizeOfSyncSkeleton || len(mainSkeleton) > maxSizeOfSyncSkeleton {
+       if len(mainSkeleton) < minSizeOfSyncSkeleton {
                fs.peers.ProcessIllegal(fs.mainSyncPeer.ID(), security.LevelMsgIllegal, errSkeletonSize.Error())
                return nil, errSkeletonSize
        }
@@ -118,7 +118,7 @@ func (fs *fastSync) createFetchBlocksTasks(stopBlock *types.Block) ([]*fetchBloc
 
        blockFetchTasks := make([]*fetchBlocksWork, 0)
        // create download task
-       for i := 0; i < len(mainSkeleton)-1; i++ {
+       for i := 0; i < len(mainSkeleton)-1 && i < maxSizeOfSyncSkeleton-1; i++ {
                blockFetchTasks = append(blockFetchTasks, &fetchBlocksWork{startHeader: mainSkeleton[i], stopHeader: mainSkeleton[i+1]})
        }
 
index dcb7186..07e2fca 100644 (file)
@@ -99,7 +99,9 @@ func TestFastBlockSync(t *testing.T) {
        }()
 
        baseChain := mockBlocks(nil, 300)
-
+       chainX := []*types.Block{}
+       chainX = append(chainX, baseChain[:30]...)
+       chainX = append(chainX, mockBlocks(baseChain[30], 500)...)
        cases := []struct {
                syncTimeout time.Duration
                aBlocks     []*types.Block
@@ -149,6 +151,13 @@ func TestFastBlockSync(t *testing.T) {
                        want:        baseChain[:50],
                        err:         errSkeletonSize,
                },
+               {
+                       syncTimeout: 30 * time.Second,
+                       aBlocks:     chainX[:50],
+                       bBlocks:     baseChain[:301],
+                       want:        baseChain[:128],
+                       err:         nil,
+               },
        }
 
        for i, c := range cases {