Merge pull request #5778 from filecoin-project/feat/splitstore-compact-hotstore

splitstore: compact hotstore prior to garbage collection
This commit is contained in:
Łukasz Magiera 2021-03-12 16:30:05 +01:00 committed by GitHub
commit c69b26cfc6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 2 deletions

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"io" "io"
"runtime"
"sync/atomic" "sync/atomic"
"github.com/dgraph-io/badger/v2" "github.com/dgraph-io/badger/v2"
@ -150,6 +151,20 @@ func (b *Blockstore) CollectGarbage() error {
return err return err
} }
// Compact runs a synchronous compaction
func (b *Blockstore) Compact() error {
if atomic.LoadInt64(&b.state) != stateOpen {
return ErrBlockstoreClosed
}
nworkers := runtime.NumCPU() / 2
if nworkers < 2 {
nworkers = 2
}
return b.DB.Flatten(nworkers)
}
// View implements blockstore.Viewer, which leverages zero-copy read-only // View implements blockstore.Viewer, which leverages zero-copy read-only
// access to values. // access to values.
func (b *Blockstore) View(cid cid.Cid, fn func([]byte) error) error { func (b *Blockstore) View(cid cid.Cid, fn func([]byte) error) error {

View File

@ -798,15 +798,26 @@ func (s *SplitStore) purgeTracking(cids []cid.Cid) error {
} }
func (s *SplitStore) gcHotstore() { func (s *SplitStore) gcHotstore() {
if compact, ok := s.hot.(interface{ Compact() error }); ok {
log.Infof("compacting hotstore")
startCompact := time.Now()
err := compact.Compact()
if err != nil {
log.Warnf("error compacting hotstore: %s", err)
return
}
log.Infow("hotstore compaction done", "took", time.Since(startCompact))
}
if gc, ok := s.hot.(interface{ CollectGarbage() error }); ok { if gc, ok := s.hot.(interface{ CollectGarbage() error }); ok {
log.Infof("garbage collecting hotstore") log.Infof("garbage collecting hotstore")
startGC := time.Now() startGC := time.Now()
err := gc.CollectGarbage() err := gc.CollectGarbage()
if err != nil { if err != nil {
log.Warnf("error garbage collecting hotstore: %s", err) log.Warnf("error garbage collecting hotstore: %s", err)
} else { return
log.Infow("garbage collection done", "took", time.Since(startGC))
} }
log.Infow("hotstore garbage collection done", "took", time.Since(startGC))
} }
} }