The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#) https://grpc.io/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

211 lines
6.8 KiB

# Copyright 2023 gRPC authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Auto generated by tools/codegen/core/gen_experiments.py
"""Dictionary of tags to experiments so we know when to test different experiments."""
EXPERIMENTS = {
"windows": {
"dbg": {
},
"off": {
"core_end2end_test": [
"event_engine_listener",
"promise_based_client_call",
"promise_based_server_call",
],
"cpp_end2end_test": [
"promise_based_server_call",
],
"endpoint_test": [
"tcp_frame_size_tuning",
"tcp_rcv_lowat",
],
"event_engine_listener_test": [
"event_engine_listener",
],
"flow_control_test": [
"peer_state_based_framing",
"tcp_frame_size_tuning",
"tcp_rcv_lowat",
],
"lame_client_test": [
"promise_based_client_call",
],
"logging_test": [
"promise_based_server_call",
],
"resource_quota_test": [
"free_large_allocator",
"memory_pressure_controller",
"unconstrained_max_quota_buffer_size",
],
"xds_end2end_test": [
"promise_based_server_call",
],
},
"on": {
"core_end2end_test": [
"work_stealing",
],
"cpp_lb_end2end_test": [
[client_channel] second attempt: SubchannelWrapper hops into WorkSerializer before destruction (#34321) Original PR was #34307, reverted in #34318 due to internal test failures. The first commit is a revert of the revert. The second commit contains the fix. The original idea here was that `SubchannelWrapper::Orphan()`, which is called when the strong refcount reaches 0, would take a new weak ref and then hop into the `WorkSerializer` before dropping that weak ref, thus ensuring that the `SubchannelWrapper` is destroyed inside the `WorkSerializer` (which is needed because the `SubchannelWrapper` dtor cleans up some state in the channel related to the subchannel). The problem is that `DualRefCounted<>::Unref()` itself actually increments the weak ref count before calling `Orphan()` and then decrements it afterwards. So in the case where the `SubchannelWrapper` is unreffed outside of the `WorkSerializer` and no other thread happens to be holding the `WorkSerializer`, the weak ref that we were taking in `Orphan()` was unreffed inline, which meant that it wasn't actually the last weak ref -- the last weak ref was the one taken by `DualRefCounted<>::Unref()`, and it wasn't released until after the `WorkSerializer` was released. To this this problem, we move the code from the `SubchannelWrapper` dtor that cleans up the channel's state into the `WorkSerializer` callback that is scheduled in `Orphan()`. Thus, regardless of whether or not the last weak ref is released inside of the `WorkSerializer`, we are definitely doing that cleanup inside the `WorkSerializer`, which is what we actually care about. Also adds an experiment to guard this behavior.
1 year ago
"client_channel_subchannel_wrapper_work_serializer_orphan",
"round_robin_delegate_to_pick_first",
],
"flow_control_test": [
"lazier_stream_updates",
],
"lb_unit_test": [
[client_channel] second attempt: SubchannelWrapper hops into WorkSerializer before destruction (#34321) Original PR was #34307, reverted in #34318 due to internal test failures. The first commit is a revert of the revert. The second commit contains the fix. The original idea here was that `SubchannelWrapper::Orphan()`, which is called when the strong refcount reaches 0, would take a new weak ref and then hop into the `WorkSerializer` before dropping that weak ref, thus ensuring that the `SubchannelWrapper` is destroyed inside the `WorkSerializer` (which is needed because the `SubchannelWrapper` dtor cleans up some state in the channel related to the subchannel). The problem is that `DualRefCounted<>::Unref()` itself actually increments the weak ref count before calling `Orphan()` and then decrements it afterwards. So in the case where the `SubchannelWrapper` is unreffed outside of the `WorkSerializer` and no other thread happens to be holding the `WorkSerializer`, the weak ref that we were taking in `Orphan()` was unreffed inline, which meant that it wasn't actually the last weak ref -- the last weak ref was the one taken by `DualRefCounted<>::Unref()`, and it wasn't released until after the `WorkSerializer` was released. To this this problem, we move the code from the `SubchannelWrapper` dtor that cleans up the channel's state into the `WorkSerializer` callback that is scheduled in `Orphan()`. Thus, regardless of whether or not the last weak ref is released inside of the `WorkSerializer`, we are definitely doing that cleanup inside the `WorkSerializer`, which is what we actually care about. Also adds an experiment to guard this behavior.
1 year ago
"client_channel_subchannel_wrapper_work_serializer_orphan",
"round_robin_delegate_to_pick_first",
],
"xds_end2end_test": [
[client_channel] second attempt: SubchannelWrapper hops into WorkSerializer before destruction (#34321) Original PR was #34307, reverted in #34318 due to internal test failures. The first commit is a revert of the revert. The second commit contains the fix. The original idea here was that `SubchannelWrapper::Orphan()`, which is called when the strong refcount reaches 0, would take a new weak ref and then hop into the `WorkSerializer` before dropping that weak ref, thus ensuring that the `SubchannelWrapper` is destroyed inside the `WorkSerializer` (which is needed because the `SubchannelWrapper` dtor cleans up some state in the channel related to the subchannel). The problem is that `DualRefCounted<>::Unref()` itself actually increments the weak ref count before calling `Orphan()` and then decrements it afterwards. So in the case where the `SubchannelWrapper` is unreffed outside of the `WorkSerializer` and no other thread happens to be holding the `WorkSerializer`, the weak ref that we were taking in `Orphan()` was unreffed inline, which meant that it wasn't actually the last weak ref -- the last weak ref was the one taken by `DualRefCounted<>::Unref()`, and it wasn't released until after the `WorkSerializer` was released. To this this problem, we move the code from the `SubchannelWrapper` dtor that cleans up the channel's state into the `WorkSerializer` callback that is scheduled in `Orphan()`. Thus, regardless of whether or not the last weak ref is released inside of the `WorkSerializer`, we are definitely doing that cleanup inside the `WorkSerializer`, which is what we actually care about. Also adds an experiment to guard this behavior.
1 year ago
"client_channel_subchannel_wrapper_work_serializer_orphan",
"round_robin_delegate_to_pick_first",
],
},
},
"ios": {
"dbg": {
},
"off": {
"core_end2end_test": [
"event_engine_listener",
"promise_based_client_call",
"promise_based_server_call",
],
"cpp_end2end_test": [
"promise_based_server_call",
],
"endpoint_test": [
"tcp_frame_size_tuning",
"tcp_rcv_lowat",
],
"event_engine_listener_test": [
"event_engine_listener",
],
"flow_control_test": [
"peer_state_based_framing",
"tcp_frame_size_tuning",
"tcp_rcv_lowat",
],
"lame_client_test": [
"promise_based_client_call",
],
"logging_test": [
"promise_based_server_call",
],
"resource_quota_test": [
"free_large_allocator",
"memory_pressure_controller",
"unconstrained_max_quota_buffer_size",
],
"xds_end2end_test": [
"promise_based_server_call",
],
},
"on": {
"core_end2end_test": [
"work_stealing",
],
"cpp_lb_end2end_test": [
[client_channel] second attempt: SubchannelWrapper hops into WorkSerializer before destruction (#34321) Original PR was #34307, reverted in #34318 due to internal test failures. The first commit is a revert of the revert. The second commit contains the fix. The original idea here was that `SubchannelWrapper::Orphan()`, which is called when the strong refcount reaches 0, would take a new weak ref and then hop into the `WorkSerializer` before dropping that weak ref, thus ensuring that the `SubchannelWrapper` is destroyed inside the `WorkSerializer` (which is needed because the `SubchannelWrapper` dtor cleans up some state in the channel related to the subchannel). The problem is that `DualRefCounted<>::Unref()` itself actually increments the weak ref count before calling `Orphan()` and then decrements it afterwards. So in the case where the `SubchannelWrapper` is unreffed outside of the `WorkSerializer` and no other thread happens to be holding the `WorkSerializer`, the weak ref that we were taking in `Orphan()` was unreffed inline, which meant that it wasn't actually the last weak ref -- the last weak ref was the one taken by `DualRefCounted<>::Unref()`, and it wasn't released until after the `WorkSerializer` was released. To this this problem, we move the code from the `SubchannelWrapper` dtor that cleans up the channel's state into the `WorkSerializer` callback that is scheduled in `Orphan()`. Thus, regardless of whether or not the last weak ref is released inside of the `WorkSerializer`, we are definitely doing that cleanup inside the `WorkSerializer`, which is what we actually care about. Also adds an experiment to guard this behavior.
1 year ago
"client_channel_subchannel_wrapper_work_serializer_orphan",
"round_robin_delegate_to_pick_first",
],
"flow_control_test": [
"lazier_stream_updates",
],
"lb_unit_test": [
[client_channel] second attempt: SubchannelWrapper hops into WorkSerializer before destruction (#34321) Original PR was #34307, reverted in #34318 due to internal test failures. The first commit is a revert of the revert. The second commit contains the fix. The original idea here was that `SubchannelWrapper::Orphan()`, which is called when the strong refcount reaches 0, would take a new weak ref and then hop into the `WorkSerializer` before dropping that weak ref, thus ensuring that the `SubchannelWrapper` is destroyed inside the `WorkSerializer` (which is needed because the `SubchannelWrapper` dtor cleans up some state in the channel related to the subchannel). The problem is that `DualRefCounted<>::Unref()` itself actually increments the weak ref count before calling `Orphan()` and then decrements it afterwards. So in the case where the `SubchannelWrapper` is unreffed outside of the `WorkSerializer` and no other thread happens to be holding the `WorkSerializer`, the weak ref that we were taking in `Orphan()` was unreffed inline, which meant that it wasn't actually the last weak ref -- the last weak ref was the one taken by `DualRefCounted<>::Unref()`, and it wasn't released until after the `WorkSerializer` was released. To this this problem, we move the code from the `SubchannelWrapper` dtor that cleans up the channel's state into the `WorkSerializer` callback that is scheduled in `Orphan()`. Thus, regardless of whether or not the last weak ref is released inside of the `WorkSerializer`, we are definitely doing that cleanup inside the `WorkSerializer`, which is what we actually care about. Also adds an experiment to guard this behavior.
1 year ago
"client_channel_subchannel_wrapper_work_serializer_orphan",
"round_robin_delegate_to_pick_first",
],
"xds_end2end_test": [
[client_channel] second attempt: SubchannelWrapper hops into WorkSerializer before destruction (#34321) Original PR was #34307, reverted in #34318 due to internal test failures. The first commit is a revert of the revert. The second commit contains the fix. The original idea here was that `SubchannelWrapper::Orphan()`, which is called when the strong refcount reaches 0, would take a new weak ref and then hop into the `WorkSerializer` before dropping that weak ref, thus ensuring that the `SubchannelWrapper` is destroyed inside the `WorkSerializer` (which is needed because the `SubchannelWrapper` dtor cleans up some state in the channel related to the subchannel). The problem is that `DualRefCounted<>::Unref()` itself actually increments the weak ref count before calling `Orphan()` and then decrements it afterwards. So in the case where the `SubchannelWrapper` is unreffed outside of the `WorkSerializer` and no other thread happens to be holding the `WorkSerializer`, the weak ref that we were taking in `Orphan()` was unreffed inline, which meant that it wasn't actually the last weak ref -- the last weak ref was the one taken by `DualRefCounted<>::Unref()`, and it wasn't released until after the `WorkSerializer` was released. To this this problem, we move the code from the `SubchannelWrapper` dtor that cleans up the channel's state into the `WorkSerializer` callback that is scheduled in `Orphan()`. Thus, regardless of whether or not the last weak ref is released inside of the `WorkSerializer`, we are definitely doing that cleanup inside the `WorkSerializer`, which is what we actually care about. Also adds an experiment to guard this behavior.
1 year ago
"client_channel_subchannel_wrapper_work_serializer_orphan",
"round_robin_delegate_to_pick_first",
],
},
},
"posix": {
"dbg": {
},
"off": {
"cancel_ares_query_test": [
"event_engine_dns",
],
"core_end2end_test": [
"event_engine_client",
"event_engine_listener",
"promise_based_client_call",
"promise_based_server_call",
],
"cpp_end2end_test": [
"promise_based_server_call",
],
"endpoint_test": [
"tcp_frame_size_tuning",
"tcp_rcv_lowat",
],
"event_engine_client_test": [
"event_engine_client",
],
"event_engine_listener_test": [
"event_engine_listener",
],
"flow_control_test": [
"peer_state_based_framing",
"tcp_frame_size_tuning",
"tcp_rcv_lowat",
],
"lame_client_test": [
"promise_based_client_call",
],
"logging_test": [
"promise_based_server_call",
],
"resolver_component_tests_runner_invoker": [
"event_engine_dns",
],
"resource_quota_test": [
"free_large_allocator",
"memory_pressure_controller",
"unconstrained_max_quota_buffer_size",
],
"xds_end2end_test": [
"promise_based_server_call",
],
},
"on": {
"core_end2end_test": [
"work_stealing",
],
"cpp_lb_end2end_test": [
[client_channel] second attempt: SubchannelWrapper hops into WorkSerializer before destruction (#34321) Original PR was #34307, reverted in #34318 due to internal test failures. The first commit is a revert of the revert. The second commit contains the fix. The original idea here was that `SubchannelWrapper::Orphan()`, which is called when the strong refcount reaches 0, would take a new weak ref and then hop into the `WorkSerializer` before dropping that weak ref, thus ensuring that the `SubchannelWrapper` is destroyed inside the `WorkSerializer` (which is needed because the `SubchannelWrapper` dtor cleans up some state in the channel related to the subchannel). The problem is that `DualRefCounted<>::Unref()` itself actually increments the weak ref count before calling `Orphan()` and then decrements it afterwards. So in the case where the `SubchannelWrapper` is unreffed outside of the `WorkSerializer` and no other thread happens to be holding the `WorkSerializer`, the weak ref that we were taking in `Orphan()` was unreffed inline, which meant that it wasn't actually the last weak ref -- the last weak ref was the one taken by `DualRefCounted<>::Unref()`, and it wasn't released until after the `WorkSerializer` was released. To this this problem, we move the code from the `SubchannelWrapper` dtor that cleans up the channel's state into the `WorkSerializer` callback that is scheduled in `Orphan()`. Thus, regardless of whether or not the last weak ref is released inside of the `WorkSerializer`, we are definitely doing that cleanup inside the `WorkSerializer`, which is what we actually care about. Also adds an experiment to guard this behavior.
1 year ago
"client_channel_subchannel_wrapper_work_serializer_orphan",
"round_robin_delegate_to_pick_first",
],
"flow_control_test": [
"lazier_stream_updates",
],
"lb_unit_test": [
[client_channel] second attempt: SubchannelWrapper hops into WorkSerializer before destruction (#34321) Original PR was #34307, reverted in #34318 due to internal test failures. The first commit is a revert of the revert. The second commit contains the fix. The original idea here was that `SubchannelWrapper::Orphan()`, which is called when the strong refcount reaches 0, would take a new weak ref and then hop into the `WorkSerializer` before dropping that weak ref, thus ensuring that the `SubchannelWrapper` is destroyed inside the `WorkSerializer` (which is needed because the `SubchannelWrapper` dtor cleans up some state in the channel related to the subchannel). The problem is that `DualRefCounted<>::Unref()` itself actually increments the weak ref count before calling `Orphan()` and then decrements it afterwards. So in the case where the `SubchannelWrapper` is unreffed outside of the `WorkSerializer` and no other thread happens to be holding the `WorkSerializer`, the weak ref that we were taking in `Orphan()` was unreffed inline, which meant that it wasn't actually the last weak ref -- the last weak ref was the one taken by `DualRefCounted<>::Unref()`, and it wasn't released until after the `WorkSerializer` was released. To this this problem, we move the code from the `SubchannelWrapper` dtor that cleans up the channel's state into the `WorkSerializer` callback that is scheduled in `Orphan()`. Thus, regardless of whether or not the last weak ref is released inside of the `WorkSerializer`, we are definitely doing that cleanup inside the `WorkSerializer`, which is what we actually care about. Also adds an experiment to guard this behavior.
1 year ago
"client_channel_subchannel_wrapper_work_serializer_orphan",
"round_robin_delegate_to_pick_first",
],
"xds_end2end_test": [
[client_channel] second attempt: SubchannelWrapper hops into WorkSerializer before destruction (#34321) Original PR was #34307, reverted in #34318 due to internal test failures. The first commit is a revert of the revert. The second commit contains the fix. The original idea here was that `SubchannelWrapper::Orphan()`, which is called when the strong refcount reaches 0, would take a new weak ref and then hop into the `WorkSerializer` before dropping that weak ref, thus ensuring that the `SubchannelWrapper` is destroyed inside the `WorkSerializer` (which is needed because the `SubchannelWrapper` dtor cleans up some state in the channel related to the subchannel). The problem is that `DualRefCounted<>::Unref()` itself actually increments the weak ref count before calling `Orphan()` and then decrements it afterwards. So in the case where the `SubchannelWrapper` is unreffed outside of the `WorkSerializer` and no other thread happens to be holding the `WorkSerializer`, the weak ref that we were taking in `Orphan()` was unreffed inline, which meant that it wasn't actually the last weak ref -- the last weak ref was the one taken by `DualRefCounted<>::Unref()`, and it wasn't released until after the `WorkSerializer` was released. To this this problem, we move the code from the `SubchannelWrapper` dtor that cleans up the channel's state into the `WorkSerializer` callback that is scheduled in `Orphan()`. Thus, regardless of whether or not the last weak ref is released inside of the `WorkSerializer`, we are definitely doing that cleanup inside the `WorkSerializer`, which is what we actually care about. Also adds an experiment to guard this behavior.
1 year ago
"client_channel_subchannel_wrapper_work_serializer_orphan",
"round_robin_delegate_to_pick_first",
],
},
},
}