1
0
Fork 0
burlesque/state.go

70 lines
1.1 KiB
Go
Raw Normal View History

2014-07-10 12:19:39 +00:00
package main
import (
"encoding/json"
"time"
)
type (
2014-09-09 08:20:40 +00:00
queueState map[string]uint
serverState map[string]queueState
2014-07-10 12:19:39 +00:00
)
const (
2014-09-09 08:20:40 +00:00
stateMetaKey = "state"
stateSaveInterval = 1 // seconds
2014-07-10 12:19:39 +00:00
)
2014-09-09 08:20:40 +00:00
func saveState() {
state := make(serverState)
2014-07-10 12:19:39 +00:00
for _, q := range queues {
2014-09-09 08:20:40 +00:00
state[q.name] = queueState{
"wi": q.counter.writeIndex,
"ri": q.counter.readIndex,
2014-07-10 12:19:39 +00:00
}
}
2014-07-16 19:18:54 +00:00
jsn, _ := json.Marshal(state)
2014-09-09 08:20:40 +00:00
k := key(stateMetaKey)
if err := storage.Set(k, jsn); err != nil {
alert(err, "Failed to persist state")
2014-07-10 12:19:39 +00:00
return
}
}
2014-09-09 08:20:40 +00:00
func loadState() {
state := make(serverState)
k := key(stateMetaKey)
2014-07-10 12:19:39 +00:00
2014-09-09 08:20:40 +00:00
jsn, err := storage.Get(k)
2014-07-10 12:19:39 +00:00
if err != nil {
2014-09-09 08:20:40 +00:00
log("State not found")
2014-07-10 12:19:39 +00:00
return
}
2014-07-16 19:18:54 +00:00
err = json.Unmarshal(jsn, &state)
if err != nil {
2014-09-09 08:20:40 +00:00
log("Failed to load state")
2014-07-10 12:19:39 +00:00
return
}
2014-07-17 13:22:37 +00:00
for qname, meta := range state {
2014-09-09 08:20:40 +00:00
registerQueue(qname, meta["wi"], meta["ri"])
2014-07-10 12:19:39 +00:00
}
2014-09-09 08:20:40 +00:00
log("State successfully loaded")
2014-07-10 12:19:39 +00:00
}
2014-09-09 08:20:40 +00:00
func keepStatePersisted() {
t := time.NewTicker(stateSaveInterval * time.Second)
2014-07-10 12:19:39 +00:00
for {
<-t.C
2014-09-09 08:20:40 +00:00
saveState()
2014-07-17 13:21:57 +00:00
err := storage.Sync(false)
if err != nil {
2014-09-09 08:20:40 +00:00
alert(err, "Failed to sync storage")
2014-07-17 13:21:57 +00:00
}
2014-07-10 12:19:39 +00:00
}
}