From 51bd05f40350ed2feac697be406f71931087aabb Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Mon, 7 Oct 2024 23:42:26 -0300 Subject: [PATCH] badger: stop using their native "sequence" thing since it is stupid and return duplicated numbers. --- badger/fuzz_test.go | 22 ++++++++++++++++++---- badger/lib.go | 35 +++++++++++++++++++++++++---------- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/badger/fuzz_test.go b/badger/fuzz_test.go index b55b509..a5711af 100644 --- a/badger/fuzz_test.go +++ b/badger/fuzz_test.go @@ -41,14 +41,28 @@ func FuzzQuery(f *testing.F) { } db := &BadgerBackend{} db.DB = bdb - db.seq, err = db.GetSequence([]byte("events"), 1000) - if err != nil { + + if err := db.runMigrations(); err != nil { t.Fatalf("error: %s", err) return } - if err := db.runMigrations(); err != nil { - t.Fatalf("error: %s", err) + if err := db.DB.View(func(txn *badger.Txn) error { + it := txn.NewIterator(badger.IteratorOptions{ + Prefix: []byte{0}, + Reverse: true, + }) + it.Seek([]byte{1}) + if it.Valid() { + key := it.Item().Key() + idx := key[1:] + serial := binary.BigEndian.Uint32(idx) + db.serial.Store(serial) + } + it.Close() + return nil + }); err != nil { + t.Fatalf("failed to initialize serial: %s", err) return } diff --git a/badger/lib.go b/badger/lib.go index 69e21f2..7d66d5f 100644 --- a/badger/lib.go +++ b/badger/lib.go @@ -3,6 +3,7 @@ package badger import ( "encoding/binary" "fmt" + "sync/atomic" "github.com/dgraph-io/badger/v4" "github.com/dgraph-io/badger/v4/options" @@ -35,7 +36,8 @@ type BadgerBackend struct { IndexLongerTag func(event *nostr.Event, tagName string, tagValue string) bool *badger.DB - seq *badger.Sequence + + serial atomic.Uint32 } func (b *BadgerBackend) Init() error { @@ -46,10 +48,6 @@ func (b *BadgerBackend) Init() error { return err } b.DB = db - b.seq, err = db.GetSequence([]byte("events"), 1000) - if err != nil { - return err - } if err := b.runMigrations(); err != nil { return fmt.Errorf("error running migrations: %w", err) @@ -59,18 +57,35 @@ func (b *BadgerBackend) Init() error { b.MaxLimit = 500 } + if err := b.DB.View(func(txn *badger.Txn) error { + it := txn.NewIterator(badger.IteratorOptions{ + Prefix: []byte{0}, + Reverse: true, + }) + it.Seek([]byte{1}) + if it.Valid() { + key := it.Item().Key() + idx := key[1:] + serial := binary.BigEndian.Uint32(idx) + b.serial.Store(serial) + } + it.Close() + return nil + }); err != nil { + return fmt.Errorf("error initializing serial: %w", err) + } + return nil } -func (b BadgerBackend) Close() { +func (b *BadgerBackend) Close() { b.DB.Close() - b.seq.Release() } -func (b BadgerBackend) Serial() []byte { - v, _ := b.seq.Next() +func (b *BadgerBackend) Serial() []byte { + next := b.serial.Add(1) vb := make([]byte, 5) vb[0] = rawEventStorePrefix - binary.BigEndian.PutUint32(vb[1:], uint32(v)) + binary.BigEndian.PutUint32(vb[1:], next) return vb }