|
6 | 6 | #include "aws/s3/private/s3_auto_ranged_put.h" |
7 | 7 | #include "aws/s3/private/s3_checksums.h" |
8 | 8 | #include "aws/s3/private/s3_list_parts.h" |
| 9 | +#include "aws/s3/private/s3_parallel_input_stream.h" |
9 | 10 | #include "aws/s3/private/s3_request_messages.h" |
10 | 11 | #include "aws/s3/private/s3_util.h" |
11 | 12 | #include <aws/common/clock.h> |
@@ -841,7 +842,7 @@ void s_s3_auto_ranged_put_schedule_prepare_request( |
841 | 842 | * reading. */ |
842 | 843 | bool parallel_prepare = |
843 | 844 | (meta_request->request_body_parallel_stream && request->request_tag == AWS_S3_AUTO_RANGED_PUT_REQUEST_TAG_PART); |
844 | | - |
| 845 | + request->parallel = parallel_prepare; |
845 | 846 | aws_s3_meta_request_schedule_prepare_request_default_impl( |
846 | 847 | meta_request, request, parallel_prepare /*parallel*/, callback, user_data); |
847 | 848 | } |
@@ -974,8 +975,16 @@ struct aws_future_http_message *s_s3_prepare_upload_part(struct aws_s3_request * |
974 | 975 | part_prep->allocator = allocator; |
975 | 976 | part_prep->request = request; |
976 | 977 | part_prep->on_complete = aws_future_http_message_acquire(message_future); |
| 978 | + if (request->parallel) { |
977 | 979 |
|
978 | | - if (request->num_times_prepared == 0) { |
| 980 | + uint64_t offset = 0; |
| 981 | + size_t request_body_size = s_compute_request_body_size(meta_request, request->part_number, &offset); |
| 982 | + request->request_stream = aws_input_stream_new_from_file( |
| 983 | + allocator, aws_parallel_input_stream_get_file_path(meta_request->request_body_parallel_stream)); |
| 984 | + request->content_length = request_body_size; |
| 985 | + aws_input_stream_seek(request->request_stream, offset, AWS_SSB_BEGIN); |
| 986 | + s_s3_prepare_upload_part_finish(part_prep, AWS_ERROR_SUCCESS); |
| 987 | + } else if (request->num_times_prepared == 0) { |
979 | 988 | /* Preparing request for the first time. |
980 | 989 | * Next async step: read through the body stream until we've |
981 | 990 | * skipped over parts that were already uploaded (in case we're resuming |
@@ -1155,15 +1164,26 @@ static void s_s3_prepare_upload_part_finish(struct aws_s3_prepare_upload_part_jo |
1155 | 1164 | } |
1156 | 1165 |
|
1157 | 1166 | /* Create a new put-object message to upload a part. */ |
1158 | | - struct aws_http_message *message = aws_s3_upload_part_message_new( |
1159 | | - meta_request->allocator, |
1160 | | - meta_request->initial_request_message, |
1161 | | - &request->request_body, |
1162 | | - request->part_number, |
1163 | | - auto_ranged_put->upload_id, |
1164 | | - meta_request->should_compute_content_md5, |
1165 | | - &meta_request->checksum_config, |
1166 | | - checksum_buf); |
| 1167 | + struct aws_http_message *message = NULL; |
| 1168 | + if (request->parallel) { |
| 1169 | + message = aws_s3_upload_part_message_new_streaming( |
| 1170 | + meta_request->allocator, |
| 1171 | + meta_request->initial_request_message, |
| 1172 | + request->part_number, |
| 1173 | + request->request_stream, |
| 1174 | + request->content_length, |
| 1175 | + auto_ranged_put->upload_id); |
| 1176 | + } else { |
| 1177 | + message = aws_s3_upload_part_message_new( |
| 1178 | + meta_request->allocator, |
| 1179 | + meta_request->initial_request_message, |
| 1180 | + &request->request_body, |
| 1181 | + request->part_number, |
| 1182 | + auto_ranged_put->upload_id, |
| 1183 | + meta_request->should_compute_content_md5, |
| 1184 | + &meta_request->checksum_config, |
| 1185 | + checksum_buf); |
| 1186 | + } |
1167 | 1187 | if (message == NULL) { |
1168 | 1188 | aws_future_http_message_set_error(part_prep->on_complete, aws_last_error()); |
1169 | 1189 | goto on_done; |
|
0 commit comments