Browse Source

rafthttp: add remote in pipeline and snapshot handler when corresponding peer or remote do not exist

Fixes: #8506
blueblue 8 years ago
parent
commit
2bb893b478
2 changed files with 13 additions and 10 deletions
  1. 2 10
      rafthttp/http.go
  2. 11 0
      rafthttp/util.go

+ 2 - 10
rafthttp/http.go

@@ -91,11 +91,7 @@ func (h *pipelineHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	if from, err := types.IDFromString(r.Header.Get("X-Server-From")); err == nil {
-		if urls := r.Header.Get("X-PeerURLs"); urls != "" {
-			h.tr.AddRemote(from, strings.Split(urls, ","))
-		}
-	}
+	addRemoteFromRequest(h.tr, r)
 
 	// Limit the data size that could be read from the request body, which ensures that read from
 	// connection will not time out accidentally due to possible blocking in underlying implementation.
@@ -176,11 +172,7 @@ func (h *snapshotHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	if from, err := types.IDFromString(r.Header.Get("X-Server-From")); err == nil {
-		if urls := r.Header.Get("X-PeerURLs"); urls != "" {
-			h.tr.AddRemote(from, strings.Split(urls, ","))
-		}
-	}
+	addRemoteFromRequest(h.tr, r)
 
 	dec := &messageDecoder{r: r.Body}
 	// let snapshots be very large since they can exceed 512MB for large installations

+ 11 - 0
rafthttp/util.go

@@ -175,3 +175,14 @@ func setPeerURLsHeader(req *http.Request, urls types.URLs) {
 	}
 	req.Header.Set("X-PeerURLs", strings.Join(peerURLs, ","))
 }
+
+// addRemoteFromRequest add remote according to request header
+func addRemoteFromRequest(tr Transporter, r *http.Request) bool {
+	if from, err := types.IDFromString(r.Header.Get("X-Server-From")); err == nil {
+		if urls := r.Header.Get("X-PeerURLs"); urls != "" {
+			tr.AddRemote(from, strings.Split(urls, ","))
+			return true
+		}
+	}
+	return false
+}