Skip to content

Commit c7cb8a8

Browse files
dennycdHannahShiSFB
authored andcommitted
Native source sync at revision @2453c26
1 parent 2453c26 commit c7cb8a8

29 files changed

+1667
-808
lines changed

gRPC-Core.podspec

+1-2
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ Pod::Spec.new do |s|
200200
ss.libraries = 'z'
201201
ss.dependency "#{s.name}/Interface", version
202202
ss.dependency "#{s.name}/Privacy", version
203-
ss.dependency 'BoringSSL-GRPC', '0.0.37'
203+
ss.dependency 'BoringSSL-GRPC', '0.0.38'
204204
ss.dependency 'abseil/algorithm/container', abseil_version
205205
ss.dependency 'abseil/base/base', abseil_version
206206
ss.dependency 'abseil/base/config', abseil_version
@@ -1963,7 +1963,6 @@ Pod::Spec.new do |s|
19631963
'src/core/tsi/transport_security_interface.h',
19641964
'src/core/util/alloc.cc',
19651965
'src/core/util/alloc.h',
1966-
'src/core/util/atm.cc',
19671966
'src/core/util/atomic_utils.h',
19681967
'src/core/util/avl.h',
19691968
'src/core/util/backoff.cc',

include/grpc/support/atm.h

-13
Original file line numberDiff line numberDiff line change
@@ -79,17 +79,4 @@
7979
#error could not determine platform for atm
8080
#endif
8181

82-
#ifdef __cplusplus
83-
extern "C" {
84-
#endif
85-
86-
/** Adds \a delta to \a *value, clamping the result to the range specified
87-
by \a min and \a max. Returns the new value. */
88-
gpr_atm gpr_atm_no_barrier_clamped_add(gpr_atm* value, gpr_atm delta,
89-
gpr_atm min, gpr_atm max);
90-
91-
#ifdef __cplusplus
92-
}
93-
#endif
94-
9582
#endif /* GRPC_SUPPORT_ATM_H */

src/core/client_channel/retry_throttle.cc

+33-18
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,33 @@
1818

1919
#include "src/core/client_channel/retry_throttle.h"
2020

21-
#include <grpc/support/atm.h>
2221
#include <grpc/support/port_platform.h>
2322

23+
#include <atomic>
24+
#include <cstdint>
25+
#include <limits>
2426
#include <map>
2527
#include <string>
2628
#include <utility>
2729

