Add DB compaction following the deletion of a DB prefix (#2003)

This commit is contained in:
Michael Sutton
2022-04-03 19:08:32 +03:00
committed by GitHub
parent ab73def07a
commit ca5c8549b9
4 changed files with 21 additions and 5 deletions

View File

@@ -935,7 +935,7 @@ func (pm *pruningManager) PruningPointAndItsAnticone() ([]*externalapi.DomainHas
return nil, err return nil, err
} }
// By the Prunality proof, The pruning point anticone is a closed set (i.e., guaranteed not to change) , // By the Prunality proof, the pruning point anticone is a closed set (i.e., guaranteed not to change) ,
// so we can safely cache it. // so we can safely cache it.
if pm.cachedPruningPoint != nil && pm.cachedPruningPoint.Equal(pruningPoint) { if pm.cachedPruningPoint != nil && pm.cachedPruningPoint.Equal(pruningPoint) {
return append([]*externalapi.DomainHash{pruningPoint}, pm.cachedPruningPointAnticone...), nil return append([]*externalapi.DomainHash{pruningPoint}, pm.cachedPruningPointAnticone...), nil

View File

@@ -47,8 +47,8 @@ func InactivePrefix(dataAccessor database.DataAccessor) (*prefix.Prefix, bool, e
} }
// DeleteInactivePrefix deletes all data associated with the inactive database prefix, including itself. // DeleteInactivePrefix deletes all data associated with the inactive database prefix, including itself.
func DeleteInactivePrefix(dataAccessor database.DataAccessor) error { func DeleteInactivePrefix(db database.Database) error {
prefixBytes, err := dataAccessor.Get(inactivePrefixKey) prefixBytes, err := db.Get(inactivePrefixKey)
if database.IsNotFoundError(err) { if database.IsNotFoundError(err) {
return nil return nil
} }
@@ -62,12 +62,18 @@ func DeleteInactivePrefix(dataAccessor database.DataAccessor) error {
return err return err
} }
err = deletePrefix(dataAccessor, prefix) err = deletePrefix(db, prefix)
if err != nil { if err != nil {
return err return err
} }
return dataAccessor.Delete(inactivePrefixKey) err = db.Delete(inactivePrefixKey)
if err != nil {
return err
}
log.Infof("Compacting database after prefix delete")
return db.Compact()
} }
func deletePrefix(dataAccessor database.DataAccessor, prefix *prefix.Prefix) error { func deletePrefix(dataAccessor database.DataAccessor, prefix *prefix.Prefix) error {

View File

@@ -14,6 +14,9 @@ type Database interface {
// Begin begins a new database transaction. // Begin begins a new database transaction.
Begin() (Transaction, error) Begin() (Transaction, error)
// Compact compacts the database instance.
Compact() error
// Close closes the database. // Close closes the database.
Close() error Close() error
} }

View File

@@ -6,6 +6,7 @@ import (
"github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb"
ldbErrors "github.com/syndtr/goleveldb/leveldb/errors" ldbErrors "github.com/syndtr/goleveldb/leveldb/errors"
"github.com/syndtr/goleveldb/leveldb/opt" "github.com/syndtr/goleveldb/leveldb/opt"
"github.com/syndtr/goleveldb/leveldb/util"
) )
// LevelDB defines a thin wrapper around leveldb. // LevelDB defines a thin wrapper around leveldb.
@@ -47,6 +48,12 @@ func NewLevelDB(path string, cacheSizeMiB int) (*LevelDB, error) {
return db, nil return db, nil
} }
// Compact compacts the leveldb instance.
func (db *LevelDB) Compact() error {
err := db.ldb.CompactRange(util.Range{Start: nil, Limit: nil})
return errors.WithStack(err)
}
// Close closes the leveldb instance. // Close closes the leveldb instance.
func (db *LevelDB) Close() error { func (db *LevelDB) Close() error {
err := db.ldb.Close() err := db.ldb.Close()