Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion iterator.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
28 changes: 28 additions & 0 deletions iterator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -381,3 +381,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")
}