From 226a2344ec37770923349183b8895badb78b4c67 Mon Sep 17 00:00:00 2001 From: GarmashAlex Date: Wed, 28 May 2025 00:04:01 +0300 Subject: [PATCH] fix: properly store errors in Iterator.Next() method (#1090) Co-authored-by: yihuang Co-authored-by: Alex | Interchain Labs (cherry picked from commit 4027b8d6a986ef2ab0f71c124bbf828bf79d4da2) --- iterator.go | 5 ++++- iterator_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/iterator.go b/iterator.go index 131a2bdda..176bef680 100644 --- a/iterator.go +++ b/iterator.go @@ -228,8 +228,11 @@ func (iter *Iterator) Next() { } node, err := iter.t.next() - // TODO: double-check if this error is correctly handled. + // If an error occurred or no more nodes, update iterator state accordingly if node == nil || err != nil { + if err != nil { + iter.err = err + } iter.t = nil iter.valid = false return diff --git a/iterator_test.go b/iterator_test.go index 4ae1df118..01b808522 100644 --- a/iterator_test.go +++ b/iterator_test.go @@ -380,3 +380,31 @@ func syncMapCount(m *sync.Map) int { }) return count } + +func TestIterator_Next_ErrorHandling(t *testing.T) { + db := dbm.NewMemDB() + ndb := newNodeDB(db, 0, DefaultOptions(), NewNopLogger()) + tree := &ImmutableTree{ndb: ndb} + + // Create a branch node with a left child key that does not exist in the DB + node := &Node{ + key: []byte("err"), + leftNodeKey: []byte("missing"), // triggers GetNode error + rightNodeKey: nil, + subtreeHeight: 1, + } + tree.root = node + + iter := &Iterator{ + start: nil, + end: nil, + valid: true, + t: node.newTraversal(tree, nil, nil, true, false, false), + } + + iter.Next() + + require.False(t, iter.Valid(), "iterator should be invalid after error") + require.Error(t, iter.Error(), "iterator should have error set") + require.Contains(t, iter.Error().Error(), "node does not have a nodeKey") +}