From 8d2397afadb67cc6b4f1775397f7dfd7be88dd8f Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Mon, 8 Sep 2025 14:24:14 -0700 Subject: [PATCH 01/15] be more precise about allocated part size --- include/aws/s3/private/s3_request.h | 15 +++++++++++---- source/s3_auto_ranged_put.c | 4 ++++ source/s3_client.c | 2 +- source/s3_request.c | 5 +++++ 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/include/aws/s3/private/s3_request.h b/include/aws/s3/private/s3_request.h index 33776b001..26573b52a 100644 --- a/include/aws/s3/private/s3_request.h +++ b/include/aws/s3/private/s3_request.h @@ -166,14 +166,17 @@ struct aws_s3_request { */ struct aws_s3_buffer_ticket *ticket; - /* Beginning range of this part. */ - /* TODO currently only used by auto_range_get, could be hooked up to auto_range_put as well. */ + /* Beginning range of this part. */ uint64_t part_range_start; - /* Last byte of this part.*/ - /* TODO currently only used by auto_range_get, could be hooked up to auto_range_put as well. */ + /* Last byte of this part. + * Note: this is available on both put and get, but in put case it can be optimistic, + * ex for unknown content length we dont know what the end will be until we finish reading data. */ uint64_t part_range_end; + /* Number of bytes in this part. */ + uint64_t part_size; + /* Part number that this request refers to. If this is not a part, this can be 0. (S3 Part Numbers start at 1.) * However, must currently be a valid part number (ie: greater than 0) if the response body is to be streamed to the * caller. @@ -292,6 +295,10 @@ struct aws_s3_request *aws_s3_request_new( uint32_t part_number, uint32_t flags); +/* Sets part boundary information on the request. */ +AWS_S3_API +void aws_s3_request_set_part_boundary(struct aws_s3_request *request, uint64_t part_start, uint64_t part_end); + /* Set up the request to be sent. Called each time before the request is sent. Will initially call * aws_s3_request_clean_up_send_data to clear out anything previously existing in send_data. */ AWS_S3_API diff --git a/source/s3_auto_ranged_put.c b/source/s3_auto_ranged_put.c index 0c11315fe..d39e2e014 100644 --- a/source/s3_auto_ranged_put.c +++ b/source/s3_auto_ranged_put.c @@ -592,6 +592,10 @@ static bool s_s3_auto_ranged_put_update( request->part_number = auto_ranged_put->threaded_update_data.next_part_number; + size_t request_body_size = + s_compute_request_body_size(meta_request, request->part_number, &request->part_range_start); + request->part_range_end = request->part_range_start + request_body_size - 1; + /* If request was previously uploaded, we prepare it to ensure checksums still match, * but ultimately it gets marked no-op and we don't send it */ request->was_previously_uploaded = request_previously_uploaded; diff --git a/source/s3_client.c b/source/s3_client.c index be97b9b88..4cdf776b0 100644 --- a/source/s3_client.c +++ b/source/s3_client.c @@ -1908,7 +1908,7 @@ void s_acquire_mem_and_prepare_request( struct aws_s3_buffer_pool_reserve_meta meta = { .client = client, .meta_request = meta_request, - .size = meta_request->part_size, + .size = aws_s3_request_get_part_size(request), }; struct aws_s3_reserve_memory_payload *payload = diff --git a/source/s3_request.c b/source/s3_request.c index fa7cd83ba..78792568e 100644 --- a/source/s3_request.c +++ b/source/s3_request.c @@ -45,6 +45,11 @@ struct aws_s3_request *aws_s3_request_new( return request; } +uint64_t aws_s3_request_get_part_size(struct aws_s3_request *request) { + /* +1 cause range end is inclusive */ + return request->part_range_end - request->part_range_start + 1; +} + static void s_populate_metrics_from_message(struct aws_s3_request *request, struct aws_http_message *message) { struct aws_byte_cursor out_path; AWS_ZERO_STRUCT(out_path); From 2bfdabb1028a316524e2a7e1bee98d24311abe91 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Mon, 8 Sep 2025 14:29:27 -0700 Subject: [PATCH 02/15] add fallback --- include/aws/s3/private/s3_request.h | 3 --- source/s3_client.c | 1 + source/s3_request.c | 3 ++- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/include/aws/s3/private/s3_request.h b/include/aws/s3/private/s3_request.h index 26573b52a..c160ff11a 100644 --- a/include/aws/s3/private/s3_request.h +++ b/include/aws/s3/private/s3_request.h @@ -174,9 +174,6 @@ struct aws_s3_request { * ex for unknown content length we dont know what the end will be until we finish reading data. */ uint64_t part_range_end; - /* Number of bytes in this part. */ - uint64_t part_size; - /* Part number that this request refers to. If this is not a part, this can be 0. (S3 Part Numbers start at 1.) * However, must currently be a valid part number (ie: greater than 0) if the response body is to be streamed to the * caller. diff --git a/source/s3_client.c b/source/s3_client.c index 4cdf776b0..d25d30dc6 100644 --- a/source/s3_client.c +++ b/source/s3_client.c @@ -1905,6 +1905,7 @@ void s_acquire_mem_and_prepare_request( struct aws_allocator *allocator = request->allocator; struct aws_s3_meta_request *meta_request = request->meta_request; + struct aws_s3_buffer_pool_reserve_meta meta = { .client = client, .meta_request = meta_request, diff --git a/source/s3_request.c b/source/s3_request.c index 78792568e..b993b0769 100644 --- a/source/s3_request.c +++ b/source/s3_request.c @@ -47,7 +47,8 @@ struct aws_s3_request *aws_s3_request_new( uint64_t aws_s3_request_get_part_size(struct aws_s3_request *request) { /* +1 cause range end is inclusive */ - return request->part_range_end - request->part_range_start + 1; + uint64_t size = request->part_range_end - request->part_range_start + 1 + return size > 0 ? size ? : request->meta_request->part_size; } static void s_populate_metrics_from_message(struct aws_s3_request *request, struct aws_http_message *message) { From 120087dd29da13109f3958308b66d9fd0b052728 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Mon, 8 Sep 2025 14:36:56 -0700 Subject: [PATCH 03/15] mobe helper earlier --- source/s3_auto_ranged_put.c | 56 ++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/source/s3_auto_ranged_put.c b/source/s3_auto_ranged_put.c index d39e2e014..be5d7a352 100644 --- a/source/s3_auto_ranged_put.c +++ b/source/s3_auto_ranged_put.c @@ -322,6 +322,34 @@ static struct aws_s3_meta_request_vtable s_s3_auto_ranged_put_vtable = { .pause = s_s3_auto_ranged_put_pause, }; +/** + * Helper to compute request body size. + * Basically returns either part size or if content is not equally divisible into parts, the size of the remaining last + * part. + */ +static size_t s_compute_request_body_size( + const struct aws_s3_meta_request *meta_request, + uint32_t part_number, + uint64_t *offset_out) { + AWS_PRECONDITION(meta_request); + + const struct aws_s3_auto_ranged_put *auto_ranged_put = meta_request->impl; + + size_t request_body_size = meta_request->part_size; + /* Last part--adjust size to match remaining content length. */ + if (auto_ranged_put->has_content_length && part_number == auto_ranged_put->total_num_parts_from_content_length) { + size_t content_remainder = (size_t)(auto_ranged_put->content_length % (uint64_t)meta_request->part_size); + + if (content_remainder > 0) { + request_body_size = content_remainder; + } + } + /* The part_number starts at 1 */ + *offset_out = (part_number - 1) * meta_request->part_size; + + return request_body_size; +} + /* Allocate a new auto-ranged put meta request */ struct aws_s3_meta_request *aws_s3_meta_request_auto_ranged_put_new( struct aws_allocator *allocator, @@ -752,34 +780,6 @@ static bool s_s3_auto_ranged_put_update( return work_remaining; } -/** - * Helper to compute request body size. - * Basically returns either part size or if content is not equally divisible into parts, the size of the remaining last - * part. - */ -static size_t s_compute_request_body_size( - const struct aws_s3_meta_request *meta_request, - uint32_t part_number, - uint64_t *offset_out) { - AWS_PRECONDITION(meta_request); - - const struct aws_s3_auto_ranged_put *auto_ranged_put = meta_request->impl; - - size_t request_body_size = meta_request->part_size; - /* Last part--adjust size to match remaining content length. */ - if (auto_ranged_put->has_content_length && part_number == auto_ranged_put->total_num_parts_from_content_length) { - size_t content_remainder = (size_t)(auto_ranged_put->content_length % (uint64_t)meta_request->part_size); - - if (content_remainder > 0) { - request_body_size = content_remainder; - } - } - /* The part_number starts at 1 */ - *offset_out = (part_number - 1) * meta_request->part_size; - - return request_body_size; -} - static int s_verify_part_matches_checksum( struct aws_allocator *allocator, struct aws_byte_cursor body_cur, From 594d76856154e05bf726cb81d698bdd3118383b2 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Mon, 8 Sep 2025 14:41:12 -0700 Subject: [PATCH 04/15] missing header --- source/s3_client.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/s3_client.c b/source/s3_client.c index d25d30dc6..c48979bfd 100644 --- a/source/s3_client.c +++ b/source/s3_client.c @@ -11,6 +11,7 @@ #include "aws/s3/private/s3_default_meta_request.h" #include "aws/s3/private/s3_meta_request_impl.h" #include "aws/s3/private/s3_parallel_input_stream.h" +#include "aws/s3/private/s3_request.h" #include "aws/s3/private/s3_request_messages.h" #include "aws/s3/private/s3_util.h" #include "aws/s3/private/s3express_credentials_provider_impl.h" From 25cec1642e044953beed0ca314166379b9719229 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Mon, 8 Sep 2025 14:44:08 -0700 Subject: [PATCH 05/15] lint --- source/s3_request.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/s3_request.c b/source/s3_request.c index b993b0769..fb982c6ac 100644 --- a/source/s3_request.c +++ b/source/s3_request.c @@ -47,8 +47,8 @@ struct aws_s3_request *aws_s3_request_new( uint64_t aws_s3_request_get_part_size(struct aws_s3_request *request) { /* +1 cause range end is inclusive */ - uint64_t size = request->part_range_end - request->part_range_start + 1 - return size > 0 ? size ? : request->meta_request->part_size; + uint64_t size = request->part_range_end - request->part_range_start + 1 return size > 0 + ? size ?: request->meta_request->part_size; } static void s_populate_metrics_from_message(struct aws_s3_request *request, struct aws_http_message *message) { From 90b752ef08ce18fb24fd4b4015f5bc7388a629be Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Mon, 8 Sep 2025 14:48:48 -0700 Subject: [PATCH 06/15] expose function --- include/aws/s3/private/s3_request.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/aws/s3/private/s3_request.h b/include/aws/s3/private/s3_request.h index c160ff11a..599805902 100644 --- a/include/aws/s3/private/s3_request.h +++ b/include/aws/s3/private/s3_request.h @@ -292,9 +292,9 @@ struct aws_s3_request *aws_s3_request_new( uint32_t part_number, uint32_t flags); -/* Sets part boundary information on the request. */ +/* Gets the size of the part payload. returns metarequest part size if accurate size is not available. */ AWS_S3_API -void aws_s3_request_set_part_boundary(struct aws_s3_request *request, uint64_t part_start, uint64_t part_end); +uint64_t aws_s3_request_get_part_size(struct aws_s3_request *request); /* Set up the request to be sent. Called each time before the request is sent. Will initially call * aws_s3_request_clean_up_send_data to clear out anything previously existing in send_data. */ From dff74a6f939b86dfa1f997bc50d67cff9d68e897 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Mon, 8 Sep 2025 14:53:27 -0700 Subject: [PATCH 07/15] fix formatting --- include/aws/s3/private/s3_request.h | 4 +++- source/s3_request.c | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/include/aws/s3/private/s3_request.h b/include/aws/s3/private/s3_request.h index 599805902..48f037f65 100644 --- a/include/aws/s3/private/s3_request.h +++ b/include/aws/s3/private/s3_request.h @@ -292,7 +292,9 @@ struct aws_s3_request *aws_s3_request_new( uint32_t part_number, uint32_t flags); -/* Gets the size of the part payload. returns metarequest part size if accurate size is not available. */ +/* Gets the size of the part payload. + * returns metarequest part size if accurate size is not available for request that have part size body or response or 0 + * otherwise. */ AWS_S3_API uint64_t aws_s3_request_get_part_size(struct aws_s3_request *request); diff --git a/source/s3_request.c b/source/s3_request.c index fb982c6ac..42a193dfd 100644 --- a/source/s3_request.c +++ b/source/s3_request.c @@ -47,8 +47,19 @@ struct aws_s3_request *aws_s3_request_new( uint64_t aws_s3_request_get_part_size(struct aws_s3_request *request) { /* +1 cause range end is inclusive */ - uint64_t size = request->part_range_end - request->part_range_start + 1 return size > 0 - ? size ?: request->meta_request->part_size; + uint64_t size = request->part_range_end - request->part_range_start + 1; + + if (size > 0) { + return size; + } + + if (request->request_type == AWS_S3_REQUEST_TYPE_GET_OBJECT || + request->request_type == AWS_S3_REQUEST_TYPE_PUT_OBJECT || + request->request_type == AWS_S3_REQUEST_TYPE_UPLOAD_PART) { + return request->meta_request->part_size; + } + + return 0; } static void s_populate_metrics_from_message(struct aws_s3_request *request, struct aws_http_message *message) { From 22de6ae5c32c94181f7c4c1cb281ecbd78004494 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Mon, 8 Sep 2025 15:00:27 -0700 Subject: [PATCH 08/15] fix win cast --- source/s3_client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/s3_client.c b/source/s3_client.c index c48979bfd..901e138ae 100644 --- a/source/s3_client.c +++ b/source/s3_client.c @@ -1910,7 +1910,7 @@ void s_acquire_mem_and_prepare_request( struct aws_s3_buffer_pool_reserve_meta meta = { .client = client, .meta_request = meta_request, - .size = aws_s3_request_get_part_size(request), + .size = (size_t)aws_s3_request_get_part_size(request), }; struct aws_s3_reserve_memory_payload *payload = From 34e5de2c45c91a31dc722a90831e0fb7199f6e21 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Mon, 8 Sep 2025 17:03:54 -0700 Subject: [PATCH 09/15] fix logic --- source/s3_request.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/source/s3_request.c b/source/s3_request.c index 42a193dfd..d14975ba3 100644 --- a/source/s3_request.c +++ b/source/s3_request.c @@ -46,11 +46,15 @@ struct aws_s3_request *aws_s3_request_new( } uint64_t aws_s3_request_get_part_size(struct aws_s3_request *request) { - /* +1 cause range end is inclusive */ - uint64_t size = request->part_range_end - request->part_range_start + 1; - - if (size > 0) { - return size; + /* Note: this is still somewhat suboptimal as 0-0 is a valid 1 byte range, but + * we will overallocate for it */ + bool is_range_set = + request->part_range_end != request->part_range_start || + request->part_range_start != 0; + + if (is_range_set) { + /* +1 cause range end is inclusive */ + return request->part_range_end - request->part_range_start + 1; } if (request->request_type == AWS_S3_REQUEST_TYPE_GET_OBJECT || From 493869da1e8a76bb6587326093c16ce08e64bd60 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Tue, 9 Sep 2025 11:44:26 -0700 Subject: [PATCH 10/15] lint --- source/s3_request.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/source/s3_request.c b/source/s3_request.c index d14975ba3..a7ce0db34 100644 --- a/source/s3_request.c +++ b/source/s3_request.c @@ -46,11 +46,9 @@ struct aws_s3_request *aws_s3_request_new( } uint64_t aws_s3_request_get_part_size(struct aws_s3_request *request) { - /* Note: this is still somewhat suboptimal as 0-0 is a valid 1 byte range, but + /* Note: this is still somewhat suboptimal as 0-0 is a valid 1 byte range, but * we will overallocate for it */ - bool is_range_set = - request->part_range_end != request->part_range_start || - request->part_range_start != 0; + bool is_range_set = request->part_range_end != request->part_range_start || request->part_range_start != 0; if (is_range_set) { /* +1 cause range end is inclusive */ From a1403ab8606fc700177b0419cc18220f0181970a Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Wed, 10 Sep 2025 11:39:03 -0700 Subject: [PATCH 11/15] address comments --- include/aws/s3/private/s3_request.h | 3 +-- source/s3_auto_ranged_get.c | 4 ++++ source/s3_client.c | 7 +++++-- source/s3_request.c | 19 ++++--------------- 4 files changed, 14 insertions(+), 19 deletions(-) diff --git a/include/aws/s3/private/s3_request.h b/include/aws/s3/private/s3_request.h index 48f037f65..393ecc2b5 100644 --- a/include/aws/s3/private/s3_request.h +++ b/include/aws/s3/private/s3_request.h @@ -293,8 +293,7 @@ struct aws_s3_request *aws_s3_request_new( uint32_t flags); /* Gets the size of the part payload. - * returns metarequest part size if accurate size is not available for request that have part size body or response or 0 - * otherwise. */ + * Range is inclusive (i.e. 0-0 range has 1 byte size). In case of misconfigured range returns 0. */ AWS_S3_API uint64_t aws_s3_request_get_part_size(struct aws_s3_request *request); diff --git a/source/s3_auto_ranged_get.c b/source/s3_auto_ranged_get.c index 5a3249531..cd758eb03 100644 --- a/source/s3_auto_ranged_get.c +++ b/source/s3_auto_ranged_get.c @@ -253,6 +253,10 @@ static bool s_s3_auto_ranged_get_update( 1 /*part_number*/, AWS_S3_REQUEST_FLAG_RECORD_RESPONSE_HEADERS | AWS_S3_REQUEST_FLAG_ALLOCATE_BUFFER_FROM_POOL); + /* Note: our current default logic is to do part 1, discover size and then abort if payload its too huge + * We optimistically reserve part size for it */ + request->part_range_start = 0; + request->part_range_end = meta_request->part_size; ++auto_ranged_get->synced_data.num_parts_requested; break; diff --git a/source/s3_client.c b/source/s3_client.c index 901e138ae..16cc09192 100644 --- a/source/s3_client.c +++ b/source/s3_client.c @@ -1897,7 +1897,10 @@ void s_acquire_mem_and_prepare_request( aws_s3_meta_request_prepare_request_callback_fn *callback, void *user_data) { - if (request->ticket == NULL && request->should_allocate_buffer_from_pool) { + size_t request_size = (size_t)aws_s3_request_get_part_size(request); + AWS_ASSERT(request_size != 0); /* Note: 0 request size is invalid in all cases. */ + + if (request->ticket == NULL && request->should_allocate_buffer_from_pool && request_size > 0) { if (request->send_data.metrics) { struct aws_s3_request_metrics *metric = request->send_data.metrics; @@ -1910,7 +1913,7 @@ void s_acquire_mem_and_prepare_request( struct aws_s3_buffer_pool_reserve_meta meta = { .client = client, .meta_request = meta_request, - .size = (size_t)aws_s3_request_get_part_size(request), + .size = request_size, }; struct aws_s3_reserve_memory_payload *payload = diff --git a/source/s3_request.c b/source/s3_request.c index a7ce0db34..83cf56209 100644 --- a/source/s3_request.c +++ b/source/s3_request.c @@ -46,22 +46,11 @@ struct aws_s3_request *aws_s3_request_new( } uint64_t aws_s3_request_get_part_size(struct aws_s3_request *request) { - /* Note: this is still somewhat suboptimal as 0-0 is a valid 1 byte range, but - * we will overallocate for it */ - bool is_range_set = request->part_range_end != request->part_range_start || request->part_range_start != 0; - - if (is_range_set) { - /* +1 cause range end is inclusive */ - return request->part_range_end - request->part_range_start + 1; - } - - if (request->request_type == AWS_S3_REQUEST_TYPE_GET_OBJECT || - request->request_type == AWS_S3_REQUEST_TYPE_PUT_OBJECT || - request->request_type == AWS_S3_REQUEST_TYPE_UPLOAD_PART) { - return request->meta_request->part_size; + uint64_t result = 0; + if (aws_sub_u64_checked(request->part_range_end, request->part_range_start, &result) != AWS_OP_SUCCESS) { + return 0; } - - return 0; + return result + 1; } static void s_populate_metrics_from_message(struct aws_s3_request *request, struct aws_http_message *message) { From 23901ba272f21a234c075c017e000c0087b51c20 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Wed, 10 Sep 2025 11:40:49 -0700 Subject: [PATCH 12/15] lint --- source/s3_auto_ranged_get.c | 6 +++--- source/s3_request.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/s3_auto_ranged_get.c b/source/s3_auto_ranged_get.c index cd758eb03..96987c8d0 100644 --- a/source/s3_auto_ranged_get.c +++ b/source/s3_auto_ranged_get.c @@ -253,9 +253,9 @@ static bool s_s3_auto_ranged_get_update( 1 /*part_number*/, AWS_S3_REQUEST_FLAG_RECORD_RESPONSE_HEADERS | AWS_S3_REQUEST_FLAG_ALLOCATE_BUFFER_FROM_POOL); - /* Note: our current default logic is to do part 1, discover size and then abort if payload its too huge - * We optimistically reserve part size for it */ - request->part_range_start = 0; + /* Note: our current default logic is to do part 1, discover size and then abort if payload its + * too huge We optimistically reserve part size for it */ + request->part_range_start = 0; request->part_range_end = meta_request->part_size; ++auto_ranged_get->synced_data.num_parts_requested; diff --git a/source/s3_request.c b/source/s3_request.c index 83cf56209..179a6b56b 100644 --- a/source/s3_request.c +++ b/source/s3_request.c @@ -48,7 +48,7 @@ struct aws_s3_request *aws_s3_request_new( uint64_t aws_s3_request_get_part_size(struct aws_s3_request *request) { uint64_t result = 0; if (aws_sub_u64_checked(request->part_range_end, request->part_range_start, &result) != AWS_OP_SUCCESS) { - return 0; + return 0; } return result + 1; } From 92d743c94720570a44ab26c464f7003c100f9c07 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Wed, 10 Sep 2025 13:26:48 -0700 Subject: [PATCH 13/15] add logging --- source/s3_auto_ranged_get.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/s3_auto_ranged_get.c b/source/s3_auto_ranged_get.c index 96987c8d0..ebddc6489 100644 --- a/source/s3_auto_ranged_get.c +++ b/source/s3_auto_ranged_get.c @@ -256,7 +256,7 @@ static bool s_s3_auto_ranged_get_update( /* Note: our current default logic is to do part 1, discover size and then abort if payload its * too huge We optimistically reserve part size for it */ request->part_range_start = 0; - request->part_range_end = meta_request->part_size; + request->part_range_end = meta_request->part_size - 1; ++auto_ranged_get->synced_data.num_parts_requested; break; @@ -288,8 +288,9 @@ static bool s_s3_auto_ranged_get_update( } AWS_LOGF_INFO( AWS_LS_S3_META_REQUEST, - "id=%p: Doing a ranged get to discover the size of the object and get the first part", - (void *)meta_request); + "id=%p: Doing a ranged get to discover the size of the object and get the first part %zu %zu", + (void *)meta_request, part_range_start, first_part_size + ); request = aws_s3_request_new( meta_request, From e54e88bfcfef17c200d09562336f0d869f52cb9a Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Sun, 14 Sep 2025 17:57:13 -0700 Subject: [PATCH 14/15] fix error case --- source/s3_meta_request.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/s3_meta_request.c b/source/s3_meta_request.c index 50d856661..f1a86a39b 100644 --- a/source/s3_meta_request.c +++ b/source/s3_meta_request.c @@ -1429,7 +1429,7 @@ static int s_s3_meta_request_incoming_body( if (request->send_data.response_body.capacity == 0) { /* Make sure that request is get, since puts can also have ticket allocated, which is used for request body. */ - if (request->request_type == AWS_S3_REQUEST_TYPE_GET_OBJECT && request->ticket != NULL) { + if (successful_response && request->request_type == AWS_S3_REQUEST_TYPE_GET_OBJECT && request->ticket != NULL) { request->send_data.response_body = aws_s3_buffer_ticket_claim(request->ticket); } else { size_t buffer_size = s_dynamic_body_initial_buf_size; From c0b262a4bfaca5a470526ef36595886a06fcd4b0 Mon Sep 17 00:00:00 2001 From: DmitriyMusatkin Date: Sun, 14 Sep 2025 18:13:33 -0700 Subject: [PATCH 15/15] build error --- source/s3_auto_ranged_get.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/s3_auto_ranged_get.c b/source/s3_auto_ranged_get.c index ebddc6489..7b4f3178f 100644 --- a/source/s3_auto_ranged_get.c +++ b/source/s3_auto_ranged_get.c @@ -288,8 +288,8 @@ static bool s_s3_auto_ranged_get_update( } AWS_LOGF_INFO( AWS_LS_S3_META_REQUEST, - "id=%p: Doing a ranged get to discover the size of the object and get the first part %zu %zu", - (void *)meta_request, part_range_start, first_part_size + "id=%p: Doing a ranged get to discover the size of the object and get the first part", + (void *)meta_request ); request = aws_s3_request_new(