* fix: state listener observe writes at wrong time Closes: #13457 Currently state listener is notified when the cache store write, which happens in commit event only, which breaks the current design. The solution (as discussed in the issue) is to listen state writes on rootmulti store only. It also changes the file streamer to output single data file for the writes in the whole block, since we can't distinguish writes from different stage of abci events. It adds new config items for file streamer: - streamers.file.output-metadata - streamers.file.stop-node-on-error - streamers.file.fsync * synchronous abci call, and format doc * fix comment * update file streamer readme and fix typos * typo * fix: state listener observe writes at wrong time Closes: #13457 Currently state listener is notified when the cache store write, which happens in commit event only, which breaks the current design. The solution (as discussed in the issue) is to listen state writes on rootmulti store only. It also changes the file streamer to output single data file for the writes in the whole block, since we can't distinguish writes from different stage of abci events. It adds new config items for file streamer: - streamers.file.output-metadata - streamers.file.stop-node-on-error - streamers.file.fsync synchronous abci call, and format doc fix comment update file streamer readme and fix typos typo * improve UX of file streamer, make it immediately usable after enabled - set default value to write_dir. - make write_dir based on home directory by default. - auto-create the directory if not exists. * get homePage from opts Co-authored-by: Marko <marbar3778@yahoo.com>
90 lines
2.0 KiB
Go
90 lines
2.0 KiB
Go
package dbadapter
|
|
|
|
import (
|
|
"io"
|
|
|
|
dbm "github.com/tendermint/tm-db"
|
|
|
|
"github.com/cosmos/cosmos-sdk/store/cachekv"
|
|
"github.com/cosmos/cosmos-sdk/store/tracekv"
|
|
"github.com/cosmos/cosmos-sdk/store/types"
|
|
)
|
|
|
|
// Wrapper type for dbm.Db with implementation of KVStore
|
|
type Store struct {
|
|
dbm.DB
|
|
}
|
|
|
|
// Get wraps the underlying DB's Get method panicing on error.
|
|
func (dsa Store) Get(key []byte) []byte {
|
|
v, err := dsa.DB.Get(key)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return v
|
|
}
|
|
|
|
// Has wraps the underlying DB's Has method panicing on error.
|
|
func (dsa Store) Has(key []byte) bool {
|
|
ok, err := dsa.DB.Has(key)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return ok
|
|
}
|
|
|
|
// Set wraps the underlying DB's Set method panicing on error.
|
|
func (dsa Store) Set(key, value []byte) {
|
|
types.AssertValidKey(key)
|
|
if err := dsa.DB.Set(key, value); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
// Delete wraps the underlying DB's Delete method panicing on error.
|
|
func (dsa Store) Delete(key []byte) {
|
|
if err := dsa.DB.Delete(key); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
// Iterator wraps the underlying DB's Iterator method panicing on error.
|
|
func (dsa Store) Iterator(start, end []byte) types.Iterator {
|
|
iter, err := dsa.DB.Iterator(start, end)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return iter
|
|
}
|
|
|
|
// ReverseIterator wraps the underlying DB's ReverseIterator method panicing on error.
|
|
func (dsa Store) ReverseIterator(start, end []byte) types.Iterator {
|
|
iter, err := dsa.DB.ReverseIterator(start, end)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return iter
|
|
}
|
|
|
|
// GetStoreType returns the type of the store.
|
|
func (Store) GetStoreType() types.StoreType {
|
|
return types.StoreTypeDB
|
|
}
|
|
|
|
// CacheWrap branches the underlying store.
|
|
func (dsa Store) CacheWrap() types.CacheWrap {
|
|
return cachekv.NewStore(dsa)
|
|
}
|
|
|
|
// CacheWrapWithTrace implements KVStore.
|
|
func (dsa Store) CacheWrapWithTrace(w io.Writer, tc types.TraceContext) types.CacheWrap {
|
|
return cachekv.NewStore(tracekv.NewStore(dsa, w, tc))
|
|
}
|
|
|
|
// dbm.DB implements KVStore so we can CacheKVStore it.
|
|
var _ types.KVStore = Store{}
|