@@ -17,13 +17,19 @@ package database
17
17
18
18
import (
19
19
"context"
20
+ "fmt"
20
21
"os"
22
+ "regexp"
21
23
"testing"
22
24
"time"
23
25
24
26
"github.com/dgraph-io/badger/v3"
25
27
"github.com/go-logr/logr"
26
28
"github.com/go-logr/logr/testr"
29
+ "github.com/pkg/errors"
30
+
31
+ "github.com/google/go-containerregistry/pkg/name"
32
+ "github.com/google/go-containerregistry/pkg/v1/remote"
27
33
)
28
34
29
35
func TestBadgerGarbageCollectorDoesStop (t * testing.T ) {
@@ -59,13 +65,88 @@ func TestBadgerGarbageCollectorDoesStop(t *testing.T) {
59
65
}
60
66
}
61
67
68
+ func TestBadgerGCLoad (t * testing.T ) {
69
+ badger , db := createBadgerDatabaseForGC (t )
70
+ ctx , cancel := context .WithCancel (
71
+ logr .NewContext (context .Background (), testr .NewWithOptions (t , testr.Options {Verbosity : 1 , LogTimestamp : true })))
72
+
73
+ stop := make (chan struct {})
74
+ go func () {
75
+ gc := NewBadgerGarbageCollector ("loaded-badger-gc" , badger , time .Second * 20 , 0.7 )
76
+ gc .Start (ctx )
77
+ stop <- struct {}{}
78
+ }()
79
+
80
+ repos := []string {"alpine" , "node" , "postgres" , "debian" }
81
+ for i := 5 ; i >= 0 ; i -- {
82
+ for _ , repo := range repos {
83
+ ref , err := name .ParseReference (repo )
84
+ fatalIfError (t , err )
85
+ tags , err := remote .List (ref .Context ())
86
+ iter := (i + 3 ) * 15000
87
+ for r := 0 ; r <= iter ; r ++ {
88
+ fatalIfError (t , err )
89
+ db .SetTags (fmt .Sprintf ("%s-%d" , repo , r ), tags [0 :len (tags )- i ])
90
+ // time.Sleep(time.Millisecond)
91
+ }
92
+ t .Logf ("%s %d: %d repos" , repo , i , iter )
93
+ }
94
+ time .Sleep (time .Millisecond * 100 )
95
+ }
96
+
97
+ cancel ()
98
+ t .Log ("waiting for GC stop" )
99
+ select {
100
+ case <- time .NewTimer (30 * time .Second ).C :
101
+ t .Fatalf ("GC did not stop" )
102
+ case <- stop :
103
+ t .Log ("GC Stopped" )
104
+ }
105
+ }
106
+
107
+ type badgerTestLogger struct {
108
+ logger logr.Logger
109
+ }
110
+
111
+ func (l * badgerTestLogger ) Errorf (f string , v ... interface {}) {
112
+ l .logger .Error (errors .Errorf ("ERROR: " + f , v ... ), f )
113
+ }
114
+ func (l * badgerTestLogger ) Infof (f string , v ... interface {}) {
115
+ l .log ("INFO" , f , v ... )
116
+ }
117
+ func (l * badgerTestLogger ) Warningf (f string , v ... interface {}) {
118
+ l .log ("WARNING" , f , v ... )
119
+ }
120
+ func (l * badgerTestLogger ) Debugf (f string , v ... interface {}) {
121
+ l .log ("DEBUG" , f , v ... )
122
+ }
123
+
124
+ var filter = regexp .MustCompile (`writeRequests called. Writing to value log|2 entries written|Writing to memtable|Sending updates to subscribers|Found value log max|fid:|Moved: 0|Processed 0 entries in 0 loops|Discard stats: map` )
125
+
126
+ func (l * badgerTestLogger ) log (lvl string , f string , v ... interface {}) {
127
+ str := fmt .Sprintf (lvl + ": " + f , v ... )
128
+ if filter .MatchString (str ) {
129
+ return
130
+ }
131
+ l .logger .Info (str )
132
+ }
133
+
62
134
func createBadgerDatabaseForGC (t * testing.T ) (* badger.DB , * BadgerDatabase ) {
63
135
t .Helper ()
64
136
dir , err := os .MkdirTemp (os .TempDir (), t .Name ())
65
137
if err != nil {
66
138
t .Fatal (err )
67
139
}
68
- db , err := badger .Open (badger .DefaultOptions (dir ))
140
+ opts := badger .DefaultOptions (dir )
141
+ opts = opts .WithValueThreshold (100 ) // force values into the vlog files
142
+ opts = opts .WithValueLogMaxEntries (1000 ) // force many vlogs to be created
143
+ opts = opts .WithValueLogFileSize (32 << 19 )
144
+ opts = opts .WithMemTableSize (16 << 19 ) // fill up memtables quickly
145
+ opts = opts .WithNumMemtables (1 )
146
+ opts = opts .WithNumLevelZeroTables (1 ) // hold fewer memtables in memory
147
+ opts = opts .WithLogger (& badgerTestLogger {logger : testr .NewWithOptions (t , testr.Options {LogTimestamp : true })})
148
+ // opts = opts.WithLoggingLevel(badger.DEBUG)
149
+ db , err := badger .Open (opts )
69
150
if err != nil {
70
151
t .Fatal (err )
71
152
}
0 commit comments