decrement path from restored iterator
to cover node gaps
This commit is contained in:
parent
74f82a641d
commit
8572c36ee7
@ -139,6 +139,7 @@ func (tr *iteratorTracker) restore(tree state.Trie) ([]trie.NodeIterator, error)
|
|||||||
|
|
||||||
// Force the lower bound path to an even length
|
// Force the lower bound path to an even length
|
||||||
if len(paths[0])&0b1 == 1 {
|
if len(paths[0])&0b1 == 1 {
|
||||||
|
decrementPath(paths[0]) // decrement first to avoid skipped nodes
|
||||||
paths[0] = append(paths[0], 0)
|
paths[0] = append(paths[0], 0)
|
||||||
}
|
}
|
||||||
it := iter.NewPrefixBoundIterator(tree.NodeIterator(iter.HexToKeyBytes(paths[0])), paths[1])
|
it := iter.NewPrefixBoundIterator(tree.NodeIterator(iter.HexToKeyBytes(paths[0])), paths[1])
|
||||||
|
@ -28,3 +28,26 @@ func NewPublisher(mode SnapshotMode, config *Config) (snapt.Publisher, error) {
|
|||||||
}
|
}
|
||||||
return nil, fmt.Errorf("invalid snapshot mode: %s", mode)
|
return nil, fmt.Errorf("invalid snapshot mode: %s", mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Subtracts 1 from the last byte in a path slice, carrying if needed.
|
||||||
|
// Does nothing, returning false, for all-zero inputs.
|
||||||
|
func decrementPath(path []byte) bool {
|
||||||
|
// check for all zeros
|
||||||
|
allzero := true
|
||||||
|
for i := 0; i < len(path); i++ {
|
||||||
|
allzero = allzero && path[i] == 0
|
||||||
|
}
|
||||||
|
if allzero {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for i := len(path) - 1; i >= 0; i-- {
|
||||||
|
val := path[i]
|
||||||
|
path[i]--
|
||||||
|
if val == 0 {
|
||||||
|
path[i] = 0xf
|
||||||
|
} else {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user