diff --git a/server/join_command.go b/server/join_command.go index d7a9aa599..83d2efb73 100644 --- a/server/join_command.go +++ b/server/join_command.go @@ -45,7 +45,7 @@ func (c *JoinCommand) Apply(server *raft.Server) (interface{}, error) { ps.registry.Invalidate(c.Name) // Check if the join command is from a previous machine, who lost all its previous log. - if _, ok := ps.registry.URL(c.Name); ok { + if _, ok := ps.registry.ClientURL(c.Name); ok { return b, nil } diff --git a/server/peer_server.go b/server/peer_server.go index 62ec06c41..4c77585f9 100644 --- a/server/peer_server.go +++ b/server/peer_server.go @@ -115,7 +115,7 @@ func (s *PeerServer) ListenAndServe(snapshot bool, cluster []string) { } else { // Rejoin the previous cluster - cluster = s.registry.PeerURLs(s.Leader(), s.name) + cluster = s.registry.URLs(s.Leader(), s.name, s.registry.peerURL) for i := 0; i < len(cluster); i++ { u, err := url.Parse(cluster[i]) if err != nil { diff --git a/server/registry.go b/server/registry.go index 55ffb10e0..4b1310871 100644 --- a/server/registry.go +++ b/server/registry.go @@ -73,14 +73,14 @@ func (r *Registry) Count() int { return len(e.KVPairs) } -// Retrieves the URL for a given node by name. -func (r *Registry) URL(name string) (string, bool) { +// Retrieves the client URL for a given node by name. +func (r *Registry) ClientURL(name string) (string, bool) { r.Lock() defer r.Unlock() - return r.url(name) + return r.clientURL(name) } -func (r *Registry) url(name string) (string, bool) { +func (r *Registry) clientURL(name string) (string, bool) { if r.nodes[name] == nil { r.load(name) } @@ -92,33 +92,6 @@ func (r *Registry) url(name string) (string, bool) { return "", false } -// Retrieves the URLs for all nodes. -func (r *Registry) URLs(leaderName, selfName string) []string { - r.Lock() - defer r.Unlock() - - // Build list including the leader and self. - urls := make([]string, 0) - if url, _ := r.url(leaderName); len(url) > 0 { - urls = append(urls, url) - } - - // Retrieve a list of all nodes. - if e, _ := r.store.Get(RegistryKey, false, false, 0, 0); e != nil { - // Lookup the URL for each one. - for _, pair := range e.KVPairs { - _, name := filepath.Split(pair.Key) - if url, _ := r.url(name); len(url) > 0 && name != leaderName { - urls = append(urls, url) - } - } - } - - log.Infof("URLs: %s / %s (%s)", leaderName, selfName, strings.Join(urls, ",")) - - return urls -} - // Retrieves the peer URL for a given node by name. func (r *Registry) PeerURL(name string) (string, bool) { r.Lock() @@ -138,14 +111,14 @@ func (r *Registry) peerURL(name string) (string, bool) { return "", false } -// Retrieves the peer URLs for all nodes. -func (r *Registry) PeerURLs(leaderName, selfName string) []string { +// Retrieves the URLs for all nodes using url function. +func (r *Registry) URLs(leaderName, selfName string, url func(name string) (string, bool)) []string { r.Lock() defer r.Unlock() // Build list including the leader and self. urls := make([]string, 0) - if url, _ := r.peerURL(leaderName); len(url) > 0 { + if url, _ := url(leaderName); len(url) > 0 { urls = append(urls, url) } @@ -154,13 +127,13 @@ func (r *Registry) PeerURLs(leaderName, selfName string) []string { // Lookup the URL for each one. for _, pair := range e.KVPairs { _, name := filepath.Split(pair.Key) - if url, _ := r.peerURL(name); len(url) > 0 && name != leaderName { + if url, _ := url(name); len(url) > 0 && name != leaderName { urls = append(urls, url) } } } - log.Infof("PeerURLs: %s / %s (%s)", leaderName, selfName, strings.Join(urls, ",")) + log.Infof("URLs: %s / %s (%s)", leaderName, selfName, strings.Join(urls, ",")) return urls } diff --git a/server/server.go b/server/server.go index 7fd918c6d..9aae925e7 100644 --- a/server/server.go +++ b/server/server.go @@ -207,7 +207,7 @@ func (s *Server) Dispatch(c raft.Command, w http.ResponseWriter, req *http.Reque case *JoinCommand, *RemoveCommand: url, _ = s.registry.PeerURL(leader) default: - url, _ = s.registry.URL(leader) + url, _ = s.registry.ClientURL(leader) } redirect(url, w, req) @@ -258,7 +258,7 @@ func (s *Server) GetLeaderHandler(w http.ResponseWriter, req *http.Request) erro // Handler to return all the known machines in the current cluster. func (s *Server) GetMachinesHandler(w http.ResponseWriter, req *http.Request) error { - machines := s.registry.URLs(s.peerServer.Leader(), s.name) + machines := s.registry.URLs(s.peerServer.Leader(), s.name, s.registry.clientURL) w.WriteHeader(http.StatusOK) w.Write([]byte(strings.Join(machines, ", "))) return nil @@ -281,7 +281,7 @@ func (s *Server) GetLeaderStatsHandler(w http.ResponseWriter, req *http.Request) if leader == "" { return etcdErr.NewError(300, "", store.UndefIndex, store.UndefTerm) } - hostname, _ := s.registry.URL(leader) + hostname, _ := s.registry.ClientURL(leader) redirect(hostname, w, req) return nil }