From c31232fb703753585d367f2c5ac6816a1db75cf5 Mon Sep 17 00:00:00 2001 From: Armon Dadgar Date: Mon, 31 Mar 2014 13:56:16 -0700 Subject: [PATCH] consul: FSM support to snapshot/restore KVS values --- consul/fsm.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/consul/fsm.go b/consul/fsm.go index 849d75d86a..739e5d9225 100644 --- a/consul/fsm.go +++ b/consul/fsm.go @@ -213,6 +213,15 @@ func (c *consulFSM) Restore(old io.ReadCloser) error { } c.applyRegister(&req, header.LastIndex) + case structs.KVSRequestType: + var req structs.DirEntry + if err := dec.Decode(&req); err != nil { + return err + } + if err := c.state.KVSSet(req.CreateIndex, &req); err != nil { + return err + } + default: return fmt.Errorf("Unrecognized msg type: %v", msgType) } @@ -276,6 +285,21 @@ func (s *consulSnapshot) Persist(sink raft.SnapshotSink) error { } } } + + // Enable GC of the ndoes + nodes = nil + + // Dump the KVS entries + dirents := s.state.KVSDump() + for _, ent := range dirents { + // Register the node itself + sink.Write([]byte{byte(structs.KVSRequestType)}) + if err := encoder.Encode(ent); err != nil { + sink.Cancel() + return err + } + } + return nil }