lmdb: make serial() used from multiple processes.
This commit is contained in:
@@ -51,10 +51,25 @@ func (b *LMDBBackend) Close() {
|
|||||||
b.lmdbEnv.Close()
|
b.lmdbEnv.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *LMDBBackend) Serial() []byte {
|
func (b *LMDBBackend) serial(txn *lmdb.Txn) []byte {
|
||||||
v := b.lastId.Add(1)
|
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)
|
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
|
return vb
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ func (b *LMDBBackend) save(txn *lmdb.Txn, evt nostr.Event) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
idx := b.Serial()
|
idx := b.serial(txn)
|
||||||
// raw event store
|
// raw event store
|
||||||
if err := txn.Put(b.rawEventStore, idx, buf, 0); err != nil {
|
if err := txn.Put(b.rawEventStore, idx, buf, 0); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
Reference in New Issue
Block a user