aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/ext/client_channel/retry_throttle.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/ext/client_channel/retry_throttle.c')
-rw-r--r--src/core/ext/client_channel/retry_throttle.c36
1 files changed, 6 insertions, 30 deletions
diff --git a/src/core/ext/client_channel/retry_throttle.c b/src/core/ext/client_channel/retry_throttle.c
index 7b813c33df..8926c3d782 100644
--- a/src/core/ext/client_channel/retry_throttle.c
+++ b/src/core/ext/client_channel/retry_throttle.c
@@ -73,20 +73,9 @@ bool grpc_server_retry_throttle_data_record_failure(
// First, check if we are stale and need to be replaced.
get_replacement_throttle_data_if_needed(&throttle_data);
// We decrement milli_tokens by 1000 (1 token) for each failure.
- const int delta = -1000;
- const int old_value = (int)gpr_atm_full_fetch_add(
- &throttle_data->milli_tokens, (gpr_atm)delta);
- // If the above change takes us below 0, then re-add the excess. Note
- // that between these two atomic operations, the value will be
- // artificially low by as much as 1000, but this window should be
- // brief.
- int new_value = old_value - 1000;
- if (new_value < 0) {
- const int excess_value = new_value - (old_value < 0 ? old_value : 0);
- gpr_atm_full_fetch_add(&throttle_data->milli_tokens,
- (gpr_atm)-excess_value);
- new_value = 0;
- }
+ const int new_value = (int)gpr_atm_no_barrier_clamped_add(
+ &throttle_data->milli_tokens, (gpr_atm)-1000, (gpr_atm)0,
+ (gpr_atm)throttle_data->max_milli_tokens);
// Retries are allowed as long as the new value is above the threshold
// (max_milli_tokens / 2).
return new_value > throttle_data->max_milli_tokens / 2;
@@ -97,22 +86,9 @@ void grpc_server_retry_throttle_data_record_success(
// First, check if we are stale and need to be replaced.
get_replacement_throttle_data_if_needed(&throttle_data);
// We increment milli_tokens by milli_token_ratio for each success.
- const int delta = throttle_data->milli_token_ratio;
- const int old_value = (int)gpr_atm_full_fetch_add(
- &throttle_data->milli_tokens, (gpr_atm)delta);
- // If the above change takes us over max_milli_tokens, then subtract
- // the excess. Note that between these two atomic operations, the
- // value will be artificially high by as much as milli_token_ratio,
- // but this window should be brief.
- const int new_value = old_value + throttle_data->milli_token_ratio;
- if (new_value > throttle_data->max_milli_tokens) {
- const int excess_value =
- new_value - (old_value > throttle_data->max_milli_tokens
- ? old_value
- : throttle_data->max_milli_tokens);
- gpr_atm_full_fetch_add(&throttle_data->milli_tokens,
- (gpr_atm)-excess_value);
- }
+ gpr_atm_no_barrier_clamped_add(
+ &throttle_data->milli_tokens, (gpr_atm)throttle_data->milli_token_ratio,
+ (gpr_atm)0, (gpr_atm)throttle_data->max_milli_tokens);
}
grpc_server_retry_throttle_data* grpc_server_retry_throttle_data_ref(