| 123456789101112131415161718192021222324252627282930313233343536373839404142 |
- 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
- }
- }
|