Skip to content

Commit 052408e

Browse files
Improve function GetStateRangeScanIterator (hyperledger#5197)
- 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> (cherry picked from commit 9bcca1a) Co-authored-by: David Enyeart <enyeart@us.ibm.com>
1 parent e655189 commit 052408e

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
@@ -197,6 +197,29 @@ func TestGetRangeScanError(t *testing.T) {
197197
require.Error(t, err)
198198
}
199199

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