diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 313e3cdf2..7047025f5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -52,5 +52,5 @@ jobs: - name: Lint uses: golangci/golangci-lint-action@v3 with: - version: v1.51.2 + version: v1.55.2 diff --git a/.golangci.yml b/.golangci.yml index 2929ea46f..371fb92d1 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -4,7 +4,7 @@ linters: disable-all: true enable: - bodyclose - - depguard + #- depguard - exportloopref - gofmt - goimports diff --git a/internal/unionstore/memdb.go b/internal/unionstore/memdb.go index 1aca2fa2e..1560f51ce 100644 --- a/internal/unionstore/memdb.go +++ b/internal/unionstore/memdb.go @@ -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) diff --git a/internal/unionstore/memdb_arena.go b/internal/unionstore/memdb_arena.go index 146d6a0fe..c1db745af 100644 --- a/internal/unionstore/memdb_arena.go +++ b/internal/unionstore/memdb_arena.go @@ -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 { diff --git a/internal/unionstore/memdb_test.go b/internal/unionstore/memdb_test.go index e5fe20631..913aebc43 100644 --- a/internal/unionstore/memdb_test.go +++ b/internal/unionstore/memdb_test.go @@ -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)}) + } +} diff --git a/util/misc.go b/util/misc.go index e324bf797..5b87b94ff 100644 --- a/util/misc.go +++ b/util/misc.go @@ -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