diff --git a/claimtrie.go b/claimtrie.go index f1f52db..8fe21df 100644 --- a/claimtrie.go +++ b/claimtrie.go @@ -63,6 +63,9 @@ func New() (*ClaimTrie, error) { tr: tr, cleanup: func() error { + if err := nm.Save(); err != nil { + return errors.Wrapf(err, "nm.Save()") + } if err := cm.Save(); err != nil { return errors.Wrapf(err, "cm.Save()") } diff --git a/nodemgr/nm.go b/nodemgr/nm.go index 1fe7a11..318f0d0 100644 --- a/nodemgr/nm.go +++ b/nodemgr/nm.go @@ -1,6 +1,8 @@ package nodemgr import ( + "bytes" + "encoding/gob" "fmt" "sort" @@ -39,6 +41,27 @@ func (nm *NodeMgr) Load(ht claim.Height) { name := string(iter.Key()) nm.cache[name] = nm.load(name, ht) } + data, err := nm.db.Get([]byte("nextUpdates"), nil) + if err == leveldb.ErrNotFound { + return + } else if err != nil { + panic(err) + } + if err = gob.NewDecoder(bytes.NewBuffer(data)).Decode(&nm.nextUpdates); err != nil { + panic(err) + } +} + +// Save saves the states to the database. +func (nm *NodeMgr) Save() error { + buf := bytes.NewBuffer(nil) + if err := gob.NewEncoder(buf).Encode(nm.nextUpdates); err != nil { + return errors.Wrapf(err, "gob.Encode()") + } + if err := nm.db.Put([]byte("nextUpdates"), buf.Bytes(), nil); err != nil { + return errors.Wrapf(err, "db.Put()") + } + return nil } // Get returns the latest node with name specified by key.