Skip to content

Commit

Permalink
Wrap pebble DB to use SetSync always with deposit store. (berachain#2381
Browse files Browse the repository at this point in the history
)

Co-authored-by: Alberto Benegiamo <[email protected]>
Co-authored-by: Fridrik Asmundsson <[email protected]>
Co-authored-by: Cal Bera <[email protected]>
  • Loading branch information
4 people authored Jan 20, 2025
1 parent 5dfa536 commit 4dc9ae7
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 2 deletions.
5 changes: 3 additions & 2 deletions node-core/components/deposit_store.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,13 @@ func ProvideDepositStore[
if err != nil {
return nil, err
}
spdb := depositstore.NewSynced(pdb)

// pass a closure to close the db as its not supported by the KVStoreService interface
closeFunc := func() error { return pdb.Close() }
closeFunc := func() error { return spdb.Close() }

return depositstore.NewStore(
storage.NewKVStoreProvider(pdb),
storage.NewKVStoreProvider(spdb),
closeFunc,
in.Logger.With("service", "deposit-store"),
), nil
Expand Down
94 changes: 94 additions & 0 deletions storage/deposit/synced_db.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
// SPDX-License-Identifier: BUSL-1.1
//
// Copyright (C) 2025, Berachain Foundation. All rights reserved.
// Use of this software is governed by the Business Source License included
// in the LICENSE file of this repository and at www.mariadb.com/bsl11.
//
// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY
// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER
// VERSIONS OF THE LICENSED WORK.
//
// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF
// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF
// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE).
//
// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
// TITLE.

package deposit

import (
"cosmossdk.io/core/store"
dbm "github.com/cosmos/cosmos-db"
)

var _ store.KVStoreWithBatch = &syncedDB{}

// We have verified experimentally that deposits are often *not* flushed
// as soon as they are enqueue when pebbleDB is chosed as backend. This may
// cause an issue with ungraceful restarts, which may lead to loss of deposits,
// resulting in the node being unable to verify any incoming deposit.
// SyncedDB solves the issues since it maps the Set call to a SetSync call
// which ensure that every single deposit is flushed when enqueued.
type syncedDB struct {
db dbm.DB
}

func NewSynced(db dbm.DB) dbm.DB {
return syncedDB{db: db}
}

func (s syncedDB) Get(key []byte) ([]byte, error) {
return s.db.Get(key)
}

func (s syncedDB) Has(key []byte) (bool, error) {
return s.db.Has(key)
}

func (s syncedDB) Set(key, value []byte) error {
return s.db.SetSync(key, value)
}

func (s syncedDB) SetSync(key, value []byte) error {
return s.db.SetSync(key, value)
}

func (s syncedDB) Delete(key []byte) error {
return s.db.Delete(key)
}

func (s syncedDB) DeleteSync(key []byte) error {
return s.db.DeleteSync(key)
}

func (s syncedDB) Iterator(start, end []byte) (store.Iterator, error) {
return s.db.Iterator(start, end)
}

func (s syncedDB) ReverseIterator(start, end []byte) (store.Iterator, error) {
return s.db.ReverseIterator(start, end)
}

func (s syncedDB) NewBatch() store.Batch {
return s.db.NewBatch()
}

func (s syncedDB) NewBatchWithSize(i int) store.Batch {
return s.db.NewBatchWithSize(i)
}

func (s syncedDB) Close() error {
return s.db.Close()
}

func (s syncedDB) Print() error {
return s.db.Print()
}

func (s syncedDB) Stats() map[string]string {
return s.db.Stats()
}

0 comments on commit 4dc9ae7

Please sign in to comment.