Skip to content

Commit

Permalink
memdb: fix memdb snapshot get/iter is not actually snapshot (#1393) (#…
Browse files Browse the repository at this point in the history
…1434)

ref #1394

Signed-off-by: you06 <[email protected]>
  • Loading branch information
you06 authored Sep 18, 2024
1 parent bc6139e commit db90b0d
Show file tree
Hide file tree
Showing 6 changed files with 41 additions and 3 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,5 @@ jobs:
- name: Lint
uses: golangci/golangci-lint-action@v3
with:
version: v1.51.2
version: v1.55.2

2 changes: 1 addition & 1 deletion .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ linters:
disable-all: true
enable:
- bodyclose
- depguard
#- depguard
- exportloopref
- gofmt
- goimports
Expand Down
1 change: 1 addition & 0 deletions internal/unionstore/memdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -838,6 +838,7 @@ func (n *memdbNode) setBlack() {

func (n *memdbNode) getKey() []byte {
var ret []byte
//nolint: staticcheck
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&ret))
hdr.Data = uintptr(unsafe.Pointer(&n.flags)) + kv.FlagBytes
hdr.Len = int(n.klen)
Expand Down
2 changes: 1 addition & 1 deletion internal/unionstore/memdb_arena.go
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,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 {
Expand Down
35 changes: 35 additions & 0 deletions internal/unionstore/memdb_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -860,3 +860,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([]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([]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)})
}
}
2 changes: 2 additions & 0 deletions util/misc.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,9 @@ func String(b []byte) (s string) {
if len(b) == 0 {
return ""
}
//nolint: staticcheck
pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b))
//nolint: staticcheck
pstring := (*reflect.StringHeader)(unsafe.Pointer(&s))
pstring.Data = pbytes.Data
pstring.Len = pbytes.Len
Expand Down

0 comments on commit db90b0d

Please sign in to comment.