@@ -217,7 +217,7 @@ uint32_t aws_s3_client_get_max_active_connections(
217217 struct aws_s3_meta_request * meta_request ) {
218218 AWS_PRECONDITION (client );
219219
220- uint32_t max_active_connections = client -> ideal_connection_count ;
220+ uint32_t max_active_connections = g_max_num_connections ;
221221 if (client -> max_active_connections_override > 0 &&
222222 client -> max_active_connections_override < max_active_connections ) {
223223 max_active_connections = client -> max_active_connections_override ;
@@ -244,48 +244,26 @@ uint32_t aws_s3_client_get_max_active_connections(
244244}
245245
246246/* Initialize token bucket based on target throughput */
247- void s_s3_client_init_tokens (struct aws_s3_client * client ) {
247+ static void s_s3_client_init_tokens (struct aws_s3_client * client ) {
248248 AWS_PRECONDITION (client );
249249
250- aws_atomic_store_int (& client -> token_bucket , (uint32_t )client -> throughput_target_gbps * 1024 );
250+ uint32_t target_throughput_mbps = 0 ;
251+ aws_mul_u32_checked (client -> throughput_target_gbps , 1024 , & target_throughput_mbps );
252+ aws_atomic_store_int (& client -> token_bucket , target_throughput_mbps );
251253}
252254
253255/* Releases tokens back after request is complete. */
254- void s_s3_client_release_tokens (struct aws_s3_client * client , struct aws_s3_request * request ) {
256+ static void s_s3_client_release_tokens (struct aws_s3_client * client , struct aws_s3_request * request ) {
255257 AWS_PRECONDITION (client );
256258 AWS_PRECONDITION (request );
257259
258260 aws_atomic_fetch_add (& client -> token_bucket , request -> tokens_used );
259261 request -> tokens_used = 0 ;
260262}
261263
262- /* Checks to ensure we are not violating user configured connection limits althought we are dynamically increasing
263- * and decreasing connections */
264- bool s_check_connection_limits (struct aws_s3_client * client , struct aws_s3_request * request ) {
265- AWS_PRECONDITION (client );
266- AWS_PRECONDITION (request );
267-
268- // We ensure we do not violate the user set max-connections limit
269- if ((uint32_t )aws_atomic_load_int (& client -> stats .num_requests_network_total ) >=
270- client -> max_active_connections_override &&
271- client -> max_active_connections_override > 0 ) {
272- return false;
273- }
274-
275- struct aws_s3_meta_request * meta_request = request -> meta_request ;
276- if (meta_request &&
277- (uint32_t )aws_atomic_load_int (& meta_request -> num_requests_network ) >=
278- meta_request -> max_active_connections_override &&
279- meta_request -> max_active_connections_override > 0 ) {
280- return false;
281- }
282-
283- return true;
284- }
285-
286264/* Returns true or false based on whether the request was able to avail the required amount of tokens.
287265 * TODO: try to introduce a scalability factor instead of using pure latency. */
288- bool s_s3_client_acquire_tokens (struct aws_s3_client * client , struct aws_s3_request * request ) {
266+ static bool s_s3_client_acquire_tokens (struct aws_s3_client * client , struct aws_s3_request * request ) {
289267 AWS_PRECONDITION (client );
290268 AWS_PRECONDITION (request );
291269
@@ -2442,7 +2420,10 @@ void aws_s3_client_update_connections_threaded(struct aws_s3_client *client) {
24422420
24432421 s_s3_client_meta_request_finished_request (client , meta_request , request , AWS_ERROR_S3_CANCELED );
24442422 request = aws_s3_request_release (request );
2445- } else if (s_check_connection_limits (client , request ) && s_s3_client_acquire_tokens (client , request )) {
2423+ } else if (
2424+ (uint32_t )aws_atomic_load_int (& meta_request -> num_requests_network ) <
2425+ (uint32_t )aws_s3_client_get_max_active_connections (client , meta_request ) &&
2426+ s_s3_client_acquire_tokens (client , request )) {
24462427 /* Make sure it's above the max request level limitation. */
24472428 s_s3_client_create_connection_for_request (client , request );
24482429 } else {
0 commit comments