Skip to content

Commit e6c9d4e

Browse files
authored
fix(merge-operator): don't read the deleted keys (hypermodeinc#1675)
1 parent 42d5e95 commit e6c9d4e

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

merge.go

+3
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ func (op *MergeOperator) iterateAndMerge() (newVal []byte, latest uint64, err er
7070
var numVersions int
7171
for it.Rewind(); it.Valid(); it.Next() {
7272
item := it.Item()
73+
if item.IsDeletedOrExpired() {
74+
break
75+
}
7376
numVersions++
7477
if numVersions == 1 {
7578
// This should be the newVal, considering this is the latest version.

merge_test.go

+32
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,38 @@ func TestGetMergeOperator(t *testing.T) {
9292
})
9393
})
9494

95+
t.Run("Get after Delete", func(t *testing.T) {
96+
key := []byte("merge")
97+
runBadgerTest(t, nil, func(t *testing.T, db *DB) {
98+
m := db.GetMergeOperator(key, add, 200*time.Millisecond)
99+
100+
err := m.Add(uint64ToBytes(1))
101+
require.NoError(t, err)
102+
m.Add(uint64ToBytes(2))
103+
require.NoError(t, err)
104+
m.Add(uint64ToBytes(3))
105+
require.NoError(t, err)
106+
107+
m.Stop()
108+
res, err := m.Get()
109+
require.NoError(t, err)
110+
require.Equal(t, uint64(6), bytesToUint64(res))
111+
112+
db.Update(func(txn *Txn) error {
113+
return txn.Delete(key)
114+
})
115+
116+
m = db.GetMergeOperator(key, add, 200*time.Millisecond)
117+
err = m.Add(uint64ToBytes(1))
118+
require.NoError(t, err)
119+
m.Stop()
120+
121+
res, err = m.Get()
122+
require.NoError(t, err)
123+
require.Equal(t, uint64(1), bytesToUint64(res))
124+
})
125+
})
126+
95127
t.Run("Get after Stop", func(t *testing.T) {
96128
key := []byte("merge")
97129
runBadgerTest(t, nil, func(t *testing.T, db *DB) {

0 commit comments

Comments
 (0)