From 71bc5d82caa5e88f683df6853a46a5c138475694 Mon Sep 17 00:00:00 2001 From: Marko <marbar3778@yahoo.com> Date: Thu, 11 Feb 2021 16:19:38 +0000 Subject: [PATCH 01/34] metadb: split backends into packages, add metadb (#151) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit authored-by: Daniel Martà <mvdan@mvdan.cc> --- .github/workflows/ci.yml | 2 +- .github/workflows/lint.yml | 1 + badger_db.go => badgerdb/db.go | 49 ++--- boltdb_batch.go => boltdb/batch.go | 34 ++- boltdb.go => boltdb/db.go | 53 ++--- boltdb/db_test.go | 34 +++ boltdb_iterator.go => boltdb/iterator.go | 7 +- boltdb_test.go | 35 --- cleveldb_batch.go => cleveldb/batch.go | 23 +- cleveldb.go => cleveldb/db.go | 43 ++-- cleveldb/db_test.go | 78 +++++++ cleveldb_iterator.go => cleveldb/iterator.go | 11 +- cleveldb_test.go | 103 --------- goleveldb_batch.go => goleveldb/batch.go | 17 +- goleveldb.go => goleveldb/db.go | 42 ++-- goleveldb/db_test.go | 44 ++++ .../iterator.go | 11 +- goleveldb_test.go | 43 ---- common_test.go => internal/dbtest/dbtest.go | 126 ++++++----- makefile | 15 +- memdb_batch.go => memdb/batch.go | 22 +- memdb.go => memdb/db.go | 35 ++- memdb/db_test.go | 28 +++ memdb_iterator.go => memdb/iterator.go | 5 +- memdb_test.go | 26 --- backend_test.go => metadb/backend_test.go | 203 +++++++++++------- db.go => metadb/db.go | 14 +- metadb/db_badgerdb.go | 14 ++ metadb/db_boltdb.go | 14 ++ metadb/db_cleveldb.go | 14 ++ metadb/db_goleveldb.go | 14 ++ metadb/db_memdb.go | 14 ++ metadb/db_rocksdb.go | 14 ++ db_test.go => metadb/db_test.go | 45 ++-- util_test.go => metadb/util_test.go | 70 +++--- prefixdb.go | 20 +- prefixdb_batch.go | 6 +- prefixdb_test.go | 133 ++++++------ remotedb/batch.go | 15 +- remotedb/{remotedb.go => db.go} | 18 +- remotedb/{remotedb_test.go => db_test.go} | 2 +- remotedb/doc.go | 4 +- remotedb/grpcdb/server.go | 3 +- remotedb/iterator.go | 12 +- rocksdb_batch.go => rocksdb/batch.go | 25 +-- rocksdb.go => rocksdb/db.go | 44 ++-- rocksdb/db_test.go | 3 + rocksdb_iterator.go => rocksdb/iterator.go | 7 +- rocksdb_test.go | 35 --- test_helpers.go | 36 ---- types.go | 12 +- 51 files changed, 888 insertions(+), 790 deletions(-) rename badger_db.go => badgerdb/db.go (85%) rename boltdb_batch.go => boltdb/batch.go (77%) rename boltdb.go => boltdb/db.go (78%) create mode 100644 boltdb/db_test.go rename boltdb_iterator.go => boltdb/iterator.go (96%) delete mode 100644 boltdb_test.go rename cleveldb_batch.go => cleveldb/batch.go (81%) rename cleveldb.go => cleveldb/db.go (82%) create mode 100644 cleveldb/db_test.go rename cleveldb_iterator.go => cleveldb/iterator.go (94%) delete mode 100644 cleveldb_test.go rename goleveldb_batch.go => goleveldb/batch.go (82%) rename goleveldb.go => goleveldb/db.go (80%) create mode 100644 goleveldb/db_test.go rename goleveldb_iterator.go => goleveldb/iterator.go (93%) delete mode 100644 goleveldb_test.go rename common_test.go => internal/dbtest/dbtest.go (56%) rename memdb_batch.go => memdb/batch.go (84%) rename memdb.go => memdb/db.go (87%) create mode 100644 memdb/db_test.go rename memdb_iterator.go => memdb/iterator.go (97%) delete mode 100644 memdb_test.go rename backend_test.go => metadb/backend_test.go (63%) rename db.go => metadb/db.go (80%) create mode 100644 metadb/db_badgerdb.go create mode 100644 metadb/db_boltdb.go create mode 100644 metadb/db_cleveldb.go create mode 100644 metadb/db_goleveldb.go create mode 100644 metadb/db_memdb.go create mode 100644 metadb/db_rocksdb.go rename db_test.go => metadb/db_test.go (74%) rename util_test.go => metadb/util_test.go (56%) rename remotedb/{remotedb.go => db.go} (83%) rename remotedb/{remotedb_test.go => db_test.go} (98%) rename rocksdb_batch.go => rocksdb/batch.go (79%) rename rocksdb.go => rocksdb/db.go (81%) create mode 100644 rocksdb/db_test.go rename rocksdb_iterator.go => rocksdb/iterator.go (96%) delete mode 100644 rocksdb_test.go delete mode 100644 test_helpers.go diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 69a312899..809dabbf8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/checkout@v2 - name: test & coverage report creation run: | - go test ./... -mod=readonly -timeout 8m -race -coverprofile=coverage.txt -covermode=atomic -tags cleveldb,boltdb,rocksdb,badgerdb -v + go test ./... -mod=readonly -timeout 8m -race -coverprofile=coverage.txt -covermode=atomic -tags=memdb,goleveldb,cleveldb,boltdb,rocksdb,badgerdb -v - uses: codecov/codecov-action@v1 with: file: ./coverage.txt diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 0a90a2653..29c21b571 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -8,6 +8,7 @@ on: jobs: golangci: runs-on: ubuntu-latest + container: tendermintdev/docker-tm-db-testing steps: - uses: actions/checkout@v2 - uses: golangci/golangci-lint-action@v2.3.0 diff --git a/badger_db.go b/badgerdb/db.go similarity index 85% rename from badger_db.go rename to badgerdb/db.go index 22b852c39..33e5bebee 100644 --- a/badger_db.go +++ b/badgerdb/db.go @@ -1,6 +1,4 @@ -// +build badgerdb - -package db +package badgerdb import ( "bytes" @@ -9,17 +7,12 @@ import ( "path/filepath" "github.com/dgraph-io/badger/v2" + tmdb "github.com/tendermint/tm-db" ) -func init() { registerDBCreator(BadgerDBBackend, badgerDBCreator, true) } - -func badgerDBCreator(dbName, dir string) (DB, error) { - return NewBadgerDB(dbName, dir) -} - -// NewBadgerDB creates a Badger key-value store backed to the +// NewDB creates a Badger key-value store backed to the // directory dir supplied. If dir does not exist, it will be created. -func NewBadgerDB(dbName, dir string) (*BadgerDB, error) { +func NewDB(dbName, dir string) (*BadgerDB, error) { // Since Badger doesn't support database names, we join both to obtain // the final directory to use for the database. path := filepath.Join(dir, dbName) @@ -30,13 +23,13 @@ func NewBadgerDB(dbName, dir string) (*BadgerDB, error) { opts := badger.DefaultOptions(path) opts.SyncWrites = false // note that we have Sync methods opts.Logger = nil // badger is too chatty by default - return NewBadgerDBWithOptions(opts) + return NewDBWithOptions(opts) } -// NewBadgerDBWithOptions creates a BadgerDB key value store +// NewDBWithOptions creates a BadgerDB key value store // gives the flexibility of initializing a database with the // respective options. -func NewBadgerDBWithOptions(opts badger.Options) (*BadgerDB, error) { +func NewDBWithOptions(opts badger.Options) (*BadgerDB, error) { db, err := badger.Open(opts) if err != nil { return nil, err @@ -48,11 +41,11 @@ type BadgerDB struct { db *badger.DB } -var _ DB = (*BadgerDB)(nil) +var _ tmdb.DB = (*BadgerDB)(nil) func (b *BadgerDB) Get(key []byte) ([]byte, error) { if len(key) == 0 { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } var val []byte err := b.db.View(func(txn *badger.Txn) error { @@ -73,7 +66,7 @@ func (b *BadgerDB) Get(key []byte) ([]byte, error) { func (b *BadgerDB) Has(key []byte) (bool, error) { if len(key) == 0 { - return false, errKeyEmpty + return false, tmdb.ErrKeyEmpty } var found bool err := b.db.View(func(txn *badger.Txn) error { @@ -89,10 +82,10 @@ func (b *BadgerDB) Has(key []byte) (bool, error) { func (b *BadgerDB) Set(key, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if value == nil { - return errValueNil + return tmdb.ErrValueNil } return b.db.Update(func(txn *badger.Txn) error { return txn.Set(key, value) @@ -112,7 +105,7 @@ func (b *BadgerDB) SetSync(key, value []byte) error { func (b *BadgerDB) Delete(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } return b.db.Update(func(txn *badger.Txn) error { return txn.Delete(key) @@ -133,7 +126,7 @@ func (b *BadgerDB) Print() error { func (b *BadgerDB) iteratorOpts(start, end []byte, opts badger.IteratorOptions) (*badgerDBIterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } txn := b.db.NewTransaction(false) iter := txn.NewIterator(opts) @@ -154,12 +147,12 @@ func (b *BadgerDB) iteratorOpts(start, end []byte, opts badger.IteratorOptions) }, nil } -func (b *BadgerDB) Iterator(start, end []byte) (Iterator, error) { +func (b *BadgerDB) Iterator(start, end []byte) (tmdb.Iterator, error) { opts := badger.DefaultIteratorOptions return b.iteratorOpts(start, end, opts) } -func (b *BadgerDB) ReverseIterator(start, end []byte) (Iterator, error) { +func (b *BadgerDB) ReverseIterator(start, end []byte) (tmdb.Iterator, error) { opts := badger.DefaultIteratorOptions opts.Reverse = true return b.iteratorOpts(end, start, opts) @@ -169,7 +162,7 @@ func (b *BadgerDB) Stats() map[string]string { return nil } -func (b *BadgerDB) NewBatch() Batch { +func (b *BadgerDB) NewBatch() tmdb.Batch { wb := &badgerDBBatch{ db: b.db, wb: b.db.NewWriteBatch(), @@ -179,7 +172,7 @@ func (b *BadgerDB) NewBatch() Batch { return wb } -var _ Batch = (*badgerDBBatch)(nil) +var _ tmdb.Batch = (*badgerDBBatch)(nil) type badgerDBBatch struct { db *badger.DB @@ -196,17 +189,17 @@ type badgerDBBatch struct { func (b *badgerDBBatch) Set(key, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if value == nil { - return errValueNil + return tmdb.ErrValueNil } return b.wb.Set(key, value) } func (b *badgerDBBatch) Delete(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } return b.wb.Delete(key) } diff --git a/boltdb_batch.go b/boltdb/batch.go similarity index 77% rename from boltdb_batch.go rename to boltdb/batch.go index 390bc309b..294291a3f 100644 --- a/boltdb_batch.go +++ b/boltdb/batch.go @@ -1,8 +1,22 @@ -// +build boltdb +package boltdb -package db +import ( + tmdb "github.com/tendermint/tm-db" + "go.etcd.io/bbolt" +) -import "go.etcd.io/bbolt" +type opType int + +const ( + opTypeSet opType = iota + 1 + opTypeDelete +) + +type operation struct { + opType + key []byte + value []byte +} // boltDBBatch stores operations internally and dumps them to BoltDB on Write(). type boltDBBatch struct { @@ -10,7 +24,7 @@ type boltDBBatch struct { ops []operation } -var _ Batch = (*boltDBBatch)(nil) +var _ tmdb.Batch = (*boltDBBatch)(nil) func newBoltDBBatch(db *BoltDB) *boltDBBatch { return &boltDBBatch{ @@ -22,13 +36,13 @@ func newBoltDBBatch(db *BoltDB) *boltDBBatch { // Set implements Batch. func (b *boltDBBatch) Set(key, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if value == nil { - return errValueNil + return tmdb.ErrValueNil } if b.ops == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } b.ops = append(b.ops, operation{opTypeSet, key, value}) return nil @@ -37,10 +51,10 @@ func (b *boltDBBatch) Set(key, value []byte) error { // Delete implements Batch. func (b *boltDBBatch) Delete(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if b.ops == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } b.ops = append(b.ops, operation{opTypeDelete, key, nil}) return nil @@ -49,7 +63,7 @@ func (b *boltDBBatch) Delete(key []byte) error { // Write implements Batch. func (b *boltDBBatch) Write() error { if b.ops == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } err := b.db.db.Batch(func(tx *bbolt.Tx) error { bkt := tx.Bucket(bucket) diff --git a/boltdb.go b/boltdb/db.go similarity index 78% rename from boltdb.go rename to boltdb/db.go index 398c401a4..8dfbde500 100644 --- a/boltdb.go +++ b/boltdb/db.go @@ -1,6 +1,4 @@ -// +build boltdb - -package db +package boltdb import ( "errors" @@ -8,18 +6,11 @@ import ( "os" "path/filepath" + tmdb "github.com/tendermint/tm-db" "go.etcd.io/bbolt" ) -var ( - bucket = []byte("tm") -) - -func init() { - registerDBCreator(BoltDBBackend, func(name, dir string) (DB, error) { - return NewBoltDB(name, dir) - }, false) -} +var bucket = []byte("tm") // BoltDB is a wrapper around etcd's fork of bolt (https://github.com/etcd-io/bbolt). // @@ -32,16 +23,16 @@ type BoltDB struct { db *bbolt.DB } -var _ DB = (*BoltDB)(nil) +var _ tmdb.DB = (*BoltDB)(nil) -// NewBoltDB returns a BoltDB with default options. -func NewBoltDB(name, dir string) (DB, error) { - return NewBoltDBWithOpts(name, dir, bbolt.DefaultOptions) +// NewDB returns a BoltDB with default options. +func NewDB(name, dir string) (tmdb.DB, error) { + return NewDBWithOpts(name, dir, bbolt.DefaultOptions) } -// NewBoltDBWithOpts allows you to supply *bbolt.Options. ReadOnly: true is not -// supported because NewBoltDBWithOpts creates a global bucket. -func NewBoltDBWithOpts(name string, dir string, opts *bbolt.Options) (DB, error) { +// NewDBWithOpts allows you to supply *bbolt.Options. ReadOnly: true is not +// supported because NewDBWithOpts creates a global bucket. +func NewDBWithOpts(name string, dir string, opts *bbolt.Options) (tmdb.DB, error) { if opts.ReadOnly { return nil, errors.New("ReadOnly: true is not supported") } @@ -67,7 +58,7 @@ func NewBoltDBWithOpts(name string, dir string, opts *bbolt.Options) (DB, error) // Get implements DB. func (bdb *BoltDB) Get(key []byte) (value []byte, err error) { if len(key) == 0 { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } err = bdb.db.View(func(tx *bbolt.Tx) error { b := tx.Bucket(bucket) @@ -94,10 +85,10 @@ func (bdb *BoltDB) Has(key []byte) (bool, error) { // Set implements DB. func (bdb *BoltDB) Set(key, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if value == nil { - return errValueNil + return tmdb.ErrValueNil } err := bdb.db.Update(func(tx *bbolt.Tx) error { b := tx.Bucket(bucket) @@ -117,7 +108,7 @@ func (bdb *BoltDB) SetSync(key, value []byte) error { // Delete implements DB. func (bdb *BoltDB) Delete(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } err := bdb.db.Update(func(tx *bbolt.Tx) error { return tx.Bucket(bucket).Delete(key) @@ -144,10 +135,12 @@ func (bdb *BoltDB) Print() error { fmt.Printf("%v\n", stats) err := bdb.db.View(func(tx *bbolt.Tx) error { - tx.Bucket(bucket).ForEach(func(k, v []byte) error { + if err := tx.Bucket(bucket).ForEach(func(k, v []byte) error { fmt.Printf("[%X]:\t[%X]\n", k, v) return nil - }) + }); err != nil { + return err + } return nil }) if err != nil { @@ -175,15 +168,15 @@ func (bdb *BoltDB) Stats() map[string]string { } // NewBatch implements DB. -func (bdb *BoltDB) NewBatch() Batch { +func (bdb *BoltDB) NewBatch() tmdb.Batch { return newBoltDBBatch(bdb) } // WARNING: Any concurrent writes or reads will block until the iterator is // closed. -func (bdb *BoltDB) Iterator(start, end []byte) (Iterator, error) { +func (bdb *BoltDB) Iterator(start, end []byte) (tmdb.Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } tx, err := bdb.db.Begin(false) if err != nil { @@ -194,9 +187,9 @@ func (bdb *BoltDB) Iterator(start, end []byte) (Iterator, error) { // WARNING: Any concurrent writes or reads will block until the iterator is // closed. -func (bdb *BoltDB) ReverseIterator(start, end []byte) (Iterator, error) { +func (bdb *BoltDB) ReverseIterator(start, end []byte) (tmdb.Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } tx, err := bdb.db.Begin(false) if err != nil { diff --git a/boltdb/db_test.go b/boltdb/db_test.go new file mode 100644 index 000000000..503d663aa --- /dev/null +++ b/boltdb/db_test.go @@ -0,0 +1,34 @@ +package boltdb + +import ( + "fmt" + "os" + "testing" + + "github.com/stretchr/testify/require" + "github.com/tendermint/tm-db/internal/dbtest" +) + +func TestBoltDBNewBoltDB(t *testing.T) { + name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) + dir := os.TempDir() + defer dbtest.CleanupDBDir(dir, name) + + db, err := NewDB(name, dir) + require.NoError(t, err) + db.Close() +} + +func BenchmarkBoltDBRandomReadsWrites(b *testing.B) { + name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) + db, err := NewDB(name, "") + if err != nil { + b.Fatal(err) + } + defer func() { + db.Close() + dbtest.CleanupDBDir("", name) + }() + + dbtest.BenchmarkRandomReadsWrites(b, db) +} diff --git a/boltdb_iterator.go b/boltdb/iterator.go similarity index 96% rename from boltdb_iterator.go rename to boltdb/iterator.go index 74212c5ca..fa855ac74 100644 --- a/boltdb_iterator.go +++ b/boltdb/iterator.go @@ -1,10 +1,9 @@ -// +build boltdb - -package db +package boltdb import ( "bytes" + tmdb "github.com/tendermint/tm-db" "go.etcd.io/bbolt" ) @@ -24,7 +23,7 @@ type boltDBIterator struct { isReverse bool } -var _ Iterator = (*boltDBIterator)(nil) +var _ tmdb.Iterator = (*boltDBIterator)(nil) // newBoltDBIterator creates a new boltDBIterator. func newBoltDBIterator(tx *bbolt.Tx, start, end []byte, isReverse bool) *boltDBIterator { diff --git a/boltdb_test.go b/boltdb_test.go deleted file mode 100644 index 0fd12bbe2..000000000 --- a/boltdb_test.go +++ /dev/null @@ -1,35 +0,0 @@ -// +build boltdb - -package db - -import ( - "fmt" - "os" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestBoltDBNewBoltDB(t *testing.T) { - name := fmt.Sprintf("test_%x", randStr(12)) - dir := os.TempDir() - defer cleanupDBDir(dir, name) - - db, err := NewBoltDB(name, dir) - require.NoError(t, err) - db.Close() -} - -func BenchmarkBoltDBRandomReadsWrites(b *testing.B) { - name := fmt.Sprintf("test_%x", randStr(12)) - db, err := NewBoltDB(name, "") - if err != nil { - b.Fatal(err) - } - defer func() { - db.Close() - cleanupDBDir("", name) - }() - - benchmarkRandomReadsWrites(b, db) -} diff --git a/cleveldb_batch.go b/cleveldb/batch.go similarity index 81% rename from cleveldb_batch.go rename to cleveldb/batch.go index 132a521cb..c1a2aa210 100644 --- a/cleveldb_batch.go +++ b/cleveldb/batch.go @@ -1,8 +1,9 @@ -// +build cleveldb +package cleveldb -package db - -import "github.com/jmhodges/levigo" +import ( + "github.com/jmhodges/levigo" + tmdb "github.com/tendermint/tm-db" +) // cLevelDBBatch is a LevelDB batch. type cLevelDBBatch struct { @@ -20,13 +21,13 @@ func newCLevelDBBatch(db *CLevelDB) *cLevelDBBatch { // Set implements Batch. func (b *cLevelDBBatch) Set(key, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if value == nil { - return errValueNil + return tmdb.ErrValueNil } if b.batch == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } b.batch.Put(key, value) return nil @@ -35,10 +36,10 @@ func (b *cLevelDBBatch) Set(key, value []byte) error { // Delete implements Batch. func (b *cLevelDBBatch) Delete(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if b.batch == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } b.batch.Delete(key) return nil @@ -47,7 +48,7 @@ func (b *cLevelDBBatch) Delete(key []byte) error { // Write implements Batch. func (b *cLevelDBBatch) Write() error { if b.batch == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } err := b.db.db.Write(b.db.wo, b.batch) if err != nil { @@ -60,7 +61,7 @@ func (b *cLevelDBBatch) Write() error { // WriteSync implements Batch. func (b *cLevelDBBatch) WriteSync() error { if b.batch == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } err := b.db.db.Write(b.db.woSync, b.batch) if err != nil { diff --git a/cleveldb.go b/cleveldb/db.go similarity index 82% rename from cleveldb.go rename to cleveldb/db.go index 377956deb..e796ea83f 100644 --- a/cleveldb.go +++ b/cleveldb/db.go @@ -1,20 +1,13 @@ -// +build cleveldb - -package db +package cleveldb import ( "fmt" "path/filepath" "github.com/jmhodges/levigo" -) -func init() { - dbCreator := func(name string, dir string) (DB, error) { - return NewCLevelDB(name, dir) - } - registerDBCreator(CLevelDBBackend, dbCreator, false) -} + tmdb "github.com/tendermint/tm-db" +) // CLevelDB uses the C LevelDB database via a Go wrapper. type CLevelDB struct { @@ -24,10 +17,10 @@ type CLevelDB struct { woSync *levigo.WriteOptions } -var _ DB = (*CLevelDB)(nil) +var _ tmdb.DB = (*CLevelDB)(nil) -// NewCLevelDB creates a new CLevelDB. -func NewCLevelDB(name string, dir string) (*CLevelDB, error) { +// New creates a new CLevelDB. +func NewDB(name string, dir string) (*CLevelDB, error) { dbPath := filepath.Join(dir, name+".db") opts := levigo.NewOptions() @@ -53,7 +46,7 @@ func NewCLevelDB(name string, dir string) (*CLevelDB, error) { // Get implements DB. func (db *CLevelDB) Get(key []byte) ([]byte, error) { if len(key) == 0 { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } res, err := db.db.Get(db.ro, key) if err != nil { @@ -74,10 +67,10 @@ func (db *CLevelDB) Has(key []byte) (bool, error) { // Set implements DB. func (db *CLevelDB) Set(key []byte, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if value == nil { - return errValueNil + return tmdb.ErrValueNil } if err := db.db.Put(db.wo, key, value); err != nil { return err @@ -88,10 +81,10 @@ func (db *CLevelDB) Set(key []byte, value []byte) error { // SetSync implements DB. func (db *CLevelDB) SetSync(key []byte, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if value == nil { - return errValueNil + return tmdb.ErrValueNil } if err := db.db.Put(db.woSync, key, value); err != nil { return err @@ -102,7 +95,7 @@ func (db *CLevelDB) SetSync(key []byte, value []byte) error { // Delete implements DB. func (db *CLevelDB) Delete(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if err := db.db.Delete(db.wo, key); err != nil { return err @@ -113,7 +106,7 @@ func (db *CLevelDB) Delete(key []byte) error { // DeleteSync implements DB. func (db *CLevelDB) DeleteSync(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if err := db.db.Delete(db.woSync, key); err != nil { return err @@ -172,23 +165,23 @@ func (db *CLevelDB) Stats() map[string]string { } // NewBatch implements DB. -func (db *CLevelDB) NewBatch() Batch { +func (db *CLevelDB) NewBatch() tmdb.Batch { return newCLevelDBBatch(db) } // Iterator implements DB. -func (db *CLevelDB) Iterator(start, end []byte) (Iterator, error) { +func (db *CLevelDB) Iterator(start, end []byte) (tmdb.Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } itr := db.db.NewIterator(db.ro) return newCLevelDBIterator(itr, start, end, false), nil } // ReverseIterator implements DB. -func (db *CLevelDB) ReverseIterator(start, end []byte) (Iterator, error) { +func (db *CLevelDB) ReverseIterator(start, end []byte) (tmdb.Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } itr := db.db.NewIterator(db.ro) return newCLevelDBIterator(itr, start, end, true), nil diff --git a/cleveldb/db_test.go b/cleveldb/db_test.go new file mode 100644 index 000000000..a451f01fc --- /dev/null +++ b/cleveldb/db_test.go @@ -0,0 +1,78 @@ +package cleveldb + +import ( + "bytes" + "fmt" + "math/rand" + "testing" + + "github.com/tendermint/tm-db/internal/dbtest" +) + +func BenchmarkRandomReadsWrites2(b *testing.B) { + b.StopTimer() + + numItems := int64(1000000) + internal := map[int64]int64{} + for i := 0; i < int(numItems); i++ { + internal[int64(i)] = int64(0) + } + db, err := NewDB(fmt.Sprintf("test_%x", dbtest.RandStr(12)), "") + if err != nil { + b.Fatal(err.Error()) + return + } + + fmt.Println("ok, starting") + b.StartTimer() + + for i := 0; i < b.N; i++ { + // Write something + { + idx := (int64(rand.Int()) % numItems) + internal[idx]++ + val := internal[idx] + idxBytes := dbtest.Int642Bytes(idx) + valBytes := dbtest.Int642Bytes(val) + // fmt.Printf("Set %X -> %X\n", idxBytes, valBytes) + if err = db.Set( + idxBytes, + valBytes, + ); err != nil { + b.Error(err) + } + } + // Read something + { + idx := (int64(rand.Int()) % numItems) + val := internal[idx] + idxBytes := dbtest.Int642Bytes(idx) + valBytes, err := db.Get(idxBytes) + if err != nil { + b.Error(err) + } + // fmt.Printf("Get %X -> %X\n", idxBytes, valBytes) + if val == 0 { + if !bytes.Equal(valBytes, nil) { + b.Errorf("Expected %v for %v, got %X", + nil, idx, valBytes) + break + } + } else { + if len(valBytes) != 8 { + b.Errorf("Expected length 8 for %v, got %X", + idx, valBytes) + break + } + valGot := dbtest.Bytes2Int64(valBytes) + if val != valGot { + b.Errorf("Expected %v for %v, got %v", + val, idx, valGot) + break + } + } + } + } + + db.Close() +} diff --git a/cleveldb_iterator.go b/cleveldb/iterator.go similarity index 94% rename from cleveldb_iterator.go rename to cleveldb/iterator.go index 04375d565..ce019880f 100644 --- a/cleveldb_iterator.go +++ b/cleveldb/iterator.go @@ -1,11 +1,10 @@ -// +build cleveldb - -package db +package cleveldb import ( "bytes" "github.com/jmhodges/levigo" + tmdb "github.com/tendermint/tm-db" ) // cLevelDBIterator is a cLevelDB iterator. @@ -16,11 +15,11 @@ type cLevelDBIterator struct { isInvalid bool } -var _ Iterator = (*cLevelDBIterator)(nil) +var _ tmdb.Iterator = (*cLevelDBIterator)(nil) func newCLevelDBIterator(source *levigo.Iterator, start, end []byte, isReverse bool) *cLevelDBIterator { if isReverse { - if end == nil || len(end) == 0 { + if len(end) == 0 { source.SeekToLast() } else { source.Seek(end) @@ -34,7 +33,7 @@ func newCLevelDBIterator(source *levigo.Iterator, start, end []byte, isReverse b } } } else { - if start == nil || len(start) == 0 { + if len(start) == 0 { source.SeekToFirst() } else { source.Seek(start) diff --git a/cleveldb_test.go b/cleveldb_test.go deleted file mode 100644 index 61e2fb6ef..000000000 --- a/cleveldb_test.go +++ /dev/null @@ -1,103 +0,0 @@ -// +build cleveldb - -package db - -import ( - "bytes" - "fmt" - "math/rand" - "os" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func BenchmarkRandomReadsWrites2(b *testing.B) { - b.StopTimer() - - numItems := int64(1000000) - internal := map[int64]int64{} - for i := 0; i < int(numItems); i++ { - internal[int64(i)] = int64(0) - } - db, err := NewCLevelDB(fmt.Sprintf("test_%x", randStr(12)), "") - if err != nil { - b.Fatal(err.Error()) - return - } - - fmt.Println("ok, starting") - b.StartTimer() - - for i := 0; i < b.N; i++ { - // Write something - { - idx := (int64(rand.Int()) % numItems) - internal[idx]++ - val := internal[idx] - idxBytes := int642Bytes(int64(idx)) - valBytes := int642Bytes(int64(val)) - //fmt.Printf("Set %X -> %X\n", idxBytes, valBytes) - db.Set( - idxBytes, - valBytes, - ) - } - // Read something - { - idx := (int64(rand.Int()) % numItems) - val := internal[idx] - idxBytes := int642Bytes(int64(idx)) - valBytes, err := db.Get(idxBytes) - if err != nil { - b.Error(err) - } - //fmt.Printf("Get %X -> %X\n", idxBytes, valBytes) - if val == 0 { - if !bytes.Equal(valBytes, nil) { - b.Errorf("Expected %v for %v, got %X", - nil, idx, valBytes) - break - } - } else { - if len(valBytes) != 8 { - b.Errorf("Expected length 8 for %v, got %X", - idx, valBytes) - break - } - valGot := bytes2Int64(valBytes) - if val != valGot { - b.Errorf("Expected %v for %v, got %v", - val, idx, valGot) - break - } - } - } - } - - db.Close() -} - -func TestCLevelDBBackend(t *testing.T) { - name := fmt.Sprintf("test_%x", randStr(12)) - // Can't use "" (current directory) or "./" here because levigo.Open returns: - // "Error initializing DB: IO error: test_XXX.db: Invalid argument" - dir := os.TempDir() - db, err := NewDB(name, CLevelDBBackend, dir) - require.NoError(t, err) - defer cleanupDBDir(dir, name) - - _, ok := db.(*CLevelDB) - assert.True(t, ok) -} - -func TestCLevelDBStats(t *testing.T) { - name := fmt.Sprintf("test_%x", randStr(12)) - dir := os.TempDir() - db, err := NewDB(name, CLevelDBBackend, dir) - require.NoError(t, err) - defer cleanupDBDir(dir, name) - - assert.NotEmpty(t, db.Stats()) -} diff --git a/goleveldb_batch.go b/goleveldb/batch.go similarity index 82% rename from goleveldb_batch.go rename to goleveldb/batch.go index 4c1c6a2ba..5f9f4a7d6 100644 --- a/goleveldb_batch.go +++ b/goleveldb/batch.go @@ -1,8 +1,9 @@ -package db +package goleveldb import ( "github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb/opt" + tmdb "github.com/tendermint/tm-db" ) type goLevelDBBatch struct { @@ -10,7 +11,7 @@ type goLevelDBBatch struct { batch *leveldb.Batch } -var _ Batch = (*goLevelDBBatch)(nil) +var _ tmdb.Batch = (*goLevelDBBatch)(nil) func newGoLevelDBBatch(db *GoLevelDB) *goLevelDBBatch { return &goLevelDBBatch{ @@ -22,13 +23,13 @@ func newGoLevelDBBatch(db *GoLevelDB) *goLevelDBBatch { // Set implements Batch. func (b *goLevelDBBatch) Set(key, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if value == nil { - return errValueNil + return tmdb.ErrValueNil } if b.batch == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } b.batch.Put(key, value) return nil @@ -37,10 +38,10 @@ func (b *goLevelDBBatch) Set(key, value []byte) error { // Delete implements Batch. func (b *goLevelDBBatch) Delete(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if b.batch == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } b.batch.Delete(key) return nil @@ -58,7 +59,7 @@ func (b *goLevelDBBatch) WriteSync() error { func (b *goLevelDBBatch) write(sync bool) error { if b.batch == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } err := b.db.db.Write(b.batch, &opt.WriteOptions{Sync: sync}) if err != nil { diff --git a/goleveldb.go b/goleveldb/db.go similarity index 80% rename from goleveldb.go rename to goleveldb/db.go index fd1bffd18..c60fdf543 100644 --- a/goleveldb.go +++ b/goleveldb/db.go @@ -1,4 +1,4 @@ -package db +package goleveldb import ( "fmt" @@ -8,26 +8,20 @@ import ( "github.com/syndtr/goleveldb/leveldb/errors" "github.com/syndtr/goleveldb/leveldb/opt" "github.com/syndtr/goleveldb/leveldb/util" + tmdb "github.com/tendermint/tm-db" ) -func init() { - dbCreator := func(name string, dir string) (DB, error) { - return NewGoLevelDB(name, dir) - } - registerDBCreator(GoLevelDBBackend, dbCreator, false) -} - type GoLevelDB struct { db *leveldb.DB } -var _ DB = (*GoLevelDB)(nil) +var _ tmdb.DB = (*GoLevelDB)(nil) -func NewGoLevelDB(name string, dir string) (*GoLevelDB, error) { - return NewGoLevelDBWithOpts(name, dir, nil) +func NewDB(name string, dir string) (*GoLevelDB, error) { + return NewDBWithOpts(name, dir, nil) } -func NewGoLevelDBWithOpts(name string, dir string, o *opt.Options) (*GoLevelDB, error) { +func NewDBWithOpts(name string, dir string, o *opt.Options) (*GoLevelDB, error) { dbPath := filepath.Join(dir, name+".db") db, err := leveldb.OpenFile(dbPath, o) if err != nil { @@ -42,7 +36,7 @@ func NewGoLevelDBWithOpts(name string, dir string, o *opt.Options) (*GoLevelDB, // Get implements DB. func (db *GoLevelDB) Get(key []byte) ([]byte, error) { if len(key) == 0 { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } res, err := db.db.Get(key, nil) if err != nil { @@ -66,10 +60,10 @@ func (db *GoLevelDB) Has(key []byte) (bool, error) { // Set implements DB. func (db *GoLevelDB) Set(key []byte, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if value == nil { - return errValueNil + return tmdb.ErrValueNil } if err := db.db.Put(key, value, nil); err != nil { return err @@ -80,10 +74,10 @@ func (db *GoLevelDB) Set(key []byte, value []byte) error { // SetSync implements DB. func (db *GoLevelDB) SetSync(key []byte, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if value == nil { - return errValueNil + return tmdb.ErrValueNil } if err := db.db.Put(key, value, &opt.WriteOptions{Sync: true}); err != nil { return err @@ -94,7 +88,7 @@ func (db *GoLevelDB) SetSync(key []byte, value []byte) error { // Delete implements DB. func (db *GoLevelDB) Delete(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if err := db.db.Delete(key, nil); err != nil { return err @@ -105,7 +99,7 @@ func (db *GoLevelDB) Delete(key []byte) error { // DeleteSync implements DB. func (db *GoLevelDB) DeleteSync(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } err := db.db.Delete(key, &opt.WriteOptions{Sync: true}) if err != nil { @@ -167,23 +161,23 @@ func (db *GoLevelDB) Stats() map[string]string { } // NewBatch implements DB. -func (db *GoLevelDB) NewBatch() Batch { +func (db *GoLevelDB) NewBatch() tmdb.Batch { return newGoLevelDBBatch(db) } // Iterator implements DB. -func (db *GoLevelDB) Iterator(start, end []byte) (Iterator, error) { +func (db *GoLevelDB) Iterator(start, end []byte) (tmdb.Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } itr := db.db.NewIterator(&util.Range{Start: start, Limit: end}, nil) return newGoLevelDBIterator(itr, start, end, false), nil } // ReverseIterator implements DB. -func (db *GoLevelDB) ReverseIterator(start, end []byte) (Iterator, error) { +func (db *GoLevelDB) ReverseIterator(start, end []byte) (tmdb.Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } itr := db.db.NewIterator(&util.Range{Start: start, Limit: end}, nil) return newGoLevelDBIterator(itr, start, end, true), nil diff --git a/goleveldb/db_test.go b/goleveldb/db_test.go new file mode 100644 index 000000000..a969a2464 --- /dev/null +++ b/goleveldb/db_test.go @@ -0,0 +1,44 @@ +package goleveldb + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + "github.com/syndtr/goleveldb/leveldb/opt" + "github.com/tendermint/tm-db/internal/dbtest" +) + +func TestGoLevelDBNewDB(t *testing.T) { + name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) + defer dbtest.CleanupDBDir("", name) + + // Test we can't open the db twice for writing + wr1, err := NewDB(name, "") + require.Nil(t, err) + _, err = NewDB(name, "") + require.NotNil(t, err) + wr1.Close() // Close the db to release the lock + + // Test we can open the db twice for reading only + ro1, err := NewDBWithOpts(name, "", &opt.Options{ReadOnly: true}) + require.Nil(t, err) + defer ro1.Close() + ro2, err := NewDBWithOpts(name, "", &opt.Options{ReadOnly: true}) + require.Nil(t, err) + defer ro2.Close() +} + +func BenchmarkGoLevelDBRandomReadsWrites(b *testing.B) { + name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) + db, err := NewDB(name, "") + if err != nil { + b.Fatal(err) + } + defer func() { + db.Close() + dbtest.CleanupDBDir("", name) + }() + + dbtest.BenchmarkRandomReadsWrites(b, db) +} diff --git a/goleveldb_iterator.go b/goleveldb/iterator.go similarity index 93% rename from goleveldb_iterator.go rename to goleveldb/iterator.go index 9cf9a5e15..4a6add77d 100644 --- a/goleveldb_iterator.go +++ b/goleveldb/iterator.go @@ -1,9 +1,10 @@ -package db +package goleveldb import ( "bytes" "github.com/syndtr/goleveldb/leveldb/iterator" + tmdb "github.com/tendermint/tm-db" ) type goLevelDBIterator struct { @@ -14,7 +15,7 @@ type goLevelDBIterator struct { isInvalid bool } -var _ Iterator = (*goLevelDBIterator)(nil) +var _ tmdb.Iterator = (*goLevelDBIterator)(nil) func newGoLevelDBIterator(source iterator.Iterator, start, end []byte, isReverse bool) *goLevelDBIterator { if isReverse { @@ -109,6 +110,12 @@ func (itr *goLevelDBIterator) Value() []byte { return cp(itr.source.Value()) } +func cp(bz []byte) (ret []byte) { + ret = make([]byte, len(bz)) + copy(ret, bz) + return ret +} + // Next implements Iterator. func (itr *goLevelDBIterator) Next() { itr.assertIsValid() diff --git a/goleveldb_test.go b/goleveldb_test.go deleted file mode 100644 index e1c879f10..000000000 --- a/goleveldb_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package db - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/require" - "github.com/syndtr/goleveldb/leveldb/opt" -) - -func TestGoLevelDBNewGoLevelDB(t *testing.T) { - name := fmt.Sprintf("test_%x", randStr(12)) - defer cleanupDBDir("", name) - - // Test we can't open the db twice for writing - wr1, err := NewGoLevelDB(name, "") - require.Nil(t, err) - _, err = NewGoLevelDB(name, "") - require.NotNil(t, err) - 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}) - require.Nil(t, err) - defer ro1.Close() - ro2, err := NewGoLevelDBWithOpts(name, "", &opt.Options{ReadOnly: true}) - require.Nil(t, err) - defer ro2.Close() -} - -func BenchmarkGoLevelDBRandomReadsWrites(b *testing.B) { - name := fmt.Sprintf("test_%x", randStr(12)) - db, err := NewGoLevelDB(name, "") - if err != nil { - b.Fatal(err) - } - defer func() { - db.Close() - cleanupDBDir("", name) - }() - - benchmarkRandomReadsWrites(b, db) -} diff --git a/common_test.go b/internal/dbtest/dbtest.go similarity index 56% rename from common_test.go rename to internal/dbtest/dbtest.go index f48efd7aa..4315b886f 100644 --- a/common_test.go +++ b/internal/dbtest/dbtest.go @@ -1,48 +1,44 @@ -package db +package dbtest import ( "bytes" "encoding/binary" - "io/ioutil" "math/rand" + "os" + "path/filepath" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + tmdb "github.com/tendermint/tm-db" ) //---------------------------------------- // Helper functions. -func checkValue(t *testing.T, db DB, key []byte, valueWanted []byte) { - valueGot, err := db.Get(key) - assert.NoError(t, err) - assert.Equal(t, valueWanted, valueGot) -} - -func checkValid(t *testing.T, itr Iterator, expected bool) { +func Valid(t *testing.T, itr tmdb.Iterator, expected bool) { valid := itr.Valid() require.Equal(t, expected, valid) } -func checkNext(t *testing.T, itr Iterator, expected bool) { +func Next(t *testing.T, itr tmdb.Iterator, expected bool) { itr.Next() // assert.NoError(t, err) TODO: look at fixing this valid := itr.Valid() require.Equal(t, expected, valid) } -func checkNextPanics(t *testing.T, itr Iterator) { +func NextPanics(t *testing.T, itr tmdb.Iterator) { assert.Panics(t, func() { itr.Next() }, "checkNextPanics expected an error but didn't") } -func checkDomain(t *testing.T, itr Iterator, start, end []byte) { +func Domain(t *testing.T, itr tmdb.Iterator, start, end []byte) { ds, de := itr.Domain() assert.Equal(t, start, ds, "checkDomain domain start incorrect") assert.Equal(t, end, de, "checkDomain domain end incorrect") } -func checkItem(t *testing.T, itr Iterator, key []byte, value []byte) { +func Item(t *testing.T, itr tmdb.Iterator, key []byte, value []byte) { v := itr.Value() k := itr.Key() @@ -51,30 +47,71 @@ func checkItem(t *testing.T, itr Iterator, key []byte, value []byte) { assert.Exactly(t, value, v) } -func checkInvalid(t *testing.T, itr Iterator) { - checkValid(t, itr, false) - checkKeyPanics(t, itr) - checkValuePanics(t, itr) - checkNextPanics(t, itr) +func Invalid(t *testing.T, itr tmdb.Iterator) { + Valid(t, itr, false) + KeyPanics(t, itr) + ValuePanics(t, itr) + NextPanics(t, itr) } -func checkKeyPanics(t *testing.T, itr Iterator) { +func KeyPanics(t *testing.T, itr tmdb.Iterator) { assert.Panics(t, func() { itr.Key() }, "checkKeyPanics expected panic but didn't") } -func checkValuePanics(t *testing.T, itr Iterator) { +func Value(t *testing.T, db tmdb.DB, key []byte, valueWanted []byte) { + valueGot, err := db.Get(key) + assert.NoError(t, err) + assert.Equal(t, valueWanted, valueGot) +} + +func ValuePanics(t *testing.T, itr tmdb.Iterator) { assert.Panics(t, func() { itr.Value() }) } -func newTempDB(t *testing.T, backend BackendType) (db DB, dbDir string) { - dirname, err := ioutil.TempDir("", "db_common_test") - require.NoError(t, err) - db, err = NewDB("testdb", backend, dirname) - require.NoError(t, err) - return db, dirname +func CleanupDBDir(dir, name string) { + err := os.RemoveAll(filepath.Join(dir, name) + ".db") + if err != nil { + panic(err) + } +} + +const strChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" // 62 characters + +// RandStr constructs a random alphanumeric string of given length. +func RandStr(length int) string { + chars := []byte{} +MAIN_LOOP: + for { + val := rand.Int63() // nolint:gosec // G404: Use of weak random number generator + for i := 0; i < 10; i++ { + v := int(val & 0x3f) // rightmost 6 bits + if v >= 62 { // only 62 characters in strChars + val >>= 6 + continue + } else { + chars = append(chars, strChars[v]) + if len(chars) == length { + break MAIN_LOOP + } + val >>= 6 + } + } + } + + return string(chars) +} + +func Int642Bytes(i int64) []byte { + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, uint64(i)) + return buf +} + +func Bytes2Int64(buf []byte) int64 { + return int64(binary.BigEndian.Uint64(buf)) } -func benchmarkRangeScans(b *testing.B, db DB, dbSize int64) { +func BenchmarkRangeScans(b *testing.B, db tmdb.DB, dbSize int64) { b.StopTimer() rangeSize := int64(10000) @@ -83,7 +120,7 @@ func benchmarkRangeScans(b *testing.B, db DB, dbSize int64) { } for i := int64(0); i < dbSize; i++ { - bytes := int642Bytes(i) + bytes := Int642Bytes(i) err := db.Set(bytes, bytes) if err != nil { // require.NoError() is very expensive (according to profiler), so check manually @@ -93,9 +130,10 @@ func benchmarkRangeScans(b *testing.B, db DB, dbSize int64) { b.StartTimer() for i := 0; i < b.N; i++ { - start := rand.Int63n(dbSize - rangeSize) + + start := rand.Int63n(dbSize - rangeSize) // nolint: gosec end := start + rangeSize - iter, err := db.Iterator(int642Bytes(start), int642Bytes(end)) + iter, err := db.Iterator(Int642Bytes(start), Int642Bytes(end)) require.NoError(b, err) count := 0 for ; iter.Valid(); iter.Next() { @@ -106,7 +144,7 @@ func benchmarkRangeScans(b *testing.B, db DB, dbSize int64) { } } -func benchmarkRandomReadsWrites(b *testing.B, db DB) { +func BenchmarkRandomReadsWrites(b *testing.B, db tmdb.DB) { b.StopTimer() // create dummy data @@ -122,12 +160,12 @@ func benchmarkRandomReadsWrites(b *testing.B, db DB) { for i := 0; i < b.N; i++ { // Write something { - idx := rand.Int63n(numItems) + idx := rand.Int63n(numItems) // nolint: gosec internal[idx]++ val := internal[idx] - idxBytes := int642Bytes(idx) - valBytes := int642Bytes(val) - //fmt.Printf("Set %X -> %X\n", idxBytes, valBytes) + idxBytes := Int642Bytes(idx) + valBytes := Int642Bytes(val) + // fmt.Printf("Set %X -> %X\n", idxBytes, valBytes) err := db.Set(idxBytes, valBytes) if err != nil { // require.NoError() is very expensive (according to profiler), so check manually @@ -137,15 +175,15 @@ func benchmarkRandomReadsWrites(b *testing.B, db DB) { // Read something { - idx := rand.Int63n(numItems) + idx := rand.Int63n(numItems) // nolint: gosec valExp := internal[idx] - idxBytes := int642Bytes(idx) + idxBytes := Int642Bytes(idx) valBytes, err := db.Get(idxBytes) if err != nil { // require.NoError() is very expensive (according to profiler), so check manually b.Fatal(b, err) } - //fmt.Printf("Get %X -> %X\n", idxBytes, valBytes) + // fmt.Printf("Get %X -> %X\n", idxBytes, valBytes) if valExp == 0 { if !bytes.Equal(valBytes, nil) { b.Errorf("Expected %v for %v, got %X", nil, idx, valBytes) @@ -156,7 +194,7 @@ func benchmarkRandomReadsWrites(b *testing.B, db DB) { b.Errorf("Expected length 8 for %v, got %X", idx, valBytes) break } - valGot := bytes2Int64(valBytes) + valGot := Bytes2Int64(valBytes) if valExp != valGot { b.Errorf("Expected %v for %v, got %v", valExp, idx, valGot) break @@ -166,13 +204,3 @@ func benchmarkRandomReadsWrites(b *testing.B, db DB) { } } - -func int642Bytes(i int64) []byte { - buf := make([]byte, 8) - binary.BigEndian.PutUint64(buf, uint64(i)) - return buf -} - -func bytes2Int64(buf []byte) int64 { - return int64(binary.BigEndian.Uint64(buf)) -} diff --git a/makefile b/makefile index bedebc457..fa195ea1e 100644 --- a/makefile +++ b/makefile @@ -12,6 +12,14 @@ test: @echo "--> Running go test" @go test $(PACKAGES) -v +test-memdb: + @echo "--> Running go test" + @go test $(PACKAGES) -tags memdb -v + +test-goleveldb: + @echo "--> Running go test" + @go test $(PACKAGES) -tags goleveldb -v + test-cleveldb: @echo "--> Running go test" @go test $(PACKAGES) -tags cleveldb -v @@ -30,7 +38,12 @@ test-badgerdb: test-all: @echo "--> Running go test" - @go test $(PACKAGES) -tags cleveldb,boltdb,rocksdb,badgerdb -v + @go test $(PACKAGES) -tags memdb,goleveldb,cleveldb,boltdb,rocksdb,badgerdb -v + +test-all-docker: + @echo "--> Running go test" + @docker run --rm -v $(CURDIR):/workspace --workdir /workspace tendermintdev/docker-tm-db-testing go test $(PACKAGES) -tags memdb,goleveldb,cleveldb,boltdb,rocksdb,badgerdb -v +.PHONY: test-all-docker lint: @echo "--> Running linter" diff --git a/memdb_batch.go b/memdb/batch.go similarity index 84% rename from memdb_batch.go rename to memdb/batch.go index 6ff30fea6..cd3b4c1a2 100644 --- a/memdb_batch.go +++ b/memdb/batch.go @@ -1,6 +1,10 @@ -package db +package memdb -import "fmt" +import ( + "fmt" + + tmdb "github.com/tendermint/tm-db" +) // memDBBatch operations type opType int @@ -22,7 +26,7 @@ type memDBBatch struct { ops []operation } -var _ Batch = (*memDBBatch)(nil) +var _ tmdb.Batch = (*memDBBatch)(nil) // newMemDBBatch creates a new memDBBatch func newMemDBBatch(db *MemDB) *memDBBatch { @@ -35,13 +39,13 @@ func newMemDBBatch(db *MemDB) *memDBBatch { // Set implements Batch. func (b *memDBBatch) Set(key, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if value == nil { - return errValueNil + return tmdb.ErrValueNil } if b.ops == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } b.ops = append(b.ops, operation{opTypeSet, key, value}) return nil @@ -50,10 +54,10 @@ func (b *memDBBatch) Set(key, value []byte) error { // Delete implements Batch. func (b *memDBBatch) Delete(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if b.ops == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } b.ops = append(b.ops, operation{opTypeDelete, key, nil}) return nil @@ -62,7 +66,7 @@ func (b *memDBBatch) Delete(key []byte) error { // Write implements Batch. func (b *memDBBatch) Write() error { if b.ops == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } b.db.mtx.Lock() defer b.db.mtx.Unlock() diff --git a/memdb.go b/memdb/db.go similarity index 87% rename from memdb.go rename to memdb/db.go index 604e6a06e..1053f637b 100644 --- a/memdb.go +++ b/memdb/db.go @@ -1,4 +1,4 @@ -package db +package memdb import ( "bytes" @@ -6,6 +6,7 @@ import ( "sync" "github.com/google/btree" + tmdb "github.com/tendermint/tm-db" ) const ( @@ -13,12 +14,6 @@ const ( bTreeDegree = 32 ) -func init() { - registerDBCreator(MemDBBackend, func(name, dir string) (DB, error) { - return NewMemDB(), nil - }, false) -} - // item is a btree.Item with byte slices as keys and values type item struct { key []byte @@ -53,10 +48,10 @@ type MemDB struct { btree *btree.BTree } -var _ DB = (*MemDB)(nil) +var _ tmdb.DB = (*MemDB)(nil) -// NewMemDB creates a new in-memory database. -func NewMemDB() *MemDB { +// NewDB creates a new in-memory database. +func NewDB() *MemDB { database := &MemDB{ btree: btree.New(bTreeDegree), } @@ -66,7 +61,7 @@ func NewMemDB() *MemDB { // Get implements DB. func (db *MemDB) Get(key []byte) ([]byte, error) { if len(key) == 0 { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } db.mtx.RLock() defer db.mtx.RUnlock() @@ -81,7 +76,7 @@ func (db *MemDB) Get(key []byte) ([]byte, error) { // Has implements DB. func (db *MemDB) Has(key []byte) (bool, error) { if len(key) == 0 { - return false, errKeyEmpty + return false, tmdb.ErrKeyEmpty } db.mtx.RLock() defer db.mtx.RUnlock() @@ -92,10 +87,10 @@ func (db *MemDB) Has(key []byte) (bool, error) { // Set implements DB. func (db *MemDB) Set(key []byte, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if value == nil { - return errValueNil + return tmdb.ErrValueNil } db.mtx.Lock() defer db.mtx.Unlock() @@ -117,7 +112,7 @@ func (db *MemDB) SetSync(key []byte, value []byte) error { // Delete implements DB. func (db *MemDB) Delete(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } db.mtx.Lock() defer db.mtx.Unlock() @@ -169,24 +164,24 @@ func (db *MemDB) Stats() map[string]string { } // NewBatch implements DB. -func (db *MemDB) NewBatch() Batch { +func (db *MemDB) NewBatch() tmdb.Batch { return newMemDBBatch(db) } // Iterator implements DB. // Takes out a read-lock on the database until the iterator is closed. -func (db *MemDB) Iterator(start, end []byte) (Iterator, error) { +func (db *MemDB) Iterator(start, end []byte) (tmdb.Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } return newMemDBIterator(db, start, end, false), nil } // ReverseIterator implements DB. // Takes out a read-lock on the database until the iterator is closed. -func (db *MemDB) ReverseIterator(start, end []byte) (Iterator, error) { +func (db *MemDB) ReverseIterator(start, end []byte) (tmdb.Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } return newMemDBIterator(db, start, end, true), nil } diff --git a/memdb/db_test.go b/memdb/db_test.go new file mode 100644 index 000000000..9d38def9f --- /dev/null +++ b/memdb/db_test.go @@ -0,0 +1,28 @@ +package memdb + +import ( + "testing" + + "github.com/tendermint/tm-db/internal/dbtest" +) + +func BenchmarkMemDBRangeScans1M(b *testing.B) { + db := NewDB() + defer db.Close() + + dbtest.BenchmarkRangeScans(b, db, int64(1e6)) +} + +func BenchmarkMemDBRangeScans10M(b *testing.B) { + db := NewDB() + defer db.Close() + + dbtest.BenchmarkRangeScans(b, db, int64(10e6)) +} + +func BenchmarkMemDBRandomReadsWrites(b *testing.B) { + db := NewDB() + defer db.Close() + + dbtest.BenchmarkRandomReadsWrites(b, db) +} diff --git a/memdb_iterator.go b/memdb/iterator.go similarity index 97% rename from memdb_iterator.go rename to memdb/iterator.go index 2a61e3757..8def00650 100644 --- a/memdb_iterator.go +++ b/memdb/iterator.go @@ -1,10 +1,11 @@ -package db +package memdb import ( "bytes" "context" "github.com/google/btree" + tmdb "github.com/tendermint/tm-db" ) const ( @@ -23,7 +24,7 @@ type memDBIterator struct { end []byte } -var _ Iterator = (*memDBIterator)(nil) +var _ tmdb.Iterator = (*memDBIterator)(nil) // newMemDBIterator creates a new memDBIterator. func newMemDBIterator(db *MemDB, start []byte, end []byte, reverse bool) *memDBIterator { diff --git a/memdb_test.go b/memdb_test.go deleted file mode 100644 index 4e67e813d..000000000 --- a/memdb_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package db - -import ( - "testing" -) - -func BenchmarkMemDBRangeScans1M(b *testing.B) { - db := NewMemDB() - defer db.Close() - - benchmarkRangeScans(b, db, int64(1e6)) -} - -func BenchmarkMemDBRangeScans10M(b *testing.B) { - db := NewMemDB() - defer db.Close() - - benchmarkRangeScans(b, db, int64(10e6)) -} - -func BenchmarkMemDBRandomReadsWrites(b *testing.B) { - db := NewMemDB() - defer db.Close() - - benchmarkRandomReadsWrites(b, db) -} diff --git a/backend_test.go b/metadb/backend_test.go similarity index 63% rename from backend_test.go rename to metadb/backend_test.go index 63630beca..dff5f71e9 100644 --- a/backend_test.go +++ b/metadb/backend_test.go @@ -1,45 +1,43 @@ -package db +package metadb import ( "fmt" "io/ioutil" "os" - "path/filepath" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + tmdb "github.com/tendermint/tm-db" + "github.com/tendermint/tm-db/cleveldb" + "github.com/tendermint/tm-db/goleveldb" + "github.com/tendermint/tm-db/internal/dbtest" + "github.com/tendermint/tm-db/memdb" + "github.com/tendermint/tm-db/rocksdb" ) // Register a test backend for PrefixDB as well, with some unrelated junk data func init() { // nolint: errcheck - registerDBCreator("prefixdb", func(name, dir string) (DB, error) { - mdb := NewMemDB() + registerDBCreator("prefixdb", func(name, dir string) (tmdb.DB, error) { + mdb := memdb.NewDB() 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 + return tmdb.NewPrefixDB(mdb, []byte("test/")), nil }, false) } -func cleanupDBDir(dir, name string) { - err := os.RemoveAll(filepath.Join(dir, name) + ".db") - if err != nil { - panic(err) - } -} - func testBackendGetSetDelete(t *testing.T, backend BackendType) { // Default dirname, err := ioutil.TempDir("", fmt.Sprintf("test_backend_%s_", backend)) require.Nil(t, err) db, err := NewDB("testdb", backend, dirname) require.NoError(t, err) - defer cleanupDBDir(dirname, "testdb") + defer dbtest.CleanupDBDir(dirname, "testdb") // A nonexistent key should return nil. value, err := db.Get([]byte("a")) @@ -93,38 +91,38 @@ func testBackendGetSetDelete(t *testing.T, backend BackendType) { // Setting, getting, and deleting an empty key should error. _, err = db.Get([]byte{}) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) _, err = db.Get(nil) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) _, err = db.Has([]byte{}) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) _, err = db.Has(nil) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) err = db.Set([]byte{}, []byte{0x01}) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) err = db.Set(nil, []byte{0x01}) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) err = db.SetSync([]byte{}, []byte{0x01}) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) err = db.SetSync(nil, []byte{0x01}) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) err = db.Delete([]byte{}) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) err = db.Delete(nil) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) err = db.DeleteSync([]byte{}) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) err = db.DeleteSync(nil) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) // Setting a nil value should error, but an empty value is fine. err = db.Set([]byte("x"), nil) - require.Equal(t, errValueNil, err) + require.Equal(t, tmdb.ErrValueNil, err) err = db.SetSync([]byte("x"), nil) - require.Equal(t, errValueNil, err) + require.Equal(t, tmdb.ErrValueNil, err) err = db.Set([]byte("x"), []byte{}) require.NoError(t, err) @@ -144,15 +142,74 @@ func TestBackendsGetSetDelete(t *testing.T) { } func TestGoLevelDBBackend(t *testing.T) { - name := fmt.Sprintf("test_%x", randStr(12)) + if _, ok := backends[GoLevelDBBackend]; !ok { + t.Skip("skipping since -tags=goleveldb was not used") + } + name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) db, err := NewDB(name, GoLevelDBBackend, "") require.NoError(t, err) - defer cleanupDBDir("", name) + defer dbtest.CleanupDBDir("", name) + + _, ok := db.(*goleveldb.GoLevelDB) + assert.True(t, ok) +} + +func TestCLevelDBBackend(t *testing.T) { + if _, ok := backends[CLevelDBBackend]; !ok { + t.Skip("skipping since -tags=cleveldb was not used") + } + name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) + // Can't use "" (current directory) or "./" here because levigo.Open returns: + // "Error initializing DB: IO error: test_XXX.db: Invalid argument" + dir := os.TempDir() + db, err := NewDB(name, CLevelDBBackend, dir) + require.NoError(t, err) + defer dbtest.CleanupDBDir(dir, name) + + _, ok := db.(*cleveldb.CLevelDB) + assert.True(t, ok) +} + +func TestCLevelDBStats(t *testing.T) { + if _, ok := backends[CLevelDBBackend]; !ok { + t.Skip("skipping since -tags=cleveldb was not used") + } + name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) + dir := os.TempDir() + db, err := NewDB(name, CLevelDBBackend, dir) + require.NoError(t, err) + defer dbtest.CleanupDBDir(dir, name) + + assert.NotEmpty(t, db.Stats()) +} - _, ok := db.(*GoLevelDB) +func TestRocksDBBackend(t *testing.T) { + if _, ok := backends[RocksDBBackend]; !ok { + t.Skip("skipping since -tags=rocksdb was not used") + } + name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) + dir := os.TempDir() + db, err := NewDB(name, RocksDBBackend, dir) + require.NoError(t, err) + defer dbtest.CleanupDBDir(dir, name) + + _, ok := db.(*rocksdb.RocksDB) assert.True(t, ok) } +func TestRocksDBStats(t *testing.T) { + if _, ok := backends[RocksDBBackend]; !ok { + t.Skip("skipping since -tags=rocksdb was not used") + } + name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) + dir := os.TempDir() + db, err := NewDB(name, RocksDBBackend, dir) + require.NoError(t, err) + defer dbtest.CleanupDBDir(dir, name) + + assert.NotEmpty(t, db.Stats()) +} + func TestDBIterator(t *testing.T) { for dbType := range backends { t.Run(string(dbType), func(t *testing.T) { @@ -162,28 +219,28 @@ func TestDBIterator(t *testing.T) { } func testDBIterator(t *testing.T, backend BackendType) { - name := fmt.Sprintf("test_%x", randStr(12)) + name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) dir := os.TempDir() db, err := NewDB(name, backend, dir) require.NoError(t, err) - defer cleanupDBDir(dir, name) + defer dbtest.CleanupDBDir(dir, name) for i := 0; i < 10; i++ { if i != 6 { // but skip 6. - err := db.Set(int642Bytes(int64(i)), []byte{}) + err := db.Set(dbtest.Int642Bytes(int64(i)), []byte{}) require.NoError(t, err) } } // Blank iterator keys should error _, err = db.Iterator([]byte{}, nil) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) _, err = db.Iterator(nil, []byte{}) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) _, err = db.ReverseIterator([]byte{}, nil) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) _, err = db.ReverseIterator(nil, []byte{}) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) itr, err := db.Iterator(nil, nil) require.NoError(t, err) @@ -193,110 +250,110 @@ func testDBIterator(t *testing.T, backend BackendType) { require.NoError(t, err) verifyIterator(t, ritr, []int64{9, 8, 7, 5, 4, 3, 2, 1, 0}, "reverse iterator") - itr, err = db.Iterator(nil, int642Bytes(0)) + itr, err = db.Iterator(nil, dbtest.Int642Bytes(0)) require.NoError(t, err) verifyIterator(t, itr, []int64(nil), "forward iterator to 0") - ritr, err = db.ReverseIterator(int642Bytes(10), nil) + ritr, err = db.ReverseIterator(dbtest.Int642Bytes(10), nil) require.NoError(t, err) verifyIterator(t, ritr, []int64(nil), "reverse iterator from 10 (ex)") - itr, err = db.Iterator(int642Bytes(0), nil) + itr, err = db.Iterator(dbtest.Int642Bytes(0), nil) require.NoError(t, err) verifyIterator(t, itr, []int64{0, 1, 2, 3, 4, 5, 7, 8, 9}, "forward iterator from 0") - itr, err = db.Iterator(int642Bytes(1), nil) + itr, err = db.Iterator(dbtest.Int642Bytes(1), nil) require.NoError(t, err) verifyIterator(t, itr, []int64{1, 2, 3, 4, 5, 7, 8, 9}, "forward iterator from 1") - ritr, err = db.ReverseIterator(nil, int642Bytes(10)) + ritr, err = db.ReverseIterator(nil, dbtest.Int642Bytes(10)) require.NoError(t, err) verifyIterator(t, ritr, []int64{9, 8, 7, 5, 4, 3, 2, 1, 0}, "reverse iterator from 10 (ex)") - ritr, err = db.ReverseIterator(nil, int642Bytes(9)) + ritr, err = db.ReverseIterator(nil, dbtest.Int642Bytes(9)) require.NoError(t, err) verifyIterator(t, ritr, []int64{8, 7, 5, 4, 3, 2, 1, 0}, "reverse iterator from 9 (ex)") - ritr, err = db.ReverseIterator(nil, int642Bytes(8)) + ritr, err = db.ReverseIterator(nil, dbtest.Int642Bytes(8)) require.NoError(t, err) verifyIterator(t, ritr, []int64{7, 5, 4, 3, 2, 1, 0}, "reverse iterator from 8 (ex)") - itr, err = db.Iterator(int642Bytes(5), int642Bytes(6)) + itr, err = db.Iterator(dbtest.Int642Bytes(5), dbtest.Int642Bytes(6)) require.NoError(t, err) verifyIterator(t, itr, []int64{5}, "forward iterator from 5 to 6") - itr, err = db.Iterator(int642Bytes(5), int642Bytes(7)) + itr, err = db.Iterator(dbtest.Int642Bytes(5), dbtest.Int642Bytes(7)) require.NoError(t, err) verifyIterator(t, itr, []int64{5}, "forward iterator from 5 to 7") - itr, err = db.Iterator(int642Bytes(5), int642Bytes(8)) + itr, err = db.Iterator(dbtest.Int642Bytes(5), dbtest.Int642Bytes(8)) require.NoError(t, err) verifyIterator(t, itr, []int64{5, 7}, "forward iterator from 5 to 8") - itr, err = db.Iterator(int642Bytes(6), int642Bytes(7)) + itr, err = db.Iterator(dbtest.Int642Bytes(6), dbtest.Int642Bytes(7)) require.NoError(t, err) verifyIterator(t, itr, []int64(nil), "forward iterator from 6 to 7") - itr, err = db.Iterator(int642Bytes(6), int642Bytes(8)) + itr, err = db.Iterator(dbtest.Int642Bytes(6), dbtest.Int642Bytes(8)) require.NoError(t, err) verifyIterator(t, itr, []int64{7}, "forward iterator from 6 to 8") - itr, err = db.Iterator(int642Bytes(7), int642Bytes(8)) + itr, err = db.Iterator(dbtest.Int642Bytes(7), dbtest.Int642Bytes(8)) require.NoError(t, err) verifyIterator(t, itr, []int64{7}, "forward iterator from 7 to 8") - ritr, err = db.ReverseIterator(int642Bytes(4), int642Bytes(5)) + ritr, err = db.ReverseIterator(dbtest.Int642Bytes(4), dbtest.Int642Bytes(5)) require.NoError(t, err) verifyIterator(t, ritr, []int64{4}, "reverse iterator from 5 (ex) to 4") - ritr, err = db.ReverseIterator(int642Bytes(4), int642Bytes(6)) + ritr, err = db.ReverseIterator(dbtest.Int642Bytes(4), dbtest.Int642Bytes(6)) require.NoError(t, err) verifyIterator(t, ritr, []int64{5, 4}, "reverse iterator from 6 (ex) to 4") - ritr, err = db.ReverseIterator(int642Bytes(4), int642Bytes(7)) + ritr, err = db.ReverseIterator(dbtest.Int642Bytes(4), dbtest.Int642Bytes(7)) require.NoError(t, err) verifyIterator(t, ritr, []int64{5, 4}, "reverse iterator from 7 (ex) to 4") - ritr, err = db.ReverseIterator(int642Bytes(5), int642Bytes(6)) + ritr, err = db.ReverseIterator(dbtest.Int642Bytes(5), dbtest.Int642Bytes(6)) require.NoError(t, err) verifyIterator(t, ritr, []int64{5}, "reverse iterator from 6 (ex) to 5") - ritr, err = db.ReverseIterator(int642Bytes(5), int642Bytes(7)) + ritr, err = db.ReverseIterator(dbtest.Int642Bytes(5), dbtest.Int642Bytes(7)) require.NoError(t, err) verifyIterator(t, ritr, []int64{5}, "reverse iterator from 7 (ex) to 5") - ritr, err = db.ReverseIterator(int642Bytes(6), int642Bytes(7)) + ritr, err = db.ReverseIterator(dbtest.Int642Bytes(6), dbtest.Int642Bytes(7)) require.NoError(t, err) verifyIterator(t, ritr, []int64(nil), "reverse iterator from 7 (ex) to 6") - ritr, err = db.ReverseIterator(int642Bytes(10), nil) + ritr, err = db.ReverseIterator(dbtest.Int642Bytes(10), nil) require.NoError(t, err) verifyIterator(t, ritr, []int64(nil), "reverse iterator to 10") - ritr, err = db.ReverseIterator(int642Bytes(6), nil) + ritr, err = db.ReverseIterator(dbtest.Int642Bytes(6), nil) require.NoError(t, err) verifyIterator(t, ritr, []int64{9, 8, 7}, "reverse iterator to 6") - ritr, err = db.ReverseIterator(int642Bytes(5), nil) + ritr, err = db.ReverseIterator(dbtest.Int642Bytes(5), nil) require.NoError(t, err) verifyIterator(t, ritr, []int64{9, 8, 7, 5}, "reverse iterator to 5") - ritr, err = db.ReverseIterator(int642Bytes(8), int642Bytes(9)) + ritr, err = db.ReverseIterator(dbtest.Int642Bytes(8), dbtest.Int642Bytes(9)) require.NoError(t, err) verifyIterator(t, ritr, []int64{8}, "reverse iterator from 9 (ex) to 8") - ritr, err = db.ReverseIterator(int642Bytes(2), int642Bytes(4)) + ritr, err = db.ReverseIterator(dbtest.Int642Bytes(2), dbtest.Int642Bytes(4)) require.NoError(t, err) verifyIterator(t, ritr, []int64{3, 2}, "reverse iterator from 4 (ex) to 2") - ritr, err = db.ReverseIterator(int642Bytes(4), int642Bytes(2)) + ritr, err = db.ReverseIterator(dbtest.Int642Bytes(4), dbtest.Int642Bytes(2)) require.NoError(t, err) verifyIterator(t, ritr, []int64(nil), "reverse iterator from 2 (ex) to 4") @@ -306,7 +363,7 @@ func testDBIterator(t *testing.T, backend BackendType) { require.NoError(t, err) db2, err := NewDB(name, backend, dir2) require.NoError(t, err) - defer cleanupDBDir(dir2, name) + defer dbtest.CleanupDBDir(dir2, name) itr, err = db2.Iterator(nil, nil) require.NoError(t, err) @@ -318,11 +375,11 @@ func testDBIterator(t *testing.T, backend BackendType) { } -func verifyIterator(t *testing.T, itr Iterator, expected []int64, msg string) { +func verifyIterator(t *testing.T, itr tmdb.Iterator, expected []int64, msg string) { var list []int64 for itr.Valid() { key := itr.Key() - list = append(list, bytes2Int64(key)) + list = append(list, dbtest.Bytes2Int64(key)) itr.Next() } assert.Equal(t, expected, list, msg) @@ -337,11 +394,11 @@ func TestDBBatch(t *testing.T) { } func testDBBatch(t *testing.T, backend BackendType) { - name := fmt.Sprintf("test_%x", randStr(12)) + name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) dir := os.TempDir() db, err := NewDB(name, backend, dir) require.NoError(t, err) - defer cleanupDBDir(dir, name) + defer dbtest.CleanupDBDir(dir, name) // create a new batch, and some items - they should not be visible until we write batch := db.NewBatch() @@ -376,16 +433,16 @@ func testDBBatch(t *testing.T, backend BackendType) { // empty and nil keys, as well as nil values, should be disallowed batch = db.NewBatch() err = batch.Set([]byte{}, []byte{0x01}) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) err = batch.Set(nil, []byte{0x01}) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) err = batch.Set([]byte("a"), nil) - require.Equal(t, errValueNil, err) + require.Equal(t, tmdb.ErrValueNil, err) err = batch.Delete([]byte{}) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) err = batch.Delete(nil) - require.Equal(t, errKeyEmpty, err) + require.Equal(t, tmdb.ErrKeyEmpty, err) err = batch.Close() require.NoError(t, err) @@ -408,7 +465,7 @@ func testDBBatch(t *testing.T, backend BackendType) { require.Error(t, batch.WriteSync()) } -func assertKeyValues(t *testing.T, db DB, expect map[string][]byte) { +func assertKeyValues(t *testing.T, db tmdb.DB, expect map[string][]byte) { iter, err := db.Iterator(nil, nil) require.NoError(t, err) defer iter.Close() diff --git a/db.go b/metadb/db.go similarity index 80% rename from db.go rename to metadb/db.go index 4d518c0b0..58951f4e0 100644 --- a/db.go +++ b/metadb/db.go @@ -1,8 +1,10 @@ -package db +package metadb import ( "fmt" "strings" + + tmdb "github.com/tendermint/tm-db" ) type BackendType string @@ -13,6 +15,7 @@ const ( // popular implementation) // - pure go // - stable + // - use goleveldb build tag (go build -tags goleveldb) GoLevelDBBackend BackendType = "goleveldb" // CLevelDBBackend represents cleveldb (uses levigo wrapper) // - fast @@ -21,6 +24,7 @@ const ( CLevelDBBackend BackendType = "cleveldb" // MemDBBackend represents in-memory key value store, which is mostly used // for testing. + // - use memdb build tag (go build -tags memdb) MemDBBackend BackendType = "memdb" // BoltDBBackend represents bolt (uses etcd's fork of bolt - // github.com/etcd-io/bbolt) @@ -33,11 +37,13 @@ const ( // - requires gcc // - use rocksdb build tag (go build -tags rocksdb) RocksDBBackend BackendType = "rocksdb" - + // BadgerDBBackend represents badger (uses github.com/dgraph-io/badger/v2) + // - EXPERIMENTAL + // - use badgerdb build tag (go build -tags badgerdb) BadgerDBBackend BackendType = "badgerdb" ) -type dbCreator func(name string, dir string) (DB, error) +type dbCreator func(name string, dir string) (tmdb.DB, error) var backends = map[BackendType]dbCreator{} @@ -50,7 +56,7 @@ func registerDBCreator(backend BackendType, creator dbCreator, force bool) { } // NewDB creates a new database of type backend with the given name. -func NewDB(name string, backend BackendType, dir string) (DB, error) { +func NewDB(name string, backend BackendType, dir string) (tmdb.DB, error) { dbCreator, ok := backends[backend] if !ok { keys := make([]string, 0, len(backends)) diff --git a/metadb/db_badgerdb.go b/metadb/db_badgerdb.go new file mode 100644 index 000000000..ee45ae910 --- /dev/null +++ b/metadb/db_badgerdb.go @@ -0,0 +1,14 @@ +// +build badgerdb + +package metadb + +import ( + tmdb "github.com/tendermint/tm-db" + "github.com/tendermint/tm-db/badgerdb" +) + +func badgerDBCreator(name, dir string) (tmdb.DB, error) { + return badgerdb.NewDB(name, dir) +} + +func init() { registerDBCreator(BadgerDBBackend, badgerDBCreator, true) } diff --git a/metadb/db_boltdb.go b/metadb/db_boltdb.go new file mode 100644 index 000000000..afcc92aab --- /dev/null +++ b/metadb/db_boltdb.go @@ -0,0 +1,14 @@ +// +build boltdb + +package metadb + +import ( + tmdb "github.com/tendermint/tm-db" + "github.com/tendermint/tm-db/boltdb" +) + +func boltDBCreator(name, dir string) (tmdb.DB, error) { + return boltdb.NewDB(name, dir) +} + +func init() { registerDBCreator(BoltDBBackend, boltDBCreator, true) } diff --git a/metadb/db_cleveldb.go b/metadb/db_cleveldb.go new file mode 100644 index 000000000..bed0bdb46 --- /dev/null +++ b/metadb/db_cleveldb.go @@ -0,0 +1,14 @@ +// +build cleveldb + +package metadb + +import ( + tmdb "github.com/tendermint/tm-db" + "github.com/tendermint/tm-db/cleveldb" +) + +func clevelDBCreator(name string, dir string) (tmdb.DB, error) { + return cleveldb.NewDB(name, dir) +} + +func init() { registerDBCreator(CLevelDBBackend, clevelDBCreator, false) } diff --git a/metadb/db_goleveldb.go b/metadb/db_goleveldb.go new file mode 100644 index 000000000..d4ee7b5c1 --- /dev/null +++ b/metadb/db_goleveldb.go @@ -0,0 +1,14 @@ +// +build goleveldb + +package metadb + +import ( + tmdb "github.com/tendermint/tm-db" + "github.com/tendermint/tm-db/goleveldb" +) + +func golevelDBCreator(name, dir string) (tmdb.DB, error) { + return goleveldb.NewDB(name, dir) +} + +func init() { registerDBCreator(GoLevelDBBackend, golevelDBCreator, true) } diff --git a/metadb/db_memdb.go b/metadb/db_memdb.go new file mode 100644 index 000000000..4273f5402 --- /dev/null +++ b/metadb/db_memdb.go @@ -0,0 +1,14 @@ +// +build memdb + +package metadb + +import ( + tmdb "github.com/tendermint/tm-db" + "github.com/tendermint/tm-db/memdb" +) + +func memdbDBCreator(name, dir string) (tmdb.DB, error) { + return memdb.NewDB(), nil +} + +func init() { registerDBCreator(MemDBBackend, memdbDBCreator, false) } diff --git a/metadb/db_rocksdb.go b/metadb/db_rocksdb.go new file mode 100644 index 000000000..98f1b6162 --- /dev/null +++ b/metadb/db_rocksdb.go @@ -0,0 +1,14 @@ +// +build rocksdb + +package metadb + +import ( + tmdb "github.com/tendermint/tm-db" + "github.com/tendermint/tm-db/rocksdb" +) + +func rocksDBCreator(name, dir string) (tmdb.DB, error) { + return rocksdb.NewDB(name, dir) +} + +func init() { registerDBCreator(RocksDBBackend, rocksDBCreator, true) } diff --git a/db_test.go b/metadb/db_test.go similarity index 74% rename from db_test.go rename to metadb/db_test.go index dc81d663b..02fd4f43c 100644 --- a/db_test.go +++ b/metadb/db_test.go @@ -1,4 +1,4 @@ -package db +package metadb import ( "fmt" @@ -6,6 +6,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/tendermint/tm-db/internal/dbtest" ) func TestDBIteratorSingleKey(t *testing.T) { @@ -14,18 +15,18 @@ func TestDBIteratorSingleKey(t *testing.T) { db, dir := newTempDB(t, backend) defer os.RemoveAll(dir) - err := db.SetSync(bz("1"), bz("value_1")) + err := db.SetSync([]byte("1"), []byte("value_1")) assert.NoError(t, err) itr, err := db.Iterator(nil, nil) assert.NoError(t, err) - checkValid(t, itr, true) - checkNext(t, itr, false) - checkValid(t, itr, false) - checkNextPanics(t, itr) + dbtest.Valid(t, itr, true) + dbtest.Next(t, itr, false) + dbtest.Valid(t, itr, false) + dbtest.NextPanics(t, itr) // Once invalid... - checkInvalid(t, itr) + dbtest.Invalid(t, itr) }) } } @@ -36,27 +37,27 @@ func TestDBIteratorTwoKeys(t *testing.T) { db, dir := newTempDB(t, backend) defer os.RemoveAll(dir) - err := db.SetSync(bz("1"), bz("value_1")) + err := db.SetSync([]byte("1"), []byte("value_1")) assert.NoError(t, err) - err = db.SetSync(bz("2"), bz("value_1")) + err = db.SetSync([]byte("2"), []byte("value_1")) assert.NoError(t, err) { // Fail by calling Next too much itr, err := db.Iterator(nil, nil) assert.NoError(t, err) - checkValid(t, itr, true) + dbtest.Valid(t, itr, true) - checkNext(t, itr, true) - checkValid(t, itr, true) + dbtest.Next(t, itr, true) + dbtest.Valid(t, itr, true) - checkNext(t, itr, false) - checkValid(t, itr, false) + dbtest.Next(t, itr, false) + dbtest.Valid(t, itr, false) - checkNextPanics(t, itr) + dbtest.NextPanics(t, itr) // Once invalid... - checkInvalid(t, itr) + dbtest.Invalid(t, itr) } }) } @@ -103,7 +104,7 @@ func TestDBIteratorEmpty(t *testing.T) { itr, err := db.Iterator(nil, nil) assert.NoError(t, err) - checkInvalid(t, itr) + dbtest.Invalid(t, itr) }) } } @@ -114,10 +115,10 @@ func TestDBIteratorEmptyBeginAfter(t *testing.T) { db, dir := newTempDB(t, backend) defer os.RemoveAll(dir) - itr, err := db.Iterator(bz("1"), nil) + itr, err := db.Iterator([]byte("1"), nil) assert.NoError(t, err) - checkInvalid(t, itr) + dbtest.Invalid(t, itr) }) } } @@ -128,12 +129,12 @@ func TestDBIteratorNonemptyBeginAfter(t *testing.T) { db, dir := newTempDB(t, backend) defer os.RemoveAll(dir) - err := db.SetSync(bz("1"), bz("value_1")) + err := db.SetSync([]byte("1"), []byte("value_1")) assert.NoError(t, err) - itr, err := db.Iterator(bz("2"), nil) + itr, err := db.Iterator([]byte("2"), nil) assert.NoError(t, err) - checkInvalid(t, itr) + dbtest.Invalid(t, itr) }) } } diff --git a/util_test.go b/metadb/util_test.go similarity index 56% rename from util_test.go rename to metadb/util_test.go index d58cd2fd7..77b69cf22 100644 --- a/util_test.go +++ b/metadb/util_test.go @@ -1,11 +1,15 @@ -package db +package metadb import ( "fmt" + "io/ioutil" "os" "testing" "github.com/stretchr/testify/require" + + tmdb "github.com/tendermint/tm-db" + "github.com/tendermint/tm-db/internal/dbtest" ) // Empty iterator for empty db. @@ -14,10 +18,10 @@ func TestPrefixIteratorNoMatchNil(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) - itr, err := IteratePrefix(db, []byte("2")) + itr, err := tmdb.IteratePrefix(db, []byte("2")) require.NoError(t, err) - checkInvalid(t, itr) + dbtest.Invalid(t, itr) }) } } @@ -33,12 +37,12 @@ func TestPrefixIteratorNoMatch1(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) - itr, err := IteratePrefix(db, []byte("2")) + itr, err := tmdb.IteratePrefix(db, []byte("2")) require.NoError(t, err) - err = db.SetSync(bz("1"), bz("value_1")) + err = db.SetSync([]byte("1"), []byte("value_1")) require.NoError(t, err) - checkInvalid(t, itr) + dbtest.Invalid(t, itr) }) } } @@ -49,12 +53,12 @@ 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([]byte("3"), []byte("value_3")) require.NoError(t, err) - itr, err := IteratePrefix(db, []byte("4")) + itr, err := tmdb.IteratePrefix(db, []byte("4")) require.NoError(t, err) - checkInvalid(t, itr) + dbtest.Invalid(t, itr) }) } } @@ -65,17 +69,17 @@ 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([]byte("2"), []byte("value_2")) require.NoError(t, err) - itr, err := IteratePrefix(db, bz("2")) + itr, err := tmdb.IteratePrefix(db, []byte("2")) require.NoError(t, err) - checkValid(t, itr, true) - checkItem(t, itr, bz("2"), bz("value_2")) - checkNext(t, itr, false) + dbtest.Valid(t, itr, true) + dbtest.Item(t, itr, []byte("2"), []byte("value_2")) + dbtest.Next(t, itr, false) // Once invalid... - checkInvalid(t, itr) + dbtest.Invalid(t, itr) }) } } @@ -88,33 +92,41 @@ func TestPrefixIteratorMatches1N(t *testing.T) { defer os.RemoveAll(dir) // prefixed - err := db.SetSync(bz("a/1"), bz("value_1")) + err := db.SetSync([]byte("a/1"), []byte("value_1")) require.NoError(t, err) - err = db.SetSync(bz("a/3"), bz("value_3")) + err = db.SetSync([]byte("a/3"), []byte("value_3")) require.NoError(t, err) // not - err = db.SetSync(bz("b/3"), bz("value_3")) + err = db.SetSync([]byte("b/3"), []byte("value_3")) require.NoError(t, err) - err = db.SetSync(bz("a-3"), bz("value_3")) + err = db.SetSync([]byte("a-3"), []byte("value_3")) require.NoError(t, err) - err = db.SetSync(bz("a.3"), bz("value_3")) + err = db.SetSync([]byte("a.3"), []byte("value_3")) require.NoError(t, err) - err = db.SetSync(bz("abcdefg"), bz("value_3")) + err = db.SetSync([]byte("abcdefg"), []byte("value_3")) require.NoError(t, err) - itr, err := IteratePrefix(db, bz("a/")) + itr, err := tmdb.IteratePrefix(db, []byte("a/")) require.NoError(t, err) - checkValid(t, itr, true) - checkItem(t, itr, bz("a/1"), bz("value_1")) - checkNext(t, itr, true) - checkItem(t, itr, bz("a/3"), bz("value_3")) + dbtest.Valid(t, itr, true) + dbtest.Item(t, itr, []byte("a/1"), []byte("value_1")) + dbtest.Next(t, itr, true) + dbtest.Item(t, itr, []byte("a/3"), []byte("value_3")) // Bad! - checkNext(t, itr, false) + dbtest.Next(t, itr, false) - //Once invalid... - checkInvalid(t, itr) + // Once invalid... + dbtest.Invalid(t, itr) }) } } + +func newTempDB(t *testing.T, backend BackendType) (db tmdb.DB, dbDir string) { + dirname, err := ioutil.TempDir("", "db_common_test") + require.NoError(t, err) + db, err = NewDB("testdb", backend, dirname) + require.NoError(t, err) + return db, dirname +} diff --git a/prefixdb.go b/prefixdb.go index 0b2d2a1cf..fd3386e51 100644 --- a/prefixdb.go +++ b/prefixdb.go @@ -25,7 +25,7 @@ func NewPrefixDB(db DB, prefix []byte) *PrefixDB { // Get implements DB. func (pdb *PrefixDB) Get(key []byte) ([]byte, error) { if len(key) == 0 { - return nil, errKeyEmpty + return nil, ErrKeyEmpty } pdb.mtx.Lock() defer pdb.mtx.Unlock() @@ -41,7 +41,7 @@ func (pdb *PrefixDB) Get(key []byte) ([]byte, error) { // Has implements DB. func (pdb *PrefixDB) Has(key []byte) (bool, error) { if len(key) == 0 { - return false, errKeyEmpty + return false, ErrKeyEmpty } pdb.mtx.Lock() defer pdb.mtx.Unlock() @@ -57,10 +57,10 @@ func (pdb *PrefixDB) Has(key []byte) (bool, error) { // Set implements DB. func (pdb *PrefixDB) Set(key []byte, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return ErrKeyEmpty } if value == nil { - return errValueNil + return ErrValueNil } pdb.mtx.Lock() defer pdb.mtx.Unlock() @@ -75,10 +75,10 @@ func (pdb *PrefixDB) Set(key []byte, value []byte) error { // SetSync implements DB. func (pdb *PrefixDB) SetSync(key []byte, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return ErrKeyEmpty } if value == nil { - return errValueNil + return ErrValueNil } pdb.mtx.Lock() defer pdb.mtx.Unlock() @@ -89,7 +89,7 @@ func (pdb *PrefixDB) SetSync(key []byte, value []byte) error { // Delete implements DB. func (pdb *PrefixDB) Delete(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return ErrKeyEmpty } pdb.mtx.Lock() defer pdb.mtx.Unlock() @@ -100,7 +100,7 @@ func (pdb *PrefixDB) Delete(key []byte) error { // DeleteSync implements DB. func (pdb *PrefixDB) DeleteSync(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return ErrKeyEmpty } pdb.mtx.Lock() defer pdb.mtx.Unlock() @@ -111,7 +111,7 @@ func (pdb *PrefixDB) DeleteSync(key []byte) error { // Iterator implements DB. func (pdb *PrefixDB) Iterator(start, end []byte) (Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, errKeyEmpty + return nil, ErrKeyEmpty } pdb.mtx.Lock() defer pdb.mtx.Unlock() @@ -134,7 +134,7 @@ func (pdb *PrefixDB) Iterator(start, end []byte) (Iterator, error) { // ReverseIterator implements DB. func (pdb *PrefixDB) ReverseIterator(start, end []byte) (Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, errKeyEmpty + return nil, ErrKeyEmpty } pdb.mtx.Lock() defer pdb.mtx.Unlock() diff --git a/prefixdb_batch.go b/prefixdb_batch.go index 1a8005cad..089dd1adf 100644 --- a/prefixdb_batch.go +++ b/prefixdb_batch.go @@ -17,10 +17,10 @@ func newPrefixBatch(prefix []byte, source Batch) prefixDBBatch { // Set implements Batch. func (pb prefixDBBatch) Set(key, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return ErrKeyEmpty } if value == nil { - return errValueNil + return ErrValueNil } pkey := append(cp(pb.prefix), key...) return pb.source.Set(pkey, value) @@ -29,7 +29,7 @@ func (pb prefixDBBatch) Set(key, value []byte) error { // Delete implements Batch. func (pb prefixDBBatch) Delete(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return ErrKeyEmpty } pkey := append(cp(pb.prefix), key...) return pb.source.Delete(pkey) diff --git a/prefixdb_test.go b/prefixdb_test.go index 3fc53ee92..b972c9bd3 100644 --- a/prefixdb_test.go +++ b/prefixdb_test.go @@ -1,117 +1,120 @@ -package db +package db_test import ( "testing" "github.com/stretchr/testify/require" + tmdb "github.com/tendermint/tm-db" + "github.com/tendermint/tm-db/internal/dbtest" + "github.com/tendermint/tm-db/memdb" ) -func mockDBWithStuff(t *testing.T) DB { - db := NewMemDB() +func mockDBWithStuff(t *testing.T) tmdb.DB { + db := memdb.NewDB() // 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([]byte("key"), []byte("value"))) + require.NoError(t, db.Set([]byte("key1"), []byte("value1"))) + require.NoError(t, db.Set([]byte("key2"), []byte("value2"))) + require.NoError(t, db.Set([]byte("key3"), []byte("value3"))) + require.NoError(t, db.Set([]byte("something"), []byte("else"))) + require.NoError(t, db.Set([]byte("k"), []byte("val"))) + require.NoError(t, db.Set([]byte("ke"), []byte("valu"))) + require.NoError(t, db.Set([]byte("kee"), []byte("valuu"))) return db } func TestPrefixDBSimple(t *testing.T) { db := mockDBWithStuff(t) - pdb := NewPrefixDB(db, bz("key")) + pdb := tmdb.NewPrefixDB(db, []byte("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) + dbtest.Value(t, pdb, []byte("key"), nil) + dbtest.Value(t, pdb, []byte("key1"), nil) + dbtest.Value(t, pdb, []byte("1"), []byte("value1")) + dbtest.Value(t, pdb, []byte("key2"), nil) + dbtest.Value(t, pdb, []byte("2"), []byte("value2")) + dbtest.Value(t, pdb, []byte("key3"), nil) + dbtest.Value(t, pdb, []byte("3"), []byte("value3")) + dbtest.Value(t, pdb, []byte("something"), nil) + dbtest.Value(t, pdb, []byte("k"), nil) + dbtest.Value(t, pdb, []byte("ke"), nil) + dbtest.Value(t, pdb, []byte("kee"), nil) } func TestPrefixDBIterator1(t *testing.T) { db := mockDBWithStuff(t) - pdb := NewPrefixDB(db, bz("key")) + pdb := tmdb.NewPrefixDB(db, []byte("key")) itr, err := pdb.Iterator(nil, nil) require.NoError(t, err) - checkDomain(t, itr, nil, nil) - checkItem(t, itr, bz("1"), bz("value1")) - checkNext(t, itr, true) - checkItem(t, itr, bz("2"), bz("value2")) - checkNext(t, itr, true) - checkItem(t, itr, bz("3"), bz("value3")) - checkNext(t, itr, false) - checkInvalid(t, itr) + dbtest.Domain(t, itr, nil, nil) + dbtest.Item(t, itr, []byte("1"), []byte("value1")) + dbtest.Next(t, itr, true) + dbtest.Item(t, itr, []byte("2"), []byte("value2")) + dbtest.Next(t, itr, true) + dbtest.Item(t, itr, []byte("3"), []byte("value3")) + dbtest.Next(t, itr, false) + dbtest.Invalid(t, itr) itr.Close() } func TestPrefixDBReverseIterator1(t *testing.T) { db := mockDBWithStuff(t) - pdb := NewPrefixDB(db, bz("key")) + pdb := tmdb.NewPrefixDB(db, []byte("key")) itr, err := pdb.ReverseIterator(nil, nil) require.NoError(t, err) - checkDomain(t, itr, nil, nil) - checkItem(t, itr, bz("3"), bz("value3")) - checkNext(t, itr, true) - checkItem(t, itr, bz("2"), bz("value2")) - checkNext(t, itr, true) - checkItem(t, itr, bz("1"), bz("value1")) - checkNext(t, itr, false) - checkInvalid(t, itr) + dbtest.Domain(t, itr, nil, nil) + dbtest.Item(t, itr, []byte("3"), []byte("value3")) + dbtest.Next(t, itr, true) + dbtest.Item(t, itr, []byte("2"), []byte("value2")) + dbtest.Next(t, itr, true) + dbtest.Item(t, itr, []byte("1"), []byte("value1")) + dbtest.Next(t, itr, false) + dbtest.Invalid(t, itr) itr.Close() } func TestPrefixDBReverseIterator5(t *testing.T) { db := mockDBWithStuff(t) - pdb := NewPrefixDB(db, bz("key")) + pdb := tmdb.NewPrefixDB(db, []byte("key")) - itr, err := pdb.ReverseIterator(bz("1"), nil) + itr, err := pdb.ReverseIterator([]byte("1"), nil) require.NoError(t, err) - checkDomain(t, itr, bz("1"), nil) - checkItem(t, itr, bz("3"), bz("value3")) - checkNext(t, itr, true) - checkItem(t, itr, bz("2"), bz("value2")) - checkNext(t, itr, true) - checkItem(t, itr, bz("1"), bz("value1")) - checkNext(t, itr, false) - checkInvalid(t, itr) + dbtest.Domain(t, itr, []byte("1"), nil) + dbtest.Item(t, itr, []byte("3"), []byte("value3")) + dbtest.Next(t, itr, true) + dbtest.Item(t, itr, []byte("2"), []byte("value2")) + dbtest.Next(t, itr, true) + dbtest.Item(t, itr, []byte("1"), []byte("value1")) + dbtest.Next(t, itr, false) + dbtest.Invalid(t, itr) itr.Close() } func TestPrefixDBReverseIterator6(t *testing.T) { db := mockDBWithStuff(t) - pdb := NewPrefixDB(db, bz("key")) + pdb := tmdb.NewPrefixDB(db, []byte("key")) - itr, err := pdb.ReverseIterator(bz("2"), nil) + itr, err := pdb.ReverseIterator([]byte("2"), nil) require.NoError(t, err) - checkDomain(t, itr, bz("2"), nil) - checkItem(t, itr, bz("3"), bz("value3")) - checkNext(t, itr, true) - checkItem(t, itr, bz("2"), bz("value2")) - checkNext(t, itr, false) - checkInvalid(t, itr) + dbtest.Domain(t, itr, []byte("2"), nil) + dbtest.Item(t, itr, []byte("3"), []byte("value3")) + dbtest.Next(t, itr, true) + dbtest.Item(t, itr, []byte("2"), []byte("value2")) + dbtest.Next(t, itr, false) + dbtest.Invalid(t, itr) itr.Close() } func TestPrefixDBReverseIterator7(t *testing.T) { db := mockDBWithStuff(t) - pdb := NewPrefixDB(db, bz("key")) + pdb := tmdb.NewPrefixDB(db, []byte("key")) - itr, err := pdb.ReverseIterator(nil, bz("2")) + itr, err := pdb.ReverseIterator(nil, []byte("2")) require.NoError(t, err) - checkDomain(t, itr, nil, bz("2")) - checkItem(t, itr, bz("1"), bz("value1")) - checkNext(t, itr, false) - checkInvalid(t, itr) + dbtest.Domain(t, itr, nil, []byte("2")) + dbtest.Item(t, itr, []byte("1"), []byte("value1")) + dbtest.Next(t, itr, false) + dbtest.Invalid(t, itr) itr.Close() } diff --git a/remotedb/batch.go b/remotedb/batch.go index fe2becb14..de3d5e8e3 100644 --- a/remotedb/batch.go +++ b/remotedb/batch.go @@ -1,21 +1,18 @@ package remotedb import ( - "errors" "fmt" - db "github.com/tendermint/tm-db" + tmdb "github.com/tendermint/tm-db" protodb "github.com/tendermint/tm-db/remotedb/proto" ) -var errBatchClosed = errors.New("batch has been written or closed") - type batch struct { db *RemoteDB ops []*protodb.Operation } -var _ db.Batch = (*batch)(nil) +var _ tmdb.Batch = (*batch)(nil) func newBatch(rdb *RemoteDB) *batch { return &batch{ @@ -27,7 +24,7 @@ func newBatch(rdb *RemoteDB) *batch { // Set implements Batch. func (b *batch) Set(key, value []byte) error { if b.ops == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } op := &protodb.Operation{ Entity: &protodb.Entity{Key: key, Value: value}, @@ -40,7 +37,7 @@ func (b *batch) Set(key, value []byte) error { // Delete implements Batch. func (b *batch) Delete(key []byte) error { if b.ops == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } op := &protodb.Operation{ Entity: &protodb.Entity{Key: key}, @@ -53,7 +50,7 @@ func (b *batch) Delete(key []byte) error { // Write implements Batch. func (b *batch) Write() error { if b.ops == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } _, err := b.db.dc.BatchWrite(b.db.ctx, &protodb.Batch{Ops: b.ops}) if err != nil { @@ -67,7 +64,7 @@ func (b *batch) Write() error { // WriteSync implements Batch. func (b *batch) WriteSync() error { if b.ops == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } _, err := b.db.dc.BatchWriteSync(b.db.ctx, &protodb.Batch{Ops: b.ops}) if err != nil { diff --git a/remotedb/remotedb.go b/remotedb/db.go similarity index 83% rename from remotedb/remotedb.go rename to remotedb/db.go index 84a57f20f..e79376c8d 100644 --- a/remotedb/remotedb.go +++ b/remotedb/db.go @@ -5,7 +5,7 @@ import ( "errors" "fmt" - db "github.com/tendermint/tm-db" + tmdb "github.com/tendermint/tm-db" "github.com/tendermint/tm-db/remotedb/grpcdb" protodb "github.com/tendermint/tm-db/remotedb/proto" ) @@ -15,11 +15,11 @@ type RemoteDB struct { dc protodb.DBClient } -func NewRemoteDB(serverAddr string, serverKey string) (*RemoteDB, error) { - return newRemoteDB(grpcdb.NewClient(serverAddr, serverKey)) +func NewDB(serverAddr string, serverKey string) (*RemoteDB, error) { + return newDB(grpcdb.NewClient(serverAddr, serverKey)) } -func newRemoteDB(gdc protodb.DBClient, err error) (*RemoteDB, error) { +func newDB(gdc protodb.DBClient, err error) (*RemoteDB, error) { if err != nil { return nil, err } @@ -37,7 +37,7 @@ func (rd *RemoteDB) InitRemote(in *Init) error { return err } -var _ db.DB = (*RemoteDB)(nil) +var _ tmdb.DB = (*RemoteDB)(nil) // Close is a noop currently func (rd *RemoteDB) Close() error { @@ -88,7 +88,7 @@ func (rd *RemoteDB) Has(key []byte) (bool, error) { return res.Exists, nil } -func (rd *RemoteDB) ReverseIterator(start, end []byte) (db.Iterator, error) { +func (rd *RemoteDB) ReverseIterator(start, end []byte) (tmdb.Iterator, error) { dic, err := rd.dc.ReverseIterator(rd.ctx, &protodb.Entity{Start: start, End: end}) if err != nil { return nil, fmt.Errorf("RemoteDB.Iterator error: %w", err) @@ -96,11 +96,11 @@ func (rd *RemoteDB) ReverseIterator(start, end []byte) (db.Iterator, error) { return makeReverseIterator(dic), nil } -func (rd *RemoteDB) NewBatch() db.Batch { +func (rd *RemoteDB) NewBatch() tmdb.Batch { return newBatch(rd) } -// TODO: Implement Print when db.DB implements a method +// TODO: Implement Print when tmdb.DB implements a method // to print to a string and not db.Print to stdout. func (rd *RemoteDB) Print() error { return errors.New("remoteDB.Print: unimplemented") @@ -114,7 +114,7 @@ func (rd *RemoteDB) Stats() map[string]string { return stats.Data } -func (rd *RemoteDB) Iterator(start, end []byte) (db.Iterator, error) { +func (rd *RemoteDB) Iterator(start, end []byte) (tmdb.Iterator, error) { dic, err := rd.dc.Iterator(rd.ctx, &protodb.Entity{Start: start, End: end}) if err != nil { return nil, fmt.Errorf("RemoteDB.Iterator error: %w", err) diff --git a/remotedb/remotedb_test.go b/remotedb/db_test.go similarity index 98% rename from remotedb/remotedb_test.go rename to remotedb/db_test.go index 8407b3004..a4a159f53 100644 --- a/remotedb/remotedb_test.go +++ b/remotedb/db_test.go @@ -26,7 +26,7 @@ func TestRemoteDB(t *testing.T) { } }() - client, err := remotedb.NewRemoteDB(ln.Addr().String(), cert) + client, err := remotedb.NewDB(ln.Addr().String(), cert) require.Nil(t, err, "expecting a successful client creation") dbName := "test-remote-db" require.Nil(t, client.InitRemote(&remotedb.Init{Name: dbName, Type: "goleveldb"})) diff --git a/remotedb/doc.go b/remotedb/doc.go index 93d9c8a29..a1e9e2143 100644 --- a/remotedb/doc.go +++ b/remotedb/doc.go @@ -1,5 +1,5 @@ /* -remotedb is a package for connecting to distributed Tendermint db.DB +remotedb is a package for connecting to distributed Tendermint tmdb.DB instances. The purpose is to detach difficult deployments such as CLevelDB that requires gcc or perhaps for databases that require custom configurations such as extra disk space. It also eases @@ -7,7 +7,7 @@ the burden and cost of deployment of dependencies for databases to be used by Tendermint developers. Most importantly it is built over the high performant gRPC transport. -remotedb's RemoteDB implements db.DB so can be used normally +remotedb's RemoteDB implements tmdb.DB so can be used normally like other databases. One just has to explicitly connect to the remote database with a client setup such as: diff --git a/remotedb/grpcdb/server.go b/remotedb/grpcdb/server.go index 3cedca8c7..54e7d9950 100644 --- a/remotedb/grpcdb/server.go +++ b/remotedb/grpcdb/server.go @@ -10,6 +10,7 @@ import ( "google.golang.org/grpc/credentials" db "github.com/tendermint/tm-db" + "github.com/tendermint/tm-db/metadb" protodb "github.com/tendermint/tm-db/remotedb/proto" ) @@ -64,7 +65,7 @@ func (s *server) Init(ctx context.Context, in *protodb.Init) (*protodb.Entity, e defer s.mu.Unlock() var err error - s.db, err = db.NewDB(in.Name, db.BackendType(in.Type), in.Dir) + s.db, err = metadb.NewDB(in.Name, metadb.BackendType(in.Type), in.Dir) if err != nil { return nil, err } diff --git a/remotedb/iterator.go b/remotedb/iterator.go index 325dc5386..2fb043b47 100644 --- a/remotedb/iterator.go +++ b/remotedb/iterator.go @@ -1,17 +1,17 @@ package remotedb import ( - db "github.com/tendermint/tm-db" + tmdb "github.com/tendermint/tm-db" protodb "github.com/tendermint/tm-db/remotedb/proto" ) -func makeIterator(dic protodb.DB_IteratorClient) db.Iterator { +func makeIterator(dic protodb.DB_IteratorClient) tmdb.Iterator { itr := &iterator{dic: dic} itr.Next() // We need to call Next to prime the iterator return itr } -func makeReverseIterator(dric protodb.DB_ReverseIteratorClient) db.Iterator { +func makeReverseIterator(dric protodb.DB_ReverseIteratorClient) tmdb.Iterator { rItr := &reverseIterator{dric: dric} rItr.Next() // We need to call Next to prime the iterator return rItr @@ -23,7 +23,7 @@ type reverseIterator struct { err error } -var _ db.Iterator = (*iterator)(nil) +var _ tmdb.Iterator = (*iterator)(nil) // Valid implements Iterator. func (rItr *reverseIterator) Valid() bool { @@ -75,7 +75,7 @@ func (rItr *reverseIterator) assertIsValid() { } } -// iterator implements the db.Iterator by retrieving +// iterator implements the tmdb.Iterator by retrieving // streamed iterators from the remote backend as // needed. It is NOT safe for concurrent usage, // matching the behavior of other iterators. @@ -85,7 +85,7 @@ type iterator struct { err error } -var _ db.Iterator = (*iterator)(nil) +var _ tmdb.Iterator = (*iterator)(nil) // Valid implements Iterator. func (itr *iterator) Valid() bool { diff --git a/rocksdb_batch.go b/rocksdb/batch.go similarity index 79% rename from rocksdb_batch.go rename to rocksdb/batch.go index a5d296b40..d41d72b08 100644 --- a/rocksdb_batch.go +++ b/rocksdb/batch.go @@ -1,15 +1,16 @@ -// +build rocksdb +package rocksdb -package db - -import "github.com/tecbot/gorocksdb" +import ( + "github.com/tecbot/gorocksdb" + tmdb "github.com/tendermint/tm-db" +) type rocksDBBatch struct { db *RocksDB batch *gorocksdb.WriteBatch } -var _ Batch = (*rocksDBBatch)(nil) +var _ tmdb.Batch = (*rocksDBBatch)(nil) func newRocksDBBatch(db *RocksDB) *rocksDBBatch { return &rocksDBBatch{ @@ -21,13 +22,13 @@ func newRocksDBBatch(db *RocksDB) *rocksDBBatch { // Set implements Batch. func (b *rocksDBBatch) Set(key, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if value == nil { - return errValueNil + return tmdb.ErrValueNil } if b.batch == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } b.batch.Put(key, value) return nil @@ -36,10 +37,10 @@ func (b *rocksDBBatch) Set(key, value []byte) error { // Delete implements Batch. func (b *rocksDBBatch) Delete(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if b.batch == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } b.batch.Delete(key) return nil @@ -48,7 +49,7 @@ func (b *rocksDBBatch) Delete(key []byte) error { // Write implements Batch. func (b *rocksDBBatch) Write() error { if b.batch == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } err := b.db.db.Write(b.db.wo, b.batch) if err != nil { @@ -62,7 +63,7 @@ func (b *rocksDBBatch) Write() error { // WriteSync implements Batch. func (b *rocksDBBatch) WriteSync() error { if b.batch == nil { - return errBatchClosed + return tmdb.ErrBatchClosed } err := b.db.db.Write(b.db.woSync, b.batch) if err != nil { diff --git a/rocksdb.go b/rocksdb/db.go similarity index 81% rename from rocksdb.go rename to rocksdb/db.go index c3ec29f40..68f303606 100644 --- a/rocksdb.go +++ b/rocksdb/db.go @@ -1,6 +1,4 @@ -// +build rocksdb - -package db +package rocksdb import ( "fmt" @@ -8,15 +6,9 @@ import ( "runtime" "github.com/tecbot/gorocksdb" + tmdb "github.com/tendermint/tm-db" ) -func init() { - dbCreator := func(name string, dir string) (DB, error) { - return NewRocksDB(name, dir) - } - registerDBCreator(RocksDBBackend, dbCreator, false) -} - // RocksDB is a RocksDB backend. type RocksDB struct { db *gorocksdb.DB @@ -25,9 +17,9 @@ type RocksDB struct { woSync *gorocksdb.WriteOptions } -var _ DB = (*RocksDB)(nil) +var _ tmdb.DB = (*RocksDB)(nil) -func NewRocksDB(name string, dir string) (*RocksDB, error) { +func NewDB(name string, dir string) (*RocksDB, error) { // default rocksdb option, good enough for most cases, including heavy workloads. // 1GB table cache, 512MB write buffer(may use 50% more on heavy workloads). // compression: snappy as default, need to -lsnappy to enable. @@ -41,10 +33,10 @@ func NewRocksDB(name string, dir string) (*RocksDB, error) { opts.IncreaseParallelism(runtime.NumCPU()) // 1.5GB maximum memory use for writebuffer. opts.OptimizeLevelStyleCompaction(512 * 1024 * 1024) - return NewRocksDBWithOptions(name, dir, opts) + return NewDBWithOptions(name, dir, opts) } -func NewRocksDBWithOptions(name string, dir string, opts *gorocksdb.Options) (*RocksDB, error) { +func NewDBWithOptions(name string, dir string, opts *gorocksdb.Options) (*RocksDB, error) { dbPath := filepath.Join(dir, name+".db") db, err := gorocksdb.OpenDb(opts, dbPath) if err != nil { @@ -66,7 +58,7 @@ func NewRocksDBWithOptions(name string, dir string, opts *gorocksdb.Options) (*R // Get implements DB. func (db *RocksDB) Get(key []byte) ([]byte, error) { if len(key) == 0 { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } res, err := db.db.Get(db.ro, key) if err != nil { @@ -87,10 +79,10 @@ func (db *RocksDB) Has(key []byte) (bool, error) { // Set implements DB. func (db *RocksDB) Set(key []byte, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if value == nil { - return errValueNil + return tmdb.ErrValueNil } err := db.db.Put(db.wo, key, value) if err != nil { @@ -102,10 +94,10 @@ func (db *RocksDB) Set(key []byte, value []byte) error { // SetSync implements DB. func (db *RocksDB) SetSync(key []byte, value []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } if value == nil { - return errValueNil + return tmdb.ErrValueNil } err := db.db.Put(db.woSync, key, value) if err != nil { @@ -117,7 +109,7 @@ func (db *RocksDB) SetSync(key []byte, value []byte) error { // Delete implements DB. func (db *RocksDB) Delete(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } err := db.db.Delete(db.wo, key) if err != nil { @@ -129,7 +121,7 @@ func (db *RocksDB) Delete(key []byte) error { // DeleteSync implements DB. func (db *RocksDB) DeleteSync(key []byte) error { if len(key) == 0 { - return errKeyEmpty + return tmdb.ErrKeyEmpty } err := db.db.Delete(db.woSync, key) if err != nil { @@ -177,23 +169,23 @@ func (db *RocksDB) Stats() map[string]string { } // NewBatch implements DB. -func (db *RocksDB) NewBatch() Batch { +func (db *RocksDB) NewBatch() tmdb.Batch { return newRocksDBBatch(db) } // Iterator implements DB. -func (db *RocksDB) Iterator(start, end []byte) (Iterator, error) { +func (db *RocksDB) Iterator(start, end []byte) (tmdb.Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } itr := db.db.NewIterator(db.ro) return newRocksDBIterator(itr, start, end, false), nil } // ReverseIterator implements DB. -func (db *RocksDB) ReverseIterator(start, end []byte) (Iterator, error) { +func (db *RocksDB) ReverseIterator(start, end []byte) (tmdb.Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, errKeyEmpty + return nil, tmdb.ErrKeyEmpty } itr := db.db.NewIterator(db.ro) return newRocksDBIterator(itr, start, end, true), nil diff --git a/rocksdb/db_test.go b/rocksdb/db_test.go new file mode 100644 index 000000000..ef4257fb9 --- /dev/null +++ b/rocksdb/db_test.go @@ -0,0 +1,3 @@ +package rocksdb + +// TODO: Add tests for rocksdb diff --git a/rocksdb_iterator.go b/rocksdb/iterator.go similarity index 96% rename from rocksdb_iterator.go rename to rocksdb/iterator.go index 0e7d405fe..6d18cf9cf 100644 --- a/rocksdb_iterator.go +++ b/rocksdb/iterator.go @@ -1,11 +1,10 @@ -// +build rocksdb - -package db +package rocksdb import ( "bytes" "github.com/tecbot/gorocksdb" + tmdb "github.com/tendermint/tm-db" ) type rocksDBIterator struct { @@ -15,7 +14,7 @@ type rocksDBIterator struct { isInvalid bool } -var _ Iterator = (*rocksDBIterator)(nil) +var _ tmdb.Iterator = (*rocksDBIterator)(nil) func newRocksDBIterator(source *gorocksdb.Iterator, start, end []byte, isReverse bool) *rocksDBIterator { if isReverse { diff --git a/rocksdb_test.go b/rocksdb_test.go deleted file mode 100644 index 6bbe51133..000000000 --- a/rocksdb_test.go +++ /dev/null @@ -1,35 +0,0 @@ -// +build rocksdb - -package db - -import ( - "fmt" - "os" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestRocksDBBackend(t *testing.T) { - name := fmt.Sprintf("test_%x", randStr(12)) - dir := os.TempDir() - db, err := NewDB(name, RocksDBBackend, dir) - require.NoError(t, err) - defer cleanupDBDir(dir, name) - - _, ok := db.(*RocksDB) - assert.True(t, ok) -} - -func TestRocksDBStats(t *testing.T) { - name := fmt.Sprintf("test_%x", randStr(12)) - dir := os.TempDir() - db, err := NewDB(name, RocksDBBackend, dir) - require.NoError(t, err) - defer cleanupDBDir(dir, name) - - assert.NotEmpty(t, db.Stats()) -} - -// TODO: Add tests for rocksdb diff --git a/test_helpers.go b/test_helpers.go deleted file mode 100644 index 6a97ad7af..000000000 --- a/test_helpers.go +++ /dev/null @@ -1,36 +0,0 @@ -package db - -import "math/rand" - -const ( - strChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" // 62 characters -) - -// For testing convenience. -func bz(s string) []byte { - return []byte(s) -} - -// Str constructs a random alphanumeric string of given length. -func randStr(length int) string { - chars := []byte{} -MAIN_LOOP: - for { - val := rand.Int63() // nolint:gosec // G404: Use of weak random number generator - for i := 0; i < 10; i++ { - v := int(val & 0x3f) // rightmost 6 bits - if v >= 62 { // only 62 characters in strChars - val >>= 6 - continue - } else { - chars = append(chars, strChars[v]) - if len(chars) == length { - break MAIN_LOOP - } - val >>= 6 - } - } - } - - return string(chars) -} diff --git a/types.go b/types.go index 3be412fd2..43d0f4e06 100644 --- a/types.go +++ b/types.go @@ -3,14 +3,14 @@ package db import "errors" var ( - // errBatchClosed is returned when a closed or written batch is used. - errBatchClosed = errors.New("batch has been written or closed") + // ErrBatchClosed is returned when a closed or written batch is used. + ErrBatchClosed = errors.New("batch has been written or closed") - // errKeyEmpty is returned when attempting to use an empty or nil key. - errKeyEmpty = errors.New("key cannot be empty") + // ErrKeyEmpty is returned when attempting to use an empty or nil key. + ErrKeyEmpty = errors.New("key cannot be empty") - // errValueNil is returned when attempting to set a nil value. - errValueNil = errors.New("value cannot be nil") + // ErrValueNil is returned when attempting to set a nil value. + ErrValueNil = errors.New("value cannot be nil") ) // DB is the main interface for all database backends. DBs are concurrency-safe. Callers must call From 53ed3dbaa3eb4c7693ca0aaa2deff093e4675b24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Feb 2021 11:09:57 +0000 Subject: [PATCH 02/34] build(deps): bump golangci/golangci-lint-action from v2.3.0 to v2.4.0 (#152) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from v2.3.0 to v2.4.0. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v2.3.0...544d2efb307b3f205f34886f2787046abe7fb26e) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 29c21b571..90e967cb2 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -11,7 +11,7 @@ jobs: container: tendermintdev/docker-tm-db-testing steps: - uses: actions/checkout@v2 - - uses: golangci/golangci-lint-action@v2.3.0 + - uses: golangci/golangci-lint-action@v2.4.0 with: # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. version: v1.30 From c6455c1524a21d057d6f807ec98268e98dc413a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 14:45:52 -0700 Subject: [PATCH 03/34] build(deps): bump google.golang.org/grpc from 1.35.0 to 1.37.1 (#169) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.35.0 to 1.37.1. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.35.0...v1.37.1) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 27 +++------------------------ 2 files changed, 4 insertions(+), 25 deletions(-) diff --git a/go.mod b/go.mod index 03bf90110..8fe7c7df0 100644 --- a/go.mod +++ b/go.mod @@ -14,5 +14,5 @@ require ( github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c go.etcd.io/bbolt v1.3.5 - google.golang.org/grpc v1.35.0 + google.golang.org/grpc v1.37.1 ) diff --git a/go.sum b/go.sum index e87eb3e4a..d8d884604 100644 --- a/go.sum +++ b/go.sum @@ -14,7 +14,6 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -28,7 +27,7 @@ github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= @@ -36,18 +35,15 @@ github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojt github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQDg5gKsWoLBOB0n+ZW8s599zru8FJ2/Y= github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -61,17 +57,14 @@ github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= @@ -111,7 +104,6 @@ github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tL github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -147,7 +139,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc h1:zK/HqS5bZxDptfPJNq8v7vJfXtkU7r9TLIoSr1bXaP4= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -160,23 +151,18 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed h1:J22ig1FUekjjkmZUM7pTKixYm8DvrYsvrBZdunYeIuQ= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= @@ -191,15 +177,12 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= @@ -207,28 +190,24 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.35.0 h1:TwIQcH3es+MojMVojxxfQ3l3OF2KzlRxML2xZq0kRo8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.1 h1:ARnQJNWxGyYJpdf/JXscNlQr/uv607ZPU9Z7ogHi+iI= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= From 4b89e0a70faceb57e4567b1606c2eb7e1efd7e77 Mon Sep 17 00:00:00 2001 From: Tess Rinearson <tess.rinearson@gmail.com> Date: Tue, 25 May 2021 09:22:40 +0200 Subject: [PATCH 04/34] .github: make the IG team codeowners (#170) --- .github/CODEOWNERS | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e889fe439..be3eb47e7 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,4 +1,3 @@ # CODEOWNERS: https://help.github.com/articles/about-codeowners/ -# Everything goes through Anton and Tess. -* @melekes @tessr +* @alexanderbez @cmwaters @marbar3778 @tessr @tychoish From 7ddb4c11f34fa311e1456b4955b033e41396b543 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 May 2021 07:26:46 +0000 Subject: [PATCH 05/34] build(deps): bump golangci/golangci-lint-action from 2.4.0 to 2.5.2 (#166) Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 2.4.0 to 2.5.2. - [Release notes](https://github.com/golangci/golangci-lint-action/releases) - [Commits](https://github.com/golangci/golangci-lint-action/compare/v2.4.0...v2.5.2) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Marko <marbar3778@yahoo.com> --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 90e967cb2..b1f128ae8 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -11,7 +11,7 @@ jobs: container: tendermintdev/docker-tm-db-testing steps: - uses: actions/checkout@v2 - - uses: golangci/golangci-lint-action@v2.4.0 + - uses: golangci/golangci-lint-action@v2.5.2 with: # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. version: v1.30 From 8b23718bf470faf392487d89847336ca60b3cee6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 May 2021 07:35:22 +0000 Subject: [PATCH 06/34] build(deps): bump google.golang.org/grpc from 1.37.1 to 1.38.0 (#171) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.37.1 to 1.38.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.37.1...v1.38.0) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8fe7c7df0..cb46f455c 100644 --- a/go.mod +++ b/go.mod @@ -14,5 +14,5 @@ require ( github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c go.etcd.io/bbolt v1.3.5 - google.golang.org/grpc v1.37.1 + google.golang.org/grpc v1.38.0 ) diff --git a/go.sum b/go.sum index d8d884604..a9ae0c786 100644 --- a/go.sum +++ b/go.sum @@ -190,8 +190,8 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.37.1 h1:ARnQJNWxGyYJpdf/JXscNlQr/uv607ZPU9Z7ogHi+iI= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 04776740df47abbfacf747cab4c8233cac67e76d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jun 2021 09:57:19 +0200 Subject: [PATCH 07/34] build(deps): bump go.etcd.io/bbolt from 1.3.5 to 1.3.6 (#172) Bumps [go.etcd.io/bbolt](https://github.com/etcd-io/bbolt) from 1.3.5 to 1.3.6. - [Release notes](https://github.com/etcd-io/bbolt/releases) - [Commits](https://github.com/etcd-io/bbolt/compare/v1.3.5...v1.3.6) --- updated-dependencies: - dependency-name: go.etcd.io/bbolt dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index cb46f455c..26881b92f 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,6 @@ require ( github.com/stretchr/testify v1.7.0 github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c - go.etcd.io/bbolt v1.3.5 + go.etcd.io/bbolt v1.3.6 google.golang.org/grpc v1.38.0 ) diff --git a/go.sum b/go.sum index a9ae0c786..cffb65ae2 100644 --- a/go.sum +++ b/go.sum @@ -118,8 +118,8 @@ github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljT github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -157,10 +157,10 @@ golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From 0189c6fe17c1b2e77d4ff7ce844dec4ddace4068 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Jul 2021 06:40:11 +0000 Subject: [PATCH 08/34] build(deps): bump codecov/codecov-action from 1 to 2.0.1 (#175) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 1 to 2.0.1. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v1...v2.0.1) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 809dabbf8..75a0aba6f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: - name: test & coverage report creation run: | go test ./... -mod=readonly -timeout 8m -race -coverprofile=coverage.txt -covermode=atomic -tags=memdb,goleveldb,cleveldb,boltdb,rocksdb,badgerdb -v - - uses: codecov/codecov-action@v1 + - uses: codecov/codecov-action@v2.0.1 with: file: ./coverage.txt fail_ci_if_error: true From 664e78d565523fe933848e9265672075575431b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Jul 2021 06:42:13 +0000 Subject: [PATCH 09/34] build(deps): bump github.com/dgraph-io/badger/v2 (#176) Bumps [github.com/dgraph-io/badger/v2](https://github.com/dgraph-io/badger) from 2.2007.2 to 2.2007.3. - [Release notes](https://github.com/dgraph-io/badger/releases) - [Changelog](https://github.com/dgraph-io/badger/blob/master/CHANGELOG.md) - [Commits](https://github.com/dgraph-io/badger/compare/v2.2007.2...v2.2007.3) --- updated-dependencies: - dependency-name: github.com/dgraph-io/badger/v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Marko <marbar3778@yahoo.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 26881b92f..625f1da4a 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/tendermint/tm-db go 1.12 require ( - github.com/dgraph-io/badger/v2 v2.2007.2 + github.com/dgraph-io/badger/v2 v2.2007.3 github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 // indirect github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 // indirect diff --git a/go.sum b/go.sum index cffb65ae2..432229f42 100644 --- a/go.sum +++ b/go.sum @@ -17,8 +17,8 @@ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwc github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= -github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= +github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= +github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= From c9511824bbf59b06315ededf05467047c64bc2cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Aug 2021 16:01:30 +0200 Subject: [PATCH 10/34] build(deps): bump actions/stale from 3 to 4 (#174) Bumps [actions/stale](https://github.com/actions/stale) from 3 to 4. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 610e2e29e..c7de0c550 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -7,7 +7,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v3 + - uses: actions/stale@v4 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: "This pull request has been automatically marked as stale because it has not had From 4008652ff5cd0ef4751f794fcef01f5a54165f08 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Aug 2021 16:34:45 +0200 Subject: [PATCH 11/34] build(deps): bump codecov/codecov-action from 2.0.1 to 2.0.2 (#177) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 2.0.1 to 2.0.2. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v2.0.1...v2.0.2) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 75a0aba6f..15eec7769 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: - name: test & coverage report creation run: | go test ./... -mod=readonly -timeout 8m -race -coverprofile=coverage.txt -covermode=atomic -tags=memdb,goleveldb,cleveldb,boltdb,rocksdb,badgerdb -v - - uses: codecov/codecov-action@v2.0.1 + - uses: codecov/codecov-action@v2.0.2 with: file: ./coverage.txt fail_ci_if_error: true From 34a5cbf055bfc0c5a9db1f68de5ca739837cecdb Mon Sep 17 00:00:00 2001 From: William Banfield <4561443+williambanfield@users.noreply.github.com> Date: Wed, 4 Aug 2021 10:37:10 -0400 Subject: [PATCH 12/34] codeowners: add williambanfield (#179) --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index be3eb47e7..44dc78a31 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,3 +1,3 @@ # CODEOWNERS: https://help.github.com/articles/about-codeowners/ -* @alexanderbez @cmwaters @marbar3778 @tessr @tychoish +* @alexanderbez @cmwaters @marbar3778 @tessr @tychoish @williambanfield From 2ce1ac75cecda0c429f924b1183ebf33f26f552f Mon Sep 17 00:00:00 2001 From: Tess Rinearson <tess.rinearson@gmail.com> Date: Wed, 4 Aug 2021 16:41:11 +0200 Subject: [PATCH 13/34] changelog: add entry for 0.6.5 (#178) --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f667baa6..165d348dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## 0.6.5 + +**2021-08-04** + +### Breaking changes (Go API) + +- [metadb] [\#151](https://github.com/tendermint/tm-db/pull/151) split backends into packages and add metadb (@marbar3778, @mvdan) + +### Version bumps + +- Bump dgraph/badger to v2. +- Bump go.etcd.io/bbolt from 1.3.5 to 1.3.6. +- Bump grpc from 1.35.0 to 1.38.0. + ## 0.6.4 **2021-02-09** From edb35ebc2ea9327e0c0528d0d66bbf39a787461b Mon Sep 17 00:00:00 2001 From: William Banfield <4561443+williambanfield@users.noreply.github.com> Date: Thu, 5 Aug 2021 16:02:22 -0400 Subject: [PATCH 14/34] docs: add information on how to release tm-db (#180) * docs: add information on how to release tm-db Co-authored-by: Tess Rinearson <tess.rinearson@gmail.com> --- docs/how_to_release.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 docs/how_to_release.md diff --git a/docs/how_to_release.md b/docs/how_to_release.md new file mode 100644 index 000000000..59ac878a4 --- /dev/null +++ b/docs/how_to_release.md @@ -0,0 +1,30 @@ +# How To Release tm db + +This document provides a step-by-step guide for creating a release of tm-db. + +## 1. Update the changelog + +Open the `CHANGELOG.md` at the root of the repository. +Amend the top of this file with a section for the latest version (0.6.x etc). +Be sure to include any bug fixes, improvements, dependency upgrades, and breaking changes included in this version. +(It's OK to exclude changes to tooling dependencies, like updates to Github Actions.) +Finally, create a pull request for the changelog update. +Once the tests pass and the pull request is approved, merge the change into master. + +## 2. Tag the latest commit with the latest version + +tm-db is provided as a golang [module](https://blog.golang.org/publishing-go-modules), which rely on git tags for versioning information. + +Tag the changelog commit in master created in step 1 with the latest version. +Be sure to prefix the version tag with `v`. For example, `v0.6.5` for version 0.6.5. +This tagging can be done [using github](https://docs.github.com/en/desktop/contributing-and-collaborating-using-github-desktop/managing-commits/managing-tags#creating-a-tag) or [using git](https://git-scm.com/book/en/v2/Git-Basics-Tagging) on the command line. + +Note that the golang modules tooling expects tags to be immutable. +If you make a mistake after pushing a tag, make a new tag and start over rather than fix and re-push the old tag. +## 3. Create a github release + +Finally, create a github release. +To create a github release, follow the steps in the [github release documentation](https://docs.github.com/en/github/administering-a-repository/releasing-projects-on-github/managing-releases-in-a-repository#creating-a-release). + +When creating the github release, select the `Tag version` created in step 2. +Use the version tag as the release title and paste in the changelog information for this release in the `Describe this release` section. From 358078c8bed0eb5113fef6bea376d1a620757308 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Sep 2021 11:53:09 +0200 Subject: [PATCH 15/34] build(deps): bump codecov/codecov-action from 2.0.2 to 2.0.3 (#183) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 2.0.2 to 2.0.3. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v2.0.2...v2.0.3) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 15eec7769..3d42cd041 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: - name: test & coverage report creation run: | go test ./... -mod=readonly -timeout 8m -race -coverprofile=coverage.txt -covermode=atomic -tags=memdb,goleveldb,cleveldb,boltdb,rocksdb,badgerdb -v - - uses: codecov/codecov-action@v2.0.2 + - uses: codecov/codecov-action@v2.0.3 with: file: ./coverage.txt fail_ci_if_error: true From c339e652909900a7a70e1398c335ae38b483fd1d Mon Sep 17 00:00:00 2001 From: Marko <marbar3778@yahoo.com> Date: Sat, 16 Oct 2021 07:43:11 +0000 Subject: [PATCH 16/34] fix stale bot (#191) --- .github/workflows/stale.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index c7de0c550..032ca431e 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -13,6 +13,8 @@ jobs: stale-pr-message: "This pull request has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions." - days-before-stale: 10 - days-before-close: 4 - exempt-pr-labels: "S:wip" + days-before-stale: -1 + days-before-close: -1 + days-before-pr-stale: 20 + days-before-pr-close: 10 + exempt-pr-labels: "pinned, security, proposal, blocked" From 8882f2706633b2944b4084961fab1aaeb7ec3c09 Mon Sep 17 00:00:00 2001 From: "M. J. Fromberger" <fromberger@interchain.io> Date: Mon, 8 Nov 2021 08:05:09 -0800 Subject: [PATCH 17/34] Update Go version in the build container. (#195) --- tools/Dockerfile | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tools/Dockerfile b/tools/Dockerfile index 2c26e0b9c..c34f1c159 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -1,30 +1,31 @@ -FROM golang +FROM golang:1.16-alpine ENV LD_LIBRARY_PATH=/usr/local/lib -RUN apt-get update && apt-get install -y --no-install-recommends \ - libgflags-dev libsnappy-dev zlib1g-dev libbz2-dev libzstd-dev make tar wget +RUN apk add bash build-base bzip2-dev gflags-dev linux-headers \ + perl snappy-dev util-linux wget zlib-dev zstd-dev # Install cleveldb RUN \ - wget https://github.com/google/leveldb/archive/v1.20.tar.gz \ + wget -q https://github.com/google/leveldb/archive/v1.20.tar.gz \ && tar xvf v1.20.tar.gz \ && cd leveldb-1.20 \ && make \ && cp -a out-static/lib* out-shared/lib* /usr/local/lib \ && cd include \ && cp -a leveldb /usr/local/include \ - && ldconfig \ + && ldconfig $LD_LIBRARY_PATH \ && cd ../.. \ && rm -rf v1.20.tar.gz leveldb-1.20 # Install Rocksdb RUN \ - wget https://github.com/facebook/rocksdb/archive/v6.6.4.tar.gz \ + wget -q https://github.com/facebook/rocksdb/archive/v6.6.4.tar.gz \ && tar -zxf v6.6.4.tar.gz \ && cd rocksdb-6.6.4 \ + && sed -i'' 's/install -C/install -c/g' Makefile \ && DEBUG_LEVEL=0 make -j4 shared_lib \ && make install-shared \ - && ldconfig \ + && ldconfig $LD_LIBRARY_PATH \ && cd .. \ && rm -rf v6.6.4.tar.gz rocksdb-6.6.4 From d65205892e9e5ab5606161acc86c75a5cdc8233d Mon Sep 17 00:00:00 2001 From: "M. J. Fromberger" <fromberger@interchain.io> Date: Mon, 8 Nov 2021 14:23:16 -0800 Subject: [PATCH 18/34] build: fix the image to work with golangci-lint (#201) In #195 I updated the Go version, and also swapped from Debian to Alpine for the base image. This was OK for the build, but it turns out we also use the same image to run golangci-lint. That action uses a binary for a different architecture, which fails on this image. So: - Keep the Go version, but revert the base image. - Split image layers to make rebuilds faster. - Add version labels as arguments. - Add some documentation to the workflow configs. --- .github/workflows/ci.yml | 18 ++++++++++------ .github/workflows/docker.yml | 8 +++++++ .github/workflows/lint.yml | 6 +++++- tools/Dockerfile | 41 ++++++++++++++++++++++++------------ 4 files changed, 52 insertions(+), 21 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3d42cd041..3cfedffca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,14 +14,20 @@ jobs: if: "!startsWith(github.ref, 'refs/tags/') && github.ref != 'refs/heads/master'" Test: + # The custom image here contains pre-built libraries for leveldb and + # rocksdb, which are needed to build and test those modules. + # To update the container image, see docker.yml. runs-on: ubuntu-latest container: tendermintdev/docker-tm-db-testing steps: - uses: actions/checkout@v2 - name: test & coverage report creation - run: | - go test ./... -mod=readonly -timeout 8m -race -coverprofile=coverage.txt -covermode=atomic -tags=memdb,goleveldb,cleveldb,boltdb,rocksdb,badgerdb -v - - uses: codecov/codecov-action@v2.0.3 - with: - file: ./coverage.txt - fail_ci_if_error: true + run: /bin/true + #run: | + # go test ./... -mod=readonly -timeout 8m -race -coverprofile=coverage.txt -covermode=atomic -tags=memdb,goleveldb,cleveldb,boltdb,rocksdb,badgerdb -v + #- uses: codecov/codecov-action@v2.0.3 + # with: + # file: ./coverage.txt + # fail_ci_if_error: true + # + # TODO(creachadair): Temporarily disabled to update CI image. diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index a675ecb6c..1eb94db47 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -1,3 +1,11 @@ +# This workflow builds and pushes a new version of the build container image +# when the tools directory changes on master. Edit tools/Dockerfile. +# +# This workflow does not push a new image until it is merged, so tests that +# depend on changes in this image will not pass until this workflow succeeds. +# For that reason, changes here should be done in a separate PR in advance of +# work that depends on them. + name: Build & Push TM-DB-Testing on: pull_request: diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b1f128ae8..c291823ed 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -7,13 +7,17 @@ on: jobs: golangci: + # We need to run the linter on the same image we use for building, since it + # needs the C libraries installed for the dependencies to typecheck. runs-on: ubuntu-latest container: tendermintdev/docker-tm-db-testing steps: - uses: actions/checkout@v2 - uses: golangci/golangci-lint-action@v2.5.2 with: - # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. + # Required: the version of golangci-lint is required and must be + # specified without patch version: we always use the latest patch + # version. version: v1.30 args: --timeout 10m github-token: ${{ secrets.github_token }} diff --git a/tools/Dockerfile b/tools/Dockerfile index c34f1c159..855414aab 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -1,31 +1,44 @@ -FROM golang:1.16-alpine +# This file defines the container image used to build and test tm-db in CI. +# The CI workflows use the latest tag of tendermintdev/docker-tm-db-testing +# built from these settings. +# +# The jobs defined in the Build & Push workflow will build and update the image +# when changes to this file are merged. If you have other changes that require +# updates here, merge the changes here first and let the image get updated (or +# push a new version manually) before PRs that depend on them. + +FROM golang:1.17-bullseye AS build ENV LD_LIBRARY_PATH=/usr/local/lib -RUN apk add bash build-base bzip2-dev gflags-dev linux-headers \ - perl snappy-dev util-linux wget zlib-dev zstd-dev +RUN apt-get update && apt-get install -y --no-install-recommends \ + libbz2-dev libgflags-dev libsnappy-dev libzstd-dev zlib1g-dev \ + make tar wget + +FROM build AS install +ARG LEVELDB=1.20 +ARG ROCKSDB=6.24.2 # Install cleveldb RUN \ - wget -q https://github.com/google/leveldb/archive/v1.20.tar.gz \ - && tar xvf v1.20.tar.gz \ - && cd leveldb-1.20 \ + wget -q https://github.com/google/leveldb/archive/v${LEVELDB}.tar.gz \ + && tar xvf v${LEVELDB}.tar.gz \ + && cd leveldb-${LEVELDB} \ && make \ && cp -a out-static/lib* out-shared/lib* /usr/local/lib \ && cd include \ && cp -a leveldb /usr/local/include \ - && ldconfig $LD_LIBRARY_PATH \ + && ldconfig \ && cd ../.. \ - && rm -rf v1.20.tar.gz leveldb-1.20 + && rm -rf v${LEVELDB}.tar.gz leveldb-${LEVELDB} # Install Rocksdb RUN \ - wget -q https://github.com/facebook/rocksdb/archive/v6.6.4.tar.gz \ - && tar -zxf v6.6.4.tar.gz \ - && cd rocksdb-6.6.4 \ - && sed -i'' 's/install -C/install -c/g' Makefile \ + wget -q https://github.com/facebook/rocksdb/archive/v${ROCKSDB}.tar.gz \ + && tar -zxf v${ROCKSDB}.tar.gz \ + && cd rocksdb-${ROCKSDB} \ && DEBUG_LEVEL=0 make -j4 shared_lib \ && make install-shared \ - && ldconfig $LD_LIBRARY_PATH \ + && ldconfig \ && cd .. \ - && rm -rf v6.6.4.tar.gz rocksdb-6.6.4 + && rm -rf v${ROCKSDB}.tar.gz rocksdb-${ROCKSDB} From 451c8444fb1732632a7a9b1f2ccdc491b70d6d81 Mon Sep 17 00:00:00 2001 From: "M. J. Fromberger" <fromberger@interchain.io> Date: Mon, 8 Nov 2021 14:48:45 -0800 Subject: [PATCH 19/34] Revert rocksdb version at tip. (#202) --- tools/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/Dockerfile b/tools/Dockerfile index 855414aab..a22b9a0db 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -17,7 +17,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ FROM build AS install ARG LEVELDB=1.20 -ARG ROCKSDB=6.24.2 +ARG ROCKSDB=6.6.4 # Install cleveldb RUN \ From 63a566e76533e635270fa8a860614de0623c2533 Mon Sep 17 00:00:00 2001 From: "M. J. Fromberger" <fromberger@interchain.io> Date: Mon, 8 Nov 2021 15:01:55 -0800 Subject: [PATCH 20/34] Enable cgo for testing. (#200) The leveldb wrapper library requires cgo to build. --- .github/workflows/ci.yml | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3cfedffca..a8beee60b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,12 +22,9 @@ jobs: steps: - uses: actions/checkout@v2 - name: test & coverage report creation - run: /bin/true - #run: | - # go test ./... -mod=readonly -timeout 8m -race -coverprofile=coverage.txt -covermode=atomic -tags=memdb,goleveldb,cleveldb,boltdb,rocksdb,badgerdb -v - #- uses: codecov/codecov-action@v2.0.3 - # with: - # file: ./coverage.txt - # fail_ci_if_error: true - # - # TODO(creachadair): Temporarily disabled to update CI image. + run: | + CGO_ENABLED=1 go test ./... -mod=readonly -timeout 8m -race -coverprofile=coverage.txt -covermode=atomic -tags=memdb,goleveldb,cleveldb,boltdb,rocksdb,badgerdb -v + - uses: codecov/codecov-action@v2.0.3 + with: + file: ./coverage.txt + fail_ci_if_error: true From 6dc0379403b860e475b9b05d0baef15eaa7ba5f6 Mon Sep 17 00:00:00 2001 From: "M. J. Fromberger" <fromberger@interchain.io> Date: Mon, 8 Nov 2021 15:09:45 -0800 Subject: [PATCH 21/34] Update CODEOWNERS file. (#196) --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 44dc78a31..440bc907b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,3 +1,3 @@ # CODEOWNERS: https://help.github.com/articles/about-codeowners/ -* @alexanderbez @cmwaters @marbar3778 @tessr @tychoish @williambanfield +* @alexanderbez @cmwaters @creachadair @marbar3778 @tychoish @williambanfield From d3744d52e8bb46b3bbe76ea48e850267eb893a29 Mon Sep 17 00:00:00 2001 From: "M. J. Fromberger" <fromberger@interchain.io> Date: Mon, 8 Nov 2021 15:12:42 -0800 Subject: [PATCH 22/34] Retract the accidentally-released v0.6.5. (#194) Update the go.mod file to version 1.16, to allow the retract syntax. Mark v0.6.5 as retracted, since it contains large breaking package structure changes. --- go.mod | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 625f1da4a..ec23aacb9 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/tendermint/tm-db -go 1.12 +go 1.16 require ( github.com/dgraph-io/badger/v2 v2.2007.3 @@ -16,3 +16,6 @@ require ( go.etcd.io/bbolt v1.3.6 google.golang.org/grpc v1.38.0 ) + +// Breaking changes were released with the wrong tag (use v0.6.6 or later). +retract v0.6.5 From 11c5e90c12f9151ebe03386af4b650c1438fb39e Mon Sep 17 00:00:00 2001 From: "M. J. Fromberger" <fromberger@interchain.io> Date: Mon, 8 Nov 2021 15:15:27 -0800 Subject: [PATCH 23/34] Update mergify configuration. (#198) Per https://blog.mergify.com/strict-mode-deprecation/, the "strict" mode has been deprecated and will be turned off on 10-Jan-2022. This updates the config to use the new, approved thing instead of the old thing. --- .mergify.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.mergify.yml b/.mergify.yml index 136bb1148..ece75d8f2 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -1,9 +1,15 @@ +queue_rules: + - name: default + conditions: + - base=master + - label=S:automerge + pull_request_rules: - name: automerge to master with label S:automerge and branch protection passing conditions: - base=master - label=S:automerge actions: - merge: + queue: method: squash - strict: true + name: default From 16415bfbd73b4a28e46c8c4f72f3285a5f8b6358 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Nov 2021 15:23:37 -0800 Subject: [PATCH 24/34] build(deps): bump google.golang.org/grpc from 1.38.0 to 1.42.0 (#193) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.38.0 to 1.42.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.38.0...v1.42.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 32 ++++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index ec23aacb9..596fcc781 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c go.etcd.io/bbolt v1.3.6 - google.golang.org/grpc v1.38.0 + google.golang.org/grpc v1.42.0 ) // Breaking changes were released with the wrong tag (use v0.6.6 or later). diff --git a/go.sum b/go.sum index 432229f42..30331a55a 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,23 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -27,7 +35,9 @@ github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= @@ -38,6 +48,7 @@ github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+ne github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -45,14 +56,16 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= @@ -64,6 +77,7 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -94,6 +108,7 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= @@ -120,6 +135,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -133,6 +149,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -140,11 +157,14 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -184,14 +204,17 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.42.0 h1:XT2/MFpuPFsEX2fWh3YQtHkZ+WYZFQRfaUgLZYj/p6A= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -209,6 +232,7 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From 8f92601b6539a3611063709f65256150e198cfd9 Mon Sep 17 00:00:00 2001 From: Roy Crihfield <roy@manteia.ltd> Date: Wed, 10 Nov 2021 00:34:24 +0800 Subject: [PATCH 25/34] testing: tools/Dockerfile: Upgrade RocksDB to 6.24.2 (#197) Co-authored-by: M. J. Fromberger <fromberger@interchain.io> --- go.mod | 9 +++++---- go.sum | 16 ++++++++-------- tools/Dockerfile | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 596fcc781..b9043797c 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,7 @@ module github.com/tendermint/tm-db go 1.16 require ( - github.com/dgraph-io/badger/v2 v2.2007.3 - github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 // indirect - github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect - github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 // indirect + github.com/dgraph-io/badger/v2 v2.2007.2 github.com/gogo/protobuf v1.3.2 github.com/google/btree v1.0.0 github.com/jmhodges/levigo v1.0.0 @@ -19,3 +16,7 @@ require ( // Breaking changes were released with the wrong tag (use v0.6.6 or later). retract v0.6.5 + +// FIXME: gorocksdb bindings for OptimisticTransactionDB are not merged upstream, so we use a fork +// See https://github.com/tecbot/gorocksdb/pull/216 +replace github.com/tecbot/gorocksdb => github.com/roysc/gorocksdb v1.1.1 diff --git a/go.sum b/go.sum index 30331a55a..49523c774 100644 --- a/go.sum +++ b/go.sum @@ -25,8 +25,8 @@ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwc github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI= -github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= +github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= +github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= @@ -39,12 +39,12 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ= -github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= +github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= +github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= -github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQDg5gKsWoLBOB0n+ZW8s599zru8FJ2/Y= -github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= +github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= +github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -109,6 +109,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/roysc/gorocksdb v1.1.1 h1:5qKNwi7V/AchRMjyVf5TMCcZP70ro+VyaRmQxzpRvd4= +github.com/roysc/gorocksdb v1.1.1/go.mod h1:b/U29r/CtguX3TF7mKG1Jjn4APDqh4wECshxXdiWHpA= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= @@ -127,8 +129,6 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca h1:Ld/zXl5t4+D69SiV4JoN7kkfvJdOWlPpfxrzxpLMoUk= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= diff --git a/tools/Dockerfile b/tools/Dockerfile index a22b9a0db..855414aab 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -17,7 +17,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ FROM build AS install ARG LEVELDB=1.20 -ARG ROCKSDB=6.6.4 +ARG ROCKSDB=6.24.2 # Install cleveldb RUN \ From 0e6efdda1b15ef02cdb8f66b36bac942943ab7d5 Mon Sep 17 00:00:00 2001 From: "M. J. Fromberger" <fromberger@interchain.io> Date: Mon, 15 Nov 2021 12:36:17 -0800 Subject: [PATCH 26/34] Prepare a new compatibility release v0.6.6. (#203) Revert the breaking API and package structure changes on master, and prepare to tag a new release compatible with the previous v0.6.4 so that normal upgrades with go get will function correctly. The API changes in tag v0.6.5 have been preserved in the new package-reorg branch, so that any existing dependents will continue to work. Other changes since v0.6.4, including config file changes and CI updates, are maintained on the trunk. This also folds in the merge commit from #187. Co-authored-by: Dev Ojha <ValarDragon@users.noreply.github.com> --- .gitignore | 3 +- CHANGELOG.md | 26 ++- metadb/backend_test.go => backend_test.go | 203 +++++++----------- badgerdb/db.go => badger_db.go | 49 +++-- boltdb/db.go => boltdb.go | 53 +++-- boltdb/db_test.go | 34 --- boltdb/batch.go => boltdb_batch.go | 34 +-- boltdb/iterator.go => boltdb_iterator.go | 7 +- boltdb_test.go | 35 +++ cleveldb/db.go => cleveldb.go | 43 ++-- cleveldb/db_test.go | 78 ------- cleveldb/batch.go => cleveldb_batch.go | 23 +- cleveldb/iterator.go => cleveldb_iterator.go | 11 +- cleveldb_test.go | 103 +++++++++ internal/dbtest/dbtest.go => common_test.go | 126 +++++------ metadb/db.go => db.go | 14 +- metadb/db_test.go => db_test.go | 45 ++-- goleveldb/db.go => goleveldb.go | 42 ++-- goleveldb/db_test.go | 44 ---- goleveldb/batch.go => goleveldb_batch.go | 17 +- .../iterator.go => goleveldb_iterator.go | 11 +- goleveldb_test.go | 43 ++++ makefile | 15 +- memdb/db.go => memdb.go | 51 +++-- memdb/db_test.go | 28 --- memdb/batch.go => memdb_batch.go | 22 +- memdb/iterator.go => memdb_iterator.go | 19 +- memdb_test.go | 26 +++ metadb/db_badgerdb.go | 14 -- metadb/db_boltdb.go | 14 -- metadb/db_cleveldb.go | 14 -- metadb/db_goleveldb.go | 14 -- metadb/db_memdb.go | 14 -- metadb/db_rocksdb.go | 14 -- prefixdb.go | 20 +- prefixdb_batch.go | 6 +- prefixdb_test.go | 133 ++++++------ remotedb/batch.go | 15 +- remotedb/doc.go | 4 +- remotedb/grpcdb/server.go | 3 +- remotedb/iterator.go | 12 +- remotedb/{db.go => remotedb.go} | 18 +- remotedb/{db_test.go => remotedb_test.go} | 2 +- rocksdb/db.go => rocksdb.go | 44 ++-- rocksdb/db_test.go | 3 - rocksdb/batch.go => rocksdb_batch.go | 25 ++- rocksdb/iterator.go => rocksdb_iterator.go | 7 +- rocksdb_test.go | 35 +++ test_helpers.go | 36 ++++ types.go | 12 +- metadb/util_test.go => util_test.go | 70 +++--- 51 files changed, 837 insertions(+), 897 deletions(-) rename metadb/backend_test.go => backend_test.go (63%) rename badgerdb/db.go => badger_db.go (85%) rename boltdb/db.go => boltdb.go (78%) delete mode 100644 boltdb/db_test.go rename boltdb/batch.go => boltdb_batch.go (77%) rename boltdb/iterator.go => boltdb_iterator.go (96%) create mode 100644 boltdb_test.go rename cleveldb/db.go => cleveldb.go (82%) delete mode 100644 cleveldb/db_test.go rename cleveldb/batch.go => cleveldb_batch.go (81%) rename cleveldb/iterator.go => cleveldb_iterator.go (94%) create mode 100644 cleveldb_test.go rename internal/dbtest/dbtest.go => common_test.go (56%) rename metadb/db.go => db.go (80%) rename metadb/db_test.go => db_test.go (74%) rename goleveldb/db.go => goleveldb.go (80%) delete mode 100644 goleveldb/db_test.go rename goleveldb/batch.go => goleveldb_batch.go (82%) rename goleveldb/iterator.go => goleveldb_iterator.go (93%) create mode 100644 goleveldb_test.go rename memdb/db.go => memdb.go (77%) delete mode 100644 memdb/db_test.go rename memdb/batch.go => memdb_batch.go (84%) rename memdb/iterator.go => memdb_iterator.go (90%) create mode 100644 memdb_test.go delete mode 100644 metadb/db_badgerdb.go delete mode 100644 metadb/db_boltdb.go delete mode 100644 metadb/db_cleveldb.go delete mode 100644 metadb/db_goleveldb.go delete mode 100644 metadb/db_memdb.go delete mode 100644 metadb/db_rocksdb.go rename remotedb/{db.go => remotedb.go} (83%) rename remotedb/{db_test.go => remotedb_test.go} (98%) rename rocksdb/db.go => rocksdb.go (81%) delete mode 100644 rocksdb/db_test.go rename rocksdb/batch.go => rocksdb_batch.go (79%) rename rocksdb/iterator.go => rocksdb_iterator.go (96%) create mode 100644 rocksdb_test.go create mode 100644 test_helpers.go rename metadb/util_test.go => util_test.go (56%) diff --git a/.gitignore b/.gitignore index b3efc3918..ce205f69a 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ # Output of the go coverage tool, specifically when used with LiteIDE *.out -.idea \ No newline at end of file +.idea +vendor/* diff --git a/CHANGELOG.md b/CHANGELOG.md index 165d348dd..4b76daa7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,18 +1,28 @@ # Changelog -## 0.6.5 +## 0.6.6 -**2021-08-04** +**2021-11-08** + +**Important note:** Version v0.6.5 was accidentally tagged and should be +avoided. This version is identical to v0.6.4 in package structure and API, but +has updated the version marker so that normal `go get` upgrades will not +require modifying existing use of v0.6.4. -### Breaking changes (Go API) +### Version bumps (since v0.6.4) -- [metadb] [\#151](https://github.com/tendermint/tm-db/pull/151) split backends into packages and add metadb (@marbar3778, @mvdan) +- Bump grpc from to 1.42.0. +- Bump dgraph/badger to v2 2.2007.3. +- Bump go.etcd.io/bbolt to 1.3.6. -### Version bumps +## 0.6.5 + +**2021-08-04** -- Bump dgraph/badger to v2. -- Bump go.etcd.io/bbolt from 1.3.5 to 1.3.6. -- Bump grpc from 1.35.0 to 1.38.0. +**Important note**: This version was tagged by accident, and should not be +used. The tag now points to the [package-reorg +branch](https://github.com/tendermint/tm-db/tree/package-reorg) so that +any existing dependencies should not break. ## 0.6.4 diff --git a/metadb/backend_test.go b/backend_test.go similarity index 63% rename from metadb/backend_test.go rename to backend_test.go index dff5f71e9..63630beca 100644 --- a/metadb/backend_test.go +++ b/backend_test.go @@ -1,43 +1,45 @@ -package metadb +package db import ( "fmt" "io/ioutil" "os" + "path/filepath" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - tmdb "github.com/tendermint/tm-db" - "github.com/tendermint/tm-db/cleveldb" - "github.com/tendermint/tm-db/goleveldb" - "github.com/tendermint/tm-db/internal/dbtest" - "github.com/tendermint/tm-db/memdb" - "github.com/tendermint/tm-db/rocksdb" ) // Register a test backend for PrefixDB as well, with some unrelated junk data func init() { // nolint: errcheck - registerDBCreator("prefixdb", func(name, dir string) (tmdb.DB, error) { - mdb := memdb.NewDB() + registerDBCreator("prefixdb", func(name, dir string) (DB, error) { + mdb := NewMemDB() 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 tmdb.NewPrefixDB(mdb, []byte("test/")), nil + return NewPrefixDB(mdb, []byte("test/")), nil }, false) } +func cleanupDBDir(dir, name string) { + err := os.RemoveAll(filepath.Join(dir, name) + ".db") + if err != nil { + panic(err) + } +} + func testBackendGetSetDelete(t *testing.T, backend BackendType) { // Default dirname, err := ioutil.TempDir("", fmt.Sprintf("test_backend_%s_", backend)) require.Nil(t, err) db, err := NewDB("testdb", backend, dirname) require.NoError(t, err) - defer dbtest.CleanupDBDir(dirname, "testdb") + defer cleanupDBDir(dirname, "testdb") // A nonexistent key should return nil. value, err := db.Get([]byte("a")) @@ -91,38 +93,38 @@ func testBackendGetSetDelete(t *testing.T, backend BackendType) { // Setting, getting, and deleting an empty key should error. _, err = db.Get([]byte{}) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) _, err = db.Get(nil) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) _, err = db.Has([]byte{}) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) _, err = db.Has(nil) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) err = db.Set([]byte{}, []byte{0x01}) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) err = db.Set(nil, []byte{0x01}) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) err = db.SetSync([]byte{}, []byte{0x01}) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) err = db.SetSync(nil, []byte{0x01}) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) err = db.Delete([]byte{}) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) err = db.Delete(nil) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) err = db.DeleteSync([]byte{}) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) err = db.DeleteSync(nil) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) // Setting a nil value should error, but an empty value is fine. err = db.Set([]byte("x"), nil) - require.Equal(t, tmdb.ErrValueNil, err) + require.Equal(t, errValueNil, err) err = db.SetSync([]byte("x"), nil) - require.Equal(t, tmdb.ErrValueNil, err) + require.Equal(t, errValueNil, err) err = db.Set([]byte("x"), []byte{}) require.NoError(t, err) @@ -142,74 +144,15 @@ func TestBackendsGetSetDelete(t *testing.T) { } func TestGoLevelDBBackend(t *testing.T) { - if _, ok := backends[GoLevelDBBackend]; !ok { - t.Skip("skipping since -tags=goleveldb was not used") - } - name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) + name := fmt.Sprintf("test_%x", randStr(12)) db, err := NewDB(name, GoLevelDBBackend, "") require.NoError(t, err) - defer dbtest.CleanupDBDir("", name) - - _, ok := db.(*goleveldb.GoLevelDB) - assert.True(t, ok) -} - -func TestCLevelDBBackend(t *testing.T) { - if _, ok := backends[CLevelDBBackend]; !ok { - t.Skip("skipping since -tags=cleveldb was not used") - } - name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) - // Can't use "" (current directory) or "./" here because levigo.Open returns: - // "Error initializing DB: IO error: test_XXX.db: Invalid argument" - dir := os.TempDir() - db, err := NewDB(name, CLevelDBBackend, dir) - require.NoError(t, err) - defer dbtest.CleanupDBDir(dir, name) - - _, ok := db.(*cleveldb.CLevelDB) - assert.True(t, ok) -} - -func TestCLevelDBStats(t *testing.T) { - if _, ok := backends[CLevelDBBackend]; !ok { - t.Skip("skipping since -tags=cleveldb was not used") - } - name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) - dir := os.TempDir() - db, err := NewDB(name, CLevelDBBackend, dir) - require.NoError(t, err) - defer dbtest.CleanupDBDir(dir, name) - - assert.NotEmpty(t, db.Stats()) -} + defer cleanupDBDir("", name) -func TestRocksDBBackend(t *testing.T) { - if _, ok := backends[RocksDBBackend]; !ok { - t.Skip("skipping since -tags=rocksdb was not used") - } - name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) - dir := os.TempDir() - db, err := NewDB(name, RocksDBBackend, dir) - require.NoError(t, err) - defer dbtest.CleanupDBDir(dir, name) - - _, ok := db.(*rocksdb.RocksDB) + _, ok := db.(*GoLevelDB) assert.True(t, ok) } -func TestRocksDBStats(t *testing.T) { - if _, ok := backends[RocksDBBackend]; !ok { - t.Skip("skipping since -tags=rocksdb was not used") - } - name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) - dir := os.TempDir() - db, err := NewDB(name, RocksDBBackend, dir) - require.NoError(t, err) - defer dbtest.CleanupDBDir(dir, name) - - assert.NotEmpty(t, db.Stats()) -} - func TestDBIterator(t *testing.T) { for dbType := range backends { t.Run(string(dbType), func(t *testing.T) { @@ -219,28 +162,28 @@ func TestDBIterator(t *testing.T) { } func testDBIterator(t *testing.T, backend BackendType) { - name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) + name := fmt.Sprintf("test_%x", randStr(12)) dir := os.TempDir() db, err := NewDB(name, backend, dir) require.NoError(t, err) - defer dbtest.CleanupDBDir(dir, name) + defer cleanupDBDir(dir, name) for i := 0; i < 10; i++ { if i != 6 { // but skip 6. - err := db.Set(dbtest.Int642Bytes(int64(i)), []byte{}) + err := db.Set(int642Bytes(int64(i)), []byte{}) require.NoError(t, err) } } // Blank iterator keys should error _, err = db.Iterator([]byte{}, nil) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) _, err = db.Iterator(nil, []byte{}) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) _, err = db.ReverseIterator([]byte{}, nil) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) _, err = db.ReverseIterator(nil, []byte{}) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) itr, err := db.Iterator(nil, nil) require.NoError(t, err) @@ -250,110 +193,110 @@ func testDBIterator(t *testing.T, backend BackendType) { require.NoError(t, err) verifyIterator(t, ritr, []int64{9, 8, 7, 5, 4, 3, 2, 1, 0}, "reverse iterator") - itr, err = db.Iterator(nil, dbtest.Int642Bytes(0)) + itr, err = db.Iterator(nil, int642Bytes(0)) require.NoError(t, err) verifyIterator(t, itr, []int64(nil), "forward iterator to 0") - ritr, err = db.ReverseIterator(dbtest.Int642Bytes(10), nil) + ritr, err = db.ReverseIterator(int642Bytes(10), nil) require.NoError(t, err) verifyIterator(t, ritr, []int64(nil), "reverse iterator from 10 (ex)") - itr, err = db.Iterator(dbtest.Int642Bytes(0), nil) + itr, err = db.Iterator(int642Bytes(0), nil) require.NoError(t, err) verifyIterator(t, itr, []int64{0, 1, 2, 3, 4, 5, 7, 8, 9}, "forward iterator from 0") - itr, err = db.Iterator(dbtest.Int642Bytes(1), nil) + itr, err = db.Iterator(int642Bytes(1), nil) require.NoError(t, err) verifyIterator(t, itr, []int64{1, 2, 3, 4, 5, 7, 8, 9}, "forward iterator from 1") - ritr, err = db.ReverseIterator(nil, dbtest.Int642Bytes(10)) + ritr, err = db.ReverseIterator(nil, int642Bytes(10)) require.NoError(t, err) verifyIterator(t, ritr, []int64{9, 8, 7, 5, 4, 3, 2, 1, 0}, "reverse iterator from 10 (ex)") - ritr, err = db.ReverseIterator(nil, dbtest.Int642Bytes(9)) + ritr, err = db.ReverseIterator(nil, int642Bytes(9)) require.NoError(t, err) verifyIterator(t, ritr, []int64{8, 7, 5, 4, 3, 2, 1, 0}, "reverse iterator from 9 (ex)") - ritr, err = db.ReverseIterator(nil, dbtest.Int642Bytes(8)) + ritr, err = db.ReverseIterator(nil, int642Bytes(8)) require.NoError(t, err) verifyIterator(t, ritr, []int64{7, 5, 4, 3, 2, 1, 0}, "reverse iterator from 8 (ex)") - itr, err = db.Iterator(dbtest.Int642Bytes(5), dbtest.Int642Bytes(6)) + itr, err = db.Iterator(int642Bytes(5), int642Bytes(6)) require.NoError(t, err) verifyIterator(t, itr, []int64{5}, "forward iterator from 5 to 6") - itr, err = db.Iterator(dbtest.Int642Bytes(5), dbtest.Int642Bytes(7)) + itr, err = db.Iterator(int642Bytes(5), int642Bytes(7)) require.NoError(t, err) verifyIterator(t, itr, []int64{5}, "forward iterator from 5 to 7") - itr, err = db.Iterator(dbtest.Int642Bytes(5), dbtest.Int642Bytes(8)) + itr, err = db.Iterator(int642Bytes(5), int642Bytes(8)) require.NoError(t, err) verifyIterator(t, itr, []int64{5, 7}, "forward iterator from 5 to 8") - itr, err = db.Iterator(dbtest.Int642Bytes(6), dbtest.Int642Bytes(7)) + itr, err = db.Iterator(int642Bytes(6), int642Bytes(7)) require.NoError(t, err) verifyIterator(t, itr, []int64(nil), "forward iterator from 6 to 7") - itr, err = db.Iterator(dbtest.Int642Bytes(6), dbtest.Int642Bytes(8)) + itr, err = db.Iterator(int642Bytes(6), int642Bytes(8)) require.NoError(t, err) verifyIterator(t, itr, []int64{7}, "forward iterator from 6 to 8") - itr, err = db.Iterator(dbtest.Int642Bytes(7), dbtest.Int642Bytes(8)) + itr, err = db.Iterator(int642Bytes(7), int642Bytes(8)) require.NoError(t, err) verifyIterator(t, itr, []int64{7}, "forward iterator from 7 to 8") - ritr, err = db.ReverseIterator(dbtest.Int642Bytes(4), dbtest.Int642Bytes(5)) + ritr, err = db.ReverseIterator(int642Bytes(4), int642Bytes(5)) require.NoError(t, err) verifyIterator(t, ritr, []int64{4}, "reverse iterator from 5 (ex) to 4") - ritr, err = db.ReverseIterator(dbtest.Int642Bytes(4), dbtest.Int642Bytes(6)) + ritr, err = db.ReverseIterator(int642Bytes(4), int642Bytes(6)) require.NoError(t, err) verifyIterator(t, ritr, []int64{5, 4}, "reverse iterator from 6 (ex) to 4") - ritr, err = db.ReverseIterator(dbtest.Int642Bytes(4), dbtest.Int642Bytes(7)) + ritr, err = db.ReverseIterator(int642Bytes(4), int642Bytes(7)) require.NoError(t, err) verifyIterator(t, ritr, []int64{5, 4}, "reverse iterator from 7 (ex) to 4") - ritr, err = db.ReverseIterator(dbtest.Int642Bytes(5), dbtest.Int642Bytes(6)) + ritr, err = db.ReverseIterator(int642Bytes(5), int642Bytes(6)) require.NoError(t, err) verifyIterator(t, ritr, []int64{5}, "reverse iterator from 6 (ex) to 5") - ritr, err = db.ReverseIterator(dbtest.Int642Bytes(5), dbtest.Int642Bytes(7)) + ritr, err = db.ReverseIterator(int642Bytes(5), int642Bytes(7)) require.NoError(t, err) verifyIterator(t, ritr, []int64{5}, "reverse iterator from 7 (ex) to 5") - ritr, err = db.ReverseIterator(dbtest.Int642Bytes(6), dbtest.Int642Bytes(7)) + ritr, err = db.ReverseIterator(int642Bytes(6), int642Bytes(7)) require.NoError(t, err) verifyIterator(t, ritr, []int64(nil), "reverse iterator from 7 (ex) to 6") - ritr, err = db.ReverseIterator(dbtest.Int642Bytes(10), nil) + ritr, err = db.ReverseIterator(int642Bytes(10), nil) require.NoError(t, err) verifyIterator(t, ritr, []int64(nil), "reverse iterator to 10") - ritr, err = db.ReverseIterator(dbtest.Int642Bytes(6), nil) + ritr, err = db.ReverseIterator(int642Bytes(6), nil) require.NoError(t, err) verifyIterator(t, ritr, []int64{9, 8, 7}, "reverse iterator to 6") - ritr, err = db.ReverseIterator(dbtest.Int642Bytes(5), nil) + ritr, err = db.ReverseIterator(int642Bytes(5), nil) require.NoError(t, err) verifyIterator(t, ritr, []int64{9, 8, 7, 5}, "reverse iterator to 5") - ritr, err = db.ReverseIterator(dbtest.Int642Bytes(8), dbtest.Int642Bytes(9)) + ritr, err = db.ReverseIterator(int642Bytes(8), int642Bytes(9)) require.NoError(t, err) verifyIterator(t, ritr, []int64{8}, "reverse iterator from 9 (ex) to 8") - ritr, err = db.ReverseIterator(dbtest.Int642Bytes(2), dbtest.Int642Bytes(4)) + ritr, err = db.ReverseIterator(int642Bytes(2), int642Bytes(4)) require.NoError(t, err) verifyIterator(t, ritr, []int64{3, 2}, "reverse iterator from 4 (ex) to 2") - ritr, err = db.ReverseIterator(dbtest.Int642Bytes(4), dbtest.Int642Bytes(2)) + ritr, err = db.ReverseIterator(int642Bytes(4), int642Bytes(2)) require.NoError(t, err) verifyIterator(t, ritr, []int64(nil), "reverse iterator from 2 (ex) to 4") @@ -363,7 +306,7 @@ func testDBIterator(t *testing.T, backend BackendType) { require.NoError(t, err) db2, err := NewDB(name, backend, dir2) require.NoError(t, err) - defer dbtest.CleanupDBDir(dir2, name) + defer cleanupDBDir(dir2, name) itr, err = db2.Iterator(nil, nil) require.NoError(t, err) @@ -375,11 +318,11 @@ func testDBIterator(t *testing.T, backend BackendType) { } -func verifyIterator(t *testing.T, itr tmdb.Iterator, expected []int64, msg string) { +func verifyIterator(t *testing.T, itr Iterator, expected []int64, msg string) { var list []int64 for itr.Valid() { key := itr.Key() - list = append(list, dbtest.Bytes2Int64(key)) + list = append(list, bytes2Int64(key)) itr.Next() } assert.Equal(t, expected, list, msg) @@ -394,11 +337,11 @@ func TestDBBatch(t *testing.T) { } func testDBBatch(t *testing.T, backend BackendType) { - name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) + name := fmt.Sprintf("test_%x", randStr(12)) dir := os.TempDir() db, err := NewDB(name, backend, dir) require.NoError(t, err) - defer dbtest.CleanupDBDir(dir, name) + defer cleanupDBDir(dir, name) // create a new batch, and some items - they should not be visible until we write batch := db.NewBatch() @@ -433,16 +376,16 @@ func testDBBatch(t *testing.T, backend BackendType) { // empty and nil keys, as well as nil values, should be disallowed batch = db.NewBatch() err = batch.Set([]byte{}, []byte{0x01}) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) err = batch.Set(nil, []byte{0x01}) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) err = batch.Set([]byte("a"), nil) - require.Equal(t, tmdb.ErrValueNil, err) + require.Equal(t, errValueNil, err) err = batch.Delete([]byte{}) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) err = batch.Delete(nil) - require.Equal(t, tmdb.ErrKeyEmpty, err) + require.Equal(t, errKeyEmpty, err) err = batch.Close() require.NoError(t, err) @@ -465,7 +408,7 @@ func testDBBatch(t *testing.T, backend BackendType) { require.Error(t, batch.WriteSync()) } -func assertKeyValues(t *testing.T, db tmdb.DB, expect map[string][]byte) { +func assertKeyValues(t *testing.T, db DB, expect map[string][]byte) { iter, err := db.Iterator(nil, nil) require.NoError(t, err) defer iter.Close() diff --git a/badgerdb/db.go b/badger_db.go similarity index 85% rename from badgerdb/db.go rename to badger_db.go index 33e5bebee..22b852c39 100644 --- a/badgerdb/db.go +++ b/badger_db.go @@ -1,4 +1,6 @@ -package badgerdb +// +build badgerdb + +package db import ( "bytes" @@ -7,12 +9,17 @@ import ( "path/filepath" "github.com/dgraph-io/badger/v2" - tmdb "github.com/tendermint/tm-db" ) -// NewDB creates a Badger key-value store backed to the +func init() { registerDBCreator(BadgerDBBackend, badgerDBCreator, true) } + +func badgerDBCreator(dbName, dir string) (DB, error) { + return NewBadgerDB(dbName, dir) +} + +// NewBadgerDB creates a Badger key-value store backed to the // directory dir supplied. If dir does not exist, it will be created. -func NewDB(dbName, dir string) (*BadgerDB, error) { +func NewBadgerDB(dbName, dir string) (*BadgerDB, error) { // Since Badger doesn't support database names, we join both to obtain // the final directory to use for the database. path := filepath.Join(dir, dbName) @@ -23,13 +30,13 @@ func NewDB(dbName, dir string) (*BadgerDB, error) { opts := badger.DefaultOptions(path) opts.SyncWrites = false // note that we have Sync methods opts.Logger = nil // badger is too chatty by default - return NewDBWithOptions(opts) + return NewBadgerDBWithOptions(opts) } -// NewDBWithOptions creates a BadgerDB key value store +// NewBadgerDBWithOptions creates a BadgerDB key value store // gives the flexibility of initializing a database with the // respective options. -func NewDBWithOptions(opts badger.Options) (*BadgerDB, error) { +func NewBadgerDBWithOptions(opts badger.Options) (*BadgerDB, error) { db, err := badger.Open(opts) if err != nil { return nil, err @@ -41,11 +48,11 @@ type BadgerDB struct { db *badger.DB } -var _ tmdb.DB = (*BadgerDB)(nil) +var _ DB = (*BadgerDB)(nil) func (b *BadgerDB) Get(key []byte) ([]byte, error) { if len(key) == 0 { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } var val []byte err := b.db.View(func(txn *badger.Txn) error { @@ -66,7 +73,7 @@ func (b *BadgerDB) Get(key []byte) ([]byte, error) { func (b *BadgerDB) Has(key []byte) (bool, error) { if len(key) == 0 { - return false, tmdb.ErrKeyEmpty + return false, errKeyEmpty } var found bool err := b.db.View(func(txn *badger.Txn) error { @@ -82,10 +89,10 @@ func (b *BadgerDB) Has(key []byte) (bool, error) { func (b *BadgerDB) Set(key, value []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if value == nil { - return tmdb.ErrValueNil + return errValueNil } return b.db.Update(func(txn *badger.Txn) error { return txn.Set(key, value) @@ -105,7 +112,7 @@ func (b *BadgerDB) SetSync(key, value []byte) error { func (b *BadgerDB) Delete(key []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } return b.db.Update(func(txn *badger.Txn) error { return txn.Delete(key) @@ -126,7 +133,7 @@ func (b *BadgerDB) Print() error { func (b *BadgerDB) iteratorOpts(start, end []byte, opts badger.IteratorOptions) (*badgerDBIterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } txn := b.db.NewTransaction(false) iter := txn.NewIterator(opts) @@ -147,12 +154,12 @@ func (b *BadgerDB) iteratorOpts(start, end []byte, opts badger.IteratorOptions) }, nil } -func (b *BadgerDB) Iterator(start, end []byte) (tmdb.Iterator, error) { +func (b *BadgerDB) Iterator(start, end []byte) (Iterator, error) { opts := badger.DefaultIteratorOptions return b.iteratorOpts(start, end, opts) } -func (b *BadgerDB) ReverseIterator(start, end []byte) (tmdb.Iterator, error) { +func (b *BadgerDB) ReverseIterator(start, end []byte) (Iterator, error) { opts := badger.DefaultIteratorOptions opts.Reverse = true return b.iteratorOpts(end, start, opts) @@ -162,7 +169,7 @@ func (b *BadgerDB) Stats() map[string]string { return nil } -func (b *BadgerDB) NewBatch() tmdb.Batch { +func (b *BadgerDB) NewBatch() Batch { wb := &badgerDBBatch{ db: b.db, wb: b.db.NewWriteBatch(), @@ -172,7 +179,7 @@ func (b *BadgerDB) NewBatch() tmdb.Batch { return wb } -var _ tmdb.Batch = (*badgerDBBatch)(nil) +var _ Batch = (*badgerDBBatch)(nil) type badgerDBBatch struct { db *badger.DB @@ -189,17 +196,17 @@ type badgerDBBatch struct { func (b *badgerDBBatch) Set(key, value []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if value == nil { - return tmdb.ErrValueNil + return errValueNil } return b.wb.Set(key, value) } func (b *badgerDBBatch) Delete(key []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } return b.wb.Delete(key) } diff --git a/boltdb/db.go b/boltdb.go similarity index 78% rename from boltdb/db.go rename to boltdb.go index 8dfbde500..398c401a4 100644 --- a/boltdb/db.go +++ b/boltdb.go @@ -1,4 +1,6 @@ -package boltdb +// +build boltdb + +package db import ( "errors" @@ -6,11 +8,18 @@ import ( "os" "path/filepath" - tmdb "github.com/tendermint/tm-db" "go.etcd.io/bbolt" ) -var bucket = []byte("tm") +var ( + bucket = []byte("tm") +) + +func init() { + registerDBCreator(BoltDBBackend, func(name, dir string) (DB, error) { + return NewBoltDB(name, dir) + }, false) +} // BoltDB is a wrapper around etcd's fork of bolt (https://github.com/etcd-io/bbolt). // @@ -23,16 +32,16 @@ type BoltDB struct { db *bbolt.DB } -var _ tmdb.DB = (*BoltDB)(nil) +var _ DB = (*BoltDB)(nil) -// NewDB returns a BoltDB with default options. -func NewDB(name, dir string) (tmdb.DB, error) { - return NewDBWithOpts(name, dir, bbolt.DefaultOptions) +// NewBoltDB returns a BoltDB with default options. +func NewBoltDB(name, dir string) (DB, error) { + return NewBoltDBWithOpts(name, dir, bbolt.DefaultOptions) } -// NewDBWithOpts allows you to supply *bbolt.Options. ReadOnly: true is not -// supported because NewDBWithOpts creates a global bucket. -func NewDBWithOpts(name string, dir string, opts *bbolt.Options) (tmdb.DB, error) { +// NewBoltDBWithOpts allows you to supply *bbolt.Options. ReadOnly: true is not +// supported because NewBoltDBWithOpts creates a global bucket. +func NewBoltDBWithOpts(name string, dir string, opts *bbolt.Options) (DB, error) { if opts.ReadOnly { return nil, errors.New("ReadOnly: true is not supported") } @@ -58,7 +67,7 @@ func NewDBWithOpts(name string, dir string, opts *bbolt.Options) (tmdb.DB, error // Get implements DB. func (bdb *BoltDB) Get(key []byte) (value []byte, err error) { if len(key) == 0 { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } err = bdb.db.View(func(tx *bbolt.Tx) error { b := tx.Bucket(bucket) @@ -85,10 +94,10 @@ func (bdb *BoltDB) Has(key []byte) (bool, error) { // Set implements DB. func (bdb *BoltDB) Set(key, value []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if value == nil { - return tmdb.ErrValueNil + return errValueNil } err := bdb.db.Update(func(tx *bbolt.Tx) error { b := tx.Bucket(bucket) @@ -108,7 +117,7 @@ func (bdb *BoltDB) SetSync(key, value []byte) error { // Delete implements DB. func (bdb *BoltDB) Delete(key []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } err := bdb.db.Update(func(tx *bbolt.Tx) error { return tx.Bucket(bucket).Delete(key) @@ -135,12 +144,10 @@ func (bdb *BoltDB) Print() error { fmt.Printf("%v\n", stats) err := bdb.db.View(func(tx *bbolt.Tx) error { - if err := tx.Bucket(bucket).ForEach(func(k, v []byte) error { + tx.Bucket(bucket).ForEach(func(k, v []byte) error { fmt.Printf("[%X]:\t[%X]\n", k, v) return nil - }); err != nil { - return err - } + }) return nil }) if err != nil { @@ -168,15 +175,15 @@ func (bdb *BoltDB) Stats() map[string]string { } // NewBatch implements DB. -func (bdb *BoltDB) NewBatch() tmdb.Batch { +func (bdb *BoltDB) NewBatch() Batch { return newBoltDBBatch(bdb) } // WARNING: Any concurrent writes or reads will block until the iterator is // closed. -func (bdb *BoltDB) Iterator(start, end []byte) (tmdb.Iterator, error) { +func (bdb *BoltDB) Iterator(start, end []byte) (Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } tx, err := bdb.db.Begin(false) if err != nil { @@ -187,9 +194,9 @@ func (bdb *BoltDB) Iterator(start, end []byte) (tmdb.Iterator, error) { // WARNING: Any concurrent writes or reads will block until the iterator is // closed. -func (bdb *BoltDB) ReverseIterator(start, end []byte) (tmdb.Iterator, error) { +func (bdb *BoltDB) ReverseIterator(start, end []byte) (Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } tx, err := bdb.db.Begin(false) if err != nil { diff --git a/boltdb/db_test.go b/boltdb/db_test.go deleted file mode 100644 index 503d663aa..000000000 --- a/boltdb/db_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package boltdb - -import ( - "fmt" - "os" - "testing" - - "github.com/stretchr/testify/require" - "github.com/tendermint/tm-db/internal/dbtest" -) - -func TestBoltDBNewBoltDB(t *testing.T) { - name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) - dir := os.TempDir() - defer dbtest.CleanupDBDir(dir, name) - - db, err := NewDB(name, dir) - require.NoError(t, err) - db.Close() -} - -func BenchmarkBoltDBRandomReadsWrites(b *testing.B) { - name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) - db, err := NewDB(name, "") - if err != nil { - b.Fatal(err) - } - defer func() { - db.Close() - dbtest.CleanupDBDir("", name) - }() - - dbtest.BenchmarkRandomReadsWrites(b, db) -} diff --git a/boltdb/batch.go b/boltdb_batch.go similarity index 77% rename from boltdb/batch.go rename to boltdb_batch.go index 294291a3f..390bc309b 100644 --- a/boltdb/batch.go +++ b/boltdb_batch.go @@ -1,22 +1,8 @@ -package boltdb +// +build boltdb -import ( - tmdb "github.com/tendermint/tm-db" - "go.etcd.io/bbolt" -) +package db -type opType int - -const ( - opTypeSet opType = iota + 1 - opTypeDelete -) - -type operation struct { - opType - key []byte - value []byte -} +import "go.etcd.io/bbolt" // boltDBBatch stores operations internally and dumps them to BoltDB on Write(). type boltDBBatch struct { @@ -24,7 +10,7 @@ type boltDBBatch struct { ops []operation } -var _ tmdb.Batch = (*boltDBBatch)(nil) +var _ Batch = (*boltDBBatch)(nil) func newBoltDBBatch(db *BoltDB) *boltDBBatch { return &boltDBBatch{ @@ -36,13 +22,13 @@ func newBoltDBBatch(db *BoltDB) *boltDBBatch { // Set implements Batch. func (b *boltDBBatch) Set(key, value []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if value == nil { - return tmdb.ErrValueNil + return errValueNil } if b.ops == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } b.ops = append(b.ops, operation{opTypeSet, key, value}) return nil @@ -51,10 +37,10 @@ func (b *boltDBBatch) Set(key, value []byte) error { // Delete implements Batch. func (b *boltDBBatch) Delete(key []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if b.ops == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } b.ops = append(b.ops, operation{opTypeDelete, key, nil}) return nil @@ -63,7 +49,7 @@ func (b *boltDBBatch) Delete(key []byte) error { // Write implements Batch. func (b *boltDBBatch) Write() error { if b.ops == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } err := b.db.db.Batch(func(tx *bbolt.Tx) error { bkt := tx.Bucket(bucket) diff --git a/boltdb/iterator.go b/boltdb_iterator.go similarity index 96% rename from boltdb/iterator.go rename to boltdb_iterator.go index fa855ac74..74212c5ca 100644 --- a/boltdb/iterator.go +++ b/boltdb_iterator.go @@ -1,9 +1,10 @@ -package boltdb +// +build boltdb + +package db import ( "bytes" - tmdb "github.com/tendermint/tm-db" "go.etcd.io/bbolt" ) @@ -23,7 +24,7 @@ type boltDBIterator struct { isReverse bool } -var _ tmdb.Iterator = (*boltDBIterator)(nil) +var _ Iterator = (*boltDBIterator)(nil) // newBoltDBIterator creates a new boltDBIterator. func newBoltDBIterator(tx *bbolt.Tx, start, end []byte, isReverse bool) *boltDBIterator { diff --git a/boltdb_test.go b/boltdb_test.go new file mode 100644 index 000000000..0fd12bbe2 --- /dev/null +++ b/boltdb_test.go @@ -0,0 +1,35 @@ +// +build boltdb + +package db + +import ( + "fmt" + "os" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestBoltDBNewBoltDB(t *testing.T) { + name := fmt.Sprintf("test_%x", randStr(12)) + dir := os.TempDir() + defer cleanupDBDir(dir, name) + + db, err := NewBoltDB(name, dir) + require.NoError(t, err) + db.Close() +} + +func BenchmarkBoltDBRandomReadsWrites(b *testing.B) { + name := fmt.Sprintf("test_%x", randStr(12)) + db, err := NewBoltDB(name, "") + if err != nil { + b.Fatal(err) + } + defer func() { + db.Close() + cleanupDBDir("", name) + }() + + benchmarkRandomReadsWrites(b, db) +} diff --git a/cleveldb/db.go b/cleveldb.go similarity index 82% rename from cleveldb/db.go rename to cleveldb.go index e796ea83f..377956deb 100644 --- a/cleveldb/db.go +++ b/cleveldb.go @@ -1,14 +1,21 @@ -package cleveldb +// +build cleveldb + +package db import ( "fmt" "path/filepath" "github.com/jmhodges/levigo" - - tmdb "github.com/tendermint/tm-db" ) +func init() { + dbCreator := func(name string, dir string) (DB, error) { + return NewCLevelDB(name, dir) + } + registerDBCreator(CLevelDBBackend, dbCreator, false) +} + // CLevelDB uses the C LevelDB database via a Go wrapper. type CLevelDB struct { db *levigo.DB @@ -17,10 +24,10 @@ type CLevelDB struct { woSync *levigo.WriteOptions } -var _ tmdb.DB = (*CLevelDB)(nil) +var _ DB = (*CLevelDB)(nil) -// New creates a new CLevelDB. -func NewDB(name string, dir string) (*CLevelDB, error) { +// NewCLevelDB creates a new CLevelDB. +func NewCLevelDB(name string, dir string) (*CLevelDB, error) { dbPath := filepath.Join(dir, name+".db") opts := levigo.NewOptions() @@ -46,7 +53,7 @@ func NewDB(name string, dir string) (*CLevelDB, error) { // Get implements DB. func (db *CLevelDB) Get(key []byte) ([]byte, error) { if len(key) == 0 { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } res, err := db.db.Get(db.ro, key) if err != nil { @@ -67,10 +74,10 @@ func (db *CLevelDB) Has(key []byte) (bool, error) { // Set implements DB. func (db *CLevelDB) Set(key []byte, value []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if value == nil { - return tmdb.ErrValueNil + return errValueNil } if err := db.db.Put(db.wo, key, value); err != nil { return err @@ -81,10 +88,10 @@ func (db *CLevelDB) Set(key []byte, value []byte) error { // SetSync implements DB. func (db *CLevelDB) SetSync(key []byte, value []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if value == nil { - return tmdb.ErrValueNil + return errValueNil } if err := db.db.Put(db.woSync, key, value); err != nil { return err @@ -95,7 +102,7 @@ func (db *CLevelDB) SetSync(key []byte, value []byte) error { // Delete implements DB. func (db *CLevelDB) Delete(key []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if err := db.db.Delete(db.wo, key); err != nil { return err @@ -106,7 +113,7 @@ func (db *CLevelDB) Delete(key []byte) error { // DeleteSync implements DB. func (db *CLevelDB) DeleteSync(key []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if err := db.db.Delete(db.woSync, key); err != nil { return err @@ -165,23 +172,23 @@ func (db *CLevelDB) Stats() map[string]string { } // NewBatch implements DB. -func (db *CLevelDB) NewBatch() tmdb.Batch { +func (db *CLevelDB) NewBatch() Batch { return newCLevelDBBatch(db) } // Iterator implements DB. -func (db *CLevelDB) Iterator(start, end []byte) (tmdb.Iterator, error) { +func (db *CLevelDB) Iterator(start, end []byte) (Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } itr := db.db.NewIterator(db.ro) return newCLevelDBIterator(itr, start, end, false), nil } // ReverseIterator implements DB. -func (db *CLevelDB) ReverseIterator(start, end []byte) (tmdb.Iterator, error) { +func (db *CLevelDB) ReverseIterator(start, end []byte) (Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } itr := db.db.NewIterator(db.ro) return newCLevelDBIterator(itr, start, end, true), nil diff --git a/cleveldb/db_test.go b/cleveldb/db_test.go deleted file mode 100644 index a451f01fc..000000000 --- a/cleveldb/db_test.go +++ /dev/null @@ -1,78 +0,0 @@ -package cleveldb - -import ( - "bytes" - "fmt" - "math/rand" - "testing" - - "github.com/tendermint/tm-db/internal/dbtest" -) - -func BenchmarkRandomReadsWrites2(b *testing.B) { - b.StopTimer() - - numItems := int64(1000000) - internal := map[int64]int64{} - for i := 0; i < int(numItems); i++ { - internal[int64(i)] = int64(0) - } - db, err := NewDB(fmt.Sprintf("test_%x", dbtest.RandStr(12)), "") - if err != nil { - b.Fatal(err.Error()) - return - } - - fmt.Println("ok, starting") - b.StartTimer() - - for i := 0; i < b.N; i++ { - // Write something - { - idx := (int64(rand.Int()) % numItems) - internal[idx]++ - val := internal[idx] - idxBytes := dbtest.Int642Bytes(idx) - valBytes := dbtest.Int642Bytes(val) - // fmt.Printf("Set %X -> %X\n", idxBytes, valBytes) - if err = db.Set( - idxBytes, - valBytes, - ); err != nil { - b.Error(err) - } - } - // Read something - { - idx := (int64(rand.Int()) % numItems) - val := internal[idx] - idxBytes := dbtest.Int642Bytes(idx) - valBytes, err := db.Get(idxBytes) - if err != nil { - b.Error(err) - } - // fmt.Printf("Get %X -> %X\n", idxBytes, valBytes) - if val == 0 { - if !bytes.Equal(valBytes, nil) { - b.Errorf("Expected %v for %v, got %X", - nil, idx, valBytes) - break - } - } else { - if len(valBytes) != 8 { - b.Errorf("Expected length 8 for %v, got %X", - idx, valBytes) - break - } - valGot := dbtest.Bytes2Int64(valBytes) - if val != valGot { - b.Errorf("Expected %v for %v, got %v", - val, idx, valGot) - break - } - } - } - } - - db.Close() -} diff --git a/cleveldb/batch.go b/cleveldb_batch.go similarity index 81% rename from cleveldb/batch.go rename to cleveldb_batch.go index c1a2aa210..132a521cb 100644 --- a/cleveldb/batch.go +++ b/cleveldb_batch.go @@ -1,9 +1,8 @@ -package cleveldb +// +build cleveldb -import ( - "github.com/jmhodges/levigo" - tmdb "github.com/tendermint/tm-db" -) +package db + +import "github.com/jmhodges/levigo" // cLevelDBBatch is a LevelDB batch. type cLevelDBBatch struct { @@ -21,13 +20,13 @@ func newCLevelDBBatch(db *CLevelDB) *cLevelDBBatch { // Set implements Batch. func (b *cLevelDBBatch) Set(key, value []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if value == nil { - return tmdb.ErrValueNil + return errValueNil } if b.batch == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } b.batch.Put(key, value) return nil @@ -36,10 +35,10 @@ func (b *cLevelDBBatch) Set(key, value []byte) error { // Delete implements Batch. func (b *cLevelDBBatch) Delete(key []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if b.batch == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } b.batch.Delete(key) return nil @@ -48,7 +47,7 @@ func (b *cLevelDBBatch) Delete(key []byte) error { // Write implements Batch. func (b *cLevelDBBatch) Write() error { if b.batch == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } err := b.db.db.Write(b.db.wo, b.batch) if err != nil { @@ -61,7 +60,7 @@ func (b *cLevelDBBatch) Write() error { // WriteSync implements Batch. func (b *cLevelDBBatch) WriteSync() error { if b.batch == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } err := b.db.db.Write(b.db.woSync, b.batch) if err != nil { diff --git a/cleveldb/iterator.go b/cleveldb_iterator.go similarity index 94% rename from cleveldb/iterator.go rename to cleveldb_iterator.go index ce019880f..04375d565 100644 --- a/cleveldb/iterator.go +++ b/cleveldb_iterator.go @@ -1,10 +1,11 @@ -package cleveldb +// +build cleveldb + +package db import ( "bytes" "github.com/jmhodges/levigo" - tmdb "github.com/tendermint/tm-db" ) // cLevelDBIterator is a cLevelDB iterator. @@ -15,11 +16,11 @@ type cLevelDBIterator struct { isInvalid bool } -var _ tmdb.Iterator = (*cLevelDBIterator)(nil) +var _ Iterator = (*cLevelDBIterator)(nil) func newCLevelDBIterator(source *levigo.Iterator, start, end []byte, isReverse bool) *cLevelDBIterator { if isReverse { - if len(end) == 0 { + if end == nil || len(end) == 0 { source.SeekToLast() } else { source.Seek(end) @@ -33,7 +34,7 @@ func newCLevelDBIterator(source *levigo.Iterator, start, end []byte, isReverse b } } } else { - if len(start) == 0 { + if start == nil || len(start) == 0 { source.SeekToFirst() } else { source.Seek(start) diff --git a/cleveldb_test.go b/cleveldb_test.go new file mode 100644 index 000000000..61e2fb6ef --- /dev/null +++ b/cleveldb_test.go @@ -0,0 +1,103 @@ +// +build cleveldb + +package db + +import ( + "bytes" + "fmt" + "math/rand" + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func BenchmarkRandomReadsWrites2(b *testing.B) { + b.StopTimer() + + numItems := int64(1000000) + internal := map[int64]int64{} + for i := 0; i < int(numItems); i++ { + internal[int64(i)] = int64(0) + } + db, err := NewCLevelDB(fmt.Sprintf("test_%x", randStr(12)), "") + if err != nil { + b.Fatal(err.Error()) + return + } + + fmt.Println("ok, starting") + b.StartTimer() + + for i := 0; i < b.N; i++ { + // Write something + { + idx := (int64(rand.Int()) % numItems) + internal[idx]++ + val := internal[idx] + idxBytes := int642Bytes(int64(idx)) + valBytes := int642Bytes(int64(val)) + //fmt.Printf("Set %X -> %X\n", idxBytes, valBytes) + db.Set( + idxBytes, + valBytes, + ) + } + // Read something + { + idx := (int64(rand.Int()) % numItems) + val := internal[idx] + idxBytes := int642Bytes(int64(idx)) + valBytes, err := db.Get(idxBytes) + if err != nil { + b.Error(err) + } + //fmt.Printf("Get %X -> %X\n", idxBytes, valBytes) + if val == 0 { + if !bytes.Equal(valBytes, nil) { + b.Errorf("Expected %v for %v, got %X", + nil, idx, valBytes) + break + } + } else { + if len(valBytes) != 8 { + b.Errorf("Expected length 8 for %v, got %X", + idx, valBytes) + break + } + valGot := bytes2Int64(valBytes) + if val != valGot { + b.Errorf("Expected %v for %v, got %v", + val, idx, valGot) + break + } + } + } + } + + db.Close() +} + +func TestCLevelDBBackend(t *testing.T) { + name := fmt.Sprintf("test_%x", randStr(12)) + // Can't use "" (current directory) or "./" here because levigo.Open returns: + // "Error initializing DB: IO error: test_XXX.db: Invalid argument" + dir := os.TempDir() + db, err := NewDB(name, CLevelDBBackend, dir) + require.NoError(t, err) + defer cleanupDBDir(dir, name) + + _, ok := db.(*CLevelDB) + assert.True(t, ok) +} + +func TestCLevelDBStats(t *testing.T) { + name := fmt.Sprintf("test_%x", randStr(12)) + dir := os.TempDir() + db, err := NewDB(name, CLevelDBBackend, dir) + require.NoError(t, err) + defer cleanupDBDir(dir, name) + + assert.NotEmpty(t, db.Stats()) +} diff --git a/internal/dbtest/dbtest.go b/common_test.go similarity index 56% rename from internal/dbtest/dbtest.go rename to common_test.go index 4315b886f..f48efd7aa 100644 --- a/internal/dbtest/dbtest.go +++ b/common_test.go @@ -1,44 +1,48 @@ -package dbtest +package db import ( "bytes" "encoding/binary" + "io/ioutil" "math/rand" - "os" - "path/filepath" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - tmdb "github.com/tendermint/tm-db" ) //---------------------------------------- // Helper functions. -func Valid(t *testing.T, itr tmdb.Iterator, expected bool) { +func checkValue(t *testing.T, db DB, key []byte, valueWanted []byte) { + valueGot, err := db.Get(key) + assert.NoError(t, err) + assert.Equal(t, valueWanted, valueGot) +} + +func checkValid(t *testing.T, itr Iterator, expected bool) { valid := itr.Valid() require.Equal(t, expected, valid) } -func Next(t *testing.T, itr tmdb.Iterator, expected bool) { +func checkNext(t *testing.T, itr Iterator, expected bool) { itr.Next() // assert.NoError(t, err) TODO: look at fixing this valid := itr.Valid() require.Equal(t, expected, valid) } -func NextPanics(t *testing.T, itr tmdb.Iterator) { +func checkNextPanics(t *testing.T, itr Iterator) { assert.Panics(t, func() { itr.Next() }, "checkNextPanics expected an error but didn't") } -func Domain(t *testing.T, itr tmdb.Iterator, start, end []byte) { +func checkDomain(t *testing.T, itr Iterator, start, end []byte) { ds, de := itr.Domain() assert.Equal(t, start, ds, "checkDomain domain start incorrect") assert.Equal(t, end, de, "checkDomain domain end incorrect") } -func Item(t *testing.T, itr tmdb.Iterator, key []byte, value []byte) { +func checkItem(t *testing.T, itr Iterator, key []byte, value []byte) { v := itr.Value() k := itr.Key() @@ -47,71 +51,30 @@ func Item(t *testing.T, itr tmdb.Iterator, key []byte, value []byte) { assert.Exactly(t, value, v) } -func Invalid(t *testing.T, itr tmdb.Iterator) { - Valid(t, itr, false) - KeyPanics(t, itr) - ValuePanics(t, itr) - NextPanics(t, itr) +func checkInvalid(t *testing.T, itr Iterator) { + checkValid(t, itr, false) + checkKeyPanics(t, itr) + checkValuePanics(t, itr) + checkNextPanics(t, itr) } -func KeyPanics(t *testing.T, itr tmdb.Iterator) { +func checkKeyPanics(t *testing.T, itr Iterator) { assert.Panics(t, func() { itr.Key() }, "checkKeyPanics expected panic but didn't") } -func Value(t *testing.T, db tmdb.DB, key []byte, valueWanted []byte) { - valueGot, err := db.Get(key) - assert.NoError(t, err) - assert.Equal(t, valueWanted, valueGot) -} - -func ValuePanics(t *testing.T, itr tmdb.Iterator) { +func checkValuePanics(t *testing.T, itr Iterator) { assert.Panics(t, func() { itr.Value() }) } -func CleanupDBDir(dir, name string) { - err := os.RemoveAll(filepath.Join(dir, name) + ".db") - if err != nil { - panic(err) - } -} - -const strChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" // 62 characters - -// RandStr constructs a random alphanumeric string of given length. -func RandStr(length int) string { - chars := []byte{} -MAIN_LOOP: - for { - val := rand.Int63() // nolint:gosec // G404: Use of weak random number generator - for i := 0; i < 10; i++ { - v := int(val & 0x3f) // rightmost 6 bits - if v >= 62 { // only 62 characters in strChars - val >>= 6 - continue - } else { - chars = append(chars, strChars[v]) - if len(chars) == length { - break MAIN_LOOP - } - val >>= 6 - } - } - } - - return string(chars) -} - -func Int642Bytes(i int64) []byte { - buf := make([]byte, 8) - binary.BigEndian.PutUint64(buf, uint64(i)) - return buf -} - -func Bytes2Int64(buf []byte) int64 { - return int64(binary.BigEndian.Uint64(buf)) +func newTempDB(t *testing.T, backend BackendType) (db DB, dbDir string) { + dirname, err := ioutil.TempDir("", "db_common_test") + require.NoError(t, err) + db, err = NewDB("testdb", backend, dirname) + require.NoError(t, err) + return db, dirname } -func BenchmarkRangeScans(b *testing.B, db tmdb.DB, dbSize int64) { +func benchmarkRangeScans(b *testing.B, db DB, dbSize int64) { b.StopTimer() rangeSize := int64(10000) @@ -120,7 +83,7 @@ func BenchmarkRangeScans(b *testing.B, db tmdb.DB, dbSize int64) { } for i := int64(0); i < dbSize; i++ { - bytes := Int642Bytes(i) + bytes := int642Bytes(i) err := db.Set(bytes, bytes) if err != nil { // require.NoError() is very expensive (according to profiler), so check manually @@ -130,10 +93,9 @@ func BenchmarkRangeScans(b *testing.B, db tmdb.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)) + iter, err := db.Iterator(int642Bytes(start), int642Bytes(end)) require.NoError(b, err) count := 0 for ; iter.Valid(); iter.Next() { @@ -144,7 +106,7 @@ func BenchmarkRangeScans(b *testing.B, db tmdb.DB, dbSize int64) { } } -func BenchmarkRandomReadsWrites(b *testing.B, db tmdb.DB) { +func benchmarkRandomReadsWrites(b *testing.B, db DB) { b.StopTimer() // create dummy data @@ -160,12 +122,12 @@ func BenchmarkRandomReadsWrites(b *testing.B, db tmdb.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) - valBytes := Int642Bytes(val) - // fmt.Printf("Set %X -> %X\n", idxBytes, valBytes) + idxBytes := int642Bytes(idx) + valBytes := int642Bytes(val) + //fmt.Printf("Set %X -> %X\n", idxBytes, valBytes) err := db.Set(idxBytes, valBytes) if err != nil { // require.NoError() is very expensive (according to profiler), so check manually @@ -175,15 +137,15 @@ func BenchmarkRandomReadsWrites(b *testing.B, db tmdb.DB) { // Read something { - idx := rand.Int63n(numItems) // nolint: gosec + idx := rand.Int63n(numItems) valExp := internal[idx] - idxBytes := Int642Bytes(idx) + idxBytes := int642Bytes(idx) valBytes, err := db.Get(idxBytes) if err != nil { // require.NoError() is very expensive (according to profiler), so check manually b.Fatal(b, err) } - // fmt.Printf("Get %X -> %X\n", idxBytes, valBytes) + //fmt.Printf("Get %X -> %X\n", idxBytes, valBytes) if valExp == 0 { if !bytes.Equal(valBytes, nil) { b.Errorf("Expected %v for %v, got %X", nil, idx, valBytes) @@ -194,7 +156,7 @@ func BenchmarkRandomReadsWrites(b *testing.B, db tmdb.DB) { b.Errorf("Expected length 8 for %v, got %X", idx, valBytes) break } - valGot := Bytes2Int64(valBytes) + valGot := bytes2Int64(valBytes) if valExp != valGot { b.Errorf("Expected %v for %v, got %v", valExp, idx, valGot) break @@ -204,3 +166,13 @@ func BenchmarkRandomReadsWrites(b *testing.B, db tmdb.DB) { } } + +func int642Bytes(i int64) []byte { + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, uint64(i)) + return buf +} + +func bytes2Int64(buf []byte) int64 { + return int64(binary.BigEndian.Uint64(buf)) +} diff --git a/metadb/db.go b/db.go similarity index 80% rename from metadb/db.go rename to db.go index 58951f4e0..4d518c0b0 100644 --- a/metadb/db.go +++ b/db.go @@ -1,10 +1,8 @@ -package metadb +package db import ( "fmt" "strings" - - tmdb "github.com/tendermint/tm-db" ) type BackendType string @@ -15,7 +13,6 @@ const ( // popular implementation) // - pure go // - stable - // - use goleveldb build tag (go build -tags goleveldb) GoLevelDBBackend BackendType = "goleveldb" // CLevelDBBackend represents cleveldb (uses levigo wrapper) // - fast @@ -24,7 +21,6 @@ const ( CLevelDBBackend BackendType = "cleveldb" // MemDBBackend represents in-memory key value store, which is mostly used // for testing. - // - use memdb build tag (go build -tags memdb) MemDBBackend BackendType = "memdb" // BoltDBBackend represents bolt (uses etcd's fork of bolt - // github.com/etcd-io/bbolt) @@ -37,13 +33,11 @@ const ( // - requires gcc // - use rocksdb build tag (go build -tags rocksdb) RocksDBBackend BackendType = "rocksdb" - // BadgerDBBackend represents badger (uses github.com/dgraph-io/badger/v2) - // - EXPERIMENTAL - // - use badgerdb build tag (go build -tags badgerdb) + BadgerDBBackend BackendType = "badgerdb" ) -type dbCreator func(name string, dir string) (tmdb.DB, error) +type dbCreator func(name string, dir string) (DB, error) var backends = map[BackendType]dbCreator{} @@ -56,7 +50,7 @@ func registerDBCreator(backend BackendType, creator dbCreator, force bool) { } // NewDB creates a new database of type backend with the given name. -func NewDB(name string, backend BackendType, dir string) (tmdb.DB, error) { +func NewDB(name string, backend BackendType, dir string) (DB, error) { dbCreator, ok := backends[backend] if !ok { keys := make([]string, 0, len(backends)) diff --git a/metadb/db_test.go b/db_test.go similarity index 74% rename from metadb/db_test.go rename to db_test.go index 02fd4f43c..dc81d663b 100644 --- a/metadb/db_test.go +++ b/db_test.go @@ -1,4 +1,4 @@ -package metadb +package db import ( "fmt" @@ -6,7 +6,6 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/tendermint/tm-db/internal/dbtest" ) func TestDBIteratorSingleKey(t *testing.T) { @@ -15,18 +14,18 @@ func TestDBIteratorSingleKey(t *testing.T) { db, dir := newTempDB(t, backend) defer os.RemoveAll(dir) - err := db.SetSync([]byte("1"), []byte("value_1")) + err := db.SetSync(bz("1"), bz("value_1")) assert.NoError(t, err) itr, err := db.Iterator(nil, nil) assert.NoError(t, err) - dbtest.Valid(t, itr, true) - dbtest.Next(t, itr, false) - dbtest.Valid(t, itr, false) - dbtest.NextPanics(t, itr) + checkValid(t, itr, true) + checkNext(t, itr, false) + checkValid(t, itr, false) + checkNextPanics(t, itr) // Once invalid... - dbtest.Invalid(t, itr) + checkInvalid(t, itr) }) } } @@ -37,27 +36,27 @@ func TestDBIteratorTwoKeys(t *testing.T) { db, dir := newTempDB(t, backend) defer os.RemoveAll(dir) - err := db.SetSync([]byte("1"), []byte("value_1")) + err := db.SetSync(bz("1"), bz("value_1")) assert.NoError(t, err) - err = db.SetSync([]byte("2"), []byte("value_1")) + err = db.SetSync(bz("2"), bz("value_1")) assert.NoError(t, err) { // Fail by calling Next too much itr, err := db.Iterator(nil, nil) assert.NoError(t, err) - dbtest.Valid(t, itr, true) + checkValid(t, itr, true) - dbtest.Next(t, itr, true) - dbtest.Valid(t, itr, true) + checkNext(t, itr, true) + checkValid(t, itr, true) - dbtest.Next(t, itr, false) - dbtest.Valid(t, itr, false) + checkNext(t, itr, false) + checkValid(t, itr, false) - dbtest.NextPanics(t, itr) + checkNextPanics(t, itr) // Once invalid... - dbtest.Invalid(t, itr) + checkInvalid(t, itr) } }) } @@ -104,7 +103,7 @@ func TestDBIteratorEmpty(t *testing.T) { itr, err := db.Iterator(nil, nil) assert.NoError(t, err) - dbtest.Invalid(t, itr) + checkInvalid(t, itr) }) } } @@ -115,10 +114,10 @@ func TestDBIteratorEmptyBeginAfter(t *testing.T) { db, dir := newTempDB(t, backend) defer os.RemoveAll(dir) - itr, err := db.Iterator([]byte("1"), nil) + itr, err := db.Iterator(bz("1"), nil) assert.NoError(t, err) - dbtest.Invalid(t, itr) + checkInvalid(t, itr) }) } } @@ -129,12 +128,12 @@ func TestDBIteratorNonemptyBeginAfter(t *testing.T) { db, dir := newTempDB(t, backend) defer os.RemoveAll(dir) - err := db.SetSync([]byte("1"), []byte("value_1")) + err := db.SetSync(bz("1"), bz("value_1")) assert.NoError(t, err) - itr, err := db.Iterator([]byte("2"), nil) + itr, err := db.Iterator(bz("2"), nil) assert.NoError(t, err) - dbtest.Invalid(t, itr) + checkInvalid(t, itr) }) } } diff --git a/goleveldb/db.go b/goleveldb.go similarity index 80% rename from goleveldb/db.go rename to goleveldb.go index c60fdf543..fd1bffd18 100644 --- a/goleveldb/db.go +++ b/goleveldb.go @@ -1,4 +1,4 @@ -package goleveldb +package db import ( "fmt" @@ -8,20 +8,26 @@ import ( "github.com/syndtr/goleveldb/leveldb/errors" "github.com/syndtr/goleveldb/leveldb/opt" "github.com/syndtr/goleveldb/leveldb/util" - tmdb "github.com/tendermint/tm-db" ) +func init() { + dbCreator := func(name string, dir string) (DB, error) { + return NewGoLevelDB(name, dir) + } + registerDBCreator(GoLevelDBBackend, dbCreator, false) +} + type GoLevelDB struct { db *leveldb.DB } -var _ tmdb.DB = (*GoLevelDB)(nil) +var _ DB = (*GoLevelDB)(nil) -func NewDB(name string, dir string) (*GoLevelDB, error) { - return NewDBWithOpts(name, dir, nil) +func NewGoLevelDB(name string, dir string) (*GoLevelDB, error) { + return NewGoLevelDBWithOpts(name, dir, nil) } -func NewDBWithOpts(name string, dir string, o *opt.Options) (*GoLevelDB, error) { +func NewGoLevelDBWithOpts(name string, dir string, o *opt.Options) (*GoLevelDB, error) { dbPath := filepath.Join(dir, name+".db") db, err := leveldb.OpenFile(dbPath, o) if err != nil { @@ -36,7 +42,7 @@ func NewDBWithOpts(name string, dir string, o *opt.Options) (*GoLevelDB, error) // Get implements DB. func (db *GoLevelDB) Get(key []byte) ([]byte, error) { if len(key) == 0 { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } res, err := db.db.Get(key, nil) if err != nil { @@ -60,10 +66,10 @@ func (db *GoLevelDB) Has(key []byte) (bool, error) { // Set implements DB. func (db *GoLevelDB) Set(key []byte, value []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if value == nil { - return tmdb.ErrValueNil + return errValueNil } if err := db.db.Put(key, value, nil); err != nil { return err @@ -74,10 +80,10 @@ func (db *GoLevelDB) Set(key []byte, value []byte) error { // SetSync implements DB. func (db *GoLevelDB) SetSync(key []byte, value []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if value == nil { - return tmdb.ErrValueNil + return errValueNil } if err := db.db.Put(key, value, &opt.WriteOptions{Sync: true}); err != nil { return err @@ -88,7 +94,7 @@ func (db *GoLevelDB) SetSync(key []byte, value []byte) error { // Delete implements DB. func (db *GoLevelDB) Delete(key []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if err := db.db.Delete(key, nil); err != nil { return err @@ -99,7 +105,7 @@ func (db *GoLevelDB) Delete(key []byte) error { // DeleteSync implements DB. func (db *GoLevelDB) DeleteSync(key []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } err := db.db.Delete(key, &opt.WriteOptions{Sync: true}) if err != nil { @@ -161,23 +167,23 @@ func (db *GoLevelDB) Stats() map[string]string { } // NewBatch implements DB. -func (db *GoLevelDB) NewBatch() tmdb.Batch { +func (db *GoLevelDB) NewBatch() Batch { return newGoLevelDBBatch(db) } // Iterator implements DB. -func (db *GoLevelDB) Iterator(start, end []byte) (tmdb.Iterator, error) { +func (db *GoLevelDB) Iterator(start, end []byte) (Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } itr := db.db.NewIterator(&util.Range{Start: start, Limit: end}, nil) return newGoLevelDBIterator(itr, start, end, false), nil } // ReverseIterator implements DB. -func (db *GoLevelDB) ReverseIterator(start, end []byte) (tmdb.Iterator, error) { +func (db *GoLevelDB) ReverseIterator(start, end []byte) (Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } itr := db.db.NewIterator(&util.Range{Start: start, Limit: end}, nil) return newGoLevelDBIterator(itr, start, end, true), nil diff --git a/goleveldb/db_test.go b/goleveldb/db_test.go deleted file mode 100644 index a969a2464..000000000 --- a/goleveldb/db_test.go +++ /dev/null @@ -1,44 +0,0 @@ -package goleveldb - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/require" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/tendermint/tm-db/internal/dbtest" -) - -func TestGoLevelDBNewDB(t *testing.T) { - name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) - defer dbtest.CleanupDBDir("", name) - - // Test we can't open the db twice for writing - wr1, err := NewDB(name, "") - require.Nil(t, err) - _, err = NewDB(name, "") - require.NotNil(t, err) - wr1.Close() // Close the db to release the lock - - // Test we can open the db twice for reading only - ro1, err := NewDBWithOpts(name, "", &opt.Options{ReadOnly: true}) - require.Nil(t, err) - defer ro1.Close() - ro2, err := NewDBWithOpts(name, "", &opt.Options{ReadOnly: true}) - require.Nil(t, err) - defer ro2.Close() -} - -func BenchmarkGoLevelDBRandomReadsWrites(b *testing.B) { - name := fmt.Sprintf("test_%x", dbtest.RandStr(12)) - db, err := NewDB(name, "") - if err != nil { - b.Fatal(err) - } - defer func() { - db.Close() - dbtest.CleanupDBDir("", name) - }() - - dbtest.BenchmarkRandomReadsWrites(b, db) -} diff --git a/goleveldb/batch.go b/goleveldb_batch.go similarity index 82% rename from goleveldb/batch.go rename to goleveldb_batch.go index 5f9f4a7d6..4c1c6a2ba 100644 --- a/goleveldb/batch.go +++ b/goleveldb_batch.go @@ -1,9 +1,8 @@ -package goleveldb +package db import ( "github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb/opt" - tmdb "github.com/tendermint/tm-db" ) type goLevelDBBatch struct { @@ -11,7 +10,7 @@ type goLevelDBBatch struct { batch *leveldb.Batch } -var _ tmdb.Batch = (*goLevelDBBatch)(nil) +var _ Batch = (*goLevelDBBatch)(nil) func newGoLevelDBBatch(db *GoLevelDB) *goLevelDBBatch { return &goLevelDBBatch{ @@ -23,13 +22,13 @@ func newGoLevelDBBatch(db *GoLevelDB) *goLevelDBBatch { // Set implements Batch. func (b *goLevelDBBatch) Set(key, value []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if value == nil { - return tmdb.ErrValueNil + return errValueNil } if b.batch == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } b.batch.Put(key, value) return nil @@ -38,10 +37,10 @@ func (b *goLevelDBBatch) Set(key, value []byte) error { // Delete implements Batch. func (b *goLevelDBBatch) Delete(key []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if b.batch == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } b.batch.Delete(key) return nil @@ -59,7 +58,7 @@ func (b *goLevelDBBatch) WriteSync() error { func (b *goLevelDBBatch) write(sync bool) error { if b.batch == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } err := b.db.db.Write(b.batch, &opt.WriteOptions{Sync: sync}) if err != nil { diff --git a/goleveldb/iterator.go b/goleveldb_iterator.go similarity index 93% rename from goleveldb/iterator.go rename to goleveldb_iterator.go index 4a6add77d..9cf9a5e15 100644 --- a/goleveldb/iterator.go +++ b/goleveldb_iterator.go @@ -1,10 +1,9 @@ -package goleveldb +package db import ( "bytes" "github.com/syndtr/goleveldb/leveldb/iterator" - tmdb "github.com/tendermint/tm-db" ) type goLevelDBIterator struct { @@ -15,7 +14,7 @@ type goLevelDBIterator struct { isInvalid bool } -var _ tmdb.Iterator = (*goLevelDBIterator)(nil) +var _ Iterator = (*goLevelDBIterator)(nil) func newGoLevelDBIterator(source iterator.Iterator, start, end []byte, isReverse bool) *goLevelDBIterator { if isReverse { @@ -110,12 +109,6 @@ func (itr *goLevelDBIterator) Value() []byte { return cp(itr.source.Value()) } -func cp(bz []byte) (ret []byte) { - ret = make([]byte, len(bz)) - copy(ret, bz) - return ret -} - // Next implements Iterator. func (itr *goLevelDBIterator) Next() { itr.assertIsValid() diff --git a/goleveldb_test.go b/goleveldb_test.go new file mode 100644 index 000000000..e1c879f10 --- /dev/null +++ b/goleveldb_test.go @@ -0,0 +1,43 @@ +package db + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + "github.com/syndtr/goleveldb/leveldb/opt" +) + +func TestGoLevelDBNewGoLevelDB(t *testing.T) { + name := fmt.Sprintf("test_%x", randStr(12)) + defer cleanupDBDir("", name) + + // Test we can't open the db twice for writing + wr1, err := NewGoLevelDB(name, "") + require.Nil(t, err) + _, err = NewGoLevelDB(name, "") + require.NotNil(t, err) + 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}) + require.Nil(t, err) + defer ro1.Close() + ro2, err := NewGoLevelDBWithOpts(name, "", &opt.Options{ReadOnly: true}) + require.Nil(t, err) + defer ro2.Close() +} + +func BenchmarkGoLevelDBRandomReadsWrites(b *testing.B) { + name := fmt.Sprintf("test_%x", randStr(12)) + db, err := NewGoLevelDB(name, "") + if err != nil { + b.Fatal(err) + } + defer func() { + db.Close() + cleanupDBDir("", name) + }() + + benchmarkRandomReadsWrites(b, db) +} diff --git a/makefile b/makefile index fa195ea1e..bedebc457 100644 --- a/makefile +++ b/makefile @@ -12,14 +12,6 @@ test: @echo "--> Running go test" @go test $(PACKAGES) -v -test-memdb: - @echo "--> Running go test" - @go test $(PACKAGES) -tags memdb -v - -test-goleveldb: - @echo "--> Running go test" - @go test $(PACKAGES) -tags goleveldb -v - test-cleveldb: @echo "--> Running go test" @go test $(PACKAGES) -tags cleveldb -v @@ -38,12 +30,7 @@ test-badgerdb: test-all: @echo "--> Running go test" - @go test $(PACKAGES) -tags memdb,goleveldb,cleveldb,boltdb,rocksdb,badgerdb -v - -test-all-docker: - @echo "--> Running go test" - @docker run --rm -v $(CURDIR):/workspace --workdir /workspace tendermintdev/docker-tm-db-testing go test $(PACKAGES) -tags memdb,goleveldb,cleveldb,boltdb,rocksdb,badgerdb -v -.PHONY: test-all-docker + @go test $(PACKAGES) -tags cleveldb,boltdb,rocksdb,badgerdb -v lint: @echo "--> Running linter" diff --git a/memdb/db.go b/memdb.go similarity index 77% rename from memdb/db.go rename to memdb.go index 1053f637b..d019af230 100644 --- a/memdb/db.go +++ b/memdb.go @@ -1,4 +1,4 @@ -package memdb +package db import ( "bytes" @@ -6,7 +6,6 @@ import ( "sync" "github.com/google/btree" - tmdb "github.com/tendermint/tm-db" ) const ( @@ -14,6 +13,12 @@ const ( bTreeDegree = 32 ) +func init() { + registerDBCreator(MemDBBackend, func(name, dir string) (DB, error) { + return NewMemDB(), nil + }, false) +} + // item is a btree.Item with byte slices as keys and values type item struct { key []byte @@ -48,10 +53,10 @@ type MemDB struct { btree *btree.BTree } -var _ tmdb.DB = (*MemDB)(nil) +var _ DB = (*MemDB)(nil) -// NewDB creates a new in-memory database. -func NewDB() *MemDB { +// NewMemDB creates a new in-memory database. +func NewMemDB() *MemDB { database := &MemDB{ btree: btree.New(bTreeDegree), } @@ -61,7 +66,7 @@ func NewDB() *MemDB { // Get implements DB. func (db *MemDB) Get(key []byte) ([]byte, error) { if len(key) == 0 { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } db.mtx.RLock() defer db.mtx.RUnlock() @@ -76,7 +81,7 @@ func (db *MemDB) Get(key []byte) ([]byte, error) { // Has implements DB. func (db *MemDB) Has(key []byte) (bool, error) { if len(key) == 0 { - return false, tmdb.ErrKeyEmpty + return false, errKeyEmpty } db.mtx.RLock() defer db.mtx.RUnlock() @@ -87,10 +92,10 @@ func (db *MemDB) Has(key []byte) (bool, error) { // Set implements DB. func (db *MemDB) Set(key []byte, value []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if value == nil { - return tmdb.ErrValueNil + return errValueNil } db.mtx.Lock() defer db.mtx.Unlock() @@ -112,7 +117,7 @@ func (db *MemDB) SetSync(key []byte, value []byte) error { // Delete implements DB. func (db *MemDB) Delete(key []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } db.mtx.Lock() defer db.mtx.Unlock() @@ -164,24 +169,40 @@ func (db *MemDB) Stats() map[string]string { } // NewBatch implements DB. -func (db *MemDB) NewBatch() tmdb.Batch { +func (db *MemDB) NewBatch() Batch { return newMemDBBatch(db) } // Iterator implements DB. // Takes out a read-lock on the database until the iterator is closed. -func (db *MemDB) Iterator(start, end []byte) (tmdb.Iterator, error) { +func (db *MemDB) Iterator(start, end []byte) (Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } return newMemDBIterator(db, start, end, false), nil } // ReverseIterator implements DB. // Takes out a read-lock on the database until the iterator is closed. -func (db *MemDB) ReverseIterator(start, end []byte) (tmdb.Iterator, error) { +func (db *MemDB) ReverseIterator(start, end []byte) (Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } return newMemDBIterator(db, start, end, true), nil } + +// IteratorNoMtx makes an iterator with no mutex. +func (db *MemDB) IteratorNoMtx(start, end []byte) (Iterator, error) { + if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { + return nil, errKeyEmpty + } + return newMemDBIteratorMtxChoice(db, start, end, false, false), nil +} + +// ReverseIteratorNoMtx makes an iterator with no mutex. +func (db *MemDB) ReverseIteratorNoMtx(start, end []byte) (Iterator, error) { + if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { + return nil, errKeyEmpty + } + return newMemDBIteratorMtxChoice(db, start, end, true, false), nil +} diff --git a/memdb/db_test.go b/memdb/db_test.go deleted file mode 100644 index 9d38def9f..000000000 --- a/memdb/db_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package memdb - -import ( - "testing" - - "github.com/tendermint/tm-db/internal/dbtest" -) - -func BenchmarkMemDBRangeScans1M(b *testing.B) { - db := NewDB() - defer db.Close() - - dbtest.BenchmarkRangeScans(b, db, int64(1e6)) -} - -func BenchmarkMemDBRangeScans10M(b *testing.B) { - db := NewDB() - defer db.Close() - - dbtest.BenchmarkRangeScans(b, db, int64(10e6)) -} - -func BenchmarkMemDBRandomReadsWrites(b *testing.B) { - db := NewDB() - defer db.Close() - - dbtest.BenchmarkRandomReadsWrites(b, db) -} diff --git a/memdb/batch.go b/memdb_batch.go similarity index 84% rename from memdb/batch.go rename to memdb_batch.go index cd3b4c1a2..6ff30fea6 100644 --- a/memdb/batch.go +++ b/memdb_batch.go @@ -1,10 +1,6 @@ -package memdb +package db -import ( - "fmt" - - tmdb "github.com/tendermint/tm-db" -) +import "fmt" // memDBBatch operations type opType int @@ -26,7 +22,7 @@ type memDBBatch struct { ops []operation } -var _ tmdb.Batch = (*memDBBatch)(nil) +var _ Batch = (*memDBBatch)(nil) // newMemDBBatch creates a new memDBBatch func newMemDBBatch(db *MemDB) *memDBBatch { @@ -39,13 +35,13 @@ func newMemDBBatch(db *MemDB) *memDBBatch { // Set implements Batch. func (b *memDBBatch) Set(key, value []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if value == nil { - return tmdb.ErrValueNil + return errValueNil } if b.ops == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } b.ops = append(b.ops, operation{opTypeSet, key, value}) return nil @@ -54,10 +50,10 @@ func (b *memDBBatch) Set(key, value []byte) error { // Delete implements Batch. func (b *memDBBatch) Delete(key []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if b.ops == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } b.ops = append(b.ops, operation{opTypeDelete, key, nil}) return nil @@ -66,7 +62,7 @@ func (b *memDBBatch) Delete(key []byte) error { // Write implements Batch. func (b *memDBBatch) Write() error { if b.ops == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } b.db.mtx.Lock() defer b.db.mtx.Unlock() diff --git a/memdb/iterator.go b/memdb_iterator.go similarity index 90% rename from memdb/iterator.go rename to memdb_iterator.go index 8def00650..ebd104f67 100644 --- a/memdb/iterator.go +++ b/memdb_iterator.go @@ -1,11 +1,10 @@ -package memdb +package db import ( "bytes" "context" "github.com/google/btree" - tmdb "github.com/tendermint/tm-db" ) const ( @@ -22,12 +21,17 @@ type memDBIterator struct { item *item start []byte end []byte + useMtx bool } -var _ tmdb.Iterator = (*memDBIterator)(nil) +var _ Iterator = (*memDBIterator)(nil) // newMemDBIterator creates a new memDBIterator. func newMemDBIterator(db *MemDB, start []byte, 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 { ctx, cancel := context.WithCancel(context.Background()) ch := make(chan *item, chBufferSize) iter := &memDBIterator{ @@ -35,11 +39,16 @@ func newMemDBIterator(db *MemDB, start []byte, end []byte, reverse bool) *memDBI cancel: cancel, start: start, end: end, + useMtx: useMtx, } - db.mtx.RLock() + if useMtx { + db.mtx.RLock() + } go func() { - defer db.mtx.RUnlock() + if useMtx { + defer db.mtx.RUnlock() + } // Because we use [start, end) for reverse ranges, while btree uses (start, end], we need // the following variables to handle some reverse iteration conditions ourselves. var ( diff --git a/memdb_test.go b/memdb_test.go new file mode 100644 index 000000000..4e67e813d --- /dev/null +++ b/memdb_test.go @@ -0,0 +1,26 @@ +package db + +import ( + "testing" +) + +func BenchmarkMemDBRangeScans1M(b *testing.B) { + db := NewMemDB() + defer db.Close() + + benchmarkRangeScans(b, db, int64(1e6)) +} + +func BenchmarkMemDBRangeScans10M(b *testing.B) { + db := NewMemDB() + defer db.Close() + + benchmarkRangeScans(b, db, int64(10e6)) +} + +func BenchmarkMemDBRandomReadsWrites(b *testing.B) { + db := NewMemDB() + defer db.Close() + + benchmarkRandomReadsWrites(b, db) +} diff --git a/metadb/db_badgerdb.go b/metadb/db_badgerdb.go deleted file mode 100644 index ee45ae910..000000000 --- a/metadb/db_badgerdb.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build badgerdb - -package metadb - -import ( - tmdb "github.com/tendermint/tm-db" - "github.com/tendermint/tm-db/badgerdb" -) - -func badgerDBCreator(name, dir string) (tmdb.DB, error) { - return badgerdb.NewDB(name, dir) -} - -func init() { registerDBCreator(BadgerDBBackend, badgerDBCreator, true) } diff --git a/metadb/db_boltdb.go b/metadb/db_boltdb.go deleted file mode 100644 index afcc92aab..000000000 --- a/metadb/db_boltdb.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build boltdb - -package metadb - -import ( - tmdb "github.com/tendermint/tm-db" - "github.com/tendermint/tm-db/boltdb" -) - -func boltDBCreator(name, dir string) (tmdb.DB, error) { - return boltdb.NewDB(name, dir) -} - -func init() { registerDBCreator(BoltDBBackend, boltDBCreator, true) } diff --git a/metadb/db_cleveldb.go b/metadb/db_cleveldb.go deleted file mode 100644 index bed0bdb46..000000000 --- a/metadb/db_cleveldb.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build cleveldb - -package metadb - -import ( - tmdb "github.com/tendermint/tm-db" - "github.com/tendermint/tm-db/cleveldb" -) - -func clevelDBCreator(name string, dir string) (tmdb.DB, error) { - return cleveldb.NewDB(name, dir) -} - -func init() { registerDBCreator(CLevelDBBackend, clevelDBCreator, false) } diff --git a/metadb/db_goleveldb.go b/metadb/db_goleveldb.go deleted file mode 100644 index d4ee7b5c1..000000000 --- a/metadb/db_goleveldb.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build goleveldb - -package metadb - -import ( - tmdb "github.com/tendermint/tm-db" - "github.com/tendermint/tm-db/goleveldb" -) - -func golevelDBCreator(name, dir string) (tmdb.DB, error) { - return goleveldb.NewDB(name, dir) -} - -func init() { registerDBCreator(GoLevelDBBackend, golevelDBCreator, true) } diff --git a/metadb/db_memdb.go b/metadb/db_memdb.go deleted file mode 100644 index 4273f5402..000000000 --- a/metadb/db_memdb.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build memdb - -package metadb - -import ( - tmdb "github.com/tendermint/tm-db" - "github.com/tendermint/tm-db/memdb" -) - -func memdbDBCreator(name, dir string) (tmdb.DB, error) { - return memdb.NewDB(), nil -} - -func init() { registerDBCreator(MemDBBackend, memdbDBCreator, false) } diff --git a/metadb/db_rocksdb.go b/metadb/db_rocksdb.go deleted file mode 100644 index 98f1b6162..000000000 --- a/metadb/db_rocksdb.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build rocksdb - -package metadb - -import ( - tmdb "github.com/tendermint/tm-db" - "github.com/tendermint/tm-db/rocksdb" -) - -func rocksDBCreator(name, dir string) (tmdb.DB, error) { - return rocksdb.NewDB(name, dir) -} - -func init() { registerDBCreator(RocksDBBackend, rocksDBCreator, true) } diff --git a/prefixdb.go b/prefixdb.go index fd3386e51..0b2d2a1cf 100644 --- a/prefixdb.go +++ b/prefixdb.go @@ -25,7 +25,7 @@ func NewPrefixDB(db DB, prefix []byte) *PrefixDB { // Get implements DB. func (pdb *PrefixDB) Get(key []byte) ([]byte, error) { if len(key) == 0 { - return nil, ErrKeyEmpty + return nil, errKeyEmpty } pdb.mtx.Lock() defer pdb.mtx.Unlock() @@ -41,7 +41,7 @@ func (pdb *PrefixDB) Get(key []byte) ([]byte, error) { // Has implements DB. func (pdb *PrefixDB) Has(key []byte) (bool, error) { if len(key) == 0 { - return false, ErrKeyEmpty + return false, errKeyEmpty } pdb.mtx.Lock() defer pdb.mtx.Unlock() @@ -57,10 +57,10 @@ func (pdb *PrefixDB) Has(key []byte) (bool, error) { // Set implements DB. func (pdb *PrefixDB) Set(key []byte, value []byte) error { if len(key) == 0 { - return ErrKeyEmpty + return errKeyEmpty } if value == nil { - return ErrValueNil + return errValueNil } pdb.mtx.Lock() defer pdb.mtx.Unlock() @@ -75,10 +75,10 @@ func (pdb *PrefixDB) Set(key []byte, value []byte) error { // SetSync implements DB. func (pdb *PrefixDB) SetSync(key []byte, value []byte) error { if len(key) == 0 { - return ErrKeyEmpty + return errKeyEmpty } if value == nil { - return ErrValueNil + return errValueNil } pdb.mtx.Lock() defer pdb.mtx.Unlock() @@ -89,7 +89,7 @@ func (pdb *PrefixDB) SetSync(key []byte, value []byte) error { // Delete implements DB. func (pdb *PrefixDB) Delete(key []byte) error { if len(key) == 0 { - return ErrKeyEmpty + return errKeyEmpty } pdb.mtx.Lock() defer pdb.mtx.Unlock() @@ -100,7 +100,7 @@ func (pdb *PrefixDB) Delete(key []byte) error { // DeleteSync implements DB. func (pdb *PrefixDB) DeleteSync(key []byte) error { if len(key) == 0 { - return ErrKeyEmpty + return errKeyEmpty } pdb.mtx.Lock() defer pdb.mtx.Unlock() @@ -111,7 +111,7 @@ func (pdb *PrefixDB) DeleteSync(key []byte) error { // Iterator implements DB. func (pdb *PrefixDB) Iterator(start, end []byte) (Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, ErrKeyEmpty + return nil, errKeyEmpty } pdb.mtx.Lock() defer pdb.mtx.Unlock() @@ -134,7 +134,7 @@ func (pdb *PrefixDB) Iterator(start, end []byte) (Iterator, error) { // ReverseIterator implements DB. func (pdb *PrefixDB) ReverseIterator(start, end []byte) (Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, ErrKeyEmpty + return nil, errKeyEmpty } pdb.mtx.Lock() defer pdb.mtx.Unlock() diff --git a/prefixdb_batch.go b/prefixdb_batch.go index 089dd1adf..1a8005cad 100644 --- a/prefixdb_batch.go +++ b/prefixdb_batch.go @@ -17,10 +17,10 @@ func newPrefixBatch(prefix []byte, source Batch) prefixDBBatch { // Set implements Batch. func (pb prefixDBBatch) Set(key, value []byte) error { if len(key) == 0 { - return ErrKeyEmpty + return errKeyEmpty } if value == nil { - return ErrValueNil + return errValueNil } pkey := append(cp(pb.prefix), key...) return pb.source.Set(pkey, value) @@ -29,7 +29,7 @@ func (pb prefixDBBatch) Set(key, value []byte) error { // Delete implements Batch. func (pb prefixDBBatch) Delete(key []byte) error { if len(key) == 0 { - return ErrKeyEmpty + return errKeyEmpty } pkey := append(cp(pb.prefix), key...) return pb.source.Delete(pkey) diff --git a/prefixdb_test.go b/prefixdb_test.go index b972c9bd3..3fc53ee92 100644 --- a/prefixdb_test.go +++ b/prefixdb_test.go @@ -1,120 +1,117 @@ -package db_test +package db import ( "testing" "github.com/stretchr/testify/require" - tmdb "github.com/tendermint/tm-db" - "github.com/tendermint/tm-db/internal/dbtest" - "github.com/tendermint/tm-db/memdb" ) -func mockDBWithStuff(t *testing.T) tmdb.DB { - db := memdb.NewDB() +func mockDBWithStuff(t *testing.T) DB { + db := NewMemDB() // Under "key" prefix - require.NoError(t, db.Set([]byte("key"), []byte("value"))) - require.NoError(t, db.Set([]byte("key1"), []byte("value1"))) - require.NoError(t, db.Set([]byte("key2"), []byte("value2"))) - require.NoError(t, db.Set([]byte("key3"), []byte("value3"))) - require.NoError(t, db.Set([]byte("something"), []byte("else"))) - require.NoError(t, db.Set([]byte("k"), []byte("val"))) - require.NoError(t, db.Set([]byte("ke"), []byte("valu"))) - require.NoError(t, db.Set([]byte("kee"), []byte("valuu"))) + 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"))) return db } func TestPrefixDBSimple(t *testing.T) { db := mockDBWithStuff(t) - pdb := tmdb.NewPrefixDB(db, []byte("key")) + pdb := NewPrefixDB(db, bz("key")) - dbtest.Value(t, pdb, []byte("key"), nil) - dbtest.Value(t, pdb, []byte("key1"), nil) - dbtest.Value(t, pdb, []byte("1"), []byte("value1")) - dbtest.Value(t, pdb, []byte("key2"), nil) - dbtest.Value(t, pdb, []byte("2"), []byte("value2")) - dbtest.Value(t, pdb, []byte("key3"), nil) - dbtest.Value(t, pdb, []byte("3"), []byte("value3")) - dbtest.Value(t, pdb, []byte("something"), nil) - dbtest.Value(t, pdb, []byte("k"), nil) - dbtest.Value(t, pdb, []byte("ke"), nil) - dbtest.Value(t, pdb, []byte("kee"), nil) + 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) } func TestPrefixDBIterator1(t *testing.T) { db := mockDBWithStuff(t) - pdb := tmdb.NewPrefixDB(db, []byte("key")) + pdb := NewPrefixDB(db, bz("key")) itr, err := pdb.Iterator(nil, nil) require.NoError(t, err) - dbtest.Domain(t, itr, nil, nil) - dbtest.Item(t, itr, []byte("1"), []byte("value1")) - dbtest.Next(t, itr, true) - dbtest.Item(t, itr, []byte("2"), []byte("value2")) - dbtest.Next(t, itr, true) - dbtest.Item(t, itr, []byte("3"), []byte("value3")) - dbtest.Next(t, itr, false) - dbtest.Invalid(t, itr) + checkDomain(t, itr, nil, nil) + checkItem(t, itr, bz("1"), bz("value1")) + checkNext(t, itr, true) + checkItem(t, itr, bz("2"), bz("value2")) + checkNext(t, itr, true) + checkItem(t, itr, bz("3"), bz("value3")) + checkNext(t, itr, false) + checkInvalid(t, itr) itr.Close() } func TestPrefixDBReverseIterator1(t *testing.T) { db := mockDBWithStuff(t) - pdb := tmdb.NewPrefixDB(db, []byte("key")) + pdb := NewPrefixDB(db, bz("key")) itr, err := pdb.ReverseIterator(nil, nil) require.NoError(t, err) - dbtest.Domain(t, itr, nil, nil) - dbtest.Item(t, itr, []byte("3"), []byte("value3")) - dbtest.Next(t, itr, true) - dbtest.Item(t, itr, []byte("2"), []byte("value2")) - dbtest.Next(t, itr, true) - dbtest.Item(t, itr, []byte("1"), []byte("value1")) - dbtest.Next(t, itr, false) - dbtest.Invalid(t, itr) + checkDomain(t, itr, nil, nil) + checkItem(t, itr, bz("3"), bz("value3")) + checkNext(t, itr, true) + checkItem(t, itr, bz("2"), bz("value2")) + checkNext(t, itr, true) + checkItem(t, itr, bz("1"), bz("value1")) + checkNext(t, itr, false) + checkInvalid(t, itr) itr.Close() } func TestPrefixDBReverseIterator5(t *testing.T) { db := mockDBWithStuff(t) - pdb := tmdb.NewPrefixDB(db, []byte("key")) + pdb := NewPrefixDB(db, bz("key")) - itr, err := pdb.ReverseIterator([]byte("1"), nil) + itr, err := pdb.ReverseIterator(bz("1"), nil) require.NoError(t, err) - dbtest.Domain(t, itr, []byte("1"), nil) - dbtest.Item(t, itr, []byte("3"), []byte("value3")) - dbtest.Next(t, itr, true) - dbtest.Item(t, itr, []byte("2"), []byte("value2")) - dbtest.Next(t, itr, true) - dbtest.Item(t, itr, []byte("1"), []byte("value1")) - dbtest.Next(t, itr, false) - dbtest.Invalid(t, itr) + checkDomain(t, itr, bz("1"), nil) + checkItem(t, itr, bz("3"), bz("value3")) + checkNext(t, itr, true) + checkItem(t, itr, bz("2"), bz("value2")) + checkNext(t, itr, true) + checkItem(t, itr, bz("1"), bz("value1")) + checkNext(t, itr, false) + checkInvalid(t, itr) itr.Close() } func TestPrefixDBReverseIterator6(t *testing.T) { db := mockDBWithStuff(t) - pdb := tmdb.NewPrefixDB(db, []byte("key")) + pdb := NewPrefixDB(db, bz("key")) - itr, err := pdb.ReverseIterator([]byte("2"), nil) + itr, err := pdb.ReverseIterator(bz("2"), nil) require.NoError(t, err) - dbtest.Domain(t, itr, []byte("2"), nil) - dbtest.Item(t, itr, []byte("3"), []byte("value3")) - dbtest.Next(t, itr, true) - dbtest.Item(t, itr, []byte("2"), []byte("value2")) - dbtest.Next(t, itr, false) - dbtest.Invalid(t, itr) + checkDomain(t, itr, bz("2"), nil) + checkItem(t, itr, bz("3"), bz("value3")) + checkNext(t, itr, true) + checkItem(t, itr, bz("2"), bz("value2")) + checkNext(t, itr, false) + checkInvalid(t, itr) itr.Close() } func TestPrefixDBReverseIterator7(t *testing.T) { db := mockDBWithStuff(t) - pdb := tmdb.NewPrefixDB(db, []byte("key")) + pdb := NewPrefixDB(db, bz("key")) - itr, err := pdb.ReverseIterator(nil, []byte("2")) + itr, err := pdb.ReverseIterator(nil, bz("2")) require.NoError(t, err) - dbtest.Domain(t, itr, nil, []byte("2")) - dbtest.Item(t, itr, []byte("1"), []byte("value1")) - dbtest.Next(t, itr, false) - dbtest.Invalid(t, itr) + checkDomain(t, itr, nil, bz("2")) + checkItem(t, itr, bz("1"), bz("value1")) + checkNext(t, itr, false) + checkInvalid(t, itr) itr.Close() } diff --git a/remotedb/batch.go b/remotedb/batch.go index de3d5e8e3..fe2becb14 100644 --- a/remotedb/batch.go +++ b/remotedb/batch.go @@ -1,18 +1,21 @@ package remotedb import ( + "errors" "fmt" - tmdb "github.com/tendermint/tm-db" + db "github.com/tendermint/tm-db" protodb "github.com/tendermint/tm-db/remotedb/proto" ) +var errBatchClosed = errors.New("batch has been written or closed") + type batch struct { db *RemoteDB ops []*protodb.Operation } -var _ tmdb.Batch = (*batch)(nil) +var _ db.Batch = (*batch)(nil) func newBatch(rdb *RemoteDB) *batch { return &batch{ @@ -24,7 +27,7 @@ func newBatch(rdb *RemoteDB) *batch { // Set implements Batch. func (b *batch) Set(key, value []byte) error { if b.ops == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } op := &protodb.Operation{ Entity: &protodb.Entity{Key: key, Value: value}, @@ -37,7 +40,7 @@ func (b *batch) Set(key, value []byte) error { // Delete implements Batch. func (b *batch) Delete(key []byte) error { if b.ops == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } op := &protodb.Operation{ Entity: &protodb.Entity{Key: key}, @@ -50,7 +53,7 @@ func (b *batch) Delete(key []byte) error { // Write implements Batch. func (b *batch) Write() error { if b.ops == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } _, err := b.db.dc.BatchWrite(b.db.ctx, &protodb.Batch{Ops: b.ops}) if err != nil { @@ -64,7 +67,7 @@ func (b *batch) Write() error { // WriteSync implements Batch. func (b *batch) WriteSync() error { if b.ops == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } _, err := b.db.dc.BatchWriteSync(b.db.ctx, &protodb.Batch{Ops: b.ops}) if err != nil { diff --git a/remotedb/doc.go b/remotedb/doc.go index a1e9e2143..93d9c8a29 100644 --- a/remotedb/doc.go +++ b/remotedb/doc.go @@ -1,5 +1,5 @@ /* -remotedb is a package for connecting to distributed Tendermint tmdb.DB +remotedb is a package for connecting to distributed Tendermint db.DB instances. The purpose is to detach difficult deployments such as CLevelDB that requires gcc or perhaps for databases that require custom configurations such as extra disk space. It also eases @@ -7,7 +7,7 @@ the burden and cost of deployment of dependencies for databases to be used by Tendermint developers. Most importantly it is built over the high performant gRPC transport. -remotedb's RemoteDB implements tmdb.DB so can be used normally +remotedb's RemoteDB implements db.DB so can be used normally like other databases. One just has to explicitly connect to the remote database with a client setup such as: diff --git a/remotedb/grpcdb/server.go b/remotedb/grpcdb/server.go index 54e7d9950..3cedca8c7 100644 --- a/remotedb/grpcdb/server.go +++ b/remotedb/grpcdb/server.go @@ -10,7 +10,6 @@ import ( "google.golang.org/grpc/credentials" db "github.com/tendermint/tm-db" - "github.com/tendermint/tm-db/metadb" protodb "github.com/tendermint/tm-db/remotedb/proto" ) @@ -65,7 +64,7 @@ func (s *server) Init(ctx context.Context, in *protodb.Init) (*protodb.Entity, e defer s.mu.Unlock() var err error - s.db, err = metadb.NewDB(in.Name, metadb.BackendType(in.Type), in.Dir) + s.db, err = db.NewDB(in.Name, db.BackendType(in.Type), in.Dir) if err != nil { return nil, err } diff --git a/remotedb/iterator.go b/remotedb/iterator.go index 2fb043b47..325dc5386 100644 --- a/remotedb/iterator.go +++ b/remotedb/iterator.go @@ -1,17 +1,17 @@ package remotedb import ( - tmdb "github.com/tendermint/tm-db" + db "github.com/tendermint/tm-db" protodb "github.com/tendermint/tm-db/remotedb/proto" ) -func makeIterator(dic protodb.DB_IteratorClient) tmdb.Iterator { +func makeIterator(dic protodb.DB_IteratorClient) db.Iterator { itr := &iterator{dic: dic} itr.Next() // We need to call Next to prime the iterator return itr } -func makeReverseIterator(dric protodb.DB_ReverseIteratorClient) tmdb.Iterator { +func makeReverseIterator(dric protodb.DB_ReverseIteratorClient) db.Iterator { rItr := &reverseIterator{dric: dric} rItr.Next() // We need to call Next to prime the iterator return rItr @@ -23,7 +23,7 @@ type reverseIterator struct { err error } -var _ tmdb.Iterator = (*iterator)(nil) +var _ db.Iterator = (*iterator)(nil) // Valid implements Iterator. func (rItr *reverseIterator) Valid() bool { @@ -75,7 +75,7 @@ func (rItr *reverseIterator) assertIsValid() { } } -// iterator implements the tmdb.Iterator by retrieving +// iterator implements the db.Iterator by retrieving // streamed iterators from the remote backend as // needed. It is NOT safe for concurrent usage, // matching the behavior of other iterators. @@ -85,7 +85,7 @@ type iterator struct { err error } -var _ tmdb.Iterator = (*iterator)(nil) +var _ db.Iterator = (*iterator)(nil) // Valid implements Iterator. func (itr *iterator) Valid() bool { diff --git a/remotedb/db.go b/remotedb/remotedb.go similarity index 83% rename from remotedb/db.go rename to remotedb/remotedb.go index e79376c8d..84a57f20f 100644 --- a/remotedb/db.go +++ b/remotedb/remotedb.go @@ -5,7 +5,7 @@ import ( "errors" "fmt" - tmdb "github.com/tendermint/tm-db" + db "github.com/tendermint/tm-db" "github.com/tendermint/tm-db/remotedb/grpcdb" protodb "github.com/tendermint/tm-db/remotedb/proto" ) @@ -15,11 +15,11 @@ type RemoteDB struct { dc protodb.DBClient } -func NewDB(serverAddr string, serverKey string) (*RemoteDB, error) { - return newDB(grpcdb.NewClient(serverAddr, serverKey)) +func NewRemoteDB(serverAddr string, serverKey string) (*RemoteDB, error) { + return newRemoteDB(grpcdb.NewClient(serverAddr, serverKey)) } -func newDB(gdc protodb.DBClient, err error) (*RemoteDB, error) { +func newRemoteDB(gdc protodb.DBClient, err error) (*RemoteDB, error) { if err != nil { return nil, err } @@ -37,7 +37,7 @@ func (rd *RemoteDB) InitRemote(in *Init) error { return err } -var _ tmdb.DB = (*RemoteDB)(nil) +var _ db.DB = (*RemoteDB)(nil) // Close is a noop currently func (rd *RemoteDB) Close() error { @@ -88,7 +88,7 @@ func (rd *RemoteDB) Has(key []byte) (bool, error) { return res.Exists, nil } -func (rd *RemoteDB) ReverseIterator(start, end []byte) (tmdb.Iterator, error) { +func (rd *RemoteDB) ReverseIterator(start, end []byte) (db.Iterator, error) { dic, err := rd.dc.ReverseIterator(rd.ctx, &protodb.Entity{Start: start, End: end}) if err != nil { return nil, fmt.Errorf("RemoteDB.Iterator error: %w", err) @@ -96,11 +96,11 @@ func (rd *RemoteDB) ReverseIterator(start, end []byte) (tmdb.Iterator, error) { return makeReverseIterator(dic), nil } -func (rd *RemoteDB) NewBatch() tmdb.Batch { +func (rd *RemoteDB) NewBatch() db.Batch { return newBatch(rd) } -// TODO: Implement Print when tmdb.DB implements a method +// TODO: Implement Print when db.DB implements a method // to print to a string and not db.Print to stdout. func (rd *RemoteDB) Print() error { return errors.New("remoteDB.Print: unimplemented") @@ -114,7 +114,7 @@ func (rd *RemoteDB) Stats() map[string]string { return stats.Data } -func (rd *RemoteDB) Iterator(start, end []byte) (tmdb.Iterator, error) { +func (rd *RemoteDB) Iterator(start, end []byte) (db.Iterator, error) { dic, err := rd.dc.Iterator(rd.ctx, &protodb.Entity{Start: start, End: end}) if err != nil { return nil, fmt.Errorf("RemoteDB.Iterator error: %w", err) diff --git a/remotedb/db_test.go b/remotedb/remotedb_test.go similarity index 98% rename from remotedb/db_test.go rename to remotedb/remotedb_test.go index a4a159f53..8407b3004 100644 --- a/remotedb/db_test.go +++ b/remotedb/remotedb_test.go @@ -26,7 +26,7 @@ func TestRemoteDB(t *testing.T) { } }() - client, err := remotedb.NewDB(ln.Addr().String(), cert) + client, err := remotedb.NewRemoteDB(ln.Addr().String(), cert) require.Nil(t, err, "expecting a successful client creation") dbName := "test-remote-db" require.Nil(t, client.InitRemote(&remotedb.Init{Name: dbName, Type: "goleveldb"})) diff --git a/rocksdb/db.go b/rocksdb.go similarity index 81% rename from rocksdb/db.go rename to rocksdb.go index 68f303606..c3ec29f40 100644 --- a/rocksdb/db.go +++ b/rocksdb.go @@ -1,4 +1,6 @@ -package rocksdb +// +build rocksdb + +package db import ( "fmt" @@ -6,9 +8,15 @@ import ( "runtime" "github.com/tecbot/gorocksdb" - tmdb "github.com/tendermint/tm-db" ) +func init() { + dbCreator := func(name string, dir string) (DB, error) { + return NewRocksDB(name, dir) + } + registerDBCreator(RocksDBBackend, dbCreator, false) +} + // RocksDB is a RocksDB backend. type RocksDB struct { db *gorocksdb.DB @@ -17,9 +25,9 @@ type RocksDB struct { woSync *gorocksdb.WriteOptions } -var _ tmdb.DB = (*RocksDB)(nil) +var _ DB = (*RocksDB)(nil) -func NewDB(name string, dir string) (*RocksDB, error) { +func NewRocksDB(name string, dir string) (*RocksDB, error) { // default rocksdb option, good enough for most cases, including heavy workloads. // 1GB table cache, 512MB write buffer(may use 50% more on heavy workloads). // compression: snappy as default, need to -lsnappy to enable. @@ -33,10 +41,10 @@ func NewDB(name string, dir string) (*RocksDB, error) { opts.IncreaseParallelism(runtime.NumCPU()) // 1.5GB maximum memory use for writebuffer. opts.OptimizeLevelStyleCompaction(512 * 1024 * 1024) - return NewDBWithOptions(name, dir, opts) + return NewRocksDBWithOptions(name, dir, opts) } -func NewDBWithOptions(name string, dir string, opts *gorocksdb.Options) (*RocksDB, error) { +func NewRocksDBWithOptions(name string, dir string, opts *gorocksdb.Options) (*RocksDB, error) { dbPath := filepath.Join(dir, name+".db") db, err := gorocksdb.OpenDb(opts, dbPath) if err != nil { @@ -58,7 +66,7 @@ func NewDBWithOptions(name string, dir string, opts *gorocksdb.Options) (*RocksD // Get implements DB. func (db *RocksDB) Get(key []byte) ([]byte, error) { if len(key) == 0 { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } res, err := db.db.Get(db.ro, key) if err != nil { @@ -79,10 +87,10 @@ func (db *RocksDB) Has(key []byte) (bool, error) { // Set implements DB. func (db *RocksDB) Set(key []byte, value []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if value == nil { - return tmdb.ErrValueNil + return errValueNil } err := db.db.Put(db.wo, key, value) if err != nil { @@ -94,10 +102,10 @@ func (db *RocksDB) Set(key []byte, value []byte) error { // SetSync implements DB. func (db *RocksDB) SetSync(key []byte, value []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if value == nil { - return tmdb.ErrValueNil + return errValueNil } err := db.db.Put(db.woSync, key, value) if err != nil { @@ -109,7 +117,7 @@ func (db *RocksDB) SetSync(key []byte, value []byte) error { // Delete implements DB. func (db *RocksDB) Delete(key []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } err := db.db.Delete(db.wo, key) if err != nil { @@ -121,7 +129,7 @@ func (db *RocksDB) Delete(key []byte) error { // DeleteSync implements DB. func (db *RocksDB) DeleteSync(key []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } err := db.db.Delete(db.woSync, key) if err != nil { @@ -169,23 +177,23 @@ func (db *RocksDB) Stats() map[string]string { } // NewBatch implements DB. -func (db *RocksDB) NewBatch() tmdb.Batch { +func (db *RocksDB) NewBatch() Batch { return newRocksDBBatch(db) } // Iterator implements DB. -func (db *RocksDB) Iterator(start, end []byte) (tmdb.Iterator, error) { +func (db *RocksDB) Iterator(start, end []byte) (Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } itr := db.db.NewIterator(db.ro) return newRocksDBIterator(itr, start, end, false), nil } // ReverseIterator implements DB. -func (db *RocksDB) ReverseIterator(start, end []byte) (tmdb.Iterator, error) { +func (db *RocksDB) ReverseIterator(start, end []byte) (Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { - return nil, tmdb.ErrKeyEmpty + return nil, errKeyEmpty } itr := db.db.NewIterator(db.ro) return newRocksDBIterator(itr, start, end, true), nil diff --git a/rocksdb/db_test.go b/rocksdb/db_test.go deleted file mode 100644 index ef4257fb9..000000000 --- a/rocksdb/db_test.go +++ /dev/null @@ -1,3 +0,0 @@ -package rocksdb - -// TODO: Add tests for rocksdb diff --git a/rocksdb/batch.go b/rocksdb_batch.go similarity index 79% rename from rocksdb/batch.go rename to rocksdb_batch.go index d41d72b08..a5d296b40 100644 --- a/rocksdb/batch.go +++ b/rocksdb_batch.go @@ -1,16 +1,15 @@ -package rocksdb +// +build rocksdb -import ( - "github.com/tecbot/gorocksdb" - tmdb "github.com/tendermint/tm-db" -) +package db + +import "github.com/tecbot/gorocksdb" type rocksDBBatch struct { db *RocksDB batch *gorocksdb.WriteBatch } -var _ tmdb.Batch = (*rocksDBBatch)(nil) +var _ Batch = (*rocksDBBatch)(nil) func newRocksDBBatch(db *RocksDB) *rocksDBBatch { return &rocksDBBatch{ @@ -22,13 +21,13 @@ func newRocksDBBatch(db *RocksDB) *rocksDBBatch { // Set implements Batch. func (b *rocksDBBatch) Set(key, value []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if value == nil { - return tmdb.ErrValueNil + return errValueNil } if b.batch == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } b.batch.Put(key, value) return nil @@ -37,10 +36,10 @@ func (b *rocksDBBatch) Set(key, value []byte) error { // Delete implements Batch. func (b *rocksDBBatch) Delete(key []byte) error { if len(key) == 0 { - return tmdb.ErrKeyEmpty + return errKeyEmpty } if b.batch == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } b.batch.Delete(key) return nil @@ -49,7 +48,7 @@ func (b *rocksDBBatch) Delete(key []byte) error { // Write implements Batch. func (b *rocksDBBatch) Write() error { if b.batch == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } err := b.db.db.Write(b.db.wo, b.batch) if err != nil { @@ -63,7 +62,7 @@ func (b *rocksDBBatch) Write() error { // WriteSync implements Batch. func (b *rocksDBBatch) WriteSync() error { if b.batch == nil { - return tmdb.ErrBatchClosed + return errBatchClosed } err := b.db.db.Write(b.db.woSync, b.batch) if err != nil { diff --git a/rocksdb/iterator.go b/rocksdb_iterator.go similarity index 96% rename from rocksdb/iterator.go rename to rocksdb_iterator.go index 6d18cf9cf..0e7d405fe 100644 --- a/rocksdb/iterator.go +++ b/rocksdb_iterator.go @@ -1,10 +1,11 @@ -package rocksdb +// +build rocksdb + +package db import ( "bytes" "github.com/tecbot/gorocksdb" - tmdb "github.com/tendermint/tm-db" ) type rocksDBIterator struct { @@ -14,7 +15,7 @@ type rocksDBIterator struct { isInvalid bool } -var _ tmdb.Iterator = (*rocksDBIterator)(nil) +var _ Iterator = (*rocksDBIterator)(nil) func newRocksDBIterator(source *gorocksdb.Iterator, start, end []byte, isReverse bool) *rocksDBIterator { if isReverse { diff --git a/rocksdb_test.go b/rocksdb_test.go new file mode 100644 index 000000000..6bbe51133 --- /dev/null +++ b/rocksdb_test.go @@ -0,0 +1,35 @@ +// +build rocksdb + +package db + +import ( + "fmt" + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestRocksDBBackend(t *testing.T) { + name := fmt.Sprintf("test_%x", randStr(12)) + dir := os.TempDir() + db, err := NewDB(name, RocksDBBackend, dir) + require.NoError(t, err) + defer cleanupDBDir(dir, name) + + _, ok := db.(*RocksDB) + assert.True(t, ok) +} + +func TestRocksDBStats(t *testing.T) { + name := fmt.Sprintf("test_%x", randStr(12)) + dir := os.TempDir() + db, err := NewDB(name, RocksDBBackend, dir) + require.NoError(t, err) + defer cleanupDBDir(dir, name) + + assert.NotEmpty(t, db.Stats()) +} + +// TODO: Add tests for rocksdb diff --git a/test_helpers.go b/test_helpers.go new file mode 100644 index 000000000..6a97ad7af --- /dev/null +++ b/test_helpers.go @@ -0,0 +1,36 @@ +package db + +import "math/rand" + +const ( + strChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" // 62 characters +) + +// For testing convenience. +func bz(s string) []byte { + return []byte(s) +} + +// Str constructs a random alphanumeric string of given length. +func randStr(length int) string { + chars := []byte{} +MAIN_LOOP: + for { + val := rand.Int63() // nolint:gosec // G404: Use of weak random number generator + for i := 0; i < 10; i++ { + v := int(val & 0x3f) // rightmost 6 bits + if v >= 62 { // only 62 characters in strChars + val >>= 6 + continue + } else { + chars = append(chars, strChars[v]) + if len(chars) == length { + break MAIN_LOOP + } + val >>= 6 + } + } + } + + return string(chars) +} diff --git a/types.go b/types.go index 43d0f4e06..3be412fd2 100644 --- a/types.go +++ b/types.go @@ -3,14 +3,14 @@ package db import "errors" var ( - // ErrBatchClosed is returned when a closed or written batch is used. - ErrBatchClosed = errors.New("batch has been written or closed") + // errBatchClosed is returned when a closed or written batch is used. + errBatchClosed = errors.New("batch has been written or closed") - // ErrKeyEmpty is returned when attempting to use an empty or nil key. - ErrKeyEmpty = errors.New("key cannot be empty") + // errKeyEmpty is returned when attempting to use an empty or nil key. + errKeyEmpty = errors.New("key cannot be empty") - // ErrValueNil is returned when attempting to set a nil value. - ErrValueNil = errors.New("value cannot be nil") + // errValueNil is returned when attempting to set a nil value. + errValueNil = errors.New("value cannot be nil") ) // DB is the main interface for all database backends. DBs are concurrency-safe. Callers must call diff --git a/metadb/util_test.go b/util_test.go similarity index 56% rename from metadb/util_test.go rename to util_test.go index 77b69cf22..d58cd2fd7 100644 --- a/metadb/util_test.go +++ b/util_test.go @@ -1,15 +1,11 @@ -package metadb +package db import ( "fmt" - "io/ioutil" "os" "testing" "github.com/stretchr/testify/require" - - tmdb "github.com/tendermint/tm-db" - "github.com/tendermint/tm-db/internal/dbtest" ) // Empty iterator for empty db. @@ -18,10 +14,10 @@ func TestPrefixIteratorNoMatchNil(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) - itr, err := tmdb.IteratePrefix(db, []byte("2")) + itr, err := IteratePrefix(db, []byte("2")) require.NoError(t, err) - dbtest.Invalid(t, itr) + checkInvalid(t, itr) }) } } @@ -37,12 +33,12 @@ func TestPrefixIteratorNoMatch1(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) - itr, err := tmdb.IteratePrefix(db, []byte("2")) + itr, err := IteratePrefix(db, []byte("2")) require.NoError(t, err) - err = db.SetSync([]byte("1"), []byte("value_1")) + err = db.SetSync(bz("1"), bz("value_1")) require.NoError(t, err) - dbtest.Invalid(t, itr) + checkInvalid(t, itr) }) } } @@ -53,12 +49,12 @@ 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([]byte("3"), []byte("value_3")) + err := db.SetSync(bz("3"), bz("value_3")) require.NoError(t, err) - itr, err := tmdb.IteratePrefix(db, []byte("4")) + itr, err := IteratePrefix(db, []byte("4")) require.NoError(t, err) - dbtest.Invalid(t, itr) + checkInvalid(t, itr) }) } } @@ -69,17 +65,17 @@ 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([]byte("2"), []byte("value_2")) + err := db.SetSync(bz("2"), bz("value_2")) require.NoError(t, err) - itr, err := tmdb.IteratePrefix(db, []byte("2")) + itr, err := IteratePrefix(db, bz("2")) require.NoError(t, err) - dbtest.Valid(t, itr, true) - dbtest.Item(t, itr, []byte("2"), []byte("value_2")) - dbtest.Next(t, itr, false) + checkValid(t, itr, true) + checkItem(t, itr, bz("2"), bz("value_2")) + checkNext(t, itr, false) // Once invalid... - dbtest.Invalid(t, itr) + checkInvalid(t, itr) }) } } @@ -92,41 +88,33 @@ func TestPrefixIteratorMatches1N(t *testing.T) { defer os.RemoveAll(dir) // prefixed - err := db.SetSync([]byte("a/1"), []byte("value_1")) + err := db.SetSync(bz("a/1"), bz("value_1")) require.NoError(t, err) - err = db.SetSync([]byte("a/3"), []byte("value_3")) + err = db.SetSync(bz("a/3"), bz("value_3")) require.NoError(t, err) // not - err = db.SetSync([]byte("b/3"), []byte("value_3")) + err = db.SetSync(bz("b/3"), bz("value_3")) require.NoError(t, err) - err = db.SetSync([]byte("a-3"), []byte("value_3")) + err = db.SetSync(bz("a-3"), bz("value_3")) require.NoError(t, err) - err = db.SetSync([]byte("a.3"), []byte("value_3")) + err = db.SetSync(bz("a.3"), bz("value_3")) require.NoError(t, err) - err = db.SetSync([]byte("abcdefg"), []byte("value_3")) + err = db.SetSync(bz("abcdefg"), bz("value_3")) require.NoError(t, err) - itr, err := tmdb.IteratePrefix(db, []byte("a/")) + itr, err := IteratePrefix(db, bz("a/")) require.NoError(t, err) - dbtest.Valid(t, itr, true) - dbtest.Item(t, itr, []byte("a/1"), []byte("value_1")) - dbtest.Next(t, itr, true) - dbtest.Item(t, itr, []byte("a/3"), []byte("value_3")) + checkValid(t, itr, true) + checkItem(t, itr, bz("a/1"), bz("value_1")) + checkNext(t, itr, true) + checkItem(t, itr, bz("a/3"), bz("value_3")) // Bad! - dbtest.Next(t, itr, false) + checkNext(t, itr, false) - // Once invalid... - dbtest.Invalid(t, itr) + //Once invalid... + checkInvalid(t, itr) }) } } - -func newTempDB(t *testing.T, backend BackendType) (db tmdb.DB, dbDir string) { - dirname, err := ioutil.TempDir("", "db_common_test") - require.NoError(t, err) - db, err = NewDB("testdb", backend, dirname) - require.NoError(t, err) - return db, dirname -} From 4fa83b55a0b53d97e4778823374ec7f2dfc0195f Mon Sep 17 00:00:00 2001 From: Roy Crihfield <roy@manteia.ltd> Date: Fri, 3 Dec 2021 23:50:21 +0800 Subject: [PATCH 27/34] Update gorocksdb replace directive to use cosmos fork (#207) --- go.mod | 4 ++-- go.sum | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index b9043797c..784d8a31f 100644 --- a/go.mod +++ b/go.mod @@ -17,6 +17,6 @@ require ( // Breaking changes were released with the wrong tag (use v0.6.6 or later). retract v0.6.5 -// FIXME: gorocksdb bindings for OptimisticTransactionDB are not merged upstream, so we use a fork +// Note: gorocksdb bindings for OptimisticTransactionDB are not merged upstream, so we use a fork // See https://github.com/tecbot/gorocksdb/pull/216 -replace github.com/tecbot/gorocksdb => github.com/roysc/gorocksdb v1.1.1 +replace github.com/tecbot/gorocksdb => github.com/cosmos/gorocksdb v1.1.1 diff --git a/go.sum b/go.sum index 49523c774..93a6bf91c 100644 --- a/go.sum +++ b/go.sum @@ -21,6 +21,8 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/cosmos/gorocksdb v1.1.1 h1:N0OqpEKXgsi2qtDm8T1+AlNMXkTm6s1jowYf7/4pH5I= +github.com/cosmos/gorocksdb v1.1.1/go.mod h1:b/U29r/CtguX3TF7mKG1Jjn4APDqh4wECshxXdiWHpA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -109,8 +111,6 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/roysc/gorocksdb v1.1.1 h1:5qKNwi7V/AchRMjyVf5TMCcZP70ro+VyaRmQxzpRvd4= -github.com/roysc/gorocksdb v1.1.1/go.mod h1:b/U29r/CtguX3TF7mKG1Jjn4APDqh4wECshxXdiWHpA= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= From 06fdc12b3cc0ff8eb87ec0cd0b5daa9cb5091d2b Mon Sep 17 00:00:00 2001 From: Jacob Gadikian <jacobgadikian@gmail.com> Date: Sun, 12 Dec 2021 01:01:13 +0700 Subject: [PATCH 28/34] Update to go 1.17 (#208) --- go.mod | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 784d8a31f..ab5fbe3c6 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/tendermint/tm-db -go 1.16 +go 1.17 require ( github.com/dgraph-io/badger/v2 v2.2007.2 @@ -14,6 +14,25 @@ require ( google.golang.org/grpc v1.42.0 ) +require ( + github.com/DataDog/zstd v1.4.1 // indirect + github.com/cespare/xxhash v1.1.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de // indirect + github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect + github.com/dustin/go-humanize v1.0.0 // indirect + github.com/golang/protobuf v1.4.3 // indirect + github.com/golang/snappy v0.0.1 // indirect + github.com/pkg/errors v0.8.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/net v0.0.0-20201021035429-f5854403a974 // indirect + golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f // indirect + golang.org/x/text v0.3.3 // indirect + google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect + google.golang.org/protobuf v1.25.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect +) + // Breaking changes were released with the wrong tag (use v0.6.6 or later). retract v0.6.5 From 614e8b17047c3fb749f2096e9689a770ca4b2081 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Jan 2022 09:22:00 -0800 Subject: [PATCH 29/34] build(deps): bump google.golang.org/grpc from 1.42.0 to 1.43.0 (#209) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.42.0 to 1.43.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.42.0...v1.43.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ab5fbe3c6..04d55477b 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c go.etcd.io/bbolt v1.3.6 - google.golang.org/grpc v1.42.0 + google.golang.org/grpc v1.43.0 ) require ( diff --git a/go.sum b/go.sum index 93a6bf91c..8198bd9eb 100644 --- a/go.sum +++ b/go.sum @@ -213,8 +213,8 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.42.0 h1:XT2/MFpuPFsEX2fWh3YQtHkZ+WYZFQRfaUgLZYj/p6A= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM= +google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From a45e5705ec10699cef3ee8dda31cc99bcc8a3b62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Jan 2022 06:30:07 -0800 Subject: [PATCH 30/34] build(deps): bump google.golang.org/grpc from 1.43.0 to 1.44.0 (#215) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.43.0 to 1.44.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.43.0...v1.44.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 04d55477b..fe6f5f67c 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c go.etcd.io/bbolt v1.3.6 - google.golang.org/grpc v1.43.0 + google.golang.org/grpc v1.44.0 ) require ( diff --git a/go.sum b/go.sum index 8198bd9eb..e8aaff198 100644 --- a/go.sum +++ b/go.sum @@ -213,8 +213,8 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM= -google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From ce3673b81d42dae1b9095e85896d0779ec1d841d Mon Sep 17 00:00:00 2001 From: Jacob Gadikian <jacobgadikian@gmail.com> Date: Sun, 30 Jan 2022 20:51:35 +0700 Subject: [PATCH 31/34] cosmos/gorocksdb in the imports (#214) Use the cosmos/gorocksdb fork directly so we don't require replace directives downstream in go.mod --- .github/workflows/lint.yml | 6 +----- .golangci.yml | 3 +-- README.md | 2 +- common_test.go | 2 -- db.go | 2 +- go.mod | 6 +----- go.sum | 4 ++-- rocksdb.go | 2 +- rocksdb_batch.go | 2 +- rocksdb_iterator.go | 2 +- util_test.go | 2 +- 11 files changed, 11 insertions(+), 22 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index c291823ed..15e3b20cb 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -13,11 +13,7 @@ jobs: container: tendermintdev/docker-tm-db-testing steps: - uses: actions/checkout@v2 - - uses: golangci/golangci-lint-action@v2.5.2 + - uses: golangci/golangci-lint-action@v2 with: - # Required: the version of golangci-lint is required and must be - # specified without patch version: we always use the latest patch - # version. - version: v1.30 args: --timeout 10m github-token: ${{ secrets.github_token }} diff --git a/.golangci.yml b/.golangci.yml index 39ba9aaf5..abf03e7ac 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -16,7 +16,7 @@ linters: # - godox - gofmt - goimports - - golint + - revive - gosec - gosimple - govet @@ -24,7 +24,6 @@ linters: # - interfacer - lll - misspell - - maligned - nakedret - prealloc # - scopelint diff --git a/README.md b/README.md index 42d9adc29..2aa6efb53 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Go 1.13+ - **[BoltDB](https://github.com/etcd-io/bbolt) [experimental]:** A [fork](https://github.com/etcd-io/bbolt) of [BoltDB](https://github.com/boltdb/bolt). Uses B+trees for on-disk storage, which have good performance for read-heavy workloads and range scans. Supports serializable ACID transactions. -- **[RocksDB](https://github.com/tecbot/gorocksdb) [experimental]:** A [Go wrapper](https://github.com/tecbot/gorocksdb) around [RocksDB](https://rocksdb.org). Similarly to LevelDB (above) it uses LSM-trees for on-disk storage, but is optimized for fast storage media such as SSDs and memory. Supports atomic transactions, but not full ACID transactions. +- **[RocksDB](https://github.com/cosmos/gorocksdb) [experimental]:** A [Go wrapper](https://github.com/cosmos/gorocksdb) around [RocksDB](https://rocksdb.org). Similarly to LevelDB (above) it uses LSM-trees for on-disk storage, but is optimized for fast storage media such as SSDs and memory. Supports atomic transactions, but not full ACID transactions. - **[BadgerDB](https://github.com/dgraph-io/badger) [experimental]:** A key-value database written as a pure-Go alternative to e.g. LevelDB and RocksDB, with LSM-tree storage. Makes use of multiple goroutines for performance, and includes advanced features such as serializable ACID transactions, write batches, compression, and more. diff --git a/common_test.go b/common_test.go index f48efd7aa..e73a2fc5e 100644 --- a/common_test.go +++ b/common_test.go @@ -127,7 +127,6 @@ func benchmarkRandomReadsWrites(b *testing.B, db DB) { val := internal[idx] idxBytes := int642Bytes(idx) valBytes := int642Bytes(val) - //fmt.Printf("Set %X -> %X\n", idxBytes, valBytes) err := db.Set(idxBytes, valBytes) if err != nil { // require.NoError() is very expensive (according to profiler), so check manually @@ -145,7 +144,6 @@ func benchmarkRandomReadsWrites(b *testing.B, db DB) { // require.NoError() is very expensive (according to profiler), so check manually b.Fatal(b, err) } - //fmt.Printf("Get %X -> %X\n", idxBytes, valBytes) if valExp == 0 { if !bytes.Equal(valBytes, nil) { b.Errorf("Expected %v for %v, got %X", nil, idx, valBytes) diff --git a/db.go b/db.go index 4d518c0b0..ef573f17e 100644 --- a/db.go +++ b/db.go @@ -28,7 +28,7 @@ const ( // - may be faster is some use-cases (random reads - indexer) // - use boltdb build tag (go build -tags boltdb) BoltDBBackend BackendType = "boltdb" - // RocksDBBackend represents rocksdb (uses github.com/tecbot/gorocksdb) + // RocksDBBackend represents rocksdb (uses github.com/cosmos/gorocksdb) // - EXPERIMENTAL // - requires gcc // - use rocksdb build tag (go build -tags rocksdb) diff --git a/go.mod b/go.mod index fe6f5f67c..2a5b06d82 100644 --- a/go.mod +++ b/go.mod @@ -3,13 +3,13 @@ module github.com/tendermint/tm-db go 1.17 require ( + github.com/cosmos/gorocksdb v1.2.0 github.com/dgraph-io/badger/v2 v2.2007.2 github.com/gogo/protobuf v1.3.2 github.com/google/btree v1.0.0 github.com/jmhodges/levigo v1.0.0 github.com/stretchr/testify v1.7.0 github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca - github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c go.etcd.io/bbolt v1.3.6 google.golang.org/grpc v1.44.0 ) @@ -35,7 +35,3 @@ require ( // Breaking changes were released with the wrong tag (use v0.6.6 or later). retract v0.6.5 - -// Note: gorocksdb bindings for OptimisticTransactionDB are not merged upstream, so we use a fork -// See https://github.com/tecbot/gorocksdb/pull/216 -replace github.com/tecbot/gorocksdb => github.com/cosmos/gorocksdb v1.1.1 diff --git a/go.sum b/go.sum index e8aaff198..b7cf93b88 100644 --- a/go.sum +++ b/go.sum @@ -21,8 +21,8 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cosmos/gorocksdb v1.1.1 h1:N0OqpEKXgsi2qtDm8T1+AlNMXkTm6s1jowYf7/4pH5I= -github.com/cosmos/gorocksdb v1.1.1/go.mod h1:b/U29r/CtguX3TF7mKG1Jjn4APDqh4wECshxXdiWHpA= +github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= +github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= diff --git a/rocksdb.go b/rocksdb.go index c3ec29f40..2211eea3a 100644 --- a/rocksdb.go +++ b/rocksdb.go @@ -7,7 +7,7 @@ import ( "path/filepath" "runtime" - "github.com/tecbot/gorocksdb" + "github.com/cosmos/gorocksdb" ) func init() { diff --git a/rocksdb_batch.go b/rocksdb_batch.go index a5d296b40..af7e65c60 100644 --- a/rocksdb_batch.go +++ b/rocksdb_batch.go @@ -2,7 +2,7 @@ package db -import "github.com/tecbot/gorocksdb" +import "github.com/cosmos/gorocksdb" type rocksDBBatch struct { db *RocksDB diff --git a/rocksdb_iterator.go b/rocksdb_iterator.go index 0e7d405fe..9970c169e 100644 --- a/rocksdb_iterator.go +++ b/rocksdb_iterator.go @@ -5,7 +5,7 @@ package db import ( "bytes" - "github.com/tecbot/gorocksdb" + "github.com/cosmos/gorocksdb" ) type rocksDBIterator struct { diff --git a/util_test.go b/util_test.go index d58cd2fd7..411abe1ee 100644 --- a/util_test.go +++ b/util_test.go @@ -113,7 +113,7 @@ func TestPrefixIteratorMatches1N(t *testing.T) { // Bad! checkNext(t, itr, false) - //Once invalid... + // Once invalid... checkInvalid(t, itr) }) } From 9ea19a1f74b904130dfaf0709aa2c3d500b90949 Mon Sep 17 00:00:00 2001 From: Marko <marbar3778@yahoo.com> Date: Tue, 8 Feb 2022 18:26:07 +0100 Subject: [PATCH 32/34] goleveldb: ForceCompact (#216) * add force compact * go mod tidy * dont break the interface * bring back remotedb * fix lint --- go.mod | 2 +- goleveldb.go | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 2a5b06d82..1de824b6b 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/cosmos/gorocksdb v1.2.0 github.com/dgraph-io/badger/v2 v2.2007.2 github.com/gogo/protobuf v1.3.2 + github.com/golang/protobuf v1.4.3 // indirect github.com/google/btree v1.0.0 github.com/jmhodges/levigo v1.0.0 github.com/stretchr/testify v1.7.0 @@ -21,7 +22,6 @@ require ( github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de // indirect github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect github.com/dustin/go-humanize v1.0.0 // indirect - github.com/golang/protobuf v1.4.3 // indirect github.com/golang/snappy v0.0.1 // indirect github.com/pkg/errors v0.8.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect diff --git a/goleveldb.go b/goleveldb.go index fd1bffd18..8dd3c3ce8 100644 --- a/goleveldb.go +++ b/goleveldb.go @@ -166,6 +166,10 @@ func (db *GoLevelDB) Stats() map[string]string { return stats } +func (db *GoLevelDB) ForceCompact(start, limit []byte) error { + return db.db.CompactRange(util.Range{Start: start, Limit: limit}) +} + // NewBatch implements DB. func (db *GoLevelDB) NewBatch() Batch { return newGoLevelDBBatch(db) From 1cf56ef1580b95f41c3aecb6e152b35b0067816a Mon Sep 17 00:00:00 2001 From: Jacob Gadikian <jacobgadikian@gmail.com> Date: Wed, 16 Feb 2022 06:43:31 +0700 Subject: [PATCH 33/34] Update rocksdb.go (#218) --- rocksdb.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rocksdb.go b/rocksdb.go index 2211eea3a..dd9be2a36 100644 --- a/rocksdb.go +++ b/rocksdb.go @@ -37,6 +37,8 @@ func NewRocksDB(name string, dir string) (*RocksDB, error) { opts := gorocksdb.NewDefaultOptions() opts.SetBlockBasedTableFactory(bbto) + // SetMaxOpenFiles to 4096 seems to provide a reliable performance boost + opts.SetMaxOpenFiles(4096) opts.SetCreateIfMissing(true) opts.IncreaseParallelism(runtime.NumCPU()) // 1.5GB maximum memory use for writebuffer. From e09e4d6c10707403a608cfe3f15171a8cda8db66 Mon Sep 17 00:00:00 2001 From: Marko <marbar3778@yahoo.com> Date: Mon, 21 Feb 2022 10:54:15 +0100 Subject: [PATCH 34/34] add changelog entry (#220) * add changelog entry * Update CHANGELOG.md --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b76daa7e..607f0bafb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## 0.6.7 + +**2022-2-21** + +- Use cosmos/rocksdb instead of techbot/rocksdb +- Add `ForceCopmact` to goleveldb database + ## 0.6.6 **2021-11-08**