Skip to content

Commit 885a846

Browse files
committed
db/state: adopt improvements from #19742 in temporal_mem_batch and domain_stream
1 parent c805fde commit 885a846

2 files changed

Lines changed: 14 additions & 26 deletions

File tree

db/state/domain_stream.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ func (hi *DomainLatestIterFile) Next() ([]byte, []byte, error) {
359359
// debugIteratePrefix iterates over key-value pairs of the storage domain that start with given prefix
360360
//
361361
// k and v lifetime is bounded by the lifetime of the iterator
362-
func (dt *DomainRoTx) debugIteratePrefixLatest(prefix []byte, ramIter *btree2.MapIterator[string, []dataWithTxNum], it func(k []byte, v []byte, step kv.Step) (cont bool, err error), roTx kv.Tx) error {
362+
func (dt *DomainRoTx) debugIteratePrefixLatest(prefix []byte, storage *btree2.Map[string, []dataWithTxNum], it func(k []byte, v []byte, step kv.Step) (cont bool, err error), roTx kv.Tx) error {
363363
// Implementation:
364364
// File endTxNum = last txNum of file step
365365
// DB endTxNum = first txNum of step in db
@@ -375,15 +375,16 @@ func (dt *DomainRoTx) debugIteratePrefixLatest(prefix []byte, ramIter *btree2.Ma
375375
var k, v []byte
376376
var err error
377377

378-
if ramIter != nil {
379-
ramIter.SeekGE(string(prefix))
380-
if ramIter.Valid() {
381-
k := common.ToBytesZeroCopy(ramIter.Cur())
378+
if storage != nil {
379+
ramIt := storage.Iterator()
380+
ramIt.SeekGE(string(prefix))
381+
if ramIt.Valid() {
382+
k := common.ToBytesZeroCopy(ramIt.Cur())
382383

383-
v = ramIter.Value()[len(ramIter.Value())-1].data
384+
v = ramIt.Value()[len(ramIt.Value())-1].data
384385

385386
if len(k) > 0 && bytes.HasPrefix(k, prefix) {
386-
heap.Push(cpPtr, &CursorItem{t: RAM_CURSOR, key: common.Copy(k), val: common.Copy(v), step: 0, iter: ramIter, endTxNum: math.MaxUint64, reverse: true})
387+
heap.Push(cpPtr, &CursorItem{t: RAM_CURSOR, key: common.Copy(k), val: common.Copy(v), step: 0, iter: &ramIt, endTxNum: math.MaxUint64, reverse: true})
387388
}
388389
}
389390
}

db/state/temporal_mem_batch.go

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"fmt"
2424
"maps"
2525
"sort"
26+
"strings"
2627
"sync"
2728

2829
btree2 "github.com/anacrolix/btree"
@@ -60,7 +61,7 @@ type TemporalMemBatch struct {
6061

6162
latestStateLock sync.RWMutex
6263
domains [kv.DomainLen]map[string][]dataWithTxNum
63-
storage *btree2.Map[string, []dataWithTxNum] // TODO: replace hardcoded domain name to per-config configuration of available Guarantees/AccessMethods (range vs get)
64+
storage btree2.Map[string, []dataWithTxNum] // TODO: replace hardcoded domain name to per-config configuration of available Guarantees/AccessMethods (range vs get)
6465

6566
domainWriters [kv.DomainLen]*DomainBufferedWriter
6667
iiWriters []*InvertedIndexBufferedWriter
@@ -79,22 +80,9 @@ type TemporalMemBatch struct {
7980
metrics *changeset.DomainMetrics
8081
}
8182

82-
func newStringDataMap() *btree2.Map[string, []dataWithTxNum] {
83-
m := btree2.MakeMap[string, []dataWithTxNum](func(a, b string) int {
84-
if a == b {
85-
return 0
86-
}
87-
if a < b {
88-
return -1
89-
}
90-
return 1
91-
})
92-
return &m
93-
}
94-
9583
func NewTemporalMemBatch(tx kv.TemporalTx, ioMetrics any) *TemporalMemBatch {
9684
sd := &TemporalMemBatch{
97-
storage: newStringDataMap(),
85+
storage: btree2.MakeMap[string, []dataWithTxNum](strings.Compare),
9886
metrics: ioMetrics.(*changeset.DomainMetrics),
9987
inMemHistoryReads: true,
10088
}
@@ -321,13 +309,12 @@ func (sd *TemporalMemBatch) ClearRam() {
321309
func (sd *TemporalMemBatch) IteratePrefix(domain kv.Domain, prefix []byte, roTx kv.Tx, it func(k []byte, v []byte, step kv.Step) (cont bool, err error)) error {
322310
sd.latestStateLock.RLock()
323311
defer sd.latestStateLock.RUnlock()
324-
var ramIter *btree2.MapIterator[string, []dataWithTxNum]
312+
var storageMap *btree2.Map[string, []dataWithTxNum]
325313
if domain == kv.StorageDomain {
326-
iter := sd.storage.Iterator()
327-
ramIter = &iter
314+
storageMap = &sd.storage
328315
}
329316

330-
return AggTx(roTx).d[domain].debugIteratePrefixLatest(prefix, ramIter, it, roTx)
317+
return AggTx(roTx).d[domain].debugIteratePrefixLatest(prefix, storageMap, it, roTx)
331318
}
332319

333320
func (sd *TemporalMemBatch) HasPrefix(domain kv.Domain, prefix []byte, roTx kv.Tx) ([]byte, []byte, bool, error) {

0 commit comments

Comments
 (0)