Merge pull request #534 from hermeznetwork/fix/statedb2 Pass StateDB constructor parameters as Config type
jump to
@@ -213,7 +213,7 @@ if err := os.RemoveAll(dir); err != nil {
panic(err) } }() - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeTxSelector, 0) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, Type: statedb.TypeTxSelector, NLevels: 0}) if err != nil { panic(err) }
@@ -2,6 +2,7 @@ package batchbuilder
import ( "github.com/hermeznetwork/hermez-node/common" + "github.com/hermeznetwork/hermez-node/db/kvdb" "github.com/hermeznetwork/hermez-node/db/statedb" "github.com/hermeznetwork/hermez-node/txprocessor" "github.com/hermeznetwork/tracerr"@@ -28,8 +29,14 @@
// NewBatchBuilder constructs a new BatchBuilder, and executes the bb.Reset // method func NewBatchBuilder(dbpath string, synchronizerStateDB *statedb.StateDB, batchNum common.BatchNum, nLevels uint64) (*BatchBuilder, error) { - localStateDB, err := statedb.NewLocalStateDB(dbpath, 128, synchronizerStateDB, - statedb.TypeBatchBuilder, int(nLevels)) + localStateDB, err := statedb.NewLocalStateDB( + statedb.Config{ + Path: dbpath, + Keep: kvdb.DefaultKeep, + Type: statedb.TypeBatchBuilder, + NLevels: int(nLevels), + }, + synchronizerStateDB) if err != nil { return nil, tracerr.Wrap(err) }
@@ -15,7 +15,7 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.Nil(t, err) defer assert.Nil(t, os.RemoveAll(dir)) - synchDB, err := statedb.NewStateDB(dir, 128, statedb.TypeBatchBuilder, 0) + synchDB, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, Type: statedb.TypeBatchBuilder, NLevels: 0}) assert.Nil(t, err) bbDir, err := ioutil.TempDir("", "tmpBatchBuilderDB")
@@ -97,7 +97,8 @@ var err error
syncDBPath, err = ioutil.TempDir("", "tmpSyncDB") require.NoError(t, err) deleteme = append(deleteme, syncDBPath) - syncStateDB, err := statedb.NewStateDB(syncDBPath, 128, statedb.TypeSynchronizer, 48) + syncStateDB, err := statedb.NewStateDB(statedb.Config{Path: syncDBPath, Keep: 128, + Type: statedb.TypeSynchronizer, NLevels: 48}) assert.NoError(t, err) pass := os.Getenv("POSTGRES_PASS")
@@ -200,15 +200,17 @@ p.stats = statsVars.Stats
p.syncSCVars(statsVars.Vars) case <-time.After(waitDuration): batchNum = p.batchNum + 1 - if batchInfo, err := p.handleForgeBatch(p.ctx, batchNum); err != nil { + batchInfo, err := p.handleForgeBatch(p.ctx, batchNum) + if p.ctx.Err() != nil { + continue + } else if err != nil { waitDuration = p.cfg.SyncRetryInterval continue - } else { - p.batchNum = batchNum - select { - case batchChSentServerProof <- batchInfo: - case <-p.ctx.Done(): - } + } + p.batchNum = batchNum + select { + case batchChSentServerProof <- batchInfo: + case <-p.ctx.Done(): } } }
@@ -28,12 +28,14 @@ func newStateDB(t *testing.T) *statedb.LocalStateDB {
syncDBPath, err := ioutil.TempDir("", "tmpSyncDB") require.NoError(t, err) deleteme = append(deleteme, syncDBPath) - syncStateDB, err := statedb.NewStateDB(syncDBPath, 128, statedb.TypeSynchronizer, 48) + syncStateDB, err := statedb.NewStateDB(statedb.Config{Path: syncDBPath, Keep: 128, + Type: statedb.TypeSynchronizer, NLevels: 48}) assert.NoError(t, err) stateDBPath, err := ioutil.TempDir("", "tmpStateDB") require.NoError(t, err) deleteme = append(deleteme, stateDBPath) - stateDB, err := statedb.NewLocalStateDB(stateDBPath, 128, syncStateDB, statedb.TypeTxSelector, 0) + stateDB, err := statedb.NewLocalStateDB(statedb.Config{Path: stateDBPath, Keep: 128, + Type: statedb.TypeTxSelector, NLevels: 0}, syncStateDB) require.NoError(t, err) return stateDB }
@@ -27,6 +27,8 @@ PathCurrent = "current"
// PathLast defines the subpath of the last Batch in the subpath // of the StateDB PathLast = "last" + // DefaultKeep is the default value for the Keep parameter + DefaultKeep = 128 ) var (@@ -34,16 +36,18 @@ // KeyCurrentBatch is used as key in the db to store the current BatchNum
KeyCurrentBatch = []byte("k:currentbatch") // keyCurrentIdx is used as key in the db to store the CurrentIdx keyCurrentIdx = []byte("k:idx") + // ErrNoLast is returned when the KVDB has been configured to not have + // a Last checkpoint but a Last method is used + ErrNoLast = fmt.Errorf("no last checkpoint") ) // KVDB represents the Key-Value DB object type KVDB struct { - path string - db *pebble.Storage + cfg Config + db *pebble.Storage // CurrentIdx holds the current Idx that the BatchBuilder is using CurrentIdx common.Idx CurrentBatch common.BatchNum - keep int m sync.Mutex last *Last }@@ -103,23 +107,42 @@ k.db = nil
} } +// Config of the KVDB +type Config struct { + // Path where the checkpoints will be stored + Path string + // Keep is the number of old checkpoints to keep. If 0, all + // checkpoints are kept. + Keep int + // At every checkpoint, check that there are no gaps between the + // checkpoints + NoGapsCheck bool + // NoLast skips having an opened DB with a checkpoint to the last + // batchNum for thread-safe reads. + NoLast bool +} + // NewKVDB creates a new KVDB, allowing to use an in-memory or in-disk storage. // Checkpoints older than the value defined by `keep` will be deleted. -func NewKVDB(pathDB string, keep int) (*KVDB, error) { +// func NewKVDB(pathDB string, keep int) (*KVDB, error) { +func NewKVDB(cfg Config) (*KVDB, error) { var sto *pebble.Storage var err error - sto, err = pebble.NewPebbleStorage(path.Join(pathDB, PathCurrent), false) + sto, err = pebble.NewPebbleStorage(path.Join(cfg.Path, PathCurrent), false) if err != nil { return nil, tracerr.Wrap(err) } + var last *Last + if !cfg.NoLast { + last = &Last{ + path: cfg.Path, + } + } kvdb := &KVDB{ - path: pathDB, + cfg: cfg, db: sto, - keep: keep, - last: &Last{ - path: pathDB, - }, + last: last, } // load currentBatch kvdb.CurrentBatch, err = kvdb.GetCurrentBatch()@@ -137,29 +160,32 @@ return kvdb, nil
} // LastRead is a thread-safe method to query the last KVDB -func (kvdb *KVDB) LastRead(fn func(db *pebble.Storage) error) error { - kvdb.last.rw.RLock() - defer kvdb.last.rw.RUnlock() - return fn(kvdb.last.db) +func (k *KVDB) LastRead(fn func(db *pebble.Storage) error) error { + if k.last == nil { + return tracerr.Wrap(ErrNoLast) + } + k.last.rw.RLock() + defer k.last.rw.RUnlock() + return fn(k.last.db) } // DB returns the *pebble.Storage from the KVDB -func (kvdb *KVDB) DB() *pebble.Storage { - return kvdb.db +func (k *KVDB) DB() *pebble.Storage { + return k.db } // StorageWithPrefix returns the db.Storage with the given prefix from the // current KVDB -func (kvdb *KVDB) StorageWithPrefix(prefix []byte) db.Storage { - return kvdb.db.WithPrefix(prefix) +func (k *KVDB) StorageWithPrefix(prefix []byte) db.Storage { + return k.db.WithPrefix(prefix) } // Reset resets the KVDB to the checkpoint at the given batchNum. Reset does // not delete the checkpoints between old current and the new current, those // checkpoints will remain in the storage, and eventually will be deleted when // MakeCheckpoint overwrites them. -func (kvdb *KVDB) Reset(batchNum common.BatchNum) error { - return kvdb.reset(batchNum, true) +func (k *KVDB) Reset(batchNum common.BatchNum) error { + return k.reset(batchNum, true) } // reset resets the KVDB to the checkpoint at the given batchNum. Reset does@@ -167,19 +193,19 @@ // not delete the checkpoints between old current and the new current, those
// checkpoints will remain in the storage, and eventually will be deleted when // MakeCheckpoint overwrites them. `closeCurrent` will close the currently // opened db before doing the reset. -func (kvdb *KVDB) reset(batchNum common.BatchNum, closeCurrent bool) error { - currentPath := path.Join(kvdb.path, PathCurrent) +func (k *KVDB) reset(batchNum common.BatchNum, closeCurrent bool) error { + currentPath := path.Join(k.cfg.Path, PathCurrent) - if closeCurrent && kvdb.db != nil { - kvdb.db.Close() - kvdb.db = nil + if closeCurrent && k.db != nil { + k.db.Close() + k.db = nil } // remove 'current' if err := os.RemoveAll(currentPath); err != nil { return tracerr.Wrap(err) } // remove all checkpoints > batchNum - list, err := kvdb.ListCheckpoints() + list, err := k.ListCheckpoints() if err != nil { return tracerr.Wrap(err) }@@ -192,7 +218,7 @@ break
} } for _, bn := range list[start:] { - if err := kvdb.DeleteCheckpoint(common.BatchNum(bn)); err != nil { + if err := k.DeleteCheckpoint(common.BatchNum(bn)); err != nil { return tracerr.Wrap(err) } }@@ -203,23 +229,27 @@ sto, err := pebble.NewPebbleStorage(currentPath, false)
if err != nil { return tracerr.Wrap(err) } - kvdb.db = sto - kvdb.CurrentIdx = common.RollupConstReservedIDx // 255 - kvdb.CurrentBatch = 0 - if err := kvdb.last.setNew(); err != nil { - return tracerr.Wrap(err) + k.db = sto + k.CurrentIdx = common.RollupConstReservedIDx // 255 + k.CurrentBatch = 0 + if k.last != nil { + if err := k.last.setNew(); err != nil { + return tracerr.Wrap(err) + } } return nil } // copy 'batchNum' to 'current' - if err := kvdb.MakeCheckpointFromTo(batchNum, currentPath); err != nil { + if err := k.MakeCheckpointFromTo(batchNum, currentPath); err != nil { return tracerr.Wrap(err) } // copy 'batchNum' to 'last' - if err := kvdb.last.set(kvdb, batchNum); err != nil { - return tracerr.Wrap(err) + if k.last != nil { + if err := k.last.set(k, batchNum); err != nil { + return tracerr.Wrap(err) + } } // open the new 'current'@@ -227,15 +257,15 @@ sto, err := pebble.NewPebbleStorage(currentPath, false)
if err != nil { return tracerr.Wrap(err) } - kvdb.db = sto + k.db = sto // get currentBatch num - kvdb.CurrentBatch, err = kvdb.GetCurrentBatch() + k.CurrentBatch, err = k.GetCurrentBatch() if err != nil { return tracerr.Wrap(err) } // idx is obtained from the statedb reset - kvdb.CurrentIdx, err = kvdb.GetCurrentIdx() + k.CurrentIdx, err = k.GetCurrentIdx() if err != nil { return tracerr.Wrap(err) }@@ -245,15 +275,15 @@ }
// ResetFromSynchronizer performs a reset in the KVDB getting the state from // synchronizerKVDB for the given batchNum. -func (kvdb *KVDB) ResetFromSynchronizer(batchNum common.BatchNum, synchronizerKVDB *KVDB) error { +func (k *KVDB) ResetFromSynchronizer(batchNum common.BatchNum, synchronizerKVDB *KVDB) error { if synchronizerKVDB == nil { return tracerr.Wrap(fmt.Errorf("synchronizerKVDB can not be nil")) } - currentPath := path.Join(kvdb.path, PathCurrent) - if kvdb.db != nil { - kvdb.db.Close() - kvdb.db = nil + currentPath := path.Join(k.cfg.Path, PathCurrent) + if k.db != nil { + k.db.Close() + k.db = nil } // remove 'current'@@ -261,12 +291,12 @@ if err := os.RemoveAll(currentPath); err != nil {
return tracerr.Wrap(err) } // remove all checkpoints - list, err := kvdb.ListCheckpoints() + list, err := k.ListCheckpoints() if err != nil { return tracerr.Wrap(err) } for _, bn := range list { - if err := kvdb.DeleteCheckpoint(common.BatchNum(bn)); err != nil { + if err := k.DeleteCheckpoint(common.BatchNum(bn)); err != nil { return tracerr.Wrap(err) } }@@ -277,14 +307,14 @@ sto, err := pebble.NewPebbleStorage(currentPath, false)
if err != nil { return tracerr.Wrap(err) } - kvdb.db = sto - kvdb.CurrentIdx = common.RollupConstReservedIDx // 255 - kvdb.CurrentBatch = 0 + k.db = sto + k.CurrentIdx = common.RollupConstReservedIDx // 255 + k.CurrentBatch = 0 return nil } - checkpointPath := path.Join(kvdb.path, fmt.Sprintf("%s%d", PathBatchNum, batchNum)) + checkpointPath := path.Join(k.cfg.Path, fmt.Sprintf("%s%d", PathBatchNum, batchNum)) // copy synchronizer'BatchNumX' to 'BatchNumX' if err := synchronizerKVDB.MakeCheckpointFromTo(batchNum, checkpointPath); err != nil {@@ -292,7 +322,7 @@ return tracerr.Wrap(err)
} // copy 'BatchNumX' to 'current' - err = kvdb.MakeCheckpointFromTo(batchNum, currentPath) + err = k.MakeCheckpointFromTo(batchNum, currentPath) if err != nil { return tracerr.Wrap(err) }@@ -302,15 +332,15 @@ sto, err := pebble.NewPebbleStorage(currentPath, false)
if err != nil { return tracerr.Wrap(err) } - kvdb.db = sto + k.db = sto // get currentBatch num - kvdb.CurrentBatch, err = kvdb.GetCurrentBatch() + k.CurrentBatch, err = k.GetCurrentBatch() if err != nil { return tracerr.Wrap(err) } // get currentIdx - kvdb.CurrentIdx, err = kvdb.GetCurrentIdx() + k.CurrentIdx, err = k.GetCurrentIdx() if err != nil { return tracerr.Wrap(err) }@@ -319,8 +349,8 @@ return nil
} // GetCurrentBatch returns the current BatchNum stored in the KVDB -func (kvdb *KVDB) GetCurrentBatch() (common.BatchNum, error) { - cbBytes, err := kvdb.db.Get(KeyCurrentBatch) +func (k *KVDB) GetCurrentBatch() (common.BatchNum, error) { + cbBytes, err := k.db.Get(KeyCurrentBatch) if tracerr.Unwrap(err) == db.ErrNotFound { return 0, nil }@@ -331,12 +361,12 @@ return common.BatchNumFromBytes(cbBytes)
} // setCurrentBatch stores the current BatchNum in the KVDB -func (kvdb *KVDB) setCurrentBatch() error { - tx, err := kvdb.db.NewTx() +func (k *KVDB) setCurrentBatch() error { + tx, err := k.db.NewTx() if err != nil { return tracerr.Wrap(err) } - err = tx.Put(KeyCurrentBatch, kvdb.CurrentBatch.Bytes()) + err = tx.Put(KeyCurrentBatch, k.CurrentBatch.Bytes()) if err != nil { return tracerr.Wrap(err) }@@ -347,9 +377,9 @@ return nil
} // GetCurrentIdx returns the stored Idx from the KVDB, which is the last Idx -// used for an Account in the KVDB. -func (kvdb *KVDB) GetCurrentIdx() (common.Idx, error) { - idxBytes, err := kvdb.db.Get(keyCurrentIdx) +// used for an Account in the k. +func (k *KVDB) GetCurrentIdx() (common.Idx, error) { + idxBytes, err := k.db.Get(keyCurrentIdx) if tracerr.Unwrap(err) == db.ErrNotFound { return common.RollupConstReservedIDx, nil // 255, nil }@@ -360,10 +390,10 @@ return common.IdxFromBytes(idxBytes[:])
} // SetCurrentIdx stores Idx in the KVDB -func (kvdb *KVDB) SetCurrentIdx(idx common.Idx) error { - kvdb.CurrentIdx = idx +func (k *KVDB) SetCurrentIdx(idx common.Idx) error { + k.CurrentIdx = idx - tx, err := kvdb.db.NewTx() + tx, err := k.db.NewTx() if err != nil { return tracerr.Wrap(err) }@@ -383,14 +413,14 @@ }
// MakeCheckpoint does a checkpoint at the given batchNum in the defined path. // Internally this advances & stores the current BatchNum, and then stores a -// Checkpoint of the current state of the KVDB. -func (kvdb *KVDB) MakeCheckpoint() error { +// Checkpoint of the current state of the k. +func (k *KVDB) MakeCheckpoint() error { // advance currentBatch - kvdb.CurrentBatch++ + k.CurrentBatch++ - checkpointPath := path.Join(kvdb.path, fmt.Sprintf("%s%d", PathBatchNum, kvdb.CurrentBatch)) + checkpointPath := path.Join(k.cfg.Path, fmt.Sprintf("%s%d", PathBatchNum, k.CurrentBatch)) - if err := kvdb.setCurrentBatch(); err != nil { + if err := k.setCurrentBatch(); err != nil { return tracerr.Wrap(err) }@@ -404,15 +434,17 @@ return tracerr.Wrap(err)
} // execute Checkpoint - if err := kvdb.db.Pebble().Checkpoint(checkpointPath); err != nil { + if err := k.db.Pebble().Checkpoint(checkpointPath); err != nil { return tracerr.Wrap(err) } // copy 'CurrentBatch' to 'last' - if err := kvdb.last.set(kvdb, kvdb.CurrentBatch); err != nil { - return tracerr.Wrap(err) + if k.last != nil { + if err := k.last.set(k, k.CurrentBatch); err != nil { + return tracerr.Wrap(err) + } } // delete old checkpoints - if err := kvdb.deleteOldCheckpoints(); err != nil { + if err := k.deleteOldCheckpoints(); err != nil { return tracerr.Wrap(err) }@@ -420,8 +452,8 @@ return nil
} // DeleteCheckpoint removes if exist the checkpoint of the given batchNum -func (kvdb *KVDB) DeleteCheckpoint(batchNum common.BatchNum) error { - checkpointPath := path.Join(kvdb.path, fmt.Sprintf("%s%d", PathBatchNum, batchNum)) +func (k *KVDB) DeleteCheckpoint(batchNum common.BatchNum) error { + checkpointPath := path.Join(k.cfg.Path, fmt.Sprintf("%s%d", PathBatchNum, batchNum)) if _, err := os.Stat(checkpointPath); os.IsNotExist(err) { return tracerr.Wrap(fmt.Errorf("Checkpoint with batchNum %d does not exist in DB", batchNum))@@ -432,8 +464,8 @@ }
// ListCheckpoints returns the list of batchNums of the checkpoints, sorted. // If there's a gap between the list of checkpoints, an error is returned. -func (kvdb *KVDB) ListCheckpoints() ([]int, error) { - files, err := ioutil.ReadDir(kvdb.path) +func (k *KVDB) ListCheckpoints() ([]int, error) { + files, err := ioutil.ReadDir(k.cfg.Path) if err != nil { return nil, tracerr.Wrap(err) }@@ -450,12 +482,12 @@ checkpoints = append(checkpoints, checkpoint)
} } sort.Ints(checkpoints) - if len(checkpoints) > 0 { + if !k.cfg.NoGapsCheck && len(checkpoints) > 0 { first := checkpoints[0] for _, checkpoint := range checkpoints[1:] { first++ if checkpoint != first { - log.Errorw("GAP", "checkpoints", checkpoints) + log.Errorw("gap between checkpoints", "checkpoints", checkpoints) return nil, tracerr.Wrap(fmt.Errorf("checkpoint gap at %v", checkpoint)) } }@@ -465,14 +497,14 @@ }
// deleteOldCheckpoints deletes old checkpoints when there are more than // `s.keep` checkpoints -func (kvdb *KVDB) deleteOldCheckpoints() error { - list, err := kvdb.ListCheckpoints() +func (k *KVDB) deleteOldCheckpoints() error { + list, err := k.ListCheckpoints() if err != nil { return tracerr.Wrap(err) } - if len(list) > kvdb.keep { - for _, checkpoint := range list[:len(list)-kvdb.keep] { - if err := kvdb.DeleteCheckpoint(common.BatchNum(checkpoint)); err != nil { + if k.cfg.Keep > 0 && len(list) > k.cfg.Keep { + for _, checkpoint := range list[:len(list)-k.cfg.Keep] { + if err := k.DeleteCheckpoint(common.BatchNum(checkpoint)); err != nil { return tracerr.Wrap(err) } }@@ -483,8 +515,8 @@
// MakeCheckpointFromTo makes a checkpoint from the current db at fromBatchNum // to the dest folder. This method is locking, so it can be called from // multiple places at the same time. -func (kvdb *KVDB) MakeCheckpointFromTo(fromBatchNum common.BatchNum, dest string) error { - source := path.Join(kvdb.path, fmt.Sprintf("%s%d", PathBatchNum, fromBatchNum)) +func (k *KVDB) MakeCheckpointFromTo(fromBatchNum common.BatchNum, dest string) error { + source := path.Join(k.cfg.Path, fmt.Sprintf("%s%d", PathBatchNum, fromBatchNum)) if _, err := os.Stat(source); os.IsNotExist(err) { // if kvdb does not have checkpoint at batchNum, return err return tracerr.Wrap(fmt.Errorf("Checkpoint \"%v\" does not exist", source))@@ -494,8 +526,8 @@ // places at the same time for the same stateDB. This allows the
// synchronizer to do a reset to a batchNum at the same time as the // pipeline is doing a txSelector.Reset and batchBuilder.Reset from // synchronizer to the same batchNum - kvdb.m.Lock() - defer kvdb.m.Unlock() + k.m.Lock() + defer k.m.Unlock() return pebbleMakeCheckpoint(source, dest) }@@ -525,10 +557,12 @@ return nil
} // Close the DB -func (kvdb *KVDB) Close() { - if kvdb.db != nil { - kvdb.db.Close() - kvdb.db = nil +func (k *KVDB) Close() { + if k.db != nil { + k.db.Close() + k.db = nil } - kvdb.last.close() + if k.last != nil { + k.last.close() + } }
@@ -37,7 +37,7 @@ dir, err := ioutil.TempDir("", "sdb")
require.NoError(t, err) defer require.NoError(t, os.RemoveAll(dir)) - db, err := NewKVDB(dir, 128) + db, err := NewKVDB(Config{Path: dir, Keep: 128}) require.NoError(t, err) // add test key-values@@ -72,7 +72,7 @@ // 'BatchNum3', from where the 'current' is a copy)
err = db.Reset(3) require.NoError(t, err) - printCheckpoints(t, db.path) + printCheckpoints(t, db.cfg.Path) // check that currentBatch is as expected after Reset cb, err = db.GetCurrentBatch()@@ -99,7 +99,7 @@ // Create a new KVDB which will get Reset from the initial KVDB
dirLocal, err := ioutil.TempDir("", "ldb") require.NoError(t, err) defer require.NoError(t, os.RemoveAll(dirLocal)) - ldb, err := NewKVDB(dirLocal, 128) + ldb, err := NewKVDB(Config{Path: dirLocal, Keep: 128}) require.NoError(t, err) // get checkpoint 4 from sdb (StateDB) to ldb (LocalStateDB)@@ -120,7 +120,7 @@ // Create a 3rd KVDB which will get Reset from the initial KVDB
dirLocal2, err := ioutil.TempDir("", "ldb2") require.NoError(t, err) defer require.NoError(t, os.RemoveAll(dirLocal2)) - ldb2, err := NewKVDB(dirLocal2, 128) + ldb2, err := NewKVDB(Config{Path: dirLocal2, Keep: 128}) require.NoError(t, err) // get checkpoint 4 from sdb (StateDB) to ldb (LocalStateDB)@@ -139,9 +139,9 @@ assert.Equal(t, common.BatchNum(5), cb)
debug := false if debug { - printCheckpoints(t, db.path) - printCheckpoints(t, ldb.path) - printCheckpoints(t, ldb2.path) + printCheckpoints(t, db.cfg.Path) + printCheckpoints(t, ldb.cfg.Path) + printCheckpoints(t, ldb2.cfg.Path) } }@@ -150,7 +150,7 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer require.NoError(t, os.RemoveAll(dir)) - db, err := NewKVDB(dir, 128) + db, err := NewKVDB(Config{Path: dir, Keep: 128}) require.NoError(t, err) numCheckpoints := 16@@ -181,7 +181,7 @@ require.NoError(t, err)
defer require.NoError(t, os.RemoveAll(dir)) keep := 16 - db, err := NewKVDB(dir, keep) + db, err := NewKVDB(Config{Path: dir, Keep: keep}) require.NoError(t, err) numCheckpoints := 32@@ -202,7 +202,7 @@ require.NoError(t, err)
defer require.NoError(t, os.RemoveAll(dir)) keep := 16 - db, err := NewKVDB(dir, keep) + db, err := NewKVDB(Config{Path: dir, Keep: keep}) require.NoError(t, err) idx, err := db.GetCurrentIdx()@@ -211,7 +211,7 @@ assert.Equal(t, common.Idx(255), idx)
db.Close() - db, err = NewKVDB(dir, keep) + db, err = NewKVDB(Config{Path: dir, Keep: keep}) require.NoError(t, err) idx, err = db.GetCurrentIdx()@@ -227,7 +227,7 @@ assert.Equal(t, common.Idx(255), idx)
db.Close() - db, err = NewKVDB(dir, keep) + db, err = NewKVDB(Config{Path: dir, Keep: keep}) require.NoError(t, err) idx, err = db.GetCurrentIdx()
@@ -52,19 +52,40 @@ TypeTxSelector = "txselector"
// TypeBatchBuilder defines a StateDB used by the BatchBuilder, that // generates the ExitTree and the ZKInput when processing the txs TypeBatchBuilder = "batchbuilder" + // MaxNLevels is the maximum value of NLevels for the merkle tree, + // which comes from the fact that AccountIdx has 48 bits. + MaxNLevels = 48 ) // TypeStateDB determines the type of StateDB type TypeStateDB string +// Config of the StateDB +type Config struct { + // Path where the checkpoints will be stored + Path string + // Keep is the number of old checkpoints to keep. If 0, all + // checkpoints are kept. + Keep int + // NoLast skips having an opened DB with a checkpoint to the last + // batchNum for thread-safe reads. + NoLast bool + // Type of StateDB ( + Type TypeStateDB + // NLevels is the number of merkle tree levels in case the Type uses a + // merkle tree. If the Type doesn't use a merkle tree, NLevels should + // be 0. + NLevels int + // At every checkpoint, check that there are no gaps between the + // checkpoints + noGapsCheck bool +} + // StateDB represents the StateDB object type StateDB struct { - path string - Typ TypeStateDB - db *kvdb.KVDB - nLevels int - MT *merkletree.MerkleTree - keep int + cfg Config + db *kvdb.KVDB + MT *merkletree.MerkleTree } // Last offers a subset of view methods of the StateDB that can be@@ -104,36 +125,40 @@
// NewStateDB creates a new StateDB, allowing to use an in-memory or in-disk // storage. Checkpoints older than the value defined by `keep` will be // deleted. -func NewStateDB(pathDB string, keep int, typ TypeStateDB, nLevels int) (*StateDB, error) { +// func NewStateDB(pathDB string, keep int, typ TypeStateDB, nLevels int) (*StateDB, error) { +func NewStateDB(cfg Config) (*StateDB, error) { var kv *kvdb.KVDB var err error - kv, err = kvdb.NewKVDB(pathDB, keep) + kv, err = kvdb.NewKVDB(kvdb.Config{Path: cfg.Path, Keep: cfg.Keep, + NoGapsCheck: cfg.noGapsCheck, NoLast: cfg.NoLast}) if err != nil { return nil, tracerr.Wrap(err) } var mt *merkletree.MerkleTree = nil - if typ == TypeSynchronizer || typ == TypeBatchBuilder { - mt, err = merkletree.NewMerkleTree(kv.StorageWithPrefix(PrefixKeyMT), nLevels) + if cfg.Type == TypeSynchronizer || cfg.Type == TypeBatchBuilder { + mt, err = merkletree.NewMerkleTree(kv.StorageWithPrefix(PrefixKeyMT), cfg.NLevels) if err != nil { return nil, tracerr.Wrap(err) } } - if typ == TypeTxSelector && nLevels != 0 { + if cfg.Type == TypeTxSelector && cfg.NLevels != 0 { return nil, tracerr.Wrap(fmt.Errorf("invalid StateDB parameters: StateDB type==TypeStateDB can not have nLevels!=0")) } return &StateDB{ - path: pathDB, - db: kv, - nLevels: nLevels, - MT: mt, - Typ: typ, - keep: keep, + cfg: cfg, + db: kv, + MT: mt, }, nil } +// Type returns the StateDB configured Type +func (s *StateDB) Type() TypeStateDB { + return s.cfg.Type +} + // LastRead is a thread-safe method to query the last checkpoint of the StateDB // via the Last type methods func (s *StateDB) LastRead(fn func(sdbLast *Last) error) error {@@ -179,7 +204,7 @@ // checkpoint of the StateDB.
func (s *StateDB) LastMTGetRoot() (*big.Int, error) { var root *big.Int if err := s.LastRead(func(sdb *Last) error { - mt, err := merkletree.NewMerkleTree(sdb.DB().WithPrefix(PrefixKeyMT), s.nLevels) + mt, err := merkletree.NewMerkleTree(sdb.DB().WithPrefix(PrefixKeyMT), s.cfg.NLevels) if err != nil { return tracerr.Wrap(err) }@@ -195,7 +220,7 @@ // MakeCheckpoint does a checkpoint at the given batchNum in the defined path.
// Internally this advances & stores the current BatchNum, and then stores a // Checkpoint of the current state of the StateDB. func (s *StateDB) MakeCheckpoint() error { - log.Debugw("Making StateDB checkpoint", "batch", s.CurrentBatch()+1, "type", s.Typ) + log.Debugw("Making StateDB checkpoint", "batch", s.CurrentBatch()+1, "type", s.cfg.Type) return s.db.MakeCheckpoint() }@@ -230,7 +255,7 @@ // does not delete the checkpoints between old current and the new current,
// those checkpoints will remain in the storage, and eventually will be // deleted when MakeCheckpoint overwrites them. func (s *StateDB) Reset(batchNum common.BatchNum) error { - log.Debugw("Making StateDB Reset", "batch", batchNum, "type", s.Typ) + log.Debugw("Making StateDB Reset", "batch", batchNum, "type", s.cfg.Type) if err := s.db.Reset(batchNum); err != nil { return tracerr.Wrap(err) }@@ -460,9 +485,10 @@
// NewLocalStateDB returns a new LocalStateDB connected to the given // synchronizerDB. Checkpoints older than the value defined by `keep` will be // deleted. -func NewLocalStateDB(path string, keep int, synchronizerDB *StateDB, typ TypeStateDB, - nLevels int) (*LocalStateDB, error) { - s, err := NewStateDB(path, keep, typ, nLevels) +func NewLocalStateDB(cfg Config, synchronizerDB *StateDB) (*LocalStateDB, error) { + cfg.noGapsCheck = true + cfg.NoLast = true + s, err := NewStateDB(cfg) if err != nil { return nil, tracerr.Wrap(err) }
@@ -45,7 +45,7 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer require.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, 128, TypeTxSelector, 0) + sdb, err := NewStateDB(Config{Path: dir, Keep: 128, Type: TypeTxSelector, NLevels: 0}) require.NoError(t, err) // test values@@ -78,7 +78,7 @@ sdb.Close()
// call NewStateDB which should get the db at the last checkpoint state // executing a Reset (discarding the last 'testkey0'&'testvalue0' data) - sdb, err = NewStateDB(dir, 128, TypeTxSelector, 0) + sdb, err = NewStateDB(Config{Path: dir, Keep: 128, Type: TypeTxSelector, NLevels: 0}) require.NoError(t, err) v, err = sdb.db.DB().Get(k0) assert.NotNil(t, err)@@ -158,7 +158,7 @@ sdb.Close()
// call NewStateDB which should get the db at the last checkpoint state // executing a Reset (discarding the last 'testkey1'&'testvalue1' data) - sdb, err = NewStateDB(dir, 128, TypeTxSelector, 0) + sdb, err = NewStateDB(Config{Path: dir, Keep: 128, Type: TypeTxSelector, NLevels: 0}) require.NoError(t, err) bn, err = sdb.getCurrentBatch()@@ -182,7 +182,7 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer require.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, 128, TypeTxSelector, 0) + sdb, err := NewStateDB(Config{Path: dir, Keep: 128, Type: TypeTxSelector, NLevels: 0}) require.NoError(t, err) // create test accounts@@ -236,7 +236,7 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer require.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, 128, TypeSynchronizer, 32) + sdb, err := NewStateDB(Config{Path: dir, Keep: 128, Type: TypeSynchronizer, NLevels: 32}) require.NoError(t, err) // create test accounts@@ -290,7 +290,7 @@ dir, err := ioutil.TempDir("", "sdb")
require.NoError(t, err) defer require.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, 128, TypeSynchronizer, 32) + sdb, err := NewStateDB(Config{Path: dir, Keep: 128, Type: TypeSynchronizer, NLevels: 32}) require.NoError(t, err) err = sdb.Reset(0)@@ -335,7 +335,7 @@ require.NoError(t, err)
assert.Equal(t, common.BatchNum(i+1), cb) } - // printCheckpoints(t, sdb.path) + // printCheckpoints(t, sdb.cfg.Path) // reset checkpoint err = sdb.Reset(3)@@ -371,7 +371,7 @@ // Create a LocalStateDB from the initial StateDB
dirLocal, err := ioutil.TempDir("", "ldb") require.NoError(t, err) defer require.NoError(t, os.RemoveAll(dirLocal)) - ldb, err := NewLocalStateDB(dirLocal, 128, sdb, TypeBatchBuilder, 32) + ldb, err := NewLocalStateDB(Config{Path: dirLocal, Keep: 128, Type: TypeBatchBuilder, NLevels: 32}, sdb) require.NoError(t, err) // get checkpoint 4 from sdb (StateDB) to ldb (LocalStateDB)@@ -392,7 +392,7 @@ // Create a 2nd LocalStateDB from the initial StateDB
dirLocal2, err := ioutil.TempDir("", "ldb2") require.NoError(t, err) defer require.NoError(t, os.RemoveAll(dirLocal2)) - ldb2, err := NewLocalStateDB(dirLocal2, 128, sdb, TypeBatchBuilder, 32) + ldb2, err := NewLocalStateDB(Config{Path: dirLocal2, Keep: 128, Type: TypeBatchBuilder, NLevels: 32}, sdb) require.NoError(t, err) // get checkpoint 4 from sdb (StateDB) to ldb (LocalStateDB)@@ -409,9 +409,9 @@ assert.Equal(t, common.BatchNum(5), cb)
debug := false if debug { - printCheckpoints(t, sdb.path) - printCheckpoints(t, ldb.path) - printCheckpoints(t, ldb2.path) + printCheckpoints(t, sdb.cfg.Path) + printCheckpoints(t, ldb.cfg.Path) + printCheckpoints(t, ldb2.cfg.Path) } }@@ -419,7 +419,7 @@ func TestStateDBGetAccounts(t *testing.T) {
dir, err := ioutil.TempDir("", "tmpdb") require.NoError(t, err) - sdb, err := NewStateDB(dir, 128, TypeTxSelector, 0) + sdb, err := NewStateDB(Config{Path: dir, Keep: 128, Type: TypeTxSelector, NLevels: 0}) require.NoError(t, err) // create test accounts@@ -466,7 +466,7 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer require.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, 128, TypeSynchronizer, 32) + sdb, err := NewStateDB(Config{Path: dir, Keep: 128, Type: TypeSynchronizer, NLevels: 32}) require.NoError(t, err) ay0 := new(big.Int).Sub(new(big.Int).Exp(big.NewInt(2), big.NewInt(253), nil), big.NewInt(1))@@ -540,7 +540,7 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer require.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, 128, TypeSynchronizer, 32) + sdb, err := NewStateDB(Config{Path: dir, Keep: 128, Type: TypeSynchronizer, NLevels: 32}) require.NoError(t, err) numCheckpoints := 16@@ -573,7 +573,7 @@ require.NoError(t, err)
defer require.NoError(t, os.RemoveAll(dir)) keep := 16 - sdb, err := NewStateDB(dir, keep, TypeSynchronizer, 32) + sdb, err := NewStateDB(Config{Path: dir, Keep: keep, Type: TypeSynchronizer, NLevels: 32}) require.NoError(t, err) numCheckpoints := 32@@ -594,7 +594,7 @@ require.NoError(t, err)
defer require.NoError(t, os.RemoveAll(dir)) keep := 16 - sdb, err := NewStateDB(dir, keep, TypeSynchronizer, 32) + sdb, err := NewStateDB(Config{Path: dir, Keep: keep, Type: TypeSynchronizer, NLevels: 32}) require.NoError(t, err) idx := sdb.CurrentIdx()@@ -602,7 +602,7 @@ assert.Equal(t, common.Idx(255), idx)
sdb.Close() - sdb, err = NewStateDB(dir, keep, TypeSynchronizer, 32) + sdb, err = NewStateDB(Config{Path: dir, Keep: keep, Type: TypeSynchronizer, NLevels: 32}) require.NoError(t, err) idx = sdb.CurrentIdx()@@ -616,7 +616,7 @@ assert.Equal(t, common.Idx(255), idx)
sdb.Close() - sdb, err = NewStateDB(dir, keep, TypeSynchronizer, 32) + sdb, err = NewStateDB(Config{Path: dir, Keep: keep, Type: TypeSynchronizer, NLevels: 32}) require.NoError(t, err) idx = sdb.CurrentIdx()@@ -629,7 +629,7 @@ require.NoError(t, err)
defer require.NoError(t, os.RemoveAll(dir)) keep := 16 - sdb, err := NewStateDB(dir, keep, TypeSynchronizer, 32) + sdb, err := NewStateDB(Config{Path: dir, Keep: keep, Type: TypeSynchronizer, NLevels: 32}) require.NoError(t, err) err = sdb.MakeCheckpoint()
@@ -18,7 +18,7 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := NewStateDB(dir, 128, TypeTxSelector, 0) + sdb, err := NewStateDB(Config{Path: dir, Keep: 128, Type: TypeTxSelector, NLevels: 0}) assert.NoError(t, err) var sk babyjub.PrivateKey
@@ -164,8 +164,12 @@ if cfg.StateDB.Keep < safeStateDBKeep {
return nil, tracerr.Wrap(fmt.Errorf("cfg.StateDB.Keep = %v < %v, which is unsafe", cfg.StateDB.Keep, safeStateDBKeep)) } - stateDB, err := statedb.NewStateDB(cfg.StateDB.Path, cfg.StateDB.Keep, - statedb.TypeSynchronizer, 32) + stateDB, err := statedb.NewStateDB(statedb.Config{ + Path: cfg.StateDB.Path, + Keep: cfg.StateDB.Keep, + Type: statedb.TypeSynchronizer, + NLevels: statedb.MaxNLevels, + }) if err != nil { return nil, tracerr.Wrap(err) }
@@ -307,7 +307,7 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) deleteme = append(deleteme, dir) - stateDB, err := statedb.NewStateDB(dir, 128, statedb.TypeSynchronizer, 32) + stateDB, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, Type: statedb.TypeSynchronizer, NLevels: 32}) require.NoError(t, err) // Init History DB
@@ -44,7 +44,7 @@ func TestDebugAPI(t *testing.T) {
dir, err := ioutil.TempDir("", "tmpdb") require.Nil(t, err) - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeSynchronizer, 32) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, Type: statedb.TypeSynchronizer, NLevels: 32}) require.Nil(t, err) err = sdb.MakeCheckpoint() // Make a checkpoint to increment the batchNum require.Nil(t, err)
@@ -80,7 +80,8 @@
dir, err := ioutil.TempDir("", "tmpSyncDB") require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - syncStateDB, err := statedb.NewStateDB(dir, 128, statedb.TypeSynchronizer, 0) + syncStateDB, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeSynchronizer, NLevels: 0}) require.NoError(t, err) txselDir, err := ioutil.TempDir("", "tmpTxSelDB")
@@ -50,7 +50,7 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.Nil(t, os.RemoveAll(dir)) - sdb, err := statedb.NewStateDB(dir, 128, typ, NLevels) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, Type: typ, NLevels: NLevels}) require.NoError(t, err) return sdb }
@@ -127,7 +127,7 @@ }
exits := make([]processedExit, nTx) - if tp.s.Typ == statedb.TypeBatchBuilder { + if tp.s.Type() == statedb.TypeBatchBuilder { tp.zki = common.NewZKInputs(tp.config.ChainID, tp.config.MaxTx, tp.config.MaxL1Tx, tp.config.MaxFeeTx, tp.config.NLevels, (tp.s.CurrentBatch() + 1).BigInt()) tp.zki.OldLastIdx = tp.s.CurrentIdx().BigInt()@@ -137,7 +137,7 @@ }
// TBD if ExitTree is only in memory or stored in disk, for the moment // is only needed in memory - if tp.s.Typ == statedb.TypeSynchronizer || tp.s.Typ == statedb.TypeBatchBuilder { + if tp.s.Type() == statedb.TypeSynchronizer || tp.s.Type() == statedb.TypeBatchBuilder { tmpDir, err := ioutil.TempDir("", "hermez-statedb-exittree") if err != nil { return nil, tracerr.Wrap(err)@@ -166,7 +166,7 @@ &l1usertxs[i])
if err != nil { return nil, tracerr.Wrap(err) } - if tp.s.Typ == statedb.TypeSynchronizer { + if tp.s.Type() == statedb.TypeSynchronizer { if createdAccount != nil { createdAccounts = append(createdAccounts, *createdAccount) l1usertxs[i].EffectiveFromIdx = createdAccount.Idx@@ -195,7 +195,7 @@ if exitIdx == nil {
tp.zki.ISExitRoot[tp.i] = exitTree.Root().BigInt() } } - if tp.s.Typ == statedb.TypeSynchronizer || tp.s.Typ == statedb.TypeBatchBuilder { + if tp.s.Type() == statedb.TypeSynchronizer || tp.s.Type() == statedb.TypeBatchBuilder { if exitIdx != nil && exitTree != nil { exits[tp.i] = processedExit{ exit: true,@@ -217,7 +217,7 @@ }
if exitIdx != nil { log.Error("Unexpected Exit in L1CoordinatorTx") } - if tp.s.Typ == statedb.TypeSynchronizer { + if tp.s.Type() == statedb.TypeSynchronizer { if createdAccount != nil { createdAccounts = append(createdAccounts, *createdAccount) l1coordinatortxs[i].EffectiveFromIdx = createdAccount.Idx@@ -276,7 +276,7 @@ }
// collectedFees will contain the amount of fee collected for each // TokenID var collectedFees map[common.TokenID]*big.Int - if tp.s.Typ == statedb.TypeSynchronizer || tp.s.Typ == statedb.TypeBatchBuilder { + if tp.s.Type() == statedb.TypeSynchronizer || tp.s.Type() == statedb.TypeBatchBuilder { collectedFees = make(map[common.TokenID]*big.Int) for tokenID := range coordIdxsMap { collectedFees[tokenID] = big.NewInt(0)@@ -317,7 +317,7 @@ tp.zki.ISExitRoot[tp.i] = exitTree.Root().BigInt()
} } } - if tp.s.Typ == statedb.TypeSynchronizer || tp.s.Typ == statedb.TypeBatchBuilder { + if tp.s.Type() == statedb.TypeSynchronizer || tp.s.Type() == statedb.TypeBatchBuilder { if exitIdx != nil && exitTree != nil { exits[tp.i] = processedExit{ exit: true,@@ -401,7 +401,7 @@ tp.zki.FeeIdxs[i] = coordIdxs[i].BigInt()
} } - if tp.s.Typ == statedb.TypeTxSelector { + if tp.s.Type() == statedb.TypeTxSelector { return nil, nil }@@ -436,8 +436,8 @@ *prevExit = ei
} } - if tp.s.Typ == statedb.TypeSynchronizer { - // return exitInfos, createdAccounts and collectedFees, so Synchronizer will + if tp.s.Type() == statedb.TypeSynchronizer { + // retuTypeexitInfos, createdAccounts and collectedFees, so Synchronizer will // be able to store it into HistoryDB for the concrete BatchNum return &ProcessTxOutput{ ZKInputs: nil,@@ -588,7 +588,7 @@ default:
} var createdAccount *common.Account - if tp.s.Typ == statedb.TypeSynchronizer && + if tp.s.Type() == statedb.TypeSynchronizer && (tx.Type == common.TxTypeCreateAccountDeposit || tx.Type == common.TxTypeCreateAccountDepositTransfer) { var err error@@ -612,8 +612,8 @@ tx *common.PoolL2Tx) (*common.Idx, *common.Account, bool, error) {
var err error // if tx.ToIdx==0, get toIdx by ToEthAddr or ToBJJ if tx.ToIdx == common.Idx(0) && tx.AuxToIdx == common.Idx(0) { - if tp.s.Typ == statedb.TypeSynchronizer { - // this should never be reached + if tp.s.Type() == statedb.TypeSynchronizer { + // thisTypeould never be reached log.Error("WARNING: In StateDB with Synchronizer mode L2.ToIdx can't be 0") return nil, nil, false, tracerr.Wrap(fmt.Errorf("In StateDB with Synchronizer mode L2.ToIdx can't be 0")) }@@ -676,8 +676,8 @@ tp.zki.R8y[tp.i] = signature.R8.Y
} // if StateDB type==TypeSynchronizer, will need to add Nonce - if tp.s.Typ == statedb.TypeSynchronizer { - // as type==TypeSynchronizer, always tx.ToIdx!=0 + if tp.s.Type() == statedb.TypeSynchronizer { + // as tType==TypeSynchronizer, always tx.ToIdx!=0 acc, err := tp.s.GetAccount(tx.FromIdx) if err != nil { log.Errorw("GetAccount", "fromIdx", tx.FromIdx, "err", err)@@ -889,8 +889,8 @@ // accumulate the fee for the Coord account
accumulated := tp.AccumulatedFees[accCoord.Idx] accumulated.Add(accumulated, fee) - if tp.s.Typ == statedb.TypeSynchronizer || - tp.s.Typ == statedb.TypeBatchBuilder { + if tp.s.Type() == statedb.TypeSynchronizer || + tp.s.Type() == statedb.TypeBatchBuilder { collected := collectedFees[accCoord.TokenID] collected.Add(collected, fee) }@@ -1094,8 +1094,8 @@ // accumulate the fee for the Coord account
accumulated := tp.AccumulatedFees[accCoord.Idx] accumulated.Add(accumulated, fee) - if tp.s.Typ == statedb.TypeSynchronizer || - tp.s.Typ == statedb.TypeBatchBuilder { + if tp.s.Type() == statedb.TypeSynchronizer || + tp.s.Type() == statedb.TypeBatchBuilder { collected := collectedFees[accCoord.TokenID] collected.Add(collected, fee) }
@@ -36,7 +36,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeSynchronizer, 32) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeSynchronizer, NLevels: 32}) assert.NoError(t, err) set := `@@ -212,7 +213,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeSynchronizer, 32) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeSynchronizer, NLevels: 32}) assert.NoError(t, err) chainID := uint16(0)@@ -358,7 +360,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeSynchronizer, 32) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeSynchronizer, NLevels: 32}) assert.NoError(t, err) chainID := uint16(0)@@ -489,7 +492,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeBatchBuilder, 32) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeBatchBuilder, NLevels: 32}) assert.NoError(t, err) chainID := uint16(0)@@ -580,7 +584,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeBatchBuilder, 32) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeBatchBuilder, NLevels: 32}) assert.NoError(t, err) // same values than in the js test@@ -631,7 +636,8 @@ require.NoError(t, err)
defer assert.NoError(t, os.RemoveAll(dir)) nLevels := 16 - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeBatchBuilder, nLevels) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeBatchBuilder, NLevels: nLevels}) assert.NoError(t, err) users := txsets.GenerateJsUsers(t)@@ -700,7 +706,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeBatchBuilder, 32) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeBatchBuilder, NLevels: 32}) assert.NoError(t, err) chainID := uint16(1)@@ -798,7 +805,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeSynchronizer, 32) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeSynchronizer, NLevels: 32}) assert.NoError(t, err) chainID := uint16(1)@@ -865,7 +873,8 @@ dir2, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir2)) - sdb2, err := statedb.NewStateDB(dir2, 128, statedb.TypeSynchronizer, 32) + sdb2, err := statedb.NewStateDB(statedb.Config{Path: dir2, Keep: 128, + Type: statedb.TypeSynchronizer, NLevels: 32}) assert.NoError(t, err) tc = til.NewContext(chainID, common.RollupConstMaxL1UserTx)
@@ -41,7 +41,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.Nil(t, os.RemoveAll(dir)) - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeBatchBuilder, 32) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeBatchBuilder, NLevels: 32}) require.NoError(t, err) chainID := uint16(0)@@ -90,7 +91,8 @@ dir, err := ioutil.TempDir("", "tmpdb")
require.NoError(t, err) defer assert.Nil(t, os.RemoveAll(dir)) - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeBatchBuilder, 32) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeBatchBuilder, NLevels: 32}) require.NoError(t, err) chainID := uint16(0)@@ -149,7 +151,8 @@ defer assert.Nil(t, os.RemoveAll(dir))
nLevels := 16 - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeBatchBuilder, nLevels) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeBatchBuilder, NLevels: nLevels}) require.NoError(t, err) chainID := uint16(0)@@ -266,7 +269,8 @@ require.NoError(t, err)
defer assert.Nil(t, os.RemoveAll(dir)) nLevels := 16 - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeBatchBuilder, nLevels) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeBatchBuilder, NLevels: nLevels}) require.NoError(t, err) chainID := uint16(0)@@ -322,7 +326,8 @@ require.NoError(t, err)
defer assert.Nil(t, os.RemoveAll(dir)) nLevels := 16 - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeBatchBuilder, nLevels) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeBatchBuilder, NLevels: nLevels}) require.NoError(t, err) chainID := uint16(0)@@ -385,7 +390,8 @@ require.NoError(t, err)
defer assert.Nil(t, os.RemoveAll(dir)) nLevels := 16 - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeBatchBuilder, nLevels) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeBatchBuilder, NLevels: nLevels}) require.NoError(t, err) chainID := uint16(0)@@ -456,7 +462,8 @@ require.NoError(t, err)
defer assert.Nil(t, os.RemoveAll(dir)) nLevels := 16 - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeBatchBuilder, nLevels) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeBatchBuilder, NLevels: nLevels}) require.NoError(t, err) chainID := uint16(0)@@ -527,7 +534,8 @@ require.NoError(t, err)
defer assert.Nil(t, os.RemoveAll(dir)) nLevels := 16 - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeBatchBuilder, nLevels) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeBatchBuilder, NLevels: nLevels}) require.NoError(t, err) chainID := uint16(0)@@ -598,7 +606,8 @@ require.NoError(t, err)
defer assert.Nil(t, os.RemoveAll(dir)) nLevels := 16 - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeBatchBuilder, nLevels) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeBatchBuilder, NLevels: nLevels}) require.NoError(t, err) chainID := uint16(0)@@ -661,7 +670,8 @@ require.NoError(t, err)
defer assert.Nil(t, os.RemoveAll(dir)) nLevels := 16 - sdb, err := statedb.NewStateDB(dir, 128, statedb.TypeBatchBuilder, nLevels) + sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeBatchBuilder, NLevels: nLevels}) require.NoError(t, err) chainID := uint16(0)
@@ -10,6 +10,7 @@ "sort"
ethCommon "github.com/ethereum/go-ethereum/common" "github.com/hermeznetwork/hermez-node/common" + "github.com/hermeznetwork/hermez-node/db/kvdb" "github.com/hermeznetwork/hermez-node/db/l2db" "github.com/hermeznetwork/hermez-node/db/statedb" "github.com/hermeznetwork/hermez-node/log"@@ -62,8 +63,14 @@
// NewTxSelector returns a *TxSelector func NewTxSelector(coordAccount *CoordAccount, dbpath string, synchronizerStateDB *statedb.StateDB, l2 *l2db.L2DB) (*TxSelector, error) { - localAccountsDB, err := statedb.NewLocalStateDB(dbpath, 128, - synchronizerStateDB, statedb.TypeTxSelector, 0) // without merkletree + localAccountsDB, err := statedb.NewLocalStateDB( + statedb.Config{ + Path: dbpath, + Keep: kvdb.DefaultKeep, + Type: statedb.TypeTxSelector, + NLevels: 0, + }, + synchronizerStateDB) // without merkletree if err != nil { return nil, tracerr.Wrap(err) }
@@ -34,7 +34,8 @@
dir, err := ioutil.TempDir("", "tmpdb") require.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) - syncStateDB, err := statedb.NewStateDB(dir, 128, statedb.TypeTxSelector, 0) + syncStateDB, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, + Type: statedb.TypeTxSelector, NLevels: 0}) require.NoError(t, err) txselDir, err := ioutil.TempDir("", "tmpTxSelDB")