diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 685cf7d..016b7af 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -14,7 +14,7 @@ jobs: - uses: DeterminateSystems/flakehub-cache-action@main - uses: actions/setup-go@v5 with: - go-version: "1.20" + go-version: "1.23" check-latest: true - name: run lint run: nix develop -c make lint diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e7d930a..e5bbb0f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,7 @@ jobs: - uses: DeterminateSystems/flakehub-cache-action@main - uses: actions/setup-go@v5 with: - go-version: "1.20" + go-version: "1.23" check-latest: true cache: true cache-dependency-path: store/go.sum diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index 9541a3d..0000000 --- a/.gitpod.yml +++ /dev/null @@ -1,6 +0,0 @@ -# This configuration file was automatically generated by Gitpod. -# Please adjust to your needs (see https://www.gitpod.io/docs/config-gitpod-file) -# and commit this file to your remote git repository to share the goodness with others. - -image: ghcr.io/cosmos/cosmos-db/build-test:latest -# this means that there's a one-click known good environment available to developers. diff --git a/.golangci.yml b/.golangci.yml index 7cc6920..63fd8b6 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,34 +1,150 @@ +version: "2" run: build-tags: - rocksdb - concurrency: 4 - sort-results: true - allow-parallel-runners: true tests: true - + allow-parallel-runners: true linters: - disable-all: true + default: none enable: + - copyloopvar - dogsled - - dupl - errcheck - - exportloopref + - errorlint - goconst - gocritic - - gofumpt - - revive - gosec - - gosimple - govet - ineffassign - - lll - misspell - nakedret - - prealloc - - staticcheck - - stylecheck - - typecheck + - nolintlint - revive + - staticcheck + - thelper - unconvert - unused - - nolintlint + settings: + dogsled: + max-blank-identifiers: 6 + gocritic: + disabled-checks: + - regexpMust + - appendAssign + - ifElseChain + gosec: + excludes: + - G101 + - G107 + - G404 + confidence: medium + misspell: + locale: US + nolintlint: + require-explanation: true + require-specific: false + allow-unused: false + revive: + rules: + - name: redefines-builtin-id + disabled: true + - name: exported + severity: error + disabled: false + staticcheck: + checks: + - all + unused: + local-variables-are-used: false + exclusions: + generated: lax + presets: + - common-false-positives + - legacy + - std-error-handling + rules: + - linters: + - staticcheck + text: 'ST1000:' + - linters: + - revive + text: 'or be unexported' # don't report types that have no comments at all. there are way too many of these. + - linters: + - staticcheck + text: 'ST1003:' + - linters: + - staticcheck + text: 'ST1016:' + - linters: + - staticcheck + path: migrations + text: 'SA1019:' + - linters: + - staticcheck + text: 'SA1019: codec.NewAminoCodec is deprecated' + - linters: + - staticcheck + text: 'SA1019: legacybech32.MustMarshalPubKey' + - linters: + - staticcheck + text: 'SA1019: legacybech32.MarshalPubKey' + - linters: + - staticcheck + text: 'SA1019: legacybech32.UnmarshalPubKey' + - linters: + - staticcheck + text: 'SA1019: params.SendEnabled is deprecated' + - linters: + - gosec + text: 'G115: integer overflow conversion' + - linters: + - nolintlint + text: leading space + paths: + - server/grpc/gogoreflection/fix_registration.go + - fix_registration.go + - .*\.pb\.go$ + - .*\.pb\.gw\.go$ + - .*\.pulsar\.go$ + - crypto/keys/secp256k1/internal/* + - types/coin_regex.go + - testutil/testdata + - x/params + - x/crisis + - third_party$ + - builtin$ + - examples$ +issues: + max-issues-per-linter: 10000 + max-same-issues: 10000 +formatters: + enable: + - gci + - gofumpt + settings: + gci: + sections: + - standard + - default + - prefix(cosmossdk.io) + - prefix(github.com/cosmos/cosmos-sdk) + custom-order: true + gofumpt: + extra-rules: true + exclusions: + + generated: lax + paths: + - server/grpc/gogoreflection/fix_registration.go + - fix_registration.go + - .*\.pb\.go$ + - .*\.pb\.gw\.go$ + - .*\.pulsar\.go$ + - crypto/keys/secp256k1/internal/* + - types/coin_regex.go + - testutil/testdata + - x/params + - x/crisis + - third_party$ + - builtin$ + - examples$ diff --git a/CHANGELOG.md b/CHANGELOG.md index 649f114..a15ec80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [v1.1.2] - 2025-05-28 + +* Make `Iterator` and `Batch` interfaces more flexible by a type alias +* Update deps to the latest versions +* Update linter for general code cleanup + ## [v1.1.1] - 2024-12-19 * [#120](https://github.com/cosmos/cosmos-db/pull/120) Skip unwanted logs from PebbleDB @@ -7,12 +13,11 @@ ## [v1.1.0] - 2024-11-22 * Allow full control in rocksdb opening -* Make `Iteractor` and `Batch` interfaces more flexible by a type alias * Remove build tag for PebbleDB ## [v1.0.2] - 2024-02-26 -* Downgrade Go version in go.mod to 1.19 +* Downgrade Go version in `go.mod` to 1.19 ## [v1.0.1] - 2024-02-25 diff --git a/Makefile b/Makefile index 87513f6..ce1aac3 100644 --- a/Makefile +++ b/Makefile @@ -10,22 +10,20 @@ test-rocksdb: @echo "--> Running go test" @go test $(PACKAGES) -tags rocksdb -v -golangci_version=v1.55.0 +golangci_version=v2.1.6 #? lint-install: Install golangci-lint lint-install: @echo "--> Installing golangci-lint $(golangci_version)" - @go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(golangci_version) + @go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@$(golangci_version) .PHONY: lint-install -lint: +lint: lint-install @echo "--> Running linter" - $(MAKE) lint-install @golangci-lint run - @go mod verify -.PHONY: lint -format: - find . -name '*.go' -type f -not -path "*.git*" -not -name '*.pb.go' -not -name '*pb_test.go' | xargs gofumpt -w -l . - find . -name '*.go' -type f -not -path "*.git*" -not -name '*.pb.go' -not -name '*pb_test.go' | xargs golangci-lint run --fix . -.PHONY: format +lint-fix: lint-install + @echo "--> Running linter" + @golangci-lint run --fix +.PHONY: lint lint-fix + diff --git a/backend_test.go b/backend_test.go index f59cc2a..17d511d 100644 --- a/backend_test.go +++ b/backend_test.go @@ -7,7 +7,6 @@ import ( "path/filepath" "testing" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -15,12 +14,12 @@ import ( func init() { registerDBCreator("prefixdb", func(name, dir string, opts Options) (DB, error) { mdb := NewMemDB() - mdb.Set([]byte("a"), []byte{1}) //nolint:errcheck - mdb.Set([]byte("b"), []byte{2}) //nolint:errcheck - mdb.Set([]byte("t"), []byte{20}) //nolint:errcheck - mdb.Set([]byte("test"), []byte{0}) //nolint:errcheck - mdb.Set([]byte("u"), []byte{21}) //nolint:errcheck - mdb.Set([]byte("z"), []byte{26}) //nolint:errcheck + _ = mdb.Set([]byte("a"), []byte{1}) + _ = mdb.Set([]byte("b"), []byte{2}) + _ = mdb.Set([]byte("t"), []byte{20}) + _ = mdb.Set([]byte("test"), []byte{0}) + _ = mdb.Set([]byte("u"), []byte{21}) + _ = mdb.Set([]byte("z"), []byte{26}) return NewPrefixDB(mdb, []byte("test/")), nil }, false) } @@ -33,6 +32,8 @@ func cleanupDBDir(dir, name string) { } func testBackendGetSetDelete(t *testing.T, backend BackendType) { + t.Helper() + // Default dirname, err := os.MkdirTemp("", fmt.Sprintf("test_backend_%s_", backend)) require.Nil(t, err) @@ -149,7 +150,7 @@ func TestGoLevelDBBackend(t *testing.T) { defer cleanupDBDir("", name) _, ok := db.(*GoLevelDB) - assert.True(t, ok) + require.True(t, ok) } func TestDBIterator(t *testing.T) { @@ -161,6 +162,8 @@ func TestDBIterator(t *testing.T) { } func testDBIterator(t *testing.T, backend BackendType) { + t.Helper() + name := fmt.Sprintf("test_%x", randStr(12)) dir := os.TempDir() db, err := NewDB(name, backend, dir) @@ -317,13 +320,15 @@ func testDBIterator(t *testing.T, backend BackendType) { } func verifyIterator(t *testing.T, itr Iterator, expected []int64, msg string) { + t.Helper() + var list []int64 for itr.Valid() { key := itr.Key() list = append(list, bytes2Int64(key)) itr.Next() } - assert.Equal(t, expected, list, msg) + require.Equal(t, expected, list, msg) } func TestDBBatchGetByteSize(t *testing.T) { @@ -335,6 +340,8 @@ func TestDBBatchGetByteSize(t *testing.T) { } func testDBBatchGetByteSize(t *testing.T, backend BackendType) { + t.Helper() + name := fmt.Sprintf("test_%x", randStr(12)) dir := os.TempDir() db, err := NewDB(name, backend, dir) @@ -346,15 +353,15 @@ func testDBBatchGetByteSize(t *testing.T, backend BackendType) { batchSize, err := batch.GetByteSize() require.NoError(t, err) // size of newly created batch should be 0 or negligible because of the metadata in the batch, - // for example peppble's batchHeaderLen is 12 so - // peppble's batch size will always be equal or greater than 12 even for empty batch + // for example, pebble's batchHeaderLen is 12, so + // pebble's batch size will always be equal or greater than 12 even for empty batches require.LessOrEqual(t, batchSize, 32) totalSizeOfKeyAndValue := 0 // set 100 random keys and values for i := 0; i < 100; i++ { - keySize := rand.Intn(32) + 1 //nolint:gosec - valueSize := rand.Intn(32) + 1 //nolint:gosec + keySize := rand.Intn(32) + 1 + valueSize := rand.Intn(32) + 1 totalSizeOfKeyAndValue += keySize + valueSize require.NoError(t, batch.Set([]byte(randStr(keySize)), []byte(randStr(valueSize)))) } @@ -382,6 +389,8 @@ func TestDBBatchOperations(t *testing.T) { } func testDBBatchOperations(t *testing.T, backend BackendType) { + t.Helper() + name := fmt.Sprintf("test_%x", randStr(12)) dir := os.TempDir() db, err := NewDB(name, backend, dir) @@ -441,10 +450,10 @@ func testDBBatchOperations(t *testing.T, backend BackendType) { require.NoError(t, err) assertKeyValues(t, db, map[string][]byte{"a": {1}, "b": {2}}) - // it should be possible to close an empty batch, and to re-close a closed batch + // it should be possible to close an empty batch and to re-close a closed batch batch = db.NewBatch() - batch.Close() - batch.Close() + require.NoError(t, batch.Close()) + require.NoError(t, batch.Close()) // all other operations on a closed batch should error require.Error(t, batch.Set([]byte("a"), []byte{9})) @@ -454,6 +463,8 @@ func testDBBatchOperations(t *testing.T, backend BackendType) { } func assertKeyValues(t *testing.T, db DB, expect map[string][]byte) { + t.Helper() + iter, err := db.Iterator(nil, nil) require.NoError(t, err) defer iter.Close() @@ -464,5 +475,5 @@ func assertKeyValues(t *testing.T, db DB, expect map[string][]byte) { actual[string(iter.Key())] = iter.Value() } - assert.Equal(t, expect, actual) + require.Equal(t, expect, actual) } diff --git a/common_test.go b/common_test.go index 45d946f..5b363f9 100644 --- a/common_test.go +++ b/common_test.go @@ -7,51 +7,64 @@ import ( "os" "testing" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) //---------------------------------------- // Helper functions. -func checkValue(t *testing.T, db DB, key []byte, valueWanted []byte) { +func checkValue(t *testing.T, db DB, key, valueWanted []byte) { + t.Helper() + valueGot, err := db.Get(key) - assert.NoError(t, err) - assert.Equal(t, valueWanted, valueGot) + require.NoError(t, err) + require.Equal(t, valueWanted, valueGot) } func checkValid(t *testing.T, itr Iterator, expected bool) { + t.Helper() + valid := itr.Valid() require.Equal(t, expected, valid) } func checkNext(t *testing.T, itr Iterator, expected bool) { + t.Helper() + itr.Next() - // assert.NoError(t, err) TODO: look at fixing this + // require.NoError(t, err) TODO: look at fixing this valid := itr.Valid() require.Equal(t, expected, valid) } func checkNextPanics(t *testing.T, itr Iterator) { - assert.Panics(t, func() { itr.Next() }, "checkNextPanics expected an error but didn't") + t.Helper() + + require.Panics(t, func() { itr.Next() }, "checkNextPanics expected an error but didn't") } func checkDomain(t *testing.T, itr Iterator, start, end []byte) { + t.Helper() + ds, de := itr.Domain() - assert.Equal(t, start, ds, "checkDomain domain start incorrect") - assert.Equal(t, end, de, "checkDomain domain end incorrect") + require.Equal(t, start, ds, "checkDomain domain start incorrect") + require.Equal(t, end, de, "checkDomain domain end incorrect") } -func checkItem(t *testing.T, itr Iterator, key []byte, value []byte) { +func checkItem(t *testing.T, itr Iterator, key, value []byte) { + t.Helper() + v := itr.Value() k := itr.Key() - assert.Exactly(t, key, k) - assert.Exactly(t, value, v) + require.Exactly(t, key, k) + require.Exactly(t, value, v) } func checkInvalid(t *testing.T, itr Iterator) { + t.Helper() + checkValid(t, itr, false) checkKeyPanics(t, itr) checkValuePanics(t, itr) @@ -59,14 +72,20 @@ func checkInvalid(t *testing.T, itr Iterator) { } func checkKeyPanics(t *testing.T, itr Iterator) { - assert.Panics(t, func() { itr.Key() }, "checkKeyPanics expected panic but didn't") + t.Helper() + + require.Panics(t, func() { itr.Key() }, "checkKeyPanics expected panic but didn't") } func checkValuePanics(t *testing.T, itr Iterator) { - assert.Panics(t, func() { itr.Value() }) + t.Helper() + + require.Panics(t, func() { itr.Value() }) } func newTempDB(t *testing.T, backend BackendType) (db DB, dbDir string) { + t.Helper() + dirname, err := os.MkdirTemp("", "db_common_test") require.NoError(t, err) db, err = NewDB("testdb", backend, dirname) @@ -75,6 +94,7 @@ func newTempDB(t *testing.T, backend BackendType) (db DB, dbDir string) { } func benchmarkRangeScans(b *testing.B, db DB, dbSize int64) { + b.Helper() b.StopTimer() rangeSize := int64(10000) @@ -83,8 +103,8 @@ func benchmarkRangeScans(b *testing.B, db DB, dbSize int64) { } for i := int64(0); i < dbSize; i++ { - bytes := int642Bytes(i) - err := db.Set(bytes, bytes) + bz := int642Bytes(i) + err := db.Set(bz, bz) if err != nil { // require.NoError() is very expensive (according to profiler), so check manually b.Fatal(b, err) @@ -93,7 +113,7 @@ func benchmarkRangeScans(b *testing.B, db DB, dbSize int64) { b.StartTimer() for i := 0; i < b.N; i++ { - start := rand.Int63n(dbSize - rangeSize) //nolint:gosec + start := rand.Int63n(dbSize - rangeSize) end := start + rangeSize iter, err := db.Iterator(int642Bytes(start), int642Bytes(end)) require.NoError(b, err) @@ -101,12 +121,13 @@ func benchmarkRangeScans(b *testing.B, db DB, dbSize int64) { for ; iter.Valid(); iter.Next() { count++ } - iter.Close() + require.NoError(b, iter.Close()) require.EqualValues(b, rangeSize, count) } } func benchmarkRandomReadsWrites(b *testing.B, db DB) { + b.Helper() b.StopTimer() // create dummy data @@ -122,7 +143,7 @@ func benchmarkRandomReadsWrites(b *testing.B, db DB) { for i := 0; i < b.N; i++ { // Write something { - idx := rand.Int63n(numItems) //nolint:gosec + idx := rand.Int63n(numItems) internal[idx]++ val := internal[idx] idxBytes := int642Bytes(idx) @@ -136,7 +157,7 @@ func benchmarkRandomReadsWrites(b *testing.B, db DB) { // Read something { - idx := rand.Int63n(numItems) //nolint:gosec + idx := rand.Int63n(numItems) valExp := internal[idx] idxBytes := int642Bytes(idx) valBytes, err := db.Get(idxBytes) diff --git a/db.go b/db.go index 4394ec8..e0b196d 100644 --- a/db.go +++ b/db.go @@ -14,10 +14,10 @@ const ( // - pure go // - stable GoLevelDBBackend BackendType = "goleveldb" - // MemDBBackend represents in-memory key value store, which is mostly used + // MemDBBackend represents an in-memory key value store, which is mostly used // for testing. MemDBBackend BackendType = "memdb" - // PebbleDBDBBackend represents pebble (uses github.com/cockroachdb/pebble) + // PebbleDBBackend represents pebble (uses github.com/cockroachdb/pebble) // - pure go PebbleDBBackend BackendType = "pebbledb" // RocksDBBackend represents rocksdb (uses github.com/linxGnu/grocksdb) @@ -27,7 +27,7 @@ const ( ) type ( - dbCreator func(name string, dir string, opts Options) (DB, error) + dbCreator func(name, dir string, opts Options) (DB, error) Options interface { Get(string) interface{} diff --git a/db_test.go b/db_test.go index dc81d66..8b50f61 100644 --- a/db_test.go +++ b/db_test.go @@ -5,7 +5,7 @@ import ( "os" "testing" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestDBIteratorSingleKey(t *testing.T) { @@ -14,10 +14,10 @@ func TestDBIteratorSingleKey(t *testing.T) { db, dir := newTempDB(t, backend) defer os.RemoveAll(dir) - err := db.SetSync(bz("1"), bz("value_1")) - assert.NoError(t, err) + err := db.SetSync(stringToBytes("1"), stringToBytes("value_1")) + require.NoError(t, err) itr, err := db.Iterator(nil, nil) - assert.NoError(t, err) + require.NoError(t, err) checkValid(t, itr, true) checkNext(t, itr, false) @@ -36,15 +36,15 @@ func TestDBIteratorTwoKeys(t *testing.T) { db, dir := newTempDB(t, backend) defer os.RemoveAll(dir) - err := db.SetSync(bz("1"), bz("value_1")) - assert.NoError(t, err) + err := db.SetSync(stringToBytes("1"), stringToBytes("value_1")) + require.NoError(t, err) - err = db.SetSync(bz("2"), bz("value_1")) - assert.NoError(t, err) + err = db.SetSync(stringToBytes("2"), stringToBytes("value_1")) + require.NoError(t, err) { // Fail by calling Next too much itr, err := db.Iterator(nil, nil) - assert.NoError(t, err) + require.NoError(t, err) checkValid(t, itr, true) checkNext(t, itr, true) @@ -76,19 +76,19 @@ func TestDBIteratorMany(t *testing.T) { value := []byte{5} for _, k := range keys { err := db.Set(k, value) - assert.NoError(t, err) + require.NoError(t, err) } itr, err := db.Iterator(nil, nil) - assert.NoError(t, err) + require.NoError(t, err) defer itr.Close() for ; itr.Valid(); itr.Next() { key := itr.Key() value = itr.Value() value1, err := db.Get(key) - assert.NoError(t, err) - assert.Equal(t, value1, value) + require.NoError(t, err) + require.Equal(t, value1, value) } }) } @@ -101,7 +101,7 @@ func TestDBIteratorEmpty(t *testing.T) { defer os.RemoveAll(dir) itr, err := db.Iterator(nil, nil) - assert.NoError(t, err) + require.NoError(t, err) checkInvalid(t, itr) }) @@ -114,8 +114,8 @@ func TestDBIteratorEmptyBeginAfter(t *testing.T) { db, dir := newTempDB(t, backend) defer os.RemoveAll(dir) - itr, err := db.Iterator(bz("1"), nil) - assert.NoError(t, err) + itr, err := db.Iterator(stringToBytes("1"), nil) + require.NoError(t, err) checkInvalid(t, itr) }) @@ -128,10 +128,10 @@ func TestDBIteratorNonemptyBeginAfter(t *testing.T) { db, dir := newTempDB(t, backend) defer os.RemoveAll(dir) - err := db.SetSync(bz("1"), bz("value_1")) - assert.NoError(t, err) - itr, err := db.Iterator(bz("2"), nil) - assert.NoError(t, err) + err := db.SetSync(stringToBytes("1"), stringToBytes("value_1")) + require.NoError(t, err) + itr, err := db.Iterator(stringToBytes("2"), nil) + require.NoError(t, err) checkInvalid(t, itr) }) diff --git a/flake.lock b/flake.lock index b9479b6..7a74f41 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1705309234, - "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", "type": "github" }, "original": { @@ -44,11 +44,11 @@ ] }, "locked": { - "lastModified": 1705314449, - "narHash": "sha256-yfQQ67dLejP0FLK76LKHbkzcQqNIrux6MFe32MMFGNQ=", + "lastModified": 1745875161, + "narHash": "sha256-0YkWCS13jpoo3+sX/3kcgdxBNt1VZTmvF+FhZb4rFKI=", "owner": "nix-community", "repo": "gomod2nix", - "rev": "30e3c3a9ec4ac8453282ca7f67fca9e1da12c3e6", + "rev": "2cbd7fdd6eeab65c494cc426e18f4e4d2a5e35c0", "type": "github" }, "original": { @@ -59,11 +59,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1708939921, - "narHash": "sha256-lUPEqED/qB7Z7QiX542055zH17e3tzt+1+UsvPCAhoY=", + "lastModified": 1748460289, + "narHash": "sha256-7doLyJBzCllvqX4gszYtmZUToxKvMUrg45EUWaUYmBg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "bfa86752190cd87271f76daffb8c7e031f0d1423", + "rev": "96ec055edbe5ee227f28cdbc3f1ddf1df5965102", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index abae8ef..75f3abe 100644 --- a/flake.nix +++ b/flake.nix @@ -39,7 +39,7 @@ devShells = rec { default = with pkgs; mkShell { buildInputs = [ - go_1_20 # Use Go 1.20 version + go_1_23 # Use Go 1.23 version rocksdb ]; }; diff --git a/goleveldb.go b/goleveldb.go index 419b395..4152da4 100644 --- a/goleveldb.go +++ b/goleveldb.go @@ -1,19 +1,20 @@ package db import ( + "errors" "fmt" "path/filepath" "github.com/spf13/cast" "github.com/syndtr/goleveldb/leveldb" - "github.com/syndtr/goleveldb/leveldb/errors" + leveldberrors "github.com/syndtr/goleveldb/leveldb/errors" "github.com/syndtr/goleveldb/leveldb/filter" "github.com/syndtr/goleveldb/leveldb/opt" "github.com/syndtr/goleveldb/leveldb/util" ) func init() { - dbCreator := func(name string, dir string, opts Options) (DB, error) { + dbCreator := func(name, dir string, opts Options) (DB, error) { return NewGoLevelDB(name, dir, opts) } registerDBCreator(GoLevelDBBackend, dbCreator, false) @@ -25,7 +26,7 @@ type GoLevelDB struct { var _ DB = (*GoLevelDB)(nil) -func NewGoLevelDB(name string, dir string, opts Options) (*GoLevelDB, error) { +func NewGoLevelDB(name, dir string, opts Options) (*GoLevelDB, error) { defaultOpts := &opt.Options{ Filter: filter.NewBloomFilter(10), // by default, goleveldb doesn't use a bloom filter. } @@ -39,7 +40,7 @@ func NewGoLevelDB(name string, dir string, opts Options) (*GoLevelDB, error) { return NewGoLevelDBWithOpts(name, dir, defaultOpts) } -func NewGoLevelDBWithOpts(name string, dir string, o *opt.Options) (*GoLevelDB, error) { +func NewGoLevelDBWithOpts(name, dir string, o *opt.Options) (*GoLevelDB, error) { dbPath := filepath.Join(dir, name+DBFileSuffix) db, err := leveldb.OpenFile(dbPath, o) if err != nil { @@ -58,7 +59,7 @@ func (db *GoLevelDB) Get(key []byte) ([]byte, error) { } res, err := db.db.Get(key, nil) if err != nil { - if err == errors.ErrNotFound { + if errors.Is(err, leveldberrors.ErrNotFound) { return nil, nil } return nil, err @@ -76,7 +77,7 @@ func (db *GoLevelDB) Has(key []byte) (bool, error) { } // Set implements DB. -func (db *GoLevelDB) Set(key []byte, value []byte) error { +func (db *GoLevelDB) Set(key, value []byte) error { if len(key) == 0 { return errKeyEmpty } @@ -90,7 +91,7 @@ func (db *GoLevelDB) Set(key []byte, value []byte) error { } // SetSync implements DB. -func (db *GoLevelDB) SetSync(key []byte, value []byte) error { +func (db *GoLevelDB) SetSync(key, value []byte) error { if len(key) == 0 { return errKeyEmpty } diff --git a/goleveldb_iterator.go b/goleveldb_iterator.go index 5341d1a..069e2fc 100644 --- a/goleveldb_iterator.go +++ b/goleveldb_iterator.go @@ -23,8 +23,8 @@ func newGoLevelDBIterator(source iterator.Iterator, start, end []byte, isReverse } else { valid := source.Seek(end) if valid { - eoakey := source.Key() // end or after key - if bytes.Compare(end, eoakey) <= 0 { + eoaKey := source.Key() // end or after key + if bytes.Compare(end, eoaKey) <= 0 { source.Prev() } } else { @@ -129,7 +129,7 @@ func (itr *goLevelDBIterator) Close() error { return nil } -func (itr goLevelDBIterator) assertIsValid() { +func (itr *goLevelDBIterator) assertIsValid() { if !itr.Valid() { panic("iterator is invalid") } diff --git a/goleveldb_test.go b/goleveldb_test.go index db9189e..506dfb4 100644 --- a/goleveldb_test.go +++ b/goleveldb_test.go @@ -17,7 +17,7 @@ func TestGoLevelDBNewGoLevelDB(t *testing.T) { require.Nil(t, err) _, err = NewGoLevelDB(name, "", nil) require.NotNil(t, err) - wr1.Close() // Close the db to release the lock + require.NoError(t, wr1.Close()) // Close the db to release the lock // Test we can open the db twice for reading only ro1, err := NewGoLevelDBWithOpts(name, "", &opt.Options{ReadOnly: true}) @@ -35,7 +35,7 @@ func BenchmarkGoLevelDBRandomReadsWrites(b *testing.B) { b.Fatal(err) } defer func() { - db.Close() + require.NoError(b, db.Close()) cleanupDBDir("", name) }() diff --git a/memdb.go b/memdb.go index 6b68263..90da8f4 100644 --- a/memdb.go +++ b/memdb.go @@ -90,7 +90,7 @@ func (db *MemDB) Has(key []byte) (bool, error) { } // Set implements DB. -func (db *MemDB) Set(key []byte, value []byte) error { +func (db *MemDB) Set(key, value []byte) error { if len(key) == 0 { return errKeyEmpty } @@ -105,12 +105,12 @@ func (db *MemDB) Set(key []byte, value []byte) error { } // set sets a value without locking the mutex. -func (db *MemDB) set(key []byte, value []byte) { +func (db *MemDB) set(key, value []byte) { db.btree.ReplaceOrInsert(newPair(key, value)) } // SetSync implements DB. -func (db *MemDB) SetSync(key []byte, value []byte) error { +func (db *MemDB) SetSync(key, value []byte) error { return db.Set(key, value) } @@ -139,7 +139,7 @@ func (db *MemDB) DeleteSync(key []byte) error { // Close implements DB. func (db *MemDB) Close() error { // Close is a noop since for an in-memory database, we don't have a destination to flush - // contents to nor do we want any data loss on invoking Close(). + // contents to, nor do we want any data loss on invoking Close(). // See the discussion in https://github.com/tendermint/tendermint/libs/pull/56 return nil } diff --git a/memdb_iterator.go b/memdb_iterator.go index 1211550..5e0843f 100644 --- a/memdb_iterator.go +++ b/memdb_iterator.go @@ -27,11 +27,11 @@ type memDBIterator struct { var _ Iterator = (*memDBIterator)(nil) // newMemDBIterator creates a new memDBIterator. -func newMemDBIterator(db *MemDB, start []byte, end []byte, reverse bool) *memDBIterator { +func newMemDBIterator(db *MemDB, start, end []byte, reverse bool) *memDBIterator { return newMemDBIteratorMtxChoice(db, start, end, reverse, true) } -func newMemDBIteratorMtxChoice(db *MemDB, start []byte, end []byte, reverse bool, useMtx bool) *memDBIterator { +func newMemDBIteratorMtxChoice(db *MemDB, start, end []byte, reverse, useMtx bool) *memDBIterator { ctx, cancel := context.WithCancel(context.Background()) ch := make(chan *item, chBufferSize) iter := &memDBIterator{ @@ -105,7 +105,7 @@ func newMemDBIteratorMtxChoice(db *MemDB, start []byte, end []byte, reverse bool // Close implements Iterator. func (i *memDBIterator) Close() error { i.cancel() - for range i.ch { //nolint:revive + for range i.ch { } // drain channel i.item = nil return nil diff --git a/pebble.go b/pebble.go index b6cfdf7..f051c9d 100644 --- a/pebble.go +++ b/pebble.go @@ -2,6 +2,7 @@ package db import ( "bytes" + "errors" "fmt" "path/filepath" @@ -76,7 +77,7 @@ type PebbleDB struct { var _ DB = (*PebbleDB)(nil) -func NewPebbleDB(name string, dir string, opts Options) (DB, error) { +func NewPebbleDB(name, dir string, opts Options) (DB, error) { do := &pebble.Options{ Logger: &fatalLogger{}, // pebble info logs are messing up the logs // (not a cosmossdk.io/log logger) @@ -110,7 +111,7 @@ func (db *PebbleDB) Get(key []byte) ([]byte, error) { res, closer, err := db.db.Get(key) if err != nil { - if err == pebble.ErrNotFound { + if errors.Is(err, pebble.ErrNotFound) { return nil, nil } return nil, err @@ -126,15 +127,15 @@ func (db *PebbleDB) Has(key []byte) (bool, error) { if len(key) == 0 { return false, errKeyEmpty } - bytes, err := db.Get(key) + bz, err := db.Get(key) if err != nil { return false, err } - return bytes != nil, nil + return bz != nil, nil } // Set implements DB. -func (db *PebbleDB) Set(key []byte, value []byte) error { +func (db *PebbleDB) Set(key, value []byte) error { // fmt.Println("PebbleDB.Set") if len(key) == 0 { return errKeyEmpty @@ -156,7 +157,7 @@ func (db *PebbleDB) Set(key []byte, value []byte) error { } // SetSync implements DB. -func (db *PebbleDB) SetSync(key []byte, value []byte) error { +func (db *PebbleDB) SetSync(key, value []byte) error { // fmt.Println("PebbleDB.SetSync") if len(key) == 0 { return errKeyEmpty @@ -186,7 +187,7 @@ func (db *PebbleDB) Delete(key []byte) error { } // DeleteSync implements DB. -func (db PebbleDB) DeleteSync(key []byte) error { +func (db *PebbleDB) DeleteSync(key []byte) error { // fmt.Println("PebbleDB.DeleteSync") if len(key) == 0 { return errKeyEmpty @@ -199,7 +200,7 @@ func (db *PebbleDB) DB() *pebble.DB { } // Close implements DB. -func (db PebbleDB) Close() error { +func (db *PebbleDB) Close() error { // fmt.Println("PebbleDB.Close") db.db.Close() return nil @@ -296,7 +297,6 @@ func newPebbleDBBatch(db *PebbleDB) *pebbleDBBatch { // Set implements Batch. func (b *pebbleDBBatch) Set(key, value []byte) error { - // fmt.Println("pebbleDBBatch.Set") if len(key) == 0 { return errKeyEmpty } @@ -311,7 +311,6 @@ func (b *pebbleDBBatch) Set(key, value []byte) error { // Delete implements Batch. func (b *pebbleDBBatch) Delete(key []byte) error { - // fmt.Println("pebbleDBBatch.Delete") if len(key) == 0 { return errKeyEmpty } @@ -323,7 +322,6 @@ func (b *pebbleDBBatch) Delete(key []byte) error { // Write implements Batch. func (b *pebbleDBBatch) Write() error { - // fmt.Println("pebbleDBBatch.Write") if b.batch == nil { return errBatchClosed } @@ -413,7 +411,6 @@ func (itr *pebbleDBIterator) Domain() ([]byte, []byte) { // Valid implements Iterator. func (itr *pebbleDBIterator) Valid() bool { - // fmt.Println("pebbleDBIterator.Valid") // Once invalid, forever invalid. if itr.isInvalid { return false @@ -457,21 +454,18 @@ func (itr *pebbleDBIterator) Valid() bool { // Key implements Iterator. func (itr *pebbleDBIterator) Key() []byte { - // fmt.Println("pebbleDBIterator.Key") itr.assertIsValid() return cp(itr.source.Key()) } // Value implements Iterator. func (itr *pebbleDBIterator) Value() []byte { - // fmt.Println("pebbleDBIterator.Value") itr.assertIsValid() return cp(itr.source.Value()) } // Next implements Iterator. -func (itr pebbleDBIterator) Next() { - // fmt.Println("pebbleDBIterator.Next") +func (itr *pebbleDBIterator) Next() { itr.assertIsValid() if itr.isReverse { itr.source.Prev() diff --git a/pebble_test.go b/pebble_test.go index 3c41c2e..7e03d70 100644 --- a/pebble_test.go +++ b/pebble_test.go @@ -5,7 +5,6 @@ import ( "os" "testing" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -17,7 +16,7 @@ func TestPebbleDBBackend(t *testing.T) { defer cleanupDBDir(dir, name) _, ok := db.(*PebbleDB) - assert.True(t, ok) + require.True(t, ok) } // func TestPebbleDBStats(t *testing.T) { @@ -27,7 +26,7 @@ func TestPebbleDBBackend(t *testing.T) { // require.NoError(t, err) // defer cleanupDBDir(dir, name) -// assert.NotEmpty(t, db.Stats()) +// require.NotEmpty(t, db.Stats()) // } func BenchmarkPebbleDBRandomReadsWrites(b *testing.B) { @@ -38,7 +37,7 @@ func BenchmarkPebbleDBRandomReadsWrites(b *testing.B) { b.Fatal(err) } defer func() { - db.Close() + require.NoError(b, db.Close()) cleanupDBDir("", name) }() diff --git a/prefixdb.go b/prefixdb.go index 9310e75..fffd26c 100644 --- a/prefixdb.go +++ b/prefixdb.go @@ -51,7 +51,7 @@ func (pdb *PrefixDB) Has(key []byte) (bool, error) { } // Set implements DB. -func (pdb *PrefixDB) Set(key []byte, value []byte) error { +func (pdb *PrefixDB) Set(key, value []byte) error { if len(key) == 0 { return errKeyEmpty } @@ -67,7 +67,7 @@ func (pdb *PrefixDB) Set(key []byte, value []byte) error { } // SetSync implements DB. -func (pdb *PrefixDB) SetSync(key []byte, value []byte) error { +func (pdb *PrefixDB) SetSync(key, value []byte) error { if len(key) == 0 { return errKeyEmpty } @@ -102,14 +102,14 @@ func (pdb *PrefixDB) Iterator(start, end []byte) (Iterator, error) { return nil, errKeyEmpty } - var pstart, pend []byte - pstart = append(cp(pdb.prefix), start...) + var pStart, pEnd []byte + pStart = append(cp(pdb.prefix), start...) if end == nil { - pend = cpIncr(pdb.prefix) + pEnd = cpIncr(pdb.prefix) } else { - pend = append(cp(pdb.prefix), end...) + pEnd = append(cp(pdb.prefix), end...) } - itr, err := pdb.db.Iterator(pstart, pend) + itr, err := pdb.db.Iterator(pStart, pEnd) if err != nil { return nil, err } @@ -123,14 +123,14 @@ func (pdb *PrefixDB) ReverseIterator(start, end []byte) (Iterator, error) { return nil, errKeyEmpty } - var pstart, pend []byte - pstart = append(cp(pdb.prefix), start...) + var pStart, pEnd []byte + pStart = append(cp(pdb.prefix), start...) if end == nil { - pend = cpIncr(pdb.prefix) + pEnd = cpIncr(pdb.prefix) } else { - pend = append(cp(pdb.prefix), end...) + pEnd = append(cp(pdb.prefix), end...) } - ritr, err := pdb.db.ReverseIterator(pstart, pend) + ritr, err := pdb.db.ReverseIterator(pStart, pEnd) if err != nil { return nil, err } diff --git a/prefixdb_iterator.go b/prefixdb_iterator.go index 8f2f932..68a135b 100644 --- a/prefixdb_iterator.go +++ b/prefixdb_iterator.go @@ -36,7 +36,7 @@ type prefixDBIterator struct { var _ Iterator = (*prefixDBIterator)(nil) func newPrefixIterator(prefix, start, end []byte, source Iterator) (*prefixDBIterator, error) { - pitrInvalid := &prefixDBIterator{ + pItrInvalid := &prefixDBIterator{ prefix: prefix, start: start, end: end, @@ -51,7 +51,7 @@ func newPrefixIterator(prefix, start, end []byte, source Iterator) (*prefixDBIte } if !source.Valid() || !bytes.HasPrefix(source.Key(), prefix) { - return pitrInvalid, nil + return pItrInvalid, nil } return &prefixDBIterator{ @@ -64,7 +64,7 @@ func newPrefixIterator(prefix, start, end []byte, source Iterator) (*prefixDBIte } // Domain implements Iterator. -func (itr *prefixDBIterator) Domain() (start []byte, end []byte) { +func (itr *prefixDBIterator) Domain() (start, end []byte) { return itr.start, itr.end } @@ -98,7 +98,7 @@ func (itr *prefixDBIterator) Next() { } } -// Next implements Iterator. +// Key implements Iterator. func (itr *prefixDBIterator) Key() []byte { itr.assertIsValid() key := itr.source.Key() diff --git a/prefixdb_test.go b/prefixdb_test.go index ce916ea..898ae5f 100644 --- a/prefixdb_test.go +++ b/prefixdb_test.go @@ -12,17 +12,19 @@ import ( "github.com/stretchr/testify/require" ) -func mockDBWithStuff(t *testing.T) DB { +func mockDBWithData(t *testing.T) DB { + t.Helper() + db := NewMemDB() // Under "key" prefix - require.NoError(t, db.Set(bz("key"), bz("value"))) - require.NoError(t, db.Set(bz("key1"), bz("value1"))) - require.NoError(t, db.Set(bz("key2"), bz("value2"))) - require.NoError(t, db.Set(bz("key3"), bz("value3"))) - require.NoError(t, db.Set(bz("something"), bz("else"))) - require.NoError(t, db.Set(bz("k"), bz("val"))) - require.NoError(t, db.Set(bz("ke"), bz("valu"))) - require.NoError(t, db.Set(bz("kee"), bz("valuu"))) + require.NoError(t, db.Set(stringToBytes("key"), stringToBytes("value"))) + require.NoError(t, db.Set(stringToBytes("key1"), stringToBytes("value1"))) + require.NoError(t, db.Set(stringToBytes("key2"), stringToBytes("value2"))) + require.NoError(t, db.Set(stringToBytes("key3"), stringToBytes("value3"))) + require.NoError(t, db.Set(stringToBytes("something"), stringToBytes("else"))) + require.NoError(t, db.Set(stringToBytes("k"), stringToBytes("val"))) + require.NoError(t, db.Set(stringToBytes("ke"), stringToBytes("valu"))) + require.NoError(t, db.Set(stringToBytes("kee"), stringToBytes("valuu"))) return db } @@ -133,97 +135,97 @@ func Run(t *testing.T, db DB) { } func TestPrefixDBSimple(t *testing.T) { - db := mockDBWithStuff(t) - pdb := NewPrefixDB(db, bz("key")) - - checkValue(t, pdb, bz("key"), nil) - checkValue(t, pdb, bz("key1"), nil) - checkValue(t, pdb, bz("1"), bz("value1")) - checkValue(t, pdb, bz("key2"), nil) - checkValue(t, pdb, bz("2"), bz("value2")) - checkValue(t, pdb, bz("key3"), nil) - checkValue(t, pdb, bz("3"), bz("value3")) - checkValue(t, pdb, bz("something"), nil) - checkValue(t, pdb, bz("k"), nil) - checkValue(t, pdb, bz("ke"), nil) - checkValue(t, pdb, bz("kee"), nil) + db := mockDBWithData(t) + pdb := NewPrefixDB(db, stringToBytes("key")) + + checkValue(t, pdb, stringToBytes("key"), nil) + checkValue(t, pdb, stringToBytes("key1"), nil) + checkValue(t, pdb, stringToBytes("1"), stringToBytes("value1")) + checkValue(t, pdb, stringToBytes("key2"), nil) + checkValue(t, pdb, stringToBytes("2"), stringToBytes("value2")) + checkValue(t, pdb, stringToBytes("key3"), nil) + checkValue(t, pdb, stringToBytes("3"), stringToBytes("value3")) + checkValue(t, pdb, stringToBytes("something"), nil) + checkValue(t, pdb, stringToBytes("k"), nil) + checkValue(t, pdb, stringToBytes("ke"), nil) + checkValue(t, pdb, stringToBytes("kee"), nil) } func TestPrefixDBIterator1(t *testing.T) { - db := mockDBWithStuff(t) - pdb := NewPrefixDB(db, bz("key")) + db := mockDBWithData(t) + pdb := NewPrefixDB(db, stringToBytes("key")) itr, err := pdb.Iterator(nil, nil) require.NoError(t, err) checkDomain(t, itr, nil, nil) - checkItem(t, itr, bz("1"), bz("value1")) + checkItem(t, itr, stringToBytes("1"), stringToBytes("value1")) checkNext(t, itr, true) - checkItem(t, itr, bz("2"), bz("value2")) + checkItem(t, itr, stringToBytes("2"), stringToBytes("value2")) checkNext(t, itr, true) - checkItem(t, itr, bz("3"), bz("value3")) + checkItem(t, itr, stringToBytes("3"), stringToBytes("value3")) checkNext(t, itr, false) checkInvalid(t, itr) - itr.Close() + require.NoError(t, itr.Close()) } func TestPrefixDBReverseIterator1(t *testing.T) { - db := mockDBWithStuff(t) - pdb := NewPrefixDB(db, bz("key")) + db := mockDBWithData(t) + pdb := NewPrefixDB(db, stringToBytes("key")) itr, err := pdb.ReverseIterator(nil, nil) require.NoError(t, err) checkDomain(t, itr, nil, nil) - checkItem(t, itr, bz("3"), bz("value3")) + checkItem(t, itr, stringToBytes("3"), stringToBytes("value3")) checkNext(t, itr, true) - checkItem(t, itr, bz("2"), bz("value2")) + checkItem(t, itr, stringToBytes("2"), stringToBytes("value2")) checkNext(t, itr, true) - checkItem(t, itr, bz("1"), bz("value1")) + checkItem(t, itr, stringToBytes("1"), stringToBytes("value1")) checkNext(t, itr, false) checkInvalid(t, itr) - itr.Close() + require.NoError(t, itr.Close()) } func TestPrefixDBReverseIterator5(t *testing.T) { - db := mockDBWithStuff(t) - pdb := NewPrefixDB(db, bz("key")) + db := mockDBWithData(t) + pdb := NewPrefixDB(db, stringToBytes("key")) - itr, err := pdb.ReverseIterator(bz("1"), nil) + itr, err := pdb.ReverseIterator(stringToBytes("1"), nil) require.NoError(t, err) - checkDomain(t, itr, bz("1"), nil) - checkItem(t, itr, bz("3"), bz("value3")) + checkDomain(t, itr, stringToBytes("1"), nil) + checkItem(t, itr, stringToBytes("3"), stringToBytes("value3")) checkNext(t, itr, true) - checkItem(t, itr, bz("2"), bz("value2")) + checkItem(t, itr, stringToBytes("2"), stringToBytes("value2")) checkNext(t, itr, true) - checkItem(t, itr, bz("1"), bz("value1")) + checkItem(t, itr, stringToBytes("1"), stringToBytes("value1")) checkNext(t, itr, false) checkInvalid(t, itr) - itr.Close() + require.NoError(t, itr.Close()) } func TestPrefixDBReverseIterator6(t *testing.T) { - db := mockDBWithStuff(t) - pdb := NewPrefixDB(db, bz("key")) + db := mockDBWithData(t) + pdb := NewPrefixDB(db, stringToBytes("key")) - itr, err := pdb.ReverseIterator(bz("2"), nil) + itr, err := pdb.ReverseIterator(stringToBytes("2"), nil) require.NoError(t, err) - checkDomain(t, itr, bz("2"), nil) - checkItem(t, itr, bz("3"), bz("value3")) + checkDomain(t, itr, stringToBytes("2"), nil) + checkItem(t, itr, stringToBytes("3"), stringToBytes("value3")) checkNext(t, itr, true) - checkItem(t, itr, bz("2"), bz("value2")) + checkItem(t, itr, stringToBytes("2"), stringToBytes("value2")) checkNext(t, itr, false) checkInvalid(t, itr) - itr.Close() + require.NoError(t, itr.Close()) } func TestPrefixDBReverseIterator7(t *testing.T) { - db := mockDBWithStuff(t) - pdb := NewPrefixDB(db, bz("key")) + db := mockDBWithData(t) + pdb := NewPrefixDB(db, stringToBytes("key")) - itr, err := pdb.ReverseIterator(nil, bz("2")) + itr, err := pdb.ReverseIterator(nil, stringToBytes("2")) require.NoError(t, err) - checkDomain(t, itr, nil, bz("2")) - checkItem(t, itr, bz("1"), bz("value1")) + checkDomain(t, itr, nil, stringToBytes("2")) + checkItem(t, itr, stringToBytes("1"), stringToBytes("value1")) checkNext(t, itr, false) checkInvalid(t, itr) - itr.Close() + require.NoError(t, itr.Close()) } diff --git a/rocksdb.go b/rocksdb.go index a21ae1c..e665557 100644 --- a/rocksdb.go +++ b/rocksdb.go @@ -13,7 +13,7 @@ import ( ) func init() { - dbCreator := func(name string, dir string, opts Options) (DB, error) { + dbCreator := func(name, dir string, opts Options) (DB, error) { return NewRocksDB(name, dir, opts) } registerDBCreator(RocksDBBackend, dbCreator, false) @@ -30,7 +30,7 @@ type RocksDB struct { var _ DB = (*RocksDB)(nil) // defaultRocksdbOptions, good enough for most cases, including heavy workloads. -// 1GB table cache, 512MB write buffer(may use 50% more on heavy workloads). +// 1GB table cache, 512MB write buffer (may use 50% more on heavy workloads). // compression: snappy as default, need to -lsnappy to enable. func defaultRocksdbOptions() *grocksdb.Options { bbto := grocksdb.NewDefaultBlockBasedTableOptions() @@ -48,7 +48,7 @@ func defaultRocksdbOptions() *grocksdb.Options { return rocksdbOpts } -func NewRocksDB(name string, dir string, opts Options) (*RocksDB, error) { +func NewRocksDB(name, dir string, opts Options) (*RocksDB, error) { defaultOpts := defaultRocksdbOptions() if opts != nil { @@ -61,7 +61,7 @@ func NewRocksDB(name string, dir string, opts Options) (*RocksDB, error) { return NewRocksDBWithOptions(name, dir, defaultOpts) } -func NewRocksDBWithOptions(name string, dir string, opts *grocksdb.Options) (*RocksDB, error) { +func NewRocksDBWithOptions(name, dir string, opts *grocksdb.Options) (*RocksDB, error) { dbPath := filepath.Join(dir, name+DBFileSuffix) db, err := grocksdb.OpenDb(opts, dbPath) if err != nil { @@ -84,11 +84,13 @@ func NewRocksDBWithRawDB( return NewRocksDBWithRaw(db, ro, wo, woSync) } -// NewRocksDBWithRaw is useful if user want to create the db in read-only or seconday-standby mode, +// NewRocksDBWithRaw is useful if user wants to create the db in read-only or secondary-standby mode // or customize the default read/write options. func NewRocksDBWithRaw( - db *grocksdb.DB, ro *grocksdb.ReadOptions, - wo *grocksdb.WriteOptions, woSync *grocksdb.WriteOptions, + db *grocksdb.DB, + ro *grocksdb.ReadOptions, + wo *grocksdb.WriteOptions, + woSync *grocksdb.WriteOptions, ) *RocksDB { return &RocksDB{ db: db, @@ -120,7 +122,7 @@ func (db *RocksDB) Has(key []byte) (bool, error) { } // Set implements DB. -func (db *RocksDB) Set(key []byte, value []byte) error { +func (db *RocksDB) Set(key, value []byte) error { if len(key) == 0 { return errKeyEmpty } @@ -131,7 +133,7 @@ func (db *RocksDB) Set(key []byte, value []byte) error { } // SetSync implements DB. -func (db *RocksDB) SetSync(key []byte, value []byte) error { +func (db *RocksDB) SetSync(key, value []byte) error { if len(key) == 0 { return errKeyEmpty } diff --git a/rocksdb_iterator.go b/rocksdb_iterator.go index 53fa9a9..94aeecc 100644 --- a/rocksdb_iterator.go +++ b/rocksdb_iterator.go @@ -25,8 +25,8 @@ func newRocksDBIterator(source *grocksdb.Iterator, start, end []byte, isReverse } else { source.Seek(end) if source.Valid() { - eoakey := moveSliceToBytes(source.Key()) // end or after key - if bytes.Compare(end, eoakey) <= 0 { + eoaKey := moveSliceToBytes(source.Key()) // end or after key + if bytes.Compare(end, eoaKey) <= 0 { source.Prev() } } else { diff --git a/rocksdb_test.go b/rocksdb_test.go index b176fe8..a58877a 100644 --- a/rocksdb_test.go +++ b/rocksdb_test.go @@ -10,7 +10,6 @@ import ( "testing" "github.com/spf13/cast" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -22,7 +21,7 @@ func TestRocksDBBackend(t *testing.T) { defer cleanupDBDir(dir, name) _, ok := db.(*RocksDB) - assert.True(t, ok) + require.True(t, ok) } func TestWithRocksDB(t *testing.T) { @@ -42,7 +41,7 @@ func TestRocksDBStats(t *testing.T) { require.NoError(t, err) defer cleanupDBDir(dir, name) - assert.NotEmpty(t, db.Stats()) + require.NotEmpty(t, db.Stats()) } func TestRocksDBWithOptions(t *testing.T) { diff --git a/test_helpers.go b/test_helpers.go index eadc73a..1666f82 100644 --- a/test_helpers.go +++ b/test_helpers.go @@ -7,16 +7,16 @@ const ( ) // For testing convenience. -func bz(s string) []byte { +func stringToBytes(s string) []byte { return []byte(s) } -// Str constructs a random alphanumeric string of given length. +// Str constructs a random alphanumeric string of a given length. func randStr(length int) string { chars := []byte{} MAIN_LOOP: for { - val := rand.Int63() //nolint:gosec + val := rand.Int63() for i := 0; i < 10; i++ { v := int(val & 0x3f) // rightmost 6 bits if v >= 62 { // only 62 characters in strChars diff --git a/types.go b/types.go index 8caa0cc..f3cb26d 100644 --- a/types.go +++ b/types.go @@ -76,7 +76,7 @@ type DB interface { Stats() map[string]string } -// Batch represents a group of writes. They may or may not be written atomically depending on the +// BatchI represents a group of writes. They may or may not be written atomically depending on the // backend. Callers must call Close on the batch when done. // // As with DB, given keys and values should be considered read-only, and must not be modified after @@ -109,7 +109,7 @@ type BatchI interface { type Batch = BatchI -// Iterator represents an iterator over a domain of keys. Callers must call Close when done. +// IteratorI represents an iterator over a domain of keys. Callers must call Close when done. // No writes can happen to a domain while there exists an iterator over it, some backends may take // out database locks to ensure this will not happen. // @@ -135,7 +135,7 @@ type Batch = BatchI type IteratorI interface { // Domain returns the start (inclusive) and end (exclusive) limits of the iterator. // CONTRACT: start, end readonly []byte - Domain() (start []byte, end []byte) + Domain() (start, end []byte) // Valid returns whether the current iterator is valid. Once invalid, the Iterator remains // invalid forever. diff --git a/util.go b/util.go index da2b005..677c13f 100644 --- a/util.go +++ b/util.go @@ -34,7 +34,7 @@ func cpIncr(bz []byte) (ret []byte) { return nil } -// See DB interface documentation for more information. +// IsKeyInDomain is a helper function for key inspection. See DB interface documentation for more information. func IsKeyInDomain(key, start, end []byte) bool { if bytes.Compare(key, start) < 0 { return false diff --git a/util_test.go b/util_test.go index 68e6b8e..24cb42f 100644 --- a/util_test.go +++ b/util_test.go @@ -30,7 +30,7 @@ func TestPrefixIteratorNoMatch1(t *testing.T) { defer os.RemoveAll(dir) itr, err := IteratePrefix(db, []byte("2")) require.NoError(t, err) - err = db.SetSync(bz("1"), bz("value_1")) + err = db.SetSync(stringToBytes("1"), stringToBytes("value_1")) require.NoError(t, err) checkInvalid(t, itr) @@ -44,7 +44,7 @@ func TestPrefixIteratorNoMatch2(t *testing.T) { t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { db, dir := newTempDB(t, backend) defer os.RemoveAll(dir) - err := db.SetSync(bz("3"), bz("value_3")) + err := db.SetSync(stringToBytes("3"), stringToBytes("value_3")) require.NoError(t, err) itr, err := IteratePrefix(db, []byte("4")) require.NoError(t, err) @@ -60,13 +60,13 @@ func TestPrefixIteratorMatch1(t *testing.T) { t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) { db, dir := newTempDB(t, backend) defer os.RemoveAll(dir) - err := db.SetSync(bz("2"), bz("value_2")) + err := db.SetSync(stringToBytes("2"), stringToBytes("value_2")) require.NoError(t, err) - itr, err := IteratePrefix(db, bz("2")) + itr, err := IteratePrefix(db, stringToBytes("2")) require.NoError(t, err) checkValid(t, itr, true) - checkItem(t, itr, bz("2"), bz("value_2")) + checkItem(t, itr, stringToBytes("2"), stringToBytes("value_2")) checkNext(t, itr, false) // Once invalid... @@ -83,27 +83,27 @@ func TestPrefixIteratorMatches1N(t *testing.T) { defer os.RemoveAll(dir) // prefixed - err := db.SetSync(bz("a/1"), bz("value_1")) + err := db.SetSync(stringToBytes("a/1"), stringToBytes("value_1")) require.NoError(t, err) - err = db.SetSync(bz("a/3"), bz("value_3")) + err = db.SetSync(stringToBytes("a/3"), stringToBytes("value_3")) require.NoError(t, err) // not - err = db.SetSync(bz("b/3"), bz("value_3")) + err = db.SetSync(stringToBytes("b/3"), stringToBytes("value_3")) require.NoError(t, err) - err = db.SetSync(bz("a-3"), bz("value_3")) + err = db.SetSync(stringToBytes("a-3"), stringToBytes("value_3")) require.NoError(t, err) - err = db.SetSync(bz("a.3"), bz("value_3")) + err = db.SetSync(stringToBytes("a.3"), stringToBytes("value_3")) require.NoError(t, err) - err = db.SetSync(bz("abcdefg"), bz("value_3")) + err = db.SetSync(stringToBytes("abcdefg"), stringToBytes("value_3")) require.NoError(t, err) - itr, err := IteratePrefix(db, bz("a/")) + itr, err := IteratePrefix(db, stringToBytes("a/")) require.NoError(t, err) checkValid(t, itr, true) - checkItem(t, itr, bz("a/1"), bz("value_1")) + checkItem(t, itr, stringToBytes("a/1"), stringToBytes("value_1")) checkNext(t, itr, true) - checkItem(t, itr, bz("a/3"), bz("value_3")) + checkItem(t, itr, stringToBytes("a/3"), stringToBytes("value_3")) // Bad! checkNext(t, itr, false)