lmdb: make serial() used from multiple processes.
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user