etcd/server/v1/dispatch.go
2013-10-11 00:07:22 -06:00

43 lines
987 B
Go

package v1
// Dispatch the command to leader.
func dispatchCommand(c Command, w http.ResponseWriter, req *http.Request, s *server.Server) error {
return dispatch(c, w, req, s, nameToEtcdURL)
}
// Dispatches a command to a given URL.
func dispatch(c Command, w http.ResponseWriter, req *http.Request, s *server.Server, toURL func(name string) (string, bool)) error {
r := s.raftServer
if r.State() == raft.Leader {
event, err := r.Do(c)
if err != nil {
return err
}
if event == nil {
return etcdErr.NewError(300, "Empty result from raft", store.UndefIndex, store.UndefTerm)
}
event, _ := event.(*store.Event)
response := eventToResponse(event)
b, _ := json.Marshal(response)
w.WriteHeader(http.StatusOK)
w.Write(b)
return nil
} else {
leader := r.Leader()
// No leader available.
if leader == "" {
return etcdErr.NewError(300, "", store.UndefIndex, store.UndefTerm)
}
url, _ := toURL(leader)
redirect(url, w, req)
return nil
}
}