summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--svc/conf.go77
-rw-r--r--svc/init.go23
-rw-r--r--svc/periodic.go103
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
+}