diff --git a/eventstore/lmdb/lib.go b/eventstore/lmdb/lib.go index cf691e6..d96ce24 100644 --- a/eventstore/lmdb/lib.go +++ b/eventstore/lmdb/lib.go @@ -51,10 +51,25 @@ func (b *LMDBBackend) Close() { b.lmdbEnv.Close() } -func (b *LMDBBackend) Serial() []byte { - v := b.lastId.Add(1) +func (b *LMDBBackend) serial(txn *lmdb.Txn) []byte { + cursor, err := txn.OpenCursor(b.rawEventStore) + if err != nil { + return nil + } + defer cursor.Close() + k, _, err := cursor.Get(nil, nil, lmdb.Last) + if lmdb.IsNotFound(err) { + vb := make([]byte, 4) + binary.BigEndian.PutUint32(vb[:], 1) + return vb + } + if err != nil { + return nil + } + lastId := binary.BigEndian.Uint32(k) + nextId := lastId + 1 vb := make([]byte, 4) - binary.BigEndian.PutUint32(vb[:], uint32(v)) + binary.BigEndian.PutUint32(vb[:], nextId) return vb } diff --git a/eventstore/lmdb/save.go b/eventstore/lmdb/save.go index 5b8f086..608eb36 100644 --- a/eventstore/lmdb/save.go +++ b/eventstore/lmdb/save.go @@ -48,7 +48,7 @@ func (b *LMDBBackend) save(txn *lmdb.Txn, evt nostr.Event) error { return err } - idx := b.Serial() + idx := b.serial(txn) // raw event store if err := txn.Put(b.rawEventStore, idx, buf, 0); err != nil { return err