Skip to content

Commit 83ffbab

Browse files
committed
sync: apply entire query while locked
1 parent e5644bc commit 83ffbab

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

query/query.go

+17
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,23 @@ func ResultsWithEntries(q Query, res []Entry) Results {
258258
})
259259
}
260260

261+
// ResultsWithResults returns a Results object from a list of Results and a
262+
// close error.
263+
func ResultsWithResults(q Query, res []Result, closeErr error) Results {
264+
i := 0
265+
return ResultsFromIterator(q, Iterator{
266+
Next: func() (Result, bool) {
267+
if i >= len(res) {
268+
return Result{}, false
269+
}
270+
next := res[i]
271+
i++
272+
return next, true
273+
},
274+
Close: func() error {
275+
return closeErr
276+
},
277+
})
261278
}
262279

263280
func ResultsReplaceQuery(r Results, q Query) Results {

sync/sync.go

+17-2
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,26 @@ func (d *MutexDatastore) Delete(key ds.Key) (err error) {
6161
return d.child.Delete(key)
6262
}
6363

64-
// KeyList implements Datastore.KeyList
64+
// Query implements Datastore.Query
6565
func (d *MutexDatastore) Query(q dsq.Query) (dsq.Results, error) {
6666
d.RLock()
6767
defer d.RUnlock()
68-
return d.child.Query(q)
68+
results, err := d.child.Query(q)
69+
if err != nil {
70+
return nil, err
71+
}
72+
73+
// Apply the entire query while locked. Non-sync datastores may not
74+
// allow concurrent queries.
75+
var res []dsq.Result
76+
for {
77+
next, ok := results.NextSync()
78+
if !ok {
79+
break
80+
}
81+
res = append(res, next)
82+
}
83+
return dsq.ResultsWithResults(q, res, results.Close()), nil
6984
}
7085

7186
func (d *MutexDatastore) Batch() (ds.Batch, error) {

0 commit comments

Comments
 (0)