dispatch.go 987 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package v1
  2. // Dispatch the command to leader.
  3. func dispatchCommand(c Command, w http.ResponseWriter, req *http.Request, s *server.Server) error {
  4. return dispatch(c, w, req, s, nameToEtcdURL)
  5. }
  6. // Dispatches a command to a given URL.
  7. func dispatch(c Command, w http.ResponseWriter, req *http.Request, s *server.Server, toURL func(name string) (string, bool)) error {
  8. r := s.raftServer
  9. if r.State() == raft.Leader {
  10. event, err := r.Do(c)
  11. if err != nil {
  12. return err
  13. }
  14. if event == nil {
  15. return etcdErr.NewError(300, "Empty result from raft", store.UndefIndex, store.UndefTerm)
  16. }
  17. event, _ := event.(*store.Event)
  18. response := eventToResponse(event)
  19. b, _ := json.Marshal(response)
  20. w.WriteHeader(http.StatusOK)
  21. w.Write(b)
  22. return nil
  23. } else {
  24. leader := r.Leader()
  25. // No leader available.
  26. if leader == "" {
  27. return etcdErr.NewError(300, "", store.UndefIndex, store.UndefTerm)
  28. }
  29. url, _ := toURL(leader)
  30. redirect(url, w, req)
  31. return nil
  32. }
  33. }