(
self, client, config, osutil, request_executor, transfer_future
)
| 175 | ) |
| 176 | |
| 177 | def _submit_multipart_request( |
| 178 | self, client, config, osutil, request_executor, transfer_future |
| 179 | ): |
| 180 | call_args = transfer_future.meta.call_args |
| 181 | |
| 182 | # Submit the request to create a multipart upload and make sure it |
| 183 | # does not include any of the arguments used for copy part. |
| 184 | create_multipart_extra_args = {} |
| 185 | for param, val in call_args.extra_args.items(): |
| 186 | if param not in self.CREATE_MULTIPART_ARGS_BLACKLIST: |
| 187 | create_multipart_extra_args[param] = val |
| 188 | |
| 189 | create_multipart_future = self._transfer_coordinator.submit( |
| 190 | request_executor, |
| 191 | CreateMultipartUploadTask( |
| 192 | transfer_coordinator=self._transfer_coordinator, |
| 193 | main_kwargs={ |
| 194 | 'client': client, |
| 195 | 'bucket': call_args.bucket, |
| 196 | 'key': call_args.key, |
| 197 | 'extra_args': create_multipart_extra_args, |
| 198 | }, |
| 199 | ), |
| 200 | ) |
| 201 | |
| 202 | # Determine how many parts are needed based on filesize and |
| 203 | # desired chunksize. |
| 204 | part_size = config.multipart_chunksize |
| 205 | adjuster = ChunksizeAdjuster() |
| 206 | part_size = adjuster.adjust_chunksize( |
| 207 | part_size, transfer_future.meta.size |
| 208 | ) |
| 209 | num_parts = int( |
| 210 | math.ceil(transfer_future.meta.size / float(part_size)) |
| 211 | ) |
| 212 | |
| 213 | # Submit requests to upload the parts of the file. |
| 214 | part_futures = [] |
| 215 | progress_callbacks = get_callbacks(transfer_future, 'progress') |
| 216 | |
| 217 | for part_number in range(1, num_parts + 1): |
| 218 | extra_part_args = self._extra_upload_part_args( |
| 219 | call_args.extra_args |
| 220 | ) |
| 221 | # The part number for upload part starts at 1 while the |
| 222 | # range parameter starts at zero, so just subtract 1 off of |
| 223 | # the part number |
| 224 | extra_part_args['CopySourceRange'] = calculate_range_parameter( |
| 225 | part_size, |
| 226 | part_number - 1, |
| 227 | num_parts, |
| 228 | transfer_future.meta.size, |
| 229 | ) |
| 230 | if transfer_future.meta.etag is not None: |
| 231 | extra_part_args['CopySourceIfMatch'] = ( |
| 232 | transfer_future.meta.etag |
| 233 | ) |
| 234 | # Get the size of the part copy as well for the progress |
no test coverage detected