1
0
Fork 0
burlesque/state.go

64 lines
1.0 KiB
Go
Raw Normal View History

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