13011: Fix 411 error when writing empty block to Azure storage.
authorTom Clegg <tclegg@veritasgenetics.com>
Tue, 30 Jan 2018 21:04:34 +0000 (16:04 -0500)
committerTom Clegg <tclegg@veritasgenetics.com>
Tue, 30 Jan 2018 21:25:36 +0000 (16:25 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

services/keepstore/azure_blob_volume.go
services/keepstore/azure_blob_volume_test.go

index c64ac7a8fe1e2645b11e0917c3c5b9bcaab54369..62c856da340183d0483503e0a2393816acaf0321 100644 (file)
@@ -402,7 +402,17 @@ func (v *AzureBlobVolume) Put(ctx context.Context, loc string, block []byte) err
        }()
        errChan := make(chan error)
        go func() {
-               errChan <- v.bsClient.CreateBlockBlobFromReader(v.ContainerName, loc, uint64(len(block)), bufr, nil)
+               var body io.Reader = bufr
+               if len(block) == 0 {
+                       // We must send a "Content-Length: 0" header,
+                       // but the http client interprets
+                       // ContentLength==0 as "unknown" unless it can
+                       // confirm by introspection that Body will
+                       // read 0 bytes.
+                       body = http.NoBody
+                       bufr.Close()
+               }
+               errChan <- v.bsClient.CreateBlockBlobFromReader(v.ContainerName, loc, uint64(len(block)), body, nil)
        }()
        select {
        case <-ctx.Done():
@@ -722,7 +732,9 @@ func (c *azureBlobClient) GetBlobRange(cname, bname, byterange string, hdrs map[
 
 func (c *azureBlobClient) CreateBlockBlobFromReader(cname, bname string, size uint64, rdr io.Reader, hdrs map[string]string) error {
        c.stats.Tick(&c.stats.Ops, &c.stats.CreateOps)
-       rdr = NewCountingReader(rdr, c.stats.TickOutBytes)
+       if size != 0 {
+               rdr = NewCountingReader(rdr, c.stats.TickOutBytes)
+       }
        err := c.client.CreateBlockBlobFromReader(cname, bname, size, rdr, hdrs)
        c.stats.TickErr(err)
        return err
index 4256ec0d0cb599e259ff7cabcc6f3407fd2e6dce..06216edcb82aeddc3617c121cecc4e1a6387be4a 100644 (file)
@@ -124,6 +124,11 @@ func (h *azStubHandler) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
                return
        }
 
+       if (r.Method == "PUT" || r.Method == "POST") && r.Header.Get("Content-Length") == "" {
+               rw.WriteHeader(http.StatusLengthRequired)
+               return
+       }
+
        body, err := ioutil.ReadAll(r.Body)
        if err != nil {
                return