batch delete kvdb

Signed-off-by: jsvisa <delweng@gmail.com>
This commit is contained in:
jsvisa 2024-08-13 06:30:41 +00:00
parent 3e598cb740
commit 978112678c
2 changed files with 32 additions and 23 deletions

View file

@ -71,14 +71,18 @@ func encodeBlockNumber(number uint64) []byte {
} }
func toKVKey(name string, number uint64, hash common.Hash) []byte { func toKVKey(name string, number uint64, hash common.Hash) []byte {
var key []byte var typo byte
switch name { switch name {
case "callTracer": case "callTracer":
key = []byte("C") typo = byte('C')
case "flatCallTracer": case "flatCallTracer":
key = []byte("P") typo = byte('P')
default:
panic("not supported yet")
} }
key = append(append(key, encodeBlockNumber(number)...), hash.Bytes()...) // TODO: have some prefix?
key := append(encodeBlockNumber(number), hash.Bytes()...)
key = append(key, typo)
return key return key
} }

View file

@ -94,33 +94,38 @@ func (f *filter) moveBlockToFreezer(blknum uint64) error {
} }
offset := f.offset.Load() offset := f.offset.Load()
for name := range f.tracer.Tracers() {
kvKey := toKVKey(name, blknum, header.Hash())
data, err := f.kvdb.Get(kvKey)
if err != nil {
return err
}
table := toTraceTable(name) size, err := f.frdb.ModifyAncients(func(op ethdb.AncientWriteOp) error {
n, err := f.frdb.ModifyAncients(func(op ethdb.AncientWriteOp) error { for name := range f.tracer.Tracers() {
return op.AppendRaw(table, blknum-offset, data) kvKey := toKVKey(name, blknum, header.Hash())
}) data, err := f.kvdb.Get(kvKey)
if err != nil { if err != nil {
return err return err
} }
log.Info("Move from kvdb to frdb", "blknum", blknum, "size", n)
// Delete all entries for this prefix from kvdb, ignore error table := toTraceTable(name)
prefix := append([]byte(name), encodeBlockNumber(blknum)...) err = op.AppendRaw(table, blknum-offset, data)
if err := f.deleteKVDBEntriesWithPrefix(prefix); err != nil { if err != nil {
log.Error("Failed to delete entries from kvdb", "error", err) return err
}
} }
return nil
})
if err != nil {
return err
}
log.Info("Move from kvdb to frdb", "blknum", blknum, "size", size)
// Delete all entries for this prefix from kvdb, ignore error
if err := f.deleteKVDBEntriesWithPrefix(blknum); err != nil {
log.Error("Failed to delete entries from kvdb", "error", err)
} }
return nil return nil
} }
func (f *filter) deleteKVDBEntriesWithPrefix(prefix []byte) error { func (f *filter) deleteKVDBEntriesWithPrefix(blknum uint64) error {
prefix := encodeBlockNumber(blknum)
batch := f.kvdb.NewBatch() batch := f.kvdb.NewBatch()
it := f.kvdb.NewIterator(prefix, nil) it := f.kvdb.NewIterator(prefix, nil)
defer it.Release() defer it.Release()