Merge branch 'master' into 13804-no-shutdown-wanted-nodes
[arvados.git] / sdk / go / keepclient / keepclient.go
index 620bdbec4eaa64a7809bbbc539bf59d0c6ea2275..169f1457e2e06e6e3424856809c92fc5dc74d4f9 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,8 @@ type KeepClient struct {
        HTTPClient         HTTPClient
        Retries            int
        BlockCache         *BlockCache
+       RequestID          string
+       StorageClasses     []string
 
        // set to 1 if all writable services are of disk type, otherwise 0
        replicasPerService int
@@ -200,6 +203,8 @@ func (kc *KeepClient) getOrHead(method string, locator string) (io.ReadCloser, i
                return ioutil.NopCloser(bytes.NewReader(nil)), 0, "", nil
        }
 
+       reqid := kc.getRequestID()
+
        var expectLength int64
        if parts := strings.SplitN(locator, "+", 3); len(parts) < 2 {
                expectLength = -1
@@ -232,7 +237,8 @@ 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))
+                       req.Header.Add("Authorization", "OAuth2 "+kc.Arvados.ApiToken)
+                       req.Header.Add("X-Request-Id", reqid)
                        resp, err := kc.httpClient().Do(req)
                        if err != nil {
                                // Probably a network error, may be transient,
@@ -350,7 +356,8 @@ func (kc *KeepClient) GetIndex(keepServiceUUID, prefix string) (io.Reader, error
                return nil, err
        }
 
-       req.Header.Add("Authorization", fmt.Sprintf("OAuth2 %s", kc.Arvados.ApiToken))
+       req.Header.Add("Authorization", "OAuth2 "+kc.Arvados.ApiToken)
+       req.Header.Set("X-Request-Id", kc.getRequestID())
        resp, err := kc.httpClient().Do(req)
        if err != nil {
                return nil, err
@@ -539,6 +546,16 @@ func (kc *KeepClient) httpClient() HTTPClient {
        return c
 }
 
+var reqIDGen = httpserver.IDGenerator{Prefix: "req-"}
+
+func (kc *KeepClient) getRequestID() string {
+       if kc.RequestID != "" {
+               return kc.RequestID
+       } else {
+               return reqIDGen.Next()
+       }
+}
+
 type Locator struct {
        Hash  string
        Size  int      // -1 if data size is not known