@@ -62,6 +62,7 @@ struct aws_s3_meta_request *aws_s3_meta_request_auto_ranged_get_new(
6262 struct aws_allocator * allocator ,
6363 struct aws_s3_client * client ,
6464 size_t part_size ,
65+ bool part_size_set ,
6566 const struct aws_s3_meta_request_options * options ) {
6667 AWS_PRECONDITION (allocator );
6768 AWS_PRECONDITION (client );
@@ -91,6 +92,7 @@ struct aws_s3_meta_request *aws_s3_meta_request_auto_ranged_get_new(
9192 return NULL ;
9293 }
9394
95+ auto_ranged_get -> part_size_set = part_size_set ;
9496 struct aws_http_headers * headers = aws_http_message_get_headers (auto_ranged_get -> base .initial_request_message );
9597 AWS_ASSERT (headers != NULL );
9698
@@ -319,8 +321,12 @@ static bool s_s3_auto_ranged_get_update(
319321 * we could end up stuck in a situation where the user is
320322 * waiting for more bytes before they'll open the window,
321323 * and this implementation is waiting for more window before it will send more parts. */
322- uint64_t read_data_requested =
323- auto_ranged_get -> synced_data .num_parts_requested * meta_request -> part_size ;
324+ uint64_t read_data_requested = 0 ;
325+ if (auto_ranged_get -> synced_data .num_parts_requested > 0 ) {
326+ read_data_requested =
327+ (auto_ranged_get -> synced_data .num_parts_requested - 1 ) * meta_request -> part_size +
328+ auto_ranged_get -> synced_data .first_part_size ;
329+ }
324330 if (read_data_requested >= meta_request -> synced_data .read_window_running_total ) {
325331
326332 /* Avoid spamming users with this DEBUG message */
@@ -805,6 +811,20 @@ static void s_s3_auto_ranged_get_request_finished(
805811 error_code = AWS_ERROR_SUCCESS ;
806812 found_object_size = true;
807813
814+ if (!auto_ranged_get -> part_size_set && !meta_request -> client -> part_size_set ) {
815+ /* No part size has been set from user. Now we use the optimal part size based on the throughput and memory
816+ * limit */
817+ uint64_t out_request_optimal_range_size = 0 ;
818+ int error = aws_s3_calculate_request_optimal_range_size (
819+ meta_request -> client -> optimal_range_size ,
820+ auto_ranged_get -> estimated_object_stored_part_size ,
821+ & out_request_optimal_range_size );
822+ if (!error ) {
823+ /* Override the part size to be */
824+ * ((size_t * )& meta_request -> part_size ) = (size_t )out_request_optimal_range_size ;
825+ }
826+ }
827+
808828 /* Check for checksums if requested to */
809829 if (meta_request -> checksum_config .validate_response_checksum ) {
810830 if (aws_s3_check_headers_for_checksum (
0 commit comments