Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package aws-c-s3 for openSUSE:Factory checked in at 2025-07-21 20:02:10 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/aws-c-s3 (Old) and /work/SRC/openSUSE:Factory/.aws-c-s3.new.8875 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "aws-c-s3" Mon Jul 21 20:02:10 2025 rev:26 rq:1294811 version:0.8.4 Changes: -------- --- /work/SRC/openSUSE:Factory/aws-c-s3/aws-c-s3.changes 2025-07-02 18:17:57.280524425 +0200 +++ /work/SRC/openSUSE:Factory/.aws-c-s3.new.8875/aws-c-s3.changes 2025-07-21 20:03:29.551056320 +0200 @@ -1,0 +2,8 @@ +Tue Jul 15 11:55:48 UTC 2025 - John Paul Adrian Glaubitz <adrian.glaub...@suse.com> + +- Update to version 0.8.4 + * More request metrics by @DmitriyMusatkin in (#530) + * Avoid releasing pending mem ticket future while holding + the lock by @DmitriyMusatkin in (#533) + +------------------------------------------------------------------- Old: ---- v0.8.3.tar.gz New: ---- v0.8.4.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ aws-c-s3.spec ++++++ --- /var/tmp/diff_new_pack.TDUat2/_old 2025-07-21 20:03:30.171082122 +0200 +++ /var/tmp/diff_new_pack.TDUat2/_new 2025-07-21 20:03:30.171082122 +0200 @@ -19,7 +19,7 @@ %define library_version 1.0.0 %define library_soversion 0unstable Name: aws-c-s3 -Version: 0.8.3 +Version: 0.8.4 Release: 0 Summary: AWS Cross-Platform, C99 wrapper for cryptography primitives License: Apache-2.0 ++++++ v0.8.3.tar.gz -> v0.8.4.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-c-s3-0.8.3/include/aws/s3/private/s3_request.h new/aws-c-s3-0.8.4/include/aws/s3/private/s3_request.h --- old/aws-c-s3-0.8.3/include/aws/s3/private/s3_request.h 2025-06-24 20:52:52.000000000 +0200 +++ new/aws-c-s3-0.8.4/include/aws/s3/private/s3_request.h 2025-07-14 20:40:27.000000000 +0200 @@ -70,6 +70,26 @@ /* The time duration for the request from start signing to finish signing (sign_end_timestamp_ns - * sign_start_timestamp_ns). When sign_end_timestamp_ns is 0, means data not available. */ int64_t signing_duration_ns; + + /* The time stamp when the request started to acquire memory. -1 means data not + * available. Timestamp are from `aws_high_res_clock_get_ticks` */ + int64_t mem_acquire_start_timestamp_ns; + /* The time stamp when the response to acquire memory. -1 means data not + * available. Timestamp are from `aws_high_res_clock_get_ticks` */ + int64_t mem_acquire_end_timestamp_ns; + /* The time duration for the request from start mem acquire to finish mem acquire (mem_acquire_end_timestamp_ns + * - mem_acquire_start_timestamp_ns). When sign_end_timestamp_ns is 0, means data not available. */ + int64_t mem_acquire_duration_ns; + + /* The time stamp when the request started to be delivered (i.e. on body callback is invoked or write to file + * initiated). -1 means data not available. Timestamp are from `aws_high_res_clock_get_ticks` */ + int64_t deliver_start_timestamp_ns; + /* The time stamp when the response finished to be delivered. -1 means data not + * available. Timestamp are from `aws_high_res_clock_get_ticks` */ + int64_t deliver_end_timestamp_ns; + /* The time duration for the request from start of delivery to finish of delivery (deliver_end_timestamp_ns - + * deliver_start_timestamp_ns). When deliver_duration_ns is 0, means data not available. */ + int64_t deliver_duration_ns; } time_metrics; struct { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-c-s3-0.8.3/source/s3_client.c new/aws-c-s3-0.8.4/source/s3_client.c --- old/aws-c-s3-0.8.3/source/s3_client.c 2025-06-24 20:52:52.000000000 +0200 +++ new/aws-c-s3-0.8.4/source/s3_client.c 2025-07-14 20:40:27.000000000 +0200 @@ -1850,6 +1850,14 @@ struct aws_s3_meta_request *meta_request = request->meta_request; AWS_PRECONDITION(meta_request); + if (request->send_data.metrics) { + struct aws_s3_request_metrics *metric = request->send_data.metrics; + aws_high_res_clock_get_ticks((uint64_t *)&metric->time_metrics.mem_acquire_end_timestamp_ns); + AWS_ASSERT(metric->time_metrics.mem_acquire_start_timestamp_ns != 0); + metric->time_metrics.mem_acquire_duration_ns = + metric->time_metrics.mem_acquire_end_timestamp_ns - metric->time_metrics.mem_acquire_start_timestamp_ns; + } + struct aws_future_s3_buffer_ticket *future_ticket = payload->buffer_future; int error_code = aws_future_s3_buffer_ticket_get_error(future_ticket); @@ -1889,10 +1897,19 @@ void *user_data) { if (request->ticket == NULL && request->should_allocate_buffer_from_pool) { + + if (request->send_data.metrics) { + struct aws_s3_request_metrics *metric = request->send_data.metrics; + aws_high_res_clock_get_ticks((uint64_t *)&metric->time_metrics.mem_acquire_start_timestamp_ns); + } + 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, .size = meta_request->part_size}; + .client = client, + .meta_request = meta_request, + .size = meta_request->part_size, + }; struct aws_s3_reserve_memory_payload *payload = aws_mem_calloc(allocator, 1, sizeof(struct aws_s3_reserve_memory_payload)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-c-s3-0.8.3/source/s3_default_buffer_pool.c new/aws-c-s3-0.8.4/source/s3_default_buffer_pool.c --- old/aws-c-s3-0.8.3/source/s3_default_buffer_pool.c 2025-06-24 20:52:52.000000000 +0200 +++ new/aws-c-s3-0.8.4/source/s3_default_buffer_pool.c 2025-07-14 20:40:27.000000000 +0200 @@ -389,6 +389,8 @@ aws_mem_release(buffer_pool->base_allocator, ticket); aws_mem_release(buffer_pool->base_allocator, ticket_wrapper); + struct aws_future_s3_buffer_ticket *pending_ticket_future = NULL; + if (!aws_linked_list_empty(&buffer_pool->pending_reserves)) { struct aws_linked_list_node *node = aws_linked_list_front(&buffer_pool->pending_reserves); struct s3_pending_reserve *pending_reserve = AWS_CONTAINER_OF(node, struct s3_pending_reserve, node); @@ -397,14 +399,15 @@ if (new_ticket != NULL) { struct aws_s3_buffer_ticket *new_ticket_wrapper = s_wrap_default_ticket(new_ticket); - aws_future_s3_buffer_ticket_set_result_by_move(pending_reserve->ticket_future, &new_ticket_wrapper); - aws_future_s3_buffer_ticket_release(pending_reserve->ticket_future); + pending_ticket_future = pending_reserve->ticket_future; + aws_future_s3_buffer_ticket_set_result_by_move(pending_ticket_future, &new_ticket_wrapper); aws_linked_list_pop_front(&buffer_pool->pending_reserves); aws_mem_release(buffer_pool->base_allocator, pending_reserve); } } aws_mutex_unlock(&buffer_pool->mutex); + aws_future_s3_buffer_ticket_release(pending_ticket_future); } struct aws_s3_default_buffer_ticket *s_try_reserve( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-c-s3-0.8.3/source/s3_meta_request.c new/aws-c-s3-0.8.4/source/s3_meta_request.c --- old/aws-c-s3-0.8.3/source/s3_meta_request.c 2025-06-24 20:52:52.000000000 +0200 +++ new/aws-c-s3-0.8.4/source/s3_meta_request.c 2025-07-14 20:40:27.000000000 +0200 @@ -1933,6 +1933,11 @@ } } if (error_code == AWS_ERROR_SUCCESS) { + if (request->send_data.metrics) { + struct aws_s3_request_metrics *metric = request->send_data.metrics; + aws_high_res_clock_get_ticks((uint64_t *)&metric->time_metrics.deliver_start_timestamp_ns); + } + if (meta_request->recv_file) { /* Write the data directly to the file. No need to seek, since the event will always be * delivered with the right order. */ @@ -1978,6 +1983,14 @@ error_code, aws_error_str(error_code)); } + + if (request->send_data.metrics) { + struct aws_s3_request_metrics *metric = request->send_data.metrics; + aws_high_res_clock_get_ticks((uint64_t *)&metric->time_metrics.deliver_end_timestamp_ns); + AWS_ASSERT(metric->time_metrics.deliver_start_timestamp_ns != 0); + metric->time_metrics.deliver_duration_ns = metric->time_metrics.deliver_end_timestamp_ns - + metric->time_metrics.deliver_start_timestamp_ns; + } } } aws_atomic_fetch_sub(&client->stats.num_requests_streaming_response, 1); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-c-s3-0.8.3/source/s3_request.c new/aws-c-s3-0.8.4/source/s3_request.c --- old/aws-c-s3-0.8.3/source/s3_request.c 2025-06-24 20:52:52.000000000 +0200 +++ new/aws-c-s3-0.8.4/source/s3_request.c 2025-07-14 20:40:27.000000000 +0200 @@ -192,6 +192,12 @@ metrics->time_metrics.sign_start_timestamp_ns = -1; metrics->time_metrics.sign_end_timestamp_ns = -1; metrics->time_metrics.signing_duration_ns = -1; + metrics->time_metrics.mem_acquire_start_timestamp_ns = -1; + metrics->time_metrics.mem_acquire_end_timestamp_ns = -1; + metrics->time_metrics.mem_acquire_duration_ns = -1; + metrics->time_metrics.deliver_start_timestamp_ns = -1; + metrics->time_metrics.deliver_end_timestamp_ns = -1; + metrics->time_metrics.deliver_duration_ns = -1; metrics->req_resp_info_metrics.response_status = -1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-c-s3-0.8.3/tests/CMakeLists.txt new/aws-c-s3-0.8.4/tests/CMakeLists.txt --- old/aws-c-s3-0.8.3/tests/CMakeLists.txt 2025-06-24 20:52:52.000000000 +0200 +++ new/aws-c-s3-0.8.4/tests/CMakeLists.txt 2025-07-14 20:40:27.000000000 +0200 @@ -398,6 +398,7 @@ add_test_case(test_s3_buffer_pool_forced_buffer) add_test_case(test_s3_buffer_pool_forced_buffer_after_limit_hit) add_test_case(test_s3_buffer_pool_forced_buffer_wont_stop_reservations) +add_test_case(test_s3_buffer_pool_reserve_over_limit_instant_release) add_net_test_case(client_update_upload_part_timeout) add_net_test_case(client_meta_request_override_part_size) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aws-c-s3-0.8.3/tests/s3_default_buffer_pool_tests.c new/aws-c-s3-0.8.4/tests/s3_default_buffer_pool_tests.c --- old/aws-c-s3-0.8.3/tests/s3_default_buffer_pool_tests.c 2025-06-24 20:52:52.000000000 +0200 +++ new/aws-c-s3-0.8.4/tests/s3_default_buffer_pool_tests.c 2025-07-14 20:40:27.000000000 +0200 @@ -268,6 +268,62 @@ }; AWS_TEST_CASE(test_s3_buffer_pool_reserve_over_limit, s_test_s3_buffer_pool_reserve_over_limit) +static void s_on_pool_buffer_reserved_instant_release(void *user_data) { + struct s_reserve_state *state = user_data; + + if (aws_future_s3_buffer_ticket_get_error(state->future) == AWS_OP_SUCCESS) { + state->ticket = aws_future_s3_buffer_ticket_get_result_by_move(state->future); + } + + state->future = aws_future_s3_buffer_ticket_release(state->future); +} + +/* release future in the callback right away to check for potential race conditions */ +static int s_test_s3_buffer_pool_reserve_over_limit_instant_release(struct aws_allocator *allocator, void *ctx) { + (void)allocator; + (void)ctx; + + struct aws_s3_buffer_pool *buffer_pool = aws_s3_default_buffer_pool_new( + allocator, (struct aws_s3_buffer_pool_config){.part_size = MB_TO_BYTES(8), .memory_limit = GB_TO_BYTES(1)}); + + struct aws_s3_buffer_ticket *tickets[112]; + struct aws_future_s3_buffer_ticket *ticket_futures[112]; + for (size_t i = 0; i < 112; ++i) { + ticket_futures[i] = aws_s3_default_buffer_pool_reserve( + buffer_pool, (struct aws_s3_buffer_pool_reserve_meta){.size = MB_TO_BYTES(8)}); + ASSERT_TRUE(aws_future_s3_buffer_ticket_is_done(ticket_futures[i])); + ASSERT_INT_EQUALS(aws_future_s3_buffer_ticket_get_error(ticket_futures[i]), AWS_OP_SUCCESS); + tickets[i] = aws_future_s3_buffer_ticket_get_result_by_move(ticket_futures[i]); + struct aws_byte_buf buf = aws_s3_buffer_ticket_claim(tickets[i]); + ASSERT_NOT_NULL(buf.buffer); + } + + struct aws_future_s3_buffer_ticket *over_future = aws_s3_default_buffer_pool_reserve( + buffer_pool, (struct aws_s3_buffer_pool_reserve_meta){.size = MB_TO_BYTES(8)}); + + ASSERT_FALSE(aws_future_s3_buffer_ticket_is_done(over_future)); + + struct s_reserve_state state = {.future = over_future}; + + aws_future_s3_buffer_ticket_register_callback(over_future, s_on_pool_buffer_reserved_instant_release, &state); + + for (size_t i = 0; i < 112; ++i) { + aws_s3_buffer_ticket_release(tickets[i]); + aws_future_s3_buffer_ticket_release(ticket_futures[i]); + } + + ASSERT_NOT_NULL(state.ticket); + + aws_s3_buffer_ticket_release(state.ticket); + + aws_s3_default_buffer_pool_destroy(buffer_pool); + + return 0; +}; +AWS_TEST_CASE( + test_s3_buffer_pool_reserve_over_limit_instant_release, + s_test_s3_buffer_pool_reserve_over_limit_instant_release) + static int s_test_s3_buffer_pool_too_small(struct aws_allocator *allocator, void *ctx) { (void)allocator; (void)ctx;