mirror of
https://github.com/fluencelabs/tendermint
synced 2025-04-25 23:02:16 +00:00
Description: add boltdb implement for db interface. The boltdb is safe and high performence embedded KV database. It is based on B+tree and Mmap. Now it is maintained by etcd-io org. https://github.com/etcd-io/bbolt It is much better than LSM tree (levelDB) when RANDOM and SCAN read. Replaced #3604 Refs #1835 Commits: * add boltdb for storage * update boltdb in gopkg.toml * update bbolt in Gopkg.lock * dep update Gopkg.lock * add boltdb'bucket when create Boltdb * some modifies * address my own comments * fix most of the Iterator tests for boltdb * bolt does not support concurrent writes while iterating * add WARNING word * note that ReadOnly option is not supported * fixes after Ismail's review Co-Authored-By: melekes <anton.kalyaev@gmail.com> * panic if View returns error plus specify bucket in the top comment
46 lines
1.0 KiB
Go
46 lines
1.0 KiB
Go
package db
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
"github.com/syndtr/goleveldb/leveldb/opt"
|
|
|
|
cmn "github.com/tendermint/tendermint/libs/common"
|
|
)
|
|
|
|
func TestGoLevelDBNewGoLevelDB(t *testing.T) {
|
|
name := fmt.Sprintf("test_%x", cmn.RandStr(12))
|
|
defer cleanupDBDir("", name)
|
|
|
|
// Test we can't open the db twice for writing
|
|
wr1, err := NewGoLevelDB(name, "")
|
|
require.Nil(t, err)
|
|
_, err = NewGoLevelDB(name, "")
|
|
require.NotNil(t, err)
|
|
wr1.Close() // Close the db to release the lock
|
|
|
|
// Test we can open the db twice for reading only
|
|
ro1, err := NewGoLevelDBWithOpts(name, "", &opt.Options{ReadOnly: true})
|
|
defer ro1.Close()
|
|
require.Nil(t, err)
|
|
ro2, err := NewGoLevelDBWithOpts(name, "", &opt.Options{ReadOnly: true})
|
|
defer ro2.Close()
|
|
require.Nil(t, err)
|
|
}
|
|
|
|
func BenchmarkGoLevelDBRandomReadsWrites(b *testing.B) {
|
|
name := fmt.Sprintf("test_%x", cmn.RandStr(12))
|
|
db, err := NewGoLevelDB(name, "")
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
defer func() {
|
|
db.Close()
|
|
cleanupDBDir("", name)
|
|
}()
|
|
|
|
benchmarkRandomReadsWrites(b, db)
|
|
}
|