11/*
2- * Copyright 2022 Hewlett Packard Enterprise Development LP
2+ * Copyright 2022-2025 Hewlett Packard Enterprise Development LP
33 * Other additional copyright holders may be indicated within.
44 *
55 * The entirety of this work is licensed under the Apache License,
2020package persistent
2121
2222import (
23+ "time"
24+
2325 "github.com/dgraph-io/badger/v3"
2426)
2527
28+ const garbageCollectPeriod = 24 * time .Hour
29+
2630func NewLocalPersistentStorageProvider () PersistentStorageProvider {
2731 return & localPersistentStorageProvider {}
2832}
@@ -40,27 +44,51 @@ type localPersistentStorage struct {
4044}
4145
4246func (s * localPersistentStorage ) open (path string , readOnly bool ) (err error ) {
47+ log := GetLogger ().WithValues ("path" , path , "readOnly" , readOnly )
48+ log .Info ("BadgerDB: Opening database" )
49+
4350 opts := badger .DefaultOptions (path )
4451 opts .SyncWrites = true
45- //opts.ReadOnly = readOnly // Causes ErrLogTruncate
4652 opts .BypassLockGuard = readOnly
53+ opts .VerifyValueChecksum = true
4754
48- // Shrink the in-memory and on-disk size to a more manageable 8 MiB and 16 MiB, respectively;
55+ // Shrink the in-memory and on-disk size to a more manageable 8 MiB and 32 MiB, respectively;
4956 // We use very little data and the 64 MiB and 256 MiB defaults will cause OOM issues in kubernetes.
50- // 8MiB seems to be the lower limit within badger, anything smaller and badger will complain with
57+ // 8MiB seems to be the lower limit within badger, anything smaller and badger complains with
5158 // """
5259 // Valuethreshold 1048576 greater than max batch size of 629145. Either reduce opt.ValueThreshold
5360 // or increase opt.MaxTableSize.
5461 // """
5562 opts .MemTableSize = 8 << 20
56- opts .BlockCacheSize = 16 << 20
63+ opts .BlockCacheSize = 32 << 20 // Increased to 32 MiB for better cache hit ratio
5764
5865 s .DB , err = badger .Open (opts )
59- return err
66+ if err != nil {
67+ log .Error (err , "BadgerDB: Failed to open database" )
68+ return err
69+ }
70+
71+ log .WithValues ("mem_table_size" , opts .MemTableSize , "block_cache_size" , opts .BlockCacheSize ).Info ("BadgerDB: Database opened successfully" )
72+
73+ // Run garbage collection on existing database during initialization
74+ // Skip GC for read-only databases to avoid potential issues
75+ if ! readOnly {
76+ s .RunPeriodicGC (garbageCollectPeriod )
77+ }
78+
79+ return nil
6080}
6181
6282func (s * localPersistentStorage ) Close () error {
63- return s .DB .Close ()
83+ log := GetLogger ()
84+ log .Info ("BadgerDB: Closing database" )
85+ err := s .DB .Close ()
86+ if err != nil {
87+ log .Error (err , "BadgerDB: Failed to close database" )
88+ } else {
89+ log .Info ("BadgerDB: Database closed successfully" )
90+ }
91+ return err
6492}
6593
6694func (s * localPersistentStorage ) View (fn func (PersistentStorageTransactionApi ) error ) error {
@@ -84,6 +112,38 @@ func (s *localPersistentStorage) Delete(key string) error {
84112 return txn .Commit ()
85113}
86114
115+ func (s * localPersistentStorage ) RunGC () error {
116+ log := GetLogger ().WithName ("gc" )
117+ log .Info ("BadgerDB: Starting garbage collection" )
118+
119+ err := s .DB .RunValueLogGC (0.5 )
120+ if err != nil {
121+ if err == badger .ErrNoRewrite {
122+ log .Info ("BadgerDB: GC completed - no rewrite needed" )
123+ return nil
124+ }
125+ log .Error (err , "BadgerDB: GC failed" )
126+ return err
127+ }
128+ log .Info ("BadgerDB: GC completed successfully" )
129+ return nil
130+ }
131+
132+ func (s * localPersistentStorage ) RunPeriodicGC (interval time.Duration ) {
133+ log := GetLogger ().WithName ("periodic-gc" ).WithValues ("interval" , interval )
134+ log .Info ("BadgerDB: Starting periodic GC" )
135+
136+ ticker := time .NewTicker (interval )
137+ go func () {
138+ defer ticker .Stop ()
139+ for range ticker .C {
140+ if err := s .RunGC (); err != nil {
141+ log .Error (err , "BadgerDB: Periodic GC encountered error" )
142+ }
143+ }
144+ }()
145+ }
146+
87147type localPersistentStorageTransaction struct {
88148 * badger.Txn
89149}
0 commit comments