[PH2] New Experiments (#38103)

- Adding two experiments for promises based HTTP2 transport.
- We have kept client and server transport experiments separate to help with smoother roll outs and also help with interop testing.
- The experiments are disabled, we expect this project to take several months.

Closes #38103

COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38103 from tanvi-jagtap:client_server_transport_experiment 53a24bda04
PiperOrigin-RevId: 695606023
pull/37892/merge
Tanvi Jagtap 3 weeks ago committed by Copybara-Service
parent e3039bc386
commit be472f1244
  1. 2
      bazel/experiments.bzl
  2. 60
      src/core/lib/experiments/experiments.cc
  3. 16
      src/core/lib/experiments/experiments.h
  4. 18
      src/core/lib/experiments/experiments.yaml
  5. 4
      src/core/lib/experiments/rollouts.yaml

@ -34,6 +34,8 @@ EXPERIMENT_ENABLES = {
"monitoring_experiment": "monitoring_experiment", "monitoring_experiment": "monitoring_experiment",
"multiping": "multiping", "multiping": "multiping",
"pick_first_new": "pick_first_new", "pick_first_new": "pick_first_new",
"promise_based_http2_client_transport": "promise_based_http2_client_transport",
"promise_based_http2_server_transport": "promise_based_http2_server_transport",
"promise_based_inproc_transport": "promise_based_inproc_transport", "promise_based_inproc_transport": "promise_based_inproc_transport",
"rq_fast_reject": "rq_fast_reject", "rq_fast_reject": "rq_fast_reject",
"schedule_cancellation_over_write": "schedule_cancellation_over_write", "schedule_cancellation_over_write": "schedule_cancellation_over_write",

@ -86,6 +86,18 @@ const char* const additional_constraints_multiping = "{}";
const char* const description_pick_first_new = const char* const description_pick_first_new =
"New pick_first impl with memory reduction."; "New pick_first impl with memory reduction.";
const char* const additional_constraints_pick_first_new = "{}"; const char* const additional_constraints_pick_first_new = "{}";
const char* const description_promise_based_http2_client_transport =
"Use promises for the http2 client transport. We have kept client and "
"server transport experiments separate to help with smoother roll outs and "
"also help with interop testing.";
const char* const additional_constraints_promise_based_http2_client_transport =
"{}";
const char* const description_promise_based_http2_server_transport =
"Use promises for the http2 server transport. We have kept client and "
"server transport experiments separate to help with smoother roll outs and "
"also help with interop testing.";
const char* const additional_constraints_promise_based_http2_server_transport =
"{}";
const char* const description_promise_based_inproc_transport = const char* const description_promise_based_inproc_transport =
"Use promises for the in-process transport."; "Use promises for the in-process transport.";
const char* const additional_constraints_promise_based_inproc_transport = "{}"; const char* const additional_constraints_promise_based_inproc_transport = "{}";
@ -172,6 +184,14 @@ const ExperimentMetadata g_experiment_metadata[] = {
nullptr, 0, false, true}, nullptr, 0, false, true},
{"pick_first_new", description_pick_first_new, {"pick_first_new", description_pick_first_new,
additional_constraints_pick_first_new, nullptr, 0, true, true}, additional_constraints_pick_first_new, nullptr, 0, true, true},
{"promise_based_http2_client_transport",
description_promise_based_http2_client_transport,
additional_constraints_promise_based_http2_client_transport, nullptr, 0,
false, true},
{"promise_based_http2_server_transport",
description_promise_based_http2_server_transport,
additional_constraints_promise_based_http2_server_transport, nullptr, 0,
false, true},
{"promise_based_inproc_transport", {"promise_based_inproc_transport",
description_promise_based_inproc_transport, description_promise_based_inproc_transport,
additional_constraints_promise_based_inproc_transport, nullptr, 0, false, additional_constraints_promise_based_inproc_transport, nullptr, 0, false,
@ -267,6 +287,18 @@ const char* const additional_constraints_multiping = "{}";
const char* const description_pick_first_new = const char* const description_pick_first_new =
"New pick_first impl with memory reduction."; "New pick_first impl with memory reduction.";
const char* const additional_constraints_pick_first_new = "{}"; const char* const additional_constraints_pick_first_new = "{}";
const char* const description_promise_based_http2_client_transport =
"Use promises for the http2 client transport. We have kept client and "
"server transport experiments separate to help with smoother roll outs and "
"also help with interop testing.";
const char* const additional_constraints_promise_based_http2_client_transport =
"{}";
const char* const description_promise_based_http2_server_transport =
"Use promises for the http2 server transport. We have kept client and "
"server transport experiments separate to help with smoother roll outs and "
"also help with interop testing.";
const char* const additional_constraints_promise_based_http2_server_transport =
"{}";
const char* const description_promise_based_inproc_transport = const char* const description_promise_based_inproc_transport =
"Use promises for the in-process transport."; "Use promises for the in-process transport.";
const char* const additional_constraints_promise_based_inproc_transport = "{}"; const char* const additional_constraints_promise_based_inproc_transport = "{}";
@ -353,6 +385,14 @@ const ExperimentMetadata g_experiment_metadata[] = {
nullptr, 0, false, true}, nullptr, 0, false, true},
{"pick_first_new", description_pick_first_new, {"pick_first_new", description_pick_first_new,
additional_constraints_pick_first_new, nullptr, 0, true, true}, additional_constraints_pick_first_new, nullptr, 0, true, true},
{"promise_based_http2_client_transport",
description_promise_based_http2_client_transport,
additional_constraints_promise_based_http2_client_transport, nullptr, 0,
false, true},
{"promise_based_http2_server_transport",
description_promise_based_http2_server_transport,
additional_constraints_promise_based_http2_server_transport, nullptr, 0,
false, true},
{"promise_based_inproc_transport", {"promise_based_inproc_transport",
description_promise_based_inproc_transport, description_promise_based_inproc_transport,
additional_constraints_promise_based_inproc_transport, nullptr, 0, false, additional_constraints_promise_based_inproc_transport, nullptr, 0, false,
@ -448,6 +488,18 @@ const char* const additional_constraints_multiping = "{}";
const char* const description_pick_first_new = const char* const description_pick_first_new =
"New pick_first impl with memory reduction."; "New pick_first impl with memory reduction.";
const char* const additional_constraints_pick_first_new = "{}"; const char* const additional_constraints_pick_first_new = "{}";
const char* const description_promise_based_http2_client_transport =
"Use promises for the http2 client transport. We have kept client and "
"server transport experiments separate to help with smoother roll outs and "
"also help with interop testing.";
const char* const additional_constraints_promise_based_http2_client_transport =
"{}";
const char* const description_promise_based_http2_server_transport =
"Use promises for the http2 server transport. We have kept client and "
"server transport experiments separate to help with smoother roll outs and "
"also help with interop testing.";
const char* const additional_constraints_promise_based_http2_server_transport =
"{}";
const char* const description_promise_based_inproc_transport = const char* const description_promise_based_inproc_transport =
"Use promises for the in-process transport."; "Use promises for the in-process transport.";
const char* const additional_constraints_promise_based_inproc_transport = "{}"; const char* const additional_constraints_promise_based_inproc_transport = "{}";
@ -534,6 +586,14 @@ const ExperimentMetadata g_experiment_metadata[] = {
nullptr, 0, false, true}, nullptr, 0, false, true},
{"pick_first_new", description_pick_first_new, {"pick_first_new", description_pick_first_new,
additional_constraints_pick_first_new, nullptr, 0, true, true}, additional_constraints_pick_first_new, nullptr, 0, true, true},
{"promise_based_http2_client_transport",
description_promise_based_http2_client_transport,
additional_constraints_promise_based_http2_client_transport, nullptr, 0,
false, true},
{"promise_based_http2_server_transport",
description_promise_based_http2_server_transport,
additional_constraints_promise_based_http2_server_transport, nullptr, 0,
false, true},
{"promise_based_inproc_transport", {"promise_based_inproc_transport",
description_promise_based_inproc_transport, description_promise_based_inproc_transport,
additional_constraints_promise_based_inproc_transport, nullptr, 0, false, additional_constraints_promise_based_inproc_transport, nullptr, 0, false,

@ -79,6 +79,8 @@ inline bool IsMonitoringExperimentEnabled() { return true; }
inline bool IsMultipingEnabled() { return false; } inline bool IsMultipingEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_PICK_FIRST_NEW #define GRPC_EXPERIMENT_IS_INCLUDED_PICK_FIRST_NEW
inline bool IsPickFirstNewEnabled() { return true; } inline bool IsPickFirstNewEnabled() { return true; }
inline bool IsPromiseBasedHttp2ClientTransportEnabled() { return false; }
inline bool IsPromiseBasedHttp2ServerTransportEnabled() { return false; }
inline bool IsPromiseBasedInprocTransportEnabled() { return false; } inline bool IsPromiseBasedInprocTransportEnabled() { return false; }
inline bool IsRqFastRejectEnabled() { return false; } inline bool IsRqFastRejectEnabled() { return false; }
inline bool IsScheduleCancellationOverWriteEnabled() { return false; } inline bool IsScheduleCancellationOverWriteEnabled() { return false; }
@ -119,6 +121,8 @@ inline bool IsMonitoringExperimentEnabled() { return true; }
inline bool IsMultipingEnabled() { return false; } inline bool IsMultipingEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_PICK_FIRST_NEW #define GRPC_EXPERIMENT_IS_INCLUDED_PICK_FIRST_NEW
inline bool IsPickFirstNewEnabled() { return true; } inline bool IsPickFirstNewEnabled() { return true; }
inline bool IsPromiseBasedHttp2ClientTransportEnabled() { return false; }
inline bool IsPromiseBasedHttp2ServerTransportEnabled() { return false; }
inline bool IsPromiseBasedInprocTransportEnabled() { return false; } inline bool IsPromiseBasedInprocTransportEnabled() { return false; }
inline bool IsRqFastRejectEnabled() { return false; } inline bool IsRqFastRejectEnabled() { return false; }
inline bool IsScheduleCancellationOverWriteEnabled() { return false; } inline bool IsScheduleCancellationOverWriteEnabled() { return false; }
@ -159,6 +163,8 @@ inline bool IsMonitoringExperimentEnabled() { return true; }
inline bool IsMultipingEnabled() { return false; } inline bool IsMultipingEnabled() { return false; }
#define GRPC_EXPERIMENT_IS_INCLUDED_PICK_FIRST_NEW #define GRPC_EXPERIMENT_IS_INCLUDED_PICK_FIRST_NEW
inline bool IsPickFirstNewEnabled() { return true; } inline bool IsPickFirstNewEnabled() { return true; }
inline bool IsPromiseBasedHttp2ClientTransportEnabled() { return false; }
inline bool IsPromiseBasedHttp2ServerTransportEnabled() { return false; }
inline bool IsPromiseBasedInprocTransportEnabled() { return false; } inline bool IsPromiseBasedInprocTransportEnabled() { return false; }
inline bool IsRqFastRejectEnabled() { return false; } inline bool IsRqFastRejectEnabled() { return false; }
inline bool IsScheduleCancellationOverWriteEnabled() { return false; } inline bool IsScheduleCancellationOverWriteEnabled() { return false; }
@ -193,6 +199,8 @@ enum ExperimentIds {
kExperimentIdMonitoringExperiment, kExperimentIdMonitoringExperiment,
kExperimentIdMultiping, kExperimentIdMultiping,
kExperimentIdPickFirstNew, kExperimentIdPickFirstNew,
kExperimentIdPromiseBasedHttp2ClientTransport,
kExperimentIdPromiseBasedHttp2ServerTransport,
kExperimentIdPromiseBasedInprocTransport, kExperimentIdPromiseBasedInprocTransport,
kExperimentIdRqFastReject, kExperimentIdRqFastReject,
kExperimentIdScheduleCancellationOverWrite, kExperimentIdScheduleCancellationOverWrite,
@ -274,6 +282,14 @@ inline bool IsMultipingEnabled() {
inline bool IsPickFirstNewEnabled() { inline bool IsPickFirstNewEnabled() {
return IsExperimentEnabled<kExperimentIdPickFirstNew>(); return IsExperimentEnabled<kExperimentIdPickFirstNew>();
} }
#define GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_HTTP2_CLIENT_TRANSPORT
inline bool IsPromiseBasedHttp2ClientTransportEnabled() {
return IsExperimentEnabled<kExperimentIdPromiseBasedHttp2ClientTransport>();
}
#define GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_HTTP2_SERVER_TRANSPORT
inline bool IsPromiseBasedHttp2ServerTransportEnabled() {
return IsExperimentEnabled<kExperimentIdPromiseBasedHttp2ServerTransport>();
}
#define GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_INPROC_TRANSPORT #define GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_INPROC_TRANSPORT
inline bool IsPromiseBasedInprocTransportEnabled() { inline bool IsPromiseBasedInprocTransportEnabled() {
return IsExperimentEnabled<kExperimentIdPromiseBasedInprocTransport>(); return IsExperimentEnabled<kExperimentIdPromiseBasedInprocTransport>();

@ -141,6 +141,24 @@
expiry: 2025/03/01 expiry: 2025/03/01
owner: roth@google.com owner: roth@google.com
test_tags: ["lb_unit_test", "cpp_lb_end2end_test", "xds_end2end_test"] test_tags: ["lb_unit_test", "cpp_lb_end2end_test", "xds_end2end_test"]
- name: promise_based_http2_client_transport
description:
Use promises for the http2 client transport. We have kept client and
server transport experiments separate to help with smoother roll outs
and also help with interop testing.
expiry: 2025/06/03
owner: tjagtap@google.com
test_tags: []
allow_in_fuzzing_config: true
- name: promise_based_http2_server_transport
description:
Use promises for the http2 server transport. We have kept client and
server transport experiments separate to help with smoother roll outs
and also help with interop testing.
expiry: 2025/06/03
owner: tjagtap@google.com
test_tags: []
allow_in_fuzzing_config: true
- name: promise_based_inproc_transport - name: promise_based_inproc_transport
description: description:
Use promises for the in-process transport. Use promises for the in-process transport.

@ -94,6 +94,10 @@
ios: broken ios: broken
windows: broken windows: broken
posix: false posix: false
- name: promise_based_http2_client_transport
default: false
- name: promise_based_http2_server_transport
default: false
- name: rstpit - name: rstpit
default: false default: false
- name: schedule_cancellation_over_write - name: schedule_cancellation_over_write

Loading…
Cancel
Save