From 0a3d9c6d1c80ab3271f550b0b4568f1342f87dc6 Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Tue, 15 Apr 2025 22:44:04 +0200 Subject: [PATCH] BadgerDB: periodically perform garbage collection (#307) * BadgerDB: periodically perform garbage collection * GC every hour --- .../controller/store/badger/badger_store.go | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/internal/controller/store/badger/badger_store.go b/internal/controller/store/badger/badger_store.go index e1ab0d6..41f07af 100644 --- a/internal/controller/store/badger/badger_store.go +++ b/internal/controller/store/badger/badger_store.go @@ -7,6 +7,7 @@ import ( "github.com/cirruslabs/orchard/internal/controller/store" "github.com/dgraph-io/badger/v3" "go.uber.org/zap" + "time" ) type Store struct { @@ -29,9 +30,38 @@ func NewBadgerStore(dbPath string, logger *zap.SugaredLogger) (store.Store, erro return nil, err } - return &Store{ + store := &Store{ db: db, - }, nil + } + + // Perform garbage collection periodically, as recommended in the documentation[1] + // + // [1]: https://docs.hypermode.com/badger/quickstart#garbage-collection + go func() { + for { + if err := store.performGarbageCollection(); err != nil { + logger.Errorf("garbage collection failed: %v", err) + } + + <-time.After(1 * time.Hour) + } + }() + + return store, nil +} + +func (store *Store) performGarbageCollection() error { + // RunValueLogGC() needs to be invoked multiple times + for { + if err := store.db.RunValueLogGC(0.5); err != nil { + // Nothing to rewrite, stop + if errors.Is(err, badger.ErrNoRewrite) { + return nil + } + + return err + } + } } func (store *Store) View(cb func(txn store.Transaction) error) error {