database:
remove multi-database support
change `DatabaseBackend` as a interface
db_struct:
change some fields to `map` type
yaml_db:
refactor to implement the `DatabaseBackend` interface
add some lock changes
move auto save as a single goroutine
64 lines
1.5 KiB
Go
64 lines
1.5 KiB
Go
package signals
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"time"
|
|
"trbot/database"
|
|
"trbot/utils/plugin_utils"
|
|
|
|
"github.com/rs/zerolog"
|
|
)
|
|
|
|
type SignalChannel struct {
|
|
Database_save chan bool
|
|
PluginDB_save chan bool
|
|
PluginDB_reload chan bool
|
|
}
|
|
|
|
var SIGNALS = SignalChannel{
|
|
Database_save: make(chan bool),
|
|
PluginDB_save: make(chan bool),
|
|
PluginDB_reload: make(chan bool),
|
|
}
|
|
|
|
func SignalsHandler(ctx context.Context) {
|
|
logger := zerolog.Ctx(ctx)
|
|
var saveDatabaseRetryCount int = 0
|
|
var saveDatabaseRetryMax int = 10
|
|
|
|
for {
|
|
select {
|
|
case <-ctx.Done():
|
|
if saveDatabaseRetryCount == 0 { logger.Warn().Msg("Cancle signal received") }
|
|
plugin_utils.SavePluginsDatabase(ctx)
|
|
err := database.SaveDatabase(ctx)
|
|
if err != nil {
|
|
saveDatabaseRetryCount++
|
|
logger.Error().
|
|
Err(err).
|
|
Int("retryCount", saveDatabaseRetryCount).
|
|
Int("maxRetry", saveDatabaseRetryMax).
|
|
Msg("Failed to save database, retrying...")
|
|
time.Sleep(2 * time.Second)
|
|
if saveDatabaseRetryCount >= saveDatabaseRetryMax {
|
|
logger.Fatal().
|
|
Err(err).
|
|
Msg("Failed to save database too many times, exiting")
|
|
}
|
|
continue
|
|
}
|
|
logger.Info().Msg("Database saved")
|
|
time.Sleep(1 * time.Second)
|
|
logger.Warn().Msg("manually stopped")
|
|
os.Exit(0)
|
|
case <-SIGNALS.Database_save:
|
|
database.SaveDatabase(ctx)
|
|
case <-SIGNALS.PluginDB_reload:
|
|
plugin_utils.ReloadPluginsDatabase(ctx)
|
|
case <-SIGNALS.PluginDB_save:
|
|
plugin_utils.SavePluginsDatabase(ctx)
|
|
}
|
|
}
|
|
}
|