@@ -265,6 +265,9 @@ def __init__(
265265 self ._total_size = 0
266266 self ._transferred = 0
267267
268+ parallel = options .parallel_num > 1 and self ._request .progress_fn is not None
269+ self ._progress_lock = threading .Lock () if parallel else None
270+
268271 #Source's Info
269272 self ._metadata_prop = metadata_prop
270273 self ._tag_prop = tag_prop
@@ -330,6 +333,8 @@ def copy(self) -> CopyResult:
330333 def _single_copy (self ) -> CopyResult :
331334 result = self ._client .copy_object (self ._request )
332335
336+ self ._update_progress (self ._total_size )
337+
333338 ret = CopyResult (
334339 etag = result .etag ,
335340 version_id = result .version_id ,
@@ -352,6 +357,8 @@ def _shallow_copy(self) -> (CopyResult):
352357 return self ._multipart_copy ()
353358 raise
354359
360+ self ._update_progress (self ._total_size )
361+
355362 ret = CopyResult (
356363 etag = result .etag ,
357364 version_id = result .version_id ,
@@ -488,7 +495,7 @@ def _iter_part(self):
488495 self ._reader_pos += n
489496
490497 start_part_num += 1
491- yield upload_id , start_part_num , range , timeout
498+ yield upload_id , start_part_num , range , timeout , n
492499
493500 def _copy_part (self , part ):
494501 # When an error occurs, ignore other upload requests
@@ -499,6 +506,7 @@ def _copy_part(self, part):
499506 part_number = part [1 ]
500507 range = part [2 ]
501508 timeout = part [3 ]
509+ part_size = part [4 ]
502510 error : Exception = None
503511 etag = None
504512
@@ -511,11 +519,25 @@ def _copy_part(self, part):
511519 result = self ._client .upload_part_copy (request , readwrite_timeout = timeout )
512520 etag = result .etag
513521
522+ self ._update_progress (part_size )
514523 except Exception as err :
515524 error = err
516525
526+
517527 return part_number , etag , error
518528
529+ def _update_progress (self , increment : int ):
530+ if self ._request .progress_fn is None :
531+ return
532+
533+ if self ._progress_lock :
534+ with self ._progress_lock :
535+ self ._transferred += increment
536+ self ._request .progress_fn (increment , self ._transferred , self ._total_size )
537+ else :
538+ self ._transferred += increment
539+ self ._request .progress_fn (increment , self ._transferred , self ._total_size )
540+
519541 def _update_upload_result_lock (self , result ) -> None :
520542 if self ._copy_part_lock :
521543 with self ._copy_part_lock :
0 commit comments