mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2025-01-03 00:27:38 +00:00
db: clear blobs when using --clear-db or --force-clear-db (#13605)
* Call Close() as part of ClearDB * Add method to clear blob storage * Clear blob storage when clearing DB
This commit is contained in:
parent
5df8b83a05
commit
03068ba781
@ -228,6 +228,20 @@ func (bs *BlobStorage) Indices(root [32]byte) ([fieldparams.MaxBlobsPerBlock]boo
|
|||||||
return mask, nil
|
return mask, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clear deletes all files on the filesystem.
|
||||||
|
func (bs *BlobStorage) Clear() error {
|
||||||
|
dirs, err := listDir(bs.fs, ".")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, dir := range dirs {
|
||||||
|
if err := bs.fs.RemoveAll(dir); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
type blobNamer struct {
|
type blobNamer struct {
|
||||||
root [32]byte
|
root [32]byte
|
||||||
index uint64
|
index uint64
|
||||||
|
@ -88,6 +88,19 @@ func TestBlobStorage_SaveBlobData(t *testing.T) {
|
|||||||
_, err = bs.Get(expected.BlockRoot(), expected.Index)
|
_, err = bs.Get(expected.BlockRoot(), expected.Index)
|
||||||
require.ErrorContains(t, "file does not exist", err)
|
require.ErrorContains(t, "file does not exist", err)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("clear", func(t *testing.T) {
|
||||||
|
blob := testSidecars[0]
|
||||||
|
b := NewEphemeralBlobStorage(t)
|
||||||
|
require.NoError(t, b.Save(blob))
|
||||||
|
res, err := b.Get(blob.BlockRoot(), blob.Index)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, res)
|
||||||
|
require.NoError(t, b.Clear())
|
||||||
|
// After clearing, the blob should not exist in the db.
|
||||||
|
_, err = b.Get(blob.BlockRoot(), blob.Index)
|
||||||
|
require.ErrorIs(t, err, os.ErrNotExist)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// pollUntil polls a condition function until it returns true or a timeout is reached.
|
// pollUntil polls a condition function until it returns true or a timeout is reached.
|
||||||
|
@ -213,6 +213,9 @@ func NewKVStore(ctx context.Context, dirPath string, opts ...KVStoreOption) (*St
|
|||||||
|
|
||||||
// ClearDB removes the previously stored database in the data directory.
|
// ClearDB removes the previously stored database in the data directory.
|
||||||
func (s *Store) ClearDB() error {
|
func (s *Store) ClearDB() error {
|
||||||
|
if err := s.Close(); err != nil {
|
||||||
|
return fmt.Errorf("failed to close db: %w", err)
|
||||||
|
}
|
||||||
if _, err := os.Stat(s.databasePath); os.IsNotExist(err) {
|
if _, err := os.Stat(s.databasePath); os.IsNotExist(err) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ package slasherkv
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"time"
|
"time"
|
||||||
@ -87,6 +88,9 @@ func NewKVStore(ctx context.Context, dirPath string) (*Store, error) {
|
|||||||
|
|
||||||
// ClearDB removes the previously stored database in the data directory.
|
// ClearDB removes the previously stored database in the data directory.
|
||||||
func (s *Store) ClearDB() error {
|
func (s *Store) ClearDB() error {
|
||||||
|
if err := s.Close(); err != nil {
|
||||||
|
return fmt.Errorf("failed to close db: %w", err)
|
||||||
|
}
|
||||||
if _, err := os.Stat(s.databasePath); os.IsNotExist(err) {
|
if _, err := os.Stat(s.databasePath); os.IsNotExist(err) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -427,13 +427,12 @@ func (b *BeaconNode) startDB(cliCtx *cli.Context, depositAddress string) error {
|
|||||||
}
|
}
|
||||||
if clearDBConfirmed || forceClearDB {
|
if clearDBConfirmed || forceClearDB {
|
||||||
log.Warning("Removing database")
|
log.Warning("Removing database")
|
||||||
if err := d.Close(); err != nil {
|
|
||||||
return errors.Wrap(err, "could not close db prior to clearing")
|
|
||||||
}
|
|
||||||
if err := d.ClearDB(); err != nil {
|
if err := d.ClearDB(); err != nil {
|
||||||
return errors.Wrap(err, "could not clear database")
|
return errors.Wrap(err, "could not clear database")
|
||||||
}
|
}
|
||||||
|
if err := b.BlobStorage.Clear(); err != nil {
|
||||||
|
return errors.Wrap(err, "could not clear blob storage")
|
||||||
|
}
|
||||||
d, err = kv.NewKVStore(b.ctx, dbPath)
|
d, err = kv.NewKVStore(b.ctx, dbPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "could not create new database")
|
return errors.Wrap(err, "could not create new database")
|
||||||
@ -531,12 +530,12 @@ func (b *BeaconNode) startSlasherDB(cliCtx *cli.Context) error {
|
|||||||
}
|
}
|
||||||
if clearDBConfirmed || forceClearDB {
|
if clearDBConfirmed || forceClearDB {
|
||||||
log.Warning("Removing database")
|
log.Warning("Removing database")
|
||||||
if err := d.Close(); err != nil {
|
|
||||||
return errors.Wrap(err, "could not close db prior to clearing")
|
|
||||||
}
|
|
||||||
if err := d.ClearDB(); err != nil {
|
if err := d.ClearDB(); err != nil {
|
||||||
return errors.Wrap(err, "could not clear database")
|
return errors.Wrap(err, "could not clear database")
|
||||||
}
|
}
|
||||||
|
if err := b.BlobStorage.Clear(); err != nil {
|
||||||
|
return errors.Wrap(err, "could not clear blob storage")
|
||||||
|
}
|
||||||
d, err = slasherkv.NewKVStore(b.ctx, dbPath)
|
d, err = slasherkv.NewKVStore(b.ctx, dbPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "could not create new database")
|
return errors.Wrap(err, "could not create new database")
|
||||||
|
@ -3,6 +3,7 @@ package kv
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"time"
|
"time"
|
||||||
@ -84,10 +85,12 @@ func (s *Store) view(fn func(*bolt.Tx) error) error {
|
|||||||
|
|
||||||
// ClearDB removes any previously stored data at the configured data directory.
|
// ClearDB removes any previously stored data at the configured data directory.
|
||||||
func (s *Store) ClearDB() error {
|
func (s *Store) ClearDB() error {
|
||||||
|
if err := s.Close(); err != nil {
|
||||||
|
return fmt.Errorf("failed to close db: %w", err)
|
||||||
|
}
|
||||||
if _, err := os.Stat(s.databasePath); os.IsNotExist(err) {
|
if _, err := os.Stat(s.databasePath); os.IsNotExist(err) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
prometheus.Unregister(createBoltCollector(s.db))
|
|
||||||
return os.Remove(filepath.Join(s.databasePath, ProtectionDbFileName))
|
return os.Remove(filepath.Join(s.databasePath, ProtectionDbFileName))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,9 +18,6 @@ func SetupDB(t testing.TB, pubkeys [][fieldparams.BLSPubkeyLength]byte) iface.Va
|
|||||||
t.Fatalf("Failed to instantiate DB: %v", err)
|
t.Fatalf("Failed to instantiate DB: %v", err)
|
||||||
}
|
}
|
||||||
t.Cleanup(func() {
|
t.Cleanup(func() {
|
||||||
if err := db.Close(); err != nil {
|
|
||||||
t.Fatalf("Failed to close database: %v", err)
|
|
||||||
}
|
|
||||||
if err := db.ClearDB(); err != nil {
|
if err := db.ClearDB(); err != nil {
|
||||||
t.Fatalf("Failed to clear database: %v", err)
|
t.Fatalf("Failed to clear database: %v", err)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user