v2_standby.go 1002 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package etcd
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strconv"
  6. )
  7. func (s *Server) serveRedirect(w http.ResponseWriter, r *http.Request) error {
  8. if s.leader == noneId {
  9. return fmt.Errorf("no leader in the cluster")
  10. }
  11. redirectAddr, err := s.buildRedirectURL(s.leaderAddr, r.URL)
  12. if err != nil {
  13. return err
  14. }
  15. http.Redirect(w, r, redirectAddr, http.StatusTemporaryRedirect)
  16. return nil
  17. }
  18. func (s *Server) syncCluster() error {
  19. for node := range s.nodes {
  20. machines, err := s.client.GetMachines(node)
  21. if err != nil {
  22. continue
  23. }
  24. config, err := s.client.GetClusterConfig(node)
  25. if err != nil {
  26. continue
  27. }
  28. s.nodes = make(map[string]bool)
  29. for _, machine := range machines {
  30. s.nodes[machine.PeerURL] = true
  31. if machine.State == stateLeader {
  32. id, err := strconv.ParseInt(machine.Name, 0, 64)
  33. if err != nil {
  34. return err
  35. }
  36. s.leader = id
  37. s.leaderAddr = machine.PeerURL
  38. }
  39. }
  40. s.clusterConf = config
  41. return nil
  42. }
  43. return fmt.Errorf("unreachable cluster")
  44. }