Skip to content

Commit

Permalink
added config setting to prune warpdb (#702)
Browse files Browse the repository at this point in the history
* added config setting to prune warpdb

* refactored warp prune uint test

* message

* fixed up nits

* fixed nits

* fixed nits

* Update plugin/evm/config.go
  • Loading branch information
morrisettathena authored Jun 30, 2023
1 parent a221f63 commit 4ea9fc0
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 0 deletions.
2 changes: 2 additions & 0 deletions plugin/evm/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
const (
defaultAcceptorQueueLimit = 64 // Provides 2 minutes of buffer (2s block target) for a commit delay
defaultPruningEnabled = true
defaultPruneWarpDB = false
defaultCommitInterval = 4096
defaultTrieCleanCache = 512
defaultTrieDirtyCache = 512
Expand Down Expand Up @@ -122,6 +123,7 @@ type Config struct {
AllowMissingTries bool `json:"allow-missing-tries"` // If enabled, warnings preventing an incomplete trie index are suppressed
PopulateMissingTries *uint64 `json:"populate-missing-tries,omitempty"` // Sets the starting point for re-populating missing tries. Disables re-generation if nil.
PopulateMissingTriesParallelism int `json:"populate-missing-tries-parallelism"` // Number of concurrent readers to use when re-populating missing tries on startup.
PruneWarpDB bool `json:"prune-warp-db-enabled"` // Determines if the warpDB should be cleared on startup

// Metric Settings
MetricsExpensiveEnabled bool `json:"metrics-expensive-enabled"` // Debug-level metrics that might impact runtime performance
Expand Down
7 changes: 7 additions & 0 deletions plugin/evm/vm.go
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,13 @@ func (vm *VM) Initialize(
// initialize warp backend
vm.warpBackend = warp.NewWarpBackend(vm.ctx, vm.warpDB, warpSignatureCacheSize)

// clear warpdb on initialization if config enabled
if vm.config.PruneWarpDB {
if err := vm.warpBackend.Clear(); err != nil {
return fmt.Errorf("failed to prune warpDB: %w", err)
}
}

if err := vm.initializeChain(lastAcceptedHash, vm.ethConfig); err != nil {
return err
}
Expand Down
8 changes: 8 additions & 0 deletions warp/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ type WarpBackend interface {

// GetSignature returns the signature of the requested message hash.
GetSignature(messageHash ids.ID) ([bls.SignatureLen]byte, error)

// Clear clears the entire db
Clear() error
}

// warpBackend implements WarpBackend, keeps track of warp messages, and generates message signatures.
Expand All @@ -43,6 +46,11 @@ func NewWarpBackend(snowCtx *snow.Context, db database.Database, signatureCacheS
}
}

func (w *warpBackend) Clear() error {
w.signatureCache.Flush()
return database.Clear(w.db, w.db)
}

func (w *warpBackend) AddMessage(unsignedMessage *avalancheWarp.UnsignedMessage) error {
messageID := hashing.ComputeHash256Array(unsignedMessage.Bytes())

Expand Down
36 changes: 36 additions & 0 deletions warp/backend_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,42 @@ var (
payload = []byte("test")
)

func TestClearDB(t *testing.T) {
db := memdb.New()

snowCtx := snow.DefaultContextTest()
sk, err := bls.NewSecretKey()
require.NoError(t, err)
snowCtx.WarpSigner = avalancheWarp.NewSigner(sk, sourceChainID)
backend := NewWarpBackend(snowCtx, db, 500)

// use multiple messages to test that all messages get cleared
payloads := [][]byte{[]byte("test1"), []byte("test2"), []byte("test3"), []byte("test4"), []byte("test5")}
messageIDs := []ids.ID{}

// add all messages
for _, payload := range payloads {
unsignedMsg, err := avalancheWarp.NewUnsignedMessage(sourceChainID, destinationChainID, payload)
require.NoError(t, err)
messageID := hashing.ComputeHash256Array(unsignedMsg.Bytes())
messageIDs = append(messageIDs, messageID)
err = backend.AddMessage(unsignedMsg)
require.NoError(t, err)
// ensure that the message was added
_, err = backend.GetSignature(messageID)
require.NoError(t, err)
}

err = backend.Clear()
require.NoError(t, err)

// ensure all messages have been deleted
for _, messageID := range messageIDs {
_, err := backend.GetSignature(messageID)
require.ErrorContains(t, err, "failed to get warp message")
}
}

func TestAddAndGetValidMessage(t *testing.T) {
db := memdb.New()

Expand Down

0 comments on commit 4ea9fc0

Please sign in to comment.