From 7e9b9d420b58c22c41a713b9bfbfd0f5718abb1a Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Thu, 31 May 2018 13:44:18 -0400 Subject: [PATCH] 13517: Fix leaked goroutine and buffer on failed S3 write. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- services/keepstore/s3_volume.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/keepstore/s3_volume.go b/services/keepstore/s3_volume.go index 9d4d801928..bdab58927b 100644 --- a/services/keepstore/s3_volume.go +++ b/services/keepstore/s3_volume.go @@ -429,7 +429,7 @@ func (v *S3Volume) Put(ctx context.Context, loc string, block []byte) error { case <-ctx.Done(): theConfig.debugLogf("%s: taking PutReader's input away: %s", v, ctx.Err()) // Our pipe might be stuck in Write(), waiting for - // io.Copy() to read. If so, un-stick it. This means + // PutReader() to read. If so, un-stick it. This means // PutReader will get corrupt data, but that's OK: the // size and MD5 won't match, so the write will fail. go io.Copy(ioutil.Discard, bufr) @@ -438,6 +438,8 @@ func (v *S3Volume) Put(ctx context.Context, loc string, block []byte) error { theConfig.debugLogf("%s: abandoning PutReader goroutine", v) return ctx.Err() case <-ready: + // Unblock pipe in case PutReader did not consume it. + io.Copy(ioutil.Discard, bufr) return v.translateError(err) } } -- 2.30.2