Skip to content

Commit c9675b1

Browse files
committed
Merge branch 'main' into update-rule-set
2 parents f4759a9 + 372ffea commit c9675b1

File tree

4 files changed

+10
-10
lines changed

4 files changed

+10
-10
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ The S3 client uses a buffer pool to manage memory for concurrent transfers. You
4242
**Default Behavior**: If neither is set (config is 0 and environment variable is not set), the client sets a default memory limit based on the target throughput.
4343

4444
**Notes**:
45+
* The limit applies per client. If multiple clients created, limit will apply to each separately.
4546
* The environment variable value must be a valid positive integer representing gigabytes (GiB).
4647
* The value is converted from GiB to bytes internally (1 GiB = 1024³ bytes).
4748
* Invalid values or overflow conditions will cause client creation to fail with `AWS_ERROR_INVALID_ARGUMENT`.

include/aws/s3/private/s3_meta_request_impl.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,9 @@ struct aws_s3_meta_request {
195195
/* If the buffer pool optimized for the specific size or not. */
196196
bool buffer_pool_optimized;
197197

198+
/* Track the number of requests being prepared for this meta request. */
199+
struct aws_atomic_var num_request_being_prepared;
200+
198201
struct {
199202
struct aws_mutex lock;
200203

@@ -278,9 +281,6 @@ struct aws_s3_meta_request {
278281
/* True if this meta request is currently in the client's list. */
279282
bool scheduled;
280283

281-
/* Track the number of requests being prepared for this meta request. */
282-
size_t num_request_being_prepared;
283-
284284
} client_process_work_threaded_data;
285285

286286
/* Anything in this structure should only ever be accessed by the meta-request from its io_event_loop thread. */

source/s3_client.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1948,8 +1948,9 @@ static bool s_s3_client_should_update_meta_request(
19481948
return false;
19491949
}
19501950

1951-
if (meta_request->client_process_work_threaded_data.num_request_being_prepared >=
1952-
aws_s3_client_get_max_active_connections(client, meta_request)) {
1951+
/* This is not 100% thread safe, but prepare a bit more for the meta request level won't actually hurt. */
1952+
size_t specific_request_being_prepared = aws_atomic_load_int(&meta_request->num_request_being_prepared);
1953+
if (specific_request_being_prepared >= aws_s3_client_get_max_active_connections(client, meta_request)) {
19531954
/* Don't prepare more than it's allowed for the meta request */
19541955
return false;
19551956
}
@@ -2167,7 +2168,7 @@ void aws_s3_client_update_meta_requests_threaded(struct aws_s3_client *client) {
21672168
request->tracked_by_client = true;
21682169

21692170
++client->threaded_data.num_requests_being_prepared;
2170-
++meta_request->client_process_work_threaded_data.num_request_being_prepared;
2171+
aws_atomic_fetch_add(&meta_request->num_request_being_prepared, 1);
21712172

21722173
num_requests_in_flight =
21732174
(uint32_t)aws_atomic_fetch_add(&client->stats.num_requests_in_flight, 1) + 1;
@@ -2234,6 +2235,7 @@ static void s_s3_client_prepare_callback_queue_request(
22342235
request = aws_s3_request_release(request);
22352236
}
22362237

2238+
aws_atomic_fetch_sub(&meta_request->num_request_being_prepared, 1);
22372239
/* BEGIN CRITICAL SECTION */
22382240
{
22392241
aws_s3_client_lock_synced_data(client);
@@ -2265,8 +2267,6 @@ void aws_s3_client_update_connections_threaded(struct aws_s3_client *client) {
22652267
struct aws_s3_request *request = aws_s3_client_dequeue_request_threaded(client);
22662268
struct aws_s3_meta_request *meta_request = request->meta_request;
22672269
const uint32_t max_active_connections = aws_s3_client_get_max_active_connections(client, meta_request);
2268-
/* As the request removed from the queue. Decrement the preparing track */
2269-
--meta_request->client_process_work_threaded_data.num_request_being_prepared;
22702270
if (request->is_noop) {
22712271
/* If request is no-op, finishes and cleans up the request */
22722272
s_s3_client_meta_request_finished_request(client, meta_request, request, AWS_ERROR_SUCCESS);
@@ -2292,8 +2292,6 @@ void aws_s3_client_update_connections_threaded(struct aws_s3_client *client) {
22922292
} else {
22932293
/* Push the request into the left-over list to be used in a future call of this function. */
22942294
aws_linked_list_push_back(&left_over_requests, &request->node);
2295-
/* Increment the count as we put it back to the queue. */
2296-
++meta_request->client_process_work_threaded_data.num_request_being_prepared;
22972295
}
22982296
client_max_active_connections = aws_s3_client_get_max_active_connections(client, NULL);
22992297
num_requests_network_io = s_s3_client_get_num_requests_network_io(client, AWS_S3_META_REQUEST_TYPE_MAX);

source/s3_meta_request.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ int aws_s3_meta_request_init_base(
200200
/* Set up reference count. */
201201
aws_ref_count_init(&meta_request->ref_count, meta_request, s_s3_meta_request_destroy);
202202
aws_atomic_init_int(&meta_request->num_requests_network, 0);
203+
aws_atomic_init_int(&meta_request->num_request_being_prepared, 0);
203204
aws_linked_list_init(&meta_request->synced_data.cancellable_http_streams_list);
204205
aws_linked_list_init(&meta_request->synced_data.pending_buffer_futures);
205206

0 commit comments

Comments
 (0)