mirror of
https://github.com/arnaucube/hermez-node.git
synced 2026-02-07 11:26:44 +01:00
Faster synchronization with asynchronous deletion of old checkpoints
This commit is contained in:
@@ -227,6 +227,12 @@ func (s *StateDB) MakeCheckpoint() error {
|
||||
return s.db.MakeCheckpoint()
|
||||
}
|
||||
|
||||
// DeleteOldCheckpoints deletes old checkpoints when there are more than
|
||||
// `cfg.keep` checkpoints
|
||||
func (s *StateDB) DeleteOldCheckpoints() error {
|
||||
return s.db.DeleteOldCheckpoints()
|
||||
}
|
||||
|
||||
// CurrentBatch returns the current in-memory CurrentBatch of the StateDB.db
|
||||
func (s *StateDB) CurrentBatch() common.BatchNum {
|
||||
return s.db.CurrentBatch
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"math/big"
|
||||
"os"
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
ethCommon "github.com/ethereum/go-ethereum/common"
|
||||
@@ -588,6 +589,48 @@ func TestDeleteOldCheckpoints(t *testing.T) {
|
||||
for i := 0; i < numCheckpoints; i++ {
|
||||
err = sdb.MakeCheckpoint()
|
||||
require.NoError(t, err)
|
||||
err := sdb.DeleteOldCheckpoints()
|
||||
require.NoError(t, err)
|
||||
checkpoints, err := sdb.db.ListCheckpoints()
|
||||
require.NoError(t, err)
|
||||
assert.LessOrEqual(t, len(checkpoints), keep)
|
||||
}
|
||||
}
|
||||
|
||||
// TestConcurrentDeleteOldCheckpoints performs almost the same test than
|
||||
// kvdb/kvdb_test.go TestConcurrentDeleteOldCheckpoints, but over the StateDB
|
||||
func TestConcurrentDeleteOldCheckpoints(t *testing.T) {
|
||||
dir, err := ioutil.TempDir("", "tmpdb")
|
||||
require.NoError(t, err)
|
||||
defer require.NoError(t, os.RemoveAll(dir))
|
||||
|
||||
keep := 16
|
||||
sdb, err := NewStateDB(Config{Path: dir, Keep: keep, Type: TypeSynchronizer, NLevels: 32})
|
||||
require.NoError(t, err)
|
||||
|
||||
numCheckpoints := 32
|
||||
// do checkpoints and check that we never have more than `keep`
|
||||
// checkpoints
|
||||
for i := 0; i < numCheckpoints; i++ {
|
||||
err = sdb.MakeCheckpoint()
|
||||
require.NoError(t, err)
|
||||
wg := sync.WaitGroup{}
|
||||
n := 10
|
||||
wg.Add(n)
|
||||
for j := 0; j < n; j++ {
|
||||
go func() {
|
||||
err := sdb.DeleteOldCheckpoints()
|
||||
require.NoError(t, err)
|
||||
checkpoints, err := sdb.db.ListCheckpoints()
|
||||
require.NoError(t, err)
|
||||
assert.LessOrEqual(t, len(checkpoints), keep)
|
||||
wg.Done()
|
||||
}()
|
||||
_, err := sdb.db.ListCheckpoints()
|
||||
// only checking here for absence of errors, not the count of checkpoints
|
||||
require.NoError(t, err)
|
||||
}
|
||||
wg.Wait()
|
||||
checkpoints, err := sdb.db.ListCheckpoints()
|
||||
require.NoError(t, err)
|
||||
assert.LessOrEqual(t, len(checkpoints), keep)
|
||||
|
||||
Reference in New Issue
Block a user