diff --git a/keytransform/keytransform.go b/keytransform/keytransform.go index 3e4b8ed..c1c7414 100644 --- a/keytransform/keytransform.go +++ b/keytransform/keytransform.go @@ -94,8 +94,8 @@ func (d *Datastore) Query(ctx context.Context, q dsq.Query) (dsq.Results, error) } return r, true }, - Close: func() { - cqr.Close() + Close: func() error { + return cqr.Close() }, }) return dsq.NaiveQueryApply(nq, qr), nil diff --git a/mount/mount.go b/mount/mount.go index 32737f4..aa1d260 100644 --- a/mount/mount.go +++ b/mount/mount.go @@ -140,11 +140,12 @@ func (h *querySet) Pop() interface{} { return last } -func (h *querySet) close() { +func (h *querySet) close() error { for _, qr := range h.heads { qr.results.Close() } h.heads = nil + return nil } func (h *querySet) addResults(mount ds.Key, results query.Results) { diff --git a/query/query.go b/query/query.go index d769377..d3e4f1c 100644 --- a/query/query.go +++ b/query/query.go @@ -153,7 +153,7 @@ type Results interface { Next() <-chan Result // returns a channel to wait for the next result NextSync() (Result, bool) // blocks and waits to return the next result, second parameter returns false when results are exhausted Rest() ([]Entry, error) // waits till processing finishes, returns all entries at once. - Close() // client may call Close to signal early exit + Close() error // client may call Close to signal early exit Done() <-chan struct{} // signals that Results is closed } @@ -187,9 +187,10 @@ func (r *results) Rest() ([]Entry, error) { return es, nil } -func (r *results) Close() { +func (r *results) Close() error { r.cancel() <-r.closed + return nil } func (r *results) Query() Query { @@ -273,17 +274,17 @@ func ResultsFromIterator(q Query, iter Iterator) Results { } } -func noopClose() {} +func noopClose() error { return nil } type Iterator struct { Next func() (Result, bool) - Close func() // note: might be called more than once + Close func() error // note: might be called more than once } type resultsIter struct { query Query next func() (Result, bool) - close func() + close func() error results *results } @@ -318,7 +319,7 @@ func (r *resultsIter) Rest() ([]Entry, error) { return es, nil } -func (r *resultsIter) Close() { +func (r *resultsIter) Close() error { if r.results != nil { // Close results collector. It will call r.close(). r.results.Close() @@ -326,6 +327,7 @@ func (r *resultsIter) Close() { // Call r.close() since there is no collector to call it when closed. r.close() } + return nil } func (r *resultsIter) Query() Query { diff --git a/query/query_impl.go b/query/query_impl.go index 403dddb..3db3657 100644 --- a/query/query_impl.go +++ b/query/query_impl.go @@ -18,8 +18,8 @@ func NaiveFilter(qr Results, filter Filter) Results { } } }, - Close: func() { - qr.Close() + Close: func() error { + return qr.Close() }, }) } @@ -43,12 +43,12 @@ func NaiveLimit(qr Results, limit int) Results { limit-- return qr.NextSync() }, - Close: func() { + Close: func() error { if closed { - return + return nil } closed = true - qr.Close() + return qr.Close() }, }) } @@ -65,8 +65,8 @@ func NaiveOffset(qr Results, offset int) Results { } return qr.NextSync() }, - Close: func() { - qr.Close() + Close: func() error { + return qr.Close() }, }) } diff --git a/query/query_test.go b/query/query_test.go index 0b3195a..3347f09 100644 --- a/query/query_test.go +++ b/query/query_test.go @@ -200,7 +200,7 @@ func TestResultsFromIteratorNoClose(t *testing.T) { testResultsFromIterator(t, getKeysViaChan, nil) } -func testResultsFromIterator(t *testing.T, getKeys func(rs Results) []string, close func()) { +func testResultsFromIterator(t *testing.T, getKeys func(rs Results) []string, close func() error) { i := 0 results := ResultsFromIterator(Query{}, Iterator{ Next: func() (Result, bool) { @@ -221,8 +221,9 @@ func testResultsFromIterator(t *testing.T, getKeys func(rs Results) []string, cl func testResultsFromIteratorWClose(t *testing.T, getKeys func(rs Results) []string) { closeCalled := 0 - testResultsFromIterator(t, getKeys, func() { + testResultsFromIterator(t, getKeys, func() error { closeCalled++ + return nil }) if closeCalled != 1 { t.Errorf("close called %d times, expect it to be called just once", closeCalled)