20318: Remove memory-backed keep block cache.
[arvados.git] / sdk / go / keepclient / gateway_shim.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 package keepclient
6
7 import (
8         "context"
9         "fmt"
10         "io"
11         "net/http"
12         "strings"
13         "time"
14
15         "git.arvados.org/arvados.git/sdk/go/arvados"
16 )
17
18 // keepViaHTTP implements arvados.KeepGateway by using a KeepClient to
19 // do upstream requests to keepstore and keepproxy.
20 type keepViaHTTP struct {
21         *KeepClient
22 }
23
24 func (kvh *keepViaHTTP) ReadAt(locator string, dst []byte, offset int) (int, error) {
25         rdr, _, _, _, err := kvh.getOrHead("GET", locator, nil)
26         if err != nil {
27                 return 0, err
28         }
29         defer rdr.Close()
30         _, err = io.CopyN(io.Discard, rdr, int64(offset))
31         if err != nil {
32                 return 0, err
33         }
34         n, err := rdr.Read(dst)
35         return int(n), err
36 }
37
38 func (kvh *keepViaHTTP) BlockRead(ctx context.Context, opts arvados.BlockReadOptions) (int, error) {
39         rdr, _, _, _, err := kvh.getOrHead("GET", opts.Locator, nil)
40         if err != nil {
41                 return 0, err
42         }
43         defer rdr.Close()
44         n, err := io.Copy(opts.WriteTo, rdr)
45         return int(n), err
46 }
47
48 func (kvh *keepViaHTTP) BlockWrite(ctx context.Context, req arvados.BlockWriteOptions) (arvados.BlockWriteResponse, error) {
49         return kvh.httpBlockWrite(ctx, req)
50 }
51
52 func (kvh *keepViaHTTP) LocalLocator(locator string) (string, error) {
53         if !strings.Contains(locator, "+R") {
54                 // Either it has +A, or it's unsigned and we assume
55                 // it's a local locator on a site with signatures
56                 // disabled.
57                 return locator, nil
58         }
59         sighdr := fmt.Sprintf("local, time=%s", time.Now().UTC().Format(time.RFC3339))
60         _, _, url, hdr, err := kvh.KeepClient.getOrHead("HEAD", locator, http.Header{"X-Keep-Signature": []string{sighdr}})
61         if err != nil {
62                 return "", err
63         }
64         loc := hdr.Get("X-Keep-Locator")
65         if loc == "" {
66                 return "", fmt.Errorf("missing X-Keep-Locator header in HEAD response from %s", url)
67         }
68         return loc, nil
69 }