From b184eb7c68915234856e18e22a1f39ef085f64f5 Mon Sep 17 00:00:00 2001 From: Brainiac 5 Date: Fri, 27 Feb 2026 20:49:34 +0100 Subject: [PATCH 1/2] Highlight issue #29 failing save after attempted deletion of non-existing key pair --- index_test.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/index_test.go b/index_test.go index 477b92f..c10c943 100644 --- a/index_test.go +++ b/index_test.go @@ -15,6 +15,7 @@ import ( "github.com/ethersphere/proximity-order-trie/pkg/elements" "github.com/ethersphere/proximity-order-trie/pkg/persister" "golang.org/x/sync/errgroup" + "github.com/stretchr/testify/assert" ) var basePotMode = elements.NewSingleOrder(256) @@ -348,6 +349,31 @@ func TestPersistence(t *testing.T) { for i := 0; i < count+10; i++ { checkFound(t, ctx, idx, newDetMockEntry(t, i)) } + t.Run("delete only existent tuple, then save - returns expected save error", func(t *testing.T) { + ls = persister.NewInmemLoadSaver() + mode = elements.NewSwarmPot(basePotMode, ls, func(key []byte) elements.Entry { return &mockEntry{key: key} }) + idx, err = pot.New(mode) + ctx, cancel := context.WithTimeout(ctx, 3*time.Second) + defer cancel() + e0 := newDetMockEntry(t, 0) + idx.Add(ctx, e0) + idx.Delete(ctx, e0.key) + _, err := idx.Save(ctx) + assert.Error(t, err) + }) + t.Run("delete non-existent tuple from non empty POT, then save - returns unexpected error", func(t *testing.T) { + ls = persister.NewInmemLoadSaver() + mode = elements.NewSwarmPot(basePotMode, ls, func(key []byte) elements.Entry { return &mockEntry{key: key} }) + idx, err = pot.New(mode) + ctx, cancel := context.WithTimeout(ctx, 3*time.Second) + defer cancel() + e0 := newDetMockEntry(t, 0) + e1 := newDetMockEntry(t, 1) + idx.Add(ctx, e0) + idx.Delete(ctx, e1.key) + _, err := idx.Save(ctx) + assert.NoError(t, err) + }) } func TestConcurrency(t *testing.T) { From 14e79fdbe521788e310856fd9ab7dc8d6c80dd00 Mon Sep 17 00:00:00 2001 From: Brainiac 5 Date: Fri, 27 Feb 2026 23:37:53 +0100 Subject: [PATCH 2/2] Fix failing save after attempt to delete non-existant key (#29) --- index_test.go | 4 ++-- pkg/elements/mode.go | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/index_test.go b/index_test.go index c10c943..62ff5ce 100644 --- a/index_test.go +++ b/index_test.go @@ -349,7 +349,7 @@ func TestPersistence(t *testing.T) { for i := 0; i < count+10; i++ { checkFound(t, ctx, idx, newDetMockEntry(t, i)) } - t.Run("delete only existent tuple, then save - returns expected save error", func(t *testing.T) { + t.Run("delete only existent tuple, then save", func(t *testing.T) { ls = persister.NewInmemLoadSaver() mode = elements.NewSwarmPot(basePotMode, ls, func(key []byte) elements.Entry { return &mockEntry{key: key} }) idx, err = pot.New(mode) @@ -361,7 +361,7 @@ func TestPersistence(t *testing.T) { _, err := idx.Save(ctx) assert.Error(t, err) }) - t.Run("delete non-existent tuple from non empty POT, then save - returns unexpected error", func(t *testing.T) { + t.Run("delete non-existent tuple from non empty POT, then save", func(t *testing.T) { ls = persister.NewInmemLoadSaver() mode = elements.NewSwarmPot(basePotMode, ls, func(key []byte) elements.Entry { return &mockEntry{key: key} }) idx, err = pot.New(mode) diff --git a/pkg/elements/mode.go b/pkg/elements/mode.go index 182c16c..694bdb8 100644 --- a/pkg/elements/mode.go +++ b/pkg/elements/mode.go @@ -129,8 +129,10 @@ func (pm *SwarmPot) Update(ctx context.Context, root Node, k []byte, e *Entry) ( if err != nil { return nil, err } - pm.n = update - return update, nil + if update != nil { + pm.n = update + } + return pm.n, nil } // Pack serialises and saves the object