badger: use a different transaction for each goroutine.
This commit is contained in:
@@ -35,19 +35,19 @@ func (b BadgerBackend) QueryEvents(ctx context.Context, filter nostr.Filter) (ch
|
||||
}
|
||||
|
||||
go func() {
|
||||
err := b.View(func(txn *badger.Txn) error {
|
||||
defer close(ch)
|
||||
|
||||
// actually iterate
|
||||
for _, q := range queries {
|
||||
q := q
|
||||
go b.View(func(txn *badger.Txn) error {
|
||||
// iterate only through keys and in reverse order
|
||||
opts := badger.IteratorOptions{
|
||||
Reverse: true,
|
||||
}
|
||||
|
||||
// actually iterate
|
||||
iteratorClosers := make([]func(), len(queries))
|
||||
for i, q := range queries {
|
||||
go func(i int, q query) {
|
||||
it := txn.NewIterator(opts)
|
||||
iteratorClosers[i] = it.Close
|
||||
|
||||
defer it.Close()
|
||||
defer close(q.results)
|
||||
|
||||
for it.Seek(q.startingPoint); it.ValidForPrefix(q.prefix); it.Next() {
|
||||
@@ -72,11 +72,11 @@ func (b BadgerBackend) QueryEvents(ctx context.Context, filter nostr.Filter) (ch
|
||||
item, err := txn.Get(idx)
|
||||
if err != nil {
|
||||
if err == badger.ErrDiscardedTxn {
|
||||
return
|
||||
return err
|
||||
}
|
||||
log.Printf("badger: failed to get %x based on prefix %x, index key %x from raw event store: %s\n",
|
||||
idx, q.prefix, key, err)
|
||||
return
|
||||
return err
|
||||
}
|
||||
item.Value(func(val []byte) error {
|
||||
evt := &nostr.Event{}
|
||||
@@ -93,7 +93,9 @@ func (b BadgerBackend) QueryEvents(ctx context.Context, filter nostr.Filter) (ch
|
||||
return nil
|
||||
})
|
||||
}
|
||||
}(i, q)
|
||||
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// max number of events we'll return
|
||||
@@ -114,17 +116,9 @@ func (b BadgerBackend) QueryEvents(ctx context.Context, filter nostr.Filter) (ch
|
||||
}
|
||||
}
|
||||
|
||||
// now it's a good time to schedule this
|
||||
defer func() {
|
||||
close(ch)
|
||||
for _, itclose := range iteratorClosers {
|
||||
itclose()
|
||||
}
|
||||
}()
|
||||
|
||||
// queue may be empty here if we have literally nothing
|
||||
if len(emitQueue) == 0 {
|
||||
return nil
|
||||
return
|
||||
}
|
||||
|
||||
heap.Init(&emitQueue)
|
||||
@@ -155,12 +149,6 @@ func (b BadgerBackend) QueryEvents(ctx context.Context, filter nostr.Filter) (ch
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("badger: query txn error: %s\n", err)
|
||||
}
|
||||
}()
|
||||
|
||||
return ch, nil
|
||||
|
||||
Reference in New Issue
Block a user