Skip to content

Commit 1e99c6e

Browse files
committed
core/rawdb: implement filtermaps and bloombits database removal in core/rawdb
1 parent 06a9f67 commit 1e99c6e

File tree

4 files changed

+41
-28
lines changed

4 files changed

+41
-28
lines changed

core/filtermaps/filtermaps.go

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package filtermaps
1818

1919
import (
20-
"bytes"
2120
"errors"
2221
"fmt"
2322
"os"
@@ -292,7 +291,7 @@ func (f *FilterMaps) reset() bool {
292291
// deleting the range first ensures that resetDb will be called again at next
293292
// startup and any leftover data will be removed even if it cannot finish now.
294293
rawdb.DeleteFilterMapsRange(f.db)
295-
return f.removeDbWithPrefix([]byte(rawdb.FilterMapsPrefix), "Resetting log index database")
294+
return f.safeDeleteRange(rawdb.DeleteFilterMapsDb, "Resetting log index database")
296295
}
297296

298297
// init initializes an empty log index according to the current targetView.
@@ -337,28 +336,20 @@ func (f *FilterMaps) init() error {
337336

338337
// removeBloomBits removes old bloom bits data from the database.
339338
func (f *FilterMaps) removeBloomBits() {
340-
f.removeDbWithPrefix(rawdb.BloomBitsPrefix, "Removing old bloom bits database")
341-
f.removeDbWithPrefix(rawdb.BloomBitsIndexPrefix, "Removing old bloom bits chain index")
339+
f.safeDeleteRange(rawdb.DeleteBloomBitsDb, "Removing old bloom bits database")
342340
f.closeWg.Done()
343341
}
344342

345-
// removeDbWithPrefix removes data with the given prefix from the database and
346-
// returns true if everything was successfully removed.
347-
func (f *FilterMaps) removeDbWithPrefix(prefix []byte, action string) bool {
348-
it := f.db.NewIterator(prefix, nil)
349-
hasData := it.Next()
350-
it.Release()
351-
if !hasData {
352-
return true
353-
}
354-
355-
end := bytes.Clone(prefix)
356-
end[len(end)-1]++
343+
// safeDeleteRange calls the specified database range deleter function
344+
// repeatedly as long as it returns leveldb.ErrTooManyKeys.
345+
// This wrapper is necessary because of the leveldb fallback implementation
346+
// of DeleteRange.
347+
func (f *FilterMaps) safeDeleteRange(removeFn func(ethdb.KeyValueRangeDeleter) error, action string) bool {
357348
start := time.Now()
358349
var retry bool
359350
for {
360-
err := f.db.DeleteRange(prefix, end)
361-
if err == nil {
351+
err := removeFn(f.db)
352+
if retry && err == nil {
362353
log.Info(action+" finished", "elapsed", time.Since(start))
363354
return true
364355
}
@@ -372,7 +363,7 @@ func (f *FilterMaps) removeDbWithPrefix(prefix []byte, action string) bool {
372363
default:
373364
}
374365
if !retry {
375-
log.Info(action + " in progress...")
366+
log.Info(action + " in progress...", "elapsed", time.Since(start))
376367
retry = true
377368
}
378369
}

core/rawdb/accessors_indexes.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package rawdb
1818

1919
import (
20+
"bytes"
2021
"encoding/binary"
2122
"errors"
2223
"math/big"
@@ -449,3 +450,24 @@ func DeleteFilterMapsRange(db ethdb.KeyValueWriter) {
449450
log.Crit("Failed to delete filter maps range", "err", err)
450451
}
451452
}
453+
454+
// deletePrefixRange deletes everything with the given prefix from the database.
455+
func deletePrefixRange(db ethdb.KeyValueRangeDeleter, prefix []byte) error {
456+
end := bytes.Clone(prefix)
457+
end[len(end)-1]++
458+
return db.DeleteRange(prefix, end)
459+
}
460+
461+
// DeleteFilterMapsDb removes the entire filter maps database
462+
func DeleteFilterMapsDb(db ethdb.KeyValueRangeDeleter) error {
463+
return deletePrefixRange(db, []byte(filterMapsPrefix))
464+
}
465+
466+
// DeleteFilterMapsDb removes the old bloombits database and the associated
467+
// chain indexer database.
468+
func DeleteBloomBitsDb(db ethdb.KeyValueRangeDeleter) error {
469+
if err := deletePrefixRange(db, bloomBitsPrefix); err != nil {
470+
return err
471+
}
472+
return deletePrefixRange(db, bloomBitsIndexPrefix)
473+
}

core/rawdb/database.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ func InspectDatabase(db ethdb.Database, keyPrefix, keyStart []byte) error {
436436
metadata.Add(size)
437437
case bytes.HasPrefix(key, genesisPrefix) && len(key) == (len(genesisPrefix)+common.HashLength):
438438
metadata.Add(size)
439-
case bytes.HasPrefix(key, []byte(FilterMapsPrefix)):
439+
case bytes.HasPrefix(key, []byte(filterMapsPrefix)):
440440
filterMaps.Add(size)
441441
case bytes.HasPrefix(key, skeletonHeaderPrefix) && len(key) == (len(skeletonHeaderPrefix)+8):
442442
beaconHeaders.Add(size)

core/rawdb/schema.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ var (
106106
blockReceiptsPrefix = []byte("r") // blockReceiptsPrefix + num (uint64 big endian) + hash -> block receipts
107107

108108
txLookupPrefix = []byte("l") // txLookupPrefix + hash -> transaction/receipt lookup metadata
109-
BloomBitsPrefix = []byte("B") // BloomBitsPrefix + bit (uint16 big endian) + section (uint64 big endian) + hash -> bloom bits
109+
bloomBitsPrefix = []byte("B") // bloomBitsPrefix + bit (uint16 big endian) + section (uint64 big endian) + hash -> bloom bits
110110
SnapshotAccountPrefix = []byte("a") // SnapshotAccountPrefix + account hash -> account trie value
111111
SnapshotStoragePrefix = []byte("o") // SnapshotStoragePrefix + account hash + storage hash -> storage trie value
112112
CodePrefix = []byte("c") // CodePrefix + code hash -> account code
@@ -128,8 +128,8 @@ var (
128128
configPrefix = []byte("ethereum-config-") // config prefix for the db
129129
genesisPrefix = []byte("ethereum-genesis-") // genesis state prefix for the db
130130

131-
// BloomBitsIndexPrefix is the data table of a chain indexer to track its progress
132-
BloomBitsIndexPrefix = []byte("iB")
131+
// bloomBitsIndexPrefix is the data table of a chain indexer to track its progress
132+
bloomBitsIndexPrefix = []byte("iB")
133133

134134
ChtPrefix = []byte("chtRootV2-") // ChtPrefix + chtNum (uint64 big endian) -> trie root hash
135135
ChtTablePrefix = []byte("cht-")
@@ -145,11 +145,11 @@ var (
145145
FixedCommitteeRootKey = []byte("fixedRoot-") // bigEndian64(syncPeriod) -> committee root hash
146146
SyncCommitteeKey = []byte("committee-") // bigEndian64(syncPeriod) -> serialized committee
147147

148-
FilterMapsPrefix = "fm-"
149-
filterMapsRangeKey = []byte(FilterMapsPrefix + "R")
150-
filterMapRowPrefix = []byte(FilterMapsPrefix + "r") // filterMapRowPrefix + mapRowIndex (uint64 big endian) -> filter row
151-
filterMapLastBlockPrefix = []byte(FilterMapsPrefix + "b") // filterMapLastBlockPrefix + mapIndex (uint32 big endian) -> block number (uint64 big endian)
152-
filterMapBlockLVPrefix = []byte(FilterMapsPrefix + "p") // filterMapBlockLVPrefix + num (uint64 big endian) -> log value pointer (uint64 big endian)
148+
filterMapsPrefix = "fm-"
149+
filterMapsRangeKey = []byte(filterMapsPrefix + "R")
150+
filterMapRowPrefix = []byte(filterMapsPrefix + "r") // filterMapRowPrefix + mapRowIndex (uint64 big endian) -> filter row
151+
filterMapLastBlockPrefix = []byte(filterMapsPrefix + "b") // filterMapLastBlockPrefix + mapIndex (uint32 big endian) -> block number (uint64 big endian)
152+
filterMapBlockLVPrefix = []byte(filterMapsPrefix + "p") // filterMapBlockLVPrefix + num (uint64 big endian) -> log value pointer (uint64 big endian)
153153

154154
preimageCounter = metrics.NewRegisteredCounter("db/preimage/total", nil)
155155
preimageHitsCounter = metrics.NewRegisteredCounter("db/preimage/hits", nil)

0 commit comments

Comments
 (0)