mirror of
https://github.com/Luzifer/mapshare.git
synced 2024-11-09 13:40:00 +00:00
63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/pkg/errors"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
func loadState() error {
|
|
if cfg.StateFile == "" {
|
|
// No state file, no retaining
|
|
return nil
|
|
}
|
|
|
|
if _, err := os.Stat(cfg.StateFile); err != nil {
|
|
log.WithError(err).Warn("Unable to load state, using empty state")
|
|
if os.IsNotExist(err) {
|
|
return nil
|
|
}
|
|
return errors.Wrap(err, "Unable to access state file")
|
|
}
|
|
|
|
reqRetainerLock.Lock()
|
|
defer reqRetainerLock.Unlock()
|
|
|
|
f, err := os.Open(cfg.StateFile)
|
|
if err != nil {
|
|
return errors.Wrap(err, "Unable to open state file")
|
|
}
|
|
defer f.Close()
|
|
|
|
return errors.Wrap(json.NewDecoder(f).Decode(&reqRetainer), "Unable to decode state file")
|
|
|
|
}
|
|
|
|
func retainState() error {
|
|
if cfg.StateFile == "" {
|
|
// No state file, no retaining
|
|
return nil
|
|
}
|
|
|
|
f, err := os.Create(cfg.StateFile)
|
|
if err != nil {
|
|
return errors.Wrap(err, "Unable to create state file")
|
|
}
|
|
defer f.Close()
|
|
|
|
reqRetainerLock.RLock()
|
|
defer reqRetainerLock.RUnlock()
|
|
|
|
var tmpState = make(map[string]position)
|
|
for m, p := range reqRetainer {
|
|
if time.Since(p.Time) > cfg.StateTimeout {
|
|
continue
|
|
}
|
|
tmpState[m] = p
|
|
}
|
|
|
|
return errors.Wrap(json.NewEncoder(f).Encode(tmpState), "Unable to encode state file")
|
|
}
|