From fb9eaf576afbcfcd83d265d7cc0f7d55f2e59393 Mon Sep 17 00:00:00 2001 From: Sam Kleinman Date: Sun, 26 Sep 2021 12:10:36 -0400 Subject: [PATCH] e2e: improve chances of statesyncing success (#7001) This reduces this situation where a node will get stuck block syncing, which seemed to happen a lot in last nights run. --- test/e2e/generator/generate.go | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/test/e2e/generator/generate.go b/test/e2e/generator/generate.go index 6db1c2645..96f5ace58 100644 --- a/test/e2e/generator/generate.go +++ b/test/e2e/generator/generate.go @@ -49,9 +49,9 @@ var ( nodeBlockSyncs = uniformChoice{"v0"} // "v2" nodeMempools = uniformChoice{"v0", "v1"} nodeStateSyncs = weightedChoice{ - e2e.StateSyncDisabled: 20, - e2e.StateSyncP2P: 40, - e2e.StateSyncRPC: 40, + e2e.StateSyncDisabled: 10, + e2e.StateSyncP2P: 45, + e2e.StateSyncRPC: 45, } nodePersistIntervals = uniformChoice{0, 1, 5} nodeSnapshotIntervals = uniformChoice{0, 3} @@ -163,7 +163,7 @@ func generateTestnet(r *rand.Rand, opt map[string]interface{}) (e2e.Manifest, er // First we generate seed nodes, starting at the initial height. for i := 1; i <= numSeeds; i++ { - node := generateNode(r, e2e.ModeSeed, 0, manifest.InitialHeight, false) + node := generateNode(r, manifest, e2e.ModeSeed, 0, false) switch p2pMode { case LegacyP2PMode: @@ -180,17 +180,16 @@ func generateTestnet(r *rand.Rand, opt map[string]interface{}) (e2e.Manifest, er // the initial validator set, and validator set updates for delayed nodes. nextStartAt := manifest.InitialHeight + 5 quorum := numValidators*2/3 + 1 - numValdatorStateSyncing := 0 + numSyncingNodes := 0 for i := 1; i <= numValidators; i++ { startAt := int64(0) - if i > quorum && numValdatorStateSyncing < 2 && r.Float64() >= 0.5 { - numValdatorStateSyncing++ + if i > quorum && numSyncingNodes < 2 && r.Float64() >= 0.25 { + numSyncingNodes++ startAt = nextStartAt nextStartAt += 5 } name := fmt.Sprintf("validator%02d", i) - node := generateNode( - r, e2e.ModeValidator, startAt, manifest.InitialHeight, i <= 2) + node := generateNode(r, manifest, e2e.ModeValidator, startAt, i <= 2) switch p2pMode { case LegacyP2PMode: @@ -227,7 +226,7 @@ func generateTestnet(r *rand.Rand, opt map[string]interface{}) (e2e.Manifest, er startAt = nextStartAt nextStartAt += 5 } - node := generateNode(r, e2e.ModeFull, startAt, manifest.InitialHeight, false) + node := generateNode(r, manifest, e2e.ModeFull, startAt, false) switch p2pMode { case LegacyP2PMode: @@ -304,7 +303,11 @@ func generateTestnet(r *rand.Rand, opt map[string]interface{}) (e2e.Manifest, er // here, since we need to know the overall network topology and startup // sequencing. func generateNode( - r *rand.Rand, mode e2e.Mode, startAt int64, initialHeight int64, forceArchive bool, + r *rand.Rand, + manifest e2e.Manifest, + mode e2e.Mode, + startAt int64, + forceArchive bool, ) *e2e.ManifestNode { node := e2e.ManifestNode{ Mode: string(mode), @@ -323,6 +326,13 @@ func generateNode( if startAt > 0 { node.StateSync = nodeStateSyncs.Choose(r) + if manifest.InitialHeight-startAt <= 5 && node.StateSync == e2e.StateSyncDisabled { + // avoid needing to blocsync more than five total blocks. + node.StateSync = uniformSetChoice([]string{ + e2e.StateSyncP2P, + e2e.StateSyncRPC, + }).Choose(r)[0] + } } // If this node is forced to be an archive node, retain all blocks and