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:
parent
6beb079924
commit
284affb594
@ -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
|
||||
|
||||
@ -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=
|
||||
|
||||
@ -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++
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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=
|
||||
|
||||
168
db/memdb/db.go
168
db/memdb/db.go
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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))
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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
2
go.mod
@ -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
7
go.sum
@ -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=
|
||||
|
||||
@ -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=
|
||||
|
||||
Loading…
Reference in New Issue
Block a user