diff options
-rw-r--r-- | svc/conf.go | 77 | ||||
-rw-r--r-- | svc/init.go | 23 | ||||
-rw-r--r-- | svc/periodic.go | 103 |
3 files changed, 108 insertions, 95 deletions
diff --git a/svc/conf.go b/svc/conf.go index 8abb4a6..2e9d671 100644 --- a/svc/conf.go +++ b/svc/conf.go @@ -8,7 +8,6 @@ import ( "sync" "time" - "github.com/fsnotify/fsnotify" "github.com/spf13/viper" ) @@ -38,58 +37,6 @@ type Instance struct { Desc string `yaml:"Instance.Description"` } -// This is a wrapper for a *time.Ticker -// that adds another channel. It's used -// to signal to the ticker goroutines -// that they should stop the tickers -// and exit. -type tick struct { - isDB bool - t *time.Ticker - exit chan bool -} - -// Creates a new instance of a tick -func initTicker(db bool, interval time.Duration) *tick { - return &tick{ - isDB: db, - t: time.NewTicker(interval), - exit: make(chan bool, 1), - } -} - -// Sends the signal to stop the tickers -// and for their respective goroutines -// to exit. -func killTickers() { - ct := <-cTickC - dt := <-dbTickC - ct.exit <- true - dt.exit <- true -} - -// Waits for a signal from the database -// *tick. Either stops the ticker and -// kills the goroutine or it will -// update cache / push the DB to disk -func dataTimer(tkr *tick) { - for { - select { - case signal := <-tkr.t.C: - if tkr.isDB { - errLog("", pushDB()) - log.Printf("Database push took: %v\n", time.Since(signal)) - continue - } - cacheUpdate() - log.Printf("Cache update took: %v\n", time.Since(signal)) - case <-tkr.exit: - tkr.t.Stop() - return - } - } -} - // Called on start-up. Initializes everything // related to configuration values. func initConfig() { @@ -110,30 +57,6 @@ func initConfig() { bindConfig() } -// Called when a change is detected in the -// configuration file. Closes log file, -// closes database connection, stops all -// tickers, then binds new configuration -// values, opens new log file, connects to -// new database, and starts new cache and -// database tickers. -func reInit(e fsnotify.Event) { - log.Printf("%v. Reloading...\n", e.String()) - - if !confObj.StdoutLogging { - closeLog <- true - } - - killTickers() - killDB() - - bindConfig() - - initLogging() - initDatabase() - initPersistence() -} - // Registers either stdout or a specified file // to the default logger. func initLogging() { diff --git a/svc/init.go b/svc/init.go index 71527cf..537119c 100644 --- a/svc/init.go +++ b/svc/init.go @@ -30,9 +30,12 @@ var confObj = &Configuration{} // Signals to close the log file var closeLog = make(chan bool, 1) -// Used to transmit database pointer, database ticker, -// and cache ticker after initialization +// Used to transmit database pointer var dbChan = make(chan dbase, 1) + +// Used to transmit the wrapped tickers +// corresponding to the in-memory cache +// or the on-disk database. var dbTickC = make(chan *tick, 1) var cTickC = make(chan *tick, 1) @@ -100,22 +103,6 @@ func checkFlags() { } } -// Starts the tickers that periodically: -// - pull new user statuses into cache -// - push cached data to disk -func initPersistence() { - confObj.Mu.RLock() - cacheTkr := initTicker(false, confObj.CacheInterval) - dbTkr := initTicker(true, confObj.DBInterval) - confObj.Mu.RUnlock() - - go dataTimer(cacheTkr) - go dataTimer(dbTkr) - - dbTickC <- dbTkr - cTickC <- cacheTkr -} - // Watch for SIGINT aka ^C // Close the log file then exit func watchForInterrupt() { diff --git a/svc/periodic.go b/svc/periodic.go new file mode 100644 index 0000000..f27b08e --- /dev/null +++ b/svc/periodic.go @@ -0,0 +1,103 @@ +package svc // import "github.com/getwtxt/getwtxt/svc" + +import ( + "log" + "time" + + "github.com/fsnotify/fsnotify" +) + +// Functions and types in this file pertain +// to periodic, regular actions. + +// This is a wrapper for a *time.Ticker +// that adds another channel. It's used +// to signal to the ticker goroutines +// that they should stop the tickers +// and exit. +type tick struct { + isDB bool + t *time.Ticker + exit chan bool +} + +// Creates a new instance of a tick +func initTicker(db bool, interval time.Duration) *tick { + return &tick{ + isDB: db, + t: time.NewTicker(interval), + exit: make(chan bool, 1), + } +} + +// Sends the signal to stop the tickers +// and for their respective goroutines +// to exit. +func killTickers() { + ct := <-cTickC + dt := <-dbTickC + ct.exit <- true + dt.exit <- true +} + +// Waits for a signal from the database +// *tick. Either stops the ticker and +// kills the goroutine or it will +// update cache / push the DB to disk +func dataTimer(tkr *tick) { + for { + select { + case signal := <-tkr.t.C: + if tkr.isDB { + errLog("", pushDB()) + log.Printf("Database push took: %v\n", time.Since(signal)) + continue + } + cacheUpdate() + log.Printf("Cache update took: %v\n", time.Since(signal)) + case <-tkr.exit: + tkr.t.Stop() + return + } + } +} + +// Called when a change is detected in the +// configuration file. Closes log file, +// closes database connection, stops all +// tickers, then binds new configuration +// values, opens new log file, connects to +// new database, and starts new cache and +// database tickers. +func reInit(e fsnotify.Event) { + log.Printf("%v. Reloading...\n", e.String()) + + if !confObj.StdoutLogging { + closeLog <- true + } + + killTickers() + killDB() + + bindConfig() + + initLogging() + initDatabase() + initPersistence() +} + +// Starts the tickers that periodically: +// - pull new user statuses into cache +// - push cached data to disk +func initPersistence() { + confObj.Mu.RLock() + cacheTkr := initTicker(false, confObj.CacheInterval) + dbTkr := initTicker(true, confObj.DBInterval) + confObj.Mu.RUnlock() + + go dataTimer(cacheTkr) + go dataTimer(dbTkr) + + dbTickC <- dbTkr + cTickC <- cacheTkr +} |