lmdb: make serial() used from multiple processes.

This commit is contained in:
fiatjaf
2025-12-21 22:20:54 -03:00
parent 99197d8321
commit dbd8f47674
2 changed files with 19 additions and 4 deletions

View File

@@ -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[:], uint32(v))
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[:], nextId)
return vb
}

View File

@@ -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