grpc 1.28.0 → 1.30.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +7694 -11190
- data/include/grpc/grpc.h +2 -2
- data/include/grpc/grpc_security.h +30 -9
- data/include/grpc/grpc_security_constants.h +1 -0
- data/include/grpc/impl/codegen/grpc_types.h +19 -21
- data/include/grpc/impl/codegen/port_platform.h +6 -2
- data/include/grpc/module.modulemap +24 -39
- data/src/core/ext/filters/client_channel/backend_metric.cc +7 -4
- data/src/core/ext/filters/client_channel/client_channel.cc +212 -241
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -2
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +7 -22
- data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
- data/src/core/ext/filters/client_channel/http_proxy.cc +17 -10
- data/src/core/ext/filters/client_channel/lb_policy.cc +19 -18
- data/src/core/ext/filters/client_channel/lb_policy.h +42 -33
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +83 -0
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +99 -0
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +10 -4
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +240 -301
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +89 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +40 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +11 -9
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -2
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +871 -0
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +5 -11
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +734 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +84 -37
- data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +938 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +528 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +834 -0
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +6 -2
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +2 -1
- data/src/core/ext/filters/client_channel/parse_address.cc +22 -21
- data/src/core/ext/filters/client_channel/resolver.cc +5 -8
- data/src/core/ext/filters/client_channel/resolver.h +12 -14
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +73 -59
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +35 -35
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -7
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +16 -20
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +72 -117
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +184 -133
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +7 -4
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +40 -43
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +93 -102
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +0 -4
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +32 -5
- data/src/core/ext/filters/client_channel/resolver_factory.h +2 -2
- data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -3
- data/src/core/ext/filters/client_channel/resolver_registry.h +8 -8
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +16 -16
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +19 -16
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +20 -31
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +4 -3
- data/src/core/ext/filters/client_channel/server_address.cc +6 -9
- data/src/core/ext/filters/client_channel/server_address.h +6 -12
- data/src/core/ext/filters/client_channel/service_config.cc +104 -144
- data/src/core/ext/filters/client_channel/service_config.h +28 -98
- data/src/core/ext/filters/client_channel/service_config_call_data.h +68 -0
- data/src/core/ext/filters/client_channel/service_config_parser.cc +87 -0
- data/src/core/ext/filters/client_channel/service_config_parser.h +89 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +54 -24
- data/src/core/ext/filters/client_channel/subchannel.h +35 -11
- data/src/core/ext/filters/client_channel/xds/xds_api.cc +348 -221
- data/src/core/ext/filters/client_channel/xds/xds_api.h +37 -37
- data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +44 -49
- data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +4 -3
- data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +4 -2
- data/src/core/ext/filters/client_channel/xds/xds_client.cc +532 -339
- data/src/core/ext/filters/client_channel/xds/xds_client.h +57 -22
- data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +11 -12
- data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +31 -19
- data/src/core/ext/filters/http/client/http_client_filter.cc +23 -28
- data/src/core/ext/filters/http/client_authority_filter.cc +4 -4
- data/src/core/ext/filters/http/http_filters_plugin.cc +27 -12
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +258 -221
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +358 -0
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +29 -0
- data/src/core/ext/filters/message_size/message_size_filter.cc +7 -10
- data/src/core/ext/filters/message_size/message_size_filter.h +4 -4
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +23 -22
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -3
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +29 -16
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +2 -2
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +4 -5
- data/src/core/ext/transport/chttp2/transport/huffsyms.h +2 -3
- data/src/core/ext/transport/chttp2/transport/internal.h +14 -21
- data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
- data/src/core/ext/transport/chttp2/transport/writing.cc +15 -8
- data/src/core/ext/transport/inproc/inproc_transport.cc +19 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +4 -229
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +5 -875
- data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +114 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +418 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +72 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +197 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +105 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +378 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +21 -8
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +43 -7
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +2 -1
- data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c +35 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +78 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +47 -26
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +115 -65
- data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +34 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +72 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +2 -1
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +24 -20
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +28 -13
- data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +38 -18
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +88 -6
- data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c +34 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +89 -0
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +9 -6
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +15 -10
- data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +16 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +2 -1
- data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +63 -41
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +173 -77
- data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +48 -28
- data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +90 -30
- data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +51 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +125 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +4 -2
- data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +4 -0
- data/src/core/ext/upb-generated/envoy/type/http.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +16 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +36 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/percent.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/range.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +1 -0
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +9 -8
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +30 -24
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +65 -0
- data/src/core/ext/upb-generated/validate/validate.upb.c +21 -20
- data/src/core/ext/upb-generated/validate/validate.upb.h +69 -63
- data/src/core/lib/channel/channel_args.cc +15 -14
- data/src/core/lib/channel/channel_args.h +3 -1
- data/src/core/lib/channel/channel_stack.h +20 -13
- data/src/core/lib/channel/channelz.cc +5 -6
- data/src/core/lib/channel/channelz.h +3 -2
- data/src/core/lib/channel/channelz_registry.cc +5 -3
- data/src/core/lib/channel/connected_channel.cc +7 -5
- data/src/core/lib/channel/context.h +1 -1
- data/src/core/lib/channel/handshaker.cc +11 -13
- data/src/core/lib/channel/handshaker.h +4 -2
- data/src/core/lib/channel/handshaker_registry.cc +5 -17
- data/src/core/lib/channel/status_util.cc +2 -3
- data/src/core/lib/compression/message_compress.cc +5 -1
- data/src/core/lib/debug/stats.cc +21 -27
- data/src/core/lib/debug/stats.h +3 -1
- data/src/core/lib/gpr/spinlock.h +2 -3
- data/src/core/lib/gpr/string.cc +2 -26
- data/src/core/lib/gpr/string.h +0 -16
- data/src/core/lib/gpr/sync_abseil.cc +2 -0
- data/src/core/lib/gpr/time.cc +4 -0
- data/src/core/lib/gpr/time_posix.cc +1 -1
- data/src/core/lib/gprpp/atomic.h +6 -6
- data/src/core/lib/gprpp/fork.cc +1 -1
- data/src/core/lib/gprpp/host_port.cc +29 -35
- data/src/core/lib/gprpp/host_port.h +14 -17
- data/src/core/lib/gprpp/map.h +5 -11
- data/src/core/lib/gprpp/ref_counted_ptr.h +5 -0
- data/src/core/lib/http/format_request.cc +46 -65
- data/src/core/lib/http/httpcli.cc +2 -3
- data/src/core/lib/http/httpcli.h +2 -3
- data/src/core/lib/http/httpcli_security_connector.cc +5 -5
- data/src/core/lib/http/parser.h +2 -3
- data/src/core/lib/iomgr/buffer_list.h +22 -21
- data/src/core/lib/iomgr/call_combiner.h +3 -2
- data/src/core/lib/iomgr/cfstream_handle.cc +3 -2
- data/src/core/lib/iomgr/closure.h +2 -3
- data/src/core/lib/iomgr/dualstack_socket_posix.cc +47 -0
- data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -3
- data/src/core/lib/iomgr/endpoint_pair.h +2 -3
- data/src/core/lib/iomgr/error.cc +6 -9
- data/src/core/lib/iomgr/error.h +0 -1
- data/src/core/lib/iomgr/ev_apple.cc +356 -0
- data/src/core/lib/iomgr/ev_apple.h +43 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -23
- data/src/core/lib/iomgr/ev_epollex_linux.cc +2 -3
- data/src/core/lib/iomgr/ev_poll_posix.cc +3 -3
- data/src/core/lib/iomgr/ev_posix.cc +2 -3
- data/src/core/lib/iomgr/exec_ctx.h +14 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +84 -20
- data/src/core/lib/iomgr/pollset_set_custom.cc +10 -10
- data/src/core/lib/{gprpp/optional.h → iomgr/pollset_uv.h} +11 -12
- data/src/core/lib/iomgr/port.h +1 -0
- data/src/core/lib/iomgr/python_util.h +46 -0
- data/src/core/lib/iomgr/resolve_address.h +4 -6
- data/src/core/lib/iomgr/resolve_address_custom.cc +29 -39
- data/src/core/lib/iomgr/resolve_address_custom.h +4 -2
- data/src/core/lib/iomgr/resolve_address_posix.cc +10 -11
- data/src/core/lib/iomgr/resolve_address_windows.cc +8 -17
- data/src/core/lib/iomgr/resource_quota.cc +4 -6
- data/src/core/lib/iomgr/sockaddr_utils.cc +23 -29
- data/src/core/lib/iomgr/sockaddr_utils.h +9 -14
- data/src/core/lib/iomgr/socket_factory_posix.h +2 -3
- data/src/core/lib/iomgr/socket_mutator.h +2 -3
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +7 -26
- data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -7
- data/src/core/lib/iomgr/tcp_client_posix.cc +8 -5
- data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
- data/src/core/lib/iomgr/tcp_custom.cc +2 -3
- data/src/core/lib/iomgr/tcp_server_custom.cc +5 -9
- data/src/core/lib/iomgr/tcp_server_posix.cc +5 -4
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -4
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +8 -11
- data/src/core/lib/iomgr/tcp_uv.cc +3 -2
- data/src/core/lib/iomgr/time_averaged_stats.h +2 -3
- data/src/core/lib/iomgr/timer_generic.cc +2 -3
- data/src/core/lib/{gprpp/inlined_vector.h → iomgr/timer_generic.h} +19 -17
- data/src/core/lib/iomgr/timer_heap.h +2 -3
- data/src/core/lib/iomgr/udp_server.cc +9 -14
- data/src/core/lib/json/json.h +3 -2
- data/src/core/lib/json/json_reader.cc +5 -5
- data/src/core/lib/json/json_writer.cc +13 -12
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +12 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.h +6 -3
- data/src/core/lib/security/credentials/credentials.cc +0 -84
- data/src/core/lib/security/credentials/credentials.h +8 -59
- data/src/core/lib/security/credentials/fake/fake_credentials.h +4 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +3 -8
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -6
- data/src/core/lib/security/credentials/iam/iam_credentials.h +4 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
- data/src/core/lib/security/credentials/jwt/json_token.h +2 -5
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +12 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +8 -15
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -3
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +55 -27
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +9 -3
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +13 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +23 -13
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +38 -11
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +21 -6
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +7 -7
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +3 -2
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
- data/src/core/lib/security/security_connector/security_connector.h +1 -1
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +20 -25
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -6
- data/src/core/lib/security/security_connector/ssl_utils.cc +59 -12
- data/src/core/lib/security/security_connector/ssl_utils.h +12 -10
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +77 -51
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +27 -5
- data/src/core/lib/security/transport/auth_filters.h +0 -5
- data/src/core/lib/security/transport/client_auth_filter.cc +1 -2
- data/src/core/lib/slice/slice_intern.cc +2 -3
- data/src/core/lib/slice/slice_internal.h +14 -0
- data/src/core/lib/slice/slice_utils.h +9 -0
- data/src/core/lib/surface/byte_buffer_reader.cc +2 -47
- data/src/core/lib/surface/call.cc +2 -3
- data/src/core/lib/surface/call_log_batch.cc +50 -58
- data/src/core/lib/surface/channel.cc +53 -31
- data/src/core/lib/surface/channel.h +35 -4
- data/src/core/lib/surface/channel_ping.cc +2 -3
- data/src/core/lib/surface/completion_queue.cc +33 -33
- data/src/core/lib/surface/event_string.cc +18 -25
- data/src/core/lib/surface/event_string.h +3 -1
- data/src/core/lib/surface/init_secure.cc +1 -4
- data/src/core/lib/surface/server.cc +570 -369
- data/src/core/lib/surface/server.h +32 -0
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/byte_stream.h +7 -2
- data/src/core/lib/transport/connectivity_state.cc +7 -6
- data/src/core/lib/transport/connectivity_state.h +5 -3
- data/src/core/lib/transport/metadata.cc +3 -3
- data/src/core/lib/transport/metadata_batch.h +2 -3
- data/src/core/lib/transport/static_metadata.h +1 -1
- data/src/core/lib/transport/status_conversion.cc +6 -14
- data/src/core/lib/transport/transport.cc +2 -3
- data/src/core/lib/transport/transport.h +3 -2
- data/src/core/lib/transport/transport_op_string.cc +61 -102
- data/src/core/lib/uri/uri_parser.h +2 -3
- data/src/core/plugin_registry/grpc_plugin_registry.cc +20 -4
- data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +8 -1
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +32 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +9 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +2 -3
- data/src/core/tsi/fake_transport_security.cc +10 -15
- data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -2
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +0 -2
- data/src/core/tsi/ssl_transport_security.cc +52 -39
- data/src/core/tsi/ssl_transport_security.h +8 -8
- data/src/core/tsi/ssl_types.h +0 -2
- data/src/core/tsi/transport_security.h +6 -9
- data/src/core/tsi/transport_security_grpc.h +2 -3
- data/src/core/tsi/transport_security_interface.h +3 -3
- data/src/ruby/ext/grpc/rb_call.c +9 -1
- data/src/ruby/ext/grpc/rb_call_credentials.c +3 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc/errors.rb +103 -42
- data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
- data/src/ruby/lib/grpc/generic/interceptors.rb +4 -4
- data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
- data/src/ruby/lib/grpc/generic/service.rb +5 -4
- data/src/ruby/lib/grpc/structs.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/generate_proto_ruby.sh +5 -3
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +11 -0
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +16 -0
- data/src/ruby/spec/debug_message_spec.rb +134 -0
- data/src/ruby/spec/generic/service_spec.rb +2 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +7 -0
- data/src/ruby/spec/pb/codegen/package_option_spec.rb +7 -1
- data/src/ruby/spec/support/services.rb +10 -4
- data/src/ruby/spec/testdata/ca.pem +18 -13
- data/src/ruby/spec/testdata/client.key +26 -14
- data/src/ruby/spec/testdata/client.pem +18 -12
- data/src/ruby/spec/testdata/server1.key +26 -14
- data/src/ruby/spec/testdata/server1.pem +20 -14
- data/third_party/abseil-cpp/absl/time/civil_time.cc +175 -0
- data/third_party/abseil-cpp/absl/time/civil_time.h +538 -0
- data/third_party/abseil-cpp/absl/time/clock.cc +569 -0
- data/third_party/abseil-cpp/absl/time/clock.h +74 -0
- data/third_party/abseil-cpp/absl/time/duration.cc +922 -0
- data/third_party/abseil-cpp/absl/time/format.cc +153 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +622 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +384 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +922 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +45 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +76 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +121 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +93 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +958 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +138 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +308 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +55 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +187 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +122 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +115 -0
- data/third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
- data/third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
- data/third_party/abseil-cpp/absl/time/time.cc +499 -0
- data/third_party/abseil-cpp/absl/time/time.h +1584 -0
- data/third_party/boringssl-with-bazel/err_data.c +329 -297
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +7 -5
- data/third_party/boringssl-with-bazel/src/crypto/cpu-intel.c +13 -4
- data/third_party/boringssl-with-bazel/src/crypto/crypto.c +11 -0
- data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519.c +18 -26
- data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519_tables.h +13 -21
- data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/internal.h +14 -22
- data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/dh/dh.c +15 -0
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -0
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +425 -0
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +78 -0
- data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/err/err.c +33 -32
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +14 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +8 -8
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +30 -154
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +16 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +289 -117
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +13 -27
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +96 -55
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +25 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +432 -160
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +63 -71
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +5 -14
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h +9481 -9485
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +80 -99
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +736 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +297 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +90 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +125 -148
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +189 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +61 -18
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +20 -5
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +137 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +49 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +64 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +41 -5
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +32 -17
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +24 -114
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +51 -38
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +15 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +44 -35
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +29 -12
- data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +15 -1
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +6 -10
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +16 -0
- data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +278 -0
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1474 -0
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +720 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +16 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +4 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +9 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +20 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +16 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +6 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/err.h +2 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +5 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -17
- data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +31 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +26 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +172 -77
- data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +291 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +5 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +1 -0
- data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +0 -4
- data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +3 -3
- data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +13 -4
- data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +146 -57
- data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +14 -3
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +28 -20
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +12 -4
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +64 -47
- data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +10 -10
- data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +21 -21
- data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +29 -0
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -0
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +6 -1
- data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +13 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +64 -5
- data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +6 -0
- data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +6 -2
- data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +47 -53
- data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -1
- data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +98 -27
- data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +23 -75
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +50 -20
- data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +63 -25
- data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +245 -175
- data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +135 -75
- data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +1593 -1672
- data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +512 -503
- metadata +115 -39
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -1754
- data/src/core/lib/gprpp/string_view.h +0 -60
- data/src/core/tsi/grpc_shadow_boringssl.h +0 -3311
- data/third_party/boringssl-with-bazel/src/third_party/fiat/p256.c +0 -1063
@@ -28,13 +28,12 @@
|
|
28
28
|
#include "src/core/lib/surface/api_trace.h"
|
29
29
|
#include "src/core/lib/surface/completion_queue.h"
|
30
30
|
|
31
|
-
|
31
|
+
struct ping_result {
|
32
32
|
grpc_closure closure;
|
33
33
|
void* tag;
|
34
34
|
grpc_completion_queue* cq;
|
35
35
|
grpc_cq_completion completion_storage;
|
36
|
-
}
|
37
|
-
|
36
|
+
};
|
38
37
|
static void ping_destroy(void* arg, grpc_cq_completion* /*storage*/) {
|
39
38
|
gpr_free(arg);
|
40
39
|
}
|
@@ -23,6 +23,11 @@
|
|
23
23
|
#include <stdio.h>
|
24
24
|
#include <string.h>
|
25
25
|
|
26
|
+
#include <vector>
|
27
|
+
|
28
|
+
#include "absl/strings/str_format.h"
|
29
|
+
#include "absl/strings/str_join.h"
|
30
|
+
|
26
31
|
#include <grpc/support/alloc.h>
|
27
32
|
#include <grpc/support/atm.h>
|
28
33
|
#include <grpc/support/log.h>
|
@@ -56,12 +61,11 @@ namespace {
|
|
56
61
|
GPR_TLS_DECL(g_cached_event);
|
57
62
|
GPR_TLS_DECL(g_cached_cq);
|
58
63
|
|
59
|
-
|
64
|
+
struct plucker {
|
60
65
|
grpc_pollset_worker** worker;
|
61
66
|
void* tag;
|
62
|
-
}
|
63
|
-
|
64
|
-
typedef struct {
|
67
|
+
};
|
68
|
+
struct cq_poller_vtable {
|
65
69
|
bool can_get_pollset;
|
66
70
|
bool can_listen;
|
67
71
|
size_t (*size)(void);
|
@@ -72,8 +76,7 @@ typedef struct {
|
|
72
76
|
grpc_millis deadline);
|
73
77
|
void (*shutdown)(grpc_pollset* pollset, grpc_closure* closure);
|
74
78
|
void (*destroy)(grpc_pollset* pollset);
|
75
|
-
}
|
76
|
-
|
79
|
+
};
|
77
80
|
typedef struct non_polling_worker {
|
78
81
|
gpr_cv cv;
|
79
82
|
bool kicked;
|
@@ -81,13 +84,12 @@ typedef struct non_polling_worker {
|
|
81
84
|
struct non_polling_worker* prev;
|
82
85
|
} non_polling_worker;
|
83
86
|
|
84
|
-
|
87
|
+
struct non_polling_poller {
|
85
88
|
gpr_mu mu;
|
86
89
|
bool kicked_without_poller;
|
87
90
|
non_polling_worker* root;
|
88
91
|
grpc_closure* shutdown;
|
89
|
-
}
|
90
|
-
|
92
|
+
};
|
91
93
|
size_t non_polling_poller_size(void) { return sizeof(non_polling_poller); }
|
92
94
|
|
93
95
|
void non_polling_poller_init(grpc_pollset* pollset, gpr_mu** mu) {
|
@@ -430,15 +432,14 @@ static const cq_vtable g_cq_vtable[] = {
|
|
430
432
|
|
431
433
|
grpc_core::TraceFlag grpc_cq_pluck_trace(false, "queue_pluck");
|
432
434
|
|
433
|
-
#define GRPC_SURFACE_TRACE_RETURNED_EVENT(cq, event)
|
434
|
-
do {
|
435
|
-
if (GRPC_TRACE_FLAG_ENABLED(grpc_api_trace) &&
|
436
|
-
(GRPC_TRACE_FLAG_ENABLED(grpc_cq_pluck_trace) ||
|
437
|
-
(event)->type != GRPC_QUEUE_TIMEOUT)) {
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
} \
|
435
|
+
#define GRPC_SURFACE_TRACE_RETURNED_EVENT(cq, event) \
|
436
|
+
do { \
|
437
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_api_trace) && \
|
438
|
+
(GRPC_TRACE_FLAG_ENABLED(grpc_cq_pluck_trace) || \
|
439
|
+
(event)->type != GRPC_QUEUE_TIMEOUT)) { \
|
440
|
+
gpr_log(GPR_INFO, "RETURN_EVENT[%p]: %s", cq, \
|
441
|
+
grpc_event_string(event).c_str()); \
|
442
|
+
} \
|
442
443
|
} while (0)
|
443
444
|
|
444
445
|
static void on_pollset_shutdown_done(void* cq, grpc_error* error);
|
@@ -874,8 +875,15 @@ static void cq_end_op_for_callback(
|
|
874
875
|
cq_finish_shutdown_callback(cq);
|
875
876
|
}
|
876
877
|
|
878
|
+
// If possible, schedule the callback onto an existing thread-local
|
879
|
+
// ApplicationCallbackExecCtx, which is a work queue. This is possible for:
|
880
|
+
// 1. The callback is internally-generated and there is an ACEC available
|
881
|
+
// 2. The callback is marked inlineable and there is an ACEC available
|
882
|
+
// 3. We are already running in a background poller thread (which always has
|
883
|
+
// an ACEC available at the base of the stack).
|
877
884
|
auto* functor = static_cast<grpc_experimental_completion_queue_functor*>(tag);
|
878
|
-
if (internal || functor->inlineable
|
885
|
+
if (((internal || functor->inlineable) &&
|
886
|
+
grpc_core::ApplicationCallbackExecCtx::Available()) ||
|
879
887
|
grpc_iomgr_is_any_background_poller_thread()) {
|
880
888
|
grpc_core::ApplicationCallbackExecCtx::Enqueue(functor,
|
881
889
|
(error == GRPC_ERROR_NONE));
|
@@ -896,15 +904,14 @@ void grpc_cq_end_op(grpc_completion_queue* cq, void* tag, grpc_error* error,
|
|
896
904
|
cq->vtable->end_op(cq, tag, error, done, done_arg, storage, internal);
|
897
905
|
}
|
898
906
|
|
899
|
-
|
907
|
+
struct cq_is_finished_arg {
|
900
908
|
gpr_atm last_seen_things_queued_ever;
|
901
909
|
grpc_completion_queue* cq;
|
902
910
|
grpc_millis deadline;
|
903
911
|
grpc_cq_completion* stolen_completion;
|
904
912
|
void* tag; /* for pluck */
|
905
913
|
bool first_loop;
|
906
|
-
}
|
907
|
-
|
914
|
+
};
|
908
915
|
class ExecCtxNext : public grpc_core::ExecCtx {
|
909
916
|
public:
|
910
917
|
ExecCtxNext(void* arg) : ExecCtx(0), check_ready_to_finish_arg_(arg) {}
|
@@ -944,21 +951,14 @@ class ExecCtxNext : public grpc_core::ExecCtx {
|
|
944
951
|
#ifndef NDEBUG
|
945
952
|
static void dump_pending_tags(grpc_completion_queue* cq) {
|
946
953
|
if (!GRPC_TRACE_FLAG_ENABLED(grpc_trace_pending_tags)) return;
|
947
|
-
|
948
|
-
|
949
|
-
gpr_strvec_init(&v);
|
950
|
-
gpr_strvec_add(&v, gpr_strdup("PENDING TAGS:"));
|
954
|
+
std::vector<std::string> parts;
|
955
|
+
parts.push_back("PENDING TAGS:");
|
951
956
|
gpr_mu_lock(cq->mu);
|
952
957
|
for (size_t i = 0; i < cq->outstanding_tag_count; i++) {
|
953
|
-
|
954
|
-
gpr_asprintf(&s, " %p", cq->outstanding_tags[i]);
|
955
|
-
gpr_strvec_add(&v, s);
|
958
|
+
parts.push_back(absl::StrFormat(" %p", cq->outstanding_tags[i]));
|
956
959
|
}
|
957
960
|
gpr_mu_unlock(cq->mu);
|
958
|
-
|
959
|
-
gpr_strvec_destroy(&v);
|
960
|
-
gpr_log(GPR_DEBUG, "%s", out);
|
961
|
-
gpr_free(out);
|
961
|
+
gpr_log(GPR_DEBUG, "%s", absl::StrJoin(parts, "").c_str());
|
962
962
|
}
|
963
963
|
#else
|
964
964
|
static void dump_pending_tags(grpc_completion_queue* /*cq*/) {}
|
@@ -22,47 +22,40 @@
|
|
22
22
|
|
23
23
|
#include <stdio.h>
|
24
24
|
|
25
|
+
#include <vector>
|
26
|
+
|
27
|
+
#include "absl/strings/str_format.h"
|
28
|
+
#include "absl/strings/str_join.h"
|
29
|
+
|
25
30
|
#include <grpc/byte_buffer.h>
|
26
31
|
#include <grpc/support/string_util.h>
|
27
32
|
#include "src/core/lib/gpr/string.h"
|
28
33
|
|
29
|
-
static void addhdr(
|
30
|
-
|
31
|
-
gpr_asprintf(&tmp, "tag:%p", ev->tag);
|
32
|
-
gpr_strvec_add(buf, tmp);
|
34
|
+
static void addhdr(grpc_event* ev, std::vector<std::string>* buf) {
|
35
|
+
buf->push_back(absl::StrFormat("tag:%p", ev->tag));
|
33
36
|
}
|
34
37
|
|
35
38
|
static const char* errstr(int success) { return success ? "OK" : "ERROR"; }
|
36
39
|
|
37
|
-
static void adderr(
|
38
|
-
|
39
|
-
gpr_asprintf(&tmp, " %s", errstr(success));
|
40
|
-
gpr_strvec_add(buf, tmp);
|
40
|
+
static void adderr(int success, std::vector<std::string>* buf) {
|
41
|
+
buf->push_back(absl::StrFormat(" %s", errstr(success)));
|
41
42
|
}
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
if (ev == nullptr) return gpr_strdup("null");
|
48
|
-
|
49
|
-
gpr_strvec_init(&buf);
|
50
|
-
|
44
|
+
std::string grpc_event_string(grpc_event* ev) {
|
45
|
+
if (ev == nullptr) return "null";
|
46
|
+
std::vector<std::string> out;
|
51
47
|
switch (ev->type) {
|
52
48
|
case GRPC_QUEUE_TIMEOUT:
|
53
|
-
|
49
|
+
out.push_back("QUEUE_TIMEOUT");
|
54
50
|
break;
|
55
51
|
case GRPC_QUEUE_SHUTDOWN:
|
56
|
-
|
52
|
+
out.push_back("QUEUE_SHUTDOWN");
|
57
53
|
break;
|
58
54
|
case GRPC_OP_COMPLETE:
|
59
|
-
|
60
|
-
addhdr(
|
61
|
-
adderr(
|
55
|
+
out.push_back("OP_COMPLETE: ");
|
56
|
+
addhdr(ev, &out);
|
57
|
+
adderr(ev->success, &out);
|
62
58
|
break;
|
63
59
|
}
|
64
|
-
|
65
|
-
out = gpr_strvec_flatten(&buf, nullptr);
|
66
|
-
gpr_strvec_destroy(&buf);
|
67
|
-
return out;
|
60
|
+
return absl::StrJoin(out, "");
|
68
61
|
}
|
@@ -21,9 +21,11 @@
|
|
21
21
|
|
22
22
|
#include <grpc/support/port_platform.h>
|
23
23
|
|
24
|
+
#include <string>
|
25
|
+
|
24
26
|
#include <grpc/grpc.h>
|
25
27
|
|
26
28
|
/* Returns a string describing an event. Must be later freed with gpr_free() */
|
27
|
-
|
29
|
+
std::string grpc_event_string(grpc_event* ev);
|
28
30
|
|
29
31
|
#endif /* GRPC_CORE_LIB_SURFACE_EVENT_STRING_H */
|
@@ -78,7 +78,4 @@ void grpc_register_security_filters(void) {
|
|
78
78
|
maybe_prepend_server_auth_filter, nullptr);
|
79
79
|
}
|
80
80
|
|
81
|
-
void grpc_security_init() {
|
82
|
-
grpc_core::SecurityRegisterHandshakerFactories();
|
83
|
-
grpc_control_plane_credentials_init();
|
84
|
-
}
|
81
|
+
void grpc_security_init() { grpc_core::SecurityRegisterHandshakerFactories(); }
|
@@ -52,11 +52,11 @@ grpc_core::TraceFlag grpc_server_channel_trace(false, "server_channel");
|
|
52
52
|
|
53
53
|
using grpc_core::LockedMultiProducerSingleConsumerQueue;
|
54
54
|
|
55
|
-
static void server_on_recv_initial_metadata(void* ptr, grpc_error* error);
|
56
|
-
static void server_recv_trailing_metadata_ready(void* user_data,
|
57
|
-
grpc_error* error);
|
58
|
-
|
59
55
|
namespace {
|
56
|
+
|
57
|
+
void server_on_recv_initial_metadata(void* ptr, grpc_error* error);
|
58
|
+
void server_recv_trailing_metadata_ready(void* user_data, grpc_error* error);
|
59
|
+
|
60
60
|
struct listener {
|
61
61
|
void* arg;
|
62
62
|
void (*start)(grpc_server* server, void* arg, grpc_pollset** pollsets,
|
@@ -72,17 +72,39 @@ enum requested_call_type { BATCH_CALL, REGISTERED_CALL };
|
|
72
72
|
struct registered_method;
|
73
73
|
|
74
74
|
struct requested_call {
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
75
|
+
requested_call(void* tag_arg, grpc_completion_queue* call_cq,
|
76
|
+
grpc_call** call_arg, grpc_metadata_array* initial_md,
|
77
|
+
grpc_call_details* details)
|
78
|
+
: type(BATCH_CALL),
|
79
|
+
tag(tag_arg),
|
80
|
+
cq_bound_to_call(call_cq),
|
81
|
+
call(call_arg),
|
82
|
+
initial_metadata(initial_md) {
|
83
|
+
details->reserved = nullptr;
|
84
|
+
data.batch.details = details;
|
85
|
+
}
|
86
|
+
|
87
|
+
requested_call(void* tag_arg, grpc_completion_queue* call_cq,
|
88
|
+
grpc_call** call_arg, grpc_metadata_array* initial_md,
|
89
|
+
registered_method* rm, gpr_timespec* deadline,
|
90
|
+
grpc_byte_buffer** optional_payload)
|
91
|
+
: type(REGISTERED_CALL),
|
92
|
+
tag(tag_arg),
|
93
|
+
cq_bound_to_call(call_cq),
|
94
|
+
call(call_arg),
|
95
|
+
initial_metadata(initial_md) {
|
96
|
+
data.registered.method = rm;
|
97
|
+
data.registered.deadline = deadline;
|
98
|
+
data.registered.optional_payload = optional_payload;
|
99
|
+
}
|
100
|
+
|
101
|
+
grpc_core::MultiProducerSingleConsumerQueue::Node mpscq_node;
|
102
|
+
const requested_call_type type;
|
103
|
+
void* const tag;
|
104
|
+
grpc_completion_queue* const cq_bound_to_call;
|
105
|
+
grpc_call** const call;
|
84
106
|
grpc_cq_completion completion;
|
85
|
-
grpc_metadata_array* initial_metadata;
|
107
|
+
grpc_metadata_array* const initial_metadata;
|
86
108
|
union {
|
87
109
|
struct {
|
88
110
|
grpc_call_details* details;
|
@@ -117,13 +139,13 @@ struct channel_data {
|
|
117
139
|
intptr_t channelz_socket_uuid;
|
118
140
|
};
|
119
141
|
|
120
|
-
|
142
|
+
struct shutdown_tag {
|
121
143
|
void* tag;
|
122
144
|
grpc_completion_queue* cq;
|
123
145
|
grpc_cq_completion completion;
|
124
|
-
}
|
146
|
+
};
|
125
147
|
|
126
|
-
|
148
|
+
enum call_state {
|
127
149
|
/* waiting for metadata */
|
128
150
|
NOT_STARTED,
|
129
151
|
/* initial metadata read, not flow controlled in yet */
|
@@ -132,9 +154,60 @@ typedef enum {
|
|
132
154
|
ACTIVATED,
|
133
155
|
/* cancelled before being queued */
|
134
156
|
ZOMBIED
|
135
|
-
}
|
157
|
+
};
|
136
158
|
|
137
|
-
|
159
|
+
struct call_data;
|
160
|
+
|
161
|
+
grpc_call_error ValidateServerRequest(
|
162
|
+
grpc_completion_queue* cq_for_notification, void* tag,
|
163
|
+
grpc_byte_buffer** optional_payload, registered_method* rm);
|
164
|
+
|
165
|
+
// RPCs that come in from the transport must be matched against RPC requests
|
166
|
+
// from the application. An incoming request from the application can be matched
|
167
|
+
// to an RPC that has already arrived or can be queued up for later use.
|
168
|
+
// Likewise, an RPC coming in from the transport can either be matched to a
|
169
|
+
// request that already arrived from the application or can be queued up for
|
170
|
+
// later use (marked pending). If there is a match, the request's tag is posted
|
171
|
+
// on the request's notification CQ.
|
172
|
+
//
|
173
|
+
// RequestMatcherInterface is the base class to provide this functionality.
|
174
|
+
class RequestMatcherInterface {
|
175
|
+
public:
|
176
|
+
virtual ~RequestMatcherInterface() {}
|
177
|
+
|
178
|
+
// Unref the calls associated with any incoming RPCs in the pending queue (not
|
179
|
+
// yet matched to an application-requested RPC).
|
180
|
+
virtual void ZombifyPending() = 0;
|
181
|
+
|
182
|
+
// Mark all application-requested RPCs failed if they have not been matched to
|
183
|
+
// an incoming RPC. The error parameter indicates why the RPCs are being
|
184
|
+
// failed (always server shutdown in all current implementations).
|
185
|
+
virtual void KillRequests(grpc_error* error) = 0;
|
186
|
+
|
187
|
+
// How many request queues are supported by this matcher. This is an abstract
|
188
|
+
// concept that essentially maps to gRPC completion queues.
|
189
|
+
virtual size_t request_queue_count() const = 0;
|
190
|
+
|
191
|
+
// This function is invoked when the application requests a new RPC whose
|
192
|
+
// information is in the call parameter. The request_queue_index marks the
|
193
|
+
// queue onto which to place this RPC, and is typically associated with a gRPC
|
194
|
+
// CQ. If there are pending RPCs waiting to be matched, publish one (match it
|
195
|
+
// and notify the CQ).
|
196
|
+
virtual void RequestCallWithPossiblePublish(size_t request_queue_index,
|
197
|
+
requested_call* call) = 0;
|
198
|
+
|
199
|
+
// This function is invoked on an incoming RPC, represented by the calld
|
200
|
+
// object. The RequestMatcher will try to match it against an
|
201
|
+
// application-requested RPC if possible or will place it in the pending queue
|
202
|
+
// otherwise. To enable some measure of fairness between server CQs, the match
|
203
|
+
// is done starting at the start_request_queue_index parameter in a cyclic
|
204
|
+
// order rather than always starting at 0.
|
205
|
+
virtual void MatchOrQueue(size_t start_request_queue_index,
|
206
|
+
call_data* calld) = 0;
|
207
|
+
|
208
|
+
// Returns the server associated with this request matcher
|
209
|
+
virtual grpc_server* server() const = 0;
|
210
|
+
};
|
138
211
|
|
139
212
|
struct call_data {
|
140
213
|
call_data(grpc_call_element* elem, const grpc_call_element_args& args)
|
@@ -144,7 +217,7 @@ struct call_data {
|
|
144
217
|
::server_on_recv_initial_metadata, elem,
|
145
218
|
grpc_schedule_on_exec_ctx);
|
146
219
|
GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready,
|
147
|
-
server_recv_trailing_metadata_ready, elem,
|
220
|
+
::server_recv_trailing_metadata_ready, elem,
|
148
221
|
grpc_schedule_on_exec_ctx);
|
149
222
|
}
|
150
223
|
~call_data() {
|
@@ -177,7 +250,7 @@ struct call_data {
|
|
177
250
|
grpc_metadata_array initial_metadata =
|
178
251
|
grpc_metadata_array(); // Zero-initialize the C struct.
|
179
252
|
|
180
|
-
|
253
|
+
RequestMatcherInterface* matcher = nullptr;
|
181
254
|
grpc_byte_buffer* payload = nullptr;
|
182
255
|
|
183
256
|
grpc_closure got_initial_metadata;
|
@@ -196,27 +269,31 @@ struct call_data {
|
|
196
269
|
grpc_core::CallCombiner* call_combiner;
|
197
270
|
};
|
198
271
|
|
199
|
-
struct request_matcher {
|
200
|
-
grpc_server* server;
|
201
|
-
call_data* pending_head;
|
202
|
-
call_data* pending_tail;
|
203
|
-
LockedMultiProducerSingleConsumerQueue* requests_per_cq;
|
204
|
-
};
|
205
|
-
|
206
272
|
struct registered_method {
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
273
|
+
registered_method(
|
274
|
+
const char* method_arg, const char* host_arg,
|
275
|
+
grpc_server_register_method_payload_handling payload_handling_arg,
|
276
|
+
uint32_t flags_arg)
|
277
|
+
: method(method_arg == nullptr ? "" : method_arg),
|
278
|
+
host(host_arg == nullptr ? "" : host_arg),
|
279
|
+
payload_handling(payload_handling_arg),
|
280
|
+
flags(flags_arg) {}
|
281
|
+
|
282
|
+
~registered_method() = default;
|
283
|
+
|
284
|
+
const std::string method;
|
285
|
+
const std::string host;
|
286
|
+
const grpc_server_register_method_payload_handling payload_handling;
|
287
|
+
const uint32_t flags;
|
211
288
|
/* one request matcher per method */
|
212
|
-
|
289
|
+
std::unique_ptr<RequestMatcherInterface> matcher;
|
213
290
|
registered_method* next;
|
214
291
|
};
|
215
292
|
|
216
|
-
|
293
|
+
struct channel_broadcaster {
|
217
294
|
grpc_channel** channels;
|
218
295
|
size_t num_channels;
|
219
|
-
}
|
296
|
+
};
|
220
297
|
} // namespace
|
221
298
|
|
222
299
|
struct grpc_server {
|
@@ -245,9 +322,13 @@ struct grpc_server {
|
|
245
322
|
bool starting;
|
246
323
|
gpr_cv starting_cv;
|
247
324
|
|
325
|
+
// TODO(vjpai): Convert from a linked-list head pointer to a std::vector once
|
326
|
+
// grpc_server has a real constructor/destructor
|
248
327
|
registered_method* registered_methods;
|
249
328
|
/** one request matcher for unregistered methods */
|
250
|
-
|
329
|
+
// TODO(vjpai): Convert to a std::unique_ptr once grpc_server has a real
|
330
|
+
// constructor and destructor.
|
331
|
+
RequestMatcherInterface* unregistered_request_matcher;
|
251
332
|
|
252
333
|
gpr_atm shutdown_flag;
|
253
334
|
uint8_t shutdown_published;
|
@@ -269,19 +350,26 @@ struct grpc_server {
|
|
269
350
|
#define SERVER_FROM_CALL_ELEM(elem) \
|
270
351
|
(((channel_data*)(elem)->channel_data)->server)
|
271
352
|
|
272
|
-
|
273
|
-
|
274
|
-
|
353
|
+
namespace {
|
354
|
+
void publish_call(grpc_server* server, call_data* calld, size_t cq_idx,
|
355
|
+
requested_call* rc);
|
356
|
+
void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc,
|
357
|
+
grpc_error* error);
|
275
358
|
/* Before calling maybe_finish_shutdown, we must hold mu_global and not
|
276
359
|
hold mu_call */
|
277
|
-
|
360
|
+
void maybe_finish_shutdown(grpc_server* server);
|
361
|
+
|
362
|
+
void kill_zombie(void* elem, grpc_error* /*error*/) {
|
363
|
+
grpc_call_unref(
|
364
|
+
grpc_call_from_top_element(static_cast<grpc_call_element*>(elem)));
|
365
|
+
}
|
278
366
|
|
279
367
|
/*
|
280
368
|
* channel broadcaster
|
281
369
|
*/
|
282
370
|
|
283
371
|
/* assumes server locked */
|
284
|
-
|
372
|
+
void channel_broadcaster_init(grpc_server* s, channel_broadcaster* cb) {
|
285
373
|
channel_data* c;
|
286
374
|
size_t count = 0;
|
287
375
|
for (c = s->root_channel_data.next; c != &s->root_channel_data; c = c->next) {
|
@@ -302,15 +390,15 @@ struct shutdown_cleanup_args {
|
|
302
390
|
grpc_slice slice;
|
303
391
|
};
|
304
392
|
|
305
|
-
|
393
|
+
void shutdown_cleanup(void* arg, grpc_error* /*error*/) {
|
306
394
|
struct shutdown_cleanup_args* a =
|
307
395
|
static_cast<struct shutdown_cleanup_args*>(arg);
|
308
396
|
grpc_slice_unref_internal(a->slice);
|
309
397
|
gpr_free(a);
|
310
398
|
}
|
311
399
|
|
312
|
-
|
313
|
-
|
400
|
+
void send_shutdown(grpc_channel* channel, bool send_goaway,
|
401
|
+
grpc_error* send_disconnect) {
|
314
402
|
struct shutdown_cleanup_args* sc =
|
315
403
|
static_cast<struct shutdown_cleanup_args*>(gpr_malloc(sizeof(*sc)));
|
316
404
|
GRPC_CLOSURE_INIT(&sc->closure, shutdown_cleanup, sc,
|
@@ -331,9 +419,8 @@ static void send_shutdown(grpc_channel* channel, bool send_goaway,
|
|
331
419
|
elem->filter->start_transport_op(elem, op);
|
332
420
|
}
|
333
421
|
|
334
|
-
|
335
|
-
|
336
|
-
grpc_error* force_disconnect) {
|
422
|
+
void channel_broadcaster_shutdown(channel_broadcaster* cb, bool send_goaway,
|
423
|
+
grpc_error* force_disconnect) {
|
337
424
|
size_t i;
|
338
425
|
|
339
426
|
for (i = 0; i < cb->num_channels; i++) {
|
@@ -349,63 +436,243 @@ static void channel_broadcaster_shutdown(channel_broadcaster* cb,
|
|
349
436
|
* request_matcher
|
350
437
|
*/
|
351
438
|
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
439
|
+
// The RealRequestMatcher is an implementation of RequestMatcherInterface that
|
440
|
+
// actually uses all the features of RequestMatcherInterface: expecting the
|
441
|
+
// application to explicitly request RPCs and then matching those to incoming
|
442
|
+
// RPCs, along with a slow path by which incoming RPCs are put on a locked
|
443
|
+
// pending list if they aren't able to be matched to an application request.
|
444
|
+
class RealRequestMatcher : public RequestMatcherInterface {
|
445
|
+
public:
|
446
|
+
explicit RealRequestMatcher(grpc_server* server)
|
447
|
+
: server_(server), requests_per_cq_(server->cq_count) {}
|
448
|
+
|
449
|
+
~RealRequestMatcher() override {
|
450
|
+
for (LockedMultiProducerSingleConsumerQueue& queue : requests_per_cq_) {
|
451
|
+
GPR_ASSERT(queue.Pop() == nullptr);
|
452
|
+
}
|
359
453
|
}
|
360
|
-
}
|
361
454
|
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
455
|
+
void ZombifyPending() override {
|
456
|
+
while (pending_head_ != nullptr) {
|
457
|
+
call_data* calld = pending_head_;
|
458
|
+
pending_head_ = calld->pending_next;
|
459
|
+
gpr_atm_no_barrier_store(&calld->state, ZOMBIED);
|
460
|
+
GRPC_CLOSURE_INIT(
|
461
|
+
&calld->kill_zombie_closure, kill_zombie,
|
462
|
+
grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
|
463
|
+
grpc_schedule_on_exec_ctx);
|
464
|
+
grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure,
|
465
|
+
GRPC_ERROR_NONE);
|
466
|
+
}
|
366
467
|
}
|
367
|
-
gpr_free(rm->requests_per_cq);
|
368
|
-
}
|
369
468
|
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
469
|
+
void KillRequests(grpc_error* error) override {
|
470
|
+
for (size_t i = 0; i < requests_per_cq_.size(); i++) {
|
471
|
+
requested_call* rc;
|
472
|
+
while ((rc = reinterpret_cast<requested_call*>(
|
473
|
+
requests_per_cq_[i].Pop())) != nullptr) {
|
474
|
+
fail_call(server_, i, rc, GRPC_ERROR_REF(error));
|
475
|
+
}
|
476
|
+
}
|
477
|
+
GRPC_ERROR_UNREF(error);
|
478
|
+
}
|
374
479
|
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
480
|
+
size_t request_queue_count() const override {
|
481
|
+
return requests_per_cq_.size();
|
482
|
+
}
|
483
|
+
|
484
|
+
void RequestCallWithPossiblePublish(size_t request_queue_index,
|
485
|
+
requested_call* call) override {
|
486
|
+
if (requests_per_cq_[request_queue_index].Push(&call->mpscq_node)) {
|
487
|
+
/* this was the first queued request: we need to lock and start
|
488
|
+
matching calls */
|
489
|
+
gpr_mu_lock(&server_->mu_call);
|
490
|
+
call_data* calld;
|
491
|
+
while ((calld = pending_head_) != nullptr) {
|
492
|
+
requested_call* rc = reinterpret_cast<requested_call*>(
|
493
|
+
requests_per_cq_[request_queue_index].Pop());
|
494
|
+
if (rc == nullptr) break;
|
495
|
+
pending_head_ = calld->pending_next;
|
496
|
+
gpr_mu_unlock(&server_->mu_call);
|
497
|
+
if (!gpr_atm_full_cas(&calld->state, PENDING, ACTIVATED)) {
|
498
|
+
// Zombied Call
|
499
|
+
GRPC_CLOSURE_INIT(
|
500
|
+
&calld->kill_zombie_closure, kill_zombie,
|
501
|
+
grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
|
502
|
+
grpc_schedule_on_exec_ctx);
|
503
|
+
grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure,
|
504
|
+
GRPC_ERROR_NONE);
|
505
|
+
} else {
|
506
|
+
publish_call(server_, calld, request_queue_index, rc);
|
507
|
+
}
|
508
|
+
gpr_mu_lock(&server_->mu_call);
|
509
|
+
}
|
510
|
+
gpr_mu_unlock(&server_->mu_call);
|
511
|
+
}
|
386
512
|
}
|
387
|
-
}
|
388
513
|
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
514
|
+
void MatchOrQueue(size_t start_request_queue_index,
|
515
|
+
call_data* calld) override {
|
516
|
+
for (size_t i = 0; i < requests_per_cq_.size(); i++) {
|
517
|
+
size_t cq_idx = (start_request_queue_index + i) % requests_per_cq_.size();
|
518
|
+
requested_call* rc =
|
519
|
+
reinterpret_cast<requested_call*>(requests_per_cq_[cq_idx].TryPop());
|
520
|
+
if (rc == nullptr) {
|
521
|
+
continue;
|
522
|
+
} else {
|
523
|
+
GRPC_STATS_INC_SERVER_CQS_CHECKED(i);
|
524
|
+
gpr_atm_no_barrier_store(&calld->state, ACTIVATED);
|
525
|
+
publish_call(server_, calld, cq_idx, rc);
|
526
|
+
return; /* early out */
|
527
|
+
}
|
528
|
+
}
|
529
|
+
|
530
|
+
/* no cq to take the request found: queue it on the slow list */
|
531
|
+
GRPC_STATS_INC_SERVER_SLOWPATH_REQUESTS_QUEUED();
|
532
|
+
gpr_mu_lock(&server_->mu_call);
|
533
|
+
|
534
|
+
// We need to ensure that all the queues are empty. We do this under
|
535
|
+
// the server mu_call lock to ensure that if something is added to
|
536
|
+
// an empty request queue, it will block until the call is actually
|
537
|
+
// added to the pending list.
|
538
|
+
for (size_t i = 0; i < requests_per_cq_.size(); i++) {
|
539
|
+
size_t cq_idx = (start_request_queue_index + i) % requests_per_cq_.size();
|
540
|
+
requested_call* rc =
|
541
|
+
reinterpret_cast<requested_call*>(requests_per_cq_[cq_idx].Pop());
|
542
|
+
if (rc == nullptr) {
|
543
|
+
continue;
|
544
|
+
} else {
|
545
|
+
gpr_mu_unlock(&server_->mu_call);
|
546
|
+
GRPC_STATS_INC_SERVER_CQS_CHECKED(i + requests_per_cq_.size());
|
547
|
+
gpr_atm_no_barrier_store(&calld->state, ACTIVATED);
|
548
|
+
publish_call(server_, calld, cq_idx, rc);
|
549
|
+
return; /* early out */
|
550
|
+
}
|
551
|
+
}
|
552
|
+
|
553
|
+
gpr_atm_no_barrier_store(&calld->state, PENDING);
|
554
|
+
if (pending_head_ == nullptr) {
|
555
|
+
pending_tail_ = pending_head_ = calld;
|
556
|
+
} else {
|
557
|
+
pending_tail_->pending_next = calld;
|
558
|
+
pending_tail_ = calld;
|
397
559
|
}
|
560
|
+
gpr_mu_unlock(&server_->mu_call);
|
561
|
+
}
|
562
|
+
|
563
|
+
grpc_server* server() const override { return server_; }
|
564
|
+
|
565
|
+
private:
|
566
|
+
grpc_server* const server_;
|
567
|
+
call_data* pending_head_ = nullptr;
|
568
|
+
call_data* pending_tail_ = nullptr;
|
569
|
+
std::vector<LockedMultiProducerSingleConsumerQueue> requests_per_cq_;
|
570
|
+
};
|
571
|
+
|
572
|
+
// AllocatingRequestMatchers don't allow the application to request an RPC in
|
573
|
+
// advance or queue up any incoming RPC for later match. Instead, MatchOrQueue
|
574
|
+
// will call out to an allocation function passed in at the construction of the
|
575
|
+
// object. These request matchers are designed for the C++ callback API, so they
|
576
|
+
// only support 1 completion queue (passed in at the constructor).
|
577
|
+
class AllocatingRequestMatcherBase : public RequestMatcherInterface {
|
578
|
+
public:
|
579
|
+
AllocatingRequestMatcherBase(grpc_server* server, grpc_completion_queue* cq)
|
580
|
+
: server_(server), cq_(cq) {
|
581
|
+
size_t idx;
|
582
|
+
for (idx = 0; idx < server->cq_count; idx++) {
|
583
|
+
if (server->cqs[idx] == cq) {
|
584
|
+
break;
|
585
|
+
}
|
586
|
+
}
|
587
|
+
GPR_ASSERT(idx < server->cq_count);
|
588
|
+
cq_idx_ = idx;
|
589
|
+
}
|
590
|
+
|
591
|
+
void ZombifyPending() override {}
|
592
|
+
|
593
|
+
void KillRequests(grpc_error* error) override { GRPC_ERROR_UNREF(error); }
|
594
|
+
|
595
|
+
size_t request_queue_count() const override { return 0; }
|
596
|
+
|
597
|
+
void RequestCallWithPossiblePublish(size_t /*request_queue_index*/,
|
598
|
+
requested_call* /*call*/) final {
|
599
|
+
GPR_ASSERT(false);
|
398
600
|
}
|
399
|
-
|
400
|
-
}
|
601
|
+
|
602
|
+
grpc_server* server() const override { return server_; }
|
603
|
+
|
604
|
+
// Supply the completion queue related to this request matcher
|
605
|
+
grpc_completion_queue* cq() const { return cq_; }
|
606
|
+
|
607
|
+
// Supply the completion queue's index relative to the server.
|
608
|
+
size_t cq_idx() const { return cq_idx_; }
|
609
|
+
|
610
|
+
private:
|
611
|
+
grpc_server* const server_;
|
612
|
+
grpc_completion_queue* const cq_;
|
613
|
+
size_t cq_idx_;
|
614
|
+
};
|
615
|
+
|
616
|
+
// An allocating request matcher for non-registered methods (used for generic
|
617
|
+
// API and unimplemented RPCs).
|
618
|
+
class AllocatingRequestMatcherBatch : public AllocatingRequestMatcherBase {
|
619
|
+
public:
|
620
|
+
AllocatingRequestMatcherBatch(
|
621
|
+
grpc_server* server, grpc_completion_queue* cq,
|
622
|
+
std::function<grpc_core::ServerBatchCallAllocation()> allocator)
|
623
|
+
: AllocatingRequestMatcherBase(server, cq),
|
624
|
+
allocator_(std::move(allocator)) {}
|
625
|
+
void MatchOrQueue(size_t /*start_request_queue_index*/,
|
626
|
+
call_data* calld) override {
|
627
|
+
grpc_core::ServerBatchCallAllocation call_info = allocator_();
|
628
|
+
GPR_ASSERT(ValidateServerRequest(cq(), static_cast<void*>(call_info.tag),
|
629
|
+
nullptr, nullptr) == GRPC_CALL_OK);
|
630
|
+
requested_call* rc = new requested_call(
|
631
|
+
static_cast<void*>(call_info.tag), cq(), call_info.call,
|
632
|
+
call_info.initial_metadata, call_info.details);
|
633
|
+
gpr_atm_no_barrier_store(&calld->state, ACTIVATED);
|
634
|
+
publish_call(server(), calld, cq_idx(), rc);
|
635
|
+
}
|
636
|
+
|
637
|
+
private:
|
638
|
+
std::function<grpc_core::ServerBatchCallAllocation()> allocator_;
|
639
|
+
};
|
640
|
+
|
641
|
+
// An allocating request matcher for registered methods.
|
642
|
+
class AllocatingRequestMatcherRegistered : public AllocatingRequestMatcherBase {
|
643
|
+
public:
|
644
|
+
AllocatingRequestMatcherRegistered(
|
645
|
+
grpc_server* server, grpc_completion_queue* cq, registered_method* rm,
|
646
|
+
std::function<grpc_core::ServerRegisteredCallAllocation()> allocator)
|
647
|
+
: AllocatingRequestMatcherBase(server, cq),
|
648
|
+
registered_method_(rm),
|
649
|
+
allocator_(std::move(allocator)) {}
|
650
|
+
void MatchOrQueue(size_t /*start_request_queue_index*/,
|
651
|
+
call_data* calld) override {
|
652
|
+
grpc_core::ServerRegisteredCallAllocation call_info = allocator_();
|
653
|
+
GPR_ASSERT(ValidateServerRequest(cq(), static_cast<void*>(call_info.tag),
|
654
|
+
call_info.optional_payload,
|
655
|
+
registered_method_) == GRPC_CALL_OK);
|
656
|
+
requested_call* rc = new requested_call(
|
657
|
+
static_cast<void*>(call_info.tag), cq(), call_info.call,
|
658
|
+
call_info.initial_metadata, registered_method_, call_info.deadline,
|
659
|
+
call_info.optional_payload);
|
660
|
+
gpr_atm_no_barrier_store(&calld->state, ACTIVATED);
|
661
|
+
publish_call(server(), calld, cq_idx(), rc);
|
662
|
+
}
|
663
|
+
|
664
|
+
private:
|
665
|
+
registered_method* const registered_method_;
|
666
|
+
std::function<grpc_core::ServerRegisteredCallAllocation()> allocator_;
|
667
|
+
};
|
401
668
|
|
402
669
|
/*
|
403
670
|
* server proper
|
404
671
|
*/
|
405
672
|
|
406
|
-
|
673
|
+
void server_ref(grpc_server* server) { server->internal_refcount.Ref(); }
|
407
674
|
|
408
|
-
|
675
|
+
void server_delete(grpc_server* server) {
|
409
676
|
registered_method* rm;
|
410
677
|
size_t i;
|
411
678
|
server->channelz_server.reset();
|
@@ -415,16 +682,9 @@ static void server_delete(grpc_server* server) {
|
|
415
682
|
gpr_cv_destroy(&server->starting_cv);
|
416
683
|
while ((rm = server->registered_methods) != nullptr) {
|
417
684
|
server->registered_methods = rm->next;
|
418
|
-
|
419
|
-
request_matcher_destroy(&rm->matcher);
|
420
|
-
}
|
421
|
-
gpr_free(rm->method);
|
422
|
-
gpr_free(rm->host);
|
423
|
-
gpr_free(rm);
|
424
|
-
}
|
425
|
-
if (server->started) {
|
426
|
-
request_matcher_destroy(&server->unregistered_request_matcher);
|
685
|
+
delete rm;
|
427
686
|
}
|
687
|
+
delete server->unregistered_request_matcher;
|
428
688
|
for (i = 0; i < server->cq_count; i++) {
|
429
689
|
GRPC_CQ_INTERNAL_UNREF(server->cqs[i], "server");
|
430
690
|
}
|
@@ -434,30 +694,28 @@ static void server_delete(grpc_server* server) {
|
|
434
694
|
gpr_free(server);
|
435
695
|
}
|
436
696
|
|
437
|
-
|
697
|
+
void server_unref(grpc_server* server) {
|
438
698
|
if (GPR_UNLIKELY(server->internal_refcount.Unref())) {
|
439
699
|
server_delete(server);
|
440
700
|
}
|
441
701
|
}
|
442
702
|
|
443
|
-
|
444
|
-
return chand->next == chand;
|
445
|
-
}
|
703
|
+
int is_channel_orphaned(channel_data* chand) { return chand->next == chand; }
|
446
704
|
|
447
|
-
|
705
|
+
void orphan_channel(channel_data* chand) {
|
448
706
|
chand->next->prev = chand->prev;
|
449
707
|
chand->prev->next = chand->next;
|
450
708
|
chand->next = chand->prev = chand;
|
451
709
|
}
|
452
710
|
|
453
|
-
|
711
|
+
void finish_destroy_channel(void* cd, grpc_error* /*error*/) {
|
454
712
|
channel_data* chand = static_cast<channel_data*>(cd);
|
455
713
|
grpc_server* server = chand->server;
|
456
714
|
GRPC_CHANNEL_INTERNAL_UNREF(chand->channel, "server");
|
457
715
|
server_unref(server);
|
458
716
|
}
|
459
717
|
|
460
|
-
|
718
|
+
void destroy_channel(channel_data* chand) {
|
461
719
|
if (is_channel_orphaned(chand)) return;
|
462
720
|
GPR_ASSERT(chand->server != nullptr);
|
463
721
|
orphan_channel(chand);
|
@@ -478,12 +736,12 @@ static void destroy_channel(channel_data* chand) {
|
|
478
736
|
op);
|
479
737
|
}
|
480
738
|
|
481
|
-
|
482
|
-
|
739
|
+
void done_request_event(void* req, grpc_cq_completion* /*c*/) {
|
740
|
+
delete static_cast<requested_call*>(req);
|
483
741
|
}
|
484
742
|
|
485
|
-
|
486
|
-
|
743
|
+
void publish_call(grpc_server* server, call_data* calld, size_t cq_idx,
|
744
|
+
requested_call* rc) {
|
487
745
|
grpc_call_set_completion_queue(calld->call, rc->cq_bound_to_call);
|
488
746
|
grpc_call* call = calld->call;
|
489
747
|
*rc->call = call;
|
@@ -515,12 +773,12 @@ static void publish_call(grpc_server* server, call_data* calld, size_t cq_idx,
|
|
515
773
|
rc, &rc->completion, true);
|
516
774
|
}
|
517
775
|
|
518
|
-
|
776
|
+
void publish_new_rpc(void* arg, grpc_error* error) {
|
519
777
|
grpc_call_element* call_elem = static_cast<grpc_call_element*>(arg);
|
520
778
|
call_data* calld = static_cast<call_data*>(call_elem->call_data);
|
521
779
|
channel_data* chand = static_cast<channel_data*>(call_elem->channel_data);
|
522
|
-
|
523
|
-
grpc_server* server = rm->server;
|
780
|
+
RequestMatcherInterface* rm = calld->matcher;
|
781
|
+
grpc_server* server = rm->server();
|
524
782
|
|
525
783
|
if (error != GRPC_ERROR_NONE || gpr_atm_acq_load(&server->shutdown_flag)) {
|
526
784
|
gpr_atm_no_barrier_store(&calld->state, ZOMBIED);
|
@@ -533,56 +791,11 @@ static void publish_new_rpc(void* arg, grpc_error* error) {
|
|
533
791
|
return;
|
534
792
|
}
|
535
793
|
|
536
|
-
|
537
|
-
size_t cq_idx = (chand->cq_idx + i) % server->cq_count;
|
538
|
-
requested_call* rc =
|
539
|
-
reinterpret_cast<requested_call*>(rm->requests_per_cq[cq_idx].TryPop());
|
540
|
-
if (rc == nullptr) {
|
541
|
-
continue;
|
542
|
-
} else {
|
543
|
-
GRPC_STATS_INC_SERVER_CQS_CHECKED(i);
|
544
|
-
gpr_atm_no_barrier_store(&calld->state, ACTIVATED);
|
545
|
-
publish_call(server, calld, cq_idx, rc);
|
546
|
-
return; /* early out */
|
547
|
-
}
|
548
|
-
}
|
549
|
-
|
550
|
-
/* no cq to take the request found: queue it on the slow list */
|
551
|
-
GRPC_STATS_INC_SERVER_SLOWPATH_REQUESTS_QUEUED();
|
552
|
-
gpr_mu_lock(&server->mu_call);
|
553
|
-
|
554
|
-
// We need to ensure that all the queues are empty. We do this under
|
555
|
-
// the server mu_call lock to ensure that if something is added to
|
556
|
-
// an empty request queue, it will block until the call is actually
|
557
|
-
// added to the pending list.
|
558
|
-
for (size_t i = 0; i < server->cq_count; i++) {
|
559
|
-
size_t cq_idx = (chand->cq_idx + i) % server->cq_count;
|
560
|
-
requested_call* rc =
|
561
|
-
reinterpret_cast<requested_call*>(rm->requests_per_cq[cq_idx].Pop());
|
562
|
-
if (rc == nullptr) {
|
563
|
-
continue;
|
564
|
-
} else {
|
565
|
-
gpr_mu_unlock(&server->mu_call);
|
566
|
-
GRPC_STATS_INC_SERVER_CQS_CHECKED(i + server->cq_count);
|
567
|
-
gpr_atm_no_barrier_store(&calld->state, ACTIVATED);
|
568
|
-
publish_call(server, calld, cq_idx, rc);
|
569
|
-
return; /* early out */
|
570
|
-
}
|
571
|
-
}
|
572
|
-
|
573
|
-
gpr_atm_no_barrier_store(&calld->state, PENDING);
|
574
|
-
if (rm->pending_head == nullptr) {
|
575
|
-
rm->pending_tail = rm->pending_head = calld;
|
576
|
-
} else {
|
577
|
-
rm->pending_tail->pending_next = calld;
|
578
|
-
rm->pending_tail = calld;
|
579
|
-
}
|
580
|
-
calld->pending_next = nullptr;
|
581
|
-
gpr_mu_unlock(&server->mu_call);
|
794
|
+
rm->MatchOrQueue(chand->cq_idx, calld);
|
582
795
|
}
|
583
796
|
|
584
|
-
|
585
|
-
grpc_server* server, grpc_call_element* elem,
|
797
|
+
void finish_start_new_rpc(
|
798
|
+
grpc_server* server, grpc_call_element* elem, RequestMatcherInterface* rm,
|
586
799
|
grpc_server_register_method_payload_handling payload_handling) {
|
587
800
|
call_data* calld = static_cast<call_data*>(elem->call_data);
|
588
801
|
|
@@ -615,7 +828,7 @@ static void finish_start_new_rpc(
|
|
615
828
|
}
|
616
829
|
}
|
617
830
|
|
618
|
-
|
831
|
+
void start_new_rpc(grpc_call_element* elem) {
|
619
832
|
channel_data* chand = static_cast<channel_data*>(elem->channel_data);
|
620
833
|
call_data* calld = static_cast<call_data*>(elem->call_data);
|
621
834
|
grpc_server* server = chand->server;
|
@@ -640,7 +853,8 @@ static void start_new_rpc(grpc_call_element* elem) {
|
|
640
853
|
GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) {
|
641
854
|
continue;
|
642
855
|
}
|
643
|
-
finish_start_new_rpc(server, elem,
|
856
|
+
finish_start_new_rpc(server, elem,
|
857
|
+
rm->server_registered_method->matcher.get(),
|
644
858
|
rm->server_registered_method->payload_handling);
|
645
859
|
return;
|
646
860
|
}
|
@@ -657,16 +871,17 @@ static void start_new_rpc(grpc_call_element* elem) {
|
|
657
871
|
GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) {
|
658
872
|
continue;
|
659
873
|
}
|
660
|
-
finish_start_new_rpc(server, elem,
|
874
|
+
finish_start_new_rpc(server, elem,
|
875
|
+
rm->server_registered_method->matcher.get(),
|
661
876
|
rm->server_registered_method->payload_handling);
|
662
877
|
return;
|
663
878
|
}
|
664
879
|
}
|
665
|
-
finish_start_new_rpc(server, elem,
|
880
|
+
finish_start_new_rpc(server, elem, server->unregistered_request_matcher,
|
666
881
|
GRPC_SRM_PAYLOAD_NONE);
|
667
882
|
}
|
668
883
|
|
669
|
-
|
884
|
+
int num_listeners(grpc_server* server) {
|
670
885
|
listener* l;
|
671
886
|
int n = 0;
|
672
887
|
for (l = server->listeners; l; l = l->next) {
|
@@ -675,12 +890,11 @@ static int num_listeners(grpc_server* server) {
|
|
675
890
|
return n;
|
676
891
|
}
|
677
892
|
|
678
|
-
|
679
|
-
grpc_cq_completion* /*completion*/) {
|
893
|
+
void done_shutdown_event(void* server, grpc_cq_completion* /*completion*/) {
|
680
894
|
server_unref(static_cast<grpc_server*>(server));
|
681
895
|
}
|
682
896
|
|
683
|
-
|
897
|
+
int num_channels(grpc_server* server) {
|
684
898
|
channel_data* chand;
|
685
899
|
int n = 0;
|
686
900
|
for (chand = server->root_channel_data.next;
|
@@ -690,23 +904,20 @@ static int num_channels(grpc_server* server) {
|
|
690
904
|
return n;
|
691
905
|
}
|
692
906
|
|
693
|
-
|
907
|
+
void kill_pending_work_locked(grpc_server* server, grpc_error* error) {
|
694
908
|
if (server->started) {
|
695
|
-
|
696
|
-
|
697
|
-
request_matcher_zombify_all_pending_calls(
|
698
|
-
&server->unregistered_request_matcher);
|
909
|
+
server->unregistered_request_matcher->KillRequests(GRPC_ERROR_REF(error));
|
910
|
+
server->unregistered_request_matcher->ZombifyPending();
|
699
911
|
for (registered_method* rm = server->registered_methods; rm;
|
700
912
|
rm = rm->next) {
|
701
|
-
|
702
|
-
|
703
|
-
request_matcher_zombify_all_pending_calls(&rm->matcher);
|
913
|
+
rm->matcher->KillRequests(GRPC_ERROR_REF(error));
|
914
|
+
rm->matcher->ZombifyPending();
|
704
915
|
}
|
705
916
|
}
|
706
917
|
GRPC_ERROR_UNREF(error);
|
707
918
|
}
|
708
919
|
|
709
|
-
|
920
|
+
void maybe_finish_shutdown(grpc_server* server) {
|
710
921
|
size_t i;
|
711
922
|
if (!gpr_atm_acq_load(&server->shutdown_flag) || server->shutdown_published) {
|
712
923
|
return;
|
@@ -741,7 +952,7 @@ static void maybe_finish_shutdown(grpc_server* server) {
|
|
741
952
|
}
|
742
953
|
}
|
743
954
|
|
744
|
-
|
955
|
+
void server_on_recv_initial_metadata(void* ptr, grpc_error* error) {
|
745
956
|
grpc_call_element* elem = static_cast<grpc_call_element*>(ptr);
|
746
957
|
call_data* calld = static_cast<call_data*>(elem->call_data);
|
747
958
|
grpc_millis op_deadline;
|
@@ -787,8 +998,7 @@ static void server_on_recv_initial_metadata(void* ptr, grpc_error* error) {
|
|
787
998
|
grpc_core::Closure::Run(DEBUG_LOCATION, closure, error);
|
788
999
|
}
|
789
1000
|
|
790
|
-
|
791
|
-
grpc_error* error) {
|
1001
|
+
void server_recv_trailing_metadata_ready(void* user_data, grpc_error* error) {
|
792
1002
|
grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
|
793
1003
|
call_data* calld = static_cast<call_data*>(elem->call_data);
|
794
1004
|
if (calld->on_done_recv_initial_metadata != nullptr) {
|
@@ -809,8 +1019,8 @@ static void server_recv_trailing_metadata_ready(void* user_data,
|
|
809
1019
|
calld->original_recv_trailing_metadata_ready, error);
|
810
1020
|
}
|
811
1021
|
|
812
|
-
|
813
|
-
|
1022
|
+
void server_mutate_op(grpc_call_element* elem,
|
1023
|
+
grpc_transport_stream_op_batch* op) {
|
814
1024
|
call_data* calld = static_cast<call_data*>(elem->call_data);
|
815
1025
|
|
816
1026
|
if (op->recv_initial_metadata) {
|
@@ -832,13 +1042,13 @@ static void server_mutate_op(grpc_call_element* elem,
|
|
832
1042
|
}
|
833
1043
|
}
|
834
1044
|
|
835
|
-
|
1045
|
+
void server_start_transport_stream_op_batch(
|
836
1046
|
grpc_call_element* elem, grpc_transport_stream_op_batch* op) {
|
837
1047
|
server_mutate_op(elem, op);
|
838
1048
|
grpc_call_next_op(elem, op);
|
839
1049
|
}
|
840
1050
|
|
841
|
-
|
1051
|
+
void got_initial_metadata(void* ptr, grpc_error* error) {
|
842
1052
|
grpc_call_element* elem = static_cast<grpc_call_element*>(ptr);
|
843
1053
|
call_data* calld = static_cast<call_data*>(elem->call_data);
|
844
1054
|
if (error == GRPC_ERROR_NONE) {
|
@@ -856,8 +1066,8 @@ static void got_initial_metadata(void* ptr, grpc_error* error) {
|
|
856
1066
|
}
|
857
1067
|
}
|
858
1068
|
|
859
|
-
|
860
|
-
|
1069
|
+
void accept_stream(void* cd, grpc_transport* /*transport*/,
|
1070
|
+
const void* transport_server_data) {
|
861
1071
|
channel_data* chand = static_cast<channel_data*>(cd);
|
862
1072
|
/* create a call */
|
863
1073
|
grpc_call_create_args args;
|
@@ -892,25 +1102,25 @@ static void accept_stream(void* cd, grpc_transport* /*transport*/,
|
|
892
1102
|
grpc_call_start_batch_and_execute(call, &op, 1, &calld->got_initial_metadata);
|
893
1103
|
}
|
894
1104
|
|
895
|
-
|
896
|
-
|
1105
|
+
grpc_error* server_init_call_elem(grpc_call_element* elem,
|
1106
|
+
const grpc_call_element_args* args) {
|
897
1107
|
channel_data* chand = static_cast<channel_data*>(elem->channel_data);
|
898
1108
|
server_ref(chand->server);
|
899
1109
|
new (elem->call_data) call_data(elem, *args);
|
900
1110
|
return GRPC_ERROR_NONE;
|
901
1111
|
}
|
902
1112
|
|
903
|
-
|
904
|
-
|
905
|
-
|
1113
|
+
void server_destroy_call_elem(grpc_call_element* elem,
|
1114
|
+
const grpc_call_final_info* /*final_info*/,
|
1115
|
+
grpc_closure* /*ignored*/) {
|
906
1116
|
call_data* calld = static_cast<call_data*>(elem->call_data);
|
907
1117
|
calld->~call_data();
|
908
1118
|
channel_data* chand = static_cast<channel_data*>(elem->channel_data);
|
909
1119
|
server_unref(chand->server);
|
910
1120
|
}
|
911
1121
|
|
912
|
-
|
913
|
-
|
1122
|
+
grpc_error* server_init_channel_elem(grpc_channel_element* elem,
|
1123
|
+
grpc_channel_element_args* args) {
|
914
1124
|
channel_data* chand = static_cast<channel_data*>(elem->channel_data);
|
915
1125
|
GPR_ASSERT(args->is_first);
|
916
1126
|
GPR_ASSERT(!args->is_last);
|
@@ -921,7 +1131,7 @@ static grpc_error* server_init_channel_elem(grpc_channel_element* elem,
|
|
921
1131
|
return GRPC_ERROR_NONE;
|
922
1132
|
}
|
923
1133
|
|
924
|
-
|
1134
|
+
void server_destroy_channel_elem(grpc_channel_element* elem) {
|
925
1135
|
size_t i;
|
926
1136
|
channel_data* chand = static_cast<channel_data*>(elem->channel_data);
|
927
1137
|
if (chand->registered_methods) {
|
@@ -955,6 +1165,115 @@ static void server_destroy_channel_elem(grpc_channel_element* elem) {
|
|
955
1165
|
}
|
956
1166
|
}
|
957
1167
|
|
1168
|
+
void register_completion_queue(grpc_server* server, grpc_completion_queue* cq,
|
1169
|
+
void* reserved) {
|
1170
|
+
size_t i, n;
|
1171
|
+
GPR_ASSERT(!reserved);
|
1172
|
+
for (i = 0; i < server->cq_count; i++) {
|
1173
|
+
if (server->cqs[i] == cq) return;
|
1174
|
+
}
|
1175
|
+
|
1176
|
+
GRPC_CQ_INTERNAL_REF(cq, "server");
|
1177
|
+
n = server->cq_count++;
|
1178
|
+
server->cqs = static_cast<grpc_completion_queue**>(gpr_realloc(
|
1179
|
+
server->cqs, server->cq_count * sizeof(grpc_completion_queue*)));
|
1180
|
+
server->cqs[n] = cq;
|
1181
|
+
}
|
1182
|
+
|
1183
|
+
bool streq(const std::string& a, const char* b) {
|
1184
|
+
return (a.empty() && b == nullptr) ||
|
1185
|
+
((b != nullptr) && !strcmp(a.c_str(), b));
|
1186
|
+
}
|
1187
|
+
|
1188
|
+
class ConnectivityWatcher
|
1189
|
+
: public grpc_core::AsyncConnectivityStateWatcherInterface {
|
1190
|
+
public:
|
1191
|
+
explicit ConnectivityWatcher(channel_data* chand) : chand_(chand) {
|
1192
|
+
GRPC_CHANNEL_INTERNAL_REF(chand_->channel, "connectivity");
|
1193
|
+
}
|
1194
|
+
|
1195
|
+
~ConnectivityWatcher() {
|
1196
|
+
GRPC_CHANNEL_INTERNAL_UNREF(chand_->channel, "connectivity");
|
1197
|
+
}
|
1198
|
+
|
1199
|
+
private:
|
1200
|
+
void OnConnectivityStateChange(grpc_connectivity_state new_state) override {
|
1201
|
+
// Don't do anything until we are being shut down.
|
1202
|
+
if (new_state != GRPC_CHANNEL_SHUTDOWN) return;
|
1203
|
+
// Shut down channel.
|
1204
|
+
grpc_server* server = chand_->server;
|
1205
|
+
gpr_mu_lock(&server->mu_global);
|
1206
|
+
destroy_channel(chand_);
|
1207
|
+
gpr_mu_unlock(&server->mu_global);
|
1208
|
+
}
|
1209
|
+
|
1210
|
+
channel_data* chand_;
|
1211
|
+
};
|
1212
|
+
|
1213
|
+
void done_published_shutdown(void* done_arg, grpc_cq_completion* storage) {
|
1214
|
+
(void)done_arg;
|
1215
|
+
gpr_free(storage);
|
1216
|
+
}
|
1217
|
+
|
1218
|
+
void listener_destroy_done(void* s, grpc_error* /*error*/) {
|
1219
|
+
grpc_server* server = static_cast<grpc_server*>(s);
|
1220
|
+
gpr_mu_lock(&server->mu_global);
|
1221
|
+
server->listeners_destroyed++;
|
1222
|
+
maybe_finish_shutdown(server);
|
1223
|
+
gpr_mu_unlock(&server->mu_global);
|
1224
|
+
}
|
1225
|
+
|
1226
|
+
grpc_call_error queue_call_request(grpc_server* server, size_t cq_idx,
|
1227
|
+
requested_call* rc) {
|
1228
|
+
if (gpr_atm_acq_load(&server->shutdown_flag)) {
|
1229
|
+
fail_call(server, cq_idx, rc,
|
1230
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
|
1231
|
+
return GRPC_CALL_OK;
|
1232
|
+
}
|
1233
|
+
RequestMatcherInterface* rm;
|
1234
|
+
switch (rc->type) {
|
1235
|
+
case BATCH_CALL:
|
1236
|
+
rm = server->unregistered_request_matcher;
|
1237
|
+
break;
|
1238
|
+
case REGISTERED_CALL:
|
1239
|
+
rm = rc->data.registered.method->matcher.get();
|
1240
|
+
break;
|
1241
|
+
}
|
1242
|
+
rm->RequestCallWithPossiblePublish(cq_idx, rc);
|
1243
|
+
return GRPC_CALL_OK;
|
1244
|
+
}
|
1245
|
+
|
1246
|
+
void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc,
|
1247
|
+
grpc_error* error) {
|
1248
|
+
*rc->call = nullptr;
|
1249
|
+
rc->initial_metadata->count = 0;
|
1250
|
+
GPR_ASSERT(error != GRPC_ERROR_NONE);
|
1251
|
+
|
1252
|
+
grpc_cq_end_op(server->cqs[cq_idx], rc->tag, error, done_request_event, rc,
|
1253
|
+
&rc->completion);
|
1254
|
+
}
|
1255
|
+
} // namespace
|
1256
|
+
|
1257
|
+
namespace grpc_core {
|
1258
|
+
|
1259
|
+
void SetServerRegisteredMethodAllocator(
|
1260
|
+
grpc_server* server, grpc_completion_queue* cq, void* method_tag,
|
1261
|
+
std::function<ServerRegisteredCallAllocation()> allocator) {
|
1262
|
+
registered_method* rm = static_cast<registered_method*>(method_tag);
|
1263
|
+
rm->matcher.reset(new AllocatingRequestMatcherRegistered(
|
1264
|
+
server, cq, rm, std::move(allocator)));
|
1265
|
+
}
|
1266
|
+
|
1267
|
+
void SetServerBatchMethodAllocator(
|
1268
|
+
grpc_server* server, grpc_completion_queue* cq,
|
1269
|
+
std::function<ServerBatchCallAllocation()> allocator) {
|
1270
|
+
GPR_DEBUG_ASSERT(server->unregistered_request_matcher == nullptr);
|
1271
|
+
server->unregistered_request_matcher =
|
1272
|
+
new AllocatingRequestMatcherBatch(server, cq, std::move(allocator));
|
1273
|
+
}
|
1274
|
+
|
1275
|
+
}; // namespace grpc_core
|
1276
|
+
|
958
1277
|
const grpc_channel_filter grpc_server_top_filter = {
|
959
1278
|
server_start_transport_stream_op_batch,
|
960
1279
|
grpc_channel_next_op,
|
@@ -969,22 +1288,6 @@ const grpc_channel_filter grpc_server_top_filter = {
|
|
969
1288
|
"server",
|
970
1289
|
};
|
971
1290
|
|
972
|
-
static void register_completion_queue(grpc_server* server,
|
973
|
-
grpc_completion_queue* cq,
|
974
|
-
void* reserved) {
|
975
|
-
size_t i, n;
|
976
|
-
GPR_ASSERT(!reserved);
|
977
|
-
for (i = 0; i < server->cq_count; i++) {
|
978
|
-
if (server->cqs[i] == cq) return;
|
979
|
-
}
|
980
|
-
|
981
|
-
GRPC_CQ_INTERNAL_REF(cq, "server");
|
982
|
-
n = server->cq_count++;
|
983
|
-
server->cqs = static_cast<grpc_completion_queue**>(gpr_realloc(
|
984
|
-
server->cqs, server->cq_count * sizeof(grpc_completion_queue*)));
|
985
|
-
server->cqs[n] = cq;
|
986
|
-
}
|
987
|
-
|
988
1291
|
void grpc_server_register_completion_queue(grpc_server* server,
|
989
1292
|
grpc_completion_queue* cq,
|
990
1293
|
void* reserved) {
|
@@ -1050,13 +1353,6 @@ grpc_server* grpc_server_create(const grpc_channel_args* args, void* reserved) {
|
|
1050
1353
|
return server;
|
1051
1354
|
}
|
1052
1355
|
|
1053
|
-
static int streq(const char* a, const char* b) {
|
1054
|
-
if (a == nullptr && b == nullptr) return 1;
|
1055
|
-
if (a == nullptr) return 0;
|
1056
|
-
if (b == nullptr) return 0;
|
1057
|
-
return 0 == strcmp(a, b);
|
1058
|
-
}
|
1059
|
-
|
1060
1356
|
void* grpc_server_register_method(
|
1061
1357
|
grpc_server* server, const char* method, const char* host,
|
1062
1358
|
grpc_server_register_method_payload_handling payload_handling,
|
@@ -1083,12 +1379,8 @@ void* grpc_server_register_method(
|
|
1083
1379
|
flags);
|
1084
1380
|
return nullptr;
|
1085
1381
|
}
|
1086
|
-
m =
|
1087
|
-
m->method = gpr_strdup(method);
|
1088
|
-
m->host = gpr_strdup(host);
|
1382
|
+
m = new registered_method(method, host, payload_handling, flags);
|
1089
1383
|
m->next = server->registered_methods;
|
1090
|
-
m->payload_handling = payload_handling;
|
1091
|
-
m->flags = flags;
|
1092
1384
|
server->registered_methods = m;
|
1093
1385
|
return m;
|
1094
1386
|
}
|
@@ -1109,9 +1401,13 @@ void grpc_server_start(grpc_server* server) {
|
|
1109
1401
|
grpc_cq_pollset(server->cqs[i]);
|
1110
1402
|
}
|
1111
1403
|
}
|
1112
|
-
|
1404
|
+
if (server->unregistered_request_matcher == nullptr) {
|
1405
|
+
server->unregistered_request_matcher = new RealRequestMatcher(server);
|
1406
|
+
}
|
1113
1407
|
for (registered_method* rm = server->registered_methods; rm; rm = rm->next) {
|
1114
|
-
|
1408
|
+
if (rm->matcher == nullptr) {
|
1409
|
+
rm->matcher.reset(new RealRequestMatcher(server));
|
1410
|
+
}
|
1115
1411
|
}
|
1116
1412
|
|
1117
1413
|
gpr_mu_lock(&server->mu_global);
|
@@ -1134,31 +1430,6 @@ void grpc_server_get_pollsets(grpc_server* server, grpc_pollset*** pollsets,
|
|
1134
1430
|
*pollsets = server->pollsets;
|
1135
1431
|
}
|
1136
1432
|
|
1137
|
-
class ConnectivityWatcher
|
1138
|
-
: public grpc_core::AsyncConnectivityStateWatcherInterface {
|
1139
|
-
public:
|
1140
|
-
explicit ConnectivityWatcher(channel_data* chand) : chand_(chand) {
|
1141
|
-
GRPC_CHANNEL_INTERNAL_REF(chand_->channel, "connectivity");
|
1142
|
-
}
|
1143
|
-
|
1144
|
-
~ConnectivityWatcher() {
|
1145
|
-
GRPC_CHANNEL_INTERNAL_UNREF(chand_->channel, "connectivity");
|
1146
|
-
}
|
1147
|
-
|
1148
|
-
private:
|
1149
|
-
void OnConnectivityStateChange(grpc_connectivity_state new_state) override {
|
1150
|
-
// Don't do anything until we are being shut down.
|
1151
|
-
if (new_state != GRPC_CHANNEL_SHUTDOWN) return;
|
1152
|
-
// Shut down channel.
|
1153
|
-
grpc_server* server = chand_->server;
|
1154
|
-
gpr_mu_lock(&server->mu_global);
|
1155
|
-
destroy_channel(chand_);
|
1156
|
-
gpr_mu_unlock(&server->mu_global);
|
1157
|
-
}
|
1158
|
-
|
1159
|
-
channel_data* chand_;
|
1160
|
-
};
|
1161
|
-
|
1162
1433
|
void grpc_server_setup_transport(
|
1163
1434
|
grpc_server* s, grpc_transport* transport, grpc_pollset* accepting_pollset,
|
1164
1435
|
const grpc_channel_args* args,
|
@@ -1215,10 +1486,10 @@ void grpc_server_setup_transport(
|
|
1215
1486
|
static_cast<channel_registered_method*>(gpr_zalloc(alloc));
|
1216
1487
|
for (rm = s->registered_methods; rm; rm = rm->next) {
|
1217
1488
|
grpc_core::ExternallyManagedSlice host;
|
1218
|
-
grpc_core::ExternallyManagedSlice method(rm->method);
|
1219
|
-
const bool has_host = rm->host
|
1489
|
+
grpc_core::ExternallyManagedSlice method(rm->method.c_str());
|
1490
|
+
const bool has_host = !rm->host.empty();
|
1220
1491
|
if (has_host) {
|
1221
|
-
host = grpc_core::ExternallyManagedSlice(rm->host);
|
1492
|
+
host = grpc_core::ExternallyManagedSlice(rm->host.c_str());
|
1222
1493
|
}
|
1223
1494
|
hash = GRPC_MDSTR_KV_HASH(has_host ? host.Hash() : 0, method.Hash());
|
1224
1495
|
for (probes = 0; chand->registered_methods[(hash + probes) % slots]
|
@@ -1258,19 +1529,6 @@ void grpc_server_setup_transport(
|
|
1258
1529
|
grpc_transport_perform_op(transport, op);
|
1259
1530
|
}
|
1260
1531
|
|
1261
|
-
void done_published_shutdown(void* done_arg, grpc_cq_completion* storage) {
|
1262
|
-
(void)done_arg;
|
1263
|
-
gpr_free(storage);
|
1264
|
-
}
|
1265
|
-
|
1266
|
-
static void listener_destroy_done(void* s, grpc_error* /*error*/) {
|
1267
|
-
grpc_server* server = static_cast<grpc_server*>(s);
|
1268
|
-
gpr_mu_lock(&server->mu_global);
|
1269
|
-
server->listeners_destroyed++;
|
1270
|
-
maybe_finish_shutdown(server);
|
1271
|
-
gpr_mu_unlock(&server->mu_global);
|
1272
|
-
}
|
1273
|
-
|
1274
1532
|
/*
|
1275
1533
|
- Kills all pending requests-for-incoming-RPC-calls (i.e the requests made via
|
1276
1534
|
grpc_server_request_call and grpc_server_request_registered call will now be
|
@@ -1420,59 +1678,51 @@ void grpc_server_add_listener(
|
|
1420
1678
|
server->listeners = l;
|
1421
1679
|
}
|
1422
1680
|
|
1423
|
-
|
1424
|
-
|
1425
|
-
|
1426
|
-
|
1427
|
-
if (
|
1428
|
-
|
1429
|
-
|
1430
|
-
return
|
1681
|
+
namespace {
|
1682
|
+
grpc_call_error ValidateServerRequest(
|
1683
|
+
grpc_completion_queue* cq_for_notification, void* tag,
|
1684
|
+
grpc_byte_buffer** optional_payload, registered_method* rm) {
|
1685
|
+
if ((rm == nullptr && optional_payload != nullptr) ||
|
1686
|
+
((rm != nullptr) && ((optional_payload == nullptr) !=
|
1687
|
+
(rm->payload_handling == GRPC_SRM_PAYLOAD_NONE)))) {
|
1688
|
+
return GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH;
|
1431
1689
|
}
|
1432
|
-
|
1433
|
-
|
1434
|
-
rm = &server->unregistered_request_matcher;
|
1435
|
-
break;
|
1436
|
-
case REGISTERED_CALL:
|
1437
|
-
rm = &rc->data.registered.method->matcher;
|
1438
|
-
break;
|
1690
|
+
if (grpc_cq_begin_op(cq_for_notification, tag) == false) {
|
1691
|
+
return GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN;
|
1439
1692
|
}
|
1440
|
-
|
1441
|
-
|
1442
|
-
|
1443
|
-
|
1444
|
-
|
1445
|
-
|
1446
|
-
|
1447
|
-
|
1448
|
-
|
1449
|
-
|
1450
|
-
// Zombied Call
|
1451
|
-
GRPC_CLOSURE_INIT(
|
1452
|
-
&calld->kill_zombie_closure, kill_zombie,
|
1453
|
-
grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
|
1454
|
-
grpc_schedule_on_exec_ctx);
|
1455
|
-
grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure,
|
1456
|
-
GRPC_ERROR_NONE);
|
1457
|
-
} else {
|
1458
|
-
publish_call(server, calld, cq_idx, rc);
|
1459
|
-
}
|
1460
|
-
gpr_mu_lock(&server->mu_call);
|
1693
|
+
return GRPC_CALL_OK;
|
1694
|
+
}
|
1695
|
+
grpc_call_error ValidateServerRequestAndCq(
|
1696
|
+
size_t* cq_idx, grpc_server* server,
|
1697
|
+
grpc_completion_queue* cq_for_notification, void* tag,
|
1698
|
+
grpc_byte_buffer** optional_payload, registered_method* rm) {
|
1699
|
+
size_t idx;
|
1700
|
+
for (idx = 0; idx < server->cq_count; idx++) {
|
1701
|
+
if (server->cqs[idx] == cq_for_notification) {
|
1702
|
+
break;
|
1461
1703
|
}
|
1462
|
-
gpr_mu_unlock(&server->mu_call);
|
1463
1704
|
}
|
1705
|
+
if (idx == server->cq_count) {
|
1706
|
+
return GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
|
1707
|
+
}
|
1708
|
+
grpc_call_error error =
|
1709
|
+
ValidateServerRequest(cq_for_notification, tag, optional_payload, rm);
|
1710
|
+
if (error != GRPC_CALL_OK) {
|
1711
|
+
return error;
|
1712
|
+
}
|
1713
|
+
|
1714
|
+
*cq_idx = idx;
|
1464
1715
|
return GRPC_CALL_OK;
|
1465
1716
|
}
|
1717
|
+
} // namespace
|
1466
1718
|
|
1467
1719
|
grpc_call_error grpc_server_request_call(
|
1468
1720
|
grpc_server* server, grpc_call** call, grpc_call_details* details,
|
1469
1721
|
grpc_metadata_array* initial_metadata,
|
1470
1722
|
grpc_completion_queue* cq_bound_to_call,
|
1471
1723
|
grpc_completion_queue* cq_for_notification, void* tag) {
|
1472
|
-
grpc_call_error error;
|
1473
1724
|
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
|
1474
1725
|
grpc_core::ExecCtx exec_ctx;
|
1475
|
-
requested_call* rc = static_cast<requested_call*>(gpr_malloc(sizeof(*rc)));
|
1476
1726
|
GRPC_STATS_INC_SERVER_REQUESTED_CALLS();
|
1477
1727
|
GRPC_API_TRACE(
|
1478
1728
|
"grpc_server_request_call("
|
@@ -1481,35 +1731,17 @@ grpc_call_error grpc_server_request_call(
|
|
1481
1731
|
7,
|
1482
1732
|
(server, call, details, initial_metadata, cq_bound_to_call,
|
1483
1733
|
cq_for_notification, tag));
|
1734
|
+
|
1484
1735
|
size_t cq_idx;
|
1485
|
-
|
1486
|
-
|
1487
|
-
|
1488
|
-
|
1489
|
-
}
|
1490
|
-
if (cq_idx == server->cq_count) {
|
1491
|
-
gpr_free(rc);
|
1492
|
-
error = GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
|
1493
|
-
goto done;
|
1736
|
+
grpc_call_error error = ValidateServerRequestAndCq(
|
1737
|
+
&cq_idx, server, cq_for_notification, tag, nullptr, nullptr);
|
1738
|
+
if (error != GRPC_CALL_OK) {
|
1739
|
+
return error;
|
1494
1740
|
}
|
1495
|
-
|
1496
|
-
|
1497
|
-
|
1498
|
-
|
1499
|
-
}
|
1500
|
-
details->reserved = nullptr;
|
1501
|
-
rc->cq_idx = cq_idx;
|
1502
|
-
rc->type = BATCH_CALL;
|
1503
|
-
rc->server = server;
|
1504
|
-
rc->tag = tag;
|
1505
|
-
rc->cq_bound_to_call = cq_bound_to_call;
|
1506
|
-
rc->call = call;
|
1507
|
-
rc->data.batch.details = details;
|
1508
|
-
rc->initial_metadata = initial_metadata;
|
1509
|
-
error = queue_call_request(server, cq_idx, rc);
|
1510
|
-
done:
|
1511
|
-
|
1512
|
-
return error;
|
1741
|
+
|
1742
|
+
requested_call* rc = new requested_call(tag, cq_bound_to_call, call,
|
1743
|
+
initial_metadata, details);
|
1744
|
+
return queue_call_request(server, cq_idx, rc);
|
1513
1745
|
}
|
1514
1746
|
|
1515
1747
|
grpc_call_error grpc_server_request_registered_call(
|
@@ -1520,7 +1752,6 @@ grpc_call_error grpc_server_request_registered_call(
|
|
1520
1752
|
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
|
1521
1753
|
grpc_core::ExecCtx exec_ctx;
|
1522
1754
|
GRPC_STATS_INC_SERVER_REQUESTED_CALLS();
|
1523
|
-
requested_call* rc = static_cast<requested_call*>(gpr_malloc(sizeof(*rc)));
|
1524
1755
|
registered_method* rm = static_cast<registered_method*>(rmp);
|
1525
1756
|
GRPC_API_TRACE(
|
1526
1757
|
"grpc_server_request_registered_call("
|
@@ -1532,48 +1763,18 @@ grpc_call_error grpc_server_request_registered_call(
|
|
1532
1763
|
cq_bound_to_call, cq_for_notification, tag));
|
1533
1764
|
|
1534
1765
|
size_t cq_idx;
|
1535
|
-
|
1536
|
-
|
1537
|
-
|
1538
|
-
|
1539
|
-
}
|
1540
|
-
if (cq_idx == server->cq_count) {
|
1541
|
-
gpr_free(rc);
|
1542
|
-
return GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
|
1543
|
-
}
|
1544
|
-
if ((optional_payload == nullptr) !=
|
1545
|
-
(rm->payload_handling == GRPC_SRM_PAYLOAD_NONE)) {
|
1546
|
-
gpr_free(rc);
|
1547
|
-
return GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH;
|
1766
|
+
grpc_call_error error = ValidateServerRequestAndCq(
|
1767
|
+
&cq_idx, server, cq_for_notification, tag, optional_payload, rm);
|
1768
|
+
if (error != GRPC_CALL_OK) {
|
1769
|
+
return error;
|
1548
1770
|
}
|
1549
1771
|
|
1550
|
-
|
1551
|
-
|
1552
|
-
|
1553
|
-
}
|
1554
|
-
rc->cq_idx = cq_idx;
|
1555
|
-
rc->type = REGISTERED_CALL;
|
1556
|
-
rc->server = server;
|
1557
|
-
rc->tag = tag;
|
1558
|
-
rc->cq_bound_to_call = cq_bound_to_call;
|
1559
|
-
rc->call = call;
|
1560
|
-
rc->data.registered.method = rm;
|
1561
|
-
rc->data.registered.deadline = deadline;
|
1562
|
-
rc->initial_metadata = initial_metadata;
|
1563
|
-
rc->data.registered.optional_payload = optional_payload;
|
1772
|
+
requested_call* rc =
|
1773
|
+
new requested_call(tag, cq_bound_to_call, call, initial_metadata, rm,
|
1774
|
+
deadline, optional_payload);
|
1564
1775
|
return queue_call_request(server, cq_idx, rc);
|
1565
1776
|
}
|
1566
1777
|
|
1567
|
-
static void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc,
|
1568
|
-
grpc_error* error) {
|
1569
|
-
*rc->call = nullptr;
|
1570
|
-
rc->initial_metadata->count = 0;
|
1571
|
-
GPR_ASSERT(error != GRPC_ERROR_NONE);
|
1572
|
-
|
1573
|
-
grpc_cq_end_op(server->cqs[cq_idx], rc->tag, error, done_request_event, rc,
|
1574
|
-
&rc->completion);
|
1575
|
-
}
|
1576
|
-
|
1577
1778
|
const grpc_channel_args* grpc_server_get_channel_args(grpc_server* server) {
|
1578
1779
|
return server->channel_args;
|
1579
1780
|
}
|