Skip to content

Commit b1b0584

Browse files
committed
Do not use multipart copying for metadata-only updates
1 parent bdcbc1a commit b1b0584

File tree

1 file changed

+28
-24
lines changed

1 file changed

+28
-24
lines changed

internal/backend_s3.go

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -805,37 +805,41 @@ func (s *S3Backend) CopyBlob(param *CopyBlobInput) (*CopyBlobOutput, error) {
805805
metadataDirective = s3.MetadataDirectiveReplace
806806
}
807807

808-
// FIXME Remove additional HEAD query
808+
from := s.bucket + "/" + param.Source
809809

810-
if param.Size == nil || param.ETag == nil || (*param.Size > s.config.MultipartCopyThreshold &&
811-
(param.Metadata == nil || param.StorageClass == nil)) {
810+
// Copy into the same object is used to just update metadata
811+
// and should be very quick regardless of parameters
812+
if param.Source != param.Destination {
812813

813-
params := &HeadBlobInput{Key: param.Source}
814-
resp, err := s.HeadBlob(params)
815-
if err != nil {
816-
return nil, err
817-
}
814+
// FIXME Remove additional HEAD query
815+
if param.Size == nil || param.ETag == nil || (*param.Size > s.config.MultipartCopyThreshold &&
816+
(param.Metadata == nil || param.StorageClass == nil)) {
818817

819-
param.Size = &resp.Size
820-
param.ETag = resp.ETag
821-
if param.Metadata == nil {
822-
param.Metadata = resp.Metadata
823-
}
824-
param.StorageClass = resp.StorageClass
825-
}
818+
params := &HeadBlobInput{Key: param.Source}
819+
resp, err := s.HeadBlob(params)
820+
if err != nil {
821+
return nil, err
822+
}
826823

827-
if param.StorageClass == nil {
828-
param.StorageClass = s.selectStorageClass(param.Size)
829-
}
824+
param.Size = &resp.Size
825+
param.ETag = resp.ETag
826+
if param.Metadata == nil {
827+
param.Metadata = resp.Metadata
828+
}
829+
param.StorageClass = resp.StorageClass
830+
}
830831

831-
from := s.bucket + "/" + param.Source
832+
if param.StorageClass == nil {
833+
param.StorageClass = s.selectStorageClass(param.Size)
834+
}
832835

833-
if !s.gcs && *param.Size > s.config.MultipartCopyThreshold {
834-
reqId, err := s.copyObjectMultipart(int64(*param.Size), from, param.Destination, "", param.ETag, param.Metadata, param.StorageClass)
835-
if err != nil {
836-
return nil, err
836+
if !s.gcs && *param.Size > s.config.MultipartCopyThreshold {
837+
reqId, err := s.copyObjectMultipart(int64(*param.Size), from, param.Destination, "", param.ETag, param.Metadata, param.StorageClass)
838+
if err != nil {
839+
return nil, err
840+
}
841+
return &CopyBlobOutput{reqId}, nil
837842
}
838-
return &CopyBlobOutput{reqId}, nil
839843
}
840844

841845
params := &s3.CopyObjectInput{

0 commit comments

Comments
 (0)