Skip to content

Commit b19d692

Browse files
authored
Merge pull request #129 from ipfs/fix/sync-query
sync: apply entire query while locked
2 parents ef49136 + 241b4af commit b19d692

File tree

2 files changed

+28
-16
lines changed

2 files changed

+28
-16
lines changed

query/query.go

+9-14
Original file line numberDiff line numberDiff line change
@@ -245,22 +245,17 @@ func ResultsWithProcess(q Query, proc func(goprocess.Process, chan<- Result)) Re
245245

246246
// ResultsWithEntries returns a Results object from a list of entries
247247
func ResultsWithEntries(q Query, res []Entry) Results {
248-
b := NewResultBuilder(q)
249-
250-
// go consume all the entries and add them to the results.
251-
b.Process.Go(func(worker goprocess.Process) {
252-
for _, e := range res {
253-
select {
254-
case b.Output <- Result{Entry: e}:
255-
case <-worker.Closing(): // client told us to close early
256-
return
248+
i := 0
249+
return ResultsFromIterator(q, Iterator{
250+
Next: func() (Result, bool) {
251+
if i >= len(res) {
252+
return Result{}, false
257253
}
258-
}
259-
return
254+
next := res[i]
255+
i++
256+
return Result{Entry: next}, true
257+
},
260258
})
261-
262-
go b.Process.CloseAfterChildren()
263-
return b.Results()
264259
}
265260

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

sync/sync.go

+19-2
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,28 @@ 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+
69+
// Apply the entire query while locked. Non-sync datastores may not
70+
// allow concurrent queries.
71+
72+
results, err := d.child.Query(q)
73+
if err != nil {
74+
return nil, err
75+
}
76+
77+
entries, err1 := results.Rest()
78+
err2 := results.Close()
79+
switch {
80+
case err1 != nil:
81+
return nil, err1
82+
case err2 != nil:
83+
return nil, err2
84+
}
85+
return dsq.ResultsWithEntries(q, entries), nil
6986
}
7087

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

0 commit comments

Comments
 (0)