From 592ac35bb153e991838c879ad13aa807b68dbd26 Mon Sep 17 00:00:00 2001 From: Bill Katz Date: Sat, 3 Feb 2024 23:33:31 -0500 Subject: [PATCH] make more resilient to buffer loss if server crashes --- server/server.go | 1 + storage/badger/badger.go | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/server/server.go b/server/server.go index cb5d05ea..1e776f6d 100644 --- a/server/server.go +++ b/server/server.go @@ -375,6 +375,7 @@ func Shutdown() { } datastore.Shutdown() dvid.BlockOnActiveCgo() + storage.Shutdown() rpc.Shutdown() dvid.Shutdown() shutdownCh <- struct{}{} diff --git a/storage/badger/badger.go b/storage/badger/badger.go index 156b3dff..f3ece2c7 100644 --- a/storage/badger/badger.go +++ b/storage/badger/badger.go @@ -10,6 +10,7 @@ import ( "hash/fnv" "os" "path/filepath" + "time" "github.com/janelia-flyem/dvid/dvid" "github.com/janelia-flyem/dvid/storage" @@ -103,6 +104,19 @@ func parseConfig(config dvid.StoreConfig) (path string, testing bool, err error) return } +// Periodically sync to prevent too many writes from being buffered +// if server crashes. +func syncPeriodically(db *badger.DB) { + ticker := time.NewTicker(30 * time.Second) + defer ticker.Stop() + for { + select { + case <-ticker.C: + db.Sync() + } + } +} + // newDB returns a Badger backend, creating one at path if it doesn't exist. func (e Engine) newDB(config dvid.StoreConfig) (*BadgerDB, bool, error) { path, _, err := parseConfig(config) @@ -146,6 +160,8 @@ func (e Engine) newDB(config dvid.StoreConfig) (*BadgerDB, bool, error) { } badgerDB.bdp = bdp + go syncPeriodically(bdp) + // if we know it's newly created, just return. if created { return badgerDB, created, nil @@ -226,6 +242,7 @@ func (db *BadgerDB) Close() { if db != nil { if db.bdp != nil { db.bdp.Close() + dvid.Infof("Closed Badger DB @ %s\n", db.directory) } db.bdp = nil db.options = nil