30+
#include "src/core/util/useful.h"
31+
2832
namespace grpc_core {
2933
namespace internal {
3034

35+
namespace {
36+
template <typename T>
37+
T ClampedAdd(std::atomic<T>& value, T delta, T min, T max) {
38+
T prev_value = value.load(std::memory_order_relaxed);
39+
T new_value;
40+
do {
41+
new_value = Clamp(SaturatingAdd(prev_value, delta), min, max);
42+
} while (!value.compare_exchange_weak(prev_value, new_value,
43+
std::memory_order_relaxed));
44+
return new_value;
45+
}
46+
} // namespace
47+
3148
//
3249
// ServerRetryThrottleData
3350
//
@@ -44,26 +61,24 @@ ServerRetryThrottleData::ServerRetryThrottleData(
4461
// we will start out doing the same thing on the new one.
4562
if (old_throttle_data != nullptr) {
4663
double token_fraction =
47-
static_cast<uintptr_t>(
48-
gpr_atm_acq_load(&old_throttle_data->milli_tokens_)) /
64+
static_cast<double>(
65+
old_throttle_data->milli_tokens_.load(std::memory_order_relaxed)) /
4966
static_cast<double>(old_throttle_data->max_milli_tokens_);
5067
initial_milli_tokens =
5168
static_cast<uintptr_t>(token_fraction * max_milli_tokens);
5269
}
53-
gpr_atm_rel_store(&milli_tokens_, static_cast<gpr_atm>(initial_milli_tokens));
70+
milli_tokens_.store(initial_milli_tokens, std::memory_order_relaxed);
5471
// If there was a pre-existing entry, mark it as stale and give it a
5572
// pointer to the new entry, which is its replacement.
5673
if (old_throttle_data != nullptr) {
5774
Ref().release(); // Ref held by pre-existing entry.
58-
gpr_atm_rel_store(&old_throttle_data->replacement_,
59-
reinterpret_cast<gpr_atm>(this));
75+
old_throttle_data->replacement_.store(this, std::memory_order_release);
6076
}
6177
}
6278

6379
ServerRetryThrottleData::~ServerRetryThrottleData() {
6480
ServerRetryThrottleData* replacement =
65-
reinterpret_cast<ServerRetryThrottleData*>(
66-
gpr_atm_acq_load(&replacement_));
81+
replacement_.load(std::memory_order_acquire);
6782
if (replacement != nullptr) {
6883
replacement->Unref();
6984
}
@@ -73,8 +88,7 @@ void ServerRetryThrottleData::GetReplacementThrottleDataIfNeeded(
7388
ServerRetryThrottleData** throttle_data) {
7489
while (true) {
7590
ServerRetryThrottleData* new_throttle_data =
76-
reinterpret_cast<ServerRetryThrottleData*>(
77-
gpr_atm_acq_load(&(*throttle_data)->replacement_));
91+
(*throttle_data)->replacement_.load(std::memory_order_acquire);
7892
if (new_throttle_data == nullptr) return;
7993
*throttle_data = new_throttle_data;
8094
}
@@ -85,10 +99,10 @@ bool ServerRetryThrottleData::RecordFailure() {
8599
ServerRetryThrottleData* throttle_data = this;
86100
GetReplacementThrottleDataIfNeeded(&throttle_data);
87101
// We decrement milli_tokens by 1000 (1 token) for each failure.
88-
const uintptr_t new_value =
89-
static_cast<uintptr_t>(gpr_atm_no_barrier_clamped_add(
90-
&throttle_data->milli_tokens_, gpr_atm{-1000}, gpr_atm{0},
91-
static_cast<gpr_atm>(throttle_data->max_milli_tokens_)));
102+
const uintptr_t new_value = ClampedAdd<intptr_t>(
103+
throttle_data->milli_tokens_, -1000, 0,
104+
std::min<uintptr_t>(throttle_data->max_milli_tokens_,
105+
std::numeric_limits<intptr_t>::max()));
92106
// Retries are allowed as long as the new value is above the threshold
93107
// (max_milli_tokens / 2).
94108
return new_value > throttle_data->max_milli_tokens_ / 2;
@@ -99,10 +113,11 @@ void ServerRetryThrottleData::RecordSuccess() {
99113
ServerRetryThrottleData* throttle_data = this;
100114
GetReplacementThrottleDataIfNeeded(&throttle_data);
101115
// We increment milli_tokens by milli_token_ratio for each success.
102-
gpr_atm_no_barrier_clamped_add(
103-
&throttle_data->milli_tokens_,
104-
static_cast<gpr_atm>(throttle_data->milli_token_ratio_), gpr_atm{0},
105-
static_cast<gpr_atm>(throttle_data->max_milli_tokens_));
116+
ClampedAdd<intptr_t>(
117+
throttle_data->milli_tokens_, throttle_data->milli_token_ratio_, 0,
118+
std::max<intptr_t>(
119+
0, std::min<uintptr_t>(throttle_data->max_milli_tokens_,
120+
std::numeric_limits<intptr_t>::max())));
106121
}
107122

108123
//

src/core/client_channel/retry_throttle.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
#ifndef GRPC_SRC_CORE_CLIENT_CHANNEL_RETRY_THROTTLE_H
2020
#define GRPC_SRC_CORE_CLIENT_CHANNEL_RETRY_THROTTLE_H
2121

22-
#include <grpc/support/atm.h>
2322
#include <grpc/support/port_platform.h>
2423
#include <stdint.h>
2524

25+
#include <atomic>
2626
#include <map>
2727
#include <string>
2828

@@ -58,11 +58,11 @@ class ServerRetryThrottleData final
5858

5959
const uintptr_t max_milli_tokens_;
6060
const uintptr_t milli_token_ratio_;
61-
gpr_atm milli_tokens_;
61+
std::atomic<intptr_t> milli_tokens_;
6262
// A pointer to the replacement for this ServerRetryThrottleData entry.
6363
// If non-nullptr, then this entry is stale and must not be used.
6464
// We hold a reference to the replacement.
65-
gpr_atm replacement_ = 0;
65+
std::atomic<ServerRetryThrottleData*> replacement_{nullptr};
6666
};
6767

6868
/// Global map of server name to retry throttle data.

src/core/lib/debug/trace_flags.cc

+2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ DebugOnlyTraceFlag fd_trace_trace(false, "fd_trace");
3535
DebugOnlyTraceFlag lb_policy_refcount_trace(false, "lb_policy_refcount");
3636
DebugOnlyTraceFlag party_state_trace(false, "party_state");
3737
DebugOnlyTraceFlag pending_tags_trace(false, "pending_tags");
38+
DebugOnlyTraceFlag ph2_trace(false, "ph2");
3839
DebugOnlyTraceFlag polling_trace(false, "polling");
3940
DebugOnlyTraceFlag polling_api_trace(false, "polling_api");
4041
DebugOnlyTraceFlag promise_primitives_trace(false, "promise_primitives");
@@ -225,6 +226,7 @@ const absl::flat_hash_map<std::string, TraceFlag*>& GetAllTraceFlags() {
225226
{"lb_policy_refcount", &lb_policy_refcount_trace},
226227
{"party_state", &party_state_trace},
227228
{"pending_tags", &pending_tags_trace},
229+
{"ph2", &ph2_trace},
228230
{"polling", &polling_trace},
229231
{"polling_api", &polling_api_trace},
230232
{"promise_primitives", &promise_primitives_trace},

src/core/lib/debug/trace_flags.h

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ extern DebugOnlyTraceFlag fd_trace_trace;
3636
extern DebugOnlyTraceFlag lb_policy_refcount_trace;
3737
extern DebugOnlyTraceFlag party_state_trace;
3838
extern DebugOnlyTraceFlag pending_tags_trace;
39+
extern DebugOnlyTraceFlag ph2_trace;
3940
extern DebugOnlyTraceFlag polling_trace;
4041
extern DebugOnlyTraceFlag polling_api_trace;
4142
extern DebugOnlyTraceFlag promise_primitives_trace;

src/core/lib/experiments/experiments.cc

-39
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,10 @@ const char* const additional_constraints_backoff_cap_initial_at_max = "{}";
2929
const char* const description_call_tracer_in_transport =
3030
"Transport directly passes byte counts to CallTracer.";
3131
const char* const additional_constraints_call_tracer_in_transport = "{}";
32-
const char* const description_canary_client_privacy =
33-
"If set, canary client privacy";
34-
const char* const additional_constraints_canary_client_privacy = "{}";
3532
const char* const description_chaotic_good_legacy_protocol =
3633
"If set, use the first version of the chaotic-good protocol when that "
3734
"protocol is enabled.";
3835
const char* const additional_constraints_chaotic_good_legacy_protocol = "{}";
39-
const char* const description_client_privacy = "If set, client privacy";
40-
const char* const additional_constraints_client_privacy = "{}";
4136
const char* const description_disable_buffer_hint_on_high_memory_pressure =
4237
"Disable buffer hint flag parsing in the transport under high memory "
4338
"pressure.";
@@ -118,8 +113,6 @@ const char* const description_schedule_cancellation_over_write =
118113
"Allow cancellation op to be scheduled over a write";
119114
const char* const additional_constraints_schedule_cancellation_over_write =
120115
"{}";
121-
const char* const description_server_privacy = "If set, server privacy";
122-
const char* const additional_constraints_server_privacy = "{}";
123116
const char* const description_tcp_frame_size_tuning =
124117
"If set, enables TCP to use RPC size estimation made by higher layers. TCP "
125118
"would not indicate completion of a read operation until a specified "
@@ -154,13 +147,9 @@ const ExperimentMetadata g_experiment_metadata[] = {
154147
additional_constraints_backoff_cap_initial_at_max, nullptr, 0, true, true},
155148
{"call_tracer_in_transport", description_call_tracer_in_transport,
156149
additional_constraints_call_tracer_in_transport, nullptr, 0, true, true},
157-
{"canary_client_privacy", description_canary_client_privacy,
158-
additional_constraints_canary_client_privacy, nullptr, 0, false, false},
159150
{"chaotic_good_legacy_protocol", description_chaotic_good_legacy_protocol,
160151
additional_constraints_chaotic_good_legacy_protocol, nullptr, 0, false,
161152
true},
162-
{"client_privacy", description_client_privacy,
163-
additional_constraints_client_privacy, nullptr, 0, false, false},
164153
{"disable_buffer_hint_on_high_memory_pressure",
165154
description_disable_buffer_hint_on_high_memory_pressure,
166155
additional_constraints_disable_buffer_hint_on_high_memory_pressure,
@@ -218,8 +207,6 @@ const ExperimentMetadata g_experiment_metadata[] = {
218207
description_schedule_cancellation_over_write,
219208
additional_constraints_schedule_cancellation_over_write, nullptr, 0, false,
220209
true},
221-
{"server_privacy", description_server_privacy,
222-
additional_constraints_server_privacy, nullptr, 0, false, false},
223210
{"tcp_frame_size_tuning", description_tcp_frame_size_tuning,
224211
additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true},
225212
{"tcp_rcv_lowat", description_tcp_rcv_lowat,
@@ -246,15 +233,10 @@ const char* const additional_constraints_backoff_cap_initial_at_max = "{}";
246233
const char* const description_call_tracer_in_transport =
247234
"Transport directly passes byte counts to CallTracer.";
248235
const char* const additional_constraints_call_tracer_in_transport = "{}";
249-
const char* const description_canary_client_privacy =
250-
"If set, canary client privacy";
251-
const char* const additional_constraints_canary_client_privacy = "{}";
252236
const char* const description_chaotic_good_legacy_protocol =
253237
"If set, use the first version of the chaotic-good protocol when that "
254238
"protocol is enabled.";
255239
const char* const additional_constraints_chaotic_good_legacy_protocol = "{}";
256-
const char* const description_client_privacy = "If set, client privacy";
257-
const char* const additional_constraints_client_privacy = "{}";
258240
const char* const description_disable_buffer_hint_on_high_memory_pressure =
259241
"Disable buffer hint flag parsing in the transport under high memory "
260242
"pressure.";
@@ -335,8 +317,6 @@ const char* const description_schedule_cancellation_over_write =
335317
"Allow cancellation op to be scheduled over a write";
336318
const char* const additional_constraints_schedule_cancellation_over_write =
337319
"{}";
338-
const char* const description_server_privacy = "If set, server privacy";
339-
const char* const additional_constraints_server_privacy = "{}";
340320
const char* const description_tcp_frame_size_tuning =
341321
"If set, enables TCP to use RPC size estimation made by higher layers. TCP "
342322
"would not indicate completion of a read operation until a specified "
@@ -371,13 +351,9 @@ const ExperimentMetadata g_experiment_metadata[] = {
371351
additional_constraints_backoff_cap_initial_at_max, nullptr, 0, true, true},
372352
{"call_tracer_in_transport", description_call_tracer_in_transport,
373353
additional_constraints_call_tracer_in_transport, nullptr, 0, true, true},
374-
{"canary_client_privacy", description_canary_client_privacy,
375-
additional_constraints_canary_client_privacy, nullptr, 0, false, false},
376354
{"chaotic_good_legacy_protocol", description_chaotic_good_legacy_protocol,
377355
additional_constraints_chaotic_good_legacy_protocol, nullptr, 0, false,
378356
true},
379-
{"client_privacy", description_client_privacy,
380-
additional_constraints_client_privacy, nullptr, 0, false, false},
381357
{"disable_buffer_hint_on_high_memory_pressure",
382358
description_disable_buffer_hint_on_high_memory_pressure,
383359
additional_constraints_disable_buffer_hint_on_high_memory_pressure,
@@ -435,8 +411,6 @@ const ExperimentMetadata g_experiment_metadata[] = {
435411
description_schedule_cancellation_over_write,
436412
additional_constraints_schedule_cancellation_over_write, nullptr, 0, false,
437413
true},
438-
{"server_privacy", description_server_privacy,
439-
additional_constraints_server_privacy, nullptr, 0, false, false},
440414
{"tcp_frame_size_tuning", description_tcp_frame_size_tuning,
441415
additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true},
442416
{"tcp_rcv_lowat", description_tcp_rcv_lowat,
@@ -463,15 +437,10 @@ const char* const additional_constraints_backoff_cap_initial_at_max = "{}";
463437
const char* const description_call_tracer_in_transport =
464438
"Transport directly passes byte counts to CallTracer.";
465439
const char* const additional_constraints_call_tracer_in_transport = "{}";
466-
const char* const description_canary_client_privacy =
467-
"If set, canary client privacy";
468-
const char* const additional_constraints_canary_client_privacy = "{}";
469440
const char* const description_chaotic_good_legacy_protocol =
470441
"If set, use the first version of the chaotic-good protocol when that "
471442
"protocol is enabled.";
472443
const char* const additional_constraints_chaotic_good_legacy_protocol = "{}";
473-
const char* const description_client_privacy = "If set, client privacy";
474-
const char* const additional_constraints_client_privacy = "{}";
475444
const char* const description_disable_buffer_hint_on_high_memory_pressure =
476445
"Disable buffer hint flag parsing in the transport under high memory "
477446
"pressure.";
@@ -552,8 +521,6 @@ const char* const description_schedule_cancellation_over_write =
552521
"Allow cancellation op to be scheduled over a write";
553522
const char* const additional_constraints_schedule_cancellation_over_write =
554523
"{}";
555-
const char* const description_server_privacy = "If set, server privacy";
556-
const char* const additional_constraints_server_privacy = "{}";
557524
const char* const description_tcp_frame_size_tuning =
558525
"If set, enables TCP to use RPC size estimation made by higher layers. TCP "
559526
"would not indicate completion of a read operation until a specified "
@@ -588,13 +555,9 @@ const ExperimentMetadata g_experiment_metadata[] = {
588555
additional_constraints_backoff_cap_initial_at_max, nullptr, 0, true, true},
589556
{"call_tracer_in_transport", description_call_tracer_in_transport,
590557
additional_constraints_call_tracer_in_transport, nullptr, 0, true, true},
591-
{"canary_client_privacy", description_canary_client_privacy,
592-
additional_constraints_canary_client_privacy, nullptr, 0, false, false},
593558
{"chaotic_good_legacy_protocol", description_chaotic_good_legacy_protocol,
594559
additional_constraints_chaotic_good_legacy_protocol, nullptr, 0, false,
595560
true},
596-
{"client_privacy", description_client_privacy,
597-
additional_constraints_client_privacy, nullptr, 0, false, false},
598561
{"disable_buffer_hint_on_high_memory_pressure",
599562
description_disable_buffer_hint_on_high_memory_pressure,
600563
additional_constraints_disable_buffer_hint_on_high_memory_pressure,
@@ -652,8 +615,6 @@ const ExperimentMetadata g_experiment_metadata[] = {
652615
description_schedule_cancellation_over_write,
653616
additional_constraints_schedule_cancellation_over_write, nullptr, 0, false,
654617
true},
655-
{"server_privacy", description_server_privacy,
656-
additional_constraints_server_privacy, nullptr, 0, false, false},
657618
{"tcp_frame_size_tuning", description_tcp_frame_size_tuning,
658619
additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true},
659620
{"tcp_rcv_lowat", description_tcp_rcv_lowat,

0 commit comments

Comments
 (0)