[ARVADOS] updated: 1df4ab124c117a232c5360f6bac95d5409a5b598

Git user git at public.curoverse.com
Sun Nov 6 21:55:16 EST 2016


Summary of changes:
 services/keepstore/config_test.go |  9 +++++++++
 services/keepstore/handlers.go    | 41 +++++++++++++++++++++------------------
 services/keepstore/s3_volume.go   |  8 ++------
 3 files changed, 33 insertions(+), 25 deletions(-)
 create mode 100644 services/keepstore/config_test.go

       via  1df4ab124c117a232c5360f6bac95d5409a5b598 (commit)
       via  cbeb6e5991ac022252310ef61bbd44c6a3d60de8 (commit)
       via  f8e257317bdd584737e419fabc9ff74203d07680 (commit)
       via  03dbaf0ae698188507b9beb4f4e590d7da862bcb (commit)
      from  e3210822c04c9fb1028a63664658110918e35d70 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit 1df4ab124c117a232c5360f6bac95d5409a5b598
Author: Tom Clegg <tom at curoverse.com>
Date:   Sun Nov 6 19:44:22 2016 -0500

    10467: Fix context error not propagated.

diff --git a/services/keepstore/handlers.go b/services/keepstore/handlers.go
index 141cca6..588ee04 100644
--- a/services/keepstore/handlers.go
+++ b/services/keepstore/handlers.go
@@ -654,6 +654,9 @@ func PutBlock(ctx context.Context, block []byte, hash string) (int, error) {
 		if err := vol.Put(ctx, hash, block); err == nil {
 			return vol.Replication(), nil // success!
 		}
+		if ctx.Err() != nil {
+			return 0, ctx.Err()
+		}
 	}
 
 	writables := KeepVM.AllWritable()
