12167: Propagate X-Request-Id in keep requests.
authorTom Clegg <tclegg@veritasgenetics.com>
Wed, 25 Apr 2018 04:34:19 +0000 (00:34 -0400)
committerTom Clegg <tclegg@veritasgenetics.com>
Wed, 25 Apr 2018 04:36:54 +0000 (00:36 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

sdk/go/keepclient/keepclient.go
sdk/go/keepclient/support.go
services/keep-web/handler.go
services/keepproxy/proxy_client.go

index 620bdbec4eaa64a7809bbbc539bf59d0c6ea2275..459197c12d64f44d76b8082a6fb8ba8911ae193e 100644 (file)
@@ -22,6 +22,7 @@ import (
 
        "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
        "git.curoverse.com/arvados.git/sdk/go/asyncbuf"
+       "git.curoverse.com/arvados.git/sdk/go/httpserver"
 )
 
 // A Keep "block" is 64MB.
@@ -99,6 +100,7 @@ type KeepClient struct {
        HTTPClient         HTTPClient
        Retries            int
        BlockCache         *BlockCache
+       RequestID          string
 
        // set to 1 if all writable services are of disk type, otherwise 0
        replicasPerService int
@@ -232,7 +234,7 @@ func (kc *KeepClient) getOrHead(method string, locator string) (io.ReadCloser, i
                                errs = append(errs, fmt.Sprintf("%s: %v", url, err))
                                continue
                        }
-                       req.Header.Add("Authorization", fmt.Sprintf("OAuth2 %s", kc.Arvados.ApiToken))
+                       kc.setRequestHeaders(req)
                        resp, err := kc.httpClient().Do(req)
                        if err != nil {
                                // Probably a network error, may be transient,
@@ -350,7 +352,7 @@ func (kc *KeepClient) GetIndex(keepServiceUUID, prefix string) (io.Reader, error
                return nil, err
        }
 
-       req.Header.Add("Authorization", fmt.Sprintf("OAuth2 %s", kc.Arvados.ApiToken))
+       kc.setRequestHeaders(req)
        resp, err := kc.httpClient().Do(req)
        if err != nil {
                return nil, err
@@ -539,6 +541,17 @@ func (kc *KeepClient) httpClient() HTTPClient {
        return c
 }
 
+var reqIDGen = httpserver.IDGenerator{Prefix: "req-"}
+
+func (kc *KeepClient) setRequestHeaders(req *http.Request) {
+       req.Header.Add("Authorization", "OAuth2 "+kc.Arvados.ApiToken)
+       if kc.RequestID != "" {
+               req.Header.Set("X-Request-Id", kc.RequestID)
+       } else {
+               req.Header.Set("X-Request-Id", reqIDGen.Next())
+       }
+}
+
 type Locator struct {
        Hash  string
        Size  int      // -1 if data size is not known
index 37912506a2cb6ab7c014a0edac13e922c20526d6..a40a5744eba7904c811ebe78f784a956c5c5cff2 100644 (file)
@@ -77,7 +77,7 @@ func (this *KeepClient) uploadToKeepServer(host string, hash string, body io.Rea
                // to be empty, so don't set req.Body.
        }
 
-       req.Header.Add("Authorization", fmt.Sprintf("OAuth2 %s", this.Arvados.ApiToken))
+       this.setRequestHeaders(req)
        req.Header.Add("Content-Type", "application/octet-stream")
        req.Header.Add(X_Keep_Desired_Replicas, fmt.Sprint(this.Want_replicas))
 
index 63e2f37a80b4e04a244ad1f32de9af03ba834287..02e7cb185834b3cccb8a7642ea81509bfecb8dfd 100644 (file)
@@ -416,6 +416,7 @@ func (h *handler) ServeHTTP(wOrig http.ResponseWriter, r *http.Request) {
                statusCode, statusText = http.StatusInternalServerError, err.Error()
                return
        }
+       kc.RequestID = r.Header.Get("X-Request-Id")
 
        var basename string
        if len(targetPath) > 0 {
@@ -528,6 +529,7 @@ func (h *handler) serveSiteFS(w http.ResponseWriter, r *http.Request, tokens []s
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
        }
+       kc.RequestID = r.Header.Get("X-Request-Id")
        client := (&arvados.Client{
                APIHost:   arv.ApiServer,
                AuthToken: arv.ApiToken,
index 3fa2671df58331bb52c16651ded3924e9390ee90..06dfa1c0adc3a56575f7761c7c2ebecfe6c147a7 100644 (file)
@@ -20,6 +20,6 @@ type proxyClient struct {
 
 func (pc *proxyClient) Do(req *http.Request) (*http.Response, error) {
        req.Header.Add("Via", pc.proto+" "+viaAlias)
-       req.Header.Add("X-Request-Id", pc.requestID)
+       req.Header.Set("X-Request-Id", pc.requestID)
        return pc.client.Do(req)
 }