20318: Fix write using Reader and unspecified Hash.
authorTom Clegg <tom@curii.com>
Tue, 26 Dec 2023 17:25:34 +0000 (12:25 -0500)
committerTom Clegg <tom@curii.com>
Tue, 26 Dec 2023 20:44:45 +0000 (15:44 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

sdk/go/keepclient/keepclient_test.go
sdk/go/keepclient/support.go

index a6e0a11d510b6f5c79a510a1db22633cc775a134..ad5d12b505c0fa17e79efc4ce35c5aa365c7da3a 100644 (file)
@@ -1101,19 +1101,20 @@ func (s *ServerRequiredSuite) TestPutGetHead(c *C) {
        }
        {
                hash2, replicas, err := kc.PutB(content)
+               c.Check(err, IsNil)
                c.Check(hash2, Matches, fmt.Sprintf(`%s\+%d\b.*`, hash, len(content)))
                c.Check(replicas, Equals, 2)
-               c.Check(err, Equals, nil)
        }
        {
                r, n, url2, err := kc.Get(hash)
                c.Check(err, Equals, nil)
                c.Check(n, Equals, int64(len(content)))
                c.Check(url2, Matches, fmt.Sprintf("http://localhost:\\d+/%s", hash))
-
-               readContent, err2 := ioutil.ReadAll(r)
-               c.Check(err2, Equals, nil)
-               c.Check(readContent, DeepEquals, content)
+               if c.Check(r, NotNil) {
+                       readContent, err2 := ioutil.ReadAll(r)
+                       c.Check(err2, Equals, nil)
+                       c.Check(readContent, DeepEquals, content)
+               }
        }
        {
                n, url2, err := kc.Ask(hash)
index c4144bf8714efcfccef385abf9e65f4cc5fdbd21..6acaf64baa34caa265eb10bafcbf36a70d308d9b 100644 (file)
@@ -149,8 +149,12 @@ func (kc *KeepClient) httpBlockWrite(ctx context.Context, req arvados.BlockWrite
                getReader = func() io.Reader { return bytes.NewReader(req.Data[:req.DataSize]) }
        } else {
                buf := asyncbuf.NewBuffer(make([]byte, 0, req.DataSize))
+               reader := req.Reader
+               if req.Hash != "" {
+                       reader = HashCheckingReader{req.Reader, md5.New(), req.Hash}
+               }
                go func() {
-                       _, err := io.Copy(buf, HashCheckingReader{req.Reader, md5.New(), req.Hash})
+                       _, err := io.Copy(buf, reader)
                        buf.CloseWithError(err)
                }()
                getReader = buf.NewReader