Skip to content

Commit

Permalink
Problem: rocksdb wal format sometimes not backward compatible (backport
Browse files Browse the repository at this point in the history
#1379) (#1382)

Solution:
- flush the wal before quit the node, make the rocksdb upgrade smooth.

Update CHANGELOG.md



fix flush

Signed-off-by: yihuang <huang@crypto.com>
  • Loading branch information
yihuang committed Apr 9, 2024
1 parent 96642b2 commit 69a8015
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 9 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ jobs:
sed -i.bak "/$(echo $filename | sed 's/\//\\\//g')/d" coverage.txt
done
if: steps.changed-files.outputs.any_changed == 'true'
- uses: codecov/codecov-action@v3
- uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./coverage.txt,./memiavl/coverage.txt,./store/coverage.txt,./versiondb/coverage.txt
Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

## UNRELEASED

### Improvements

* (versiondb) [#1379](https://github.com/crypto-org-chain/cronos/pull/1379) Flush versiondb when graceful shutdown, make rocksdb upgrade smooth.

### Bug Fixes

- [#1363](https://github.com/crypto-org-chain/cronos/pull/1363) Update ethermint to fix a panic on overflow and patch gasUsed in the RPC API.
Expand Down
24 changes: 16 additions & 8 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,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 @@ -369,6 +368,8 @@ type App struct {

// module configurator
configurator module.Configurator

qms storetypes.MultiStore
}

// New returns a reference to an initialized chain.
Expand Down Expand Up @@ -859,10 +860,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 @@ -899,8 +899,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 @@ -1196,11 +1196,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 69a8015

Please sign in to comment.