core: check MPT node is not requested twice by StateSync module
This check prevents infinite loop if something goes wrong with MPT nodes restore process.
This commit is contained in:
parent
01143da621
commit
7da394fd3f
1 changed files with 8 additions and 0 deletions
|
@ -220,16 +220,24 @@ func TestStateSyncModule_Init(t *testing.T) {
|
|||
require.Equal(t, uint32(stateSyncPoint), module.BlockHeight())
|
||||
|
||||
// add the rest of MPT nodes and jump to state
|
||||
alreadyRequested := make(map[util.Uint256]struct{})
|
||||
for {
|
||||
unknownHashes := module.GetUnknownMPTNodesBatch(1) // restore nodes one-by-one
|
||||
if len(unknownHashes) == 0 {
|
||||
break
|
||||
}
|
||||
if _, ok := alreadyRequested[unknownHashes[0]]; ok {
|
||||
t.Fatal("bug: node was requested twice")
|
||||
}
|
||||
alreadyRequested[unknownHashes[0]] = struct{}{}
|
||||
var callbackCalled bool
|
||||
err := bcSpout.GetStateSyncModule().Traverse(unknownHashes[0], func(node mpt.Node, nodeBytes []byte) bool {
|
||||
require.NoError(t, module.AddMPTNodes([][]byte{slice.Copy(nodeBytes)}))
|
||||
callbackCalled = true
|
||||
return true // add nodes one-by-one
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.True(t, callbackCalled)
|
||||
}
|
||||
|
||||
// check that module is inactive and statejump is completed
|
||||
|
|
Loading…
Reference in a new issue