Skip to content

Commit f4601f2

Browse files
authored
feat: run GC periodically for BadgerDB (#156)
Fixes #27
1 parent 2e3a61f commit f4601f2

File tree

1 file changed

+27
-3
lines changed

1 file changed

+27
-3
lines changed

internal/state/state.go

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
package state
88

99
import (
10+
"errors"
1011
"fmt"
1112
"strconv"
1213
"strings"
14+
"time"
1315

1416
"github.com/blinklabs-io/cdnsd/internal/config"
1517
"github.com/blinklabs-io/cdnsd/internal/logging"
@@ -22,7 +24,8 @@ const (
2224
)
2325

2426
type State struct {
25-
db *badger.DB
27+
db *badger.DB
28+
gcTimer *time.Ticker
2629
}
2730

2831
var globalState = &State{}
@@ -34,15 +37,36 @@ func (s *State) Load() error {
3437
// The default INFO logging is a bit verbose
3538
WithLoggingLevel(badger.WARNING)
3639
db, err := badger.Open(badgerOpts)
37-
// TODO: setup automatic GC for Badger
3840
if err != nil {
3941
return err
4042
}
4143
s.db = db
42-
//defer db.Close()
44+
// Make sure existing DB matches current config options
4345
if err := s.compareFingerprint(); err != nil {
4446
return err
4547
}
48+
// Run GC periodically for Badger DB
49+
s.gcTimer = time.NewTicker(5 * time.Minute)
50+
go func() {
51+
logger := logging.GetLogger()
52+
for range s.gcTimer.C {
53+
again:
54+
logger.Debug("database: running GC")
55+
err := s.db.RunValueLogGC(0.5)
56+
if err != nil {
57+
// Log any actual errors
58+
if !errors.Is(err, badger.ErrNoRewrite) {
59+
logger.Warnf(
60+
"database: GC failure: %s",
61+
err,
62+
)
63+
}
64+
} else {
65+
// Run it again if it just ran successfully
66+
goto again
67+
}
68+
}
69+
}()
4670
return nil
4771
}
4872

0 commit comments

Comments
 (0)