memdb: fix memdb snapshot get/iter is not actually snapshot (#1393)

* fix memdb snapshot get/iter is not actually snapshot

Signed-off-by: you06 <you1474600@gmail.com>

* rename test

Signed-off-by: you06 <you1474600@gmail.com>

---------

Signed-off-by: you06 <you1474600@gmail.com>
This commit is contained in:
you06 2024-08-21 16:35:30 +09:00 committed by GitHub
parent 77526daca4
commit 75e3705e58
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 37 additions and 1 deletions

View File

@ -343,7 +343,7 @@ func (l *memdbVlog) getSnapshotValue(addr memdbArenaAddr, snap *MemDBCheckpoint)
if result.isNull() {
return nil, false
}
return l.getValue(addr), true
return l.getValue(result), true
}
func (l *memdbVlog) selectValueHistory(addr memdbArenaAddr, predicate func(memdbArenaAddr) bool) memdbArenaAddr {

View File

@ -37,6 +37,7 @@
package unionstore
import (
"context"
"encoding/binary"
"fmt"
"testing"
@ -860,3 +861,38 @@ func TestUnsetTemporaryFlag(t *testing.T) {
require.Nil(err)
require.False(flags.HasNeedConstraintCheckInPrewrite())
}
func TestSnapshotGetIter(t *testing.T) {
assert := assert.New(t)
buffer := newMemDB()
var getters []Getter
var iters []Iterator
for i := 0; i < 100; i++ {
assert.Nil(buffer.Set([]byte{byte(0)}, []byte{byte(i)}))
// getter
getter := buffer.SnapshotGetter()
val, err := getter.Get(context.Background(), []byte{byte(0)})
assert.Nil(err)
assert.Equal(val, []byte{byte(min(i, 50))})
getters = append(getters, getter)
// iter
iter := buffer.SnapshotIter(nil, nil)
assert.Nil(err)
assert.Equal(iter.Key(), []byte{byte(0)})
assert.Equal(iter.Value(), []byte{byte(min(i, 50))})
iter.Close()
iters = append(iters, buffer.SnapshotIter(nil, nil))
if i == 50 {
_ = buffer.Staging()
}
}
for _, getter := range getters {
val, err := getter.Get(context.Background(), []byte{byte(0)})
assert.Nil(err)
assert.Equal(val, []byte{byte(50)})
}
for _, iter := range iters {
assert.Equal(iter.Key(), []byte{byte(0)})
assert.Equal(iter.Value(), []byte{byte(50)})
}
}