From ef74464aea88a7a6574595d2511f037f6dcbecb7 Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Sun, 13 Oct 2013 23:09:52 -0700 Subject: [PATCH] refactor remove extra function --- server/peer_server.go | 55 ++++++++++++++++++---------------- server/peer_server_handlers.go | 8 ++--- server/server.go | 47 +---------------------------- 3 files changed, 33 insertions(+), 77 deletions(-) diff --git a/server/peer_server.go b/server/peer_server.go index 5edcb2005..942d9e062 100644 --- a/server/peer_server.go +++ b/server/peer_server.go @@ -9,6 +9,7 @@ import ( "io/ioutil" "net/http" "net/url" + "strings" "time" etcdErr "github.com/coreos/etcd/error" @@ -346,44 +347,48 @@ func (s *PeerServer) monitorSnapshot() { func (s *PeerServer) dispatch(c raft.Command, w http.ResponseWriter, req *http.Request) error { if s.State() == raft.Leader { - if response, err := s.Do(c); err != nil { + result, err := s.Do(c) + if err != nil { return err - } else { - if response == nil { - return etcdErr.NewError(300, "Empty response from raft", store.UndefIndex, store.UndefTerm) - } + } - event, ok := response.(*store.Event) - if ok { - bytes, err := json.Marshal(event) - if err != nil { - fmt.Println(err) - } + if result == nil { + return etcdErr.NewError(300, "Empty result from raft", store.UndefIndex, store.UndefTerm) + } - w.Header().Add("X-Etcd-Index", fmt.Sprint(event.Index)) - w.Header().Add("X-Etcd-Term", fmt.Sprint(event.Term)) - w.WriteHeader(http.StatusOK) - w.Write(bytes) - - return nil - } - - bytes, _ := response.([]byte) + // response for raft related commands[join/remove] + if b, ok := result.([]byte); ok { w.WriteHeader(http.StatusOK) - w.Write(bytes) - + w.Write(b) return nil } + var b []byte + if strings.HasPrefix(req.URL.Path, "/v1") { + b, _ = json.Marshal(result.(*store.Event).Response()) + } else { + b, _ = json.Marshal(result.(*store.Event)) + } + w.WriteHeader(http.StatusOK) + w.Write(b) + + return nil + } else { leader := s.Leader() - // current no leader + + // No leader available. if leader == "" { return etcdErr.NewError(300, "", store.UndefIndex, store.UndefTerm) } - url, _ := s.registry.PeerURL(leader) - log.Debugf("Not leader; Current leader: %s; redirect: %s", leader, url) + var url string + switch c.(type) { + case *JoinCommand, *RemoveCommand: + url, _ = s.registry.PeerURL(leader) + default: + url, _ = s.registry.ClientURL(leader) + } redirect(url, w, req) return nil diff --git a/server/peer_server_handlers.go b/server/peer_server_handlers.go index d18fdc21b..ad055623e 100644 --- a/server/peer_server_handlers.go +++ b/server/peer_server_handlers.go @@ -113,7 +113,7 @@ func (s *PeerServer) JoinHttpHandler(w http.ResponseWriter, req *http.Request) { } log.Debugf("Receive Join Request from %s", command.Name) - err = s.dispatchRaftCommand(command, w, req) + err = s.dispatch(command, w, req) // Return status. if err != nil { @@ -140,7 +140,7 @@ func (s *PeerServer) RemoveHttpHandler(w http.ResponseWriter, req *http.Request) log.Debugf("[recv] Remove Request [%s]", command.Name) - s.dispatchRaftCommand(command, w, req) + s.dispatch(command, w, req) } // Response to the name request @@ -156,7 +156,3 @@ func (s *PeerServer) RaftVersionHttpHandler(w http.ResponseWriter, req *http.Req w.WriteHeader(http.StatusOK) w.Write([]byte(PeerVersion)) } - -func (s *PeerServer) dispatchRaftCommand(c raft.Command, w http.ResponseWriter, req *http.Request) error { - return s.dispatch(c, w, req) -} diff --git a/server/server.go b/server/server.go index 7f55c8a47..24064fa4e 100644 --- a/server/server.go +++ b/server/server.go @@ -1,7 +1,6 @@ package server import ( - "encoding/json" "fmt" "net/http" "net/url" @@ -168,51 +167,7 @@ func (s *Server) ListenAndServe() { } func (s *Server) Dispatch(c raft.Command, w http.ResponseWriter, req *http.Request) error { - if s.peerServer.State() == raft.Leader { - event, err := s.peerServer.Do(c) - if err != nil { - return err - } - - if event == nil { - return etcdErr.NewError(300, "Empty result from raft", store.UndefIndex, store.UndefTerm) - } - - if b, ok := event.([]byte); ok { - w.WriteHeader(http.StatusOK) - w.Write(b) - } - - var b []byte - if strings.HasPrefix(req.URL.Path, "/v1") { - b, _ = json.Marshal(event.(*store.Event).Response()) - } else { - b, _ = json.Marshal(event.(*store.Event)) - } - w.WriteHeader(http.StatusOK) - w.Write(b) - - return nil - - } else { - leader := s.peerServer.Leader() - - // No leader available. - if leader == "" { - return etcdErr.NewError(300, "", store.UndefIndex, store.UndefTerm) - } - - var url string - switch c.(type) { - case *JoinCommand, *RemoveCommand: - url, _ = s.registry.PeerURL(leader) - default: - url, _ = s.registry.ClientURL(leader) - } - redirect(url, w, req) - - return nil - } + return s.peerServer.dispatch(c, w, req) } // Sets a comma-delimited list of origins that are allowed.