Skip to content

Commit 2bb10be

Browse files
ctillercopybara-github
authored andcommitted
[experiments] Allow experiments to opt-in to testing against all pollers (default to not) (grpc#35683)
Closes grpc#35683 COPYBARA_INTEGRATE_REVIEW=grpc#35683 from ctiller:minimize2 ac22512 PiperOrigin-RevId: 601886350
1 parent 4f45565 commit 2bb10be

File tree

5 files changed

+78
-7
lines changed

5 files changed

+78
-7
lines changed

bazel/experiments.bzl

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bazel/grpc_build_system.bzl

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ Contains macros used throughout the repo.
2929

3030
load("//bazel:cc_grpc_library.bzl", "cc_grpc_library")
3131
load("//bazel:copts.bzl", "GRPC_DEFAULT_COPTS")
32-
load("//bazel:experiments.bzl", "EXPERIMENTS", "EXPERIMENT_ENABLES")
33-
load("//bazel:test_experiments.bzl", "TEST_EXPERIMENTS", "TEST_EXPERIMENT_ENABLES")
32+
load("//bazel:experiments.bzl", "EXPERIMENTS", "EXPERIMENT_ENABLES", "EXPERIMENT_POLLERS")
33+
load("//bazel:test_experiments.bzl", "TEST_EXPERIMENTS", "TEST_EXPERIMENT_ENABLES", "TEST_EXPERIMENT_POLLERS")
3434
load("@build_bazel_rules_apple//apple:ios.bzl", "ios_unit_test")
3535
load("@build_bazel_rules_apple//apple/testing/default_runner:ios_test_runner.bzl", "ios_test_runner")
3636
load("@com_google_protobuf//bazel:upb_proto_library.bzl", "upb_proto_library", "upb_proto_reflection_library")
@@ -279,8 +279,10 @@ def ios_cc_test(
279279
deps = ios_test_deps,
280280
)
281281

282-
def expand_tests(name, srcs, deps, tags, args, exclude_pollers, uses_polling, uses_event_engine, flaky):
283-
"""Common logic used to parameterize tests for every poller and EventEngine and experiment.
282+
def expand_poller_config(name, srcs, deps, tags, args, exclude_pollers, uses_polling, uses_event_engine, flaky):
283+
"""Common logic used to parameterize tests for every poller and EventEngine.
284+
285+
Used by expand_tests (repeatedly) to form base lists of pollers for each experiment.
284286
285287
Args:
286288
name: base name of the test
@@ -297,6 +299,7 @@ def expand_tests(name, srcs, deps, tags, args, exclude_pollers, uses_polling, us
297299
Returns:
298300
A list of dictionaries containing modified values of name, srcs, deps, tags, and args.
299301
"""
302+
300303
poller_config = []
301304

302305
# See work_stealing_thread_pool.cc for details.
@@ -373,6 +376,27 @@ def expand_tests(name, srcs, deps, tags, args, exclude_pollers, uses_polling, us
373376
"flaky": flaky,
374377
})
375378

379+
return poller_config
380+
381+
def expand_tests(name, srcs, deps, tags, args, exclude_pollers, uses_polling, uses_event_engine, flaky):
382+
"""Common logic used to parameterize tests for every poller and EventEngine and experiment.
383+
384+
Args:
385+
name: base name of the test
386+
srcs: source files
387+
deps: base deps
388+
tags: base tags
389+
args: base args
390+
flaky: base flaky
391+
exclude_pollers: list of poller names to exclude for this set of tests.
392+
uses_polling: set to False if the test is not sensitive to polling methodology.
393+
uses_event_engine: set to False if the test is not sensitive to
394+
EventEngine implementation differences
395+
396+
Returns:
397+
A list of dictionaries containing modified values of name, srcs, deps, tags, and args.
398+
"""
399+
376400
experiments = {}
377401

378402
# buildifier: disable=uninitialized
@@ -421,13 +445,28 @@ def expand_tests(name, srcs, deps, tags, args, exclude_pollers, uses_polling, us
421445
tags.append("no_test_ios")
422446
return tags
423447

424-
experiment_config = list(poller_config)
448+
base_params = {
449+
"name": name,
450+
"srcs": srcs,
451+
"deps": deps,
452+
"tags": tags,
453+
"args": args,
454+
"exclude_pollers": exclude_pollers,
455+
"uses_polling": uses_polling,
456+
"uses_event_engine": uses_event_engine,
457+
"flaky": flaky,
458+
}
459+
460+
experiment_config = expand_poller_config(**base_params)
425461
experiment_enables = {k: v for k, v in EXPERIMENT_ENABLES.items() + TEST_EXPERIMENT_ENABLES.items()}
462+
experiment_pollers = EXPERIMENT_POLLERS + TEST_EXPERIMENT_POLLERS
426463
for mode, config in mode_config.items():
427464
enabled_tags, disabled_tags = config
428465
if enabled_tags != None:
429466
for experiment in experiments[mode].keys():
430-
for config in poller_config:
467+
experiment_params = dict(base_params)
468+
experiment_params["uses_polling"] = uses_polling and (experiment in experiment_pollers)
469+
for config in expand_poller_config(**experiment_params):
431470
config = dict(config)
432471
config["name"] = config["name"] + "@experiment=" + experiment
433472
env = dict(config["env"])
@@ -443,7 +482,9 @@ def expand_tests(name, srcs, deps, tags, args, exclude_pollers, uses_polling, us
443482
experiment_config.append(config)
444483
if disabled_tags != None:
445484
for experiment in experiments[mode].keys():
446-
for config in poller_config:
485+
experiment_params = dict(base_params)
486+
experiment_params["uses_polling"] = uses_polling and (experiment in experiment_pollers)
487+
for config in expand_poller_config(**experiment_params):
447488
config = dict(config)
448489
config["name"] = config["name"] + "@experiment=no_" + experiment
449490
env = dict(config["env"])

bazel/test_experiments.bzl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ TEST_EXPERIMENT_ENABLES = {
2323
"test_experiment_4": "test_experiment_4",
2424
}
2525

26+
TEST_EXPERIMENT_POLLERS = [
27+
]
28+
2629
TEST_EXPERIMENTS = {
2730
"windows": {
2831
"dbg": {

src/core/lib/experiments/experiments.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
# Defaults to the empty list.
2727
# If any of the experiments in the required list is determined to
2828
# be disabled at runtime, this experiment is disabled at runtime.
29+
# uses_polling: optional boolean (false if not specified) that indicates that
30+
# this experiment should be tested with all different polling
31+
# engines.
2932
#
3033
# Well known test tags:
3134
# core_end2end_test: all tests, fixtures in the core end2end suite
@@ -68,18 +71,21 @@
6871
expiry: 2024/04/01
6972
7073
test_tags: ["core_end2end_test", "event_engine_client_test"]
74+
uses_polling: true
7175
- name: event_engine_dns
7276
description:
7377
If set, use EventEngine DNSResolver for client channel resolution
7478
expiry: 2024/04/01
7579
7680
test_tags: ["cancel_ares_query_test", "resolver_component_tests_runner_invoker"]
7781
allow_in_fuzzing_config: false
82+
uses_polling: true
7883
- name: event_engine_listener
7984
description: Use EventEngine listeners instead of iomgr's grpc_tcp_server
8085
expiry: 2024/04/01
8186
8287
test_tags: ["core_end2end_test", "event_engine_listener_test"]
88+
uses_polling: true
8389
- name: free_large_allocator
8490
description: If set, return all free bytes from a "big" allocator
8591
expiry: 2024/04/01

tools/codegen/core/experiments_compiler.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ def __init__(self, attributes):
192192
print("Failed to create experiment definition")
193193
return
194194
self._allow_in_fuzzing_config = True
195+
self._uses_polling = False
195196
self._name = attributes["name"]
196197
self._description = attributes["description"]
197198
self._expiry = attributes["expiry"]
@@ -200,6 +201,9 @@ def __init__(self, attributes):
200201
self._test_tags = []
201202
self._requires = set()
202203

204+
if "uses_polling" in attributes:
205+
self._uses_polling = attributes["uses_polling"]
206+
203207
if "allow_in_fuzzing_config" in attributes:
204208
self._allow_in_fuzzing_config = attributes[
205209
"allow_in_fuzzing_config"
@@ -683,6 +687,17 @@ def GenExperimentsBzl(self, mode, output_file):
683687
)
684688
print("}", file=B)
685689

690+
# Generate a list of experiments that use polling.
691+
print(file=B)
692+
if mode == "test":
693+
print("TEST_EXPERIMENT_POLLERS = [", file=B)
694+
else:
695+
print("EXPERIMENT_POLLERS = [", file=B)
696+
for name, exp in self._experiment_definitions.items():
697+
if exp._uses_polling:
698+
print(f' "{name}",', file=B)
699+
print("]", file=B)
700+
686701
print(file=B)
687702
if mode == "test":
688703
print("TEST_EXPERIMENTS = {", file=B)

0 commit comments

Comments
 (0)