From 44ae7a037bfb0db78b2aee221f8c67ad4498587f Mon Sep 17 00:00:00 2001 From: Bala FA Date: Wed, 6 Jul 2016 09:29:54 +0530 Subject: [PATCH] fix: allocate buffer to required size than readSizeV1 (#2095) Refer #2077 --- erasure-utils.go | 12 ++++++++---- fs-v1-multipart.go | 17 +++++++++++++---- fs-v1.go | 17 +++++++++++++---- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/erasure-utils.go b/erasure-utils.go index c72681e17..45ab4ac65 100644 --- a/erasure-utils.go +++ b/erasure-utils.go @@ -152,13 +152,17 @@ func getEncodedBlockLen(inputLen int64, dataBlocks int) (curEncBlockSize int64) // err == nil, not err == EOF. Additionally offset can be provided to start // the read at. copyN returns io.EOF if there aren't enough data to be read. func copyN(writer io.Writer, disk StorageAPI, volume string, path string, offset int64, length int64) (err error) { - // Use 128KiB staging buffer to read up to length. - buf := make([]byte, readSizeV1) + // Use staging buffer to read up to length. + bufSize := int64(readSizeV1) + if length > 0 && bufSize > length { + bufSize = length + } + buf := make([]byte, int(bufSize)) // Read into writer until length. for length > 0 { - curLength := int64(readSizeV1) - if length < readSizeV1 { + curLength := bufSize + if length < bufSize { curLength = length } nr, er := disk.ReadFile(volume, path, offset, buf[:curLength]) diff --git a/fs-v1-multipart.go b/fs-v1-multipart.go index 0002f8aa0..c676f7252 100644 --- a/fs-v1-multipart.go +++ b/fs-v1-multipart.go @@ -304,10 +304,15 @@ func (fs fsObjects) PutObjectPart(bucket, object, uploadID string, partID int, s limitDataReader = data } - // Allocate 128KiB buffer for staging buffer. - var buf = make([]byte, readSizeV1) + // Allocate buffer for staging buffer. + bufSize := int64(readSizeV1) + if size > 0 && bufSize > size { + bufSize = size + } + var buf = make([]byte, int(bufSize)) - // Read till io.EOF. + // Read up to required size + totalLeft := size for { n, err := io.ReadFull(limitDataReader, buf) if err == io.EOF { @@ -321,6 +326,10 @@ func (fs fsObjects) PutObjectPart(bucket, object, uploadID string, partID int, s if err = fs.storage.AppendFile(minioMetaBucket, tmpPartPath, buf[:n]); err != nil { return "", toObjectErr(err, bucket, object) } + + if totalLeft -= int64(n); size >= 0 && totalLeft <= 0 { + break + } } // Validate if payload is valid. @@ -509,7 +518,7 @@ func (fs fsObjects) CompleteMultipartUpload(bucket string, object string, upload tempObj := path.Join(tmpMetaPrefix, uploadID, "part.1") - // Allocate 128KiB of staging buffer. + // Allocate staging buffer. var buf = make([]byte, readSizeV1) // Loop through all parts, validate them and then commit to disk. diff --git a/fs-v1.go b/fs-v1.go index d42733e5b..345c7d417 100644 --- a/fs-v1.go +++ b/fs-v1.go @@ -218,11 +218,16 @@ func (fs fsObjects) GetObject(bucket, object string, offset int64, length int64, return ObjectNameInvalid{Bucket: bucket, Object: object} } var totalLeft = length - buf := make([]byte, readSizeV1) // Allocate a 128KiB staging buffer. + bufSize := int64(readSizeV1) + if length > 0 && bufSize > length { + bufSize = length + } + // Allocate a staging buffer. + buf := make([]byte, int(bufSize)) for totalLeft > 0 { // Figure out the right size for the buffer. - curLeft := int64(readSizeV1) - if totalLeft < readSizeV1 { + curLeft := bufSize + if totalLeft < bufSize { curLeft = totalLeft } // Reads the file at offset. @@ -333,7 +338,11 @@ func (fs fsObjects) PutObject(bucket string, object string, size int64, data io. } } else { // Allocate a buffer to Read() the object upload stream. - buf := make([]byte, readSizeV1) + bufSize := int64(readSizeV1) + if size > 0 && bufSize > size { + bufSize = size + } + buf := make([]byte, int(bufSize)) // Read the buffer till io.EOF and append the read data to the temporary file. for {