mirror of
https://github.com/tendermint/tendermint.git
synced 2026-01-08 06:15:33 +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)
|
|
}
|