mtredisalize: Add infrastructure to send backend store changes to separate daemons.

This commit is contained in:
Sascha L. Teichmann
2014-09-17 09:51:34 +02:00
parent ef541f18f6
commit 400a65f563
5 changed files with 132 additions and 40 deletions

View File

@@ -16,8 +16,9 @@ import (
)
const (
Version = "0.3"
GCDuration = "24h"
Version = "0.3"
GCDuration = "24h"
ChangeDuration = "30s"
)
func usage() {
@@ -30,13 +31,15 @@ func usage() {
func main() {
var (
port int
host string
driver string
cacheSize int
version bool
interleaved bool
gcDuration string
port int
host string
driver string
cacheSize int
version bool
interleaved bool
changeUrl string
gcDuration string
changeDuration string
)
flag.Usage = usage
@@ -46,8 +49,13 @@ func main() {
flag.StringVar(&host, "host", "", "host to bind")
flag.IntVar(&cacheSize, "cache", 32, "cache size in MB")
flag.BoolVar(&version, "version", false, "Print version and exit.")
flag.BoolVar(&interleaved, "interleaved", false, "Backend stores key in interleaved form.")
flag.StringVar(&gcDuration, "gc-duration", GCDuration, "Duration between forced GCs.")
flag.BoolVar(&interleaved,
"interleaved", false, "Backend stores key in interleaved form.")
flag.StringVar(&gcDuration,
"gc-duration", GCDuration, "Duration between forced GCs.")
flag.StringVar(&changeDuration,
"change-duration", ChangeDuration, "Duration to aggregate changes.")
flag.StringVar(&changeUrl, "change-url", "", "URL to send changes to.")
flag.Parse()
if version {
@@ -60,26 +68,47 @@ func main() {
}
var (
err error
backend Backend
gcDur time.Duration
err error
backend Backend
gcDur time.Duration
chDur time.Duration
changeTracker *ChangeTracker
)
if gcDur, err = time.ParseDuration(gcDuration); err != nil {
log.Fatal(err)
}
// Setup the change listening stuff.
var changeChan <-chan time.Time
useChangeNotification := changeUrl != ""
if useChangeNotification {
if chDur, err = time.ParseDuration(changeDuration); err != nil {
log.Fatal(err)
}
changeChan = time.Tick(chDur)
changeTracker = NewChangeTracker()
} else {
// We will never receive ticks on this.
changeChan = make(<-chan time.Time)
}
path := flag.Arg(0)
if driver == "sqlite" {
if backend, err = NewSqliteBackend(path, interleaved); err != nil {
if backend, err = NewSqliteBackend(path, changeTracker, interleaved); err != nil {
log.Fatal(err)
}
} else {
if backend, err = NewLeveDBBackend(path, interleaved, cacheSize); err != nil {
if backend, err = NewLeveDBBackend(
path, changeTracker, interleaved, cacheSize); err != nil {
log.Fatal(err)
}
}
defer backend.Shutdown()
var listener net.Listener
@@ -127,6 +156,10 @@ func main() {
log.Println("Starting garbage collection.")
runtime.GC()
log.Println("Garbage collection done.")
case <-changeChan:
if changeTracker != nil {
changeTracker.FlushChanges(changeUrl)
}
}
}
}