diff --git a/eth/tracers/live/filter.go b/eth/tracers/live/filter.go index d09a5b9df8..2a70e4f9ec 100644 --- a/eth/tracers/live/filter.go +++ b/eth/tracers/live/filter.go @@ -71,14 +71,18 @@ func encodeBlockNumber(number uint64) []byte { } func toKVKey(name string, number uint64, hash common.Hash) []byte { - var key []byte + var typo byte switch name { case "callTracer": - key = []byte("C") + typo = byte('C') 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 } diff --git a/eth/tracers/live/filter_freeze.go b/eth/tracers/live/filter_freeze.go index 78503d8462..d83b36dded 100644 --- a/eth/tracers/live/filter_freeze.go +++ b/eth/tracers/live/filter_freeze.go @@ -94,33 +94,38 @@ func (f *filter) moveBlockToFreezer(blknum uint64) error { } 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) - n, err := f.frdb.ModifyAncients(func(op ethdb.AncientWriteOp) error { - return op.AppendRaw(table, blknum-offset, data) - }) - if err != nil { - return err - } - log.Info("Move from kvdb to frdb", "blknum", blknum, "size", n) + size, err := f.frdb.ModifyAncients(func(op ethdb.AncientWriteOp) error { + for name := range f.tracer.Tracers() { + kvKey := toKVKey(name, blknum, header.Hash()) + data, err := f.kvdb.Get(kvKey) + if err != nil { + return err + } - // Delete all entries for this prefix from kvdb, ignore error - prefix := append([]byte(name), encodeBlockNumber(blknum)...) - if err := f.deleteKVDBEntriesWithPrefix(prefix); err != nil { - log.Error("Failed to delete entries from kvdb", "error", err) + table := toTraceTable(name) + err = op.AppendRaw(table, blknum-offset, data) + if err != nil { + 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 } -func (f *filter) deleteKVDBEntriesWithPrefix(prefix []byte) error { +func (f *filter) deleteKVDBEntriesWithPrefix(blknum uint64) error { + prefix := encodeBlockNumber(blknum) batch := f.kvdb.NewBatch() it := f.kvdb.NewIterator(prefix, nil) defer it.Release()