grpc 1.50.0.pre1 → 1.52.0.pre2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +206 -49
- data/include/grpc/byte_buffer.h +76 -1
- data/include/grpc/byte_buffer_reader.h +19 -1
- data/include/grpc/compression.h +2 -2
- data/include/grpc/event_engine/event_engine.h +27 -6
- data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -1
- data/include/grpc/event_engine/internal/slice_cast.h +67 -0
- data/include/grpc/event_engine/memory_allocator.h +1 -1
- data/include/grpc/event_engine/slice.h +24 -4
- data/include/grpc/event_engine/slice_buffer.h +31 -2
- data/include/grpc/fork.h +25 -1
- data/include/grpc/grpc.h +3 -13
- data/include/grpc/grpc_posix.h +1 -1
- data/include/grpc/impl/codegen/atm.h +3 -71
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +3 -58
- data/include/grpc/impl/codegen/atm_gcc_sync.h +3 -59
- data/include/grpc/impl/codegen/atm_windows.h +3 -106
- data/include/grpc/impl/codegen/byte_buffer.h +4 -78
- data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -19
- data/include/grpc/impl/codegen/compression_types.h +3 -82
- data/include/grpc/impl/codegen/connectivity_state.h +3 -20
- data/include/grpc/impl/codegen/fork.h +4 -25
- data/include/grpc/impl/codegen/gpr_types.h +2 -34
- data/include/grpc/impl/codegen/grpc_types.h +3 -791
- data/include/grpc/impl/codegen/log.h +3 -86
- data/include/grpc/impl/codegen/port_platform.h +3 -758
- data/include/grpc/impl/codegen/propagation_bits.h +3 -28
- data/include/grpc/impl/codegen/slice.h +3 -106
- data/include/grpc/impl/codegen/status.h +4 -131
- data/include/grpc/impl/codegen/sync.h +3 -42
- data/include/grpc/impl/codegen/sync_abseil.h +3 -12
- data/include/grpc/impl/codegen/sync_custom.h +3 -14
- data/include/grpc/impl/codegen/sync_generic.h +3 -25
- data/include/grpc/impl/codegen/sync_posix.h +3 -28
- data/include/grpc/impl/codegen/sync_windows.h +3 -16
- data/include/grpc/impl/compression_types.h +109 -0
- data/include/grpc/impl/connectivity_state.h +47 -0
- data/include/grpc/impl/grpc_types.h +824 -0
- data/include/grpc/impl/propagation_bits.h +54 -0
- data/include/grpc/impl/slice_type.h +112 -0
- data/include/grpc/load_reporting.h +1 -1
- data/include/grpc/module.modulemap +5 -1
- data/include/grpc/slice.h +1 -1
- data/include/grpc/status.h +131 -1
- data/include/grpc/support/atm.h +70 -1
- data/include/grpc/support/atm_gcc_atomic.h +59 -1
- data/include/grpc/support/atm_gcc_sync.h +58 -1
- data/include/grpc/support/atm_windows.h +105 -1
- data/include/grpc/support/log.h +87 -1
- data/include/grpc/support/log_windows.h +1 -1
- data/include/grpc/support/port_platform.h +767 -1
- data/include/grpc/support/string_util.h +1 -1
- data/include/grpc/support/sync.h +35 -2
- data/include/grpc/support/sync_abseil.h +11 -1
- data/include/grpc/support/sync_custom.h +13 -1
- data/include/grpc/support/sync_generic.h +24 -1
- data/include/grpc/support/sync_posix.h +27 -1
- data/include/grpc/support/sync_windows.h +15 -1
- data/include/grpc/support/time.h +25 -2
- data/src/core/ext/filters/census/grpc_context.cc +17 -18
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +28 -22
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +2 -1
- data/src/core/ext/filters/channel_idle/idle_filter_state.h +1 -1
- data/src/core/ext/filters/client_channel/backend_metric.cc +2 -0
- data/src/core/ext/filters/client_channel/backup_poller.cc +24 -24
- data/src/core/ext/filters/client_channel/backup_poller.h +21 -21
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +51 -28
- data/src/core/ext/filters/client_channel/client_channel.cc +157 -168
- data/src/core/ext/filters/client_channel/client_channel.h +10 -10
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +17 -19
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +19 -19
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +17 -17
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +18 -18
- data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
- data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
- data/src/core/ext/filters/client_channel/config_selector.h +16 -20
- data/src/core/ext/filters/client_channel/connector.h +1 -1
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +28 -55
- data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +18 -18
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +4 -5
- data/src/core/ext/filters/client_channel/http_proxy.cc +39 -40
- data/src/core/ext/filters/client_channel/http_proxy.h +18 -18
- data/src/core/ext/filters/client_channel/lb_call_state_internal.h +39 -0
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
- data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +17 -17
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +7 -2
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +59 -130
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +37 -21
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +131 -154
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +24 -25
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +2 -4
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +18 -20
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +18 -19
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +18 -19
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +18 -19
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +8 -9
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +212 -223
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +11 -22
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +73 -101
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +20 -21
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +119 -106
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +12 -12
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +30 -16
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +60 -56
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +60 -64
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +22 -28
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +62 -94
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +70 -146
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +651 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +60 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +18 -18
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -10
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +26 -35
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +40 -41
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +22 -23
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +82 -82
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +117 -118
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +51 -52
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +18 -18
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +18 -18
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +18 -19
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +3 -5
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -27
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +44 -34
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -10
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +122 -119
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +1 -1
- data/src/core/ext/filters/client_channel/retry_filter.cc +81 -103
- data/src/core/ext/filters/client_channel/retry_service_config.cc +193 -235
- data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
- data/src/core/ext/filters/client_channel/retry_throttle.cc +27 -29
- data/src/core/ext/filters/client_channel/retry_throttle.h +26 -25
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +3 -3
- data/src/core/ext/filters/client_channel/subchannel.cc +158 -178
- data/src/core/ext/filters/client_channel/subchannel.h +17 -40
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +18 -18
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
- data/src/core/ext/filters/deadline/deadline_filter.cc +34 -17
- data/src/core/ext/filters/deadline/deadline_filter.h +1 -1
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +3 -2
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
- data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
- data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
- data/src/core/ext/filters/http/client/http_client_filter.cc +36 -37
- data/src/core/ext/filters/http/client/http_client_filter.h +17 -17
- data/src/core/ext/filters/http/client_authority_filter.cc +19 -19
- data/src/core/ext/filters/http/client_authority_filter.h +18 -18
- data/src/core/ext/filters/http/http_filters_plugin.cc +35 -51
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +315 -0
- data/src/core/ext/filters/http/message_compress/compression_filter.h +132 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +44 -43
- data/src/core/ext/filters/http/server/http_server_filter.h +18 -18
- data/src/core/ext/filters/message_size/message_size_filter.cc +92 -123
- data/src/core/ext/filters/message_size/message_size_filter.h +23 -16
- data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +6 -8
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +7 -9
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +229 -0
- data/src/core/ext/filters/stateful_session/stateful_session_filter.h +66 -0
- data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +82 -0
- data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +93 -0
- data/src/core/ext/transport/chttp2/alpn/alpn.cc +18 -18
- data/src/core/ext/transport/chttp2/alpn/alpn.h +22 -22
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +69 -63
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +28 -22
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +81 -97
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +18 -18
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +22 -22
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +30 -30
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +29 -29
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +27 -27
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +273 -283
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +18 -19
- data/src/core/ext/transport/chttp2/transport/context_list.cc +19 -19
- data/src/core/ext/transport/chttp2/transport/context_list.h +25 -25
- data/src/core/ext/transport/chttp2/transport/decode_huff.cc +0 -36
- data/src/core/ext/transport/chttp2/transport/decode_huff.h +35 -82
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +112 -44
- data/src/core/ext/transport/chttp2/transport/flow_control.h +60 -34
- data/src/core/ext/transport/chttp2/transport/frame.h +19 -19
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -32
- data/src/core/ext/transport/chttp2/transport/frame_data.h +23 -23
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +36 -36
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +18 -18
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +25 -24
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +19 -19
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +28 -25
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +18 -18
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +34 -36
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +20 -20
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +22 -21
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +18 -18
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +133 -181
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +40 -59
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +93 -143
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +20 -20
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +26 -26
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +18 -18
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +21 -19
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +36 -34
- data/src/core/ext/transport/chttp2/transport/http_trace.cc +19 -0
- data/src/core/ext/transport/chttp2/transport/http_trace.h +24 -0
- data/src/core/ext/transport/chttp2/transport/huffsyms.cc +20 -20
- data/src/core/ext/transport/chttp2/transport/huffsyms.h +19 -19
- data/src/core/ext/transport/chttp2/transport/internal.h +193 -170
- data/src/core/ext/transport/chttp2/transport/parsing.cc +147 -80
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +19 -19
- data/src/core/ext/transport/chttp2/transport/stream_map.cc +23 -23
- data/src/core/ext/transport/chttp2/transport/stream_map.h +31 -31
- data/src/core/ext/transport/chttp2/transport/varint.cc +19 -20
- data/src/core/ext/transport/chttp2/transport/varint.h +35 -32
- data/src/core/ext/transport/chttp2/transport/writing.cc +60 -56
- data/src/core/ext/transport/inproc/inproc_plugin.cc +17 -17
- data/src/core/ext/transport/inproc/inproc_transport.cc +122 -140
- data/src/core/ext/transport/inproc/inproc_transport.h +19 -19
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c +62 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +179 -0
- data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c +46 -0
- data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h +98 -0
- data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.c +47 -0
- data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.h +107 -0
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +3 -2
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +9 -0
- data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +0 -1
- data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.c +46 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.h +98 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.c +62 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.h +174 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.c +36 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.h +74 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.c +65 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.h +191 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.c +127 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.h +474 -0
- data/src/core/ext/upb-generated/xds/type/v3/cel.upb.c +67 -0
- data/src/core/ext/upb-generated/xds/type/v3/cel.upb.h +214 -0
- data/src/core/ext/upb-generated/xds/type/v3/range.upb.c +64 -0
- data/src/core/ext/upb-generated/xds/type/v3/range.upb.h +208 -0
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +0 -1
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +60 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c +50 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.c +45 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.c +43 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.c +51 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.c +36 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.c +55 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +9 -9
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.c +71 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.h +60 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.c +60 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.c +36 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +4 -7
- data/src/core/ext/xds/certificate_provider_store.cc +4 -4
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
- data/src/core/ext/xds/xds_api.cc +20 -95
- data/src/core/ext/xds/xds_api.h +5 -8
- data/src/core/ext/xds/xds_bootstrap.h +0 -1
- data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
- data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
- data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
- data/src/core/ext/xds/xds_certificate_provider.h +1 -1
- data/src/core/ext/xds/xds_channel_args.h +1 -1
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
- data/src/core/ext/xds/xds_channel_stack_modifier.h +2 -2
- data/src/core/ext/xds/xds_client.cc +134 -94
- data/src/core/ext/xds/xds_client.h +13 -5
- data/src/core/ext/xds/xds_client_grpc.cc +31 -24
- data/src/core/ext/xds/xds_client_grpc.h +1 -1
- data/src/core/ext/xds/xds_client_stats.cc +17 -17
- data/src/core/ext/xds/xds_client_stats.h +18 -18
- data/src/core/ext/xds/xds_cluster.cc +359 -203
- data/src/core/ext/xds/xds_cluster.h +52 -35
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +54 -71
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +45 -21
- data/src/core/ext/xds/xds_common_types.cc +209 -141
- data/src/core/ext/xds/xds_common_types.h +19 -13
- data/src/core/ext/xds/xds_endpoint.cc +221 -130
- data/src/core/ext/xds/xds_endpoint.h +4 -7
- data/src/core/ext/xds/xds_health_status.cc +80 -0
- data/src/core/ext/xds/xds_health_status.h +82 -0
- data/src/core/ext/xds/xds_http_fault_filter.cc +57 -43
- data/src/core/ext/xds/xds_http_fault_filter.h +14 -22
- data/src/core/ext/xds/xds_http_filters.cc +65 -73
- data/src/core/ext/xds/xds_http_filters.h +68 -20
- data/src/core/ext/xds/xds_http_rbac_filter.cc +153 -207
- data/src/core/ext/xds/xds_http_rbac_filter.h +13 -16
- data/src/core/ext/xds/xds_http_stateful_session_filter.cc +218 -0
- data/src/core/ext/xds/xds_http_stateful_session_filter.h +58 -0
- data/src/core/ext/xds/xds_lb_policy_registry.cc +120 -171
- data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
- data/src/core/ext/xds/xds_listener.cc +447 -419
- data/src/core/ext/xds/xds_listener.h +45 -47
- data/src/core/ext/xds/xds_resource_type.h +3 -11
- data/src/core/ext/xds/xds_resource_type_impl.h +10 -13
- data/src/core/ext/xds/xds_route_config.cc +514 -528
- data/src/core/ext/xds/xds_route_config.h +39 -28
- data/src/core/ext/xds/xds_routing.cc +2 -1
- data/src/core/ext/xds/xds_routing.h +2 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -106
- data/src/core/ext/xds/xds_transport_grpc.cc +6 -7
- data/src/core/ext/xds/xds_transport_grpc.h +1 -1
- data/src/core/lib/address_utils/parse_address.cc +30 -29
- data/src/core/lib/address_utils/parse_address.h +32 -32
- data/src/core/lib/address_utils/sockaddr_utils.cc +29 -28
- data/src/core/lib/address_utils/sockaddr_utils.h +33 -33
- data/src/core/lib/avl/avl.h +4 -4
- data/src/core/lib/backoff/backoff.cc +17 -17
- data/src/core/lib/backoff/backoff.h +18 -18
- data/src/core/lib/channel/call_tracer.h +10 -1
- data/src/core/lib/channel/channel_args.cc +19 -20
- data/src/core/lib/channel/channel_args.h +59 -43
- data/src/core/lib/channel/channel_args_preconditioning.h +1 -1
- data/src/core/lib/channel/channel_stack.cc +62 -58
- data/src/core/lib/channel/channel_stack.h +144 -131
- data/src/core/lib/channel/channel_stack_builder.cc +21 -24
- data/src/core/lib/channel/channel_stack_builder.h +14 -6
- data/src/core/lib/channel/channel_stack_builder_impl.cc +43 -25
- data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
- data/src/core/lib/channel/channel_trace.cc +21 -22
- data/src/core/lib/channel/channel_trace.h +19 -19
- data/src/core/lib/channel/channelz.cc +18 -19
- data/src/core/lib/channel/channelz.h +26 -26
- data/src/core/lib/channel/channelz_registry.cc +17 -17
- data/src/core/lib/channel/channelz_registry.h +18 -18
- data/src/core/lib/channel/connected_channel.cc +732 -63
- data/src/core/lib/channel/connected_channel.h +18 -22
- data/src/core/lib/channel/context.h +18 -18
- data/src/core/lib/channel/promise_based_filter.cc +1137 -150
- data/src/core/lib/channel/promise_based_filter.h +374 -88
- data/src/core/lib/channel/status_util.cc +35 -17
- data/src/core/lib/channel/status_util.h +26 -19
- data/src/core/lib/compression/compression.cc +19 -19
- data/src/core/lib/compression/compression_internal.cc +41 -48
- data/src/core/lib/compression/compression_internal.h +22 -22
- data/src/core/lib/compression/message_compress.cc +26 -26
- data/src/core/lib/compression/message_compress.h +25 -25
- data/src/core/lib/config/core_configuration.h +1 -1
- data/src/core/lib/debug/event_log.cc +88 -0
- data/src/core/lib/debug/event_log.h +81 -0
- data/src/core/lib/debug/histogram_view.cc +69 -0
- data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
- data/src/core/lib/debug/stats.cc +39 -136
- data/src/core/lib/debug/stats.h +46 -52
- data/src/core/lib/debug/stats_data.cc +224 -73
- data/src/core/lib/debug/stats_data.h +263 -122
- data/src/core/lib/debug/trace.cc +18 -18
- data/src/core/lib/debug/trace.h +19 -19
- data/src/core/lib/event_engine/common_closures.h +71 -0
- data/src/core/lib/event_engine/default_event_engine.cc +38 -15
- data/src/core/lib/event_engine/default_event_engine.h +15 -3
- data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
- data/src/core/lib/event_engine/executor/executor.h +1 -1
- data/src/core/lib/event_engine/forkable.h +1 -1
- data/src/core/lib/event_engine/memory_allocator.cc +1 -1
- data/src/core/lib/event_engine/poller.h +10 -4
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +614 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +900 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
- data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
- data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +11 -14
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
- data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +265 -0
- data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1308 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +684 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +456 -28
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
- data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +236 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +228 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +380 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +91 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +853 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +316 -0
- data/src/core/lib/event_engine/posix_engine/timer.cc +49 -49
- data/src/core/lib/event_engine/posix_engine/timer.h +87 -86
- data/src/core/lib/event_engine/posix_engine/timer_heap.cc +27 -27
- data/src/core/lib/event_engine/posix_engine/timer_heap.h +21 -21
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +76 -214
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +41 -69
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +332 -0
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +185 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +127 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +150 -0
- data/src/core/lib/event_engine/{executor/threaded_executor.h → posix_engine/wakeup_fd_pipe.h} +16 -15
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
- data/src/core/lib/event_engine/slice.cc +7 -6
- data/src/core/lib/event_engine/slice_buffer.cc +2 -2
- data/src/core/lib/event_engine/socket_notifier.h +1 -1
- data/src/core/lib/event_engine/tcp_socket_utils.cc +373 -0
- data/src/core/lib/event_engine/tcp_socket_utils.h +85 -0
- data/src/core/lib/event_engine/thread_pool.cc +125 -43
- data/src/core/lib/event_engine/thread_pool.h +49 -26
- data/src/core/lib/event_engine/time_util.h +1 -1
- data/src/core/lib/event_engine/windows/iocp.cc +13 -12
- data/src/core/lib/event_engine/windows/iocp.h +1 -1
- data/src/core/lib/event_engine/windows/win_socket.cc +9 -9
- data/src/core/lib/event_engine/windows/windows_engine.cc +26 -20
- data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
- data/src/core/lib/experiments/config.cc +1 -1
- data/src/core/lib/experiments/experiments.cc +13 -13
- data/src/core/lib/experiments/experiments.h +8 -6
- data/src/core/lib/gpr/alloc.cc +19 -17
- data/src/core/lib/gpr/alloc.h +18 -18
- data/src/core/lib/gpr/atm.cc +17 -17
- data/src/core/lib/gpr/cpu_iphone.cc +24 -24
- data/src/core/lib/gpr/cpu_linux.cc +28 -23
- data/src/core/lib/gpr/cpu_posix.cc +23 -22
- data/src/core/lib/gpr/cpu_windows.cc +20 -18
- data/src/core/lib/gpr/log.cc +27 -19
- data/src/core/lib/gpr/log_android.cc +22 -20
- data/src/core/lib/gpr/log_linux.cc +24 -24
- data/src/core/lib/gpr/log_posix.cc +20 -19
- data/src/core/lib/gpr/log_windows.cc +25 -24
- data/src/core/lib/gpr/spinlock.h +18 -18
- data/src/core/lib/gpr/string.cc +25 -24
- data/src/core/lib/gpr/string.h +58 -58
- data/src/core/lib/gpr/string_posix.cc +24 -24
- data/src/core/lib/gpr/string_util_windows.cc +22 -22
- data/src/core/lib/gpr/string_windows.cc +24 -24
- data/src/core/lib/gpr/sync.cc +25 -25
- data/src/core/lib/gpr/sync_abseil.cc +22 -20
- data/src/core/lib/gpr/sync_posix.cc +23 -21
- data/src/core/lib/gpr/sync_windows.cc +29 -27
- data/src/core/lib/gpr/time.cc +23 -21
- data/src/core/lib/gpr/time_posix.cc +35 -30
- data/src/core/lib/gpr/time_precise.cc +22 -22
- data/src/core/lib/gpr/time_precise.h +18 -19
- data/src/core/lib/gpr/time_windows.cc +25 -22
- data/src/core/lib/gpr/tmpfile.h +22 -22
- data/src/core/lib/gpr/tmpfile_msys.cc +21 -20
- data/src/core/lib/gpr/tmpfile_posix.cc +22 -20
- data/src/core/lib/gpr/tmpfile_windows.cc +23 -22
- data/src/core/lib/gpr/useful.h +40 -27
- data/src/core/lib/gpr/wrap_memcpy.cc +23 -23
- data/src/core/lib/gprpp/atomic_utils.h +18 -18
- data/src/core/lib/gprpp/bitset.h +24 -0
- data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/crash.cc} +12 -12
- data/src/core/lib/gprpp/crash.h +34 -0
- data/src/core/lib/gprpp/debug_location.h +18 -18
- data/src/core/lib/gprpp/dual_ref_counted.h +1 -1
- data/src/core/lib/gprpp/env.h +20 -20
- data/src/core/lib/gprpp/env_linux.cc +21 -21
- data/src/core/lib/gprpp/env_posix.cc +18 -18
- data/src/core/lib/gprpp/env_windows.cc +18 -18
- data/src/core/lib/gprpp/examine_stack.cc +17 -17
- data/src/core/lib/gprpp/examine_stack.h +18 -18
- data/src/core/lib/gprpp/fork.cc +21 -22
- data/src/core/lib/gprpp/fork.h +22 -22
- data/src/core/lib/gprpp/global_config.h +18 -18
- data/src/core/lib/gprpp/global_config_custom.h +18 -18
- data/src/core/lib/gprpp/global_config_env.cc +17 -17
- data/src/core/lib/gprpp/global_config_env.h +23 -23
- data/src/core/lib/gprpp/global_config_generic.h +18 -18
- data/src/core/lib/gprpp/host_port.cc +26 -26
- data/src/core/lib/gprpp/host_port.h +29 -28
- data/src/core/lib/gprpp/load_file.cc +75 -0
- data/src/core/lib/gprpp/load_file.h +33 -0
- data/src/core/lib/gprpp/manual_constructor.h +18 -17
- data/src/core/lib/gprpp/memory.h +18 -18
- data/src/core/lib/gprpp/mpscq.cc +17 -17
- data/src/core/lib/gprpp/mpscq.h +18 -18
- data/src/core/lib/gprpp/no_destruct.h +1 -0
- data/src/core/lib/gprpp/orphanable.h +18 -18
- data/src/core/lib/gprpp/per_cpu.h +46 -0
- data/src/core/lib/gprpp/ref_counted.h +18 -18
- data/src/core/lib/gprpp/ref_counted_ptr.h +19 -18
- data/src/core/lib/gprpp/stat_posix.cc +5 -4
- data/src/core/lib/gprpp/stat_windows.cc +4 -2
- data/src/core/lib/gprpp/status_helper.cc +4 -3
- data/src/core/lib/gprpp/status_helper.h +1 -3
- data/src/core/lib/gprpp/strerror.cc +41 -0
- data/src/core/lib/gprpp/strerror.h +29 -0
- data/src/core/lib/gprpp/sync.h +20 -20
- data/src/core/lib/gprpp/table.h +1 -0
- data/src/core/lib/gprpp/thd.h +19 -19
- data/src/core/lib/gprpp/thd_posix.cc +30 -31
- data/src/core/lib/gprpp/thd_windows.cc +26 -26
- data/src/core/lib/gprpp/time.cc +16 -11
- data/src/core/lib/gprpp/time.h +13 -3
- data/src/core/lib/gprpp/time_averaged_stats.cc +20 -20
- data/src/core/lib/gprpp/time_averaged_stats.h +48 -48
- data/src/core/lib/gprpp/time_util.h +1 -1
- data/src/core/lib/gprpp/unique_type_name.h +18 -18
- data/src/core/lib/gprpp/validation_errors.h +18 -1
- data/src/core/lib/handshaker/proxy_mapper.h +18 -18
- data/src/core/lib/handshaker/proxy_mapper_registry.cc +17 -17
- data/src/core/lib/handshaker/proxy_mapper_registry.h +18 -18
- data/src/core/lib/http/format_request.cc +18 -18
- data/src/core/lib/http/format_request.h +18 -18
- data/src/core/lib/http/httpcli.cc +57 -61
- data/src/core/lib/http/httpcli.h +26 -26
- data/src/core/lib/http/httpcli_security_connector.cc +22 -25
- data/src/core/lib/http/parser.cc +76 -87
- data/src/core/lib/http/parser.h +32 -32
- data/src/core/lib/iomgr/block_annotate.h +21 -21
- data/src/core/lib/iomgr/buffer_list.cc +156 -136
- data/src/core/lib/iomgr/buffer_list.h +120 -98
- data/src/core/lib/iomgr/call_combiner.cc +29 -27
- data/src/core/lib/iomgr/call_combiner.h +21 -22
- data/src/core/lib/iomgr/cfstream_handle.cc +33 -36
- data/src/core/lib/iomgr/cfstream_handle.h +22 -22
- data/src/core/lib/iomgr/closure.h +90 -45
- data/src/core/lib/iomgr/combiner.cc +20 -19
- data/src/core/lib/iomgr/combiner.h +18 -18
- data/src/core/lib/iomgr/dualstack_socket_posix.cc +21 -21
- data/src/core/lib/iomgr/dynamic_annotations.h +20 -20
- data/src/core/lib/iomgr/endpoint.cc +17 -17
- data/src/core/lib/iomgr/endpoint.h +46 -46
- data/src/core/lib/iomgr/endpoint_cfstream.cc +44 -43
- data/src/core/lib/iomgr/endpoint_cfstream.h +27 -27
- data/src/core/lib/iomgr/endpoint_pair.h +18 -18
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +20 -19
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +18 -17
- data/src/core/lib/iomgr/error.cc +49 -61
- data/src/core/lib/iomgr/error.h +42 -173
- data/src/core/lib/iomgr/error_cfstream.cc +18 -18
- data/src/core/lib/iomgr/error_cfstream.h +19 -19
- data/src/core/lib/iomgr/ev_apple.cc +21 -21
- data/src/core/lib/iomgr/ev_apple.h +17 -17
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +208 -195
- data/src/core/lib/iomgr/ev_epoll1_linux.h +18 -18
- data/src/core/lib/iomgr/ev_poll_posix.cc +212 -205
- data/src/core/lib/iomgr/ev_poll_posix.h +18 -18
- data/src/core/lib/iomgr/ev_posix.cc +36 -28
- data/src/core/lib/iomgr/ev_posix.h +85 -81
- data/src/core/lib/iomgr/ev_windows.cc +18 -18
- data/src/core/lib/iomgr/exec_ctx.cc +34 -34
- data/src/core/lib/iomgr/exec_ctx.h +141 -141
- data/src/core/lib/iomgr/executor.cc +21 -21
- data/src/core/lib/iomgr/executor.h +24 -24
- data/src/core/lib/iomgr/fork_posix.cc +24 -22
- data/src/core/lib/iomgr/fork_windows.cc +21 -21
- data/src/core/lib/iomgr/gethostname.h +18 -18
- data/src/core/lib/iomgr/gethostname_fallback.cc +17 -17
- data/src/core/lib/iomgr/gethostname_host_name_max.cc +17 -17
- data/src/core/lib/iomgr/gethostname_sysconf.cc +17 -17
- data/src/core/lib/iomgr/grpc_if_nametoindex.h +20 -20
- data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +20 -19
- data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +20 -19
- data/src/core/lib/iomgr/internal_errqueue.cc +4 -2
- data/src/core/lib/iomgr/internal_errqueue.h +80 -80
- data/src/core/lib/iomgr/iocp_windows.cc +22 -21
- data/src/core/lib/iomgr/iocp_windows.h +18 -18
- data/src/core/lib/iomgr/iomgr.cc +19 -18
- data/src/core/lib/iomgr/iomgr.h +32 -32
- data/src/core/lib/iomgr/iomgr_internal.cc +17 -17
- data/src/core/lib/iomgr/iomgr_internal.h +25 -25
- data/src/core/lib/iomgr/iomgr_posix.cc +20 -20
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +20 -19
- data/src/core/lib/iomgr/iomgr_windows.cc +24 -22
- data/src/core/lib/iomgr/load_file.cc +24 -27
- data/src/core/lib/iomgr/load_file.h +20 -20
- data/src/core/lib/iomgr/lockfree_event.cc +114 -114
- data/src/core/lib/iomgr/lockfree_event.h +19 -19
- data/src/core/lib/iomgr/nameser.h +84 -84
- data/src/core/lib/iomgr/polling_entity.cc +25 -21
- data/src/core/lib/iomgr/polling_entity.h +27 -27
- data/src/core/lib/iomgr/pollset.cc +17 -17
- data/src/core/lib/iomgr/pollset.h +51 -51
- data/src/core/lib/iomgr/pollset_set.cc +17 -17
- data/src/core/lib/iomgr/pollset_set.h +22 -22
- data/src/core/lib/iomgr/pollset_set_windows.cc +18 -18
- data/src/core/lib/iomgr/pollset_set_windows.h +18 -18
- data/src/core/lib/iomgr/pollset_windows.cc +30 -29
- data/src/core/lib/iomgr/pollset_windows.h +22 -22
- data/src/core/lib/iomgr/port.h +29 -29
- data/src/core/lib/iomgr/python_util.h +20 -20
- data/src/core/lib/iomgr/resolve_address.cc +26 -20
- data/src/core/lib/iomgr/resolve_address.h +21 -22
- data/src/core/lib/iomgr/resolve_address_impl.h +2 -2
- data/src/core/lib/iomgr/resolve_address_posix.cc +35 -45
- data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
- data/src/core/lib/iomgr/resolve_address_windows.cc +18 -20
- data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
- data/src/core/lib/iomgr/resolved_address.h +1 -1
- data/src/core/lib/iomgr/sockaddr.h +21 -21
- data/src/core/lib/iomgr/sockaddr_posix.h +18 -18
- data/src/core/lib/iomgr/sockaddr_utils_posix.cc +18 -17
- data/src/core/lib/iomgr/sockaddr_windows.h +18 -18
- data/src/core/lib/iomgr/socket_factory_posix.cc +18 -18
- data/src/core/lib/iomgr/socket_factory_posix.h +30 -30
- data/src/core/lib/iomgr/socket_mutator.cc +19 -18
- data/src/core/lib/iomgr/socket_mutator.h +37 -37
- data/src/core/lib/iomgr/socket_utils.h +24 -24
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +68 -66
- data/src/core/lib/iomgr/socket_utils_linux.cc +18 -17
- data/src/core/lib/iomgr/socket_utils_posix.cc +22 -20
- data/src/core/lib/iomgr/socket_utils_posix.h +78 -78
- data/src/core/lib/iomgr/socket_utils_windows.cc +20 -19
- data/src/core/lib/iomgr/socket_windows.cc +37 -36
- data/src/core/lib/iomgr/socket_windows.h +56 -56
- data/src/core/lib/iomgr/systemd_utils.cc +116 -0
- data/src/core/lib/{slice/slice_buffer_api.cc → iomgr/systemd_utils.h} +12 -14
- data/src/core/lib/iomgr/tcp_client.cc +17 -17
- data/src/core/lib/iomgr/tcp_client.h +26 -26
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +25 -28
- data/src/core/lib/iomgr/tcp_client_posix.cc +70 -73
- data/src/core/lib/iomgr/tcp_client_posix.h +43 -43
- data/src/core/lib/iomgr/tcp_client_windows.cc +36 -39
- data/src/core/lib/iomgr/tcp_posix.cc +223 -237
- data/src/core/lib/iomgr/tcp_posix.h +27 -27
- data/src/core/lib/iomgr/tcp_server.cc +30 -22
- data/src/core/lib/iomgr/tcp_server.h +68 -62
- data/src/core/lib/iomgr/tcp_server_posix.cc +124 -94
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +54 -51
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +90 -55
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +40 -40
- data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +19 -19
- data/src/core/lib/iomgr/tcp_server_windows.cc +97 -104
- data/src/core/lib/iomgr/tcp_windows.cc +109 -93
- data/src/core/lib/iomgr/tcp_windows.h +29 -29
- data/src/core/lib/iomgr/timer.cc +17 -17
- data/src/core/lib/iomgr/timer.h +65 -65
- data/src/core/lib/iomgr/timer_generic.cc +115 -122
- data/src/core/lib/iomgr/timer_generic.h +19 -19
- data/src/core/lib/iomgr/timer_heap.cc +25 -25
- data/src/core/lib/iomgr/timer_heap.h +19 -19
- data/src/core/lib/iomgr/timer_manager.cc +30 -29
- data/src/core/lib/iomgr/timer_manager.h +25 -25
- data/src/core/lib/iomgr/unix_sockets_posix.cc +20 -21
- data/src/core/lib/iomgr/unix_sockets_posix.h +18 -18
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +19 -17
- data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +23 -21
- data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +23 -23
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +29 -26
- data/src/core/lib/iomgr/wakeup_fd_pipe.h +18 -18
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +18 -18
- data/src/core/lib/iomgr/wakeup_fd_posix.h +50 -50
- data/src/core/lib/json/json_channel_args.h +42 -0
- data/src/core/lib/json/json_object_loader.cc +17 -2
- data/src/core/lib/json/json_object_loader.h +37 -1
- data/src/core/lib/json/json_reader.cc +28 -28
- data/src/core/lib/json/json_util.cc +5 -5
- data/src/core/lib/json/json_util.h +4 -4
- data/src/core/lib/json/json_writer.cc +56 -56
- data/src/core/lib/load_balancing/lb_policy.cc +18 -18
- data/src/core/lib/load_balancing/lb_policy.h +7 -4
- data/src/core/lib/load_balancing/subchannel_interface.h +1 -8
- data/src/core/lib/matchers/matchers.cc +6 -5
- data/src/core/lib/matchers/matchers.h +1 -1
- data/src/core/lib/promise/activity.cc +16 -2
- data/src/core/lib/promise/activity.h +58 -27
- data/src/core/lib/promise/arena_promise.h +82 -52
- data/src/core/lib/promise/context.h +14 -6
- data/src/core/lib/promise/detail/basic_seq.h +9 -28
- data/src/core/lib/promise/detail/promise_factory.h +59 -10
- data/src/core/lib/promise/detail/status.h +28 -0
- data/src/core/lib/promise/detail/switch.h +1455 -0
- data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +20 -12
- data/src/core/lib/promise/for_each.h +155 -0
- data/src/core/lib/promise/latch.h +13 -19
- data/src/core/lib/promise/loop.h +7 -5
- data/src/core/lib/promise/map.h +1 -0
- data/src/core/lib/promise/map_pipe.h +88 -0
- data/src/core/lib/promise/pipe.cc +19 -0
- data/src/core/lib/promise/pipe.h +505 -0
- data/src/core/lib/promise/poll.h +19 -0
- data/src/core/lib/promise/seq.h +4 -5
- data/src/core/lib/promise/sleep.cc +5 -4
- data/src/core/lib/promise/sleep.h +1 -2
- data/src/core/lib/promise/try_concurrently.h +342 -0
- data/src/core/lib/promise/try_seq.h +11 -13
- data/src/core/lib/resolver/resolver.cc +17 -17
- data/src/core/lib/resolver/server_address.cc +18 -17
- data/src/core/lib/resolver/server_address.h +19 -21
- data/src/core/lib/resource_quota/api.cc +0 -1
- data/src/core/lib/resource_quota/api.h +1 -1
- data/src/core/lib/resource_quota/arena.cc +36 -17
- data/src/core/lib/resource_quota/arena.h +107 -18
- data/src/core/lib/resource_quota/memory_quota.cc +140 -43
- data/src/core/lib/resource_quota/memory_quota.h +85 -23
- data/src/core/lib/resource_quota/resource_quota.h +1 -1
- data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +0 -1
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
- data/src/core/lib/security/authorization/matchers.cc +25 -22
- data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
- data/src/core/lib/security/authorization/rbac_policy.h +1 -1
- data/src/core/lib/security/context/security_context.cc +22 -23
- data/src/core/lib/security/context/security_context.h +40 -30
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +17 -17
- data/src/core/lib/security/credentials/alts/alts_credentials.h +50 -50
- data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +19 -19
- data/src/core/lib/security/credentials/alts/check_gcp_environment.h +41 -41
- data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +17 -17
- data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +18 -17
- data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +18 -17
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +19 -19
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +18 -18
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +36 -37
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +18 -18
- data/src/core/lib/security/credentials/call_creds_util.h +1 -1
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +22 -22
- data/src/core/lib/security/credentials/composite/composite_credentials.h +20 -21
- data/src/core/lib/security/credentials/credentials.cc +19 -18
- data/src/core/lib/security/credentials/credentials.h +34 -33
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +20 -19
- data/src/core/lib/security/credentials/fake/fake_credentials.h +34 -35
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +17 -17
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +75 -73
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +18 -19
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +18 -17
- data/src/core/lib/security/credentials/iam/iam_credentials.h +18 -18
- data/src/core/lib/security/credentials/jwt/json_token.cc +24 -25
- data/src/core/lib/security/credentials/jwt/json_token.h +32 -32
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +18 -18
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +18 -19
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +75 -75
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +43 -43
- data/src/core/lib/security/credentials/local/local_credentials.cc +17 -17
- data/src/core/lib/security/credentials/local/local_credentials.h +20 -20
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +52 -59
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +19 -19
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +24 -23
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +22 -22
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +19 -20
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +18 -18
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +20 -28
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +30 -43
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +18 -18
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +18 -19
- data/src/core/lib/security/credentials/tls/tls_credentials.h +18 -18
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +1 -2
- data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +32 -38
- data/src/core/lib/security/security_connector/alts/alts_security_connector.h +41 -42
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +32 -41
- data/src/core/lib/security/security_connector/fake/fake_security_connector.h +20 -21
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +3 -8
- data/src/core/lib/security/security_connector/load_system_roots.h +18 -18
- data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +18 -18
- data/src/core/lib/security/security_connector/load_system_roots_supported.cc +19 -22
- data/src/core/lib/security/security_connector/load_system_roots_supported.h +19 -20
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +30 -34
- data/src/core/lib/security/security_connector/local/local_security_connector.h +40 -41
- data/src/core/lib/security/security_connector/security_connector.cc +17 -17
- data/src/core/lib/security/security_connector/security_connector.h +32 -33
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +34 -39
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +38 -39
- data/src/core/lib/security/security_connector/ssl_utils.cc +37 -39
- data/src/core/lib/security/security_connector/ssl_utils.h +31 -31
- data/src/core/lib/security/security_connector/ssl_utils_config.cc +22 -22
- data/src/core/lib/security/security_connector/ssl_utils_config.h +18 -19
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +42 -48
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +17 -17
- data/src/core/lib/security/transport/auth_filters.h +18 -18
- data/src/core/lib/security/transport/client_auth_filter.cc +21 -21
- data/src/core/lib/security/transport/secure_endpoint.cc +54 -56
- data/src/core/lib/security/transport/secure_endpoint.h +22 -22
- data/src/core/lib/security/transport/security_handshaker.cc +70 -70
- data/src/core/lib/security/transport/security_handshaker.h +19 -19
- data/src/core/lib/security/transport/server_auth_filter.cc +43 -44
- data/src/core/lib/security/transport/tsi_error.cc +23 -20
- data/src/core/lib/security/transport/tsi_error.h +18 -18
- data/src/core/lib/security/util/json_util.cc +21 -22
- data/src/core/lib/security/util/json_util.h +18 -18
- data/src/core/lib/service_config/service_config.h +2 -2
- data/src/core/lib/service_config/service_config_call_data.h +7 -1
- data/src/core/lib/service_config/service_config_impl.cc +111 -158
- data/src/core/lib/service_config/service_config_impl.h +14 -17
- data/src/core/lib/service_config/service_config_parser.cc +14 -31
- data/src/core/lib/service_config/service_config_parser.h +14 -10
- data/src/core/lib/slice/b64.cc +26 -26
- data/src/core/lib/slice/b64.h +29 -29
- data/src/core/lib/slice/percent_encoding.cc +17 -17
- data/src/core/lib/slice/percent_encoding.h +24 -24
- data/src/core/lib/slice/slice.cc +44 -38
- data/src/core/lib/slice/slice.h +57 -11
- data/src/core/lib/slice/slice_buffer.cc +63 -59
- data/src/core/lib/slice/slice_buffer.h +27 -2
- data/src/core/lib/slice/slice_internal.h +31 -39
- data/src/core/lib/slice/slice_refcount.h +34 -19
- data/src/core/lib/slice/slice_string_helpers.cc +17 -17
- data/src/core/lib/slice/slice_string_helpers.h +19 -19
- data/src/core/lib/surface/api_trace.cc +17 -17
- data/src/core/lib/surface/api_trace.h +22 -22
- data/src/core/lib/surface/byte_buffer.cc +22 -23
- data/src/core/lib/surface/byte_buffer_reader.cc +23 -23
- data/src/core/lib/surface/call.cc +1521 -335
- data/src/core/lib/surface/call.h +86 -39
- data/src/core/lib/surface/call_details.cc +20 -21
- data/src/core/lib/surface/call_log_batch.cc +18 -18
- data/src/core/lib/surface/call_test_only.h +30 -30
- data/src/core/lib/surface/call_trace.cc +113 -0
- data/src/core/{ext/filters/http/message_compress/message_decompress_filter.h → lib/surface/call_trace.h} +10 -12
- data/src/core/lib/surface/channel.cc +62 -67
- data/src/core/lib/surface/channel.h +40 -32
- data/src/core/lib/surface/channel_init.cc +17 -17
- data/src/core/lib/surface/channel_init.h +18 -18
- data/src/core/lib/surface/channel_ping.cc +19 -19
- data/src/core/lib/surface/channel_stack_type.cc +21 -17
- data/src/core/lib/surface/channel_stack_type.h +20 -18
- data/src/core/lib/surface/completion_queue.cc +173 -191
- data/src/core/lib/surface/completion_queue.h +32 -32
- data/src/core/lib/surface/completion_queue_factory.cc +28 -28
- data/src/core/lib/surface/completion_queue_factory.h +20 -20
- data/src/core/lib/surface/event_string.cc +17 -17
- data/src/core/lib/surface/event_string.h +20 -20
- data/src/core/lib/surface/init.cc +29 -58
- data/src/core/lib/surface/init.h +18 -18
- data/src/core/lib/surface/init_internally.cc +1 -0
- data/src/core/lib/surface/init_internally.h +9 -0
- data/src/core/lib/surface/lame_client.cc +28 -26
- data/src/core/lib/surface/lame_client.h +19 -19
- data/src/core/lib/surface/metadata_array.cc +17 -18
- data/src/core/lib/surface/server.cc +61 -83
- data/src/core/lib/surface/server.h +5 -7
- data/src/core/lib/surface/validate_metadata.cc +28 -29
- data/src/core/lib/surface/validate_metadata.h +18 -18
- data/src/core/lib/surface/version.cc +21 -21
- data/src/core/lib/transport/bdp_estimator.cc +17 -17
- data/src/core/lib/transport/bdp_estimator.h +18 -19
- data/src/core/lib/transport/connectivity_state.cc +19 -19
- data/src/core/lib/transport/connectivity_state.h +19 -19
- data/src/core/lib/transport/error_utils.cc +51 -45
- data/src/core/lib/transport/error_utils.h +21 -21
- data/src/core/lib/transport/handshaker.cc +49 -46
- data/src/core/lib/transport/handshaker.h +43 -38
- data/src/core/lib/transport/handshaker_factory.h +44 -18
- data/src/core/lib/transport/handshaker_registry.cc +25 -19
- data/src/core/lib/transport/handshaker_registry.h +21 -22
- data/src/core/lib/transport/http2_errors.h +20 -20
- data/src/core/lib/transport/http_connect_handshaker.cc +40 -41
- data/src/core/lib/transport/http_connect_handshaker.h +18 -18
- data/src/core/lib/transport/metadata_batch.cc +4 -1
- data/src/core/lib/transport/metadata_batch.h +46 -20
- data/src/core/lib/transport/parsed_metadata.cc +2 -6
- data/src/core/lib/transport/parsed_metadata.h +1 -0
- data/src/core/lib/transport/pid_controller.cc +20 -20
- data/src/core/lib/transport/pid_controller.h +24 -24
- data/src/core/lib/transport/status_conversion.cc +22 -22
- data/src/core/lib/transport/status_conversion.h +20 -20
- data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
- data/src/core/lib/transport/tcp_connect_handshaker.h +1 -1
- data/src/core/lib/transport/timeout_encoding.cc +22 -22
- data/src/core/lib/transport/timeout_encoding.h +18 -18
- data/src/core/lib/transport/transport.cc +88 -41
- data/src/core/lib/transport/transport.h +193 -195
- data/src/core/lib/transport/transport_impl.h +42 -42
- data/src/core/lib/transport/transport_op_string.cc +26 -25
- data/src/core/plugin_registry/grpc_plugin_registry.cc +25 -27
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +7 -14
- data/src/core/tsi/alts/crypt/aes_gcm.cc +20 -20
- data/src/core/tsi/alts/crypt/gsec.cc +26 -26
- data/src/core/tsi/alts/crypt/gsec.h +334 -334
- data/src/core/tsi/alts/frame_protector/alts_counter.cc +23 -23
- data/src/core/tsi/alts/frame_protector/alts_counter.h +66 -66
- data/src/core/tsi/alts/frame_protector/alts_crypter.cc +19 -19
- data/src/core/tsi/alts/frame_protector/alts_crypter.h +206 -206
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +72 -71
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +38 -38
- data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc +18 -18
- data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +80 -81
- data/src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc +22 -22
- data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +22 -22
- data/src/core/tsi/alts/frame_protector/frame_handler.cc +26 -25
- data/src/core/tsi/alts/frame_protector/frame_handler.h +166 -166
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +78 -77
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +99 -99
- data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +18 -17
- data/src/core/tsi/alts/handshaker/alts_shared_resource.h +41 -42
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +37 -36
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +58 -58
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +20 -20
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +21 -20
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +36 -36
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +19 -19
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +102 -101
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +45 -44
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +38 -39
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +38 -36
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +33 -34
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +65 -66
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +32 -31
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +53 -54
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +54 -53
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +138 -139
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +58 -57
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +41 -42
- data/src/core/tsi/fake_transport_security.cc +80 -79
- data/src/core/tsi/fake_transport_security.h +30 -30
- data/src/core/tsi/local_transport_security.cc +34 -33
- data/src/core/tsi/local_transport_security.h +31 -31
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +8 -3
- data/src/core/tsi/ssl/session_cache/ssl_session.h +18 -18
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +19 -19
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +18 -17
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +19 -19
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +25 -20
- data/src/core/tsi/ssl_transport_security.cc +139 -323
- data/src/core/tsi/ssl_transport_security.h +201 -200
- data/src/core/tsi/ssl_transport_security_utils.cc +250 -0
- data/src/core/tsi/ssl_transport_security_utils.h +147 -0
- data/src/core/tsi/ssl_types.h +25 -25
- data/src/core/tsi/transport_security.cc +26 -26
- data/src/core/tsi/transport_security.h +45 -45
- data/src/core/tsi/transport_security_grpc.cc +20 -20
- data/src/core/tsi/transport_security_grpc.h +39 -39
- data/src/core/tsi/transport_security_interface.h +330 -330
- data/src/ruby/ext/grpc/{ext-export-truffleruby.clang → ext-export-truffleruby-with-ruby-abi-version.clang} +0 -0
- data/src/ruby/ext/grpc/{ext-export-truffleruby.gcc → ext-export-truffleruby-with-ruby-abi-version.gcc} +0 -0
- data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.clang +2 -0
- data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.gcc +7 -0
- data/src/ruby/ext/grpc/ext-export.clang +0 -1
- data/src/ruby/ext/grpc/ext-export.gcc +1 -2
- data/src/ruby/ext/grpc/extconf.rb +47 -2
- data/src/ruby/ext/grpc/rb_call.c +1 -0
- data/src/ruby/ext/grpc/rb_channel.c +1 -0
- data/src/ruby/ext/grpc/rb_channel_args.c +1 -0
- data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
- data/src/ruby/ext/grpc/rb_grpc.c +1 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +38 -38
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +59 -59
- data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/channel_spec.rb +0 -43
- data/src/ruby/spec/client_server_spec.rb +20 -8
- data/src/ruby/spec/generic/active_call_spec.rb +12 -3
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
- data/third_party/re2/re2/bitstate.cc +3 -3
- data/third_party/re2/re2/dfa.cc +13 -13
- data/third_party/re2/re2/nfa.cc +4 -4
- data/third_party/re2/re2/onepass.cc +2 -2
- data/third_party/re2/re2/prefilter_tree.cc +27 -59
- data/third_party/re2/re2/prefilter_tree.h +3 -2
- data/third_party/re2/re2/prog.cc +11 -2
- data/third_party/re2/re2/prog.h +17 -5
- data/third_party/re2/re2/re2.cc +6 -11
- data/third_party/re2/re2/re2.h +1 -1
- data/third_party/re2/re2/regexp.cc +1 -2
- data/third_party/re2/re2/stringpiece.h +10 -7
- data/third_party/re2/re2/unicode_casefold.cc +25 -11
- data/third_party/re2/re2/unicode_groups.cc +319 -151
- data/third_party/re2/re2/walker-inl.h +3 -2
- data/third_party/re2/util/mutex.h +4 -4
- data/third_party/zlib/compress.c +3 -3
- data/third_party/zlib/crc32.c +21 -12
- data/third_party/zlib/deflate.c +112 -106
- data/third_party/zlib/deflate.h +2 -2
- data/third_party/zlib/gzlib.c +1 -1
- data/third_party/zlib/gzread.c +3 -5
- data/third_party/zlib/gzwrite.c +1 -1
- data/third_party/zlib/infback.c +10 -7
- data/third_party/zlib/inflate.c +5 -2
- data/third_party/zlib/inftrees.c +2 -2
- data/third_party/zlib/inftrees.h +1 -1
- data/third_party/zlib/trees.c +61 -62
- data/third_party/zlib/uncompr.c +2 -2
- data/third_party/zlib/zconf.h +16 -3
- data/third_party/zlib/zlib.h +10 -10
- data/third_party/zlib/zutil.c +9 -7
- data/third_party/zlib/zutil.h +1 -0
- metadata +146 -40
- data/include/grpc/impl/codegen/gpr_slice.h +0 -71
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +0 -332
- data/src/core/ext/filters/http/message_compress/message_compress_filter.h +0 -52
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +0 -322
- data/src/core/ext/filters/server_config_selector/server_config_selector.cc +0 -62
- data/src/core/lib/gpr/murmur_hash.cc +0 -82
- data/src/core/lib/gpr/murmur_hash.h +0 -29
- data/src/core/lib/gpr/tls.h +0 -156
- data/src/core/lib/promise/call_push_pull.h +0 -148
- data/src/core/lib/slice/slice_api.cc +0 -39
- data/src/core/lib/slice/slice_refcount_base.h +0 -60
|
@@ -16,23 +16,59 @@
|
|
|
16
16
|
|
|
17
17
|
#include "src/core/lib/channel/promise_based_filter.h"
|
|
18
18
|
|
|
19
|
+
#include <algorithm>
|
|
19
20
|
#include <memory>
|
|
20
21
|
#include <string>
|
|
22
|
+
#include <vector>
|
|
21
23
|
|
|
22
24
|
#include "absl/base/attributes.h"
|
|
23
|
-
#include "absl/
|
|
25
|
+
#include "absl/functional/function_ref.h"
|
|
26
|
+
#include "absl/strings/str_cat.h"
|
|
27
|
+
#include "absl/strings/str_format.h"
|
|
28
|
+
#include "absl/strings/str_join.h"
|
|
24
29
|
#include "absl/types/variant.h"
|
|
25
30
|
|
|
26
31
|
#include <grpc/status.h>
|
|
27
32
|
|
|
28
33
|
#include "src/core/lib/channel/channel_stack.h"
|
|
34
|
+
#include "src/core/lib/debug/trace.h"
|
|
35
|
+
#include "src/core/lib/gprpp/crash.h"
|
|
29
36
|
#include "src/core/lib/gprpp/manual_constructor.h"
|
|
37
|
+
#include "src/core/lib/gprpp/status_helper.h"
|
|
30
38
|
#include "src/core/lib/iomgr/error.h"
|
|
31
39
|
#include "src/core/lib/slice/slice.h"
|
|
32
40
|
|
|
41
|
+
extern grpc_core::TraceFlag grpc_trace_channel;
|
|
42
|
+
|
|
33
43
|
namespace grpc_core {
|
|
34
44
|
namespace promise_filter_detail {
|
|
35
45
|
|
|
46
|
+
namespace {
|
|
47
|
+
class FakeActivity final : public Activity {
|
|
48
|
+
public:
|
|
49
|
+
void Orphan() override {}
|
|
50
|
+
void ForceImmediateRepoll() override {}
|
|
51
|
+
Waker MakeOwningWaker() override { abort(); }
|
|
52
|
+
Waker MakeNonOwningWaker() override { abort(); }
|
|
53
|
+
void Run(absl::FunctionRef<void()> f) {
|
|
54
|
+
ScopedActivity activity(this);
|
|
55
|
+
f();
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
absl::Status StatusFromMetadata(const ServerMetadata& md) {
|
|
60
|
+
auto status_code = md.get(GrpcStatusMetadata()).value_or(GRPC_STATUS_UNKNOWN);
|
|
61
|
+
if (status_code == GRPC_STATUS_OK) {
|
|
62
|
+
return absl::OkStatus();
|
|
63
|
+
}
|
|
64
|
+
const auto* message = md.get_pointer(GrpcMessageMetadata());
|
|
65
|
+
return grpc_error_set_int(
|
|
66
|
+
absl::Status(static_cast<absl::StatusCode>(status_code),
|
|
67
|
+
message == nullptr ? "" : message->as_string_view()),
|
|
68
|
+
StatusIntProperty::kRpcStatus, status_code);
|
|
69
|
+
}
|
|
70
|
+
} // namespace
|
|
71
|
+
|
|
36
72
|
///////////////////////////////////////////////////////////////////////////////
|
|
37
73
|
// BaseCallData
|
|
38
74
|
|
|
@@ -43,16 +79,34 @@ BaseCallData::BaseCallData(grpc_call_element* elem,
|
|
|
43
79
|
arena_(args->arena),
|
|
44
80
|
call_combiner_(args->call_combiner),
|
|
45
81
|
deadline_(args->deadline),
|
|
46
|
-
context_(args->context)
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
82
|
+
context_(args->context),
|
|
83
|
+
server_initial_metadata_latch_(
|
|
84
|
+
flags & kFilterExaminesServerInitialMetadata
|
|
85
|
+
? arena_->New<Latch<ServerMetadata*>>()
|
|
86
|
+
: nullptr),
|
|
87
|
+
send_message_(flags & kFilterExaminesOutboundMessages
|
|
88
|
+
? arena_->New<SendMessage>(this)
|
|
89
|
+
: nullptr),
|
|
90
|
+
receive_message_(flags & kFilterExaminesInboundMessages
|
|
91
|
+
? arena_->New<ReceiveMessage>(this)
|
|
92
|
+
: nullptr),
|
|
93
|
+
event_engine_(
|
|
94
|
+
static_cast<ChannelFilter*>(elem->channel_data)
|
|
95
|
+
->hack_until_per_channel_stack_event_engines_land_get_event_engine()) {
|
|
50
96
|
}
|
|
51
97
|
|
|
52
98
|
BaseCallData::~BaseCallData() {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
99
|
+
FakeActivity().Run([this] {
|
|
100
|
+
if (send_message_ != nullptr) {
|
|
101
|
+
send_message_->~SendMessage();
|
|
102
|
+
}
|
|
103
|
+
if (receive_message_ != nullptr) {
|
|
104
|
+
receive_message_->~ReceiveMessage();
|
|
105
|
+
}
|
|
106
|
+
if (server_initial_metadata_latch_ != nullptr) {
|
|
107
|
+
server_initial_metadata_latch_->~Latch();
|
|
108
|
+
}
|
|
109
|
+
});
|
|
56
110
|
}
|
|
57
111
|
|
|
58
112
|
// We don't form ActivityPtr's to this type, and consequently don't need
|
|
@@ -75,11 +129,17 @@ void BaseCallData::Wakeup() {
|
|
|
75
129
|
self->Drop();
|
|
76
130
|
};
|
|
77
131
|
auto* closure = GRPC_CLOSURE_CREATE(wakeup, this, nullptr);
|
|
78
|
-
GRPC_CALL_COMBINER_START(call_combiner_, closure,
|
|
132
|
+
GRPC_CALL_COMBINER_START(call_combiner_, closure, absl::OkStatus(), "wakeup");
|
|
79
133
|
}
|
|
80
134
|
|
|
81
135
|
void BaseCallData::Drop() { GRPC_CALL_STACK_UNREF(call_stack_, "waker"); }
|
|
82
136
|
|
|
137
|
+
std::string BaseCallData::LogTag() const {
|
|
138
|
+
return absl::StrCat(
|
|
139
|
+
ClientOrServerString(), "[", elem_->filter->name, ":0x",
|
|
140
|
+
absl::Hex(reinterpret_cast<uintptr_t>(elem_), absl::kZeroPad8), "]");
|
|
141
|
+
}
|
|
142
|
+
|
|
83
143
|
///////////////////////////////////////////////////////////////////////////////
|
|
84
144
|
// BaseCallData::CapturedBatch
|
|
85
145
|
|
|
@@ -159,7 +219,6 @@ void BaseCallData::CapturedBatch::CancelWith(grpc_error_handle error,
|
|
|
159
219
|
uintptr_t& refcnt = *RefCountField(batch);
|
|
160
220
|
if (refcnt == 0) {
|
|
161
221
|
// refcnt==0 ==> cancelled
|
|
162
|
-
GRPC_ERROR_UNREF(error);
|
|
163
222
|
return;
|
|
164
223
|
}
|
|
165
224
|
refcnt = 0;
|
|
@@ -188,23 +247,576 @@ BaseCallData::Flusher::~Flusher() {
|
|
|
188
247
|
auto* batch = static_cast<grpc_transport_stream_op_batch*>(p);
|
|
189
248
|
BaseCallData* call =
|
|
190
249
|
static_cast<BaseCallData*>(batch->handler_private.extra_arg);
|
|
250
|
+
if (grpc_trace_channel.enabled()) {
|
|
251
|
+
gpr_log(GPR_INFO, "FLUSHER:forward batch via closure: %s",
|
|
252
|
+
grpc_transport_stream_op_batch_string(batch).c_str());
|
|
253
|
+
}
|
|
191
254
|
grpc_call_next_op(call->elem(), batch);
|
|
192
255
|
GRPC_CALL_STACK_UNREF(call->call_stack(), "flusher_batch");
|
|
193
256
|
};
|
|
194
257
|
for (size_t i = 1; i < release_.size(); i++) {
|
|
195
258
|
auto* batch = release_[i];
|
|
259
|
+
if (grpc_trace_channel.enabled()) {
|
|
260
|
+
gpr_log(GPR_INFO, "FLUSHER:queue batch to forward in closure: %s",
|
|
261
|
+
grpc_transport_stream_op_batch_string(release_[i]).c_str());
|
|
262
|
+
}
|
|
196
263
|
batch->handler_private.extra_arg = call_;
|
|
197
264
|
GRPC_CLOSURE_INIT(&batch->handler_private.closure, call_next_op, batch,
|
|
198
265
|
nullptr);
|
|
199
266
|
GRPC_CALL_STACK_REF(call_->call_stack(), "flusher_batch");
|
|
200
|
-
call_closures_.Add(&batch->handler_private.closure,
|
|
267
|
+
call_closures_.Add(&batch->handler_private.closure, absl::OkStatus(),
|
|
201
268
|
"flusher_batch");
|
|
202
269
|
}
|
|
203
270
|
call_closures_.RunClosuresWithoutYielding(call_->call_combiner());
|
|
271
|
+
if (grpc_trace_channel.enabled()) {
|
|
272
|
+
gpr_log(GPR_INFO, "FLUSHER:forward batch: %s",
|
|
273
|
+
grpc_transport_stream_op_batch_string(release_[0]).c_str());
|
|
274
|
+
}
|
|
204
275
|
grpc_call_next_op(call_->elem(), release_[0]);
|
|
205
276
|
GRPC_CALL_STACK_UNREF(call_->call_stack(), "flusher");
|
|
206
277
|
}
|
|
207
278
|
|
|
279
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
280
|
+
// BaseCallData::SendMessage
|
|
281
|
+
|
|
282
|
+
const char* BaseCallData::SendMessage::StateString(State state) {
|
|
283
|
+
switch (state) {
|
|
284
|
+
case State::kInitial:
|
|
285
|
+
return "INITIAL";
|
|
286
|
+
case State::kIdle:
|
|
287
|
+
return "IDLE";
|
|
288
|
+
case State::kGotBatchNoPipe:
|
|
289
|
+
return "GOT_BATCH_NO_PIPE";
|
|
290
|
+
case State::kGotBatch:
|
|
291
|
+
return "GOT_BATCH";
|
|
292
|
+
case State::kPushedToPipe:
|
|
293
|
+
return "PUSHED_TO_PIPE";
|
|
294
|
+
case State::kForwardedBatch:
|
|
295
|
+
return "FORWARDED_BATCH";
|
|
296
|
+
case State::kBatchCompleted:
|
|
297
|
+
return "BATCH_COMPLETED";
|
|
298
|
+
case State::kCancelled:
|
|
299
|
+
return "CANCELLED";
|
|
300
|
+
case State::kCancelledButNotYetPolled:
|
|
301
|
+
return "CANCELLED_BUT_NOT_YET_POLLED";
|
|
302
|
+
}
|
|
303
|
+
return "UNKNOWN";
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
void BaseCallData::SendMessage::StartOp(CapturedBatch batch) {
|
|
307
|
+
if (grpc_trace_channel.enabled()) {
|
|
308
|
+
gpr_log(GPR_INFO, "%s SendMessage.StartOp st=%s", base_->LogTag().c_str(),
|
|
309
|
+
StateString(state_));
|
|
310
|
+
}
|
|
311
|
+
switch (state_) {
|
|
312
|
+
case State::kInitial:
|
|
313
|
+
state_ = State::kGotBatchNoPipe;
|
|
314
|
+
break;
|
|
315
|
+
case State::kIdle:
|
|
316
|
+
state_ = State::kGotBatch;
|
|
317
|
+
break;
|
|
318
|
+
case State::kGotBatch:
|
|
319
|
+
case State::kGotBatchNoPipe:
|
|
320
|
+
case State::kForwardedBatch:
|
|
321
|
+
case State::kBatchCompleted:
|
|
322
|
+
case State::kPushedToPipe:
|
|
323
|
+
Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
|
|
324
|
+
case State::kCancelled:
|
|
325
|
+
case State::kCancelledButNotYetPolled:
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
batch_ = batch;
|
|
329
|
+
intercepted_on_complete_ = std::exchange(batch_->on_complete, &on_complete_);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
void BaseCallData::SendMessage::GotPipe(PipeReceiver<MessageHandle>* receiver) {
|
|
333
|
+
if (grpc_trace_channel.enabled()) {
|
|
334
|
+
gpr_log(GPR_INFO, "%s SendMessage.GotPipe st=%s", base_->LogTag().c_str(),
|
|
335
|
+
StateString(state_));
|
|
336
|
+
}
|
|
337
|
+
GPR_ASSERT(receiver != nullptr);
|
|
338
|
+
switch (state_) {
|
|
339
|
+
case State::kInitial:
|
|
340
|
+
state_ = State::kIdle;
|
|
341
|
+
Activity::current()->ForceImmediateRepoll();
|
|
342
|
+
break;
|
|
343
|
+
case State::kGotBatchNoPipe:
|
|
344
|
+
state_ = State::kGotBatch;
|
|
345
|
+
Activity::current()->ForceImmediateRepoll();
|
|
346
|
+
break;
|
|
347
|
+
case State::kIdle:
|
|
348
|
+
case State::kGotBatch:
|
|
349
|
+
case State::kForwardedBatch:
|
|
350
|
+
case State::kBatchCompleted:
|
|
351
|
+
case State::kPushedToPipe:
|
|
352
|
+
Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
|
|
353
|
+
case State::kCancelled:
|
|
354
|
+
case State::kCancelledButNotYetPolled:
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
receiver_ = receiver;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
bool BaseCallData::SendMessage::IsIdle() const {
|
|
361
|
+
switch (state_) {
|
|
362
|
+
case State::kInitial:
|
|
363
|
+
case State::kIdle:
|
|
364
|
+
case State::kForwardedBatch:
|
|
365
|
+
case State::kCancelled:
|
|
366
|
+
case State::kCancelledButNotYetPolled:
|
|
367
|
+
return true;
|
|
368
|
+
case State::kGotBatchNoPipe:
|
|
369
|
+
case State::kGotBatch:
|
|
370
|
+
case State::kBatchCompleted:
|
|
371
|
+
case State::kPushedToPipe:
|
|
372
|
+
return false;
|
|
373
|
+
}
|
|
374
|
+
GPR_UNREACHABLE_CODE(return false);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
void BaseCallData::SendMessage::OnComplete(absl::Status status) {
|
|
378
|
+
Flusher flusher(base_);
|
|
379
|
+
if (grpc_trace_channel.enabled()) {
|
|
380
|
+
gpr_log(GPR_INFO, "%s SendMessage.OnComplete st=%s status=%s",
|
|
381
|
+
base_->LogTag().c_str(), StateString(state_),
|
|
382
|
+
status.ToString().c_str());
|
|
383
|
+
}
|
|
384
|
+
switch (state_) {
|
|
385
|
+
case State::kInitial:
|
|
386
|
+
case State::kIdle:
|
|
387
|
+
case State::kGotBatchNoPipe:
|
|
388
|
+
case State::kPushedToPipe:
|
|
389
|
+
case State::kGotBatch:
|
|
390
|
+
case State::kBatchCompleted:
|
|
391
|
+
Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
|
|
392
|
+
break;
|
|
393
|
+
case State::kCancelled:
|
|
394
|
+
case State::kCancelledButNotYetPolled:
|
|
395
|
+
flusher.AddClosure(intercepted_on_complete_, status,
|
|
396
|
+
"forward after cancel");
|
|
397
|
+
break;
|
|
398
|
+
case State::kForwardedBatch:
|
|
399
|
+
completed_status_ = status;
|
|
400
|
+
state_ = State::kBatchCompleted;
|
|
401
|
+
base_->WakeInsideCombiner(&flusher);
|
|
402
|
+
break;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
void BaseCallData::SendMessage::Done(const ServerMetadata& metadata) {
|
|
407
|
+
if (grpc_trace_channel.enabled()) {
|
|
408
|
+
gpr_log(GPR_INFO, "%s SendMessage.Done st=%s md=%s",
|
|
409
|
+
base_->LogTag().c_str(), StateString(state_),
|
|
410
|
+
metadata.DebugString().c_str());
|
|
411
|
+
}
|
|
412
|
+
switch (state_) {
|
|
413
|
+
case State::kCancelled:
|
|
414
|
+
case State::kCancelledButNotYetPolled:
|
|
415
|
+
break;
|
|
416
|
+
case State::kInitial:
|
|
417
|
+
case State::kIdle:
|
|
418
|
+
case State::kForwardedBatch:
|
|
419
|
+
state_ = State::kCancelledButNotYetPolled;
|
|
420
|
+
break;
|
|
421
|
+
case State::kGotBatchNoPipe:
|
|
422
|
+
case State::kGotBatch:
|
|
423
|
+
case State::kBatchCompleted:
|
|
424
|
+
Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
|
|
425
|
+
break;
|
|
426
|
+
case State::kPushedToPipe:
|
|
427
|
+
push_.reset();
|
|
428
|
+
next_.reset();
|
|
429
|
+
state_ = State::kCancelledButNotYetPolled;
|
|
430
|
+
break;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
void BaseCallData::SendMessage::WakeInsideCombiner(Flusher* flusher) {
|
|
435
|
+
if (grpc_trace_channel.enabled()) {
|
|
436
|
+
gpr_log(GPR_INFO, "%s SendMessage.WakeInsideCombiner st=%s%s",
|
|
437
|
+
base_->LogTag().c_str(), StateString(state_),
|
|
438
|
+
state_ == State::kBatchCompleted
|
|
439
|
+
? absl::StrCat(" status=", completed_status_.ToString()).c_str()
|
|
440
|
+
: "");
|
|
441
|
+
}
|
|
442
|
+
switch (state_) {
|
|
443
|
+
case State::kInitial:
|
|
444
|
+
case State::kIdle:
|
|
445
|
+
case State::kGotBatchNoPipe:
|
|
446
|
+
case State::kForwardedBatch:
|
|
447
|
+
case State::kCancelled:
|
|
448
|
+
break;
|
|
449
|
+
case State::kCancelledButNotYetPolled:
|
|
450
|
+
pipe_.sender.Close();
|
|
451
|
+
state_ = State::kCancelled;
|
|
452
|
+
break;
|
|
453
|
+
case State::kGotBatch: {
|
|
454
|
+
state_ = State::kPushedToPipe;
|
|
455
|
+
auto message = GetContext<Arena>()->MakePooled<Message>();
|
|
456
|
+
message->payload()->Swap(batch_->payload->send_message.send_message);
|
|
457
|
+
message->mutable_flags() = batch_->payload->send_message.flags;
|
|
458
|
+
push_ = pipe_.sender.Push(std::move(message));
|
|
459
|
+
next_ = receiver_->Next();
|
|
460
|
+
}
|
|
461
|
+
ABSL_FALLTHROUGH_INTENDED;
|
|
462
|
+
case State::kPushedToPipe: {
|
|
463
|
+
GPR_ASSERT(push_.has_value());
|
|
464
|
+
auto r_push = (*push_)();
|
|
465
|
+
if (auto* p = absl::get_if<bool>(&r_push)) {
|
|
466
|
+
if (grpc_trace_channel.enabled()) {
|
|
467
|
+
gpr_log(GPR_INFO,
|
|
468
|
+
"%s SendMessage.WakeInsideCombiner push complete, result=%s",
|
|
469
|
+
base_->LogTag().c_str(), *p ? "true" : "false");
|
|
470
|
+
}
|
|
471
|
+
// We haven't pulled through yet, so this certainly shouldn't succeed.
|
|
472
|
+
GPR_ASSERT(!*p);
|
|
473
|
+
state_ = State::kCancelled;
|
|
474
|
+
batch_.CancelWith(absl::CancelledError(), flusher);
|
|
475
|
+
break;
|
|
476
|
+
}
|
|
477
|
+
GPR_ASSERT(next_.has_value());
|
|
478
|
+
auto r_next = (*next_)();
|
|
479
|
+
if (auto* p = absl::get_if<NextResult<MessageHandle>>(&r_next)) {
|
|
480
|
+
if (grpc_trace_channel.enabled()) {
|
|
481
|
+
gpr_log(GPR_INFO,
|
|
482
|
+
"%s SendMessage.WakeInsideCombiner next complete, "
|
|
483
|
+
"result.has_value=%s",
|
|
484
|
+
base_->LogTag().c_str(), p->has_value() ? "true" : "false");
|
|
485
|
+
}
|
|
486
|
+
GPR_ASSERT(p->has_value());
|
|
487
|
+
batch_->payload->send_message.send_message->Swap((**p)->payload());
|
|
488
|
+
batch_->payload->send_message.flags = (**p)->flags();
|
|
489
|
+
state_ = State::kForwardedBatch;
|
|
490
|
+
batch_.ResumeWith(flusher);
|
|
491
|
+
next_result_ = std::move(*p);
|
|
492
|
+
next_.reset();
|
|
493
|
+
}
|
|
494
|
+
} break;
|
|
495
|
+
case State::kBatchCompleted:
|
|
496
|
+
next_result_.reset();
|
|
497
|
+
// We've cleared out the NextResult on the pipe from promise to us, but
|
|
498
|
+
// there's also the pipe from us to the promise (so that the promise can
|
|
499
|
+
// intercept the sent messages). The push promise here is pushing into the
|
|
500
|
+
// latter pipe, and so we need to keep polling it until it's done, which
|
|
501
|
+
// depending on what happens inside the promise may take some time.
|
|
502
|
+
if (absl::holds_alternative<Pending>((*push_)())) break;
|
|
503
|
+
if (completed_status_.ok()) {
|
|
504
|
+
state_ = State::kIdle;
|
|
505
|
+
Activity::current()->ForceImmediateRepoll();
|
|
506
|
+
} else {
|
|
507
|
+
state_ = State::kCancelled;
|
|
508
|
+
}
|
|
509
|
+
push_.reset();
|
|
510
|
+
flusher->AddClosure(intercepted_on_complete_, completed_status_,
|
|
511
|
+
"batch_completed");
|
|
512
|
+
break;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
517
|
+
// BaseCallData::ReceiveMessage
|
|
518
|
+
|
|
519
|
+
const char* BaseCallData::ReceiveMessage::StateString(State state) {
|
|
520
|
+
switch (state) {
|
|
521
|
+
case State::kInitial:
|
|
522
|
+
return "INITIAL";
|
|
523
|
+
case State::kIdle:
|
|
524
|
+
return "IDLE";
|
|
525
|
+
case State::kForwardedBatchNoPipe:
|
|
526
|
+
return "FORWARDED_BATCH_NO_PIPE";
|
|
527
|
+
case State::kForwardedBatch:
|
|
528
|
+
return "FORWARDED_BATCH";
|
|
529
|
+
case State::kBatchCompletedNoPipe:
|
|
530
|
+
return "BATCH_COMPLETED_NO_PIPE";
|
|
531
|
+
case State::kBatchCompleted:
|
|
532
|
+
return "BATCH_COMPLETED";
|
|
533
|
+
case State::kPushedToPipe:
|
|
534
|
+
return "PUSHED_TO_PIPE";
|
|
535
|
+
case State::kPulledFromPipe:
|
|
536
|
+
return "PULLED_FROM_PIPE";
|
|
537
|
+
case State::kCancelled:
|
|
538
|
+
return "CANCELLED";
|
|
539
|
+
case State::kCancelledWhilstForwarding:
|
|
540
|
+
return "CANCELLED_WHILST_FORWARDING";
|
|
541
|
+
case State::kBatchCompletedButCancelled:
|
|
542
|
+
return "BATCH_COMPLETED_BUT_CANCELLED";
|
|
543
|
+
case State::kCancelledWhilstIdle:
|
|
544
|
+
return "CANCELLED_WHILST_IDLE";
|
|
545
|
+
case State::kCompletedWhilePulledFromPipe:
|
|
546
|
+
return "COMPLETED_WHILE_PULLED_FROM_PIPE";
|
|
547
|
+
case State::kCompletedWhilePushedToPipe:
|
|
548
|
+
return "COMPLETED_WHILE_PUSHED_TO_PIPE";
|
|
549
|
+
}
|
|
550
|
+
return "UNKNOWN";
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
void BaseCallData::ReceiveMessage::StartOp(CapturedBatch& batch) {
|
|
554
|
+
if (grpc_trace_channel.enabled()) {
|
|
555
|
+
gpr_log(GPR_INFO, "%s ReceiveMessage.StartOp st=%s",
|
|
556
|
+
base_->LogTag().c_str(), StateString(state_));
|
|
557
|
+
}
|
|
558
|
+
switch (state_) {
|
|
559
|
+
case State::kInitial:
|
|
560
|
+
state_ = State::kForwardedBatchNoPipe;
|
|
561
|
+
break;
|
|
562
|
+
case State::kIdle:
|
|
563
|
+
state_ = State::kForwardedBatch;
|
|
564
|
+
break;
|
|
565
|
+
case State::kCancelledWhilstForwarding:
|
|
566
|
+
case State::kBatchCompletedButCancelled:
|
|
567
|
+
case State::kForwardedBatch:
|
|
568
|
+
case State::kForwardedBatchNoPipe:
|
|
569
|
+
case State::kBatchCompleted:
|
|
570
|
+
case State::kBatchCompletedNoPipe:
|
|
571
|
+
case State::kPushedToPipe:
|
|
572
|
+
case State::kPulledFromPipe:
|
|
573
|
+
case State::kCompletedWhilePulledFromPipe:
|
|
574
|
+
case State::kCompletedWhilePushedToPipe:
|
|
575
|
+
Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
|
|
576
|
+
case State::kCancelledWhilstIdle:
|
|
577
|
+
case State::kCancelled:
|
|
578
|
+
return;
|
|
579
|
+
}
|
|
580
|
+
intercepted_slice_buffer_ = batch->payload->recv_message.recv_message;
|
|
581
|
+
intercepted_flags_ = batch->payload->recv_message.flags;
|
|
582
|
+
if (intercepted_flags_ == nullptr) {
|
|
583
|
+
intercepted_flags_ = &scratch_flags_;
|
|
584
|
+
*intercepted_flags_ = 0;
|
|
585
|
+
}
|
|
586
|
+
intercepted_on_complete_ = std::exchange(
|
|
587
|
+
batch->payload->recv_message.recv_message_ready, &on_complete_);
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
void BaseCallData::ReceiveMessage::GotPipe(PipeSender<MessageHandle>* sender) {
|
|
591
|
+
if (grpc_trace_channel.enabled()) {
|
|
592
|
+
gpr_log(GPR_INFO, "%s ReceiveMessage.GotPipe st=%s",
|
|
593
|
+
base_->LogTag().c_str(), StateString(state_));
|
|
594
|
+
}
|
|
595
|
+
switch (state_) {
|
|
596
|
+
case State::kInitial:
|
|
597
|
+
state_ = State::kIdle;
|
|
598
|
+
break;
|
|
599
|
+
case State::kForwardedBatchNoPipe:
|
|
600
|
+
state_ = State::kForwardedBatch;
|
|
601
|
+
break;
|
|
602
|
+
case State::kBatchCompletedNoPipe:
|
|
603
|
+
state_ = State::kBatchCompleted;
|
|
604
|
+
Activity::current()->ForceImmediateRepoll();
|
|
605
|
+
break;
|
|
606
|
+
case State::kIdle:
|
|
607
|
+
case State::kForwardedBatch:
|
|
608
|
+
case State::kBatchCompleted:
|
|
609
|
+
case State::kPushedToPipe:
|
|
610
|
+
case State::kPulledFromPipe:
|
|
611
|
+
case State::kCompletedWhilePulledFromPipe:
|
|
612
|
+
case State::kCompletedWhilePushedToPipe:
|
|
613
|
+
case State::kCancelledWhilstForwarding:
|
|
614
|
+
case State::kCancelledWhilstIdle:
|
|
615
|
+
case State::kBatchCompletedButCancelled:
|
|
616
|
+
Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
|
|
617
|
+
case State::kCancelled:
|
|
618
|
+
return;
|
|
619
|
+
}
|
|
620
|
+
sender_ = sender;
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
void BaseCallData::ReceiveMessage::OnComplete(absl::Status status) {
|
|
624
|
+
if (grpc_trace_channel.enabled()) {
|
|
625
|
+
gpr_log(GPR_INFO, "%s ReceiveMessage.OnComplete st=%s status=%s",
|
|
626
|
+
base_->LogTag().c_str(), StateString(state_),
|
|
627
|
+
status.ToString().c_str());
|
|
628
|
+
}
|
|
629
|
+
switch (state_) {
|
|
630
|
+
case State::kInitial:
|
|
631
|
+
case State::kIdle:
|
|
632
|
+
case State::kPushedToPipe:
|
|
633
|
+
case State::kPulledFromPipe:
|
|
634
|
+
case State::kBatchCompleted:
|
|
635
|
+
case State::kBatchCompletedNoPipe:
|
|
636
|
+
case State::kCancelled:
|
|
637
|
+
case State::kBatchCompletedButCancelled:
|
|
638
|
+
case State::kCancelledWhilstIdle:
|
|
639
|
+
case State::kCompletedWhilePulledFromPipe:
|
|
640
|
+
case State::kCompletedWhilePushedToPipe:
|
|
641
|
+
Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
|
|
642
|
+
case State::kForwardedBatchNoPipe:
|
|
643
|
+
state_ = State::kBatchCompletedNoPipe;
|
|
644
|
+
return;
|
|
645
|
+
case State::kForwardedBatch:
|
|
646
|
+
state_ = State::kBatchCompleted;
|
|
647
|
+
break;
|
|
648
|
+
case State::kCancelledWhilstForwarding:
|
|
649
|
+
state_ = State::kBatchCompletedButCancelled;
|
|
650
|
+
break;
|
|
651
|
+
}
|
|
652
|
+
completed_status_ = status;
|
|
653
|
+
Flusher flusher(base_);
|
|
654
|
+
ScopedContext ctx(base_);
|
|
655
|
+
base_->WakeInsideCombiner(&flusher);
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
void BaseCallData::ReceiveMessage::Done(const ServerMetadata& metadata,
|
|
659
|
+
Flusher* flusher) {
|
|
660
|
+
if (grpc_trace_channel.enabled()) {
|
|
661
|
+
gpr_log(GPR_INFO, "%s ReceiveMessage.Done st=%s md=%s",
|
|
662
|
+
base_->LogTag().c_str(), StateString(state_),
|
|
663
|
+
metadata.DebugString().c_str());
|
|
664
|
+
}
|
|
665
|
+
switch (state_) {
|
|
666
|
+
case State::kInitial:
|
|
667
|
+
state_ = State::kCancelled;
|
|
668
|
+
break;
|
|
669
|
+
case State::kIdle:
|
|
670
|
+
state_ = State::kCancelledWhilstIdle;
|
|
671
|
+
break;
|
|
672
|
+
case State::kForwardedBatch:
|
|
673
|
+
case State::kForwardedBatchNoPipe:
|
|
674
|
+
state_ = State::kCancelledWhilstForwarding;
|
|
675
|
+
break;
|
|
676
|
+
case State::kCompletedWhilePulledFromPipe:
|
|
677
|
+
case State::kCompletedWhilePushedToPipe:
|
|
678
|
+
case State::kPulledFromPipe:
|
|
679
|
+
case State::kPushedToPipe: {
|
|
680
|
+
auto status_code =
|
|
681
|
+
metadata.get(GrpcStatusMetadata()).value_or(GRPC_STATUS_UNKNOWN);
|
|
682
|
+
if (status_code == GRPC_STATUS_OK) {
|
|
683
|
+
if (state_ == State::kCompletedWhilePulledFromPipe ||
|
|
684
|
+
state_ == State::kPulledFromPipe) {
|
|
685
|
+
state_ = State::kCompletedWhilePulledFromPipe;
|
|
686
|
+
} else {
|
|
687
|
+
state_ = State::kCompletedWhilePushedToPipe;
|
|
688
|
+
}
|
|
689
|
+
} else {
|
|
690
|
+
push_.reset();
|
|
691
|
+
next_.reset();
|
|
692
|
+
flusher->AddClosure(intercepted_on_complete_,
|
|
693
|
+
StatusFromMetadata(metadata), "recv_message_done");
|
|
694
|
+
state_ = State::kCancelled;
|
|
695
|
+
}
|
|
696
|
+
} break;
|
|
697
|
+
case State::kBatchCompleted:
|
|
698
|
+
case State::kBatchCompletedNoPipe:
|
|
699
|
+
case State::kBatchCompletedButCancelled:
|
|
700
|
+
Crash(absl::StrFormat("ILLEGAL STATE: %s", StateString(state_)));
|
|
701
|
+
case State::kCancelledWhilstIdle:
|
|
702
|
+
case State::kCancelledWhilstForwarding:
|
|
703
|
+
case State::kCancelled:
|
|
704
|
+
break;
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
void BaseCallData::ReceiveMessage::WakeInsideCombiner(Flusher* flusher) {
|
|
709
|
+
if (grpc_trace_channel.enabled()) {
|
|
710
|
+
gpr_log(GPR_INFO,
|
|
711
|
+
"%s ReceiveMessage.WakeInsideCombiner st=%s push?=%s next?=%s",
|
|
712
|
+
base_->LogTag().c_str(), StateString(state_),
|
|
713
|
+
push_.has_value() ? "yes" : "no", next_.has_value() ? "yes" : "no");
|
|
714
|
+
}
|
|
715
|
+
switch (state_) {
|
|
716
|
+
case State::kInitial:
|
|
717
|
+
case State::kIdle:
|
|
718
|
+
case State::kForwardedBatchNoPipe:
|
|
719
|
+
case State::kForwardedBatch:
|
|
720
|
+
case State::kCancelled:
|
|
721
|
+
case State::kCancelledWhilstForwarding:
|
|
722
|
+
case State::kBatchCompletedNoPipe:
|
|
723
|
+
break;
|
|
724
|
+
case State::kCancelledWhilstIdle:
|
|
725
|
+
sender_->Close();
|
|
726
|
+
state_ = State::kCancelled;
|
|
727
|
+
break;
|
|
728
|
+
case State::kBatchCompletedButCancelled:
|
|
729
|
+
sender_->Close();
|
|
730
|
+
state_ = State::kCancelled;
|
|
731
|
+
flusher->AddClosure(std::exchange(intercepted_on_complete_, nullptr),
|
|
732
|
+
completed_status_, "recv_message");
|
|
733
|
+
break;
|
|
734
|
+
case State::kBatchCompleted:
|
|
735
|
+
if (completed_status_.ok() && intercepted_slice_buffer_->has_value()) {
|
|
736
|
+
state_ = State::kPushedToPipe;
|
|
737
|
+
auto message = GetContext<Arena>()->MakePooled<Message>();
|
|
738
|
+
message->payload()->Swap(&**intercepted_slice_buffer_);
|
|
739
|
+
message->mutable_flags() = *intercepted_flags_;
|
|
740
|
+
push_ = sender_->Push(std::move(message));
|
|
741
|
+
next_ = pipe_.receiver.Next();
|
|
742
|
+
} else {
|
|
743
|
+
sender_->Close();
|
|
744
|
+
state_ = State::kCancelled;
|
|
745
|
+
flusher->AddClosure(std::exchange(intercepted_on_complete_, nullptr),
|
|
746
|
+
completed_status_, "recv_message");
|
|
747
|
+
break;
|
|
748
|
+
}
|
|
749
|
+
GPR_ASSERT(state_ == State::kPushedToPipe);
|
|
750
|
+
ABSL_FALLTHROUGH_INTENDED;
|
|
751
|
+
case State::kCompletedWhilePushedToPipe:
|
|
752
|
+
case State::kPushedToPipe: {
|
|
753
|
+
GPR_ASSERT(push_.has_value());
|
|
754
|
+
auto r_push = (*push_)();
|
|
755
|
+
if (auto* p = absl::get_if<bool>(&r_push)) {
|
|
756
|
+
if (grpc_trace_channel.enabled()) {
|
|
757
|
+
gpr_log(GPR_INFO,
|
|
758
|
+
"%s ReceiveMessage.WakeInsideCombiner push complete: %s",
|
|
759
|
+
base_->LogTag().c_str(), *p ? "true" : "false");
|
|
760
|
+
}
|
|
761
|
+
// We haven't pulled through yet, so this certainly shouldn't succeed.
|
|
762
|
+
GPR_ASSERT(!*p);
|
|
763
|
+
state_ = State::kCancelled;
|
|
764
|
+
break;
|
|
765
|
+
}
|
|
766
|
+
GPR_ASSERT(next_.has_value());
|
|
767
|
+
auto r_next = (*next_)();
|
|
768
|
+
if (auto* p = absl::get_if<NextResult<MessageHandle>>(&r_next)) {
|
|
769
|
+
if (grpc_trace_channel.enabled()) {
|
|
770
|
+
gpr_log(GPR_INFO,
|
|
771
|
+
"%s ReceiveMessage.WakeInsideCombiner next complete: %s",
|
|
772
|
+
base_->LogTag().c_str(),
|
|
773
|
+
p->has_value() ? "got message" : "end of stream");
|
|
774
|
+
}
|
|
775
|
+
next_.reset();
|
|
776
|
+
if (p->has_value()) {
|
|
777
|
+
*intercepted_slice_buffer_ = std::move(*(**p)->payload());
|
|
778
|
+
*intercepted_flags_ = (**p)->flags();
|
|
779
|
+
if (state_ == State::kCompletedWhilePushedToPipe) {
|
|
780
|
+
state_ = State::kCompletedWhilePulledFromPipe;
|
|
781
|
+
} else {
|
|
782
|
+
state_ = State::kPulledFromPipe;
|
|
783
|
+
}
|
|
784
|
+
} else {
|
|
785
|
+
*intercepted_slice_buffer_ = absl::nullopt;
|
|
786
|
+
*intercepted_flags_ = 0;
|
|
787
|
+
state_ = State::kCancelled;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
if (state_ != State::kPulledFromPipe &&
|
|
792
|
+
state_ != State::kCompletedWhilePulledFromPipe) {
|
|
793
|
+
break;
|
|
794
|
+
}
|
|
795
|
+
ABSL_FALLTHROUGH_INTENDED;
|
|
796
|
+
case State::kCompletedWhilePulledFromPipe:
|
|
797
|
+
case State::kPulledFromPipe: {
|
|
798
|
+
GPR_ASSERT(push_.has_value());
|
|
799
|
+
if (!absl::holds_alternative<Pending>((*push_)())) {
|
|
800
|
+
if (grpc_trace_channel.enabled()) {
|
|
801
|
+
gpr_log(GPR_INFO,
|
|
802
|
+
"%s ReceiveMessage.WakeInsideCombiner push complete",
|
|
803
|
+
base_->LogTag().c_str());
|
|
804
|
+
}
|
|
805
|
+
if (state_ == State::kCompletedWhilePulledFromPipe) {
|
|
806
|
+
sender_->Close();
|
|
807
|
+
state_ = State::kCancelled;
|
|
808
|
+
} else {
|
|
809
|
+
state_ = State::kIdle;
|
|
810
|
+
}
|
|
811
|
+
push_.reset();
|
|
812
|
+
flusher->AddClosure(std::exchange(intercepted_on_complete_, nullptr),
|
|
813
|
+
absl::OkStatus(), "recv_message");
|
|
814
|
+
}
|
|
815
|
+
break;
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
|
|
208
820
|
///////////////////////////////////////////////////////////////////////////////
|
|
209
821
|
// ClientCallData
|
|
210
822
|
|
|
@@ -228,6 +840,8 @@ struct ClientCallData::RecvInitialMetadata final {
|
|
|
228
840
|
kCompleteAndSetLatch,
|
|
229
841
|
// Called the original callback
|
|
230
842
|
kResponded,
|
|
843
|
+
// Called the original callback with an error: still need to set the latch
|
|
844
|
+
kRespondedButNeedToSetLatch,
|
|
231
845
|
};
|
|
232
846
|
|
|
233
847
|
State state = kInitial;
|
|
@@ -235,6 +849,32 @@ struct ClientCallData::RecvInitialMetadata final {
|
|
|
235
849
|
grpc_closure on_ready;
|
|
236
850
|
grpc_metadata_batch* metadata = nullptr;
|
|
237
851
|
Latch<ServerMetadata*>* server_initial_metadata_publisher = nullptr;
|
|
852
|
+
|
|
853
|
+
static const char* StateString(State state) {
|
|
854
|
+
switch (state) {
|
|
855
|
+
case kInitial:
|
|
856
|
+
return "INITIAL";
|
|
857
|
+
case kGotLatch:
|
|
858
|
+
return "GOT_LATCH";
|
|
859
|
+
case kRespondedToTrailingMetadataPriorToHook:
|
|
860
|
+
return "RESPONDED_TO_TRAILING_METADATA_PRIOR_TO_HOOK";
|
|
861
|
+
case kHookedWaitingForLatch:
|
|
862
|
+
return "HOOKED_WAITING_FOR_LATCH";
|
|
863
|
+
case kHookedAndGotLatch:
|
|
864
|
+
return "HOOKED_AND_GOT_LATCH";
|
|
865
|
+
case kCompleteWaitingForLatch:
|
|
866
|
+
return "COMPLETE_WAITING_FOR_LATCH";
|
|
867
|
+
case kCompleteAndGotLatch:
|
|
868
|
+
return "COMPLETE_AND_GOT_LATCH";
|
|
869
|
+
case kCompleteAndSetLatch:
|
|
870
|
+
return "COMPLETE_AND_SET_LATCH";
|
|
871
|
+
case kResponded:
|
|
872
|
+
return "RESPONDED";
|
|
873
|
+
case kRespondedButNeedToSetLatch:
|
|
874
|
+
return "RESPONDED_BUT_NEED_TO_SET_LATCH";
|
|
875
|
+
}
|
|
876
|
+
return "UNKNOWN";
|
|
877
|
+
}
|
|
238
878
|
};
|
|
239
879
|
|
|
240
880
|
class ClientCallData::PollContext {
|
|
@@ -252,8 +892,18 @@ class ClientCallData::PollContext {
|
|
|
252
892
|
PollContext& operator=(const PollContext&) = delete;
|
|
253
893
|
|
|
254
894
|
void Run() {
|
|
895
|
+
if (grpc_trace_channel.enabled()) {
|
|
896
|
+
gpr_log(GPR_INFO, "%s ClientCallData.PollContext.Run %s",
|
|
897
|
+
self_->LogTag().c_str(), self_->DebugString().c_str());
|
|
898
|
+
}
|
|
255
899
|
GPR_ASSERT(have_scoped_activity_);
|
|
256
900
|
repoll_ = false;
|
|
901
|
+
if (self_->send_message() != nullptr) {
|
|
902
|
+
self_->send_message()->WakeInsideCombiner(flusher_);
|
|
903
|
+
}
|
|
904
|
+
if (self_->receive_message() != nullptr) {
|
|
905
|
+
self_->receive_message()->WakeInsideCombiner(flusher_);
|
|
906
|
+
}
|
|
257
907
|
if (self_->server_initial_metadata_latch() != nullptr) {
|
|
258
908
|
switch (self_->recv_initial_metadata_->state) {
|
|
259
909
|
case RecvInitialMetadata::kInitial:
|
|
@@ -264,6 +914,12 @@ class ClientCallData::PollContext {
|
|
|
264
914
|
case RecvInitialMetadata::kResponded:
|
|
265
915
|
case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
|
|
266
916
|
break;
|
|
917
|
+
case RecvInitialMetadata::kRespondedButNeedToSetLatch:
|
|
918
|
+
self_->recv_initial_metadata_->server_initial_metadata_publisher->Set(
|
|
919
|
+
nullptr);
|
|
920
|
+
self_->recv_initial_metadata_->state =
|
|
921
|
+
RecvInitialMetadata::kResponded;
|
|
922
|
+
break;
|
|
267
923
|
case RecvInitialMetadata::kCompleteAndGotLatch:
|
|
268
924
|
self_->recv_initial_metadata_->state =
|
|
269
925
|
RecvInitialMetadata::kCompleteAndSetLatch;
|
|
@@ -283,7 +939,7 @@ class ClientCallData::PollContext {
|
|
|
283
939
|
flusher_->AddClosure(
|
|
284
940
|
std::exchange(self_->recv_initial_metadata_->original_on_ready,
|
|
285
941
|
nullptr),
|
|
286
|
-
|
|
942
|
+
absl::OkStatus(),
|
|
287
943
|
"wake_inside_combiner:recv_initial_metadata_ready");
|
|
288
944
|
}
|
|
289
945
|
} break;
|
|
@@ -298,20 +954,30 @@ class ClientCallData::PollContext {
|
|
|
298
954
|
case SendInitialState::kForwarded: {
|
|
299
955
|
// Poll the promise once since we're waiting for it.
|
|
300
956
|
Poll<ServerMetadataHandle> poll = self_->promise_();
|
|
957
|
+
if (grpc_trace_channel.enabled()) {
|
|
958
|
+
gpr_log(GPR_INFO, "%s ClientCallData.PollContext.Run: poll=%s",
|
|
959
|
+
self_->LogTag().c_str(),
|
|
960
|
+
PollToString(poll, [](const ServerMetadataHandle& h) {
|
|
961
|
+
return h->DebugString();
|
|
962
|
+
}).c_str());
|
|
963
|
+
}
|
|
301
964
|
if (auto* r = absl::get_if<ServerMetadataHandle>(&poll)) {
|
|
302
|
-
auto
|
|
303
|
-
|
|
965
|
+
auto md = std::move(*r);
|
|
966
|
+
if (self_->send_message() != nullptr) {
|
|
967
|
+
self_->send_message()->Done(*md);
|
|
968
|
+
}
|
|
969
|
+
if (self_->receive_message() != nullptr) {
|
|
970
|
+
self_->receive_message()->Done(*md, flusher_);
|
|
971
|
+
}
|
|
304
972
|
if (self_->recv_trailing_state_ == RecvTrailingState::kComplete) {
|
|
305
|
-
if (self_->recv_trailing_metadata_ != md) {
|
|
973
|
+
if (self_->recv_trailing_metadata_ != md.get()) {
|
|
306
974
|
*self_->recv_trailing_metadata_ = std::move(*md);
|
|
307
|
-
} else {
|
|
308
|
-
destroy_md = false;
|
|
309
975
|
}
|
|
310
976
|
self_->recv_trailing_state_ = RecvTrailingState::kResponded;
|
|
311
977
|
flusher_->AddClosure(
|
|
312
978
|
std::exchange(self_->original_recv_trailing_metadata_ready_,
|
|
313
979
|
nullptr),
|
|
314
|
-
|
|
980
|
+
absl::OkStatus(), "wake_inside_combiner:recv_trailing_ready:1");
|
|
315
981
|
if (self_->recv_initial_metadata_ != nullptr) {
|
|
316
982
|
switch (self_->recv_initial_metadata_->state) {
|
|
317
983
|
case RecvInitialMetadata::kInitial:
|
|
@@ -321,7 +987,11 @@ class ClientCallData::PollContext {
|
|
|
321
987
|
break;
|
|
322
988
|
case RecvInitialMetadata::
|
|
323
989
|
kRespondedToTrailingMetadataPriorToHook:
|
|
324
|
-
|
|
990
|
+
case RecvInitialMetadata::kRespondedButNeedToSetLatch:
|
|
991
|
+
Crash(absl::StrFormat("ILLEGAL STATE: %s",
|
|
992
|
+
RecvInitialMetadata::StateString(
|
|
993
|
+
self_->recv_initial_metadata_
|
|
994
|
+
->state))); // not reachable
|
|
325
995
|
break;
|
|
326
996
|
case RecvInitialMetadata::kHookedWaitingForLatch:
|
|
327
997
|
case RecvInitialMetadata::kHookedAndGotLatch:
|
|
@@ -336,24 +1006,13 @@ class ClientCallData::PollContext {
|
|
|
336
1006
|
std::exchange(
|
|
337
1007
|
self_->recv_initial_metadata_->original_on_ready,
|
|
338
1008
|
nullptr),
|
|
339
|
-
|
|
1009
|
+
absl::CancelledError(),
|
|
340
1010
|
"wake_inside_combiner:recv_initial_metadata_ready");
|
|
341
1011
|
}
|
|
342
1012
|
}
|
|
343
1013
|
} else {
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
grpc_error_handle error = grpc_error_set_int(
|
|
347
|
-
GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
|
348
|
-
"early return from promise based filter"),
|
|
349
|
-
GRPC_ERROR_INT_GRPC_STATUS,
|
|
350
|
-
*md->get_pointer(GrpcStatusMetadata()));
|
|
351
|
-
if (auto* message = md->get_pointer(GrpcMessageMetadata())) {
|
|
352
|
-
error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE,
|
|
353
|
-
message->as_string_view());
|
|
354
|
-
}
|
|
355
|
-
GRPC_ERROR_UNREF(self_->cancelled_error_);
|
|
356
|
-
self_->cancelled_error_ = GRPC_ERROR_REF(error);
|
|
1014
|
+
self_->cancelled_error_ = StatusFromMetadata(*md);
|
|
1015
|
+
GPR_ASSERT(!self_->cancelled_error_.ok());
|
|
357
1016
|
if (self_->recv_initial_metadata_ != nullptr) {
|
|
358
1017
|
switch (self_->recv_initial_metadata_->state) {
|
|
359
1018
|
case RecvInitialMetadata::kInitial:
|
|
@@ -367,7 +1026,11 @@ class ClientCallData::PollContext {
|
|
|
367
1026
|
break;
|
|
368
1027
|
case RecvInitialMetadata::
|
|
369
1028
|
kRespondedToTrailingMetadataPriorToHook:
|
|
370
|
-
|
|
1029
|
+
case RecvInitialMetadata::kRespondedButNeedToSetLatch:
|
|
1030
|
+
Crash(absl::StrFormat("ILLEGAL STATE: %s",
|
|
1031
|
+
RecvInitialMetadata::StateString(
|
|
1032
|
+
self_->recv_initial_metadata_
|
|
1033
|
+
->state))); // not reachable
|
|
371
1034
|
break;
|
|
372
1035
|
case RecvInitialMetadata::kCompleteWaitingForLatch:
|
|
373
1036
|
case RecvInitialMetadata::kCompleteAndGotLatch:
|
|
@@ -378,18 +1041,19 @@ class ClientCallData::PollContext {
|
|
|
378
1041
|
std::exchange(
|
|
379
1042
|
self_->recv_initial_metadata_->original_on_ready,
|
|
380
1043
|
nullptr),
|
|
381
|
-
|
|
1044
|
+
self_->cancelled_error_,
|
|
382
1045
|
"wake_inside_combiner:recv_initial_metadata_ready");
|
|
383
1046
|
}
|
|
384
1047
|
}
|
|
385
1048
|
if (self_->send_initial_state_ == SendInitialState::kQueued) {
|
|
386
1049
|
self_->send_initial_state_ = SendInitialState::kCancelled;
|
|
387
|
-
self_->send_initial_metadata_batch_.CancelWith(
|
|
1050
|
+
self_->send_initial_metadata_batch_.CancelWith(
|
|
1051
|
+
self_->cancelled_error_, flusher_);
|
|
388
1052
|
} else {
|
|
389
1053
|
GPR_ASSERT(
|
|
390
1054
|
self_->recv_trailing_state_ == RecvTrailingState::kInitial ||
|
|
391
1055
|
self_->recv_trailing_state_ == RecvTrailingState::kForwarded);
|
|
392
|
-
self_->call_combiner()->Cancel(
|
|
1056
|
+
self_->call_combiner()->Cancel(self_->cancelled_error_);
|
|
393
1057
|
CapturedBatch b(grpc_make_transport_stream_op(GRPC_CLOSURE_CREATE(
|
|
394
1058
|
[](void* p, grpc_error_handle) {
|
|
395
1059
|
GRPC_CALL_COMBINER_STOP(static_cast<CallCombiner*>(p),
|
|
@@ -397,17 +1061,15 @@ class ClientCallData::PollContext {
|
|
|
397
1061
|
},
|
|
398
1062
|
self_->call_combiner(), nullptr)));
|
|
399
1063
|
b->cancel_stream = true;
|
|
400
|
-
b->payload->cancel_stream.cancel_error =
|
|
1064
|
+
b->payload->cancel_stream.cancel_error = self_->cancelled_error_;
|
|
401
1065
|
b.ResumeWith(flusher_);
|
|
402
1066
|
}
|
|
1067
|
+
self_->cancelling_metadata_ = std::move(md);
|
|
403
1068
|
self_->recv_trailing_state_ = RecvTrailingState::kCancelled;
|
|
404
1069
|
}
|
|
405
|
-
|
|
406
|
-
md->~grpc_metadata_batch();
|
|
407
|
-
}
|
|
1070
|
+
self_->promise_ = ArenaPromise<ServerMetadataHandle>();
|
|
408
1071
|
scoped_activity_.Destroy();
|
|
409
1072
|
have_scoped_activity_ = false;
|
|
410
|
-
self_->promise_ = ArenaPromise<ServerMetadataHandle>();
|
|
411
1073
|
}
|
|
412
1074
|
} break;
|
|
413
1075
|
case SendInitialState::kInitial:
|
|
@@ -420,7 +1082,7 @@ class ClientCallData::PollContext {
|
|
|
420
1082
|
flusher_->AddClosure(
|
|
421
1083
|
std::exchange(self_->original_recv_trailing_metadata_ready_,
|
|
422
1084
|
nullptr),
|
|
423
|
-
|
|
1085
|
+
absl::OkStatus(), "wake_inside_combiner:recv_trailing_ready:2");
|
|
424
1086
|
}
|
|
425
1087
|
break;
|
|
426
1088
|
}
|
|
@@ -445,12 +1107,12 @@ class ClientCallData::PollContext {
|
|
|
445
1107
|
};
|
|
446
1108
|
// Unique ptr --> release to suppress clang-tidy warnings about allocating
|
|
447
1109
|
// in a destructor.
|
|
448
|
-
auto* p =
|
|
1110
|
+
auto* p = std::make_unique<NextPoll>().release();
|
|
449
1111
|
p->call_stack = self_->call_stack();
|
|
450
1112
|
p->call_data = self_;
|
|
451
1113
|
GRPC_CALL_STACK_REF(self_->call_stack(), "re-poll");
|
|
452
1114
|
GRPC_CLOSURE_INIT(p, run, p, nullptr);
|
|
453
|
-
flusher_->AddClosure(p,
|
|
1115
|
+
flusher_->AddClosure(p, absl::OkStatus(), "re-poll");
|
|
454
1116
|
}
|
|
455
1117
|
}
|
|
456
1118
|
|
|
@@ -482,7 +1144,6 @@ ClientCallData::ClientCallData(grpc_call_element* elem,
|
|
|
482
1144
|
|
|
483
1145
|
ClientCallData::~ClientCallData() {
|
|
484
1146
|
GPR_ASSERT(poll_ctx_ == nullptr);
|
|
485
|
-
GRPC_ERROR_UNREF(cancelled_error_);
|
|
486
1147
|
if (recv_initial_metadata_ != nullptr) {
|
|
487
1148
|
recv_initial_metadata_->~RecvInitialMetadata();
|
|
488
1149
|
}
|
|
@@ -494,6 +1155,58 @@ void ClientCallData::ForceImmediateRepoll() {
|
|
|
494
1155
|
poll_ctx_->Repoll();
|
|
495
1156
|
}
|
|
496
1157
|
|
|
1158
|
+
const char* ClientCallData::StateString(SendInitialState state) {
|
|
1159
|
+
switch (state) {
|
|
1160
|
+
case SendInitialState::kInitial:
|
|
1161
|
+
return "INITIAL";
|
|
1162
|
+
case SendInitialState::kQueued:
|
|
1163
|
+
return "QUEUED";
|
|
1164
|
+
case SendInitialState::kForwarded:
|
|
1165
|
+
return "FORWARDED";
|
|
1166
|
+
case SendInitialState::kCancelled:
|
|
1167
|
+
return "CANCELLED";
|
|
1168
|
+
}
|
|
1169
|
+
return "UNKNOWN";
|
|
1170
|
+
}
|
|
1171
|
+
|
|
1172
|
+
const char* ClientCallData::StateString(RecvTrailingState state) {
|
|
1173
|
+
switch (state) {
|
|
1174
|
+
case RecvTrailingState::kInitial:
|
|
1175
|
+
return "INITIAL";
|
|
1176
|
+
case RecvTrailingState::kQueued:
|
|
1177
|
+
return "QUEUED";
|
|
1178
|
+
case RecvTrailingState::kComplete:
|
|
1179
|
+
return "COMPLETE";
|
|
1180
|
+
case RecvTrailingState::kForwarded:
|
|
1181
|
+
return "FORWARDED";
|
|
1182
|
+
case RecvTrailingState::kCancelled:
|
|
1183
|
+
return "CANCELLED";
|
|
1184
|
+
case RecvTrailingState::kResponded:
|
|
1185
|
+
return "RESPONDED";
|
|
1186
|
+
}
|
|
1187
|
+
return "UNKNOWN";
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
std::string ClientCallData::DebugString() const {
|
|
1191
|
+
std::vector<absl::string_view> captured;
|
|
1192
|
+
if (send_initial_metadata_batch_.is_captured()) {
|
|
1193
|
+
captured.push_back("send_initial_metadata");
|
|
1194
|
+
}
|
|
1195
|
+
if (send_message() != nullptr && send_message()->HaveCapturedBatch()) {
|
|
1196
|
+
captured.push_back("send_message");
|
|
1197
|
+
}
|
|
1198
|
+
return absl::StrCat(
|
|
1199
|
+
"has_promise=", promise_.has_value() ? "true" : "false",
|
|
1200
|
+
" sent_initial_state=", StateString(send_initial_state_),
|
|
1201
|
+
" recv_trailing_state=", StateString(recv_trailing_state_), " captured={",
|
|
1202
|
+
absl::StrJoin(captured, ","), "}",
|
|
1203
|
+
server_initial_metadata_latch() == nullptr
|
|
1204
|
+
? ""
|
|
1205
|
+
: absl::StrCat(" recv_initial_metadata=",
|
|
1206
|
+
RecvInitialMetadata::StateString(
|
|
1207
|
+
recv_initial_metadata_->state)));
|
|
1208
|
+
}
|
|
1209
|
+
|
|
497
1210
|
// Handle one grpc_transport_stream_op_batch
|
|
498
1211
|
void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) {
|
|
499
1212
|
// Fake out the activity based context.
|
|
@@ -501,6 +1214,11 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) {
|
|
|
501
1214
|
CapturedBatch batch(b);
|
|
502
1215
|
Flusher flusher(this);
|
|
503
1216
|
|
|
1217
|
+
if (grpc_trace_channel.enabled()) {
|
|
1218
|
+
gpr_log(GPR_INFO, "%s StartBatch %s", LogTag().c_str(),
|
|
1219
|
+
DebugString().c_str());
|
|
1220
|
+
}
|
|
1221
|
+
|
|
504
1222
|
// If this is a cancel stream, cancel anything we have pending and propagate
|
|
505
1223
|
// the cancellation.
|
|
506
1224
|
if (batch->cancel_stream) {
|
|
@@ -508,9 +1226,10 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) {
|
|
|
508
1226
|
!batch->send_trailing_metadata && !batch->send_message &&
|
|
509
1227
|
!batch->recv_initial_metadata && !batch->recv_message &&
|
|
510
1228
|
!batch->recv_trailing_metadata);
|
|
511
|
-
|
|
1229
|
+
PollContext poll_ctx(this, &flusher);
|
|
1230
|
+
Cancel(batch->payload->cancel_stream.cancel_error, &flusher);
|
|
1231
|
+
poll_ctx.Run();
|
|
512
1232
|
if (is_last()) {
|
|
513
|
-
GRPC_ERROR_UNREF(batch->payload->cancel_stream.cancel_error);
|
|
514
1233
|
batch.CompleteWith(&flusher);
|
|
515
1234
|
} else {
|
|
516
1235
|
batch.ResumeWith(&flusher);
|
|
@@ -537,7 +1256,11 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) {
|
|
|
537
1256
|
case RecvInitialMetadata::kCompleteAndGotLatch:
|
|
538
1257
|
case RecvInitialMetadata::kCompleteAndSetLatch:
|
|
539
1258
|
case RecvInitialMetadata::kResponded:
|
|
540
|
-
|
|
1259
|
+
case RecvInitialMetadata::kRespondedButNeedToSetLatch:
|
|
1260
|
+
Crash(absl::StrFormat(
|
|
1261
|
+
"ILLEGAL STATE: %s",
|
|
1262
|
+
RecvInitialMetadata::StateString(
|
|
1263
|
+
recv_initial_metadata_->state))); // unreachable
|
|
541
1264
|
}
|
|
542
1265
|
if (hook) {
|
|
543
1266
|
auto cb = [](void* ptr, grpc_error_handle error) {
|
|
@@ -554,13 +1277,23 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) {
|
|
|
554
1277
|
}
|
|
555
1278
|
}
|
|
556
1279
|
|
|
1280
|
+
bool wake = false;
|
|
1281
|
+
if (send_message() != nullptr && batch->send_message) {
|
|
1282
|
+
send_message()->StartOp(batch);
|
|
1283
|
+
wake = true;
|
|
1284
|
+
}
|
|
1285
|
+
if (receive_message() != nullptr && batch->recv_message) {
|
|
1286
|
+
receive_message()->StartOp(batch);
|
|
1287
|
+
wake = true;
|
|
1288
|
+
}
|
|
1289
|
+
|
|
557
1290
|
// send_initial_metadata: seeing this triggers the start of the promise part
|
|
558
1291
|
// of this filter.
|
|
559
1292
|
if (batch->send_initial_metadata) {
|
|
560
1293
|
// If we're already cancelled, just terminate the batch.
|
|
561
1294
|
if (send_initial_state_ == SendInitialState::kCancelled ||
|
|
562
1295
|
recv_trailing_state_ == RecvTrailingState::kCancelled) {
|
|
563
|
-
batch.CancelWith(
|
|
1296
|
+
batch.CancelWith(cancelled_error_, &flusher);
|
|
564
1297
|
} else {
|
|
565
1298
|
// Otherwise, we should not have seen a send_initial_metadata op yet.
|
|
566
1299
|
GPR_ASSERT(send_initial_state_ == SendInitialState::kInitial);
|
|
@@ -575,35 +1308,43 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) {
|
|
|
575
1308
|
send_initial_metadata_batch_ = batch;
|
|
576
1309
|
// And kick start the promise.
|
|
577
1310
|
StartPromise(&flusher);
|
|
1311
|
+
wake = false;
|
|
578
1312
|
}
|
|
579
1313
|
} else if (batch->recv_trailing_metadata) {
|
|
580
1314
|
// recv_trailing_metadata *without* send_initial_metadata: hook it so we
|
|
581
1315
|
// can respond to it, and push it down.
|
|
582
1316
|
if (recv_trailing_state_ == RecvTrailingState::kCancelled) {
|
|
583
|
-
batch.CancelWith(
|
|
1317
|
+
batch.CancelWith(cancelled_error_, &flusher);
|
|
584
1318
|
} else {
|
|
585
1319
|
GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kInitial);
|
|
586
1320
|
recv_trailing_state_ = RecvTrailingState::kForwarded;
|
|
587
1321
|
HookRecvTrailingMetadata(batch);
|
|
588
1322
|
}
|
|
589
|
-
} else if (!
|
|
590
|
-
batch.CancelWith(
|
|
1323
|
+
} else if (!cancelled_error_.ok()) {
|
|
1324
|
+
batch.CancelWith(cancelled_error_, &flusher);
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
if (wake) {
|
|
1328
|
+
PollContext(this, &flusher).Run();
|
|
591
1329
|
}
|
|
592
1330
|
|
|
593
1331
|
if (batch.is_captured()) {
|
|
594
1332
|
if (!is_last()) {
|
|
595
1333
|
batch.ResumeWith(&flusher);
|
|
596
1334
|
} else {
|
|
597
|
-
batch.CancelWith(
|
|
1335
|
+
batch.CancelWith(absl::CancelledError(), &flusher);
|
|
598
1336
|
}
|
|
599
1337
|
}
|
|
600
1338
|
}
|
|
601
1339
|
|
|
602
1340
|
// Handle cancellation.
|
|
603
|
-
void ClientCallData::Cancel(grpc_error_handle error) {
|
|
1341
|
+
void ClientCallData::Cancel(grpc_error_handle error, Flusher* flusher) {
|
|
1342
|
+
if (grpc_trace_channel.enabled()) {
|
|
1343
|
+
gpr_log(GPR_INFO, "%s Cancel error=%s", LogTag().c_str(),
|
|
1344
|
+
error.ToString().c_str());
|
|
1345
|
+
}
|
|
604
1346
|
// Track the latest reason for cancellation.
|
|
605
|
-
|
|
606
|
-
cancelled_error_ = GRPC_ERROR_REF(error);
|
|
1347
|
+
cancelled_error_ = error;
|
|
607
1348
|
// Stop running the promise.
|
|
608
1349
|
promise_ = ArenaPromise<ServerMetadataHandle>();
|
|
609
1350
|
// If we have an op queued, fail that op.
|
|
@@ -613,27 +1354,7 @@ void ClientCallData::Cancel(grpc_error_handle error) {
|
|
|
613
1354
|
if (recv_trailing_state_ == RecvTrailingState::kQueued) {
|
|
614
1355
|
recv_trailing_state_ = RecvTrailingState::kCancelled;
|
|
615
1356
|
}
|
|
616
|
-
|
|
617
|
-
CapturedBatch batch;
|
|
618
|
-
ClientCallData* call;
|
|
619
|
-
};
|
|
620
|
-
auto fail = [](void* p, grpc_error_handle error) {
|
|
621
|
-
auto* f = static_cast<FailBatch*>(p);
|
|
622
|
-
{
|
|
623
|
-
Flusher flusher(f->call);
|
|
624
|
-
f->batch.CancelWith(GRPC_ERROR_REF(error), &flusher);
|
|
625
|
-
GRPC_CALL_STACK_UNREF(f->call->call_stack(), "cancel pending batch");
|
|
626
|
-
}
|
|
627
|
-
delete f;
|
|
628
|
-
};
|
|
629
|
-
auto* b = new FailBatch();
|
|
630
|
-
GRPC_CLOSURE_INIT(b, fail, b, nullptr);
|
|
631
|
-
b->batch = std::move(send_initial_metadata_batch_);
|
|
632
|
-
b->call = this;
|
|
633
|
-
GRPC_CALL_STACK_REF(call_stack(), "cancel pending batch");
|
|
634
|
-
GRPC_CALL_COMBINER_START(call_combiner(), b,
|
|
635
|
-
GRPC_ERROR_REF(cancelled_error_),
|
|
636
|
-
"cancel pending batch");
|
|
1357
|
+
send_initial_metadata_batch_.CancelWith(error, flusher);
|
|
637
1358
|
} else {
|
|
638
1359
|
send_initial_state_ = SendInitialState::kCancelled;
|
|
639
1360
|
}
|
|
@@ -646,7 +1367,7 @@ void ClientCallData::Cancel(grpc_error_handle error) {
|
|
|
646
1367
|
GRPC_CALL_COMBINER_START(
|
|
647
1368
|
call_combiner(),
|
|
648
1369
|
std::exchange(recv_initial_metadata_->original_on_ready, nullptr),
|
|
649
|
-
|
|
1370
|
+
error, "propagate cancellation");
|
|
650
1371
|
break;
|
|
651
1372
|
case RecvInitialMetadata::kInitial:
|
|
652
1373
|
case RecvInitialMetadata::kGotLatch:
|
|
@@ -655,8 +1376,19 @@ void ClientCallData::Cancel(grpc_error_handle error) {
|
|
|
655
1376
|
case RecvInitialMetadata::kHookedAndGotLatch:
|
|
656
1377
|
case RecvInitialMetadata::kResponded:
|
|
657
1378
|
break;
|
|
1379
|
+
case RecvInitialMetadata::kRespondedButNeedToSetLatch:
|
|
1380
|
+
Crash(absl::StrFormat(
|
|
1381
|
+
"ILLEGAL STATE: %s",
|
|
1382
|
+
RecvInitialMetadata::StateString(recv_initial_metadata_->state)));
|
|
1383
|
+
break;
|
|
658
1384
|
}
|
|
659
1385
|
}
|
|
1386
|
+
if (send_message() != nullptr) {
|
|
1387
|
+
send_message()->Done(*ServerMetadataFromStatus(error));
|
|
1388
|
+
}
|
|
1389
|
+
if (receive_message() != nullptr) {
|
|
1390
|
+
receive_message()->Done(*ServerMetadataFromStatus(error), flusher);
|
|
1391
|
+
}
|
|
660
1392
|
}
|
|
661
1393
|
|
|
662
1394
|
// Begin running the promise - which will ultimately take some initial
|
|
@@ -670,7 +1402,8 @@ void ClientCallData::StartPromise(Flusher* flusher) {
|
|
|
670
1402
|
promise_ = filter->MakeCallPromise(
|
|
671
1403
|
CallArgs{WrapMetadata(send_initial_metadata_batch_->payload
|
|
672
1404
|
->send_initial_metadata.send_initial_metadata),
|
|
673
|
-
server_initial_metadata_latch()
|
|
1405
|
+
server_initial_metadata_latch(), outgoing_messages_pipe(),
|
|
1406
|
+
incoming_messages_pipe()},
|
|
674
1407
|
[this](CallArgs call_args) {
|
|
675
1408
|
return MakeNextPromise(std::move(call_args));
|
|
676
1409
|
});
|
|
@@ -678,36 +1411,66 @@ void ClientCallData::StartPromise(Flusher* flusher) {
|
|
|
678
1411
|
}
|
|
679
1412
|
|
|
680
1413
|
void ClientCallData::RecvInitialMetadataReady(grpc_error_handle error) {
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
recv_initial_metadata_->state =
|
|
685
|
-
RecvInitialMetadata::kCompleteWaitingForLatch;
|
|
686
|
-
break;
|
|
687
|
-
case RecvInitialMetadata::kHookedAndGotLatch:
|
|
688
|
-
recv_initial_metadata_->state = RecvInitialMetadata::kCompleteAndGotLatch;
|
|
689
|
-
break;
|
|
690
|
-
case RecvInitialMetadata::kInitial:
|
|
691
|
-
case RecvInitialMetadata::kGotLatch:
|
|
692
|
-
case RecvInitialMetadata::kCompleteWaitingForLatch:
|
|
693
|
-
case RecvInitialMetadata::kCompleteAndGotLatch:
|
|
694
|
-
case RecvInitialMetadata::kCompleteAndSetLatch:
|
|
695
|
-
case RecvInitialMetadata::kResponded:
|
|
696
|
-
case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
|
|
697
|
-
abort(); // unreachable
|
|
1414
|
+
if (grpc_trace_channel.enabled()) {
|
|
1415
|
+
gpr_log(GPR_INFO, "%s ClientCallData.RecvInitialMetadataReady %s",
|
|
1416
|
+
LogTag().c_str(), DebugString().c_str());
|
|
698
1417
|
}
|
|
1418
|
+
ScopedContext context(this);
|
|
699
1419
|
Flusher flusher(this);
|
|
700
|
-
if (!
|
|
701
|
-
recv_initial_metadata_->state
|
|
1420
|
+
if (!error.ok()) {
|
|
1421
|
+
switch (recv_initial_metadata_->state) {
|
|
1422
|
+
case RecvInitialMetadata::kHookedWaitingForLatch:
|
|
1423
|
+
recv_initial_metadata_->state = RecvInitialMetadata::kResponded;
|
|
1424
|
+
break;
|
|
1425
|
+
case RecvInitialMetadata::kHookedAndGotLatch:
|
|
1426
|
+
recv_initial_metadata_->state =
|
|
1427
|
+
RecvInitialMetadata::kRespondedButNeedToSetLatch;
|
|
1428
|
+
break;
|
|
1429
|
+
case RecvInitialMetadata::kInitial:
|
|
1430
|
+
case RecvInitialMetadata::kGotLatch:
|
|
1431
|
+
case RecvInitialMetadata::kCompleteWaitingForLatch:
|
|
1432
|
+
case RecvInitialMetadata::kCompleteAndGotLatch:
|
|
1433
|
+
case RecvInitialMetadata::kCompleteAndSetLatch:
|
|
1434
|
+
case RecvInitialMetadata::kResponded:
|
|
1435
|
+
case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
|
|
1436
|
+
case RecvInitialMetadata::kRespondedButNeedToSetLatch:
|
|
1437
|
+
Crash(absl::StrFormat(
|
|
1438
|
+
"ILLEGAL STATE: %s",
|
|
1439
|
+
RecvInitialMetadata::StateString(
|
|
1440
|
+
recv_initial_metadata_->state))); // unreachable
|
|
1441
|
+
}
|
|
702
1442
|
flusher.AddClosure(
|
|
703
1443
|
std::exchange(recv_initial_metadata_->original_on_ready, nullptr),
|
|
704
|
-
|
|
1444
|
+
error, "propagate cancellation");
|
|
705
1445
|
} else if (send_initial_state_ == SendInitialState::kCancelled ||
|
|
706
1446
|
recv_trailing_state_ == RecvTrailingState::kResponded) {
|
|
707
1447
|
recv_initial_metadata_->state = RecvInitialMetadata::kResponded;
|
|
708
1448
|
flusher.AddClosure(
|
|
709
1449
|
std::exchange(recv_initial_metadata_->original_on_ready, nullptr),
|
|
710
|
-
|
|
1450
|
+
cancelled_error_, "propagate cancellation");
|
|
1451
|
+
} else {
|
|
1452
|
+
switch (recv_initial_metadata_->state) {
|
|
1453
|
+
case RecvInitialMetadata::kHookedWaitingForLatch:
|
|
1454
|
+
recv_initial_metadata_->state =
|
|
1455
|
+
RecvInitialMetadata::kCompleteWaitingForLatch;
|
|
1456
|
+
break;
|
|
1457
|
+
case RecvInitialMetadata::kHookedAndGotLatch:
|
|
1458
|
+
recv_initial_metadata_->state =
|
|
1459
|
+
RecvInitialMetadata::kCompleteAndGotLatch;
|
|
1460
|
+
break;
|
|
1461
|
+
case RecvInitialMetadata::kInitial:
|
|
1462
|
+
case RecvInitialMetadata::kGotLatch:
|
|
1463
|
+
case RecvInitialMetadata::kCompleteWaitingForLatch:
|
|
1464
|
+
case RecvInitialMetadata::kCompleteAndGotLatch:
|
|
1465
|
+
case RecvInitialMetadata::kCompleteAndSetLatch:
|
|
1466
|
+
case RecvInitialMetadata::kResponded:
|
|
1467
|
+
case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
|
|
1468
|
+
case RecvInitialMetadata::kRespondedButNeedToSetLatch:
|
|
1469
|
+
Crash(absl::StrFormat(
|
|
1470
|
+
"ILLEGAL STATE: %s",
|
|
1471
|
+
RecvInitialMetadata::StateString(
|
|
1472
|
+
recv_initial_metadata_->state))); // unreachable
|
|
1473
|
+
}
|
|
711
1474
|
}
|
|
712
1475
|
WakeInsideCombiner(&flusher);
|
|
713
1476
|
}
|
|
@@ -730,6 +1493,10 @@ void ClientCallData::HookRecvTrailingMetadata(CapturedBatch batch) {
|
|
|
730
1493
|
// - return a wrapper around PollTrailingMetadata as the promise.
|
|
731
1494
|
ArenaPromise<ServerMetadataHandle> ClientCallData::MakeNextPromise(
|
|
732
1495
|
CallArgs call_args) {
|
|
1496
|
+
if (grpc_trace_channel.enabled()) {
|
|
1497
|
+
gpr_log(GPR_INFO, "%s ClientCallData.MakeNextPromise %s", LogTag().c_str(),
|
|
1498
|
+
DebugString().c_str());
|
|
1499
|
+
}
|
|
733
1500
|
GPR_ASSERT(poll_ctx_ != nullptr);
|
|
734
1501
|
GPR_ASSERT(send_initial_state_ == SendInitialState::kQueued);
|
|
735
1502
|
send_initial_metadata_batch_->payload->send_initial_metadata
|
|
@@ -762,11 +1529,25 @@ ArenaPromise<ServerMetadataHandle> ClientCallData::MakeNextPromise(
|
|
|
762
1529
|
case RecvInitialMetadata::kCompleteAndSetLatch:
|
|
763
1530
|
case RecvInitialMetadata::kResponded:
|
|
764
1531
|
case RecvInitialMetadata::kRespondedToTrailingMetadataPriorToHook:
|
|
765
|
-
|
|
1532
|
+
case RecvInitialMetadata::kRespondedButNeedToSetLatch:
|
|
1533
|
+
Crash(absl::StrFormat(
|
|
1534
|
+
"ILLEGAL STATE: %s",
|
|
1535
|
+
RecvInitialMetadata::StateString(
|
|
1536
|
+
recv_initial_metadata_->state))); // unreachable
|
|
766
1537
|
}
|
|
767
1538
|
} else {
|
|
768
1539
|
GPR_ASSERT(call_args.server_initial_metadata == nullptr);
|
|
769
1540
|
}
|
|
1541
|
+
if (send_message() != nullptr) {
|
|
1542
|
+
send_message()->GotPipe(call_args.outgoing_messages);
|
|
1543
|
+
} else {
|
|
1544
|
+
GPR_ASSERT(call_args.outgoing_messages == nullptr);
|
|
1545
|
+
}
|
|
1546
|
+
if (receive_message() != nullptr) {
|
|
1547
|
+
receive_message()->GotPipe(call_args.incoming_messages);
|
|
1548
|
+
} else {
|
|
1549
|
+
GPR_ASSERT(call_args.incoming_messages == nullptr);
|
|
1550
|
+
}
|
|
770
1551
|
return ArenaPromise<ServerMetadataHandle>(
|
|
771
1552
|
[this]() { return PollTrailingMetadata(); });
|
|
772
1553
|
}
|
|
@@ -776,6 +1557,10 @@ ArenaPromise<ServerMetadataHandle> ClientCallData::MakeNextPromise(
|
|
|
776
1557
|
// All polls: await receiving the trailing metadata, then return it to the
|
|
777
1558
|
// application.
|
|
778
1559
|
Poll<ServerMetadataHandle> ClientCallData::PollTrailingMetadata() {
|
|
1560
|
+
if (grpc_trace_channel.enabled()) {
|
|
1561
|
+
gpr_log(GPR_INFO, "%s ClientCallData.PollTrailingMetadata %s",
|
|
1562
|
+
LogTag().c_str(), DebugString().c_str());
|
|
1563
|
+
}
|
|
779
1564
|
GPR_ASSERT(poll_ctx_ != nullptr);
|
|
780
1565
|
if (send_initial_state_ == SendInitialState::kQueued) {
|
|
781
1566
|
// First poll: pass the send_initial_metadata op down the stack.
|
|
@@ -810,7 +1595,8 @@ Poll<ServerMetadataHandle> ClientCallData::PollTrailingMetadata() {
|
|
|
810
1595
|
case RecvTrailingState::kResponded:
|
|
811
1596
|
// We've already responded to the caller: we can't do anything and we
|
|
812
1597
|
// should never reach here.
|
|
813
|
-
|
|
1598
|
+
Crash(absl::StrFormat("ILLEGAL STATE: %s",
|
|
1599
|
+
StateString(recv_trailing_state_)));
|
|
814
1600
|
}
|
|
815
1601
|
GPR_UNREACHABLE_CODE(return Pending{});
|
|
816
1602
|
}
|
|
@@ -822,24 +1608,40 @@ void ClientCallData::RecvTrailingMetadataReadyCallback(
|
|
|
822
1608
|
|
|
823
1609
|
void ClientCallData::RecvTrailingMetadataReady(grpc_error_handle error) {
|
|
824
1610
|
Flusher flusher(this);
|
|
1611
|
+
if (grpc_trace_channel.enabled()) {
|
|
1612
|
+
gpr_log(GPR_INFO,
|
|
1613
|
+
"%s ClientCallData.RecvTrailingMetadataReady "
|
|
1614
|
+
"recv_trailing_state=%s error=%s md=%s",
|
|
1615
|
+
LogTag().c_str(), StateString(recv_trailing_state_),
|
|
1616
|
+
error.ToString().c_str(),
|
|
1617
|
+
recv_trailing_metadata_->DebugString().c_str());
|
|
1618
|
+
}
|
|
825
1619
|
// If we were cancelled prior to receiving this callback, we should simply
|
|
826
1620
|
// forward the callback up with the same error.
|
|
827
1621
|
if (recv_trailing_state_ == RecvTrailingState::kCancelled) {
|
|
1622
|
+
if (cancelling_metadata_.get() != nullptr) {
|
|
1623
|
+
*recv_trailing_metadata_ = std::move(*cancelling_metadata_);
|
|
1624
|
+
}
|
|
828
1625
|
if (grpc_closure* call_closure =
|
|
829
1626
|
std::exchange(original_recv_trailing_metadata_ready_, nullptr)) {
|
|
830
|
-
flusher.AddClosure(call_closure,
|
|
831
|
-
"propagate failure");
|
|
1627
|
+
flusher.AddClosure(call_closure, error, "propagate failure");
|
|
832
1628
|
}
|
|
833
1629
|
return;
|
|
834
1630
|
}
|
|
835
1631
|
// If there was an error, we'll put that into the trailing metadata and
|
|
836
1632
|
// proceed as if there was not.
|
|
837
|
-
if (!
|
|
1633
|
+
if (!error.ok()) {
|
|
838
1634
|
SetStatusFromError(recv_trailing_metadata_, error);
|
|
839
1635
|
}
|
|
840
1636
|
// Record that we've got the callback.
|
|
841
1637
|
GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kForwarded);
|
|
842
1638
|
recv_trailing_state_ = RecvTrailingState::kComplete;
|
|
1639
|
+
if (receive_message() != nullptr) {
|
|
1640
|
+
receive_message()->Done(*recv_trailing_metadata_, &flusher);
|
|
1641
|
+
}
|
|
1642
|
+
if (send_message() != nullptr) {
|
|
1643
|
+
send_message()->Done(*recv_trailing_metadata_);
|
|
1644
|
+
}
|
|
843
1645
|
// Repoll the promise.
|
|
844
1646
|
ScopedContext context(this);
|
|
845
1647
|
WakeInsideCombiner(&flusher);
|
|
@@ -855,7 +1657,7 @@ void ClientCallData::SetStatusFromError(grpc_metadata_batch* metadata,
|
|
|
855
1657
|
metadata->Set(GrpcStatusMetadata(), status_code);
|
|
856
1658
|
metadata->Set(GrpcMessageMetadata(), Slice::FromCopiedString(status_details));
|
|
857
1659
|
metadata->GetOrCreatePointer(GrpcStatusContext())
|
|
858
|
-
->emplace_back(
|
|
1660
|
+
->emplace_back(StatusToString(error));
|
|
859
1661
|
}
|
|
860
1662
|
|
|
861
1663
|
// Wakeup and poll the promise if appropriate.
|
|
@@ -885,6 +1687,26 @@ struct ServerCallData::SendInitialMetadata {
|
|
|
885
1687
|
State state = kInitial;
|
|
886
1688
|
CapturedBatch batch;
|
|
887
1689
|
Latch<ServerMetadata*>* server_initial_metadata_publisher = nullptr;
|
|
1690
|
+
|
|
1691
|
+
static const char* StateString(State state) {
|
|
1692
|
+
switch (state) {
|
|
1693
|
+
case kInitial:
|
|
1694
|
+
return "INITIAL";
|
|
1695
|
+
case kGotLatch:
|
|
1696
|
+
return "GOT_LATCH";
|
|
1697
|
+
case kQueuedWaitingForLatch:
|
|
1698
|
+
return "QUEUED_WAITING_FOR_LATCH";
|
|
1699
|
+
case kQueuedAndGotLatch:
|
|
1700
|
+
return "QUEUED_AND_GOT_LATCH";
|
|
1701
|
+
case kQueuedAndSetLatch:
|
|
1702
|
+
return "QUEUED_AND_SET_LATCH";
|
|
1703
|
+
case kForwarded:
|
|
1704
|
+
return "FORWARDED";
|
|
1705
|
+
case kCancelled:
|
|
1706
|
+
return "CANCELLED";
|
|
1707
|
+
}
|
|
1708
|
+
return "UNKNOWN";
|
|
1709
|
+
}
|
|
888
1710
|
};
|
|
889
1711
|
|
|
890
1712
|
class ServerCallData::PollContext {
|
|
@@ -917,12 +1739,12 @@ class ServerCallData::PollContext {
|
|
|
917
1739
|
GRPC_CALL_STACK_UNREF(next_poll->call_stack, "re-poll");
|
|
918
1740
|
delete next_poll;
|
|
919
1741
|
};
|
|
920
|
-
auto* p =
|
|
1742
|
+
auto* p = std::make_unique<NextPoll>().release();
|
|
921
1743
|
p->call_stack = self_->call_stack();
|
|
922
1744
|
p->call_data = self_;
|
|
923
1745
|
GRPC_CALL_STACK_REF(self_->call_stack(), "re-poll");
|
|
924
1746
|
GRPC_CLOSURE_INIT(p, run, p, nullptr);
|
|
925
|
-
flusher_->AddClosure(p,
|
|
1747
|
+
flusher_->AddClosure(p, absl::OkStatus(), "re-poll");
|
|
926
1748
|
}
|
|
927
1749
|
}
|
|
928
1750
|
|
|
@@ -937,6 +1759,36 @@ class ServerCallData::PollContext {
|
|
|
937
1759
|
bool have_scoped_activity_;
|
|
938
1760
|
};
|
|
939
1761
|
|
|
1762
|
+
const char* ServerCallData::StateString(RecvInitialState state) {
|
|
1763
|
+
switch (state) {
|
|
1764
|
+
case RecvInitialState::kInitial:
|
|
1765
|
+
return "INITIAL";
|
|
1766
|
+
case RecvInitialState::kForwarded:
|
|
1767
|
+
return "FORWARDED";
|
|
1768
|
+
case RecvInitialState::kComplete:
|
|
1769
|
+
return "COMPLETE";
|
|
1770
|
+
case RecvInitialState::kResponded:
|
|
1771
|
+
return "RESPONDED";
|
|
1772
|
+
}
|
|
1773
|
+
return "UNKNOWN";
|
|
1774
|
+
}
|
|
1775
|
+
|
|
1776
|
+
const char* ServerCallData::StateString(SendTrailingState state) {
|
|
1777
|
+
switch (state) {
|
|
1778
|
+
case SendTrailingState::kInitial:
|
|
1779
|
+
return "INITIAL";
|
|
1780
|
+
case SendTrailingState::kForwarded:
|
|
1781
|
+
return "FORWARDED";
|
|
1782
|
+
case SendTrailingState::kQueuedBehindSendMessage:
|
|
1783
|
+
return "QUEUED_BEHIND_SEND_MESSAGE";
|
|
1784
|
+
case SendTrailingState::kQueued:
|
|
1785
|
+
return "QUEUED";
|
|
1786
|
+
case SendTrailingState::kCancelled:
|
|
1787
|
+
return "CANCELLED";
|
|
1788
|
+
}
|
|
1789
|
+
return "UNKNOWN";
|
|
1790
|
+
}
|
|
1791
|
+
|
|
940
1792
|
ServerCallData::ServerCallData(grpc_call_element* elem,
|
|
941
1793
|
const grpc_call_element_args* args,
|
|
942
1794
|
uint8_t flags)
|
|
@@ -947,11 +1799,17 @@ ServerCallData::ServerCallData(grpc_call_element* elem,
|
|
|
947
1799
|
GRPC_CLOSURE_INIT(&recv_initial_metadata_ready_,
|
|
948
1800
|
RecvInitialMetadataReadyCallback, this,
|
|
949
1801
|
grpc_schedule_on_exec_ctx);
|
|
1802
|
+
GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_,
|
|
1803
|
+
RecvTrailingMetadataReadyCallback, this,
|
|
1804
|
+
grpc_schedule_on_exec_ctx);
|
|
950
1805
|
}
|
|
951
1806
|
|
|
952
1807
|
ServerCallData::~ServerCallData() {
|
|
1808
|
+
if (grpc_trace_channel.enabled()) {
|
|
1809
|
+
gpr_log(GPR_INFO, "%s ~ServerCallData %s", LogTag().c_str(),
|
|
1810
|
+
DebugString().c_str());
|
|
1811
|
+
}
|
|
953
1812
|
GPR_ASSERT(poll_ctx_ == nullptr);
|
|
954
|
-
GRPC_ERROR_UNREF(cancelled_error_);
|
|
955
1813
|
}
|
|
956
1814
|
|
|
957
1815
|
// Activity implementation.
|
|
@@ -968,6 +1826,11 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) {
|
|
|
968
1826
|
Flusher flusher(this);
|
|
969
1827
|
bool wake = false;
|
|
970
1828
|
|
|
1829
|
+
if (grpc_trace_channel.enabled()) {
|
|
1830
|
+
gpr_log(GPR_INFO, "%s StartBatch: %s", LogTag().c_str(),
|
|
1831
|
+
DebugString().c_str());
|
|
1832
|
+
}
|
|
1833
|
+
|
|
971
1834
|
// If this is a cancel stream, cancel anything we have pending and
|
|
972
1835
|
// propagate the cancellation.
|
|
973
1836
|
if (batch->cancel_stream) {
|
|
@@ -975,10 +1838,9 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) {
|
|
|
975
1838
|
!batch->send_trailing_metadata && !batch->send_message &&
|
|
976
1839
|
!batch->recv_initial_metadata && !batch->recv_message &&
|
|
977
1840
|
!batch->recv_trailing_metadata);
|
|
978
|
-
|
|
979
|
-
|
|
1841
|
+
PollContext poll_ctx(this, &flusher);
|
|
1842
|
+
Completed(batch->payload->cancel_stream.cancel_error, &flusher);
|
|
980
1843
|
if (is_last()) {
|
|
981
|
-
GRPC_ERROR_UNREF(batch->payload->cancel_stream.cancel_error);
|
|
982
1844
|
batch.CompleteWith(&flusher);
|
|
983
1845
|
} else {
|
|
984
1846
|
batch.ResumeWith(&flusher);
|
|
@@ -1004,6 +1866,16 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) {
|
|
|
1004
1866
|
recv_initial_state_ = RecvInitialState::kForwarded;
|
|
1005
1867
|
}
|
|
1006
1868
|
|
|
1869
|
+
// Hook recv_trailing_metadata so we can see cancellation from the client.
|
|
1870
|
+
if (batch->recv_trailing_metadata) {
|
|
1871
|
+
recv_trailing_metadata_ =
|
|
1872
|
+
batch->payload->recv_trailing_metadata.recv_trailing_metadata;
|
|
1873
|
+
original_recv_trailing_metadata_ready_ =
|
|
1874
|
+
batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
|
|
1875
|
+
batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
|
|
1876
|
+
&recv_trailing_metadata_ready_;
|
|
1877
|
+
}
|
|
1878
|
+
|
|
1007
1879
|
// send_initial_metadata
|
|
1008
1880
|
if (send_initial_metadata_ != nullptr && batch->send_initial_metadata) {
|
|
1009
1881
|
switch (send_initial_metadata_->state) {
|
|
@@ -1015,32 +1887,61 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) {
|
|
|
1015
1887
|
send_initial_metadata_->state = SendInitialMetadata::kQueuedAndGotLatch;
|
|
1016
1888
|
break;
|
|
1017
1889
|
case SendInitialMetadata::kCancelled:
|
|
1018
|
-
batch.CancelWith(
|
|
1890
|
+
batch.CancelWith(
|
|
1891
|
+
cancelled_error_.ok() ? absl::CancelledError() : cancelled_error_,
|
|
1892
|
+
&flusher);
|
|
1019
1893
|
break;
|
|
1020
1894
|
case SendInitialMetadata::kQueuedAndGotLatch:
|
|
1021
1895
|
case SendInitialMetadata::kQueuedWaitingForLatch:
|
|
1022
1896
|
case SendInitialMetadata::kQueuedAndSetLatch:
|
|
1023
1897
|
case SendInitialMetadata::kForwarded:
|
|
1024
|
-
|
|
1898
|
+
Crash(absl::StrFormat(
|
|
1899
|
+
"ILLEGAL STATE: %s",
|
|
1900
|
+
SendInitialMetadata::StateString(
|
|
1901
|
+
send_initial_metadata_->state))); // not reachable
|
|
1025
1902
|
}
|
|
1026
1903
|
send_initial_metadata_->batch = batch;
|
|
1027
1904
|
wake = true;
|
|
1028
1905
|
}
|
|
1029
1906
|
|
|
1907
|
+
if (send_message() != nullptr && batch.is_captured() && batch->send_message) {
|
|
1908
|
+
send_message()->StartOp(batch);
|
|
1909
|
+
wake = true;
|
|
1910
|
+
}
|
|
1911
|
+
if (receive_message() != nullptr && batch.is_captured() &&
|
|
1912
|
+
batch->recv_message) {
|
|
1913
|
+
receive_message()->StartOp(batch);
|
|
1914
|
+
wake = true;
|
|
1915
|
+
}
|
|
1916
|
+
|
|
1030
1917
|
// send_trailing_metadata
|
|
1031
1918
|
if (batch.is_captured() && batch->send_trailing_metadata) {
|
|
1032
1919
|
switch (send_trailing_state_) {
|
|
1033
1920
|
case SendTrailingState::kInitial:
|
|
1034
1921
|
send_trailing_metadata_batch_ = batch;
|
|
1035
|
-
|
|
1036
|
-
|
|
1922
|
+
if (receive_message() != nullptr) {
|
|
1923
|
+
receive_message()->Done(
|
|
1924
|
+
*batch->payload->send_trailing_metadata.send_trailing_metadata,
|
|
1925
|
+
&flusher);
|
|
1926
|
+
}
|
|
1927
|
+
if (send_message() != nullptr && !send_message()->IsIdle()) {
|
|
1928
|
+
send_trailing_state_ = SendTrailingState::kQueuedBehindSendMessage;
|
|
1929
|
+
} else {
|
|
1930
|
+
send_trailing_state_ = SendTrailingState::kQueued;
|
|
1931
|
+
wake = true;
|
|
1932
|
+
}
|
|
1037
1933
|
break;
|
|
1038
1934
|
case SendTrailingState::kQueued:
|
|
1935
|
+
case SendTrailingState::kQueuedBehindSendMessage:
|
|
1039
1936
|
case SendTrailingState::kForwarded:
|
|
1040
|
-
|
|
1937
|
+
Crash(
|
|
1938
|
+
absl::StrFormat("ILLEGAL STATE: %s",
|
|
1939
|
+
StateString(send_trailing_state_))); // unreachable
|
|
1041
1940
|
break;
|
|
1042
1941
|
case SendTrailingState::kCancelled:
|
|
1043
|
-
batch.CancelWith(
|
|
1942
|
+
batch.CancelWith(
|
|
1943
|
+
cancelled_error_.ok() ? absl::CancelledError() : cancelled_error_,
|
|
1944
|
+
&flusher);
|
|
1044
1945
|
break;
|
|
1045
1946
|
}
|
|
1046
1947
|
}
|
|
@@ -1050,15 +1951,14 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) {
|
|
|
1050
1951
|
}
|
|
1051
1952
|
|
|
1052
1953
|
// Handle cancellation.
|
|
1053
|
-
void ServerCallData::
|
|
1954
|
+
void ServerCallData::Completed(grpc_error_handle error, Flusher* flusher) {
|
|
1054
1955
|
// Track the latest reason for cancellation.
|
|
1055
|
-
GRPC_ERROR_UNREF(cancelled_error_);
|
|
1056
1956
|
cancelled_error_ = error;
|
|
1057
1957
|
// Stop running the promise.
|
|
1058
1958
|
promise_ = ArenaPromise<ServerMetadataHandle>();
|
|
1059
1959
|
if (send_trailing_state_ == SendTrailingState::kQueued) {
|
|
1060
1960
|
send_trailing_state_ = SendTrailingState::kCancelled;
|
|
1061
|
-
send_trailing_metadata_batch_.CancelWith(
|
|
1961
|
+
send_trailing_metadata_batch_.CancelWith(error, flusher);
|
|
1062
1962
|
} else {
|
|
1063
1963
|
send_trailing_state_ = SendTrailingState::kCancelled;
|
|
1064
1964
|
}
|
|
@@ -1072,16 +1972,21 @@ void ServerCallData::Cancel(grpc_error_handle error, Flusher* flusher) {
|
|
|
1072
1972
|
case SendInitialMetadata::kQueuedWaitingForLatch:
|
|
1073
1973
|
case SendInitialMetadata::kQueuedAndGotLatch:
|
|
1074
1974
|
case SendInitialMetadata::kQueuedAndSetLatch:
|
|
1075
|
-
send_initial_metadata_->batch.CancelWith(
|
|
1076
|
-
flusher);
|
|
1975
|
+
send_initial_metadata_->batch.CancelWith(error, flusher);
|
|
1077
1976
|
break;
|
|
1078
1977
|
}
|
|
1079
1978
|
send_initial_metadata_->state = SendInitialMetadata::kCancelled;
|
|
1080
1979
|
}
|
|
1081
1980
|
if (auto* closure =
|
|
1082
1981
|
std::exchange(original_recv_initial_metadata_ready_, nullptr)) {
|
|
1083
|
-
flusher->AddClosure(closure,
|
|
1084
|
-
|
|
1982
|
+
flusher->AddClosure(closure, error, "original_recv_initial_metadata");
|
|
1983
|
+
}
|
|
1984
|
+
ScopedContext ctx(this);
|
|
1985
|
+
if (send_message() != nullptr) {
|
|
1986
|
+
send_message()->Done(*ServerMetadataFromStatus(error));
|
|
1987
|
+
}
|
|
1988
|
+
if (receive_message() != nullptr) {
|
|
1989
|
+
receive_message()->Done(*ServerMetadataFromStatus(error), flusher);
|
|
1085
1990
|
}
|
|
1086
1991
|
}
|
|
1087
1992
|
|
|
@@ -1109,7 +2014,10 @@ ArenaPromise<ServerMetadataHandle> ServerCallData::MakeNextPromise(
|
|
|
1109
2014
|
case SendInitialMetadata::kQueuedAndGotLatch:
|
|
1110
2015
|
case SendInitialMetadata::kQueuedAndSetLatch:
|
|
1111
2016
|
case SendInitialMetadata::kForwarded:
|
|
1112
|
-
|
|
2017
|
+
Crash(absl::StrFormat(
|
|
2018
|
+
"ILLEGAL STATE: %s",
|
|
2019
|
+
SendInitialMetadata::StateString(
|
|
2020
|
+
send_initial_metadata_->state))); // not reachable
|
|
1113
2021
|
break;
|
|
1114
2022
|
case SendInitialMetadata::kQueuedWaitingForLatch:
|
|
1115
2023
|
send_initial_metadata_->state = SendInitialMetadata::kQueuedAndGotLatch;
|
|
@@ -1120,6 +2028,16 @@ ArenaPromise<ServerMetadataHandle> ServerCallData::MakeNextPromise(
|
|
|
1120
2028
|
} else {
|
|
1121
2029
|
GPR_ASSERT(call_args.server_initial_metadata == nullptr);
|
|
1122
2030
|
}
|
|
2031
|
+
if (send_message() != nullptr) {
|
|
2032
|
+
send_message()->GotPipe(call_args.outgoing_messages);
|
|
2033
|
+
} else {
|
|
2034
|
+
GPR_ASSERT(call_args.outgoing_messages == nullptr);
|
|
2035
|
+
}
|
|
2036
|
+
if (receive_message() != nullptr) {
|
|
2037
|
+
receive_message()->GotPipe(call_args.incoming_messages);
|
|
2038
|
+
} else {
|
|
2039
|
+
GPR_ASSERT(call_args.incoming_messages == nullptr);
|
|
2040
|
+
}
|
|
1123
2041
|
return ArenaPromise<ServerMetadataHandle>(
|
|
1124
2042
|
[this]() { return PollTrailingMetadata(); });
|
|
1125
2043
|
}
|
|
@@ -1130,12 +2048,14 @@ ArenaPromise<ServerMetadataHandle> ServerCallData::MakeNextPromise(
|
|
|
1130
2048
|
Poll<ServerMetadataHandle> ServerCallData::PollTrailingMetadata() {
|
|
1131
2049
|
switch (send_trailing_state_) {
|
|
1132
2050
|
case SendTrailingState::kInitial:
|
|
2051
|
+
case SendTrailingState::kQueuedBehindSendMessage:
|
|
1133
2052
|
return Pending{};
|
|
1134
2053
|
case SendTrailingState::kQueued:
|
|
1135
2054
|
return WrapMetadata(send_trailing_metadata_batch_->payload
|
|
1136
2055
|
->send_trailing_metadata.send_trailing_metadata);
|
|
1137
2056
|
case SendTrailingState::kForwarded:
|
|
1138
|
-
|
|
2057
|
+
Crash(absl::StrFormat("ILLEGAL STATE: %s",
|
|
2058
|
+
StateString(send_trailing_state_))); // unreachable
|
|
1139
2059
|
case SendTrailingState::kCancelled:
|
|
1140
2060
|
// We could translate cancelled_error to metadata and return it... BUT
|
|
1141
2061
|
// we're not gonna be running much longer and the results going to be
|
|
@@ -1145,20 +2065,43 @@ Poll<ServerMetadataHandle> ServerCallData::PollTrailingMetadata() {
|
|
|
1145
2065
|
GPR_UNREACHABLE_CODE(return Pending{});
|
|
1146
2066
|
}
|
|
1147
2067
|
|
|
2068
|
+
void ServerCallData::RecvTrailingMetadataReadyCallback(
|
|
2069
|
+
void* arg, grpc_error_handle error) {
|
|
2070
|
+
static_cast<ServerCallData*>(arg)->RecvTrailingMetadataReady(
|
|
2071
|
+
std::move(error));
|
|
2072
|
+
}
|
|
2073
|
+
|
|
2074
|
+
void ServerCallData::RecvTrailingMetadataReady(grpc_error_handle error) {
|
|
2075
|
+
if (grpc_trace_channel.enabled()) {
|
|
2076
|
+
gpr_log(GPR_INFO, "%s: RecvTrailingMetadataReady error=%s md=%s",
|
|
2077
|
+
LogTag().c_str(), error.ToString().c_str(),
|
|
2078
|
+
recv_trailing_metadata_->DebugString().c_str());
|
|
2079
|
+
}
|
|
2080
|
+
Flusher flusher(this);
|
|
2081
|
+
PollContext poll_ctx(this, &flusher);
|
|
2082
|
+
Completed(error, &flusher);
|
|
2083
|
+
flusher.AddClosure(original_recv_trailing_metadata_ready_, std::move(error),
|
|
2084
|
+
"continue recv trailing");
|
|
2085
|
+
}
|
|
2086
|
+
|
|
1148
2087
|
void ServerCallData::RecvInitialMetadataReadyCallback(void* arg,
|
|
1149
2088
|
grpc_error_handle error) {
|
|
1150
|
-
static_cast<ServerCallData*>(arg)->RecvInitialMetadataReady(error);
|
|
2089
|
+
static_cast<ServerCallData*>(arg)->RecvInitialMetadataReady(std::move(error));
|
|
1151
2090
|
}
|
|
1152
2091
|
|
|
1153
2092
|
void ServerCallData::RecvInitialMetadataReady(grpc_error_handle error) {
|
|
1154
2093
|
Flusher flusher(this);
|
|
2094
|
+
if (grpc_trace_channel.enabled()) {
|
|
2095
|
+
gpr_log(GPR_INFO, "%s: RecvInitialMetadataReady %s", LogTag().c_str(),
|
|
2096
|
+
error.ToString().c_str());
|
|
2097
|
+
}
|
|
1155
2098
|
GPR_ASSERT(recv_initial_state_ == RecvInitialState::kForwarded);
|
|
1156
2099
|
// If there was an error we just propagate that through
|
|
1157
|
-
if (!
|
|
2100
|
+
if (!error.ok()) {
|
|
1158
2101
|
recv_initial_state_ = RecvInitialState::kResponded;
|
|
1159
2102
|
flusher.AddClosure(
|
|
1160
|
-
std::exchange(original_recv_initial_metadata_ready_, nullptr),
|
|
1161
|
-
|
|
2103
|
+
std::exchange(original_recv_initial_metadata_ready_, nullptr), error,
|
|
2104
|
+
"propagate error");
|
|
1162
2105
|
return;
|
|
1163
2106
|
}
|
|
1164
2107
|
// Record that we've got the callback.
|
|
@@ -1168,24 +2111,52 @@ void ServerCallData::RecvInitialMetadataReady(grpc_error_handle error) {
|
|
|
1168
2111
|
ScopedContext context(this);
|
|
1169
2112
|
// Construct the promise.
|
|
1170
2113
|
ChannelFilter* filter = static_cast<ChannelFilter*>(elem()->channel_data);
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
2114
|
+
FakeActivity().Run([this, filter] {
|
|
2115
|
+
promise_ = filter->MakeCallPromise(
|
|
2116
|
+
CallArgs{WrapMetadata(recv_initial_metadata_),
|
|
2117
|
+
server_initial_metadata_latch(), outgoing_messages_pipe(),
|
|
2118
|
+
incoming_messages_pipe()},
|
|
2119
|
+
[this](CallArgs call_args) {
|
|
2120
|
+
return MakeNextPromise(std::move(call_args));
|
|
2121
|
+
});
|
|
2122
|
+
});
|
|
1177
2123
|
// Poll once.
|
|
1178
2124
|
WakeInsideCombiner(&flusher);
|
|
1179
2125
|
if (auto* closure =
|
|
1180
2126
|
std::exchange(original_recv_initial_metadata_ready_, nullptr)) {
|
|
1181
|
-
flusher.AddClosure(closure,
|
|
2127
|
+
flusher.AddClosure(closure, absl::OkStatus(),
|
|
1182
2128
|
"original_recv_initial_metadata");
|
|
1183
2129
|
}
|
|
1184
2130
|
}
|
|
1185
2131
|
|
|
2132
|
+
std::string ServerCallData::DebugString() const {
|
|
2133
|
+
std::vector<absl::string_view> captured;
|
|
2134
|
+
if (send_message() != nullptr && send_message()->HaveCapturedBatch()) {
|
|
2135
|
+
captured.push_back("send_message");
|
|
2136
|
+
}
|
|
2137
|
+
if (send_trailing_metadata_batch_.is_captured()) {
|
|
2138
|
+
captured.push_back("send_trailing_metadata");
|
|
2139
|
+
}
|
|
2140
|
+
return absl::StrCat(
|
|
2141
|
+
"have_promise=", promise_.has_value() ? "true" : "false",
|
|
2142
|
+
" recv_initial_state=", StateString(recv_initial_state_),
|
|
2143
|
+
" send_trailing_state=", StateString(send_trailing_state_), " captured={",
|
|
2144
|
+
absl::StrJoin(captured, ","), "}",
|
|
2145
|
+
send_initial_metadata_ == nullptr
|
|
2146
|
+
? ""
|
|
2147
|
+
: absl::StrCat(
|
|
2148
|
+
" send_initial_metadata=",
|
|
2149
|
+
SendInitialMetadata::StateString(send_initial_metadata_->state))
|
|
2150
|
+
.c_str());
|
|
2151
|
+
}
|
|
2152
|
+
|
|
1186
2153
|
// Wakeup and poll the promise if appropriate.
|
|
1187
2154
|
void ServerCallData::WakeInsideCombiner(Flusher* flusher) {
|
|
1188
2155
|
PollContext poll_ctx(this, flusher);
|
|
2156
|
+
if (grpc_trace_channel.enabled()) {
|
|
2157
|
+
gpr_log(GPR_INFO, "%s: WakeInsideCombiner %s", LogTag().c_str(),
|
|
2158
|
+
DebugString().c_str());
|
|
2159
|
+
}
|
|
1189
2160
|
if (send_initial_metadata_ != nullptr &&
|
|
1190
2161
|
send_initial_metadata_->state ==
|
|
1191
2162
|
SendInitialMetadata::kQueuedAndGotLatch) {
|
|
@@ -1195,9 +2166,25 @@ void ServerCallData::WakeInsideCombiner(Flusher* flusher) {
|
|
|
1195
2166
|
.send_initial_metadata);
|
|
1196
2167
|
}
|
|
1197
2168
|
poll_ctx.ClearRepoll();
|
|
2169
|
+
if (send_message() != nullptr) {
|
|
2170
|
+
send_message()->WakeInsideCombiner(flusher);
|
|
2171
|
+
if (send_trailing_state_ == SendTrailingState::kQueuedBehindSendMessage &&
|
|
2172
|
+
send_message()->IsIdle()) {
|
|
2173
|
+
send_trailing_state_ = SendTrailingState::kQueued;
|
|
2174
|
+
}
|
|
2175
|
+
}
|
|
2176
|
+
if (receive_message() != nullptr) {
|
|
2177
|
+
receive_message()->WakeInsideCombiner(flusher);
|
|
2178
|
+
}
|
|
1198
2179
|
if (promise_.has_value()) {
|
|
1199
2180
|
Poll<ServerMetadataHandle> poll;
|
|
1200
2181
|
poll = promise_();
|
|
2182
|
+
if (grpc_trace_channel.enabled()) {
|
|
2183
|
+
gpr_log(GPR_INFO, "%s: WakeInsideCombiner poll=%s", LogTag().c_str(),
|
|
2184
|
+
PollToString(poll, [](const ServerMetadataHandle& h) {
|
|
2185
|
+
return h->DebugString();
|
|
2186
|
+
}).c_str());
|
|
2187
|
+
}
|
|
1201
2188
|
if (send_initial_metadata_ != nullptr &&
|
|
1202
2189
|
send_initial_metadata_->state ==
|
|
1203
2190
|
SendInitialMetadata::kQueuedAndSetLatch) {
|
|
@@ -1217,7 +2204,14 @@ void ServerCallData::WakeInsideCombiner(Flusher* flusher) {
|
|
|
1217
2204
|
promise_ = ArenaPromise<ServerMetadataHandle>();
|
|
1218
2205
|
auto* md = UnwrapMetadata(std::move(*r));
|
|
1219
2206
|
bool destroy_md = true;
|
|
2207
|
+
if (send_message() != nullptr) {
|
|
2208
|
+
send_message()->Done(*md);
|
|
2209
|
+
}
|
|
2210
|
+
if (receive_message() != nullptr) {
|
|
2211
|
+
receive_message()->Done(*md, flusher);
|
|
2212
|
+
}
|
|
1220
2213
|
switch (send_trailing_state_) {
|
|
2214
|
+
case SendTrailingState::kQueuedBehindSendMessage:
|
|
1221
2215
|
case SendTrailingState::kQueued: {
|
|
1222
2216
|
if (send_trailing_metadata_batch_->payload->send_trailing_metadata
|
|
1223
2217
|
.send_trailing_metadata != md) {
|
|
@@ -1230,20 +2224,13 @@ void ServerCallData::WakeInsideCombiner(Flusher* flusher) {
|
|
|
1230
2224
|
send_trailing_state_ = SendTrailingState::kForwarded;
|
|
1231
2225
|
} break;
|
|
1232
2226
|
case SendTrailingState::kForwarded:
|
|
1233
|
-
|
|
2227
|
+
Crash(absl::StrFormat(
|
|
2228
|
+
"ILLEGAL STATE: %s",
|
|
2229
|
+
StateString(send_trailing_state_))); // unreachable
|
|
1234
2230
|
break;
|
|
1235
2231
|
case SendTrailingState::kInitial: {
|
|
1236
2232
|
GPR_ASSERT(*md->get_pointer(GrpcStatusMetadata()) != GRPC_STATUS_OK);
|
|
1237
|
-
|
|
1238
|
-
grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
|
1239
|
-
"early return from promise based filter"),
|
|
1240
|
-
GRPC_ERROR_INT_GRPC_STATUS,
|
|
1241
|
-
*md->get_pointer(GrpcStatusMetadata()));
|
|
1242
|
-
if (auto* message = md->get_pointer(GrpcMessageMetadata())) {
|
|
1243
|
-
error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE,
|
|
1244
|
-
message->as_string_view());
|
|
1245
|
-
}
|
|
1246
|
-
Cancel(error, flusher);
|
|
2233
|
+
Completed(StatusFromMetadata(*md), flusher);
|
|
1247
2234
|
} break;
|
|
1248
2235
|
case SendTrailingState::kCancelled:
|
|
1249
2236
|
// Nothing to do.
|