mirror of
https://github.com/pikami/cosmium.git
synced 2026-06-12 23:37:02 +01:00
Stop Badger GC before closing datastore
Co-authored-by: Pijus Kamandulis <pikami@users.noreply.github.com>
This commit is contained in:
@@ -12,8 +12,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type BadgerDataStore struct {
|
type BadgerDataStore struct {
|
||||||
db *badger.DB
|
db *badger.DB
|
||||||
gcTicker *time.Ticker
|
gcTicker *time.Ticker
|
||||||
|
gcDone chan struct{}
|
||||||
|
gcStopped chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
type BadgerDataStoreOptions struct {
|
type BadgerDataStoreOptions struct {
|
||||||
@@ -36,8 +38,10 @@ func NewBadgerDataStore(options BadgerDataStoreOptions) *BadgerDataStore {
|
|||||||
gcTicker := time.NewTicker(5 * time.Minute)
|
gcTicker := time.NewTicker(5 * time.Minute)
|
||||||
|
|
||||||
ds := &BadgerDataStore{
|
ds := &BadgerDataStore{
|
||||||
db: db,
|
db: db,
|
||||||
gcTicker: gcTicker,
|
gcTicker: gcTicker,
|
||||||
|
gcDone: make(chan struct{}),
|
||||||
|
gcStopped: make(chan struct{}),
|
||||||
}
|
}
|
||||||
|
|
||||||
ds.initializeDataStore(options.InitialDataFilePath)
|
ds.initializeDataStore(options.InitialDataFilePath)
|
||||||
@@ -50,7 +54,8 @@ func NewBadgerDataStore(options BadgerDataStoreOptions) *BadgerDataStore {
|
|||||||
func (r *BadgerDataStore) Close() {
|
func (r *BadgerDataStore) Close() {
|
||||||
if r.gcTicker != nil {
|
if r.gcTicker != nil {
|
||||||
r.gcTicker.Stop()
|
r.gcTicker.Stop()
|
||||||
r.gcTicker = nil
|
close(r.gcDone)
|
||||||
|
<-r.gcStopped
|
||||||
}
|
}
|
||||||
|
|
||||||
r.db.Close()
|
r.db.Close()
|
||||||
@@ -63,11 +68,19 @@ func (r *BadgerDataStore) DumpToJson() (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *BadgerDataStore) runGarbageCollector() {
|
func (r *BadgerDataStore) runGarbageCollector() {
|
||||||
for range r.gcTicker.C {
|
defer close(r.gcStopped)
|
||||||
again:
|
|
||||||
err := r.db.RunValueLogGC(0.7)
|
for {
|
||||||
if err == nil {
|
select {
|
||||||
goto again
|
case <-r.gcTicker.C:
|
||||||
|
for {
|
||||||
|
err := r.db.RunValueLogGC(0.7)
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case <-r.gcDone:
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user