-
Notifications
You must be signed in to change notification settings - Fork 107
/
helpers.go
112 lines (90 loc) · 2.14 KB
/
helpers.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Package badger contains convenience helpers for integrating BadgerDB.
package badger
import (
"fmt"
"strings"
"sync"
"time"
"github.com/dgraph-io/badger/v3"
"github.com/oasisprotocol/oasis-core/go/common/logging"
)
const (
gcInterval = 5 * time.Minute
gcDiscardRatio = 0.5
)
// NewLogAdapter returns a badger.Logger backed by an oasis-node logger.
func NewLogAdapter(logger *logging.Logger) badger.Logger {
return &badgerLogger{
logger: logger,
}
}
type badgerLogger struct {
logger *logging.Logger
}
func (l *badgerLogger) Errorf(format string, a ...interface{}) {
l.logger.Error(strings.TrimSpace(fmt.Sprintf(format, a...)))
}
func (l *badgerLogger) Warningf(format string, a ...interface{}) {
l.logger.Warn(strings.TrimSpace(fmt.Sprintf(format, a...)))
}
func (l *badgerLogger) Infof(format string, a ...interface{}) {
l.logger.Info(strings.TrimSpace(fmt.Sprintf(format, a...)))
}
func (l *badgerLogger) Debugf(format string, a ...interface{}) {
l.logger.Debug(strings.TrimSpace(fmt.Sprintf(format, a...)))
}
// GCWorker is a BadgerDB value log GC worker.
type GCWorker struct {
logger *logging.Logger
db *badger.DB
closeOnce sync.Once
closeCh chan struct{}
closedCh chan struct{}
}
// Close halts the GC worker.
func (gc *GCWorker) Close() {
gc.closeOnce.Do(func() {
close(gc.closeCh)
<-gc.closedCh
})
}
func (gc *GCWorker) worker() {
defer close(gc.closedCh)
ticker := time.NewTicker(gcInterval)
defer ticker.Stop()
doGC := func() error {
for {
if err := gc.db.RunValueLogGC(gcDiscardRatio); err != nil {
return err
}
}
}
for {
select {
case <-gc.closeCh:
return
case <-ticker.C:
}
// Run the value log GC.
err := doGC()
switch err {
case nil, badger.ErrNoRewrite:
default:
gc.logger.Error("failed to GC value log",
"err", err,
)
}
}
}
// NewGCWorker creates a new BadgerDB value log GC worker for the provided
// db, logging to the specified logger.
func NewGCWorker(logger *logging.Logger, db *badger.DB) *GCWorker {
gc := &GCWorker{
logger: logger,
db: db,
closeCh: make(chan struct{}),
closedCh: make(chan struct{}),
}
go gc.worker()
return gc
}