burlesque/state.go

69 lines
1.1 KiB
Go
Raw Normal View History

2014-07-10 19:19:39 +07:00
package main
import (
"encoding/json"
"time"
)
type (
QueueState map[string]uint
ServerState map[string]QueueState
)
const (
StateMetaKey = "state"
2014-07-12 18:16:00 +07:00
StateSaveInterval = 1 // seconds
2014-07-10 19:19:39 +07:00
)
func SaveState() {
state := make(ServerState)
for _, q := range queues {
state[q.Name] = QueueState{
2014-07-12 17:40:02 +07:00
"wi": q.Counter.WriteIndex,
"ri": q.Counter.ReadIndex,
2014-07-10 19:19:39 +07:00
}
}
2014-07-17 02:18:54 +07:00
jsn, _ := json.Marshal(state)
2014-07-10 19:19:39 +07:00
key := Key(StateMetaKey)
2014-07-17 02:18:54 +07:00
if err := storage.Set(key, jsn); err != nil {
2014-07-12 17:42:26 +07:00
Error(err, "Failed to persist state")
2014-07-10 19:19:39 +07:00
return
}
}
func LoadState() {
state := make(ServerState)
key := Key(StateMetaKey)
2014-07-17 02:18:54 +07:00
jsn, err := storage.Get(key)
2014-07-10 19:19:39 +07:00
if err != nil {
2014-07-12 17:42:26 +07:00
Log("State not found")
2014-07-10 19:19:39 +07:00
return
}
2014-07-17 02:18:54 +07:00
err = json.Unmarshal(jsn, &state)
if err != nil {
2014-07-12 17:42:26 +07:00
Log("Failed to load state")
2014-07-10 19:19:39 +07:00
return
}
2014-07-17 20:22:37 +07:00
for qname, meta := range state {
RegisterQueue(qname, meta["wi"], meta["ri"])
2014-07-10 19:19:39 +07:00
}
2014-07-12 17:42:26 +07:00
Log("State successfully loaded")
2014-07-10 19:19:39 +07:00
}
func KeepStatePersisted() {
2014-07-12 18:16:00 +07:00
t := time.NewTicker(StateSaveInterval * time.Second)
2014-07-10 19:19:39 +07:00
for {
<-t.C
SaveState()
2014-07-17 20:21:57 +07:00
err := storage.Sync(false)
if err != nil {
Error(err, "Failed to sync storage")
}
2014-07-10 19:19:39 +07:00
}
}