feat: use cosmos/rocksdb rather than replace trick (#10927)

## Description

A follow up to https://github.com/cosmos/gorocksdb/pull/4 (see description there).
Also:
* remove import aliasing in rocksdb package.

Closes: #10915

TODO:
- [x] merge https://github.com/cosmos/gorocksdb/pull/4
- [x] tag new release in https://github.com/cosmos/gorocksdb
- [x] Update this PR to include new release
- [ ] tag `db/v1.0.0` (or `db/v0.1.0)` 

---

### Author Checklist

*All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.*

I have...

- [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] added `!` to the type prefix if API or client breaking change
- [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting))
- [ ] provided a link to the relevant issue or specification
- [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules)
- [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing)
- [ ] added a changelog entry to `CHANGELOG.md`
- [ ] included comments for [documenting Go code](https://blog.golang.org/godoc)
- [ ] updated the relevant documentation or specification
- [ ] reviewed "Files changed" and left comments if necessary
- [ ] confirmed all CI checks have passed

### Reviewers Checklist

*All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.*

I have...

- [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] confirmed `!` in the type prefix if API or client breaking change
- [ ] confirmed all author checklist items have been addressed 
- [ ] reviewed state machine logic
- [ ] reviewed API design and naming
- [ ] reviewed documentation is accurate
- [ ] reviewed tests and test coverage
- [ ] manually tested (if applicable)
This commit is contained in:
Robert Zaremba 2022-01-11 23:29:53 +01:00 committed by GitHub
parent 6beb079924
commit 284affb594
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 259 additions and 249 deletions

View File

@ -42,6 +42,8 @@ require (
github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect
github.com/dustin/go-humanize v1.0.0 // indirect
github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b // indirect
github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c // indirect
github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 // indirect
github.com/fsnotify/fsnotify v1.4.9 // indirect
github.com/go-kit/kit v0.10.0 // indirect
github.com/go-logfmt/logfmt v0.5.0 // indirect

View File

@ -251,12 +251,14 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m
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/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM=
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/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=

View File

@ -11,7 +11,7 @@ import (
"sync"
"sync/atomic"
dbm "github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db"
dbutil "github.com/cosmos/cosmos-sdk/db/internal"
"github.com/dgraph-io/badger/v3"
@ -20,14 +20,14 @@ import (
)
var (
versionsFilename string = "versions.csv"
versionsFilename = "versions.csv"
)
var (
_ dbm.DBConnection = (*BadgerDB)(nil)
_ dbm.DBReader = (*badgerTxn)(nil)
_ dbm.DBWriter = (*badgerWriter)(nil)
_ dbm.DBReadWriter = (*badgerWriter)(nil)
_ db.DBConnection = (*BadgerDB)(nil)
_ db.DBReader = (*badgerTxn)(nil)
_ db.DBWriter = (*badgerWriter)(nil)
_ db.DBReadWriter = (*badgerWriter)(nil)
)
// BadgerDB is a connection to a BadgerDB key-value database.
@ -64,7 +64,7 @@ type badgerIterator struct {
// commit to see current state. So we must use commit increments that are more
// granular than our version interval, and map versions to the corresponding timestamp.
type versionManager struct {
*dbm.VersionManager
*db.VersionManager
vmap map[uint64]uint64
lastTs uint64
}
@ -86,7 +86,7 @@ func NewDB(dir string) (*BadgerDB, error) {
// NewDBWithOptions creates a BadgerDB key-value database with the specified Options
// (https://pkg.go.dev/github.com/dgraph-io/badger/v3#Options)
func NewDBWithOptions(opts badger.Options) (*BadgerDB, error) {
db, err := badger.OpenManaged(opts)
d, err := badger.OpenManaged(opts)
if err != nil {
return nil, err
}
@ -95,7 +95,7 @@ func NewDBWithOptions(opts badger.Options) (*BadgerDB, error) {
return nil, err
}
return &BadgerDB{
db: db,
db: d,
vmgr: vmgr,
}, nil
}
@ -133,7 +133,7 @@ func readVersionsFile(path string) (*versionManager, error) {
versions = append(versions, version)
vmap[version] = ts
}
vmgr := dbm.NewVersionManager(versions)
vmgr := db.NewVersionManager(versions)
return &versionManager{
VersionManager: vmgr,
vmap: vmap,
@ -166,24 +166,24 @@ func writeVersionsFile(vm *versionManager, path string) error {
return w.WriteAll(rows)
}
func (b *BadgerDB) Reader() dbm.DBReader {
func (b *BadgerDB) Reader() db.DBReader {
b.mtx.RLock()
ts := b.vmgr.lastTs
b.mtx.RUnlock()
return &badgerTxn{txn: b.db.NewTransactionAt(ts, false), db: b}
}
func (b *BadgerDB) ReaderAt(version uint64) (dbm.DBReader, error) {
func (b *BadgerDB) ReaderAt(version uint64) (db.DBReader, error) {
b.mtx.RLock()
defer b.mtx.RUnlock()
ts, has := b.vmgr.versionTs(version)
if !has {
return nil, dbm.ErrVersionDoesNotExist
return nil, db.ErrVersionDoesNotExist
}
return &badgerTxn{txn: b.db.NewTransactionAt(ts, false), db: b}, nil
}
func (b *BadgerDB) ReadWriter() dbm.DBReadWriter {
func (b *BadgerDB) ReadWriter() db.DBReadWriter {
atomic.AddInt32(&b.openWriters, 1)
b.mtx.RLock()
ts := b.vmgr.lastTs
@ -191,7 +191,7 @@ func (b *BadgerDB) ReadWriter() dbm.DBReadWriter {
return &badgerWriter{badgerTxn{txn: b.db.NewTransactionAt(ts, true), db: b}, false}
}
func (b *BadgerDB) Writer() dbm.DBWriter {
func (b *BadgerDB) Writer() db.DBWriter {
// Badger has a WriteBatch, but it doesn't support conflict detection
return b.ReadWriter()
}
@ -205,7 +205,7 @@ func (b *BadgerDB) Close() error {
// Versions implements DBConnection.
// Returns a VersionSet that is valid until the next call to SaveVersion or DeleteVersion.
func (b *BadgerDB) Versions() (dbm.VersionSet, error) {
func (b *BadgerDB) Versions() (db.VersionSet, error) {
b.mtx.RLock()
defer b.mtx.RUnlock()
return b.vmgr, nil
@ -215,21 +215,21 @@ func (b *BadgerDB) save(target uint64) (uint64, error) {
b.mtx.Lock()
defer b.mtx.Unlock()
if b.openWriters > 0 {
return 0, dbm.ErrOpenTransactions
return 0, db.ErrOpenTransactions
}
b.vmgr = b.vmgr.Copy()
return b.vmgr.Save(target)
}
// SaveVersion implements DBConnection.
// SaveNextVersion implements DBConnection.
func (b *BadgerDB) SaveNextVersion() (uint64, error) {
return b.save(0)
}
// SaveNextVersion implements DBConnection.
// SaveVersion implements DBConnection.
func (b *BadgerDB) SaveVersion(target uint64) error {
if target == 0 {
return dbm.ErrInvalidVersion
return db.ErrInvalidVersion
}
_, err := b.save(target)
return err
@ -239,7 +239,7 @@ func (b *BadgerDB) DeleteVersion(target uint64) error {
b.mtx.Lock()
defer b.mtx.Unlock()
if !b.vmgr.Exists(target) {
return dbm.ErrVersionDoesNotExist
return db.ErrVersionDoesNotExist
}
b.vmgr = b.vmgr.Copy()
b.vmgr.Delete(target)
@ -250,7 +250,7 @@ func (b *BadgerDB) Revert() error {
b.mtx.RLock()
defer b.mtx.RUnlock()
if b.openWriters > 0 {
return dbm.ErrOpenTransactions
return db.ErrOpenTransactions
}
// Revert from latest commit timestamp to last "saved" timestamp
@ -327,7 +327,7 @@ func (b *BadgerDB) Stats() map[string]string { return nil }
func (tx *badgerTxn) Get(key []byte) ([]byte, error) {
if len(key) == 0 {
return nil, dbm.ErrKeyEmpty
return nil, db.ErrKeyEmpty
}
item, err := tx.txn.Get(key)
@ -345,7 +345,7 @@ func (tx *badgerTxn) Get(key []byte) ([]byte, error) {
func (tx *badgerTxn) Has(key []byte) (bool, error) {
if len(key) == 0 {
return false, dbm.ErrKeyEmpty
return false, db.ErrKeyEmpty
}
_, err := tx.txn.Get(key)
@ -364,7 +364,7 @@ func (tx *badgerWriter) Set(key, value []byte) error {
func (tx *badgerWriter) Delete(key []byte) error {
if len(key) == 0 {
return dbm.ErrKeyEmpty
return db.ErrKeyEmpty
}
return tx.txn.Delete(key)
}
@ -398,7 +398,7 @@ func (tx *badgerWriter) Discard() error {
func (tx *badgerTxn) iteratorOpts(start, end []byte, opts badger.IteratorOptions) (*badgerIterator, error) {
if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) {
return nil, dbm.ErrKeyEmpty
return nil, db.ErrKeyEmpty
}
iter := tx.txn.NewIterator(opts)
iter.Rewind()
@ -416,12 +416,12 @@ func (tx *badgerTxn) iteratorOpts(start, end []byte, opts badger.IteratorOptions
}, nil
}
func (tx *badgerTxn) Iterator(start, end []byte) (dbm.Iterator, error) {
func (tx *badgerTxn) Iterator(start, end []byte) (db.Iterator, error) {
opts := badger.DefaultIteratorOptions
return tx.iteratorOpts(start, end, opts)
}
func (tx *badgerTxn) ReverseIterator(start, end []byte) (dbm.Iterator, error) {
func (tx *badgerTxn) ReverseIterator(start, end []byte) (db.Iterator, error) {
opts := badger.DefaultIteratorOptions
opts.Reverse = true
return tx.iteratorOpts(end, start, opts)
@ -484,7 +484,7 @@ func (vm *versionManager) versionTs(ver uint64) (uint64, bool) {
// updateCommitTs increments the lastTs if equal to readts.
func (vm *versionManager) updateCommitTs(readts uint64) {
if vm.lastTs == readts {
vm.lastTs += 1
vm.lastTs++
}
}

View File

@ -5,14 +5,14 @@ import (
"github.com/stretchr/testify/require"
dbm "github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db/dbtest"
)
func load(t *testing.T, dir string) dbm.DBConnection {
db, err := NewDB(dir)
func load(t *testing.T, dir string) db.DBConnection {
d, err := NewDB(dir)
require.NoError(t, err)
return db
return d
}
func TestGetSetHasDelete(t *testing.T) {

View File

@ -3,11 +3,13 @@ go 1.17
module github.com/cosmos/cosmos-sdk/db
require (
// Note: gorocksdb bindings for OptimisticTransactionDB are not merged upstream, so we use a fork
// See https://github.com/tecbot/gorocksdb/pull/216
github.com/cosmos/gorocksdb v1.2.0
github.com/dgraph-io/badger/v3 v3.2103.2
github.com/dgraph-io/ristretto v0.1.0
github.com/google/btree v1.0.1
github.com/stretchr/testify v1.7.0
github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c
)
require (
@ -30,7 +32,3 @@ require (
google.golang.org/protobuf v1.27.1 // indirect
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
)
// 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

View File

@ -14,8 +14,8 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX
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=

View File

@ -6,7 +6,7 @@ import (
"sync"
"sync/atomic"
dbm "github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db"
dbutil "github.com/cosmos/cosmos-sdk/db/internal"
"github.com/google/btree"
)
@ -32,7 +32,7 @@ type MemDB struct {
btree *btree.BTree // Main contents
mtx sync.RWMutex // Guards version history
saved map[uint64]*btree.BTree // Past versions
vmgr *dbm.VersionManager // Mirrors version keys
vmgr *db.VersionManager // Mirrors version keys
openWriters int32 // Open writers
}
@ -43,10 +43,10 @@ type dbTxn struct {
type dbWriter struct{ dbTxn }
var (
_ dbm.DBConnection = (*MemDB)(nil)
_ dbm.DBReader = (*dbTxn)(nil)
_ dbm.DBWriter = (*dbWriter)(nil)
_ dbm.DBReadWriter = (*dbWriter)(nil)
_ db.DBConnection = (*MemDB)(nil)
_ db.DBReader = (*dbTxn)(nil)
_ db.DBWriter = (*dbWriter)(nil)
_ db.DBReadWriter = (*dbWriter)(nil)
)
// item is a btree.Item with byte slices as keys and values
@ -60,127 +60,127 @@ func NewDB() *MemDB {
return &MemDB{
btree: btree.New(bTreeDegree),
saved: make(map[uint64]*btree.BTree),
vmgr: dbm.NewVersionManager(nil),
vmgr: db.NewVersionManager(nil),
}
}
func (db *MemDB) newTxn(tree *btree.BTree) dbTxn {
return dbTxn{tree, db}
func (dbm *MemDB) newTxn(tree *btree.BTree) dbTxn {
return dbTxn{tree, dbm}
}
// Close implements DB.
// Close is a noop since for an in-memory database, we don't have a destination to flush
// contents to nor do we want any data loss on invoking Close().
// See the discussion in https://github.com/tendermint/tendermint/libs/pull/56
func (db *MemDB) Close() error {
func (dbm *MemDB) Close() error {
return nil
}
// Versions implements DBConnection.
func (db *MemDB) Versions() (dbm.VersionSet, error) {
db.mtx.RLock()
defer db.mtx.RUnlock()
return db.vmgr, nil
func (dbm *MemDB) Versions() (db.VersionSet, error) {
dbm.mtx.RLock()
defer dbm.mtx.RUnlock()
return dbm.vmgr, nil
}
// Reader implements DBConnection.
func (db *MemDB) Reader() dbm.DBReader {
db.mtx.RLock()
defer db.mtx.RUnlock()
ret := db.newTxn(db.btree)
func (dbm *MemDB) Reader() db.DBReader {
dbm.mtx.RLock()
defer dbm.mtx.RUnlock()
ret := dbm.newTxn(dbm.btree)
return &ret
}
// ReaderAt implements DBConnection.
func (db *MemDB) ReaderAt(version uint64) (dbm.DBReader, error) {
db.mtx.RLock()
defer db.mtx.RUnlock()
tree, ok := db.saved[version]
func (dbm *MemDB) ReaderAt(version uint64) (db.DBReader, error) {
dbm.mtx.RLock()
defer dbm.mtx.RUnlock()
tree, ok := dbm.saved[version]
if !ok {
return nil, dbm.ErrVersionDoesNotExist
return nil, db.ErrVersionDoesNotExist
}
ret := db.newTxn(tree)
ret := dbm.newTxn(tree)
return &ret, nil
}
// Writer implements DBConnection.
func (db *MemDB) Writer() dbm.DBWriter {
return db.ReadWriter()
func (dbm *MemDB) Writer() db.DBWriter {
return dbm.ReadWriter()
}
// ReadWriter implements DBConnection.
func (db *MemDB) ReadWriter() dbm.DBReadWriter {
db.mtx.RLock()
defer db.mtx.RUnlock()
atomic.AddInt32(&db.openWriters, 1)
func (dbm *MemDB) ReadWriter() db.DBReadWriter {
dbm.mtx.RLock()
defer dbm.mtx.RUnlock()
atomic.AddInt32(&dbm.openWriters, 1)
// Clone creates a copy-on-write extension of the current tree
return &dbWriter{db.newTxn(db.btree.Clone())}
return &dbWriter{dbm.newTxn(dbm.btree.Clone())}
}
func (db *MemDB) save(target uint64) (uint64, error) {
db.mtx.Lock()
defer db.mtx.Unlock()
if db.openWriters > 0 {
return 0, dbm.ErrOpenTransactions
func (dbm *MemDB) save(target uint64) (uint64, error) {
dbm.mtx.Lock()
defer dbm.mtx.Unlock()
if dbm.openWriters > 0 {
return 0, db.ErrOpenTransactions
}
newVmgr := db.vmgr.Copy()
newVmgr := dbm.vmgr.Copy()
target, err := newVmgr.Save(target)
if err != nil {
return 0, err
}
db.saved[target] = db.btree
db.vmgr = newVmgr
dbm.saved[target] = dbm.btree
dbm.vmgr = newVmgr
return target, nil
}
// SaveVersion implements DBConnection.
func (db *MemDB) SaveNextVersion() (uint64, error) {
return db.save(0)
func (dbm *MemDB) SaveNextVersion() (uint64, error) {
return dbm.save(0)
}
// SaveNextVersion implements DBConnection.
func (db *MemDB) SaveVersion(target uint64) error {
func (dbm *MemDB) SaveVersion(target uint64) error {
if target == 0 {
return dbm.ErrInvalidVersion
return db.ErrInvalidVersion
}
_, err := db.save(target)
_, err := dbm.save(target)
return err
}
// DeleteVersion implements DBConnection.
func (db *MemDB) DeleteVersion(target uint64) error {
db.mtx.Lock()
defer db.mtx.Unlock()
if _, has := db.saved[target]; !has {
return dbm.ErrVersionDoesNotExist
func (dbm *MemDB) DeleteVersion(target uint64) error {
dbm.mtx.Lock()
defer dbm.mtx.Unlock()
if _, has := dbm.saved[target]; !has {
return db.ErrVersionDoesNotExist
}
delete(db.saved, target)
db.vmgr = db.vmgr.Copy()
db.vmgr.Delete(target)
delete(dbm.saved, target)
dbm.vmgr = dbm.vmgr.Copy()
dbm.vmgr.Delete(target)
return nil
}
func (db *MemDB) Revert() error {
db.mtx.RLock()
defer db.mtx.RUnlock()
if db.openWriters > 0 {
return dbm.ErrOpenTransactions
func (dbm *MemDB) Revert() error {
dbm.mtx.RLock()
defer dbm.mtx.RUnlock()
if dbm.openWriters > 0 {
return db.ErrOpenTransactions
}
last := db.vmgr.Last()
last := dbm.vmgr.Last()
if last == 0 {
db.btree = btree.New(bTreeDegree)
dbm.btree = btree.New(bTreeDegree)
return nil
}
var has bool
db.btree, has = db.saved[last]
dbm.btree, has = dbm.saved[last]
if !has {
return fmt.Errorf("bad version history: version %v not saved", last)
}
for ver, _ := range db.saved {
for ver, _ := range dbm.saved {
if ver > last {
delete(db.saved, ver)
delete(dbm.saved, ver)
}
}
return nil
@ -189,10 +189,10 @@ func (db *MemDB) Revert() error {
// Get implements DBReader.
func (tx *dbTxn) Get(key []byte) ([]byte, error) {
if tx.btree == nil {
return nil, dbm.ErrTransactionClosed
return nil, db.ErrTransactionClosed
}
if len(key) == 0 {
return nil, dbm.ErrKeyEmpty
return nil, db.ErrKeyEmpty
}
i := tx.btree.Get(newKey(key))
if i != nil {
@ -204,10 +204,10 @@ func (tx *dbTxn) Get(key []byte) ([]byte, error) {
// Has implements DBReader.
func (tx *dbTxn) Has(key []byte) (bool, error) {
if tx.btree == nil {
return false, dbm.ErrTransactionClosed
return false, db.ErrTransactionClosed
}
if len(key) == 0 {
return false, dbm.ErrKeyEmpty
return false, db.ErrKeyEmpty
}
return tx.btree.Has(newKey(key)), nil
}
@ -215,7 +215,7 @@ func (tx *dbTxn) Has(key []byte) (bool, error) {
// Set implements DBWriter.
func (tx *dbWriter) Set(key []byte, value []byte) error {
if tx.btree == nil {
return dbm.ErrTransactionClosed
return db.ErrTransactionClosed
}
if err := dbutil.ValidateKv(key, value); err != nil {
return err
@ -227,10 +227,10 @@ func (tx *dbWriter) Set(key []byte, value []byte) error {
// Delete implements DBWriter.
func (tx *dbWriter) Delete(key []byte) error {
if tx.btree == nil {
return dbm.ErrTransactionClosed
return db.ErrTransactionClosed
}
if len(key) == 0 {
return dbm.ErrKeyEmpty
return db.ErrKeyEmpty
}
tx.btree.Delete(newKey(key))
return nil
@ -238,24 +238,24 @@ func (tx *dbWriter) Delete(key []byte) error {
// Iterator implements DBReader.
// Takes out a read-lock on the database until the iterator is closed.
func (tx *dbTxn) Iterator(start, end []byte) (dbm.Iterator, error) {
func (tx *dbTxn) Iterator(start, end []byte) (db.Iterator, error) {
if tx.btree == nil {
return nil, dbm.ErrTransactionClosed
return nil, db.ErrTransactionClosed
}
if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) {
return nil, dbm.ErrKeyEmpty
return nil, db.ErrKeyEmpty
}
return newMemDBIterator(tx, start, end, false), nil
}
// ReverseIterator implements DBReader.
// Takes out a read-lock on the database until the iterator is closed.
func (tx *dbTxn) ReverseIterator(start, end []byte) (dbm.Iterator, error) {
func (tx *dbTxn) ReverseIterator(start, end []byte) (db.Iterator, error) {
if tx.btree == nil {
return nil, dbm.ErrTransactionClosed
return nil, db.ErrTransactionClosed
}
if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) {
return nil, dbm.ErrKeyEmpty
return nil, db.ErrKeyEmpty
}
return newMemDBIterator(tx, start, end, true), nil
}
@ -263,7 +263,7 @@ func (tx *dbTxn) ReverseIterator(start, end []byte) (dbm.Iterator, error) {
// Commit implements DBWriter.
func (tx *dbWriter) Commit() error {
if tx.btree == nil {
return dbm.ErrTransactionClosed
return db.ErrTransactionClosed
}
tx.db.mtx.Lock()
defer tx.db.mtx.Unlock()
@ -288,11 +288,11 @@ func (tx *dbWriter) Discard() error {
}
// Print prints the database contents.
func (db *MemDB) Print() error {
db.mtx.RLock()
defer db.mtx.RUnlock()
func (dbm *MemDB) Print() error {
dbm.mtx.RLock()
defer dbm.mtx.RUnlock()
db.btree.Ascend(func(i btree.Item) bool {
dbm.btree.Ascend(func(i btree.Item) bool {
item := i.(*item)
fmt.Printf("[%X]:\t[%X]\n", item.key, item.value)
return true
@ -301,13 +301,13 @@ func (db *MemDB) Print() error {
}
// Stats implements DBConnection.
func (db *MemDB) Stats() map[string]string {
db.mtx.RLock()
defer db.mtx.RUnlock()
func (dbm *MemDB) Stats() map[string]string {
dbm.mtx.RLock()
defer dbm.mtx.RUnlock()
stats := make(map[string]string)
stats["database.type"] = "memDB"
stats["database.size"] = fmt.Sprintf("%d", db.btree.Len())
stats["database.size"] = fmt.Sprintf("%d", dbm.btree.Len())
return stats
}

View File

@ -3,32 +3,32 @@ package memdb
import (
"testing"
dbm "github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db/dbtest"
)
func BenchmarkMemDBRangeScans1M(b *testing.B) {
db := NewDB()
defer db.Close()
dbm := NewDB()
defer dbm.Close()
dbtest.BenchmarkRangeScans(b, db.ReadWriter(), int64(1e6))
dbtest.BenchmarkRangeScans(b, dbm.ReadWriter(), int64(1e6))
}
func BenchmarkMemDBRangeScans10M(b *testing.B) {
db := NewDB()
defer db.Close()
dbm := NewDB()
defer dbm.Close()
dbtest.BenchmarkRangeScans(b, db.ReadWriter(), int64(10e6))
dbtest.BenchmarkRangeScans(b, dbm.ReadWriter(), int64(10e6))
}
func BenchmarkMemDBRandomReadsWrites(b *testing.B) {
db := NewDB()
defer db.Close()
dbm := NewDB()
defer dbm.Close()
dbtest.BenchmarkRandomReadsWrites(b, db.ReadWriter())
dbtest.BenchmarkRandomReadsWrites(b, dbm.ReadWriter())
}
func load(t *testing.T, _ string) dbm.DBConnection {
func load(t *testing.T, _ string) db.DBConnection {
return NewDB()
}

View File

@ -4,7 +4,7 @@ import (
"bytes"
"context"
tmdb "github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db"
"github.com/google/btree"
)
@ -24,7 +24,7 @@ type memDBIterator struct {
end []byte
}
var _ tmdb.Iterator = (*memDBIterator)(nil)
var _ db.Iterator = (*memDBIterator)(nil)
// newMemDBIterator creates a new memDBIterator.
// A visitor is passed to the btree which streams items to the iterator over a channel. Advancing

View File

@ -3,55 +3,55 @@
package prefix
import (
dbm "github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db"
)
// prefixed Reader
type prefixR struct {
db dbm.DBReader
db db.DBReader
prefix []byte
}
// prefixed ReadWriter
type prefixRW struct {
db dbm.DBReadWriter
db db.DBReadWriter
prefix []byte
}
// prefixed Writer
type prefixW struct {
db dbm.DBWriter
db db.DBWriter
prefix []byte
}
var _ dbm.DBReader = (*prefixR)(nil)
var _ dbm.DBReadWriter = (*prefixRW)(nil)
var _ dbm.DBWriter = (*prefixW)(nil)
var _ db.DBReader = (*prefixR)(nil)
var _ db.DBReadWriter = (*prefixRW)(nil)
var _ db.DBWriter = (*prefixW)(nil)
// NewPrefixReader returns a DBReader that only has access to the subset of DB keys
// that contain the given prefix.
func NewPrefixReader(db dbm.DBReader, prefix []byte) prefixR {
func NewPrefixReader(dbr db.DBReader, prefix []byte) prefixR {
return prefixR{
prefix: prefix,
db: db,
db: dbr,
}
}
// NewPrefixReadWriter returns a DBReader that only has access to the subset of DB keys
// that contain the given prefix.
func NewPrefixReadWriter(db dbm.DBReadWriter, prefix []byte) prefixRW {
func NewPrefixReadWriter(dbrw db.DBReadWriter, prefix []byte) prefixRW {
return prefixRW{
prefix: prefix,
db: db,
db: dbrw,
}
}
// NewPrefixWriter returns a DBWriter that reads/writes only from the subset of DB keys
// that contain the given prefix
func NewPrefixWriter(db dbm.DBWriter, prefix []byte) prefixW {
func NewPrefixWriter(dbw db.DBWriter, prefix []byte) prefixW {
return prefixW{
prefix: prefix,
db: db,
db: dbw,
}
}
@ -62,7 +62,7 @@ func prefixed(prefix, key []byte) []byte {
// Get implements DBReader.
func (pdb prefixR) Get(key []byte) ([]byte, error) {
if len(key) == 0 {
return nil, dbm.ErrKeyEmpty
return nil, db.ErrKeyEmpty
}
return pdb.db.Get(prefixed(pdb.prefix, key))
}
@ -70,15 +70,15 @@ func (pdb prefixR) Get(key []byte) ([]byte, error) {
// Has implements DBReader.
func (pdb prefixR) Has(key []byte) (bool, error) {
if len(key) == 0 {
return false, dbm.ErrKeyEmpty
return false, db.ErrKeyEmpty
}
return pdb.db.Has(prefixed(pdb.prefix, key))
}
// Iterator implements DBReader.
func (pdb prefixR) Iterator(start, end []byte) (dbm.Iterator, error) {
func (pdb prefixR) Iterator(start, end []byte) (db.Iterator, error) {
if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) {
return nil, dbm.ErrKeyEmpty
return nil, db.ErrKeyEmpty
}
var pend []byte
@ -95,9 +95,9 @@ func (pdb prefixR) Iterator(start, end []byte) (dbm.Iterator, error) {
}
// ReverseIterator implements DBReader.
func (pdb prefixR) ReverseIterator(start, end []byte) (dbm.Iterator, error) {
func (pdb prefixR) ReverseIterator(start, end []byte) (db.Iterator, error) {
if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) {
return nil, dbm.ErrKeyEmpty
return nil, db.ErrKeyEmpty
}
var pend []byte
@ -119,7 +119,7 @@ func (pdb prefixR) Discard() error { return pdb.db.Discard() }
// Set implements DBReadWriter.
func (pdb prefixRW) Set(key []byte, value []byte) error {
if len(key) == 0 {
return dbm.ErrKeyEmpty
return db.ErrKeyEmpty
}
return pdb.db.Set(prefixed(pdb.prefix, key), value)
}
@ -127,7 +127,7 @@ func (pdb prefixRW) Set(key []byte, value []byte) error {
// Delete implements DBReadWriter.
func (pdb prefixRW) Delete(key []byte) error {
if len(key) == 0 {
return dbm.ErrKeyEmpty
return db.ErrKeyEmpty
}
return pdb.db.Delete(prefixed(pdb.prefix, key))
}
@ -143,12 +143,12 @@ func (pdb prefixRW) Has(key []byte) (bool, error) {
}
// Iterator implements DBReadWriter.
func (pdb prefixRW) Iterator(start, end []byte) (dbm.Iterator, error) {
func (pdb prefixRW) Iterator(start, end []byte) (db.Iterator, error) {
return NewPrefixReader(pdb.db, pdb.prefix).Iterator(start, end)
}
// ReverseIterator implements DBReadWriter.
func (pdb prefixRW) ReverseIterator(start, end []byte) (dbm.Iterator, error) {
func (pdb prefixRW) ReverseIterator(start, end []byte) (db.Iterator, error) {
return NewPrefixReader(pdb.db, pdb.prefix).ReverseIterator(start, end)
}
@ -161,7 +161,7 @@ func (pdb prefixRW) Discard() error { return pdb.db.Discard() }
// Set implements DBReadWriter.
func (pdb prefixW) Set(key []byte, value []byte) error {
if len(key) == 0 {
return dbm.ErrKeyEmpty
return db.ErrKeyEmpty
}
return pdb.db.Set(prefixed(pdb.prefix, key), value)
}
@ -169,7 +169,7 @@ func (pdb prefixW) Set(key []byte, value []byte) error {
// Delete implements DBWriter.
func (pdb prefixW) Delete(key []byte) error {
if len(key) == 0 {
return dbm.ErrKeyEmpty
return db.ErrKeyEmpty
}
return pdb.db.Delete(prefixed(pdb.prefix, key))
}

View File

@ -4,18 +4,18 @@ import (
"bytes"
"fmt"
dbm "github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db"
)
// IteratePrefix is a convenience function for iterating over a key domain
// restricted by prefix.
func IteratePrefix(db dbm.DBReader, prefix []byte) (dbm.Iterator, error) {
func IteratePrefix(dbr db.DBReader, prefix []byte) (db.Iterator, error) {
var start, end []byte
if len(prefix) != 0 {
start = prefix
end = cpIncr(prefix)
}
itr, err := db.Iterator(start, end)
itr, err := dbr.Iterator(start, end)
if err != nil {
return nil, err
}
@ -27,13 +27,13 @@ type prefixDBIterator struct {
prefix []byte
start []byte
end []byte
source dbm.Iterator
source db.Iterator
err error
}
var _ dbm.Iterator = (*prefixDBIterator)(nil)
var _ db.Iterator = (*prefixDBIterator)(nil)
func newPrefixIterator(prefix, start, end []byte, source dbm.Iterator) *prefixDBIterator {
func newPrefixIterator(prefix, start, end []byte, source db.Iterator) *prefixDBIterator {
return &prefixDBIterator{
prefix: prefix,
start: start,

View File

@ -5,13 +5,13 @@ import (
"github.com/stretchr/testify/require"
dbm "github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db/dbtest"
"github.com/cosmos/cosmos-sdk/db/memdb"
pfx "github.com/cosmos/cosmos-sdk/db/prefix"
)
func fillDBWithStuff(t *testing.T, dbw dbm.DBWriter) {
func fillDBWithStuff(t *testing.T, dbw db.DBWriter) {
// Under "key" prefix
require.NoError(t, dbw.Set([]byte("key"), []byte("value")))
require.NoError(t, dbw.Set([]byte("key1"), []byte("value1")))
@ -24,14 +24,14 @@ func fillDBWithStuff(t *testing.T, dbw dbm.DBWriter) {
require.NoError(t, dbw.Commit())
}
func mockDBWithStuff(t *testing.T) dbm.DBConnection {
db := memdb.NewDB()
fillDBWithStuff(t, db.Writer())
return db
func mockDBWithStuff(t *testing.T) db.DBConnection {
dbm := memdb.NewDB()
fillDBWithStuff(t, dbm.Writer())
return dbm
}
func makePrefixReader(t *testing.T, db dbm.DBConnection, pre []byte) dbm.DBReader {
view := db.Reader()
func makePrefixReader(t *testing.T, dbc db.DBConnection, pre []byte) db.DBReader {
view := dbc.Reader()
require.NotNil(t, view)
return pfx.NewPrefixReader(view, pre)
}
@ -133,18 +133,18 @@ func TestPrefixDBReverseIterator7(t *testing.T) {
func TestPrefixDBViewVersion(t *testing.T) {
prefix := []byte("key")
db := memdb.NewDB()
fillDBWithStuff(t, db.Writer())
id, err := db.SaveNextVersion()
dbm := memdb.NewDB()
fillDBWithStuff(t, dbm.Writer())
id, err := dbm.SaveNextVersion()
require.NoError(t, err)
pdb := pfx.NewPrefixReadWriter(db.ReadWriter(), prefix)
pdb := pfx.NewPrefixReadWriter(dbm.ReadWriter(), prefix)
pdb.Set([]byte("1"), []byte("newvalue1"))
pdb.Delete([]byte("2"))
pdb.Set([]byte("4"), []byte("newvalue4"))
pdb.Discard()
dbview, err := db.ReaderAt(id)
dbview, err := dbm.ReaderAt(id)
require.NotNil(t, dbview)
require.NoError(t, err)
view := pfx.NewPrefixReader(dbview, prefix)

View File

@ -5,9 +5,9 @@ package rocksdb
import (
"sync/atomic"
dbm "github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db"
dbutil "github.com/cosmos/cosmos-sdk/db/internal"
"github.com/tecbot/gorocksdb"
"github.com/cosmos/gorocksdb"
)
type rocksDBBatch struct {
@ -15,7 +15,7 @@ type rocksDBBatch struct {
mgr *dbManager
}
var _ dbm.DBWriter = (*rocksDBBatch)(nil)
var _ db.DBWriter = (*rocksDBBatch)(nil)
func (mgr *dbManager) newRocksDBBatch() *rocksDBBatch {
return &rocksDBBatch{
@ -30,7 +30,7 @@ func (b *rocksDBBatch) Set(key, value []byte) error {
return err
}
if b.batch == nil {
return dbm.ErrTransactionClosed
return db.ErrTransactionClosed
}
b.batch.Put(key, value)
return nil
@ -39,10 +39,10 @@ func (b *rocksDBBatch) Set(key, value []byte) error {
// Delete implements DBWriter.
func (b *rocksDBBatch) Delete(key []byte) error {
if len(key) == 0 {
return dbm.ErrKeyEmpty
return db.ErrKeyEmpty
}
if b.batch == nil {
return dbm.ErrTransactionClosed
return db.ErrTransactionClosed
}
b.batch.Delete(key)
return nil
@ -51,7 +51,7 @@ func (b *rocksDBBatch) Delete(key []byte) error {
// Write implements DBWriter.
func (b *rocksDBBatch) Commit() (err error) {
if b.batch == nil {
return dbm.ErrTransactionClosed
return db.ErrTransactionClosed
}
defer func() { err = dbutil.CombineErrors(err, b.Discard(), "Discard also failed") }()
err = b.mgr.current.Write(b.mgr.opts.wo, b.batch)

View File

@ -11,9 +11,9 @@ import (
"sync"
"sync/atomic"
dbm "github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db"
dbutil "github.com/cosmos/cosmos-sdk/db/internal"
"github.com/tecbot/gorocksdb"
"github.com/cosmos/gorocksdb"
)
var (
@ -22,10 +22,10 @@ var (
)
var (
_ dbm.DBConnection = (*RocksDB)(nil)
_ dbm.DBReader = (*dbTxn)(nil)
_ dbm.DBWriter = (*dbWriter)(nil)
_ dbm.DBReadWriter = (*dbWriter)(nil)
_ db.DBConnection = (*RocksDB)(nil)
_ db.DBReader = (*dbTxn)(nil)
_ db.DBWriter = (*dbWriter)(nil)
_ db.DBReadWriter = (*dbWriter)(nil)
)
// RocksDB is a connection to a RocksDB key-value database.
@ -35,7 +35,7 @@ type dbManager struct {
current *dbConnection
dir string
opts dbOptions
vmgr *dbm.VersionManager
vmgr *db.VersionManager
mtx sync.RWMutex
// Track open DBWriters
openWriters int32
@ -129,7 +129,7 @@ func (mgr *dbManager) checkpointsDir() string {
}
// Reads directory for checkpoints files
func readVersions(dir string) (*dbm.VersionManager, error) {
func readVersions(dir string) (*db.VersionManager, error) {
files, err := os.ReadDir(dir)
if err != nil {
return nil, err
@ -142,18 +142,18 @@ func readVersions(dir string) (*dbm.VersionManager, error) {
}
versions = append(versions, version)
}
return dbm.NewVersionManager(versions), nil
return db.NewVersionManager(versions), nil
}
func (mgr *dbManager) checkpointPath(version uint64) (string, error) {
dbPath := filepath.Join(mgr.checkpointsDir(), fmt.Sprintf(checkpointFileFormat, version))
if stat, err := os.Stat(dbPath); err != nil {
if errors.Is(err, os.ErrNotExist) {
err = dbm.ErrVersionDoesNotExist
err = db.ErrVersionDoesNotExist
}
return "", err
} else if !stat.IsDir() {
return "", dbm.ErrVersionDoesNotExist
return "", db.ErrVersionDoesNotExist
}
return dbPath, nil
}
@ -178,7 +178,7 @@ func (mgr *dbManager) openCheckpoint(version uint64) (*dbConnection, error) {
return db, nil
}
func (mgr *dbManager) Reader() dbm.DBReader {
func (mgr *dbManager) Reader() db.DBReader {
mgr.mtx.RLock()
defer mgr.mtx.RUnlock()
return &dbTxn{
@ -189,22 +189,22 @@ func (mgr *dbManager) Reader() dbm.DBReader {
}
}
func (mgr *dbManager) ReaderAt(version uint64) (dbm.DBReader, error) {
func (mgr *dbManager) ReaderAt(version uint64) (db.DBReader, error) {
mgr.mtx.RLock()
defer mgr.mtx.RUnlock()
db, err := mgr.openCheckpoint(version)
d, err := mgr.openCheckpoint(version)
if err != nil {
return nil, err
}
return &dbTxn{
txn: db.TransactionBegin(mgr.opts.wo, mgr.opts.txo, nil),
txn: d.TransactionBegin(mgr.opts.wo, mgr.opts.txo, nil),
mgr: mgr,
version: version,
}, nil
}
func (mgr *dbManager) ReadWriter() dbm.DBReadWriter {
func (mgr *dbManager) ReadWriter() db.DBReadWriter {
mgr.mtx.RLock()
defer mgr.mtx.RUnlock()
atomic.AddInt32(&mgr.openWriters, 1)
@ -214,14 +214,14 @@ func (mgr *dbManager) ReadWriter() dbm.DBReadWriter {
}}
}
func (mgr *dbManager) Writer() dbm.DBWriter {
func (mgr *dbManager) Writer() db.DBWriter {
mgr.mtx.RLock()
defer mgr.mtx.RUnlock()
atomic.AddInt32(&mgr.openWriters, 1)
return mgr.newRocksDBBatch()
}
func (mgr *dbManager) Versions() (dbm.VersionSet, error) {
func (mgr *dbManager) Versions() (db.VersionSet, error) {
mgr.mtx.RLock()
defer mgr.mtx.RUnlock()
return mgr.vmgr, nil
@ -235,7 +235,7 @@ func (mgr *dbManager) SaveNextVersion() (uint64, error) {
// SaveVersion implements DBConnection.
func (mgr *dbManager) SaveVersion(target uint64) error {
if target == 0 {
return dbm.ErrInvalidVersion
return db.ErrInvalidVersion
}
_, err := mgr.save(target)
return err
@ -245,7 +245,7 @@ func (mgr *dbManager) save(target uint64) (uint64, error) {
mgr.mtx.Lock()
defer mgr.mtx.Unlock()
if mgr.openWriters > 0 {
return 0, dbm.ErrOpenTransactions
return 0, db.ErrOpenTransactions
}
newVmgr := mgr.vmgr.Copy()
target, err := newVmgr.Save(target)
@ -267,7 +267,7 @@ func (mgr *dbManager) save(target uint64) (uint64, error) {
func (mgr *dbManager) DeleteVersion(ver uint64) error {
if mgr.cpCache.has(ver) {
return dbm.ErrOpenTransactions
return db.ErrOpenTransactions
}
mgr.mtx.Lock()
defer mgr.mtx.Unlock()
@ -284,7 +284,7 @@ func (mgr *dbManager) Revert() (err error) {
mgr.mtx.RLock()
defer mgr.mtx.RUnlock()
if mgr.openWriters > 0 {
return dbm.ErrOpenTransactions
return db.ErrOpenTransactions
}
// Close current connection and replace it with a checkpoint (created from the last checkpoint)
mgr.current.Close()
@ -341,10 +341,10 @@ func (mgr *dbManager) Stats() map[string]string {
// Get implements DBReader.
func (tx *dbTxn) Get(key []byte) ([]byte, error) {
if tx.txn == nil {
return nil, dbm.ErrTransactionClosed
return nil, db.ErrTransactionClosed
}
if len(key) == 0 {
return nil, dbm.ErrKeyEmpty
return nil, db.ErrKeyEmpty
}
res, err := tx.txn.Get(tx.mgr.opts.ro, key)
if err != nil {
@ -356,10 +356,10 @@ func (tx *dbTxn) Get(key []byte) ([]byte, error) {
// Get implements DBReader.
func (tx *dbWriter) Get(key []byte) ([]byte, error) {
if tx.txn == nil {
return nil, dbm.ErrTransactionClosed
return nil, db.ErrTransactionClosed
}
if len(key) == 0 {
return nil, dbm.ErrKeyEmpty
return nil, db.ErrKeyEmpty
}
res, err := tx.txn.GetForUpdate(tx.mgr.opts.ro, key)
if err != nil {
@ -380,7 +380,7 @@ func (tx *dbTxn) Has(key []byte) (bool, error) {
// Set implements DBWriter.
func (tx *dbWriter) Set(key []byte, value []byte) error {
if tx.txn == nil {
return dbm.ErrTransactionClosed
return db.ErrTransactionClosed
}
if err := dbutil.ValidateKv(key, value); err != nil {
return err
@ -391,17 +391,17 @@ func (tx *dbWriter) Set(key []byte, value []byte) error {
// Delete implements DBWriter.
func (tx *dbWriter) Delete(key []byte) error {
if tx.txn == nil {
return dbm.ErrTransactionClosed
return db.ErrTransactionClosed
}
if len(key) == 0 {
return dbm.ErrKeyEmpty
return db.ErrKeyEmpty
}
return tx.txn.Delete(key)
}
func (tx *dbWriter) Commit() (err error) {
if tx.txn == nil {
return dbm.ErrTransactionClosed
return db.ErrTransactionClosed
}
defer func() { err = dbutil.CombineErrors(err, tx.Discard(), "Discard also failed") }()
err = tx.txn.Commit()
@ -430,24 +430,24 @@ func (tx *dbWriter) Discard() error {
}
// Iterator implements DBReader.
func (tx *dbTxn) Iterator(start, end []byte) (dbm.Iterator, error) {
func (tx *dbTxn) Iterator(start, end []byte) (db.Iterator, error) {
if tx.txn == nil {
return nil, dbm.ErrTransactionClosed
return nil, db.ErrTransactionClosed
}
if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) {
return nil, dbm.ErrKeyEmpty
return nil, db.ErrKeyEmpty
}
itr := tx.txn.NewIterator(tx.mgr.opts.ro)
return newRocksDBIterator(itr, start, end, false), nil
}
// ReverseIterator implements DBReader.
func (tx *dbTxn) ReverseIterator(start, end []byte) (dbm.Iterator, error) {
func (tx *dbTxn) ReverseIterator(start, end []byte) (db.Iterator, error) {
if tx.txn == nil {
return nil, dbm.ErrTransactionClosed
return nil, db.ErrTransactionClosed
}
if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) {
return nil, dbm.ErrKeyEmpty
return nil, db.ErrKeyEmpty
}
itr := tx.txn.NewIterator(tx.mgr.opts.ro)
return newRocksDBIterator(itr, start, end, true), nil

View File

@ -9,14 +9,14 @@ import (
"github.com/stretchr/testify/require"
dbm "github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db/dbtest"
)
func load(t *testing.T, dir string) dbm.DBConnection {
db, err := NewDB(dir)
func load(t *testing.T, dir string) db.DBConnection {
d, err := NewDB(dir)
require.NoError(t, err)
return db
return d
}
func TestGetSetHasDelete(t *testing.T) {
@ -47,26 +47,26 @@ func TestReloadDB(t *testing.T) {
// Test that the DB can be reloaded after a failed Revert
func TestRevertRecovery(t *testing.T) {
dir := t.TempDir()
db, err := NewDB(dir)
d, err := NewDB(dir)
require.NoError(t, err)
txn := db.Writer()
txn := d.Writer()
require.NoError(t, txn.Set([]byte{1}, []byte{1}))
require.NoError(t, txn.Commit())
_, err = db.SaveNextVersion()
_, err = d.SaveNextVersion()
require.NoError(t, err)
txn = db.Writer()
txn = d.Writer()
require.NoError(t, txn.Set([]byte{2}, []byte{2}))
require.NoError(t, txn.Commit())
// move checkpoints dir temporarily to trigger an error
hideDir := filepath.Join(dir, "hide_checkpoints")
require.NoError(t, os.Rename(db.checkpointsDir(), hideDir))
require.Error(t, db.Revert())
require.NoError(t, os.Rename(hideDir, db.checkpointsDir()))
require.NoError(t, os.Rename(d.checkpointsDir(), hideDir))
require.Error(t, d.Revert())
require.NoError(t, os.Rename(hideDir, d.checkpointsDir()))
db, err = NewDB(dir)
d, err = NewDB(dir)
require.NoError(t, err)
view := db.Reader()
view := d.Reader()
val, err := view.Get([]byte{1})
require.NoError(t, err)
require.Equal(t, []byte{1}, val)

View File

@ -5,8 +5,8 @@ package rocksdb
import (
"bytes"
dbm "github.com/cosmos/cosmos-sdk/db"
"github.com/tecbot/gorocksdb"
"github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/gorocksdb"
)
type rocksDBIterator struct {
@ -18,7 +18,7 @@ type rocksDBIterator struct {
primed bool
}
var _ dbm.Iterator = (*rocksDBIterator)(nil)
var _ db.Iterator = (*rocksDBIterator)(nil)
func newRocksDBIterator(source *gorocksdb.Iterator, start, end []byte, isReverse bool) *rocksDBIterator {
if isReverse {

View File

@ -6,12 +6,12 @@ import (
"github.com/stretchr/testify/require"
dbm "github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db"
)
// Test that VersionManager satisfies the behavior of VersionSet
func TestVersionManager(t *testing.T) {
vm := dbm.NewVersionManager(nil)
vm := db.NewVersionManager(nil)
require.Equal(t, uint64(0), vm.Last())
require.Equal(t, 0, vm.Count())
require.True(t, vm.Equal(vm))
@ -54,6 +54,6 @@ func TestVersionManager(t *testing.T) {
require.NoError(t, err)
require.False(t, vm.Exists(id5)) // true copy is made
vm2 := dbm.NewVersionManager([]uint64{id2, id3})
vm2 := db.NewVersionManager([]uint64{id2, id3})
require.True(t, vm.Equal(vm2))
}

2
go.mod
View File

@ -77,6 +77,8 @@ require (
github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect
github.com/dustin/go-humanize v1.0.0 // indirect
github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b // indirect
github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c // indirect
github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 // indirect
github.com/felixge/httpsnoop v1.0.1 // indirect
github.com/fsnotify/fsnotify v1.5.1 // indirect
github.com/go-kit/kit v0.12.0 // indirect

7
go.sum
View File

@ -288,6 +288,7 @@ github.com/cosmos/cosmos-sdk/errors v1.0.0-beta.2/go.mod h1:Gi7pzVRnvZ1N16JAXpLA
github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y=
github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY=
github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw=
github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw=
github.com/cosmos/iavl v0.15.0-rc3.0.20201009144442-230e9bdf52cd/go.mod h1:3xOIaNNX19p0QrX0VqWa6voPRoJRGGYtny+DH8NEPvE=
github.com/cosmos/iavl v0.15.0-rc5/go.mod h1:WqoPL9yPTQ85QBMT45OOUzPxG/U/JcJoN7uMjgxke/I=
github.com/cosmos/iavl v0.15.3/go.mod h1:OLjQiAQ4fGD2KDZooyJG9yz+p2ao2IAYSbke8mVvSA4=
@ -371,12 +372,14 @@ github.com/esimonov/ifshort v1.0.3/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+
github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM=
github.com/ethereum/go-ethereum v1.10.13/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw=
github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY=
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/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=

View File

@ -280,6 +280,7 @@ github.com/cosmos/cosmos-sdk/errors v1.0.0-beta.2/go.mod h1:Gi7pzVRnvZ1N16JAXpLA
github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y=
github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY=
github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw=
github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw=
github.com/cosmos/iavl v0.17.3 h1:s2N819a2olOmiauVa0WAhoIJq9EhSXE9HDBAoR9k+8Y=
github.com/cosmos/iavl v0.17.3/go.mod h1:prJoErZFABYZGDHka1R6Oay4z9PrNeFFiMKHDAMOi4w=
github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4=
@ -350,12 +351,14 @@ github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E
github.com/esimonov/ifshort v1.0.3/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE=
github.com/ethereum/go-ethereum v1.10.13/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw=
github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY=
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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=