@@ -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 );
0 commit comments