diff --git a/internal/datastore/badger_datastore/badger_datastore.go b/internal/datastore/badger_datastore/badger_datastore.go index bc13504..1379de3 100644 --- a/internal/datastore/badger_datastore/badger_datastore.go +++ b/internal/datastore/badger_datastore/badger_datastore.go @@ -1,12 +1,15 @@ package badgerdatastore import ( + "time" + "github.com/dgraph-io/badger/v4" "github.com/pikami/cosmium/internal/logger" ) type BadgerDataStore struct { - db *badger.DB + db *badger.DB + gcTicker *time.Ticker } type BadgerDataStoreOptions struct { @@ -25,12 +28,24 @@ func NewBadgerDataStore(options BadgerDataStoreOptions) *BadgerDataStore { panic(err) } - return &BadgerDataStore{ - db: db, + gcTicker := time.NewTicker(5 * time.Minute) + + ds := &BadgerDataStore{ + db: db, + gcTicker: gcTicker, } + + go ds.runGarbageCollector() + + return ds } func (r *BadgerDataStore) Close() { + if r.gcTicker != nil { + r.gcTicker.Stop() + r.gcTicker = nil + } + r.db.Close() r.db = nil } @@ -39,3 +54,13 @@ func (r *BadgerDataStore) DumpToJson() (string, error) { logger.ErrorLn("Badger datastore does not support state export currently.") return "{}", nil } + +func (r *BadgerDataStore) runGarbageCollector() { + for range r.gcTicker.C { + again: + err := r.db.RunValueLogGC(0.7) + if err == nil { + goto again + } + } +}