Skip to content

Commit c6ee14e

Browse files
committed
Improve function GetStateRangeScanIterator
- Close iterators if newItrCombiner fails. - Handle nil iterators returned without errors. - Improve error messages for debugging. Signed-off-by: David Enyeart <enyeart@us.ibm.com>
1 parent d332a6d commit c6ee14e

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

core/ledger/kvledger/txmgmt/queryutil/combiner_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,29 @@ func TestGetRangeScanError(t *testing.T) {
196196
require.Error(t, err)
197197
}
198198

199+
func TestGetStateRangeScanIteratorNil(t *testing.T) {
200+
itr1 := &statedbmock.ResultsIterator{}
201+
itr1.NextReturns(
202+
&statedb.VersionedKV{
203+
CompositeKey: &statedb.CompositeKey{Namespace: "ns", Key: "dummyKey"},
204+
VersionedValue: &statedb.VersionedValue{Value: []byte("dummyVal")},
205+
},
206+
nil,
207+
)
208+
209+
qe1 := &mock.QueryExecuter{}
210+
qe1.GetStateRangeScanIteratorReturns(itr1, nil)
211+
qe2 := &mock.QueryExecuter{}
212+
qe2.GetStateRangeScanIteratorReturns(nil, nil)
213+
combiner := &queryutil.QECombiner{
214+
QueryExecuters: []queryutil.QueryExecuter{
215+
qe1, qe2,
216+
},
217+
}
218+
_, err := combiner.GetStateRangeScanIterator("ns", "startKey", "endKey")
219+
require.EqualError(t, err, "received nil iterator from QueryExecuter")
220+
}
221+
199222
func TestGetRangeScanUnderlyingIteratorReturnsError(t *testing.T) {
200223
itr1 := &statedbmock.ResultsIterator{}
201224
itr1.NextReturns(

core/ledger/kvledger/txmgmt/queryutil/query_executer_combiner.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/privacyenabledstate"
1313
"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/statedb"
1414
"github.com/hyperledger/fabric/core/ledger/util"
15+
"github.com/pkg/errors"
1516
)
1617

1718
var logger = flogging.MustGetLogger("util")
@@ -62,12 +63,21 @@ func (c *QECombiner) GetStateRangeScanIterator(namespace string, startKey string
6263
for _, itr := range itrs {
6364
itr.Close()
6465
}
65-
return nil, err
66+
return nil, errors.Wrap(err, "failed to get iterator from QueryExecuter")
67+
}
68+
if itr == nil {
69+
for _, itr := range itrs {
70+
itr.Close()
71+
}
72+
return nil, errors.New("received nil iterator from QueryExecuter")
6673
}
6774
itrs = append(itrs, itr)
6875
}
6976
itrCombiner, err := newItrCombiner(namespace, itrs)
7077
if err != nil {
78+
for _, itr := range itrs {
79+
itr.Close()
80+
}
7181
return nil, err
7282
}
7383
return itrCombiner, nil

0 commit comments

Comments
 (0)