Skip to content

Commit

Permalink
Problem: rocksdb wal format sometimes not backward compatible (#1379)
Browse files Browse the repository at this point in the history
Solution:
- flush the wal before quit the node, make the rocksdb upgrade smooth.

Update CHANGELOG.md

Signed-off-by: yihuang <huang@crypto.com>

fix flush

Signed-off-by: yihuang <huang@crypto.com>
  • Loading branch information
yihuang authored Apr 9, 2024
1 parent 5c31fe0 commit 58ce7f4
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 8 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
### Improvements

* (test) [#1380](https://github.com/crypto-org-chain/cronos/pull/1380) Upgrade cosmovisor to 1.5.0 in integration test.
* (versiondb) [#1379](https://github.com/crypto-org-chain/cronos/pull/1379) Flush versiondb when graceful shutdown, make rocksdb upgrade smooth.

*April 8, 2024*

Expand Down
24 changes: 16 additions & 8 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,6 @@ import (
// this line is used by starport scaffolding # stargate/app/moduleImport

memiavlstore "github.com/crypto-org-chain/cronos/store"
memiavlrootmulti "github.com/crypto-org-chain/cronos/store/rootmulti"
"github.com/crypto-org-chain/cronos/v2/x/cronos"
cronosclient "github.com/crypto-org-chain/cronos/v2/x/cronos/client"
cronoskeeper "github.com/crypto-org-chain/cronos/v2/x/cronos/keeper"
Expand Down Expand Up @@ -370,6 +369,8 @@ type App struct {

// module configurator
configurator module.Configurator

qms storetypes.MultiStore
}

// New returns a reference to an initialized chain.
Expand Down Expand Up @@ -860,10 +861,9 @@ func New(

// wire up the versiondb's `StreamingService` and `MultiStore`.
streamers := cast.ToStringSlice(appOpts.Get("store.streamers"))
var qms sdk.MultiStore
if slices.Contains(streamers, "versiondb") {
var err error
qms, err = app.setupVersionDB(homePath, keys, tkeys, memKeys)
app.qms, err = app.setupVersionDB(homePath, keys, tkeys, memKeys)
if err != nil {
panic(err)
}
Expand Down Expand Up @@ -900,8 +900,8 @@ func New(
tmos.Exit(err.Error())
}

if qms != nil {
v1 := qms.LatestVersion()
if app.qms != nil {
v1 := app.qms.LatestVersion()
v2 := app.LastBlockHeight()
if v1 > 0 && v1 < v2 {
// try to prevent gap being created in versiondb
Expand Down Expand Up @@ -1197,11 +1197,19 @@ func VerifyAddressFormat(bz []byte) error {

// Close will be called in graceful shutdown in start cmd
func (app *App) Close() error {
err := app.BaseApp.Close()
errs := []error{app.BaseApp.Close()}

// flush the versiondb
if closer, ok := app.qms.(io.Closer); ok {
errs = append(errs, closer.Close())
}

if cms, ok := app.CommitMultiStore().(*memiavlrootmulti.Store); ok {
return stderrors.Join(err, cms.Close())
// mainly to flush memiavl
if closer, ok := app.CommitMultiStore().(io.Closer); ok {
errs = append(errs, closer.Close())
}

err := stderrors.Join(errs...)
app.Logger().Info("Application gracefully shutdown", "error", err)
return err
}
5 changes: 5 additions & 0 deletions versiondb/multistore.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,3 +145,8 @@ func (s *MultiStore) LatestVersion() int64 {
}
return version
}

// Close will flush the versiondb
func (s *MultiStore) Close() error {
return s.versionDB.Flush()
}
10 changes: 10 additions & 0 deletions versiondb/tsrocksdb/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,16 @@ func (s Store) Import(version int64, ch <-chan versiondb.ImportEntry) error {
return s.SetLatestVersion(version)
}

func (s Store) Flush() error {
opts := grocksdb.NewDefaultFlushOptions()
defer opts.Destroy()

return errors.Join(
s.db.Flush(opts),
s.db.FlushCF(s.cfHandle, opts),
)
}

func newTSReadOptions(version *int64) *grocksdb.ReadOptions {
var ver uint64
if version == nil {
Expand Down
4 changes: 4 additions & 0 deletions versiondb/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ type VersionStore interface {

// Import the initial state of the store
Import(version int64, ch <-chan ImportEntry) error

// Flush wal logs, and make the changes persistent,
// mainly for rocksdb version upgrade, sometimes the wal format is not compatible.
Flush() error
}

type ImportEntry struct {
Expand Down

0 comments on commit 58ce7f4

Please sign in to comment.