From ead3e06c9d35cf0968ce548244ba927e80080aec Mon Sep 17 00:00:00 2001 From: shabbyrobe Date: Mon, 11 Mar 2019 22:30:25 +1100 Subject: [PATCH] Move PutObject body read outside lock --- backend/s3mem/backend.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/backend/s3mem/backend.go b/backend/s3mem/backend.go index 5806cb8..d541dce 100644 --- a/backend/s3mem/backend.go +++ b/backend/s3mem/backend.go @@ -216,6 +216,14 @@ func (db *Backend) GetObject(bucketName, objectName string, rangeRequest *gofake } func (db *Backend) PutObject(bucketName, objectName string, meta map[string]string, input io.Reader, size int64) (result gofakes3.PutObjectResult, err error) { + // No need to lock the backend while we read the data into memory; it holds + // the write lock open unnecessarily, and could be blocked for an unreasonably + // long time by a connection timing out: + bts, err := gofakes3.ReadAll(input, size) + if err != nil { + return result, err + } + db.lock.Lock() defer db.lock.Unlock() @@ -224,11 +232,6 @@ func (db *Backend) PutObject(bucketName, objectName string, meta map[string]stri return result, gofakes3.BucketNotFound(bucketName) } - bts, err := gofakes3.ReadAll(input, size) - if err != nil { - return result, err - } - hash := md5.Sum(bts) item := &bucketData{