package main import ( "encoding/gob" "fmt" "os" "time" ) func init() { gob.Register(map[uint64]int64{}) } type DiskStorage struct { stateFile string lastSave int64 LastSaves map[uint64]int64 } func NewDiskStorage(stateFile string) (*DiskStorage, error) { ret := &DiskStorage{ stateFile: stateFile, LastSaves: make(map[uint64]int64), } err := ret.loadState() return ret, err } func saveMessages(_ interface{}, _ CartId) error { // No-op: legacy event log persistence removed in oneof refactor. return nil } func getCartPath(id string) string { return fmt.Sprintf("data/%s.prot", id) } func loadMessages(_ Grain, _ CartId) error { // No-op: legacy replay removed in oneof refactor. return nil } func (s *DiskStorage) saveState() error { tmpFile := s.stateFile + "_tmp" file, err := os.Create(tmpFile) if err != nil { return err } defer file.Close() err = gob.NewEncoder(file).Encode(s.LastSaves) if err != nil { return err } os.Remove(s.stateFile + ".bak") os.Rename(s.stateFile, s.stateFile+".bak") return os.Rename(tmpFile, s.stateFile) } func (s *DiskStorage) loadState() error { file, err := os.Open(s.stateFile) if err != nil { return err } defer file.Close() return gob.NewDecoder(file).Decode(&s.LastSaves) } func (s *DiskStorage) Store(id CartId, _ *CartGrain) error { // With the removal of the legacy message log, we only update the timestamp. ts := time.Now().Unix() s.LastSaves[uint64(id)] = ts s.lastSave = ts return nil }