@@ -665,10 +668,8 @@ func PutBlock(ctx context.Context, block []byte, hash string) (int, error) {
 	allFull := true
 	for _, vol := range writables {
 		err := vol.Put(ctx, hash, block)
-		select {
-		case <-ctx.Done():
+		if ctx.Err() != nil {
 			return 0, ctx.Err()
-		default:
 		}
 		if err == nil {
 			return vol.Replication(), nil // success!

commit cbeb6e5991ac022252310ef61bbd44c6a3d60de8
Author: Tom Clegg <tom at curoverse.com>
Date:   Sun Nov 6 19:41:02 2016 -0500

    10467: Fix ctx not propagated.

diff --git a/services/keepstore/handlers.go b/services/keepstore/handlers.go
index ba2078f..141cca6 100644
--- a/services/keepstore/handlers.go
+++ b/services/keepstore/handlers.go
@@ -651,7 +651,7 @@ func PutBlock(ctx context.Context, block []byte, hash string) (int, error) {
 	// Choose a Keep volume to write to.
 	// If this volume fails, try all of the volumes in order.
 	if vol := KeepVM.NextWritable(); vol != nil {
-		if err := vol.Put(context.TODO(), hash, block); err == nil {
+		if err := vol.Put(ctx, hash, block); err == nil {
 			return vol.Replication(), nil // success!
 		}
 	}

commit f8e257317bdd584737e419fabc9ff74203d07680
Author: Tom Clegg <tom at curoverse.com>
Date:   Sun Nov 6 19:35:05 2016 -0500

    10467: Fix context usage: ensure cancel always gets called.

diff --git a/services/keepstore/config_test.go b/services/keepstore/config_test.go
new file mode 100644
index 0000000..eaa0904
--- /dev/null
+++ b/services/keepstore/config_test.go
@@ -0,0 +1,9 @@
+package main
+
+import (
+	"log"
+)
+
+func init() {
+	theConfig.debugLogf = log.Printf
+}
diff --git a/services/keepstore/handlers.go b/services/keepstore/handlers.go
index 210e2b4..ba2078f 100644
--- a/services/keepstore/handlers.go
+++ b/services/keepstore/handlers.go
@@ -72,7 +72,8 @@ func BadRequestHandler(w http.ResponseWriter, r *http.Request) {
 
 // GetBlockHandler is a HandleFunc to address Get block requests.
 func GetBlockHandler(resp http.ResponseWriter, req *http.Request) {
-	ctx := contextForResponse(context.TODO(), resp)
+	ctx, cancel := contextForResponse(context.TODO(), resp)
+	defer cancel()
 
 	if theConfig.RequireSignatures {
 		locator := req.URL.Path[1:] // strip leading slash
@@ -111,20 +112,20 @@ func GetBlockHandler(resp http.ResponseWriter, req *http.Request) {
 	resp.Write(buf[:size])
 }
 
-// Return a new context that gets cancelled by resp's
-// CloseNotifier. If resp does not implement http.CloseNotifier,
-// return parent.
-func contextForResponse(parent context.Context, resp http.ResponseWriter) context.Context {
-	cn, ok := resp.(http.CloseNotifier)
-	if !ok {
-		return parent
-	}
+// Return a new context that gets cancelled by resp's CloseNotifier.
+func contextForResponse(parent context.Context, resp http.ResponseWriter) (context.Context, context.CancelFunc) {
 	ctx, cancel := context.WithCancel(parent)
-	go func(c <-chan bool) {
-		<-c
-		cancel()
-	}(cn.CloseNotify())
-	return ctx
+	if cn, ok := resp.(http.CloseNotifier); ok {
+		go func(c <-chan bool) {
+			select {
+			case <-c:
+				theConfig.debugLogf("cancel context")
+				cancel()
+			case <-ctx.Done():
+			}
+		}(cn.CloseNotify())
+	}
+	return ctx, cancel
 }
 
 // Get a buffer from the pool -- but give up and return a non-nil
@@ -150,7 +151,8 @@ func getBufferWithContext(ctx context.Context, bufs *bufferPool, bufSize int) ([
 
 // PutBlockHandler is a HandleFunc to address Put block requests.
 func PutBlockHandler(resp http.ResponseWriter, req *http.Request) {
-	ctx := contextForResponse(context.TODO(), resp)
+	ctx, cancel := contextForResponse(context.TODO(), resp)
+	defer cancel()
 
 	hash := mux.Vars(req)["hash"]
 

commit 03dbaf0ae698188507b9beb4f4e590d7da862bcb
Author: Tom Clegg <tom at curoverse.com>
Date:   Sun Nov 6 19:23:08 2016 -0500

    10467: Tidy up s3 early-cancel.

diff --git a/services/keepstore/s3_volume.go b/services/keepstore/s3_volume.go
index 9180d95..82e321e 100644
--- a/services/keepstore/s3_volume.go
+++ b/services/keepstore/s3_volume.go
@@ -340,20 +340,16 @@ func (v *S3Volume) Put(ctx context.Context, loc string, block []byte) error {
 	ready := make(chan bool)
 	go func() {
 		defer func() {
-			select {
-			case <-ctx.Done():
+			if ctx.Err() != nil {
 				theConfig.debugLogf("%s: abandoned PutReader goroutine finished with err: %s", v, err)
-			default:
 			}
 		}()
 		defer close(ready)
 		err = v.bucket.PutReader(loc, bufr, int64(size), "application/octet-stream", s3ACL, opts)
 		if err != nil {
-			err = v.translateError(err)
 			return
 		}
 		err = v.bucket.Put("recent/"+loc, nil, "application/octet-stream", s3ACL, s3.Options{})
-		err = v.translateError(err)
 	}()
 	select {
 	case <-ctx.Done():
@@ -368,7 +364,7 @@ func (v *S3Volume) Put(ctx context.Context, loc string, block []byte) error {
 		theConfig.debugLogf("%s: abandoning PutReader goroutine", v)
 		return ctx.Err()
 	case <-ready:
-		return err
+		return v.translateError(err)
 	}
 }
 

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


hooks/post-receive
-- 




More information about the arvados-commits mailing list