mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-21 20:26:41 +00:00
triedb/pathdb: address comments
This commit is contained in:
parent
30202237de
commit
0fca084df0
2 changed files with 24 additions and 19 deletions
|
|
@ -105,13 +105,16 @@ func (f extFilter) contains(bitmap []byte) (bool, error) {
|
||||||
|
|
||||||
switch len(bitmap) {
|
switch len(bitmap) {
|
||||||
case 0:
|
case 0:
|
||||||
|
// Bitmap is not available, return "false positive"
|
||||||
return true, nil
|
return true, nil
|
||||||
case bitmapBytesTwoLevels:
|
case bitmapBytesTwoLevels:
|
||||||
|
// Bitmap for 2-level trie with at most 16 elements inside
|
||||||
if n >= bitmapElementThresholdTwoLevels {
|
if n >= bitmapElementThresholdTwoLevels {
|
||||||
return false, fmt.Errorf("invalid extension filter %d for 2 bytes bitmap", id)
|
return false, fmt.Errorf("invalid extension filter %d for 2 bytes bitmap", id)
|
||||||
}
|
}
|
||||||
return isBitSet(bitmap, n), nil
|
return isBitSet(bitmap, n), nil
|
||||||
case bitmapBytesThreeLevels:
|
case bitmapBytesThreeLevels:
|
||||||
|
// Bitmap for 3-level trie with at most 16+16*16 elements inside
|
||||||
if n >= bitmapElementThresholdThreeLevels {
|
if n >= bitmapElementThresholdThreeLevels {
|
||||||
return false, fmt.Errorf("invalid extension filter %d for 34 bytes bitmap", id)
|
return false, fmt.Errorf("invalid extension filter %d for 34 bytes bitmap", id)
|
||||||
} else if n >= bitmapElementThresholdTwoLevels {
|
} else if n >= bitmapElementThresholdTwoLevels {
|
||||||
|
|
@ -123,12 +126,7 @@ func (f extFilter) contains(bitmap []byte) (bool, error) {
|
||||||
}
|
}
|
||||||
// Check descendants: the presence of any descendant implicitly
|
// Check descendants: the presence of any descendant implicitly
|
||||||
// represents a mutation of its ancestor.
|
// represents a mutation of its ancestor.
|
||||||
for m := 16 + n*16; m < 32+n*16; m++ {
|
return isByteSet(bitmap, 2+2*n) || isByteSet(bitmap, 3+2*n), nil
|
||||||
if isBitSet(bitmap, m) {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return false, fmt.Errorf("unsupported bitmap size %d", len(bitmap))
|
return false, fmt.Errorf("unsupported bitmap size %d", len(bitmap))
|
||||||
|
|
@ -232,17 +230,20 @@ func (it *blockIterator) seekGT(id uint64) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if index == 0 {
|
if index == 0 {
|
||||||
item, n := binary.Uvarint(it.data[it.restarts[0]:])
|
pos := int(it.restarts[0])
|
||||||
|
item, n := binary.Uvarint(it.data[pos:])
|
||||||
if n <= 0 {
|
if n <= 0 {
|
||||||
it.setErr(fmt.Errorf("failed to decode item at pos %d", it.restarts[0]))
|
it.setErr(fmt.Errorf("failed to decode item at pos %d", it.restarts[0]))
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
ext, shift, err := it.resolveExt(int(it.restarts[0]) + n)
|
pos = pos + n
|
||||||
|
|
||||||
|
ext, shift, err := it.resolveExt(pos)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
it.setErr(err)
|
it.setErr(err)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
it.set(int(it.restarts[0])+n+shift, 0, item, ext)
|
it.set(pos+shift, 0, item, ext)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
var (
|
var (
|
||||||
|
|
@ -303,17 +304,20 @@ func (it *blockIterator) seekGT(id uint64) bool {
|
||||||
}
|
}
|
||||||
// The element which is the first one greater than the specified id
|
// The element which is the first one greater than the specified id
|
||||||
// is exactly the one located at the restart point.
|
// is exactly the one located at the restart point.
|
||||||
item, n := binary.Uvarint(it.data[it.restarts[index]:])
|
pos = int(it.restarts[index])
|
||||||
|
item, n := binary.Uvarint(it.data[pos:])
|
||||||
if n <= 0 {
|
if n <= 0 {
|
||||||
it.setErr(fmt.Errorf("failed to decode item at pos %d", it.restarts[index]))
|
it.setErr(fmt.Errorf("failed to decode item at pos %d", it.restarts[index]))
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
ext, shift, err := it.resolveExt(int(it.restarts[index]) + n)
|
pos = pos + n
|
||||||
|
|
||||||
|
ext, shift, err := it.resolveExt(pos)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
it.setErr(err)
|
it.setErr(err)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
it.set(int(it.restarts[index])+n+shift, index, item, ext)
|
it.set(pos+shift, index, item, ext)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -498,12 +502,11 @@ func (it *indexIterator) applyFilter(index int) (int, error) {
|
||||||
return index, nil
|
return index, nil
|
||||||
}
|
}
|
||||||
for index < len(it.descList) {
|
for index < len(it.descList) {
|
||||||
contain, err := it.filter.contains(it.descList[index].extBitmap)
|
found, err := it.filter.contains(it.descList[index].extBitmap)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
it.setErr(err)
|
return 0, err
|
||||||
break
|
|
||||||
}
|
}
|
||||||
if contain {
|
if found {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
index++
|
index++
|
||||||
|
|
|
||||||
|
|
@ -63,9 +63,6 @@ func decodeIDs(buf []byte) ([]uint16, error) {
|
||||||
|
|
||||||
// isAncestor reports whether node x is the ancestor of node y.
|
// isAncestor reports whether node x is the ancestor of node y.
|
||||||
func isAncestor(x, y uint16) bool {
|
func isAncestor(x, y uint16) bool {
|
||||||
if y <= x {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
for y > x {
|
for y > x {
|
||||||
y = (y - 1) / 16 // parentID(y) = (y - 1) / 16
|
y = (y - 1) / 16 // parentID(y) = (y - 1) / 16
|
||||||
if y == x {
|
if y == x {
|
||||||
|
|
@ -80,6 +77,11 @@ func isBitSet(b []byte, index int) bool {
|
||||||
return b[index/8]&(1<<(index%8)) != 0
|
return b[index/8]&(1<<(index%8)) != 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// isByteSet reports whether the byte at `index` in the byte slice `b` is set.
|
||||||
|
func isByteSet(b []byte, index int) bool {
|
||||||
|
return b[index] != 0
|
||||||
|
}
|
||||||
|
|
||||||
// setBit sets the bit at `index` in the byte slice `b` to 1.
|
// setBit sets the bit at `index` in the byte slice `b` to 1.
|
||||||
func setBit(b []byte, index int) {
|
func setBit(b []byte, index int) {
|
||||||
b[index/8] |= 1 << (index % 8)
|
b[index/8] |= 1 << (index % 8)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue