mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
43 lines
987 B
Go
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
|
|
}
|
|
}
|