@@ -805,37 +805,41 @@ func (s *S3Backend) CopyBlob(param *CopyBlobInput) (*CopyBlobOutput, error) {
805
805
metadataDirective = s3 .MetadataDirectiveReplace
806
806
}
807
807
808
- // FIXME Remove additional HEAD query
808
+ from := s . bucket + "/" + param . Source
809
809
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 {
812
813
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 )) {
818
817
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
+ }
826
823
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
+ }
830
831
831
- from := s .bucket + "/" + param .Source
832
+ if param .StorageClass == nil {
833
+ param .StorageClass = s .selectStorageClass (param .Size )
834
+ }
832
835
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
837
842
}
838
- return & CopyBlobOutput {reqId }, nil
839
843
}
840
844
841
845
params := & s3.CopyObjectInput {
0 commit comments