Просмотр исходного кода

contrib/raftexample: Allow nodes to be removed from a running cluster

A node with ID n can be removed by DELETEing /n on the HTTP server.
Adam Wolfe Gordon 10 лет назад
Родитель
Сommit
4a527be302
1 измененных файлов с 17 добавлено и 0 удалено
  1. 17 0
      contrib/raftexample/httpapi.go

+ 17 - 0
contrib/raftexample/httpapi.go

@@ -73,12 +73,29 @@ func (h *httpKVAPI) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		}
 		h.confChangeC <- cc
 
+		// As above, optimistic that raft will apply the conf change
+		w.WriteHeader(http.StatusNoContent)
+	case r.Method == "DELETE":
+		nodeId, err := strconv.ParseUint(key[1:], 0, 64)
+		if err != nil {
+			log.Printf("Failed to convert ID for conf change (%v)\n", err)
+			http.Error(w, "Failed on DELETE", http.StatusBadRequest)
+			return
+		}
+
+		cc := raftpb.ConfChange{
+			Type:   raftpb.ConfChangeRemoveNode,
+			NodeID: nodeId,
+		}
+		h.confChangeC <- cc
+
 		// As above, optimistic that raft will apply the conf change
 		w.WriteHeader(http.StatusNoContent)
 	default:
 		w.Header().Set("Allow", "PUT")
 		w.Header().Add("Allow", "GET")
 		w.Header().Add("Allow", "POST")
+		w.Header().Add("Allow", "DELETE")
 		http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
 	}
 }