[ARVADOS] created: 1.1.0-17-gb523697

Git user git at public.curoverse.com
Wed Oct 11 16:41:48 EDT 2017


        at  b523697bcde7000eaf306a4378d253612ddde3ca (commit)


commit b523697bcde7000eaf306a4378d253612ddde3ca
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Wed Oct 11 16:28:43 2017 -0400

    12416: Merge Put() into PutReader().
    
    Put() was only used for empty blocks, and passing a nil reader to
    PutReader works just as well.
    
    This ensures the "put empty block" fix applies to all writes.
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>

diff --git a/services/keepstore/s3_volume.go b/services/keepstore/s3_volume.go
index bd929fb..e6a53d0 100644
--- a/services/keepstore/s3_volume.go
+++ b/services/keepstore/s3_volume.go
@@ -420,7 +420,7 @@ func (v *S3Volume) Put(ctx context.Context, loc string, block []byte) error {
 		if err != nil {
 			return
 		}
-		err = v.bucket.Put("recent/"+loc, nil, "application/octet-stream", s3ACL, s3.Options{})
+		err = v.bucket.PutReader("recent/"+loc, nil, 0, "application/octet-stream", s3ACL, s3.Options{})
 	}()
 	select {
 	case <-ctx.Done():
@@ -452,7 +452,7 @@ func (v *S3Volume) Touch(loc string) error {
 	} else if err != nil {
 		return err
 	}
-	err = v.bucket.Put("recent/"+loc, nil, "application/octet-stream", s3ACL, s3.Options{})
+	err = v.bucket.PutReader("recent/"+loc, nil, 0, "application/octet-stream", s3ACL, s3.Options{})
 	return v.translateError(err)
 }
 
@@ -466,7 +466,7 @@ func (v *S3Volume) Mtime(loc string) (time.Time, error) {
 	err = v.translateError(err)
 	if os.IsNotExist(err) {
 		// The data object X exists, but recent/X is missing.
-		err = v.bucket.Put("recent/"+loc, nil, "application/octet-stream", s3ACL, s3.Options{})
+		err = v.bucket.PutReader("recent/"+loc, nil, 0, "application/octet-stream", s3ACL, s3.Options{})
 		if err != nil {
 			log.Printf("error: creating %q: %s", "recent/"+loc, err)
 			return zeroTime, v.translateError(err)
@@ -648,7 +648,7 @@ func (v *S3Volume) Untrash(loc string) error {
 	if err != nil {
 		return err
 	}
-	err = v.bucket.Put("recent/"+loc, nil, "application/octet-stream", s3ACL, s3.Options{})
+	err = v.bucket.PutReader("recent/"+loc, nil, 0, "application/octet-stream", s3ACL, s3.Options{})
 	return v.translateError(err)
 }
 
@@ -927,21 +927,18 @@ func (b *s3bucket) Head(path string, headers map[string][]string) (*http.Respons
 }
 
 func (b *s3bucket) PutReader(path string, r io.Reader, length int64, contType string, perm s3.ACL, options s3.Options) error {
-	err := b.Bucket.PutReader(path, NewCountingReader(r, b.stats.TickOutBytes), length, contType, perm, options)
-	b.stats.Tick(&b.stats.Ops, &b.stats.PutOps)
-	b.stats.TickErr(err)
-	return err
-}
-
-func (b *s3bucket) Put(path string, data []byte, contType string, perm s3.ACL, options s3.Options) error {
-        var reader io.ReadCloser
-	// goamz will only send Content-Length: 0 when io.Reader is nil due to net.http.Request.ContentLength
-	// behavior. otherwise, Content-Length header is omitted which will cause some S3-like services (such
-	// as Ceph RadosGW) to fail to create empty objects
-        if data != nil {
-               reader = NewCountingReader(bytes.NewBuffer(data), b.stats.TickOutBytes)
+	if length == 0 {
+		// goamz will only send Content-Length: 0 when reader
+		// is nil due to net.http.Request.ContentLength
+		// behavior.  Otherwise, Content-Length header is
+		// omitted which will cause some S3 services
+		// (including AWS and Ceph RadosGW) to fail to create
+		// empty objects.
+		r = nil
+	} else {
+		r = NewCountingReader(r, b.stats.TickOutBytes)
 	}
-	err := b.Bucket.PutReader(path, reader, int64(len(data)), contType, perm, options)
+	err := b.Bucket.PutReader(path, r, length, contType, perm, options)
 	b.stats.Tick(&b.stats.Ops, &b.stats.PutOps)
 	b.stats.TickErr(err)
 	return err

commit 3e001ed795c8539d4959160163f90fd05b7979ff
Merge: 0bb435a 7653bf0
Author: Tom Clegg <tclegg at veritasgenetics.com>
Date:   Wed Oct 11 16:19:42 2017 -0400

    12416: Merge branch 'fix/keepstore-s3-radosgw-empty-object' of https://github.com/wtsi-hgi/arvados into 12416-s3-empty-object
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg at veritasgenetics.com>


commit 7653bf0721f0fe770fe08fab72da863321979598
Author: Joshua C. Randall <jcrandall at alum.mit.edu>
Date:   Sun Oct 8 12:10:33 2017 +0000

    fix s3_volume so that it can create empty recent/* objects on Ceph RadosGW

diff --git a/services/keepstore/s3_volume.go b/services/keepstore/s3_volume.go
index 3f08f6e..bd929fb 100644
--- a/services/keepstore/s3_volume.go
+++ b/services/keepstore/s3_volume.go
@@ -934,7 +934,14 @@ func (b *s3bucket) PutReader(path string, r io.Reader, length int64, contType st
 }
 
 func (b *s3bucket) Put(path string, data []byte, contType string, perm s3.ACL, options s3.Options) error {
-	err := b.Bucket.PutReader(path, NewCountingReader(bytes.NewBuffer(data), b.stats.TickOutBytes), int64(len(data)), contType, perm, options)
+        var reader io.ReadCloser
+	// goamz will only send Content-Length: 0 when io.Reader is nil due to net.http.Request.ContentLength
+	// behavior. otherwise, Content-Length header is omitted which will cause some S3-like services (such
+	// as Ceph RadosGW) to fail to create empty objects
+        if data != nil {
+               reader = NewCountingReader(bytes.NewBuffer(data), b.stats.TickOutBytes)
+	}
+	err := b.Bucket.PutReader(path, reader, int64(len(data)), contType, perm, options)
 	b.stats.Tick(&b.stats.Ops, &b.stats.PutOps)
 	b.stats.TickErr(err)
 	return err

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list