From 7b11dc1c0550bd5ff88f5d682af70df3b46fad1f Mon Sep 17 00:00:00 2001 From: Yicheng Qin Date: Sun, 13 Jul 2014 17:12:46 -0700 Subject: [PATCH] server: maintain cluster members in `nodes` var --- etcd/etcd.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/etcd/etcd.go b/etcd/etcd.go index 02a35c190..4d4b4dedf 100644 --- a/etcd/etcd.go +++ b/etcd/etcd.go @@ -168,21 +168,22 @@ func (s *Server) Join() { PeerURL: s.raftPubAddr, } - succeed := false + url := "" for i := 0; i < 5; i++ { for seed := range s.nodes { if err := s.client.AddMachine(seed, fmt.Sprint(s.id), info); err == nil { - succeed = true + url = seed break } else { log.Println(err) } } - if succeed { + if url != "" { break } time.Sleep(100 * time.Millisecond) } + s.nodes = map[string]bool{url: true} s.run() } @@ -329,9 +330,10 @@ func (s *Server) apply(ents []raft.Entry) { break } log.Printf("Add Node %x %v %v\n", cfg.NodeId, cfg.Addr, string(cfg.Context)) - s.nodes[cfg.Addr] = true p := path.Join(v2machineKVPrefix, fmt.Sprint(cfg.NodeId)) - s.Store.Set(p, false, fmt.Sprintf("raft=%v&etcd=%v", cfg.Addr, string(cfg.Context)), store.Permanent) + if _, err := s.Store.Set(p, false, fmt.Sprintf("raft=%v&etcd=%v", cfg.Addr, string(cfg.Context)), store.Permanent); err == nil { + s.nodes[cfg.Addr] = true + } case raft.RemoveNode: cfg := new(raft.Config) if err := json.Unmarshal(ent.Data, cfg); err != nil { @@ -340,7 +342,9 @@ func (s *Server) apply(ents []raft.Entry) { } log.Printf("Remove Node %x\n", cfg.NodeId) p := path.Join(v2machineKVPrefix, fmt.Sprint(cfg.NodeId)) - s.Store.Delete(p, false, false) + if _, err := s.Store.Delete(p, false, false); err == nil { + delete(s.nodes, cfg.Addr) + } default: panic("unimplemented") }