From e063edd1735558e826a41a1d8472a97e68918e8c Mon Sep 17 00:00:00 2001 From: Marko Date: Tue, 11 Jun 2024 17:31:08 +0200 Subject: [PATCH] refactor: remove cosmos-db as a dep (#955) --- Makefile | 2 +- basic_test.go | 2 +- batch.go | 7 +- batch_test.go | 12 +- benchmarks/bench_test.go | 17 +- benchmarks/cosmos-exim/main.go | 13 +- benchmarks/hash_test.go | 53 ---- cmd/go.mod | 2 +- cmd/go.sum | 4 +- cmd/iaviewer/README.md | 8 +- cmd/iaviewer/main.go | 3 +- cmd/iaviewer/wrapper.go | 37 +++ db/README.md | 14 +- db/goleveldb.go | 400 ++++++++++++++++++++++++++++ db/memdb.go | 17 +- db/prefixdb.go | 359 +++++++++++++++++++++++++ db/types.go | 96 +------ db/wrapper.go | 44 ---- diff_test.go | 2 +- docs/proof/proof.md | 88 +++---- fast_iterator.go | 6 +- go.mod | 28 +- go.sum | 462 +-------------------------------- immutable_tree.go | 3 +- import.go | 6 +- internal/bytes/bytes.go | 8 +- iterator.go | 6 +- iterator_test.go | 15 +- migrate_test.go | 10 +- mock/db_mock.go | 18 +- mockgen.sh | 2 +- mutable_tree.go | 3 +- nodedb.go | 7 +- testutils_test.go | 3 +- tree_random_test.go | 2 +- tree_test.go | 35 +-- unsaved_fast_iterator.go | 21 +- with_gcc_test.go | 19 -- 38 files changed, 973 insertions(+), 861 deletions(-) delete mode 100644 benchmarks/hash_test.go create mode 100644 cmd/iaviewer/wrapper.go create mode 100644 db/goleveldb.go create mode 100644 db/prefixdb.go delete mode 100644 db/wrapper.go delete mode 100644 with_gcc_test.go diff --git a/Makefile b/Makefile index 73e05df27..c8d3884ec 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ format: # look into .golangci.yml for enabling / disabling linters golangci_lint_cmd=golangci-lint -golangci_version=v1.55.2 +golangci_version=v1.59.1 lint: @echo "--> Running linter" diff --git a/basic_test.go b/basic_test.go index f4ff4d2c4..395a1c238 100644 --- a/basic_test.go +++ b/basic_test.go @@ -383,7 +383,7 @@ func TestIterateRange(t *testing.T) { } // test traversing the whole node works... in order viewed := []string{} - tree.Iterate(func(key []byte, value []byte) bool { + tree.Iterate(func(key []byte, _ []byte) bool { viewed = append(viewed, string(key)) return false }) diff --git a/batch.go b/batch.go index 3de9b1684..caa41d896 100644 --- a/batch.go +++ b/batch.go @@ -3,6 +3,7 @@ package iavl import ( "sync" + corestore "cosmossdk.io/core/store" dbm "github.com/cosmos/iavl/db" ) @@ -11,13 +12,13 @@ import ( // as soon as the configurable limit is reached. type BatchWithFlusher struct { mtx sync.Mutex - db dbm.DB // This is only used to create new batch - batch dbm.Batch // Batched writing buffer. + db dbm.DB // This is only used to create new batch + batch corestore.Batch // Batched writing buffer. flushThreshold int // The threshold to flush the batch to disk. } -var _ dbm.Batch = (*BatchWithFlusher)(nil) +var _ corestore.Batch = (*BatchWithFlusher)(nil) // NewBatchWithFlusher returns new BatchWithFlusher wrapping the passed in batch func NewBatchWithFlusher(db dbm.DB, flushThreshold int) *BatchWithFlusher { diff --git a/batch_test.go b/batch_test.go index d89d919e5..17122043d 100644 --- a/batch_test.go +++ b/batch_test.go @@ -28,19 +28,13 @@ func makeKey(n uint16) []byte { } func TestBatchWithFlusher(t *testing.T) { - testedBackends := []string{ - "goleveldb", - } - - for _, backend := range testedBackends { - testBatchWithFlusher(t, backend) - } + testBatchWithFlusher(t) } -func testBatchWithFlusher(t *testing.T, backend string) { +func testBatchWithFlusher(t *testing.T) { name := fmt.Sprintf("test_%x", randstr(12)) dir := t.TempDir() - db, err := dbm.NewDB(name, backend, dir) + db, err := dbm.NewGoLevelDB(name, dir) require.NoError(t, err) defer cleanupDBDir(dir, name) diff --git a/benchmarks/bench_test.go b/benchmarks/bench_test.go index a1b1e5523..137cb7dd3 100644 --- a/benchmarks/bench_test.go +++ b/benchmarks/bench_test.go @@ -6,10 +6,10 @@ import ( mrand "math/rand" "os" "runtime" - "strings" "testing" "cosmossdk.io/core/log" + corestore "cosmossdk.io/core/store" "github.com/stretchr/testify/require" "github.com/cosmos/iavl" @@ -147,7 +147,7 @@ func runIterationSlow(b *testing.B, t *iavl.MutableTree, expectedSize int) { } } -func iterate(b *testing.B, itr dbm.Iterator, expectedSize int) { +func iterate(b *testing.B, itr corestore.Iterator, expectedSize int) { b.StartTimer() keyValuePairs := make([][][]byte, 0, expectedSize) for i := 0; i < expectedSize && itr.Valid(); i++ { @@ -330,9 +330,6 @@ func runBenchmarks(b *testing.B, benchmarks []benchmark) { // prepare a dir for the db and cleanup afterwards dirName := fmt.Sprintf("./%s-db", prefix) - if bb.dbType == "rocksdb" { - _ = os.Mkdir(dirName, 0o755) - } defer func() { err := os.RemoveAll(dirName) @@ -347,16 +344,8 @@ func runBenchmarks(b *testing.B, benchmarks []benchmark) { err error ) if bb.dbType != "nodb" { - d, err = dbm.NewDB("test", bb.dbType, dirName) - + d, err = dbm.NewGoLevelDB("test", dirName) if err != nil { - if strings.Contains(err.Error(), "unknown db_backend") { - // As an exception to run benchmarks: if the error is about cleveldb, or rocksdb, - // it requires a tag "cleveldb" to link the database at runtime, so instead just - // log the error instead of failing. - b.Logf("%+v\n", err) - continue - } require.NoError(b, err) } defer d.Close() diff --git a/benchmarks/cosmos-exim/main.go b/benchmarks/cosmos-exim/main.go index 293cc7795..d74f3b96a 100644 --- a/benchmarks/cosmos-exim/main.go +++ b/benchmarks/cosmos-exim/main.go @@ -6,7 +6,6 @@ import ( "time" "cosmossdk.io/core/log" - tmdb "github.com/cosmos/cosmos-db" "github.com/cosmos/iavl" idbm "github.com/cosmos/iavl/db" @@ -89,11 +88,11 @@ func run(dbPath string) error { // runExport runs an export benchmark and returns a map of store names/export nodes func runExport(dbPath string) (int64, map[string][]*iavl.ExportNode, error) { - ldb, err := tmdb.NewDB("application", tmdb.GoLevelDBBackend, dbPath) + ldb, err := idbm.NewGoLevelDB("application", dbPath) if err != nil { return 0, nil, err } - tree := iavl.NewMutableTree(idbm.NewWrapper(tmdb.NewPrefixDB(ldb, []byte("s/k:main/"))), 0, false, log.NewNopLogger()) + tree := iavl.NewMutableTree(idbm.NewPrefixDB(ldb, []byte("s/k:main/")), 0, false, log.NewNopLogger()) version, err := tree.LoadVersion(0) if err != nil { return 0, nil, err @@ -104,8 +103,8 @@ func runExport(dbPath string) (int64, map[string][]*iavl.ExportNode, error) { totalStats := Stats{} for _, name := range stores { - db := tmdb.NewPrefixDB(ldb, []byte("s/k:"+name+"/")) - tree := iavl.NewMutableTree(idbm.NewWrapper(db), 0, false, log.NewNopLogger()) + db := idbm.NewPrefixDB(ldb, []byte("s/k:"+name+"/")) + tree := iavl.NewMutableTree(db, 0, false, log.NewNopLogger()) stats := Stats{} export := make([]*iavl.ExportNode, 0, 100000) @@ -166,11 +165,11 @@ func runImport(version int64, exports map[string][]*iavl.ExportNode) error { start := time.Now() stats := Stats{} - newDB, err := tmdb.NewDB(name, tmdb.GoLevelDBBackend, tempdir) + newDB, err := idbm.NewGoLevelDB(name, tempdir) if err != nil { return err } - newTree := iavl.NewMutableTree(idbm.NewWrapper(newDB), 0, false, log.NewNopLogger()) + newTree := iavl.NewMutableTree(newDB, 0, false, log.NewNopLogger()) importer, err := newTree.Import(version) if err != nil { return err diff --git a/benchmarks/hash_test.go b/benchmarks/hash_test.go deleted file mode 100644 index 4ed6c527d..000000000 --- a/benchmarks/hash_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package benchmarks - -import ( - "crypto" - "fmt" - "hash" - "testing" - - "github.com/cosmos/iavl" - "github.com/stretchr/testify/require" - - _ "crypto/sha256" - - _ "golang.org/x/crypto/ripemd160" // nolint: staticcheck // need to test ripemd160 - _ "golang.org/x/crypto/sha3" -) - -func BenchmarkHash(b *testing.B) { - fmt.Printf("%s\n", iavl.GetVersionInfo()) - hashers := []struct { - name string - size int - hash hash.Hash - }{ - {"ripemd160", 64, crypto.RIPEMD160.New()}, - {"ripemd160", 512, crypto.RIPEMD160.New()}, - {"sha2-256", 64, crypto.SHA256.New()}, - {"sha2-256", 512, crypto.SHA256.New()}, - {"sha3-256", 64, crypto.SHA3_256.New()}, - {"sha3-256", 512, crypto.SHA3_256.New()}, - } - - for _, h := range hashers { - prefix := fmt.Sprintf("%s-%d", h.name, h.size) - hasher := h - b.Run(prefix, func(sub *testing.B) { - benchHasher(sub, hasher.hash, hasher.size) - }) - } -} - -func benchHasher(b *testing.B, hash hash.Hash, size int) { - // create all random bytes before to avoid timing this - inputs := randBytes(b.N + size + 1) - - for i := 0; i < b.N; i++ { - hash.Reset() - // grab a slice of size bytes from random string - _, err := hash.Write(inputs[i : i+size]) - require.NoError(b, err) - hash.Sum(nil) - } -} diff --git a/cmd/go.mod b/cmd/go.mod index 619f41146..fc19712d2 100644 --- a/cmd/go.mod +++ b/cmd/go.mod @@ -3,13 +3,13 @@ module github.com/cosmos/iavl/cmd go 1.21 require ( + cosmossdk.io/core v0.12.1-0.20240514205955-97c9bbb0341b cosmossdk.io/log v1.3.2-0.20240514205955-97c9bbb0341b github.com/cosmos/cosmos-db v1.0.2 github.com/cosmos/iavl v1.2.0 ) require ( - cosmossdk.io/core v0.12.1-0.20240514205955-97c9bbb0341b // indirect github.com/DataDog/zstd v1.4.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect diff --git a/cmd/go.sum b/cmd/go.sum index 267c34f24..981302bd8 100644 --- a/cmd/go.sum +++ b/cmd/go.sum @@ -380,8 +380,8 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/cmd/iaviewer/README.md b/cmd/iaviewer/README.md index ef21f1b98..c1088ad8a 100644 --- a/cmd/iaviewer/README.md +++ b/cmd/iaviewer/README.md @@ -104,15 +104,15 @@ diff a-cur.shape b-cur.shape ``` Yup, that is quite some difference. You can also look at the tree as a whole. -So, stretch your terminal nice and wide, and... +So, stretch your terminal nice and wide, and... ```shell less a-cur.shape ``` -It has `-5 ` for an inner node of depth 5, and `*6 ` for a leaf node (data) of depth 6. -Indentation also suggests the shape of the tree. +It has `-5` for an inner node of depth 5, and `*6` for a leaf node (data) of depth 6. +Indentation also suggests the shape of the tree. Note, if anyone wants to improve the visualization, that would be awesome. I have no idea how to do this well, but at least text output makes some -sense and is diff-able. \ No newline at end of file +sense and is diff-able. diff --git a/cmd/iaviewer/main.go b/cmd/iaviewer/main.go index 796741698..44835097d 100644 --- a/cmd/iaviewer/main.go +++ b/cmd/iaviewer/main.go @@ -14,7 +14,6 @@ import ( dbm "github.com/cosmos/cosmos-db" "github.com/cosmos/iavl" - idbm "github.com/cosmos/iavl/db" ) // TODO: make this configurable? @@ -123,7 +122,7 @@ func ReadTree(dir string, version int, prefix []byte) (*iavl.MutableTree, error) db = dbm.NewPrefixDB(db, prefix) } - tree := iavl.NewMutableTree(idbm.NewWrapper(db), DefaultCacheSize, false, log.NewLogger(os.Stdout)) + tree := iavl.NewMutableTree(newWrapper(db), DefaultCacheSize, false, log.NewLogger(os.Stdout)) ver, err := tree.LoadVersion(int64(version)) fmt.Printf("Got version: %d\n", ver) return tree, err diff --git a/cmd/iaviewer/wrapper.go b/cmd/iaviewer/wrapper.go new file mode 100644 index 000000000..23b6dfb36 --- /dev/null +++ b/cmd/iaviewer/wrapper.go @@ -0,0 +1,37 @@ +package main + +import ( + corestore "cosmossdk.io/core/store" + dbm "github.com/cosmos/cosmos-db" +) + +// Wrapper wraps a dbm.DB to implement DB. +type Wrapper struct { + dbm.DB +} + +// newWrapper returns a new Wrapper. +// Wrapper must be implemented against rocksdb.DB and pebbleDB separately +func newWrapper(db dbm.DB) *Wrapper { + return &Wrapper{DB: db} +} + +// Iterator implements DB. +func (db *Wrapper) Iterator(start, end []byte) (corestore.Iterator, error) { + return db.DB.Iterator(start, end) +} + +// ReverseIterator implements DB. +func (db *Wrapper) ReverseIterator(start, end []byte) (corestore.Iterator, error) { + return db.DB.ReverseIterator(start, end) +} + +// NewBatch implements DB. +func (db *Wrapper) NewBatch() corestore.Batch { + return db.DB.NewBatch() +} + +// NewBatchWithSize implements DB. +func (db *Wrapper) NewBatchWithSize(size int) corestore.Batch { + return db.DB.NewBatchWithSize(size) +} diff --git a/db/README.md b/db/README.md index b2885e328..d9418d2fd 100644 --- a/db/README.md +++ b/db/README.md @@ -11,18 +11,18 @@ package main import ( "cosmossdk.io/log" - dbm "github.com/cosmos/cosmos-db" + dbm "github.com/cosmos/cosmos-db" - "github.com/cosmos/iavl" - idbm "github.com/cosmos/iavl/db" + "github.com/cosmos/iavl" + idbm "github.com/cosmos/iavl/db" ) func main() { levelDB, err := dbm.NewDB("application", dbm.GoLevelDBBackend, "test") - if err != nil { - panic(err) - } + if err != nil { + panic(err) + } - tree := iavl.NewMutableTree(idbm.NewWrapper(dbm.NewPrefixDB(levelDB, []byte("s/k:main/"))), 0, false, log.NewNopLogger()) + tree := iavl.NewMutableTree(idbm.NewWrapper(dbm.NewPrefixDB(levelDB, []byte("s/k:main/"))), 0, false, log.NewNopLogger()) } ``` diff --git a/db/goleveldb.go b/db/goleveldb.go new file mode 100644 index 000000000..f29c555f8 --- /dev/null +++ b/db/goleveldb.go @@ -0,0 +1,400 @@ +package db + +import ( + "bytes" + "errors" + "fmt" + "path/filepath" + + corestore "cosmossdk.io/core/store" + "github.com/syndtr/goleveldb/leveldb" + dberrors "github.com/syndtr/goleveldb/leveldb/errors" + "github.com/syndtr/goleveldb/leveldb/filter" + "github.com/syndtr/goleveldb/leveldb/iterator" + "github.com/syndtr/goleveldb/leveldb/opt" + "github.com/syndtr/goleveldb/leveldb/util" +) + +const DBFileSuffix string = ".db" + +// GoLevelDB implements corestore.KVStore using github.com/syndtr/goleveldb/leveldb. +// It is used for only store v2 migration, since some clients use goleveldb as +// the IAVL v0/v1 backend. +type GoLevelDB struct { + db *leveldb.DB +} + +func NewGoLevelDB(name, dir string) (*GoLevelDB, error) { + defaultOpts := &opt.Options{ + Filter: filter.NewBloomFilter(10), // by default, goleveldb doesn't use a bloom filter. + } + + return NewGoLevelDBWithOpts(name, dir, defaultOpts) +} + +func NewGoLevelDBWithOpts(name, dir string, o *opt.Options) (*GoLevelDB, error) { + dbPath := filepath.Join(dir, name+DBFileSuffix) + db, err := leveldb.OpenFile(dbPath, o) + if err != nil { + return nil, err + } + return &GoLevelDB{db: db}, nil +} + +// Get implements corestore.KVStore. +func (db *GoLevelDB) Get(key []byte) ([]byte, error) { + if len(key) == 0 { + return nil, errors.New("key is empty") + } + res, err := db.db.Get(key, nil) + if err != nil { + if errors.Is(err, dberrors.ErrNotFound) { + return nil, nil + } + return nil, err + } + return res, nil +} + +// Has implements corestore.KVStore. +func (db *GoLevelDB) Has(key []byte) (bool, error) { + return db.db.Has(key, nil) +} + +// Set implements corestore.KVStore. +func (db *GoLevelDB) Set(key, value []byte) error { + if len(key) == 0 { + return errors.New("key is empty") + } + if value == nil { + return errors.New("value is nil") + } + return db.db.Put(key, value, nil) +} + +// SetSync implements corestore.KVStore. +func (db *GoLevelDB) SetSync(key, value []byte) error { + if len(key) == 0 { + return errors.New("key is empty") + } + if value == nil { + return errors.New("value is nil") + } + return db.db.Put(key, value, &opt.WriteOptions{Sync: true}) +} + +// Delete implements corestore.KVStore. +func (db *GoLevelDB) Delete(key []byte) error { + if len(key) == 0 { + return errors.New("key is empty") + } + return db.db.Delete(key, nil) +} + +// DeleteSync implements corestore.KVStore. +func (db *GoLevelDB) DeleteSync(key []byte) error { + if len(key) == 0 { + return errors.New("key is empty") + } + return db.db.Delete(key, &opt.WriteOptions{Sync: true}) +} + +func (db *GoLevelDB) RawDB() *leveldb.DB { + return db.db +} + +// Close implements corestore.KVStore. +func (db *GoLevelDB) Close() error { + return db.db.Close() +} + +// Print implements corestore.KVStore. +func (db *GoLevelDB) Print() error { + str, err := db.db.GetProperty("leveldb.stats") + if err != nil { + return err + } + fmt.Printf("%v\n", str) + + itr := db.db.NewIterator(nil, nil) + for itr.Next() { + key := itr.Key() + value := itr.Value() + fmt.Printf("[%X]:\t[%X]\n", key, value) + } + return nil +} + +// Stats implements corestore.KVStore. +func (db *GoLevelDB) Stats() map[string]string { + keys := []string{ + "leveldb.num-files-at-level{n}", + "leveldb.stats", + "leveldb.sstables", + "leveldb.blockpool", + "leveldb.cachedblock", + "leveldb.openedtables", + "leveldb.alivesnaps", + "leveldb.aliveiters", + } + + stats := make(map[string]string) + for _, key := range keys { + if str, err := db.db.GetProperty(key); err == nil { + stats[key] = str + } + } + return stats +} + +func (db *GoLevelDB) ForceCompact(start, limit []byte) error { + return db.db.CompactRange(util.Range{Start: start, Limit: limit}) +} + +// NewBatch implements corestore.BatchCreator. +func (db *GoLevelDB) NewBatch() corestore.Batch { + return newGoLevelDBBatch(db) +} + +// NewBatchWithSize implements corestore.BatchCreator. +func (db *GoLevelDB) NewBatchWithSize(size int) corestore.Batch { + return newGoLevelDBBatchWithSize(db, size) +} + +// Iterator implements KVStore. +func (db *GoLevelDB) Iterator(start, end []byte) (corestore.Iterator, error) { + if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { + return nil, errors.New("key is empty") + } + itr := db.db.NewIterator(&util.Range{Start: start, Limit: end}, nil) + return newGoLevelDBIterator(itr, start, end, false), nil +} + +// ReverseIterator implements corestore.KVStore. +func (db *GoLevelDB) ReverseIterator(start, end []byte) (corestore.Iterator, error) { + if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { + return nil, errors.New("key is empty") + } + itr := db.db.NewIterator(&util.Range{Start: start, Limit: end}, nil) + return newGoLevelDBIterator(itr, start, end, true), nil +} + +type goLevelDBIterator struct { + source iterator.Iterator + start []byte + end []byte + isReverse bool + isInvalid bool +} + +var _ corestore.Iterator = (*goLevelDBIterator)(nil) + +func newGoLevelDBIterator(source iterator.Iterator, start, end []byte, isReverse bool) *goLevelDBIterator { + if isReverse { + if end == nil { + source.Last() + } else { + if source.Seek(end) { + eoakey := source.Key() // end or after key + if bytes.Compare(end, eoakey) <= 0 { + source.Prev() + } + } else { + source.Last() + } + } + } else { + if start == nil { + source.First() + } else { + source.Seek(start) + } + } + return &goLevelDBIterator{ + source: source, + start: start, + end: end, + isReverse: isReverse, + isInvalid: false, + } +} + +// Domain implements Iterator. +func (itr *goLevelDBIterator) Domain() ([]byte, []byte) { + return itr.start, itr.end +} + +// Valid implements Iterator. +func (itr *goLevelDBIterator) Valid() bool { + // Once invalid, forever invalid. + if itr.isInvalid { + return false + } + + // If source errors, invalid. + if err := itr.Error(); err != nil { + itr.isInvalid = true + return false + } + + // If source is invalid, invalid. + if !itr.source.Valid() { + itr.isInvalid = true + return false + } + + // If key is end or past it, invalid. + start := itr.start + end := itr.end + key := itr.source.Key() + + if itr.isReverse { + if start != nil && bytes.Compare(key, start) < 0 { + itr.isInvalid = true + return false + } + } else { + if end != nil && bytes.Compare(end, key) <= 0 { + itr.isInvalid = true + return false + } + } + + // Valid + return true +} + +// Key implements Iterator. +func (itr *goLevelDBIterator) Key() []byte { + // Key returns a copy of the current key. + // See https://github.com/syndtr/goleveldb/blob/52c212e6c196a1404ea59592d3f1c227c9f034b2/leveldb/iterator/iter.go#L88 + itr.assertIsValid() + return cp(itr.source.Key()) +} + +// Value implements Iterator. +func (itr *goLevelDBIterator) Value() []byte { + // Value returns a copy of the current value. + // See https://github.com/syndtr/goleveldb/blob/52c212e6c196a1404ea59592d3f1c227c9f034b2/leveldb/iterator/iter.go#L88 + itr.assertIsValid() + return cp(itr.source.Value()) +} + +// Next implements Iterator. +func (itr *goLevelDBIterator) Next() { + itr.assertIsValid() + if itr.isReverse { + itr.source.Prev() + } else { + itr.source.Next() + } +} + +// Error implements Iterator. +func (itr *goLevelDBIterator) Error() error { + return itr.source.Error() +} + +// Close implements Iterator. +func (itr *goLevelDBIterator) Close() error { + itr.source.Release() + return nil +} + +func (itr goLevelDBIterator) assertIsValid() { + if !itr.Valid() { + panic("iterator is invalid") + } +} + +type goLevelDBBatch struct { + db *GoLevelDB + batch *leveldb.Batch +} + +var _ corestore.Batch = (*goLevelDBBatch)(nil) + +func newGoLevelDBBatch(db *GoLevelDB) *goLevelDBBatch { + return &goLevelDBBatch{ + db: db, + batch: new(leveldb.Batch), + } +} + +func newGoLevelDBBatchWithSize(db *GoLevelDB, size int) *goLevelDBBatch { + return &goLevelDBBatch{ + db: db, + batch: leveldb.MakeBatch(size), + } +} + +// Set implements corestore.Batch. +func (b *goLevelDBBatch) Set(key, value []byte) error { + if len(key) == 0 { + return errors.New("key is empty") + } + if value == nil { + return errors.New("value is nil") + } + if b.batch == nil { + return errors.New("batch is nil") + } + b.batch.Put(key, value) + return nil +} + +// Delete implements corestore.Batch. +func (b *goLevelDBBatch) Delete(key []byte) error { + if len(key) == 0 { + return errors.New("key is empty") + } + if b.batch == nil { + return errors.New("batch is nil") + } + b.batch.Delete(key) + return nil +} + +// Write implements corestore.Batch. +func (b *goLevelDBBatch) Write() error { + return b.write(false) +} + +// WriteSync implements corestore.Batch. +func (b *goLevelDBBatch) WriteSync() error { + return b.write(true) +} + +func (b *goLevelDBBatch) write(sync bool) error { + if b.batch == nil { + return errors.New("batch is nil") + } + if err := b.db.db.Write(b.batch, &opt.WriteOptions{Sync: sync}); err != nil { + return err + } + // Make sure batch cannot be used afterwards. Callers should still call Close(), for errors. + return b.Close() +} + +// Close implements corestore.Batch. +func (b *goLevelDBBatch) Close() error { + if b.batch != nil { + b.batch.Reset() + b.batch = nil + } + return nil +} + +// GetByteSize implements corestore.Batch +func (b *goLevelDBBatch) GetByteSize() (int, error) { + if b.batch == nil { + return 0, errors.New("batch is nil") + } + return len(b.batch.Dump()), nil +} + +func cp(bz []byte) (ret []byte) { + ret = make([]byte, len(bz)) + copy(ret, bz) + return ret +} diff --git a/db/memdb.go b/db/memdb.go index 614c52f94..9389e4034 100644 --- a/db/memdb.go +++ b/db/memdb.go @@ -6,6 +6,7 @@ import ( "fmt" "sync" + corestore "cosmossdk.io/core/store" "github.com/google/btree" ) @@ -164,19 +165,19 @@ func (db *MemDB) Stats() map[string]string { } // NewBatch implements DB. -func (db *MemDB) NewBatch() Batch { +func (db *MemDB) NewBatch() corestore.Batch { return newMemDBBatch(db) } // NewBatchWithSize implements DB. // It does the same thing as NewBatch because we can't pre-allocate memDBBatch -func (db *MemDB) NewBatchWithSize(_ int) Batch { +func (db *MemDB) NewBatchWithSize(_ int) corestore.Batch { return newMemDBBatch(db) } // Iterator implements DB. // Takes out a read-lock on the database until the iterator is closed. -func (db *MemDB) Iterator(start, end []byte) (Iterator, error) { +func (db *MemDB) Iterator(start, end []byte) (corestore.Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { return nil, errKeyEmpty } @@ -185,7 +186,7 @@ func (db *MemDB) Iterator(start, end []byte) (Iterator, error) { // ReverseIterator implements DB. // Takes out a read-lock on the database until the iterator is closed. -func (db *MemDB) ReverseIterator(start, end []byte) (Iterator, error) { +func (db *MemDB) ReverseIterator(start, end []byte) (corestore.Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { return nil, errKeyEmpty } @@ -193,7 +194,7 @@ func (db *MemDB) ReverseIterator(start, end []byte) (Iterator, error) { } // IteratorNoMtx makes an iterator with no mutex. -func (db *MemDB) IteratorNoMtx(start, end []byte) (Iterator, error) { +func (db *MemDB) IteratorNoMtx(start, end []byte) (corestore.Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { return nil, errKeyEmpty } @@ -201,7 +202,7 @@ func (db *MemDB) IteratorNoMtx(start, end []byte) (Iterator, error) { } // ReverseIteratorNoMtx makes an iterator with no mutex. -func (db *MemDB) ReverseIteratorNoMtx(start, end []byte) (Iterator, error) { +func (db *MemDB) ReverseIteratorNoMtx(start, end []byte) (corestore.Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { return nil, errKeyEmpty } @@ -225,7 +226,7 @@ type memDBIterator struct { useMtx bool } -var _ Iterator = (*memDBIterator)(nil) +var _ corestore.Iterator = (*memDBIterator)(nil) // newMemDBIterator creates a new memDBIterator. func newMemDBIterator(db *MemDB, start []byte, end []byte, reverse bool) *memDBIterator { @@ -378,7 +379,7 @@ type memDBBatch struct { size int } -var _ Batch = (*memDBBatch)(nil) +var _ corestore.Batch = (*memDBBatch)(nil) // newMemDBBatch creates a new memDBBatch func newMemDBBatch(db *MemDB) *memDBBatch { diff --git a/db/prefixdb.go b/db/prefixdb.go new file mode 100644 index 000000000..6c56a1037 --- /dev/null +++ b/db/prefixdb.go @@ -0,0 +1,359 @@ +package db + +import ( + "bytes" + "errors" + "fmt" + "sync" + + corestore "cosmossdk.io/core/store" +) + +// PrefixDB wraps a namespace of another database as a logical database. +type PrefixDB struct { + mtx sync.Mutex + prefix []byte + db corestore.KVStoreWithBatch +} + +// NewPrefixDB lets you namespace multiple corestore.KVStores within a single corestore.KVStore. +func NewPrefixDB(db corestore.KVStoreWithBatch, prefix []byte) *PrefixDB { + return &PrefixDB{ + prefix: prefix, + db: db, + } +} + +// Get implements corestore.KVStore. +func (pdb *PrefixDB) Get(key []byte) ([]byte, error) { + if len(key) == 0 { + return nil, errors.New("key is empty") + } + + pkey := pdb.prefixed(key) + value, err := pdb.db.Get(pkey) + if err != nil { + return nil, err + } + + return value, nil +} + +// Has implements corestore.KVStore. +func (pdb *PrefixDB) Has(key []byte) (bool, error) { + if len(key) == 0 { + return false, errors.New("key is empty") + } + + ok, err := pdb.db.Has(pdb.prefixed(key)) + if err != nil { + return ok, err + } + + return ok, nil +} + +// Set implements corestore.KVStore. +func (pdb *PrefixDB) Set(key, value []byte) error { + if len(key) == 0 { + return errors.New("key is empty") + } + + return pdb.db.Set(pdb.prefixed(key), value) +} + +// Delete implements corestore.KVStore. +func (pdb *PrefixDB) Delete(key []byte) error { + if len(key) == 0 { + return errors.New("key is empty") + } + + return pdb.db.Delete(pdb.prefixed(key)) +} + +// Iterator implements corestore.KVStore. +func (pdb *PrefixDB) Iterator(start, end []byte) (corestore.Iterator, error) { + if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { + return nil, errors.New("key is empty") + } + + var pstart, pend []byte + pstart = append(cp(pdb.prefix), start...) + if end == nil { + pend = cpIncr(pdb.prefix) + } else { + pend = append(cp(pdb.prefix), end...) + } + itr, err := pdb.db.Iterator(pstart, pend) + if err != nil { + return nil, err + } + + return newPrefixIterator(pdb.prefix, start, end, itr), nil +} + +// ReverseIterator implements corestore.KVStore. +func (pdb *PrefixDB) ReverseIterator(start, end []byte) (corestore.Iterator, error) { + if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { + return nil, errors.New("key is empty") + } + + var pstart, pend []byte + pstart = append(cp(pdb.prefix), start...) + if end == nil { + pend = cpIncr(pdb.prefix) + } else { + pend = append(cp(pdb.prefix), end...) + } + ritr, err := pdb.db.ReverseIterator(pstart, pend) + if err != nil { + return nil, err + } + + return newPrefixIterator(pdb.prefix, start, end, ritr), nil +} + +// NewBatch implements corestore.BatchCreator. +func (pdb *PrefixDB) NewBatch() corestore.Batch { + return newPrefixBatch(pdb.prefix, pdb.db.NewBatch()) +} + +// NewBatchWithSize implements corestore.BatchCreator. +func (pdb *PrefixDB) NewBatchWithSize(size int) corestore.Batch { + return newPrefixBatch(pdb.prefix, pdb.db.NewBatchWithSize(size)) +} + +// Close implements corestore.KVStore. +func (pdb *PrefixDB) Close() error { + pdb.mtx.Lock() + defer pdb.mtx.Unlock() + + return pdb.db.Close() +} + +// Print implements corestore.KVStore. +func (pdb *PrefixDB) Print() error { + fmt.Printf("prefix: %X\n", pdb.prefix) + + itr, err := pdb.Iterator(nil, nil) + if err != nil { + return err + } + defer itr.Close() + for ; itr.Valid(); itr.Next() { + key := itr.Key() + value := itr.Value() + fmt.Printf("[%X]:\t[%X]\n", key, value) + } + return nil +} + +func (pdb *PrefixDB) prefixed(key []byte) []byte { + return append(cp(pdb.prefix), key...) +} + +// IteratePrefix is a convenience function for iterating over a key domain +// restricted by prefix. +func IteratePrefix(db DB, prefix []byte) (corestore.Iterator, error) { + var start, end []byte + if len(prefix) == 0 { + start = nil + end = nil + } else { + start = cp(prefix) + end = cpIncr(prefix) + } + itr, err := db.Iterator(start, end) + if err != nil { + return nil, err + } + return itr, nil +} + +// Strips prefix while iterating from Iterator. +type prefixDBIterator struct { + prefix []byte + start []byte + end []byte + source corestore.Iterator + valid bool + err error +} + +var _ corestore.Iterator = (*prefixDBIterator)(nil) + +func newPrefixIterator(prefix, start, end []byte, source corestore.Iterator) *prefixDBIterator { + pitrInvalid := &prefixDBIterator{ + prefix: prefix, + start: start, + end: end, + source: source, + valid: false, + } + + // Empty keys are not allowed, so if a key exists in the database that exactly matches the + // prefix we need to skip it. + if source.Valid() && bytes.Equal(source.Key(), prefix) { + source.Next() + } + + if !source.Valid() || !bytes.HasPrefix(source.Key(), prefix) { + return pitrInvalid + } + + return &prefixDBIterator{ + prefix: prefix, + start: start, + end: end, + source: source, + valid: true, + } +} + +// Domain implements Iterator. +func (itr *prefixDBIterator) Domain() (start, end []byte) { + return itr.start, itr.end +} + +// Valid implements Iterator. +func (itr *prefixDBIterator) Valid() bool { + if !itr.valid || itr.err != nil || !itr.source.Valid() { + return false + } + + key := itr.source.Key() + if len(key) < len(itr.prefix) || !bytes.Equal(key[:len(itr.prefix)], itr.prefix) { + itr.err = fmt.Errorf("received invalid key from backend: %x (expected prefix %x)", + key, itr.prefix) + return false + } + + return true +} + +// Next implements Iterator. +func (itr *prefixDBIterator) Next() { + itr.assertIsValid() + itr.source.Next() + + if !itr.source.Valid() || !bytes.HasPrefix(itr.source.Key(), itr.prefix) { + itr.valid = false + } else if bytes.Equal(itr.source.Key(), itr.prefix) { + // Empty keys are not allowed, so if a key exists in the database that exactly matches the + // prefix we need to skip it. + itr.Next() + } +} + +// Next implements Iterator. +func (itr *prefixDBIterator) Key() []byte { + itr.assertIsValid() + key := itr.source.Key() + return key[len(itr.prefix):] // we have checked the key in Valid() +} + +// Value implements Iterator. +func (itr *prefixDBIterator) Value() []byte { + itr.assertIsValid() + return itr.source.Value() +} + +// Error implements Iterator. +func (itr *prefixDBIterator) Error() error { + if err := itr.source.Error(); err != nil { + return err + } + return itr.err +} + +// Close implements Iterator. +func (itr *prefixDBIterator) Close() error { + return itr.source.Close() +} + +func (itr *prefixDBIterator) assertIsValid() { + if !itr.Valid() { + panic("iterator is invalid") + } +} + +type prefixDBBatch struct { + prefix []byte + source corestore.Batch +} + +var _ corestore.Batch = (*prefixDBBatch)(nil) + +func newPrefixBatch(prefix []byte, source corestore.Batch) prefixDBBatch { + return prefixDBBatch{ + prefix: prefix, + source: source, + } +} + +// Set implements corestore.Batch. +func (pb prefixDBBatch) Set(key, value []byte) error { + if len(key) == 0 { + return errors.New("key is empty") + } + if value == nil { + return errors.New("value is nil") + } + pkey := append(cp(pb.prefix), key...) + return pb.source.Set(pkey, value) +} + +// Delete implements corestore.Batch. +func (pb prefixDBBatch) Delete(key []byte) error { + if len(key) == 0 { + return errors.New("key is empty") + } + pkey := append(cp(pb.prefix), key...) + return pb.source.Delete(pkey) +} + +// Write implements corestore.Batch. +func (pb prefixDBBatch) Write() error { + return pb.source.Write() +} + +// WriteSync implements corestore.Batch. +func (pb prefixDBBatch) WriteSync() error { + return pb.source.WriteSync() +} + +// Close implements corestore.Batch. +func (pb prefixDBBatch) Close() error { + return pb.source.Close() +} + +// GetByteSize implements corestore.Batch +func (pb prefixDBBatch) GetByteSize() (int, error) { + if pb.source == nil { + return 0, errors.New("source batch is nil") + } + return pb.source.GetByteSize() +} + +// Returns a slice of the same length (big endian) +// except incremented by one. +// Returns nil on overflow (e.g. if bz bytes are all 0xFF) +// CONTRACT: len(bz) > 0 +func cpIncr(bz []byte) (ret []byte) { + if len(bz) == 0 { + panic("cpIncr expects non-zero bz length") + } + ret = cp(bz) + for i := len(bz) - 1; i >= 0; i-- { + if ret[i] < byte(0xFF) { + ret[i]++ + return + } + ret[i] = byte(0x00) + if i == 0 { + // Overflow + return nil + } + } + return nil +} diff --git a/db/types.go b/db/types.go index 840494f41..4a04e4000 100644 --- a/db/types.go +++ b/db/types.go @@ -1,6 +1,10 @@ package db -import "errors" +import ( + "errors" + + corestore "cosmossdk.io/core/store" +) var ( // errBatchClosed is returned when a closed or written batch is used. @@ -33,7 +37,7 @@ type DB interface { // valid. // CONTRACT: No writes may happen within a domain while an iterator exists over it. // CONTRACT: start, end readonly []byte - Iterator(start, end []byte) (Iterator, error) + Iterator(start, end []byte) (corestore.Iterator, error) // ReverseIterator returns an iterator over a domain of keys, in descending order. The caller // must call Close when done. End is exclusive, and start must be less than end. A nil end @@ -41,97 +45,15 @@ type DB interface { // Empty keys are not valid. // CONTRACT: No writes may happen within a domain while an iterator exists over it. // CONTRACT: start, end readonly []byte - ReverseIterator(start, end []byte) (Iterator, error) + ReverseIterator(start, end []byte) (corestore.Iterator, error) // Close closes the database connection. Close() error // NewBatch creates a batch for atomic updates. The caller must call Batch.Close. - NewBatch() Batch + NewBatch() corestore.Batch // NewBatchWithSize create a new batch for atomic updates, but with pre-allocated size. // This will does the same thing as NewBatch if the batch implementation doesn't support pre-allocation. - NewBatchWithSize(int) Batch -} - -// Iterator represents an iterator over a domain of keys. Callers must call Close when done. -// No writes can happen to a domain while there exists an iterator over it, some backends may take -// out database locks to ensure this will not happen. -// -// Callers must make sure the iterator is valid before calling any methods on it, otherwise -// these methods will panic. This is in part caused by most backend databases using this convention. -// -// As with DB, keys and values should be considered read-only, and must be copied before they are -// modified. -// -// Typical usage: -// -// var itr Iterator = ... -// defer itr.Close() -// -// for ; itr.Valid(); itr.Next() { -// k, v := itr.Key(); itr.Value() -// ... -// } -// -// if err := itr.Error(); err != nil { -// ... -// } -type Iterator interface { - // Domain returns the start (inclusive) and end (exclusive) limits of the iterator. - // CONTRACT: start, end readonly []byte - Domain() (start []byte, end []byte) - - // Valid returns whether the current iterator is valid. Once invalid, the Iterator remains - // invalid forever. - Valid() bool - - // Next moves the iterator to the next key in the database, as defined by order of iteration. - // If Valid returns false, this method will panic. - Next() - - // Key returns the key at the current position. Panics if the iterator is invalid. - // CONTRACT: key readonly []byte - Key() (key []byte) - - // Value returns the value at the current position. Panics if the iterator is invalid. - // CONTRACT: value readonly []byte - Value() (value []byte) - - // Error returns the last error encountered by the iterator, if any. - Error() error - - // Close closes the iterator, relasing any allocated resources. - Close() error -} - -// Batch represents a group of writes. They may or may not be written atomically depending on the -// backend. Callers must call Close on the batch when done. -// -// As with DB, given keys and values should be considered read-only, and must not be modified after -// passing them to the batch. -type Batch interface { - // Set sets a key/value pair. - // CONTRACT: key, value readonly []byte - Set(key, value []byte) error - - // Delete deletes a key/value pair. - // CONTRACT: key readonly []byte - Delete(key []byte) error - - // Write writes the batch, possibly without flushing to disk. Only Close() can be called after, - // other methods will error. - Write() error - - // WriteSync writes the batch and flushes it to disk. Only Close() can be called after, other - // methods will error. - WriteSync() error - - // Close closes the batch. It is idempotent, but calls to other methods afterwards will error. - Close() error - - // GetByteSize that returns the current size of the batch in bytes. Depending on the implementation, - // this may return the size of the underlying LSM batch, including the size of additional metadata - // on top of the expected key and value total byte count. - GetByteSize() (int, error) + NewBatchWithSize(int) corestore.Batch } diff --git a/db/wrapper.go b/db/wrapper.go deleted file mode 100644 index fce80f692..000000000 --- a/db/wrapper.go +++ /dev/null @@ -1,44 +0,0 @@ -package db - -import dbm "github.com/cosmos/cosmos-db" - -// Wrapper wraps a dbm.DB to implement DB. -type Wrapper struct { - dbm.DB -} - -var _ DB = (*Wrapper)(nil) - -// NewWrapper returns a new Wrapper. -func NewWrapper(db dbm.DB) *Wrapper { - return &Wrapper{DB: db} -} - -// Iterator implements DB. -func (db *Wrapper) Iterator(start, end []byte) (Iterator, error) { - return db.DB.Iterator(start, end) -} - -// ReverseIterator implements DB. -func (db *Wrapper) ReverseIterator(start, end []byte) (Iterator, error) { - return db.DB.ReverseIterator(start, end) -} - -// NewBatch implements DB. -func (db *Wrapper) NewBatch() Batch { - return db.DB.NewBatch() -} - -// NewBatchWithSize implements DB. -func (db *Wrapper) NewBatchWithSize(size int) Batch { - return db.DB.NewBatchWithSize(size) -} - -// NewDB returns a new Wrapper. -func NewDB(name, backendType, dir string) (*Wrapper, error) { - db, err := dbm.NewDB(name, dbm.BackendType(backendType), dir) - if err != nil { - return nil, err - } - return NewWrapper(db), nil -} diff --git a/diff_test.go b/diff_test.go index 787cfe16a..cf54716c7 100644 --- a/diff_test.go +++ b/diff_test.go @@ -31,7 +31,7 @@ func TestDiffRoundTrip(t *testing.T) { // extract change sets from db var extractChangeSets []*ChangeSet tree2 := NewImmutableTree(db, 0, true, log.NewNopLogger()) - err := tree2.TraverseStateChanges(0, math.MaxInt64, func(version int64, changeSet *ChangeSet) error { + err := tree2.TraverseStateChanges(0, math.MaxInt64, func(_ int64, changeSet *ChangeSet) error { extractChangeSets = append(extractChangeSets, changeSet) return nil }) diff --git a/docs/proof/proof.md b/docs/proof/proof.md index bf1925611..96ed566b6 100644 --- a/docs/proof/proof.md +++ b/docs/proof/proof.md @@ -6,8 +6,8 @@ be used to verify that a returned value is, in fact, the value contained within This verification is done by comparing the proof's root hash with the tree's root hash. Somewhat simplified, an IAVL tree is a variant of a -[binary search tree](https://en.wikipedia.org/wiki/Binary_search_tree) where inner nodes contain -keys used for binary search, and leaf nodes contain the actual key/value pairs ordered by key. +[binary search tree](https://en.wikipedia.org/wiki/Binary_search_tree) where inner nodes contain +keys used for binary search, and leaf nodes contain the actual key/value pairs ordered by key. Consider the following example, containing five key/value pairs (such as key `a` with value `1`): ``` @@ -80,7 +80,7 @@ neighbors. The range proof is therefore a complete proof for all existing and al pairs ordered between two arbitrary endpoints. Note that the IAVL terminology for range proofs may differ from that used in other systems, where -it refers to proofs that a value lies within some interval without revealing the exact value. IAVL +it refers to proofs that a value lies within some interval without revealing the exact value. IAVL range proofs are used to prove which key/value pairs exist (or not) in some key range, and may be known as range queries elsewhere. @@ -107,28 +107,28 @@ This tree can be generated as follows: package main import ( - "fmt" - "log" + "fmt" + "log" - "github.com/cosmos/iavl" - db "github.com/cosmos/cosmos-db" + "github.com/cosmos/iavl" + db "github.com/cosmos/cosmos-db" ) func main() { - tree, err := iavl.NewMutableTree(db.NewMemDB(), 0) - if err != nil { - log.Fatal(err) - } - - tree.Set([]byte("e"), []byte{5}) - tree.Set([]byte("d"), []byte{4}) - tree.Set([]byte("c"), []byte{3}) - tree.Set([]byte("b"), []byte{2}) - tree.Set([]byte("a"), []byte{1}) - - rootHash, version, err := tree.SaveVersion() - if err != nil { - log.Fatal(err) + tree, err := iavl.NewMutableTree(db.NewMemDB(), 0) + if err != nil { + log.Fatal(err) + } + + tree.Set([]byte("e"), []byte{5}) + tree.Set([]byte("d"), []byte{4}) + tree.Set([]byte("c"), []byte{3}) + tree.Set([]byte("b"), []byte{2}) + tree.Set([]byte("a"), []byte{1}) + + rootHash, version, err := tree.SaveVersion() + if err != nil { + log.Fatal(err) } fmt.Printf("Saved version %v with root hash %x\n", version, rootHash) @@ -140,7 +140,7 @@ func main() { ### Tree Root Hash Proofs are verified against the root hash of an IAVL tree. This root hash is retrieved via -`MutableTree.Hash()` or `ImmutableTree.Hash()`, returning a `[]byte` hash. It is also returned by +`MutableTree.Hash()` or `ImmutableTree.Hash()`, returning a `[]byte` hash. It is also returned by `MutableTree.SaveVersion()`, as shown above. ```go @@ -155,13 +155,13 @@ The following methods are used to generate proofs, all of which are of type `Ran * `ImmutableTree.GetWithProof(key []byte)`: fetches the key's value (if it exists) along with a proof of existence or proof of absence. -* `ImmutableTree.GetRangeWithProof(start, end []byte, limit int)`: fetches the keys, values, and +* `ImmutableTree.GetRangeWithProof(start, end []byte, limit int)`: fetches the keys, values, and proofs for the given key range, optionally with a limit (end key is excluded). * `MutableTree.GetVersionedWithProof(key []byte, version int64)`: like `GetWithProof()`, but for a specific version of the tree. -* `MutableTree.GetVersionedRangeWithProof(key []byte, version int64)`: like `GetRangeWithProof()`, +* `MutableTree.GetVersionedRangeWithProof(key []byte, version int64)`: like `GetRangeWithProof()`, but for a specific version of the tree. ### Verifying Proofs @@ -192,7 +192,7 @@ if err != nil { } ``` -The proof must always be verified against the root hash with `Verify()` before attempting other +The proof must always be verified against the root hash with `Verify()` before attempting other operations. The proof can also be verified manually with `RangeProof.ComputeRootHash()`: ```go @@ -221,7 +221,7 @@ fmt.Printf("prove b=2: %v\n", err) // outputs "leaf key not found in proof: invalid proof" ``` -If we generate a proof for a range of keys, we can use this both to prove the value of any of the +If we generate a proof for a range of keys, we can use this both to prove the value of any of the keys in the range as well as the absence of any keys that would have been within it: ```go @@ -281,23 +281,23 @@ A `RangeProof` contains the following data, as well as JSON tags for serializati ```go type RangeProof struct { - LeftPath PathToLeaf `json:"left_path"` - InnerNodes []PathToLeaf `json:"inner_nodes"` - Leaves []ProofLeafNode `json:"leaves"` + LeftPath PathToLeaf `json:"left_path"` + InnerNodes []PathToLeaf `json:"inner_nodes"` + Leaves []ProofLeafNode `json:"leaves"` } ``` -* `LeftPath` contains the path to the leftmost node in the proof. For a proof of the range `a` to - `e` (excluding `e=5`), it contains information about the inner nodes `d`, `c`, and `b` in that +* `LeftPath` contains the path to the leftmost node in the proof. For a proof of the range `a` to + `e` (excluding `e=5`), it contains information about the inner nodes `d`, `c`, and `b` in that order. -* `InnerNodes` contains paths with any additional inner nodes not already in `LeftPath`, with `nil` - paths for nodes already traversed. For a proof of the range `a` to `e` (excluding `e=5`), this +* `InnerNodes` contains paths with any additional inner nodes not already in `LeftPath`, with `nil` + paths for nodes already traversed. For a proof of the range `a` to `e` (excluding `e=5`), this contains the paths `nil`, `nil`, `[e]` where the `nil` paths refer to the paths to `b=2` and `c=3` already traversed in `LeftPath`, and `[e]` contains data about the `e` inner node needed to prove `d=4`. -* `Leaves` contains data about the leaf nodes in the range. For the range `a` to `e` (excluding +* `Leaves` contains data about the leaf nodes in the range. For the range `a` to `e` (excluding `e=5`) this contains info about `a=1`, `b=2`, `c=3`, and `d=4` in left-to-right order. Note that `Leaves` may contain additional leaf nodes outside the requested range, for example to @@ -314,11 +314,11 @@ Where `ProofInnerNode` contains the following data (a subset of the [node data]( ```go type ProofInnerNode struct { - Height int8 `json:"height"` - Size int64 `json:"size"` - Version int64 `json:"version"` - Left []byte `json:"left"` - Right []byte `json:"right"` + Height int8 `json:"height"` + Size int64 `json:"size"` + Version int64 `json:"version"` + Left []byte `json:"left"` + Right []byte `json:"right"` } ``` @@ -330,9 +330,9 @@ Similarly, `ProofLeafNode` contains a subset of leaf node data: ```go type ProofLeafNode struct { - Key cmn.HexBytes `json:"key"` - ValueHash cmn.HexBytes `json:"value"` - Version int64 `json:"version"` + Key cmn.HexBytes `json:"key"` + ValueHash cmn.HexBytes `json:"value"` + Version int64 `json:"version"` } ``` @@ -341,7 +341,7 @@ because values can be arbitrarily large while the hash has a constant size. The the tree are computed in the same way, by hashing the value before including it in the node hash. -The information in these proofs is sufficient to reasonably prove that a given value exists (or +The information in these proofs is sufficient to reasonably prove that a given value exists (or does not exist) in a given version of an IAVL dataset without fetching the entire dataset, requiring only `logâ‚‚(n)` hashes for a dataset of `n` items. For more information, please see the -[API reference](https://pkg.go.dev/github.com/cosmos/iavl). \ No newline at end of file +[API reference](https://pkg.go.dev/github.com/cosmos/iavl). diff --git a/fast_iterator.go b/fast_iterator.go index 1391cda7f..d33d857b6 100644 --- a/fast_iterator.go +++ b/fast_iterator.go @@ -3,7 +3,7 @@ package iavl import ( "errors" - dbm "github.com/cosmos/cosmos-db" + "cosmossdk.io/core/store" "github.com/cosmos/iavl/fastnode" ) @@ -26,10 +26,10 @@ type FastIterator struct { nextFastNode *fastnode.Node - fastIterator dbm.Iterator + fastIterator store.Iterator } -var _ dbm.Iterator = (*FastIterator)(nil) +var _ store.Iterator = (*FastIterator)(nil) func NewFastIterator(start, end []byte, ascending bool, ndb *nodeDB) *FastIterator { iter := &FastIterator{ diff --git a/go.mod b/go.mod index 937059ca9..2c7a5c0c7 100644 --- a/go.mod +++ b/go.mod @@ -4,50 +4,26 @@ go 1.21 require ( cosmossdk.io/core v0.12.1-0.20240514205955-97c9bbb0341b - github.com/cosmos/cosmos-db v1.0.2 github.com/cosmos/ics23/go v0.10.0 github.com/emicklei/dot v1.6.2 github.com/gogo/protobuf v1.3.2 github.com/golang/mock v1.6.0 github.com/google/btree v1.1.2 github.com/stretchr/testify v1.9.0 - golang.org/x/crypto v0.24.0 + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) require ( - github.com/DataDog/zstd v1.4.5 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.11.1 // indirect - github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v1.1.0 // indirect - github.com/cockroachdb/redact v1.1.5 // indirect - github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/cosmos/gogoproto v1.4.12 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/getsentry/sentry-go v0.18.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/klauspost/compress v1.15.15 // indirect - github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/linxGnu/grocksdb v1.8.12 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect github.com/onsi/gomega v1.26.0 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.12.0 // indirect - github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/spf13/cast v1.6.0 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect + golang.org/x/crypto v0.23.0 // indirect golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect - golang.org/x/sys v0.21.0 // indirect - golang.org/x/text v0.16.0 // indirect google.golang.org/protobuf v1.34.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 6d6e85e89..8a4fd72da 100644 --- a/go.sum +++ b/go.sum @@ -1,212 +1,45 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cosmossdk.io/core v0.12.1-0.20240514205955-97c9bbb0341b h1:QudoITEtzaPNGltOQSyMbVopBQ2Z28h717nwLhlj6JU= cosmossdk.io/core v0.12.1-0.20240514205955-97c9bbb0341b/go.mod h1:jJ3gjbqJyHPrTjn2Ad6wjb7Oz90G1ZjDg0JyBii41QE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= -github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= -github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= -github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= -github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= -github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= -github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= -github.com/cosmos/cosmos-db v1.0.2 h1:hwMjozuY1OlJs/uh6vddqnk9j7VamLv+0DBlbEXbAKs= -github.com/cosmos/cosmos-db v1.0.2/go.mod h1:Z8IXcFJ9PqKK6BIsVOB3QXtkKoqUOp1vRvPT39kOXEA= github.com/cosmos/gogoproto v1.4.12 h1:vB6Lbe/rtnYGjQuFxkPiPYiCybqFT8QvLipDZP8JpFE= github.com/cosmos/gogoproto v1.4.12/go.mod h1:LnZob1bXRdUoqMMtwYlcR3wjiElmlC+FkjaZRv1/eLY= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A= github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= -github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/linxGnu/grocksdb v1.8.12 h1:1/pCztQUOa3BX/1gR3jSZDoaKFpeHFvQ1XrqZpSvZVo= -github.com/linxGnu/grocksdb v1.8.12/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -217,371 +50,88 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.0 h1:C+UIj/QWtmqY13Arb8kwMt5j34/0Z2iKamrJ+ryC0Gg= -github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a h1:CmF68hwI0XsOQ5UwlBopMi2Ow4Pbg32akc4KIVCOm+Y= -github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= -github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/immutable_tree.go b/immutable_tree.go index 03bdb144d..240cc913f 100644 --- a/immutable_tree.go +++ b/immutable_tree.go @@ -5,6 +5,7 @@ import ( "strings" "cosmossdk.io/core/log" + corestore "cosmossdk.io/core/store" dbm "github.com/cosmos/iavl/db" ) @@ -246,7 +247,7 @@ func (t *ImmutableTree) Iterate(fn func(key []byte, value []byte) bool) (bool, e } // Iterator returns an iterator over the immutable tree. -func (t *ImmutableTree) Iterator(start, end []byte, ascending bool) (dbm.Iterator, error) { +func (t *ImmutableTree) Iterator(start, end []byte, ascending bool) (corestore.Iterator, error) { if !t.skipFastStorageUpgrade { isFastCacheEnabled, err := t.IsFastCacheEnabled() if err != nil { diff --git a/import.go b/import.go index 282e260ca..56566feae 100644 --- a/import.go +++ b/import.go @@ -5,7 +5,7 @@ import ( "errors" "fmt" - db "github.com/cosmos/cosmos-db" + "cosmossdk.io/core/store" ) // maxBatchSize is the maximum size of the import batch before flushing it to the database @@ -24,7 +24,7 @@ var ErrNoImport = errors.New("no import in progress") type Importer struct { tree *MutableTree version int64 - batch db.Batch + batch store.Batch batchSize uint32 stack []*Node nonces []uint32 @@ -92,7 +92,7 @@ func (i *Importer) writeNode(node *Node) error { } result := make(chan error) i.inflightCommit = result - go func(batch db.Batch) { + go func(batch store.Batch) { defer batch.Close() result <- batch.Write() }(i.batch) diff --git a/internal/bytes/bytes.go b/internal/bytes/bytes.go index 23c042196..7f4216d0c 100644 --- a/internal/bytes/bytes.go +++ b/internal/bytes/bytes.go @@ -57,9 +57,13 @@ func (bz HexBytes) String() string { func (bz HexBytes) Format(s fmt.State, verb rune) { switch verb { case 'p': - s.Write([]byte(fmt.Sprintf("%p", bz))) + if _, err := s.Write([]byte(fmt.Sprintf("%p", bz))); err != nil { + panic(err) + } default: - s.Write([]byte(fmt.Sprintf("%X", []byte(bz)))) + if _, err := s.Write([]byte(fmt.Sprintf("%X", []byte(bz)))); err != nil { + panic(err) + } } } diff --git a/iterator.go b/iterator.go index 131a2bdda..f52ebd0d4 100644 --- a/iterator.go +++ b/iterator.go @@ -7,7 +7,7 @@ import ( "bytes" "errors" - dbm "github.com/cosmos/cosmos-db" + "cosmossdk.io/core/store" ) type traversal struct { @@ -181,10 +181,10 @@ type Iterator struct { t *traversal } -var _ dbm.Iterator = (*Iterator)(nil) +var _ store.Iterator = (*Iterator)(nil) // Returns a new iterator over the immutable tree. If the tree is nil, the iterator will be invalid. -func NewIterator(start, end []byte, ascending bool, tree *ImmutableTree) dbm.Iterator { +func NewIterator(start, end []byte, ascending bool, tree *ImmutableTree) store.Iterator { iter := &Iterator{ start: start, end: end, diff --git a/iterator_test.go b/iterator_test.go index d6f925b29..f9a1855ea 100644 --- a/iterator_test.go +++ b/iterator_test.go @@ -7,6 +7,7 @@ import ( "testing" log "cosmossdk.io/core/log" + corestore "cosmossdk.io/core/store" "github.com/stretchr/testify/require" dbm "github.com/cosmos/iavl/db" @@ -16,7 +17,7 @@ func TestIterator_NewIterator_NilTree_Failure(t *testing.T) { start, end := []byte{'a'}, []byte{'c'} ascending := true - performTest := func(t *testing.T, itr dbm.Iterator) { + performTest := func(t *testing.T, itr corestore.Iterator) { require.NotNil(t, itr) require.False(t, itr.Valid()) actualsStart, actualEnd := itr.Domain() @@ -48,7 +49,7 @@ func TestUnsavedFastIterator_NewIterator_NilAdditions_Failure(t *testing.T) { start, end := []byte{'a'}, []byte{'c'} ascending := true - performTest := func(t *testing.T, itr dbm.Iterator) { + performTest := func(t *testing.T, itr corestore.Iterator) { require.NotNil(t, itr) require.False(t, itr.Valid()) actualsStart, actualEnd := itr.Domain() @@ -94,7 +95,7 @@ func TestIterator_Empty_Invalid(t *testing.T) { ascending: true, } - performTest := func(t *testing.T, itr dbm.Iterator, mirror [][]string) { + performTest := func(t *testing.T, itr corestore.Iterator, mirror [][]string) { require.Equal(t, 0, len(mirror)) require.False(t, itr.Valid()) } @@ -217,7 +218,7 @@ func TestIterator_WithDelete_Full_Ascending_Success(t *testing.T) { } func iteratorSuccessTest(t *testing.T, config *iteratorTestConfig) { - performTest := func(t *testing.T, itr dbm.Iterator, mirror [][]string) { + performTest := func(t *testing.T, itr corestore.Iterator, mirror [][]string) { actualStart, actualEnd := itr.Domain() require.Equal(t, config.startIterate, actualStart) require.Equal(t, config.endIterate, actualEnd) @@ -246,7 +247,7 @@ func iteratorSuccessTest(t *testing.T, config *iteratorTestConfig) { }) } -func setupIteratorAndMirror(t *testing.T, config *iteratorTestConfig) (dbm.Iterator, [][]string) { +func setupIteratorAndMirror(t *testing.T, config *iteratorTestConfig) (corestore.Iterator, [][]string) { tree := NewMutableTree(dbm.NewMemDB(), 0, false, log.NewNopLogger()) mirror := setupMirrorForIterator(t, config, tree) @@ -262,7 +263,7 @@ func setupIteratorAndMirror(t *testing.T, config *iteratorTestConfig) (dbm.Itera return itr, mirror } -func setupFastIteratorAndMirror(t *testing.T, config *iteratorTestConfig) (dbm.Iterator, [][]string) { +func setupFastIteratorAndMirror(t *testing.T, config *iteratorTestConfig) (corestore.Iterator, [][]string) { tree := NewMutableTree(dbm.NewMemDB(), 0, false, log.NewNopLogger()) mirror := setupMirrorForIterator(t, config, tree) @@ -273,7 +274,7 @@ func setupFastIteratorAndMirror(t *testing.T, config *iteratorTestConfig) (dbm.I return itr, mirror } -func setupUnsavedFastIterator(t *testing.T, config *iteratorTestConfig) (dbm.Iterator, [][]string) { +func setupUnsavedFastIterator(t *testing.T, config *iteratorTestConfig) (corestore.Iterator, [][]string) { tree := NewMutableTree(dbm.NewMemDB(), 0, false, log.NewNopLogger()) // For unsaved fast iterator, we would like to test the state where diff --git a/migrate_test.go b/migrate_test.go index b8c4abaa0..51f511f94 100644 --- a/migrate_test.go +++ b/migrate_test.go @@ -53,7 +53,7 @@ func TestLazySet(t *testing.T) { relateDir, err := createLegacyTree(t, dbDir, legacyVersion) require.NoError(t, err) - db, err := dbm.NewDB("test", dbType, relateDir) + db, err := dbm.NewGoLevelDB("test", relateDir) require.NoError(t, err) defer func() { @@ -96,7 +96,7 @@ func TestLegacyReferenceNode(t *testing.T) { relateDir, err := createLegacyTree(t, dbDir, legacyVersion) require.NoError(t, err) - db, err := dbm.NewDB("test", dbType, relateDir) + db, err := dbm.NewGoLevelDB("test", relateDir) require.NoError(t, err) defer func() { @@ -136,7 +136,7 @@ func TestDeleteVersions(t *testing.T) { relateDir, err := createLegacyTree(t, dbDir, legacyVersion) require.NoError(t, err) - db, err := dbm.NewDB("test", dbType, relateDir) + db, err := dbm.NewGoLevelDB("test", relateDir) require.NoError(t, err) defer func() { @@ -215,7 +215,7 @@ func TestPruning(t *testing.T) { relateDir, err := createLegacyTree(t, dbDir, legacyVersion) require.NoError(t, err) - db, err := dbm.NewDB("test", dbType, relateDir) + db, err := dbm.NewGoLevelDB("test", relateDir) require.NoError(t, err) defer func() { @@ -303,7 +303,7 @@ func TestRandomSet(t *testing.T) { relateDir, err := createLegacyTree(t, dbDir, legacyVersion) require.NoError(t, err) - db, err := dbm.NewDB("test", dbType, relateDir) + db, err := dbm.NewGoLevelDB("test", relateDir) require.NoError(t, err) defer func() { diff --git a/mock/db_mock.go b/mock/db_mock.go index 4c4d3d515..40d4c6c66 100644 --- a/mock/db_mock.go +++ b/mock/db_mock.go @@ -7,7 +7,7 @@ package mock import ( reflect "reflect" - db "github.com/cosmos/iavl/db" + corestore "cosmossdk.io/core/store" gomock "github.com/golang/mock/gomock" ) @@ -79,10 +79,10 @@ func (mr *MockDBMockRecorder) Has(key interface{}) *gomock.Call { } // Iterator mocks base method. -func (m *MockDB) Iterator(start, end []byte) (db.Iterator, error) { +func (m *MockDB) Iterator(start, end []byte) (corestore.Iterator, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Iterator", start, end) - ret0, _ := ret[0].(db.Iterator) + ret0, _ := ret[0].(corestore.Iterator) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -94,10 +94,10 @@ func (mr *MockDBMockRecorder) Iterator(start, end interface{}) *gomock.Call { } // NewBatch mocks base method. -func (m *MockDB) NewBatch() db.Batch { +func (m *MockDB) NewBatch() corestore.Batch { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NewBatch") - ret0, _ := ret[0].(db.Batch) + ret0, _ := ret[0].(corestore.Batch) return ret0 } @@ -108,10 +108,10 @@ func (mr *MockDBMockRecorder) NewBatch() *gomock.Call { } // NewBatchWithSize mocks base method. -func (m *MockDB) NewBatchWithSize(arg0 int) db.Batch { +func (m *MockDB) NewBatchWithSize(arg0 int) corestore.Batch { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NewBatchWithSize", arg0) - ret0, _ := ret[0].(db.Batch) + ret0, _ := ret[0].(corestore.Batch) return ret0 } @@ -122,10 +122,10 @@ func (mr *MockDBMockRecorder) NewBatchWithSize(arg0 interface{}) *gomock.Call { } // ReverseIterator mocks base method. -func (m *MockDB) ReverseIterator(start, end []byte) (db.Iterator, error) { +func (m *MockDB) ReverseIterator(start, end []byte) (corestore.Iterator, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ReverseIterator", start, end) - ret0, _ := ret[0].(db.Iterator) + ret0, _ := ret[0].(corestore.Iterator) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/mockgen.sh b/mockgen.sh index 5300f9ce5..e53acfb70 100755 --- a/mockgen.sh +++ b/mockgen.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash mockgen_cmd="mockgen" -$mockgen_cmd -package mock -destination mock/db_mock.go github.com/cosmos/cosmos-db DB,Iterator,Batch \ No newline at end of file +$mockgen_cmd -package mock -destination mock/db_mock.go cosmossdk.io/core DB,Iterator,Batch diff --git a/mutable_tree.go b/mutable_tree.go index 614979690..e71253852 100644 --- a/mutable_tree.go +++ b/mutable_tree.go @@ -8,6 +8,7 @@ import ( "sync" log "cosmossdk.io/core/log" + corestore "cosmossdk.io/core/store" dbm "github.com/cosmos/iavl/db" "github.com/cosmos/iavl/fastnode" @@ -228,7 +229,7 @@ func (tree *MutableTree) Iterate(fn func(key []byte, value []byte) bool) (stoppe // Iterator returns an iterator over the mutable tree. // CONTRACT: no updates are made to the tree while an iterator is active. -func (tree *MutableTree) Iterator(start, end []byte, ascending bool) (dbm.Iterator, error) { +func (tree *MutableTree) Iterator(start, end []byte, ascending bool) (corestore.Iterator, error) { if !tree.skipFastStorageUpgrade { isFastCacheEnabled, err := tree.IsFastCacheEnabled() if err != nil { diff --git a/nodedb.go b/nodedb.go index 86304ec7a..f3c1f06c3 100644 --- a/nodedb.go +++ b/nodedb.go @@ -13,6 +13,7 @@ import ( "time" "cosmossdk.io/core/log" + corestore "cosmossdk.io/core/store" "github.com/cosmos/iavl/cache" dbm "github.com/cosmos/iavl/db" @@ -80,7 +81,7 @@ type nodeDB struct { mtx sync.Mutex // Read/write lock. db dbm.DB // Persistent node storage. - batch dbm.Batch // Batched writing buffer. + batch corestore.Batch // Batched writing buffer. opts Options // Options to customize for pruning/writing versionReaders map[int64]uint32 // Number of active version readers storageVersion string // Storage version @@ -873,7 +874,7 @@ func (ndb *nodeDB) traversePrefix(prefix []byte, fn func(k, v []byte) error) err } // Get the iterator for a given prefix. -func (ndb *nodeDB) getPrefixIterator(prefix []byte) (dbm.Iterator, error) { +func (ndb *nodeDB) getPrefixIterator(prefix []byte) (corestore.Iterator, error) { var start, end []byte if len(prefix) == 0 { start = nil @@ -887,7 +888,7 @@ func (ndb *nodeDB) getPrefixIterator(prefix []byte) (dbm.Iterator, error) { } // Get iterator for fast prefix and error, if any -func (ndb *nodeDB) getFastIterator(start, end []byte, ascending bool) (dbm.Iterator, error) { +func (ndb *nodeDB) getFastIterator(start, end []byte, ascending bool) (corestore.Iterator, error) { var startFormatted, endFormatted []byte if start != nil { diff --git a/testutils_test.go b/testutils_test.go index 24d5723c7..f150873f3 100644 --- a/testutils_test.go +++ b/testutils_test.go @@ -10,6 +10,7 @@ import ( "testing" log "cosmossdk.io/core/log" + corestore "cosmossdk.io/core/store" "github.com/stretchr/testify/require" dbm "github.com/cosmos/iavl/db" @@ -285,7 +286,7 @@ func setupMirrorForIterator(t *testing.T, config *iteratorTestConfig, tree *Muta // assertIterator confirms that the iterator returns the expected values desribed by mirror in the same order. // mirror is a slice containing slices of the form [key, value]. In other words, key at index 0 and value at index 1. -func assertIterator(t *testing.T, itr dbm.Iterator, mirror [][]string, ascending bool) { +func assertIterator(t *testing.T, itr corestore.Iterator, mirror [][]string, ascending bool) { startIdx, endIdx := 0, len(mirror)-1 increment := 1 mirrorIdx := startIdx diff --git a/tree_random_test.go b/tree_random_test.go index abae9cd0a..7e2c6905a 100644 --- a/tree_random_test.go +++ b/tree_random_test.go @@ -99,7 +99,7 @@ func testRandomOperations(t *testing.T, randSeed int64) { require.NoError(t, err) defer os.RemoveAll(tempdir) - levelDB, err := dbm.NewDB("test", "goleveldb", tempdir) + levelDB, err := dbm.NewGoLevelDB("test", tempdir) require.NoError(t, err) tree, version, _ := loadTree(levelDB) diff --git a/tree_test.go b/tree_test.go index 50b701a53..28c5bfcb1 100644 --- a/tree_test.go +++ b/tree_test.go @@ -36,7 +36,7 @@ func SetupTest() { func getTestDB() (dbm.DB, func()) { if testLevelDB { - d, err := dbm.NewDB("test", "goleveldb", ".") + d, err := dbm.NewGoLevelDB("test", ".") if err != nil { panic(err) } @@ -1437,7 +1437,7 @@ func BenchmarkTreeLoadAndDelete(b *testing.B) { numVersions := 5000 numKeysPerVersion := 10 - d, err := dbm.NewDB("bench", "goleveldb", ".") + d, err := dbm.NewGoLevelDB("bench", ".") if err != nil { panic(err) } @@ -1666,8 +1666,7 @@ func TestGetWithIndex_ImmutableTree(t *testing.T) { } func Benchmark_GetWithIndex(b *testing.B) { - db, err := dbm.NewDB("test", "memdb", "") - require.NoError(b, err) + db := dbm.NewMemDB() const numKeyVals = 100000 @@ -1680,7 +1679,7 @@ func Benchmark_GetWithIndex(b *testing.B) { keys = append(keys, key) t.Set(key, iavlrand.RandBytes(10)) } - _, _, err = t.SaveVersion() + _, _, err := t.SaveVersion() require.NoError(b, err) b.ReportAllocs() @@ -1717,8 +1716,7 @@ func Benchmark_GetWithIndex(b *testing.B) { } func Benchmark_GetByIndex(b *testing.B) { - db, err := dbm.NewDB("test", "memdb", "") - require.NoError(b, err) + db := dbm.NewMemDB() const numKeyVals = 100000 @@ -1728,7 +1726,7 @@ func Benchmark_GetByIndex(b *testing.B) { key := iavlrand.RandBytes(10) t.Set(key, iavlrand.RandBytes(10)) } - _, _, err = t.SaveVersion() + _, _, err := t.SaveVersion() require.NoError(b, err) b.ReportAllocs() @@ -1794,8 +1792,7 @@ func TestNodeCacheStatisic(t *testing.T) { tc := tc t.Run(name, func(_ *testing.T) { stat := &Statistics{} - db, err := dbm.NewDB("test", "memdb", "") - require.NoError(t, err) + db := dbm.NewMemDB() mt := NewMutableTree(db, tc.cacheSize, false, log.NewNopLogger(), StatOption(stat)) for i := 0; i < numKeyVals; i++ { @@ -1823,13 +1820,12 @@ func TestNodeCacheStatisic(t *testing.T) { } func TestEmptyVersionDelete(t *testing.T) { - db, err := dbm.NewDB("test", "memdb", "") - require.NoError(t, err) + db := dbm.NewMemDB() defer db.Close() tree := NewMutableTree(db, 0, false, log.NewNopLogger()) - _, err = tree.Set([]byte("key1"), []byte("value1")) + _, err := tree.Set([]byte("key1"), []byte("value1")) require.NoError(t, err) toVersion := 10 @@ -1854,13 +1850,12 @@ func TestEmptyVersionDelete(t *testing.T) { } func TestReferenceRoot(t *testing.T) { - db, err := dbm.NewDB("test", "memdb", "") - require.NoError(t, err) + db := dbm.NewMemDB() defer db.Close() tree := NewMutableTree(db, 0, false, log.NewNopLogger()) - _, err = tree.Set([]byte("key1"), []byte("value1")) + _, err := tree.Set([]byte("key1"), []byte("value1")) require.NoError(t, err) _, err = tree.Set([]byte("key2"), []byte("value2")) @@ -1887,8 +1882,7 @@ func TestReferenceRoot(t *testing.T) { } func TestWorkingHashWithInitialVersion(t *testing.T) { - db, err := dbm.NewDB("test", "memdb", "") - require.NoError(t, err) + db := dbm.NewMemDB() defer db.Close() initialVersion := int64(100) @@ -1898,7 +1892,7 @@ func TestWorkingHashWithInitialVersion(t *testing.T) { v := tree.WorkingVersion() require.Equal(t, initialVersion, v) - _, err = tree.Set([]byte("key1"), []byte("value1")) + _, err := tree.Set([]byte("key1"), []byte("value1")) require.NoError(t, err) workingHash := tree.WorkingHash() @@ -1906,8 +1900,7 @@ func TestWorkingHashWithInitialVersion(t *testing.T) { require.NoError(t, err) require.Equal(t, commitHash, workingHash) - db, err = dbm.NewDB("test", "memdb", "") - require.NoError(t, err) + db = dbm.NewMemDB() // without WorkingHash tree = NewMutableTree(db, 0, false, log.NewNopLogger(), InitialVersionOption(uint64(initialVersion))) diff --git a/unsaved_fast_iterator.go b/unsaved_fast_iterator.go index eeaff812c..0cb35e5d0 100644 --- a/unsaved_fast_iterator.go +++ b/unsaved_fast_iterator.go @@ -6,8 +6,7 @@ import ( "sort" "sync" - dbm "github.com/cosmos/cosmos-db" - + "cosmossdk.io/core/store" "github.com/cosmos/iavl/fastnode" ibytes "github.com/cosmos/iavl/internal/bytes" ) @@ -29,7 +28,7 @@ type UnsavedFastIterator struct { ndb *nodeDB nextKey []byte nextVal []byte - fastIterator dbm.Iterator + fastIterator store.Iterator nextUnsavedNodeIdx int unsavedFastNodeAdditions *sync.Map // map[string]*FastNode @@ -37,7 +36,7 @@ type UnsavedFastIterator struct { unsavedFastNodesToSort []string } -var _ dbm.Iterator = (*UnsavedFastIterator)(nil) +var _ store.Iterator = (*UnsavedFastIterator)(nil) func NewUnsavedFastIterator(start, end []byte, ascending bool, ndb *nodeDB, unsavedFastNodeAdditions, unsavedFastNodeRemovals *sync.Map) *UnsavedFastIterator { iter := &UnsavedFastIterator{ @@ -103,13 +102,13 @@ func NewUnsavedFastIterator(start, end []byte, ascending bool, ndb *nodeDB, unsa return iter } -// Domain implements dbm.Iterator. +// Domain implements store.Iterator. // Maps the underlying nodedb iterator domain, to the 'logical' keys involved. func (iter *UnsavedFastIterator) Domain() ([]byte, []byte) { return iter.start, iter.end } -// Valid implements dbm.Iterator. +// Valid implements store.Iterator. func (iter *UnsavedFastIterator) Valid() bool { if iter.start != nil && iter.end != nil { if bytes.Compare(iter.end, iter.start) != 1 { @@ -120,17 +119,17 @@ func (iter *UnsavedFastIterator) Valid() bool { return iter.fastIterator.Valid() || iter.nextUnsavedNodeIdx < len(iter.unsavedFastNodesToSort) || (iter.nextKey != nil && iter.nextVal != nil) } -// Key implements dbm.Iterator +// Key implements store.Iterator func (iter *UnsavedFastIterator) Key() []byte { return iter.nextKey } -// Value implements dbm.Iterator +// Value implements store.Iterator func (iter *UnsavedFastIterator) Value() []byte { return iter.nextVal } -// Next implements dbm.Iterator +// Next implements store.Iterator // Its effectively running the constant space overhead algorithm for streaming through sorted lists: // the sorted lists being underlying fast nodes & unsavedFastNodeChanges func (iter *UnsavedFastIterator) Next() { @@ -217,13 +216,13 @@ func (iter *UnsavedFastIterator) Next() { iter.nextVal = nil } -// Close implements dbm.Iterator +// Close implements store.Iterator func (iter *UnsavedFastIterator) Close() error { iter.valid = false return iter.fastIterator.Close() } -// Error implements dbm.Iterator +// Error implements store.Iterator func (iter *UnsavedFastIterator) Error() error { return iter.err } diff --git a/with_gcc_test.go b/with_gcc_test.go deleted file mode 100644 index 786e0a2f0..000000000 --- a/with_gcc_test.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build gcc -// +build gcc - -// This file exists because some of the DBs e.g CLevelDB -// require gcc as the compiler before they can ran otherwise -// we'll encounter crashes such as in https://github.com/tendermint/merkleeyes/issues/39 - -package iavl - -import ( - "testing" - - db "github.com/cosmos/cosmos-db" -) - -func BenchmarkImmutableAvlTreeCLevelDB(b *testing.B) { - db := db.NewDB("test", db.CLevelDBBackendStr, "./") - benchmarkImmutableAvlTreeWithDB(b, db) -}