• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2023 gRPC authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 // Auto generated by tools/codegen/core/gen_experiments.py
16 
17 #include <grpc/support/port_platform.h>
18 
19 #include "src/core/lib/experiments/experiments.h"
20 
21 #include <stdint.h>
22 
23 #ifndef GRPC_EXPERIMENTS_ARE_FINAL
24 
25 #if defined(GRPC_CFSTREAM)
26 namespace {
27 const char* const description_call_status_override_on_cancellation =
28     "Avoid overriding call status of successfully finished calls if it races "
29     "with cancellation.";
30 const char* const additional_constraints_call_status_override_on_cancellation =
31     "{}";
32 const char* const description_call_v3 = "Promise-based call version 3.";
33 const char* const additional_constraints_call_v3 = "{}";
34 const char* const description_canary_client_privacy =
35     "If set, canary client privacy";
36 const char* const additional_constraints_canary_client_privacy = "{}";
37 const char* const description_client_privacy = "If set, client privacy";
38 const char* const additional_constraints_client_privacy = "{}";
39 const char* const description_event_engine_client =
40     "Use EventEngine clients instead of iomgr's grpc_tcp_client";
41 const char* const additional_constraints_event_engine_client = "{}";
42 const char* const description_event_engine_dns =
43     "If set, use EventEngine DNSResolver for client channel resolution";
44 const char* const additional_constraints_event_engine_dns = "{}";
45 const char* const description_event_engine_listener =
46     "Use EventEngine listeners instead of iomgr's grpc_tcp_server";
47 const char* const additional_constraints_event_engine_listener = "{}";
48 const char* const description_free_large_allocator =
49     "If set, return all free bytes from a \042big\042 allocator";
50 const char* const additional_constraints_free_large_allocator = "{}";
51 const char* const description_http2_stats_fix =
52     "Fix on HTTP2 outgoing data stats reporting";
53 const char* const additional_constraints_http2_stats_fix = "{}";
54 const char* const description_keepalive_fix =
55     "Allows overriding keepalive_permit_without_calls. Refer "
56     "https://github.com/grpc/grpc/pull/33428 for more information.";
57 const char* const additional_constraints_keepalive_fix = "{}";
58 const char* const description_keepalive_server_fix =
59     "Allows overriding keepalive_permit_without_calls for servers. Refer "
60     "https://github.com/grpc/grpc/pull/33917 for more information.";
61 const char* const additional_constraints_keepalive_server_fix = "{}";
62 const char* const description_monitoring_experiment =
63     "Placeholder experiment to prove/disprove our monitoring is working";
64 const char* const additional_constraints_monitoring_experiment = "{}";
65 const char* const description_multiping =
66     "Allow more than one ping to be in flight at a time by default.";
67 const char* const additional_constraints_multiping = "{}";
68 const char* const description_peer_state_based_framing =
69     "If set, the max sizes of frames sent to lower layers is controlled based "
70     "on the peer's memory pressure which is reflected in its max http2 frame "
71     "size.";
72 const char* const additional_constraints_peer_state_based_framing = "{}";
73 const char* const description_pending_queue_cap =
74     "In the sync & async apis (but not the callback api), cap the number of "
75     "received but unrequested requests in the server for each call type. A "
76     "received message is one that was read from the wire on the server. A "
77     "requested message is one explicitly requested by the application using "
78     "grpc_server_request_call or grpc_server_request_registered_call (or their "
79     "wrappers in the C++ API).";
80 const char* const additional_constraints_pending_queue_cap = "{}";
81 const char* const description_promise_based_client_call =
82     "If set, use the new gRPC promise based call code when it's appropriate "
83     "(ie when all filters in a stack are promise based)";
84 const char* const additional_constraints_promise_based_client_call = "{}";
85 const uint8_t required_experiments_promise_based_client_call[] = {
86     static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
87     static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
88 const char* const description_promise_based_server_call =
89     "If set, use the new gRPC promise based call code when it's appropriate "
90     "(ie when all filters in a stack are promise based)";
91 const char* const additional_constraints_promise_based_server_call = "{}";
92 const char* const description_chaotic_good =
93     "If set, enable the chaotic good load transport (this is mostly here for "
94     "testing)";
95 const char* const additional_constraints_chaotic_good = "{}";
96 const uint8_t required_experiments_chaotic_good[] = {
97     static_cast<uint8_t>(grpc_core::kExperimentIdPromiseBasedClientCall),
98     static_cast<uint8_t>(grpc_core::kExperimentIdPromiseBasedServerCall)};
99 const char* const description_promise_based_inproc_transport =
100     "Use promises for the in-process transport.";
101 const char* const additional_constraints_promise_based_inproc_transport = "{}";
102 const uint8_t required_experiments_promise_based_inproc_transport[] = {
103     static_cast<uint8_t>(grpc_core::kExperimentIdPromiseBasedClientCall),
104     static_cast<uint8_t>(grpc_core::kExperimentIdPromiseBasedServerCall)};
105 const char* const description_rstpit =
106     "On RST_STREAM on a server, reduce MAX_CONCURRENT_STREAMS for a short "
107     "duration";
108 const char* const additional_constraints_rstpit = "{}";
109 const char* const description_schedule_cancellation_over_write =
110     "Allow cancellation op to be scheduled over a write";
111 const char* const additional_constraints_schedule_cancellation_over_write =
112     "{}";
113 const char* const description_server_privacy = "If set, server privacy";
114 const char* const additional_constraints_server_privacy = "{}";
115 const char* const description_tcp_frame_size_tuning =
116     "If set, enables TCP to use RPC size estimation made by higher layers. TCP "
117     "would not indicate completion of a read operation until a specified "
118     "number of bytes have been read over the socket. Buffers are also "
119     "allocated according to estimated RPC sizes.";
120 const char* const additional_constraints_tcp_frame_size_tuning = "{}";
121 const char* const description_tcp_rcv_lowat =
122     "Use SO_RCVLOWAT to avoid wakeups on the read path.";
123 const char* const additional_constraints_tcp_rcv_lowat = "{}";
124 const char* const description_trace_record_callops =
125     "Enables tracing of call batch initiation and completion.";
126 const char* const additional_constraints_trace_record_callops = "{}";
127 const char* const description_unconstrained_max_quota_buffer_size =
128     "Discard the cap on the max free pool size for one memory allocator";
129 const char* const additional_constraints_unconstrained_max_quota_buffer_size =
130     "{}";
131 const char* const description_work_serializer_clears_time_cache =
132     "Have the work serializer clear the time cache when it dispatches work.";
133 const char* const additional_constraints_work_serializer_clears_time_cache =
134     "{}";
135 const char* const description_work_serializer_dispatch =
136     "Have the work serializer dispatch work to event engine for every "
137     "callback, instead of running things inline in the first thread that "
138     "successfully enqueues work.";
139 const char* const additional_constraints_work_serializer_dispatch = "{}";
140 const uint8_t required_experiments_work_serializer_dispatch[] = {
141     static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient)};
142 }  // namespace
143 
144 namespace grpc_core {
145 
146 const ExperimentMetadata g_experiment_metadata[] = {
147     {"call_status_override_on_cancellation",
148      description_call_status_override_on_cancellation,
149      additional_constraints_call_status_override_on_cancellation, nullptr, 0,
150      false, true},
151     {"call_v3", description_call_v3, additional_constraints_call_v3, nullptr, 0,
152      false, true},
153     {"canary_client_privacy", description_canary_client_privacy,
154      additional_constraints_canary_client_privacy, nullptr, 0, false, false},
155     {"client_privacy", description_client_privacy,
156      additional_constraints_client_privacy, nullptr, 0, false, false},
157     {"event_engine_client", description_event_engine_client,
158      additional_constraints_event_engine_client, nullptr, 0, false, true},
159     {"event_engine_dns", description_event_engine_dns,
160      additional_constraints_event_engine_dns, nullptr, 0, false, false},
161     {"event_engine_listener", description_event_engine_listener,
162      additional_constraints_event_engine_listener, nullptr, 0, false, true},
163     {"free_large_allocator", description_free_large_allocator,
164      additional_constraints_free_large_allocator, nullptr, 0, false, true},
165     {"http2_stats_fix", description_http2_stats_fix,
166      additional_constraints_http2_stats_fix, nullptr, 0, true, true},
167     {"keepalive_fix", description_keepalive_fix,
168      additional_constraints_keepalive_fix, nullptr, 0, false, false},
169     {"keepalive_server_fix", description_keepalive_server_fix,
170      additional_constraints_keepalive_server_fix, nullptr, 0, false, false},
171     {"monitoring_experiment", description_monitoring_experiment,
172      additional_constraints_monitoring_experiment, nullptr, 0, true, true},
173     {"multiping", description_multiping, additional_constraints_multiping,
174      nullptr, 0, false, true},
175     {"peer_state_based_framing", description_peer_state_based_framing,
176      additional_constraints_peer_state_based_framing, nullptr, 0, false, true},
177     {"pending_queue_cap", description_pending_queue_cap,
178      additional_constraints_pending_queue_cap, nullptr, 0, true, true},
179     {"promise_based_client_call", description_promise_based_client_call,
180      additional_constraints_promise_based_client_call,
181      required_experiments_promise_based_client_call, 2, false, true},
182     {"promise_based_server_call", description_promise_based_server_call,
183      additional_constraints_promise_based_server_call, nullptr, 0, false, true},
184     {"chaotic_good", description_chaotic_good,
185      additional_constraints_chaotic_good, required_experiments_chaotic_good, 2,
186      false, true},
187     {"promise_based_inproc_transport",
188      description_promise_based_inproc_transport,
189      additional_constraints_promise_based_inproc_transport,
190      required_experiments_promise_based_inproc_transport, 2, false, false},
191     {"rstpit", description_rstpit, additional_constraints_rstpit, nullptr, 0,
192      false, true},
193     {"schedule_cancellation_over_write",
194      description_schedule_cancellation_over_write,
195      additional_constraints_schedule_cancellation_over_write, nullptr, 0, false,
196      true},
197     {"server_privacy", description_server_privacy,
198      additional_constraints_server_privacy, nullptr, 0, false, false},
199     {"tcp_frame_size_tuning", description_tcp_frame_size_tuning,
200      additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true},
201     {"tcp_rcv_lowat", description_tcp_rcv_lowat,
202      additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true},
203     {"trace_record_callops", description_trace_record_callops,
204      additional_constraints_trace_record_callops, nullptr, 0, false, true},
205     {"unconstrained_max_quota_buffer_size",
206      description_unconstrained_max_quota_buffer_size,
207      additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0,
208      false, true},
209     {"work_serializer_clears_time_cache",
210      description_work_serializer_clears_time_cache,
211      additional_constraints_work_serializer_clears_time_cache, nullptr, 0, true,
212      true},
213     {"work_serializer_dispatch", description_work_serializer_dispatch,
214      additional_constraints_work_serializer_dispatch,
215      required_experiments_work_serializer_dispatch, 1, false, true},
216 };
217 
218 }  // namespace grpc_core
219 
220 #elif defined(GPR_WINDOWS)
221 namespace {
222 const char* const description_call_status_override_on_cancellation =
223     "Avoid overriding call status of successfully finished calls if it races "
224     "with cancellation.";
225 const char* const additional_constraints_call_status_override_on_cancellation =
226     "{}";
227 const char* const description_call_v3 = "Promise-based call version 3.";
228 const char* const additional_constraints_call_v3 = "{}";
229 const char* const description_canary_client_privacy =
230     "If set, canary client privacy";
231 const char* const additional_constraints_canary_client_privacy = "{}";
232 const char* const description_client_privacy = "If set, client privacy";
233 const char* const additional_constraints_client_privacy = "{}";
234 const char* const description_event_engine_client =
235     "Use EventEngine clients instead of iomgr's grpc_tcp_client";
236 const char* const additional_constraints_event_engine_client = "{}";
237 const char* const description_event_engine_dns =
238     "If set, use EventEngine DNSResolver for client channel resolution";
239 const char* const additional_constraints_event_engine_dns = "{}";
240 const char* const description_event_engine_listener =
241     "Use EventEngine listeners instead of iomgr's grpc_tcp_server";
242 const char* const additional_constraints_event_engine_listener = "{}";
243 const char* const description_free_large_allocator =
244     "If set, return all free bytes from a \042big\042 allocator";
245 const char* const additional_constraints_free_large_allocator = "{}";
246 const char* const description_http2_stats_fix =
247     "Fix on HTTP2 outgoing data stats reporting";
248 const char* const additional_constraints_http2_stats_fix = "{}";
249 const char* const description_keepalive_fix =
250     "Allows overriding keepalive_permit_without_calls. Refer "
251     "https://github.com/grpc/grpc/pull/33428 for more information.";
252 const char* const additional_constraints_keepalive_fix = "{}";
253 const char* const description_keepalive_server_fix =
254     "Allows overriding keepalive_permit_without_calls for servers. Refer "
255     "https://github.com/grpc/grpc/pull/33917 for more information.";
256 const char* const additional_constraints_keepalive_server_fix = "{}";
257 const char* const description_monitoring_experiment =
258     "Placeholder experiment to prove/disprove our monitoring is working";
259 const char* const additional_constraints_monitoring_experiment = "{}";
260 const char* const description_multiping =
261     "Allow more than one ping to be in flight at a time by default.";
262 const char* const additional_constraints_multiping = "{}";
263 const char* const description_peer_state_based_framing =
264     "If set, the max sizes of frames sent to lower layers is controlled based "
265     "on the peer's memory pressure which is reflected in its max http2 frame "
266     "size.";
267 const char* const additional_constraints_peer_state_based_framing = "{}";
268 const char* const description_pending_queue_cap =
269     "In the sync & async apis (but not the callback api), cap the number of "
270     "received but unrequested requests in the server for each call type. A "
271     "received message is one that was read from the wire on the server. A "
272     "requested message is one explicitly requested by the application using "
273     "grpc_server_request_call or grpc_server_request_registered_call (or their "
274     "wrappers in the C++ API).";
275 const char* const additional_constraints_pending_queue_cap = "{}";
276 const char* const description_promise_based_client_call =
277     "If set, use the new gRPC promise based call code when it's appropriate "
278     "(ie when all filters in a stack are promise based)";
279 const char* const additional_constraints_promise_based_client_call = "{}";
280 const uint8_t required_experiments_promise_based_client_call[] = {
281     static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
282     static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
283 const char* const description_promise_based_server_call =
284     "If set, use the new gRPC promise based call code when it's appropriate "
285     "(ie when all filters in a stack are promise based)";
286 const char* const additional_constraints_promise_based_server_call = "{}";
287 const char* const description_chaotic_good =
288     "If set, enable the chaotic good load transport (this is mostly here for "
289     "testing)";
290 const char* const additional_constraints_chaotic_good = "{}";
291 const uint8_t required_experiments_chaotic_good[] = {
292     static_cast<uint8_t>(grpc_core::kExperimentIdPromiseBasedClientCall),
293     static_cast<uint8_t>(grpc_core::kExperimentIdPromiseBasedServerCall)};
294 const char* const description_promise_based_inproc_transport =
295     "Use promises for the in-process transport.";
296 const char* const additional_constraints_promise_based_inproc_transport = "{}";
297 const uint8_t required_experiments_promise_based_inproc_transport[] = {
298     static_cast<uint8_t>(grpc_core::kExperimentIdPromiseBasedClientCall),
299     static_cast<uint8_t>(grpc_core::kExperimentIdPromiseBasedServerCall)};
300 const char* const description_rstpit =
301     "On RST_STREAM on a server, reduce MAX_CONCURRENT_STREAMS for a short "
302     "duration";
303 const char* const additional_constraints_rstpit = "{}";
304 const char* const description_schedule_cancellation_over_write =
305     "Allow cancellation op to be scheduled over a write";
306 const char* const additional_constraints_schedule_cancellation_over_write =
307     "{}";
308 const char* const description_server_privacy = "If set, server privacy";
309 const char* const additional_constraints_server_privacy = "{}";
310 const char* const description_tcp_frame_size_tuning =
311     "If set, enables TCP to use RPC size estimation made by higher layers. TCP "
312     "would not indicate completion of a read operation until a specified "
313     "number of bytes have been read over the socket. Buffers are also "
314     "allocated according to estimated RPC sizes.";
315 const char* const additional_constraints_tcp_frame_size_tuning = "{}";
316 const char* const description_tcp_rcv_lowat =
317     "Use SO_RCVLOWAT to avoid wakeups on the read path.";
318 const char* const additional_constraints_tcp_rcv_lowat = "{}";
319 const char* const description_trace_record_callops =
320     "Enables tracing of call batch initiation and completion.";
321 const char* const additional_constraints_trace_record_callops = "{}";
322 const char* const description_unconstrained_max_quota_buffer_size =
323     "Discard the cap on the max free pool size for one memory allocator";
324 const char* const additional_constraints_unconstrained_max_quota_buffer_size =
325     "{}";
326 const char* const description_work_serializer_clears_time_cache =
327     "Have the work serializer clear the time cache when it dispatches work.";
328 const char* const additional_constraints_work_serializer_clears_time_cache =
329     "{}";
330 const char* const description_work_serializer_dispatch =
331     "Have the work serializer dispatch work to event engine for every "
332     "callback, instead of running things inline in the first thread that "
333     "successfully enqueues work.";
334 const char* const additional_constraints_work_serializer_dispatch = "{}";
335 const uint8_t required_experiments_work_serializer_dispatch[] = {
336     static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient)};
337 }  // namespace
338 
339 namespace grpc_core {
340 
341 const ExperimentMetadata g_experiment_metadata[] = {
342     {"call_status_override_on_cancellation",
343      description_call_status_override_on_cancellation,
344      additional_constraints_call_status_override_on_cancellation, nullptr, 0,
345      false, true},
346     {"call_v3", description_call_v3, additional_constraints_call_v3, nullptr, 0,
347      false, true},
348     {"canary_client_privacy", description_canary_client_privacy,
349      additional_constraints_canary_client_privacy, nullptr, 0, false, false},
350     {"client_privacy", description_client_privacy,
351      additional_constraints_client_privacy, nullptr, 0, false, false},
352     {"event_engine_client", description_event_engine_client,
353      additional_constraints_event_engine_client, nullptr, 0, false, true},
354     {"event_engine_dns", description_event_engine_dns,
355      additional_constraints_event_engine_dns, nullptr, 0, false, false},
356     {"event_engine_listener", description_event_engine_listener,
357      additional_constraints_event_engine_listener, nullptr, 0, true, true},
358     {"free_large_allocator", description_free_large_allocator,
359      additional_constraints_free_large_allocator, nullptr, 0, false, true},
360     {"http2_stats_fix", description_http2_stats_fix,
361      additional_constraints_http2_stats_fix, nullptr, 0, true, true},
362     {"keepalive_fix", description_keepalive_fix,
363      additional_constraints_keepalive_fix, nullptr, 0, false, false},
364     {"keepalive_server_fix", description_keepalive_server_fix,
365      additional_constraints_keepalive_server_fix, nullptr, 0, false, false},
366     {"monitoring_experiment", description_monitoring_experiment,
367      additional_constraints_monitoring_experiment, nullptr, 0, true, true},
368     {"multiping", description_multiping, additional_constraints_multiping,
369      nullptr, 0, false, true},
370     {"peer_state_based_framing", description_peer_state_based_framing,
371      additional_constraints_peer_state_based_framing, nullptr, 0, false, true},
372     {"pending_queue_cap", description_pending_queue_cap,
373      additional_constraints_pending_queue_cap, nullptr, 0, true, true},
374     {"promise_based_client_call", description_promise_based_client_call,
375      additional_constraints_promise_based_client_call,
376      required_experiments_promise_based_client_call, 2, false, true},
377     {"promise_based_server_call", description_promise_based_server_call,
378      additional_constraints_promise_based_server_call, nullptr, 0, false, true},
379     {"chaotic_good", description_chaotic_good,
380      additional_constraints_chaotic_good, required_experiments_chaotic_good, 2,
381      false, true},
382     {"promise_based_inproc_transport",
383      description_promise_based_inproc_transport,
384      additional_constraints_promise_based_inproc_transport,
385      required_experiments_promise_based_inproc_transport, 2, false, false},
386     {"rstpit", description_rstpit, additional_constraints_rstpit, nullptr, 0,
387      false, true},
388     {"schedule_cancellation_over_write",
389      description_schedule_cancellation_over_write,
390      additional_constraints_schedule_cancellation_over_write, nullptr, 0, false,
391      true},
392     {"server_privacy", description_server_privacy,
393      additional_constraints_server_privacy, nullptr, 0, false, false},
394     {"tcp_frame_size_tuning", description_tcp_frame_size_tuning,
395      additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true},
396     {"tcp_rcv_lowat", description_tcp_rcv_lowat,
397      additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true},
398     {"trace_record_callops", description_trace_record_callops,
399      additional_constraints_trace_record_callops, nullptr, 0, false, true},
400     {"unconstrained_max_quota_buffer_size",
401      description_unconstrained_max_quota_buffer_size,
402      additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0,
403      false, true},
404     {"work_serializer_clears_time_cache",
405      description_work_serializer_clears_time_cache,
406      additional_constraints_work_serializer_clears_time_cache, nullptr, 0, true,
407      true},
408     {"work_serializer_dispatch", description_work_serializer_dispatch,
409      additional_constraints_work_serializer_dispatch,
410      required_experiments_work_serializer_dispatch, 1, false, true},
411 };
412 
413 }  // namespace grpc_core
414 
415 #else
416 namespace {
417 const char* const description_call_status_override_on_cancellation =
418     "Avoid overriding call status of successfully finished calls if it races "
419     "with cancellation.";
420 const char* const additional_constraints_call_status_override_on_cancellation =
421     "{}";
422 const char* const description_call_v3 = "Promise-based call version 3.";
423 const char* const additional_constraints_call_v3 = "{}";
424 const char* const description_canary_client_privacy =
425     "If set, canary client privacy";
426 const char* const additional_constraints_canary_client_privacy = "{}";
427 const char* const description_client_privacy = "If set, client privacy";
428 const char* const additional_constraints_client_privacy = "{}";
429 const char* const description_event_engine_client =
430     "Use EventEngine clients instead of iomgr's grpc_tcp_client";
431 const char* const additional_constraints_event_engine_client = "{}";
432 const char* const description_event_engine_dns =
433     "If set, use EventEngine DNSResolver for client channel resolution";
434 const char* const additional_constraints_event_engine_dns = "{}";
435 const char* const description_event_engine_listener =
436     "Use EventEngine listeners instead of iomgr's grpc_tcp_server";
437 const char* const additional_constraints_event_engine_listener = "{}";
438 const char* const description_free_large_allocator =
439     "If set, return all free bytes from a \042big\042 allocator";
440 const char* const additional_constraints_free_large_allocator = "{}";
441 const char* const description_http2_stats_fix =
442     "Fix on HTTP2 outgoing data stats reporting";
443 const char* const additional_constraints_http2_stats_fix = "{}";
444 const char* const description_keepalive_fix =
445     "Allows overriding keepalive_permit_without_calls. Refer "
446     "https://github.com/grpc/grpc/pull/33428 for more information.";
447 const char* const additional_constraints_keepalive_fix = "{}";
448 const char* const description_keepalive_server_fix =
449     "Allows overriding keepalive_permit_without_calls for servers. Refer "
450     "https://github.com/grpc/grpc/pull/33917 for more information.";
451 const char* const additional_constraints_keepalive_server_fix = "{}";
452 const char* const description_monitoring_experiment =
453     "Placeholder experiment to prove/disprove our monitoring is working";
454 const char* const additional_constraints_monitoring_experiment = "{}";
455 const char* const description_multiping =
456     "Allow more than one ping to be in flight at a time by default.";
457 const char* const additional_constraints_multiping = "{}";
458 const char* const description_peer_state_based_framing =
459     "If set, the max sizes of frames sent to lower layers is controlled based "
460     "on the peer's memory pressure which is reflected in its max http2 frame "
461     "size.";
462 const char* const additional_constraints_peer_state_based_framing = "{}";
463 const char* const description_pending_queue_cap =
464     "In the sync & async apis (but not the callback api), cap the number of "
465     "received but unrequested requests in the server for each call type. A "
466     "received message is one that was read from the wire on the server. A "
467     "requested message is one explicitly requested by the application using "
468     "grpc_server_request_call or grpc_server_request_registered_call (or their "
469     "wrappers in the C++ API).";
470 const char* const additional_constraints_pending_queue_cap = "{}";
471 const char* const description_promise_based_client_call =
472     "If set, use the new gRPC promise based call code when it's appropriate "
473     "(ie when all filters in a stack are promise based)";
474 const char* const additional_constraints_promise_based_client_call = "{}";
475 const uint8_t required_experiments_promise_based_client_call[] = {
476     static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
477     static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
478 const char* const description_promise_based_server_call =
479     "If set, use the new gRPC promise based call code when it's appropriate "
480     "(ie when all filters in a stack are promise based)";
481 const char* const additional_constraints_promise_based_server_call = "{}";
482 const char* const description_chaotic_good =
483     "If set, enable the chaotic good load transport (this is mostly here for "
484     "testing)";
485 const char* const additional_constraints_chaotic_good = "{}";
486 const uint8_t required_experiments_chaotic_good[] = {
487     static_cast<uint8_t>(grpc_core::kExperimentIdPromiseBasedClientCall),
488     static_cast<uint8_t>(grpc_core::kExperimentIdPromiseBasedServerCall)};
489 const char* const description_promise_based_inproc_transport =
490     "Use promises for the in-process transport.";
491 const char* const additional_constraints_promise_based_inproc_transport = "{}";
492 const uint8_t required_experiments_promise_based_inproc_transport[] = {
493     static_cast<uint8_t>(grpc_core::kExperimentIdPromiseBasedClientCall),
494     static_cast<uint8_t>(grpc_core::kExperimentIdPromiseBasedServerCall)};
495 const char* const description_rstpit =
496     "On RST_STREAM on a server, reduce MAX_CONCURRENT_STREAMS for a short "
497     "duration";
498 const char* const additional_constraints_rstpit = "{}";
499 const char* const description_schedule_cancellation_over_write =
500     "Allow cancellation op to be scheduled over a write";
501 const char* const additional_constraints_schedule_cancellation_over_write =
502     "{}";
503 const char* const description_server_privacy = "If set, server privacy";
504 const char* const additional_constraints_server_privacy = "{}";
505 const char* const description_tcp_frame_size_tuning =
506     "If set, enables TCP to use RPC size estimation made by higher layers. TCP "
507     "would not indicate completion of a read operation until a specified "
508     "number of bytes have been read over the socket. Buffers are also "
509     "allocated according to estimated RPC sizes.";
510 const char* const additional_constraints_tcp_frame_size_tuning = "{}";
511 const char* const description_tcp_rcv_lowat =
512     "Use SO_RCVLOWAT to avoid wakeups on the read path.";
513 const char* const additional_constraints_tcp_rcv_lowat = "{}";
514 const char* const description_trace_record_callops =
515     "Enables tracing of call batch initiation and completion.";
516 const char* const additional_constraints_trace_record_callops = "{}";
517 const char* const description_unconstrained_max_quota_buffer_size =
518     "Discard the cap on the max free pool size for one memory allocator";
519 const char* const additional_constraints_unconstrained_max_quota_buffer_size =
520     "{}";
521 const char* const description_work_serializer_clears_time_cache =
522     "Have the work serializer clear the time cache when it dispatches work.";
523 const char* const additional_constraints_work_serializer_clears_time_cache =
524     "{}";
525 const char* const description_work_serializer_dispatch =
526     "Have the work serializer dispatch work to event engine for every "
527     "callback, instead of running things inline in the first thread that "
528     "successfully enqueues work.";
529 const char* const additional_constraints_work_serializer_dispatch = "{}";
530 const uint8_t required_experiments_work_serializer_dispatch[] = {
531     static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient)};
532 }  // namespace
533 
534 namespace grpc_core {
535 
536 const ExperimentMetadata g_experiment_metadata[] = {
537     {"call_status_override_on_cancellation",
538      description_call_status_override_on_cancellation,
539      additional_constraints_call_status_override_on_cancellation, nullptr, 0,
540      false, true},
541     {"call_v3", description_call_v3, additional_constraints_call_v3, nullptr, 0,
542      false, true},
543     {"canary_client_privacy", description_canary_client_privacy,
544      additional_constraints_canary_client_privacy, nullptr, 0, false, false},
545     {"client_privacy", description_client_privacy,
546      additional_constraints_client_privacy, nullptr, 0, false, false},
547     {"event_engine_client", description_event_engine_client,
548      additional_constraints_event_engine_client, nullptr, 0, false, true},
549     {"event_engine_dns", description_event_engine_dns,
550      additional_constraints_event_engine_dns, nullptr, 0, true, false},
551     {"event_engine_listener", description_event_engine_listener,
552      additional_constraints_event_engine_listener, nullptr, 0, true, true},
553     {"free_large_allocator", description_free_large_allocator,
554      additional_constraints_free_large_allocator, nullptr, 0, false, true},
555     {"http2_stats_fix", description_http2_stats_fix,
556      additional_constraints_http2_stats_fix, nullptr, 0, true, true},
557     {"keepalive_fix", description_keepalive_fix,
558      additional_constraints_keepalive_fix, nullptr, 0, false, false},
559     {"keepalive_server_fix", description_keepalive_server_fix,
560      additional_constraints_keepalive_server_fix, nullptr, 0, false, false},
561     {"monitoring_experiment", description_monitoring_experiment,
562      additional_constraints_monitoring_experiment, nullptr, 0, true, true},
563     {"multiping", description_multiping, additional_constraints_multiping,
564      nullptr, 0, false, true},
565     {"peer_state_based_framing", description_peer_state_based_framing,
566      additional_constraints_peer_state_based_framing, nullptr, 0, false, true},
567     {"pending_queue_cap", description_pending_queue_cap,
568      additional_constraints_pending_queue_cap, nullptr, 0, true, true},
569     {"promise_based_client_call", description_promise_based_client_call,
570      additional_constraints_promise_based_client_call,
571      required_experiments_promise_based_client_call, 2, false, true},
572     {"promise_based_server_call", description_promise_based_server_call,
573      additional_constraints_promise_based_server_call, nullptr, 0, false, true},
574     {"chaotic_good", description_chaotic_good,
575      additional_constraints_chaotic_good, required_experiments_chaotic_good, 2,
576      false, true},
577     {"promise_based_inproc_transport",
578      description_promise_based_inproc_transport,
579      additional_constraints_promise_based_inproc_transport,
580      required_experiments_promise_based_inproc_transport, 2, false, false},
581     {"rstpit", description_rstpit, additional_constraints_rstpit, nullptr, 0,
582      false, true},
583     {"schedule_cancellation_over_write",
584      description_schedule_cancellation_over_write,
585      additional_constraints_schedule_cancellation_over_write, nullptr, 0, false,
586      true},
587     {"server_privacy", description_server_privacy,
588      additional_constraints_server_privacy, nullptr, 0, false, false},
589     {"tcp_frame_size_tuning", description_tcp_frame_size_tuning,
590      additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true},
591     {"tcp_rcv_lowat", description_tcp_rcv_lowat,
592      additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true},
593     {"trace_record_callops", description_trace_record_callops,
594      additional_constraints_trace_record_callops, nullptr, 0, false, true},
595     {"unconstrained_max_quota_buffer_size",
596      description_unconstrained_max_quota_buffer_size,
597      additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0,
598      false, true},
599     {"work_serializer_clears_time_cache",
600      description_work_serializer_clears_time_cache,
601      additional_constraints_work_serializer_clears_time_cache, nullptr, 0, true,
602      true},
603     {"work_serializer_dispatch", description_work_serializer_dispatch,
604      additional_constraints_work_serializer_dispatch,
605      required_experiments_work_serializer_dispatch, 1, true, true},
606 };
607 
608 }  // namespace grpc_core
609 #endif
610 #endif
611