grpc 1.30.1 → 1.32.0.pre1
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 +723 -15910
- data/include/grpc/grpc_security.h +31 -14
- data/include/grpc/grpc_security_constants.h +3 -0
- data/include/grpc/impl/codegen/README.md +22 -0
- data/include/grpc/impl/codegen/grpc_types.h +7 -5
- data/include/grpc/impl/codegen/port_platform.h +6 -33
- data/src/core/ext/filters/client_channel/backend_metric.cc +12 -9
- data/src/core/ext/filters/client_channel/backup_poller.cc +3 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +470 -285
- data/src/core/ext/filters/client_channel/client_channel.h +1 -1
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +0 -3
- data/src/core/ext/filters/client_channel/config_selector.cc +62 -0
- data/src/core/ext/filters/client_channel/config_selector.h +93 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -2
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +8 -1
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +8 -8
- data/src/core/ext/filters/client_channel/http_proxy.cc +6 -4
- data/src/core/ext/filters/client_channel/lb_policy.h +4 -0
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +6 -4
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +59 -36
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -13
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +0 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -37
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +19 -13
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +29 -10
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -4
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +4 -6
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +23 -13
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +18 -12
- data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +22 -14
- data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +18 -9
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +385 -78
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +5 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +6 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +8 -6
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +9 -7
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +7 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +36 -51
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +383 -31
- data/src/core/ext/filters/client_channel/resolver_registry.cc +13 -14
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +6 -7
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +0 -1
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +38 -32
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +39 -20
- data/src/core/ext/filters/client_channel/server_address.cc +40 -7
- data/src/core/ext/filters/client_channel/server_address.h +42 -4
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +142 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +65 -24
- data/src/core/ext/filters/client_channel/subchannel.h +16 -4
- data/src/core/ext/filters/http/client/http_client_filter.cc +5 -5
- data/src/core/ext/filters/http/http_filters_plugin.cc +2 -1
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +74 -33
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +3 -1
- data/src/core/ext/filters/max_age/max_age_filter.cc +2 -1
- data/src/core/ext/filters/message_size/message_size_filter.cc +56 -80
- data/src/core/ext/filters/message_size/message_size_filter.h +6 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +87 -31
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +18 -1
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +10 -35
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +378 -348
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +7 -2
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -3
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +10 -16
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +9 -9
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +256 -279
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +23 -28
- data/src/core/ext/transport/chttp2/transport/flow_control.h +14 -16
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +9 -12
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -6
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +12 -13
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +8 -9
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +9 -12
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -29
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +13 -17
- data/src/core/ext/transport/chttp2/transport/internal.h +18 -1
- data/src/core/ext/transport/chttp2/transport/parsing.cc +34 -71
- data/src/core/ext/transport/chttp2/transport/writing.cc +15 -19
- data/src/core/ext/transport/inproc/inproc_transport.cc +47 -27
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +0 -1
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +3 -4
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +224 -0
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +700 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +74 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +226 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +380 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1378 -0
- data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/filter.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +69 -0
- data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/outlier_detection.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +323 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +112 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +334 -0
- data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/backoff.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +79 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +309 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +869 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +96 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +328 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +34 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +71 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +195 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +634 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +170 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +684 -0
- data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/http_uri.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +80 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +152 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +536 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +28 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +58 -0
- data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/socket_option.upb.c +6 -6
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +88 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +91 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +220 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +91 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +273 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +112 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +332 -0
- data/src/core/ext/upb-generated/envoy/config/listener/{v2 → v3}/api_listener.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +65 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +108 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +401 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +138 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +490 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +41 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +94 -0
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +174 -0
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +599 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +63 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +204 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +773 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2855 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +59 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +135 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +50 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +108 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +312 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1125 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +20 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +34 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +111 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +401 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +72 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +198 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +105 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +388 -0
- data/src/core/ext/upb-generated/envoy/{api/v2 → service/cluster/v3}/cds.upb.c +5 -6
- data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/{v2 → v3}/ads.upb.c +5 -4
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +129 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +386 -0
- data/src/core/ext/upb-generated/envoy/{api/v2 → service/endpoint/v3}/eds.upb.c +5 -6
- data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/{api/v2 → service/listener/v3}/lds.upb.c +5 -6
- data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +55 -0
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +136 -0
- data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/rds.upb.c +5 -6
- data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/srds.upb.c +5 -6
- data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +47 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +114 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +35 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +77 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +34 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +71 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +64 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +145 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +53 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +127 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +63 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +188 -0
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +88 -0
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +258 -0
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +90 -0
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +250 -0
- data/src/core/ext/upb-generated/envoy/type/{http.upb.c → v3/http.upb.c} +2 -2
- data/src/core/ext/upb-generated/envoy/type/{http.upb.h → v3/http.upb.h} +8 -9
- data/src/core/ext/upb-generated/envoy/type/{percent.upb.c → v3/percent.upb.c} +9 -8
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +86 -0
- data/src/core/ext/upb-generated/envoy/type/{range.upb.c → v3/range.upb.c} +12 -11
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +111 -0
- data/src/core/ext/upb-generated/envoy/type/{semantic_version.upb.c → v3/semantic_version.upb.c} +6 -5
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +61 -0
- data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +0 -1
- data/src/core/ext/upb-generated/google/api/annotations.upb.h +0 -1
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +234 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +759 -0
- data/src/core/ext/upb-generated/google/api/http.upb.h +29 -28
- data/src/core/ext/upb-generated/google/protobuf/any.upb.h +5 -6
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +39 -39
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +412 -386
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +5 -6
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +1 -2
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +34 -55
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +5 -6
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -28
- data/src/core/ext/upb-generated/google/rpc/status.upb.h +8 -8
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +1 -1
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +32 -45
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +4 -4
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +157 -178
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +14 -13
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -7
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +59 -56
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +11 -12
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +0 -1
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +5 -6
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +27 -0
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +53 -0
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +6 -6
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +41 -68
- data/src/core/ext/upb-generated/validate/validate.upb.c +11 -11
- data/src/core/ext/upb-generated/validate/validate.upb.h +537 -536
- data/src/core/ext/xds/xds_api.cc +2388 -0
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_api.h +120 -40
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.cc +56 -25
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.h +8 -3
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel.h +4 -4
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_args.h +3 -3
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_secure.cc +2 -5
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.cc +94 -347
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.h +12 -45
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.cc +2 -2
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.h +13 -13
- data/src/core/lib/channel/channel_trace.cc +2 -6
- data/src/core/lib/channel/channelz.cc +19 -30
- data/src/core/lib/channel/channelz.h +1 -1
- data/src/core/lib/channel/channelz_registry.cc +3 -1
- data/src/core/lib/gpr/log_linux.cc +6 -8
- data/src/core/lib/gpr/log_posix.cc +6 -8
- data/src/core/lib/gpr/string.cc +10 -9
- data/src/core/lib/gpr/string.h +4 -2
- data/src/core/lib/gpr/sync_posix.cc +2 -8
- data/src/core/lib/gprpp/global_config_env.cc +8 -6
- data/src/core/lib/http/httpcli.cc +13 -10
- data/src/core/lib/http/httpcli_security_connector.cc +5 -5
- data/src/core/lib/iomgr/cfstream_handle.cc +1 -0
- data/src/core/lib/iomgr/endpoint.cc +5 -1
- data/src/core/lib/iomgr/endpoint.h +7 -3
- data/src/core/lib/iomgr/endpoint_cfstream.cc +32 -11
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +10 -10
- data/src/core/lib/iomgr/error_cfstream.cc +9 -8
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +5 -6
- data/src/core/lib/iomgr/ev_epollex_linux.cc +15 -21
- data/src/core/lib/iomgr/ev_poll_posix.cc +6 -5
- data/src/core/lib/iomgr/is_epollexclusive_available.cc +14 -0
- data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.cc +1 -1
- data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.h +3 -3
- data/src/core/lib/iomgr/port.h +1 -21
- data/src/core/lib/iomgr/resolve_address_custom.cc +13 -18
- data/src/core/lib/iomgr/resolve_address_windows.cc +8 -8
- data/src/core/lib/iomgr/resource_quota.cc +34 -31
- data/src/core/lib/iomgr/sockaddr_utils.cc +9 -6
- data/src/core/lib/iomgr/sockaddr_utils.h +3 -2
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +95 -55
- data/src/core/lib/iomgr/socket_windows.cc +4 -5
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +9 -11
- data/src/core/lib/iomgr/tcp_client_custom.cc +6 -9
- data/src/core/lib/iomgr/tcp_client_posix.cc +27 -36
- data/src/core/lib/iomgr/tcp_client_windows.cc +9 -9
- data/src/core/lib/iomgr/tcp_custom.cc +33 -17
- data/src/core/lib/iomgr/tcp_custom.h +1 -1
- data/src/core/lib/iomgr/tcp_posix.cc +31 -13
- data/src/core/lib/iomgr/tcp_server.cc +3 -4
- data/src/core/lib/iomgr/tcp_server.h +7 -5
- data/src/core/lib/iomgr/tcp_server_custom.cc +6 -14
- data/src/core/lib/iomgr/tcp_server_posix.cc +34 -41
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -4
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -7
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +4 -9
- data/src/core/lib/iomgr/tcp_server_windows.cc +16 -16
- data/src/core/lib/iomgr/tcp_windows.cc +26 -10
- data/src/core/lib/iomgr/timer_generic.cc +13 -12
- data/src/core/lib/iomgr/udp_server.cc +24 -23
- data/src/core/lib/iomgr/udp_server.h +5 -2
- data/src/core/lib/iomgr/unix_sockets_posix.cc +9 -14
- data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +5 -2
- data/src/core/lib/json/json_reader.cc +20 -21
- data/src/core/lib/security/authorization/authorization_engine.cc +177 -0
- data/src/core/lib/security/authorization/authorization_engine.h +84 -0
- data/src/core/lib/security/authorization/evaluate_args.cc +153 -0
- data/src/core/lib/security/authorization/evaluate_args.h +59 -0
- data/src/core/lib/security/authorization/mock_cel/activation.h +57 -0
- data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +42 -0
- data/src/core/lib/security/authorization/mock_cel/cel_expression.h +68 -0
- data/src/core/lib/security/authorization/mock_cel/cel_value.h +93 -0
- data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +67 -0
- data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +56 -0
- data/src/core/lib/security/authorization/mock_cel/statusor.h +50 -0
- data/src/core/lib/security/credentials/credentials.h +5 -3
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +8 -6
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +64 -43
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -4
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +19 -28
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -6
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +10 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +10 -0
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +11 -12
- data/src/core/lib/security/security_connector/security_connector.cc +2 -0
- data/src/core/lib/security/security_connector/security_connector.h +1 -1
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -11
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +5 -0
- data/src/core/lib/security/security_connector/ssl_utils.cc +44 -23
- data/src/core/lib/security/security_connector/ssl_utils.h +6 -2
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +27 -24
- data/src/core/lib/security/transport/client_auth_filter.cc +10 -9
- data/src/core/lib/security/transport/secure_endpoint.cc +7 -1
- data/src/core/lib/security/util/json_util.cc +12 -13
- data/src/core/lib/slice/slice.cc +38 -1
- data/src/core/lib/slice/slice_internal.h +1 -0
- data/src/core/lib/surface/call.cc +52 -53
- data/src/core/lib/surface/call.h +2 -1
- data/src/core/lib/surface/channel.cc +28 -20
- data/src/core/lib/surface/channel.h +12 -2
- data/src/core/lib/surface/completion_queue.cc +0 -5
- data/src/core/lib/surface/init.cc +1 -1
- data/src/core/lib/surface/server.cc +1102 -1347
- data/src/core/lib/surface/server.h +369 -71
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/authority_override.cc +38 -0
- data/src/core/lib/transport/authority_override.h +32 -0
- data/src/core/lib/transport/connectivity_state.cc +18 -13
- data/src/core/lib/transport/connectivity_state.h +18 -6
- data/src/core/lib/transport/error_utils.cc +13 -0
- data/src/core/lib/transport/error_utils.h +6 -0
- data/src/core/lib/transport/static_metadata.cc +295 -276
- data/src/core/lib/transport/static_metadata.h +80 -73
- data/src/core/lib/transport/transport.h +13 -0
- data/src/core/lib/uri/uri_parser.cc +30 -35
- data/src/core/lib/uri/uri_parser.h +3 -1
- data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +23 -13
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +24 -0
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -0
- data/src/core/tsi/ssl_transport_security.cc +102 -11
- data/src/core/tsi/ssl_transport_security.h +14 -2
- data/src/core/tsi/transport_security_interface.h +5 -0
- data/src/ruby/bin/math_services_pb.rb +4 -4
- data/src/ruby/ext/grpc/extconf.rb +5 -2
- data/src/ruby/ext/grpc/rb_call.c +3 -2
- data/src/ruby/ext/grpc/rb_call.h +4 -0
- data/src/ruby/ext/grpc/rb_call_credentials.c +54 -10
- data/src/ruby/ext/grpc/rb_channel_credentials.c +9 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -4
- data/src/ruby/lib/grpc/generic/client_stub.rb +1 -1
- data/src/ruby/lib/grpc/generic/interceptors.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +2 -2
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +5 -0
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +28 -12
- data/src/ruby/spec/channel_credentials_spec.rb +10 -0
- data/src/ruby/spec/generic/active_call_spec.rb +19 -8
- 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 +2 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/same_package_service_name.proto +27 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/same_ruby_package_service_name.proto +29 -0
- data/src/ruby/spec/pb/codegen/package_option_spec.rb +25 -1
- data/src/ruby/spec/user_agent_spec.rb +74 -0
- data/third_party/abseil-cpp/absl/algorithm/container.h +1727 -0
- data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +161 -0
- data/third_party/abseil-cpp/absl/base/internal/exponential_biased.cc +93 -0
- data/third_party/abseil-cpp/absl/base/internal/exponential_biased.h +130 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +620 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +126 -0
- data/third_party/abseil-cpp/absl/container/fixed_array.h +515 -0
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +503 -0
- data/third_party/abseil-cpp/absl/container/internal/common.h +202 -0
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +440 -0
- data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +146 -0
- data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +191 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtable_debug_hooks.h +85 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +269 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +297 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +30 -0
- data/third_party/abseil-cpp/absl/container/internal/have_sse.h +49 -0
- data/third_party/abseil-cpp/absl/container/internal/layout.h +741 -0
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +48 -0
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1882 -0
- data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +138 -0
- data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.h +32 -0
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +1895 -0
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +71 -0
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +382 -0
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +134 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +192 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +125 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +70 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +99 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +248 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +24 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +85 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +346 -0
- data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +128 -0
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +194 -0
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.h +158 -0
- data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +140 -0
- data/third_party/abseil-cpp/absl/debugging/stacktrace.h +231 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize.cc +25 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize.h +99 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +1480 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +40 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +81 -0
- data/third_party/abseil-cpp/absl/functional/function_ref.h +139 -0
- data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +106 -0
- data/third_party/abseil-cpp/absl/hash/hash.h +324 -0
- data/third_party/abseil-cpp/absl/hash/internal/city.cc +346 -0
- data/third_party/abseil-cpp/absl/hash/internal/city.h +96 -0
- data/third_party/abseil-cpp/absl/hash/internal/hash.cc +55 -0
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +988 -0
- data/third_party/abseil-cpp/absl/status/status.cc +447 -0
- data/third_party/abseil-cpp/absl/status/status.h +428 -0
- data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +43 -0
- data/third_party/abseil-cpp/absl/status/status_payload_printer.h +51 -0
- data/third_party/abseil-cpp/absl/strings/cord.cc +2019 -0
- data/third_party/abseil-cpp/absl/strings/cord.h +1121 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +151 -0
- data/third_party/abseil-cpp/absl/synchronization/barrier.cc +52 -0
- data/third_party/abseil-cpp/absl/synchronization/barrier.h +79 -0
- data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +57 -0
- data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +99 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +140 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +60 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +697 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.h +141 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +155 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +261 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +106 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +115 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +484 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +159 -0
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +2728 -0
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +1056 -0
- data/third_party/abseil-cpp/absl/synchronization/notification.cc +78 -0
- data/third_party/abseil-cpp/absl/synchronization/notification.h +123 -0
- data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +64 -0
- data/third_party/abseil-cpp/absl/types/bad_variant_access.h +82 -0
- data/third_party/abseil-cpp/absl/types/internal/variant.h +1646 -0
- data/third_party/abseil-cpp/absl/types/variant.h +861 -0
- data/third_party/boringssl-with-bazel/err_data.c +266 -254
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +12 -52
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +0 -22
- data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +159 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +17 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +11 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +13 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +24 -23
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +20 -16
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +62 -0
- data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +456 -0
- data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +192 -0
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +29 -15
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +7 -0
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -5
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +0 -29
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +116 -363
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +7 -45
- data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +4 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +8 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +4 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +0 -67
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +13 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +10 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +41 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +4 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +28 -9
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +25 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +35 -13
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +0 -154
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +20 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +28 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +74 -35
- data/third_party/boringssl-with-bazel/src/include/openssl/aes.h +16 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +52 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +22 -22
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +2 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +69 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +72 -23
- data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +2 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +1 -10
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +800 -715
- data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +3 -3
- data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +9 -2
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +9 -0
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +21 -14
- data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +7 -7
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +3 -6
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +38 -0
- data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +4 -24
- data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +5 -5
- data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +45 -24
- data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +34 -9
- data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +31 -21
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +17 -9
- data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +5 -3
- data/third_party/re2/re2/bitmap256.h +117 -0
- data/third_party/re2/re2/bitstate.cc +385 -0
- data/third_party/re2/re2/compile.cc +1279 -0
- data/third_party/re2/re2/dfa.cc +2130 -0
- data/third_party/re2/re2/filtered_re2.cc +121 -0
- data/third_party/re2/re2/filtered_re2.h +109 -0
- data/third_party/re2/re2/mimics_pcre.cc +197 -0
- data/third_party/re2/re2/nfa.cc +713 -0
- data/third_party/re2/re2/onepass.cc +623 -0
- data/third_party/re2/re2/parse.cc +2464 -0
- data/third_party/re2/re2/perl_groups.cc +119 -0
- data/third_party/re2/re2/pod_array.h +55 -0
- data/third_party/re2/re2/prefilter.cc +710 -0
- data/third_party/re2/re2/prefilter.h +108 -0
- data/third_party/re2/re2/prefilter_tree.cc +407 -0
- data/third_party/re2/re2/prefilter_tree.h +139 -0
- data/third_party/re2/re2/prog.cc +988 -0
- data/third_party/re2/re2/prog.h +436 -0
- data/third_party/re2/re2/re2.cc +1362 -0
- data/third_party/re2/re2/re2.h +1002 -0
- data/third_party/re2/re2/regexp.cc +980 -0
- data/third_party/re2/re2/regexp.h +659 -0
- data/third_party/re2/re2/set.cc +154 -0
- data/third_party/re2/re2/set.h +80 -0
- data/third_party/re2/re2/simplify.cc +657 -0
- data/third_party/re2/re2/sparse_array.h +392 -0
- data/third_party/re2/re2/sparse_set.h +264 -0
- data/third_party/re2/re2/stringpiece.cc +65 -0
- data/third_party/re2/re2/stringpiece.h +210 -0
- data/third_party/re2/re2/tostring.cc +351 -0
- data/third_party/re2/re2/unicode_casefold.cc +582 -0
- data/third_party/re2/re2/unicode_casefold.h +78 -0
- data/third_party/re2/re2/unicode_groups.cc +6269 -0
- data/third_party/re2/re2/unicode_groups.h +67 -0
- data/third_party/re2/re2/walker-inl.h +246 -0
- data/third_party/re2/util/benchmark.h +156 -0
- data/third_party/re2/util/flags.h +26 -0
- data/third_party/re2/util/logging.h +109 -0
- data/third_party/re2/util/malloc_counter.h +19 -0
- data/third_party/re2/util/mix.h +41 -0
- data/third_party/re2/util/mutex.h +148 -0
- data/third_party/re2/util/pcre.cc +1025 -0
- data/third_party/re2/util/pcre.h +681 -0
- data/third_party/re2/util/rune.cc +260 -0
- data/third_party/re2/util/strutil.cc +149 -0
- data/third_party/re2/util/strutil.h +21 -0
- data/third_party/re2/util/test.h +50 -0
- data/third_party/re2/util/utf.h +44 -0
- data/third_party/re2/util/util.h +42 -0
- data/third_party/upb/upb/decode.c +517 -505
- data/third_party/upb/upb/encode.c +165 -123
- data/third_party/upb/upb/msg.c +130 -64
- data/third_party/upb/upb/msg.h +418 -14
- data/third_party/upb/upb/port_def.inc +35 -6
- data/third_party/upb/upb/port_undef.inc +8 -1
- data/third_party/upb/upb/table.c +53 -86
- data/third_party/upb/upb/table.int.h +11 -52
- data/third_party/upb/upb/upb.c +151 -125
- data/third_party/upb/upb/upb.h +91 -147
- data/third_party/upb/upb/upb.hpp +88 -0
- metadata +310 -148
- data/src/core/ext/filters/client_channel/xds/xds_api.cc +0 -1906
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +0 -21
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +0 -35
- data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +0 -114
- data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +0 -418
- data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +0 -72
- data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +0 -197
- data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +0 -105
- data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +0 -378
- data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +0 -53
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +0 -403
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +0 -1447
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +0 -74
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +0 -218
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +0 -69
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +0 -305
- data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +0 -112
- data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +0 -328
- data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +0 -78
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +0 -313
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +0 -897
- data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +0 -96
- data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +0 -322
- data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +0 -34
- data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +0 -72
- data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +0 -197
- data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +0 -642
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +0 -172
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +0 -673
- data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +0 -80
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +0 -152
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +0 -518
- data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +0 -89
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +0 -129
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +0 -392
- data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +0 -53
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +0 -92
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +0 -240
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +0 -18
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -33
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +0 -91
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +0 -266
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +0 -112
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +0 -324
- data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +0 -53
- data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +0 -109
- data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +0 -399
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +0 -18
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -33
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +0 -145
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +0 -527
- data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +0 -43
- data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +0 -112
- data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +0 -53
- data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +0 -63
- data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +0 -199
- data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +0 -18
- data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -33
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +0 -815
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +0 -3032
- data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +0 -59
- data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +0 -134
- data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +0 -53
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +0 -228
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +0 -725
- data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +0 -316
- data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +0 -1132
- data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +0 -65
- data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +0 -51
- data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +0 -125
- data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +0 -50
- data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +0 -54
- data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +0 -134
- data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +0 -63
- data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +0 -144
- data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +0 -53
- data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +0 -133
- data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +0 -88
- data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +0 -258
- data/src/core/ext/upb-generated/envoy/type/percent.upb.h +0 -87
- data/src/core/ext/upb-generated/envoy/type/range.upb.h +0 -112
- data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +0 -62
- data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +0 -89
- data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +0 -249
- data/src/core/lib/security/transport/target_authority_table.cc +0 -75
- data/src/core/lib/security/transport/target_authority_table.h +0 -40
- data/src/core/lib/slice/slice_hash_table.h +0 -199
- data/src/core/lib/slice/slice_weak_hash_table.h +0 -102
- data/third_party/upb/upb/generated_util.h +0 -105
data/src/core/lib/surface/call.h
CHANGED
@@ -25,6 +25,7 @@
|
|
25
25
|
#include "src/core/lib/channel/context.h"
|
26
26
|
#include "src/core/lib/gprpp/arena.h"
|
27
27
|
#include "src/core/lib/surface/api_trace.h"
|
28
|
+
#include "src/core/lib/surface/server.h"
|
28
29
|
|
29
30
|
#include <grpc/grpc.h>
|
30
31
|
#include <grpc/impl/codegen/compression_types.h>
|
@@ -34,7 +35,7 @@ typedef void (*grpc_ioreq_completion_func)(grpc_call* call, int success,
|
|
34
35
|
|
35
36
|
typedef struct grpc_call_create_args {
|
36
37
|
grpc_channel* channel;
|
37
|
-
|
38
|
+
grpc_core::Server* server;
|
38
39
|
|
39
40
|
grpc_call* parent;
|
40
41
|
uint32_t propagation_mask;
|
@@ -415,26 +415,33 @@ grpc_call* grpc_channel_create_pollset_set_call(
|
|
415
415
|
|
416
416
|
namespace grpc_core {
|
417
417
|
|
418
|
-
RegisteredCall::RegisteredCall(const char*
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
418
|
+
RegisteredCall::RegisteredCall(const char* method_arg, const char* host_arg)
|
419
|
+
: method(method_arg != nullptr ? method_arg : ""),
|
420
|
+
host(host_arg != nullptr ? host_arg : ""),
|
421
|
+
path(grpc_mdelem_from_slices(
|
422
|
+
GRPC_MDSTR_PATH, grpc_core::ExternallyManagedSlice(method.c_str()))),
|
423
|
+
authority(!host.empty()
|
424
|
+
? grpc_mdelem_from_slices(
|
425
|
+
GRPC_MDSTR_AUTHORITY,
|
426
|
+
grpc_core::ExternallyManagedSlice(host.c_str()))
|
427
|
+
: GRPC_MDNULL) {}
|
426
428
|
|
427
429
|
// TODO(vjpai): Delete copy-constructor when allowed by all supported compilers.
|
428
|
-
RegisteredCall::RegisteredCall(const RegisteredCall& other)
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
430
|
+
RegisteredCall::RegisteredCall(const RegisteredCall& other)
|
431
|
+
: RegisteredCall(other.method.c_str(), other.host.c_str()) {}
|
432
|
+
|
433
|
+
RegisteredCall::RegisteredCall(RegisteredCall&& other) noexcept
|
434
|
+
: method(std::move(other.method)),
|
435
|
+
host(std::move(other.host)),
|
436
|
+
path(grpc_mdelem_from_slices(
|
437
|
+
GRPC_MDSTR_PATH, grpc_core::ExternallyManagedSlice(method.c_str()))),
|
438
|
+
authority(!host.empty()
|
439
|
+
? grpc_mdelem_from_slices(
|
440
|
+
GRPC_MDSTR_AUTHORITY,
|
441
|
+
grpc_core::ExternallyManagedSlice(host.c_str()))
|
442
|
+
: GRPC_MDNULL) {
|
443
|
+
GRPC_MDELEM_UNREF(other.path);
|
444
|
+
GRPC_MDELEM_UNREF(other.authority);
|
438
445
|
other.path = GRPC_MDNULL;
|
439
446
|
other.authority = GRPC_MDNULL;
|
440
447
|
}
|
@@ -457,13 +464,14 @@ void* grpc_channel_register_call(grpc_channel* channel, const char* method,
|
|
457
464
|
|
458
465
|
grpc_core::MutexLock lock(&channel->registration_table->mu);
|
459
466
|
channel->registration_table->method_registration_attempts++;
|
460
|
-
auto key = std::make_pair(host
|
467
|
+
auto key = std::make_pair(std::string(host != nullptr ? host : ""),
|
468
|
+
std::string(method != nullptr ? method : ""));
|
461
469
|
auto rc_posn = channel->registration_table->map.find(key);
|
462
470
|
if (rc_posn != channel->registration_table->map.end()) {
|
463
471
|
return &rc_posn->second;
|
464
472
|
}
|
465
473
|
auto insertion_result = channel->registration_table->map.insert(
|
466
|
-
{key, grpc_core::RegisteredCall(method, host)});
|
474
|
+
{std::move(key), grpc_core::RegisteredCall(method, host)});
|
467
475
|
return &insertion_result.first->second;
|
468
476
|
}
|
469
477
|
|
@@ -69,21 +69,31 @@ void grpc_channel_update_call_size_estimate(grpc_channel* channel, size_t size);
|
|
69
69
|
namespace grpc_core {
|
70
70
|
|
71
71
|
struct RegisteredCall {
|
72
|
+
// The method and host are kept as part of this struct just to manage their
|
73
|
+
// lifetime since they must outlive the mdelem contents.
|
74
|
+
std::string method;
|
75
|
+
std::string host;
|
76
|
+
|
72
77
|
grpc_mdelem path;
|
73
78
|
grpc_mdelem authority;
|
74
79
|
|
75
|
-
explicit RegisteredCall(const char*
|
80
|
+
explicit RegisteredCall(const char* method_arg, const char* host_arg);
|
76
81
|
// TODO(vjpai): delete copy constructor once all supported compilers allow
|
77
82
|
// std::map value_type to be MoveConstructible.
|
78
83
|
RegisteredCall(const RegisteredCall& other);
|
79
84
|
RegisteredCall(RegisteredCall&& other) noexcept;
|
85
|
+
RegisteredCall& operator=(const RegisteredCall&) = delete;
|
86
|
+
RegisteredCall& operator=(RegisteredCall&&) = delete;
|
80
87
|
|
81
88
|
~RegisteredCall();
|
82
89
|
};
|
83
90
|
|
84
91
|
struct CallRegistrationTable {
|
85
92
|
grpc_core::Mutex mu;
|
86
|
-
|
93
|
+
// The map key should be owned strings rather than unowned char*'s to
|
94
|
+
// guarantee that it outlives calls on the core channel (which may outlast the
|
95
|
+
// C++ or other wrapped language Channel that registered these calls).
|
96
|
+
std::map<std::pair<std::string, std::string>, RegisteredCall>
|
87
97
|
map /* GUARDED_BY(mu) */;
|
88
98
|
int method_registration_attempts /* GUARDED_BY(mu) */ = 0;
|
89
99
|
};
|
@@ -327,10 +327,6 @@ struct cq_callback_data {
|
|
327
327
|
Initial count is dropped by grpc_completion_queue_shutdown. */
|
328
328
|
grpc_core::Atomic<intptr_t> pending_events{1};
|
329
329
|
|
330
|
-
/** Counter of how many things have ever been queued on this completion queue
|
331
|
-
useful for avoiding locks to check the queue */
|
332
|
-
grpc_core::Atomic<intptr_t> things_queued_ever{0};
|
333
|
-
|
334
330
|
/** 0 initially. 1 once we initiated shutdown */
|
335
331
|
bool shutdown_called = false;
|
336
332
|
|
@@ -870,7 +866,6 @@ static void cq_end_op_for_callback(
|
|
870
866
|
|
871
867
|
cq_check_tag(cq, tag, true); /* Used in debug builds only */
|
872
868
|
|
873
|
-
cqd->things_queued_ever.FetchAdd(1, grpc_core::MemoryOrder::RELAXED);
|
874
869
|
if (cqd->pending_events.FetchSub(1, grpc_core::MemoryOrder::ACQ_REL) == 1) {
|
875
870
|
cq_finish_shutdown_callback(cq);
|
876
871
|
}
|
@@ -102,7 +102,7 @@ static void register_builtin_channel_init() {
|
|
102
102
|
GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
|
103
103
|
append_filter, (void*)&grpc_lame_filter);
|
104
104
|
grpc_channel_init_register_stage(GRPC_SERVER_CHANNEL, INT_MAX, prepend_filter,
|
105
|
-
(void*)&
|
105
|
+
(void*)&grpc_core::Server::kServerTopFilter);
|
106
106
|
}
|
107
107
|
|
108
108
|
typedef struct grpc_plugin {
|
@@ -1,20 +1,18 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
*
|
17
|
-
*/
|
1
|
+
//
|
2
|
+
// Copyright 2015-2016 gRPC authors.
|
3
|
+
//
|
4
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
// you may not use this file except in compliance with the License.
|
6
|
+
// You may obtain a copy of the License at
|
7
|
+
//
|
8
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
//
|
10
|
+
// Unless required by applicable law or agreed to in writing, software
|
11
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
// See the License for the specific language governing permissions and
|
14
|
+
// limitations under the License.
|
15
|
+
//
|
18
16
|
|
19
17
|
#include <grpc/support/port_platform.h>
|
20
18
|
|
@@ -24,12 +22,20 @@
|
|
24
22
|
#include <stdlib.h>
|
25
23
|
#include <string.h>
|
26
24
|
|
25
|
+
#include <algorithm>
|
26
|
+
#include <atomic>
|
27
|
+
#include <iterator>
|
28
|
+
#include <list>
|
29
|
+
#include <queue>
|
30
|
+
#include <utility>
|
31
|
+
#include <vector>
|
32
|
+
|
33
|
+
#include "absl/types/optional.h"
|
34
|
+
|
27
35
|
#include <grpc/support/alloc.h>
|
28
36
|
#include <grpc/support/log.h>
|
29
37
|
#include <grpc/support/string_util.h>
|
30
38
|
|
31
|
-
#include <utility>
|
32
|
-
|
33
39
|
#include "src/core/lib/channel/channel_args.h"
|
34
40
|
#include "src/core/lib/channel/channelz.h"
|
35
41
|
#include "src/core/lib/channel/connected_channel.h"
|
@@ -48,34 +54,21 @@
|
|
48
54
|
#include "src/core/lib/transport/metadata.h"
|
49
55
|
#include "src/core/lib/transport/static_metadata.h"
|
50
56
|
|
51
|
-
grpc_core
|
52
|
-
|
53
|
-
using grpc_core::LockedMultiProducerSingleConsumerQueue;
|
54
|
-
|
55
|
-
namespace {
|
57
|
+
namespace grpc_core {
|
56
58
|
|
57
|
-
|
58
|
-
void server_recv_trailing_metadata_ready(void* user_data, grpc_error* error);
|
59
|
-
|
60
|
-
struct listener {
|
61
|
-
void* arg;
|
62
|
-
void (*start)(grpc_server* server, void* arg, grpc_pollset** pollsets,
|
63
|
-
size_t pollset_count);
|
64
|
-
void (*destroy)(grpc_server* server, void* arg, grpc_closure* closure);
|
65
|
-
struct listener* next;
|
66
|
-
intptr_t socket_uuid;
|
67
|
-
grpc_closure destroy_done;
|
68
|
-
};
|
59
|
+
TraceFlag grpc_server_channel_trace(false, "server_channel");
|
69
60
|
|
70
|
-
|
61
|
+
//
|
62
|
+
// Server::RequestedCall
|
63
|
+
//
|
71
64
|
|
72
|
-
struct
|
65
|
+
struct Server::RequestedCall {
|
66
|
+
enum class Type { BATCH_CALL, REGISTERED_CALL };
|
73
67
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
: type(BATCH_CALL),
|
68
|
+
RequestedCall(void* tag_arg, grpc_completion_queue* call_cq,
|
69
|
+
grpc_call** call_arg, grpc_metadata_array* initial_md,
|
70
|
+
grpc_call_details* details)
|
71
|
+
: type(Type::BATCH_CALL),
|
79
72
|
tag(tag_arg),
|
80
73
|
cq_bound_to_call(call_cq),
|
81
74
|
call(call_arg),
|
@@ -84,11 +77,11 @@ struct requested_call {
|
|
84
77
|
data.batch.details = details;
|
85
78
|
}
|
86
79
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
: type(REGISTERED_CALL),
|
80
|
+
RequestedCall(void* tag_arg, grpc_completion_queue* call_cq,
|
81
|
+
grpc_call** call_arg, grpc_metadata_array* initial_md,
|
82
|
+
RegisteredMethod* rm, gpr_timespec* deadline,
|
83
|
+
grpc_byte_buffer** optional_payload)
|
84
|
+
: type(Type::REGISTERED_CALL),
|
92
85
|
tag(tag_arg),
|
93
86
|
cq_bound_to_call(call_cq),
|
94
87
|
call(call_arg),
|
@@ -98,8 +91,8 @@ struct requested_call {
|
|
98
91
|
data.registered.optional_payload = optional_payload;
|
99
92
|
}
|
100
93
|
|
101
|
-
|
102
|
-
const
|
94
|
+
MultiProducerSingleConsumerQueue::Node mpscq_node;
|
95
|
+
const Type type;
|
103
96
|
void* const tag;
|
104
97
|
grpc_completion_queue* const cq_bound_to_call;
|
105
98
|
grpc_call** const call;
|
@@ -110,57 +103,40 @@ struct requested_call {
|
|
110
103
|
grpc_call_details* details;
|
111
104
|
} batch;
|
112
105
|
struct {
|
113
|
-
|
106
|
+
RegisteredMethod* method;
|
114
107
|
gpr_timespec* deadline;
|
115
108
|
grpc_byte_buffer** optional_payload;
|
116
109
|
} registered;
|
117
110
|
} data;
|
118
111
|
};
|
119
112
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
bool has_host;
|
124
|
-
grpc_core::ExternallyManagedSlice method;
|
125
|
-
grpc_core::ExternallyManagedSlice host;
|
126
|
-
};
|
113
|
+
//
|
114
|
+
// Server::RegisteredMethod
|
115
|
+
//
|
127
116
|
|
128
|
-
struct
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
uint32_t registered_method_max_probes;
|
138
|
-
grpc_closure finish_destroy_channel_closure;
|
139
|
-
intptr_t channelz_socket_uuid;
|
140
|
-
};
|
117
|
+
struct Server::RegisteredMethod {
|
118
|
+
RegisteredMethod(
|
119
|
+
const char* method_arg, const char* host_arg,
|
120
|
+
grpc_server_register_method_payload_handling payload_handling_arg,
|
121
|
+
uint32_t flags_arg)
|
122
|
+
: method(method_arg == nullptr ? "" : method_arg),
|
123
|
+
host(host_arg == nullptr ? "" : host_arg),
|
124
|
+
payload_handling(payload_handling_arg),
|
125
|
+
flags(flags_arg) {}
|
141
126
|
|
142
|
-
|
143
|
-
void* tag;
|
144
|
-
grpc_completion_queue* cq;
|
145
|
-
grpc_cq_completion completion;
|
146
|
-
};
|
127
|
+
~RegisteredMethod() = default;
|
147
128
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
ACTIVATED,
|
155
|
-
/* cancelled before being queued */
|
156
|
-
ZOMBIED
|
129
|
+
const std::string method;
|
130
|
+
const std::string host;
|
131
|
+
const grpc_server_register_method_payload_handling payload_handling;
|
132
|
+
const uint32_t flags;
|
133
|
+
// One request matcher per method.
|
134
|
+
std::unique_ptr<RequestMatcherInterface> matcher;
|
157
135
|
};
|
158
136
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
grpc_completion_queue* cq_for_notification, void* tag,
|
163
|
-
grpc_byte_buffer** optional_payload, registered_method* rm);
|
137
|
+
//
|
138
|
+
// Server::RequestMatcherInterface
|
139
|
+
//
|
164
140
|
|
165
141
|
// RPCs that come in from the transport must be matched against RPC requests
|
166
142
|
// from the application. An incoming request from the application can be matched
|
@@ -171,7 +147,7 @@ grpc_call_error ValidateServerRequest(
|
|
171
147
|
// on the request's notification CQ.
|
172
148
|
//
|
173
149
|
// RequestMatcherInterface is the base class to provide this functionality.
|
174
|
-
class RequestMatcherInterface {
|
150
|
+
class Server::RequestMatcherInterface {
|
175
151
|
public:
|
176
152
|
virtual ~RequestMatcherInterface() {}
|
177
153
|
|
@@ -194,7 +170,7 @@ class RequestMatcherInterface {
|
|
194
170
|
// CQ. If there are pending RPCs waiting to be matched, publish one (match it
|
195
171
|
// and notify the CQ).
|
196
172
|
virtual void RequestCallWithPossiblePublish(size_t request_queue_index,
|
197
|
-
|
173
|
+
RequestedCall* call) = 0;
|
198
174
|
|
199
175
|
// This function is invoked on an incoming RPC, represented by the calld
|
200
176
|
// object. The RequestMatcher will try to match it against an
|
@@ -203,248 +179,21 @@ class RequestMatcherInterface {
|
|
203
179
|
// is done starting at the start_request_queue_index parameter in a cyclic
|
204
180
|
// order rather than always starting at 0.
|
205
181
|
virtual void MatchOrQueue(size_t start_request_queue_index,
|
206
|
-
|
182
|
+
CallData* calld) = 0;
|
207
183
|
|
208
184
|
// Returns the server associated with this request matcher
|
209
|
-
virtual
|
210
|
-
};
|
211
|
-
|
212
|
-
struct call_data {
|
213
|
-
call_data(grpc_call_element* elem, const grpc_call_element_args& args)
|
214
|
-
: call(grpc_call_from_top_element(elem)),
|
215
|
-
call_combiner(args.call_combiner) {
|
216
|
-
GRPC_CLOSURE_INIT(&server_on_recv_initial_metadata,
|
217
|
-
::server_on_recv_initial_metadata, elem,
|
218
|
-
grpc_schedule_on_exec_ctx);
|
219
|
-
GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready,
|
220
|
-
::server_recv_trailing_metadata_ready, elem,
|
221
|
-
grpc_schedule_on_exec_ctx);
|
222
|
-
}
|
223
|
-
~call_data() {
|
224
|
-
GPR_ASSERT(state != PENDING);
|
225
|
-
GRPC_ERROR_UNREF(recv_initial_metadata_error);
|
226
|
-
if (host_set) {
|
227
|
-
grpc_slice_unref_internal(host);
|
228
|
-
}
|
229
|
-
if (path_set) {
|
230
|
-
grpc_slice_unref_internal(path);
|
231
|
-
}
|
232
|
-
grpc_metadata_array_destroy(&initial_metadata);
|
233
|
-
grpc_byte_buffer_destroy(payload);
|
234
|
-
}
|
235
|
-
|
236
|
-
grpc_call* call;
|
237
|
-
|
238
|
-
gpr_atm state = NOT_STARTED;
|
239
|
-
|
240
|
-
bool path_set = false;
|
241
|
-
bool host_set = false;
|
242
|
-
grpc_slice path;
|
243
|
-
grpc_slice host;
|
244
|
-
grpc_millis deadline = GRPC_MILLIS_INF_FUTURE;
|
245
|
-
|
246
|
-
grpc_completion_queue* cq_new = nullptr;
|
247
|
-
|
248
|
-
grpc_metadata_batch* recv_initial_metadata = nullptr;
|
249
|
-
uint32_t recv_initial_metadata_flags = 0;
|
250
|
-
grpc_metadata_array initial_metadata =
|
251
|
-
grpc_metadata_array(); // Zero-initialize the C struct.
|
252
|
-
|
253
|
-
RequestMatcherInterface* matcher = nullptr;
|
254
|
-
grpc_byte_buffer* payload = nullptr;
|
255
|
-
|
256
|
-
grpc_closure got_initial_metadata;
|
257
|
-
grpc_closure server_on_recv_initial_metadata;
|
258
|
-
grpc_closure kill_zombie_closure;
|
259
|
-
grpc_closure* on_done_recv_initial_metadata;
|
260
|
-
grpc_closure recv_trailing_metadata_ready;
|
261
|
-
grpc_error* recv_initial_metadata_error = GRPC_ERROR_NONE;
|
262
|
-
grpc_closure* original_recv_trailing_metadata_ready;
|
263
|
-
grpc_error* recv_trailing_metadata_error = GRPC_ERROR_NONE;
|
264
|
-
bool seen_recv_trailing_metadata_ready = false;
|
265
|
-
|
266
|
-
grpc_closure publish;
|
267
|
-
|
268
|
-
call_data* pending_next = nullptr;
|
269
|
-
grpc_core::CallCombiner* call_combiner;
|
270
|
-
};
|
271
|
-
|
272
|
-
struct registered_method {
|
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;
|
288
|
-
/* one request matcher per method */
|
289
|
-
std::unique_ptr<RequestMatcherInterface> matcher;
|
290
|
-
registered_method* next;
|
291
|
-
};
|
292
|
-
|
293
|
-
struct channel_broadcaster {
|
294
|
-
grpc_channel** channels;
|
295
|
-
size_t num_channels;
|
296
|
-
};
|
297
|
-
} // namespace
|
298
|
-
|
299
|
-
struct grpc_server {
|
300
|
-
grpc_channel_args* channel_args;
|
301
|
-
|
302
|
-
grpc_resource_user* default_resource_user;
|
303
|
-
|
304
|
-
grpc_completion_queue** cqs;
|
305
|
-
grpc_pollset** pollsets;
|
306
|
-
size_t cq_count;
|
307
|
-
size_t pollset_count;
|
308
|
-
bool started;
|
309
|
-
|
310
|
-
/* The two following mutexes control access to server-state
|
311
|
-
mu_global controls access to non-call-related state (e.g., channel state)
|
312
|
-
mu_call controls access to call-related state (e.g., the call lists)
|
313
|
-
|
314
|
-
If they are ever required to be nested, you must lock mu_global
|
315
|
-
before mu_call. This is currently used in shutdown processing
|
316
|
-
(grpc_server_shutdown_and_notify and maybe_finish_shutdown) */
|
317
|
-
gpr_mu mu_global; /* mutex for server and channel state */
|
318
|
-
gpr_mu mu_call; /* mutex for call-specific state */
|
319
|
-
|
320
|
-
/* startup synchronization: flag is protected by mu_global, signals whether
|
321
|
-
we are doing the listener start routine or not */
|
322
|
-
bool starting;
|
323
|
-
gpr_cv starting_cv;
|
324
|
-
|
325
|
-
// TODO(vjpai): Convert from a linked-list head pointer to a std::vector once
|
326
|
-
// grpc_server has a real constructor/destructor
|
327
|
-
registered_method* registered_methods;
|
328
|
-
/** one request matcher for unregistered methods */
|
329
|
-
// TODO(vjpai): Convert to a std::unique_ptr once grpc_server has a real
|
330
|
-
// constructor and destructor.
|
331
|
-
RequestMatcherInterface* unregistered_request_matcher;
|
332
|
-
|
333
|
-
gpr_atm shutdown_flag;
|
334
|
-
uint8_t shutdown_published;
|
335
|
-
size_t num_shutdown_tags;
|
336
|
-
shutdown_tag* shutdown_tags;
|
337
|
-
|
338
|
-
channel_data root_channel_data;
|
339
|
-
|
340
|
-
listener* listeners;
|
341
|
-
int listeners_destroyed;
|
342
|
-
grpc_core::RefCount internal_refcount;
|
343
|
-
|
344
|
-
/** when did we print the last shutdown progress message */
|
345
|
-
gpr_timespec last_shutdown_message_time;
|
346
|
-
|
347
|
-
grpc_core::RefCountedPtr<grpc_core::channelz::ServerNode> channelz_server;
|
348
|
-
};
|
349
|
-
|
350
|
-
#define SERVER_FROM_CALL_ELEM(elem) \
|
351
|
-
(((channel_data*)(elem)->channel_data)->server)
|
352
|
-
|
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);
|
358
|
-
/* Before calling maybe_finish_shutdown, we must hold mu_global and not
|
359
|
-
hold mu_call */
|
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
|
-
}
|
366
|
-
|
367
|
-
/*
|
368
|
-
* channel broadcaster
|
369
|
-
*/
|
370
|
-
|
371
|
-
/* assumes server locked */
|
372
|
-
void channel_broadcaster_init(grpc_server* s, channel_broadcaster* cb) {
|
373
|
-
channel_data* c;
|
374
|
-
size_t count = 0;
|
375
|
-
for (c = s->root_channel_data.next; c != &s->root_channel_data; c = c->next) {
|
376
|
-
count++;
|
377
|
-
}
|
378
|
-
cb->num_channels = count;
|
379
|
-
cb->channels = static_cast<grpc_channel**>(
|
380
|
-
gpr_malloc(sizeof(*cb->channels) * cb->num_channels));
|
381
|
-
count = 0;
|
382
|
-
for (c = s->root_channel_data.next; c != &s->root_channel_data; c = c->next) {
|
383
|
-
cb->channels[count++] = c->channel;
|
384
|
-
GRPC_CHANNEL_INTERNAL_REF(c->channel, "broadcast");
|
385
|
-
}
|
386
|
-
}
|
387
|
-
|
388
|
-
struct shutdown_cleanup_args {
|
389
|
-
grpc_closure closure;
|
390
|
-
grpc_slice slice;
|
185
|
+
virtual Server* server() const = 0;
|
391
186
|
};
|
392
187
|
|
393
|
-
void shutdown_cleanup(void* arg, grpc_error* /*error*/) {
|
394
|
-
struct shutdown_cleanup_args* a =
|
395
|
-
static_cast<struct shutdown_cleanup_args*>(arg);
|
396
|
-
grpc_slice_unref_internal(a->slice);
|
397
|
-
gpr_free(a);
|
398
|
-
}
|
399
|
-
|
400
|
-
void send_shutdown(grpc_channel* channel, bool send_goaway,
|
401
|
-
grpc_error* send_disconnect) {
|
402
|
-
struct shutdown_cleanup_args* sc =
|
403
|
-
static_cast<struct shutdown_cleanup_args*>(gpr_malloc(sizeof(*sc)));
|
404
|
-
GRPC_CLOSURE_INIT(&sc->closure, shutdown_cleanup, sc,
|
405
|
-
grpc_schedule_on_exec_ctx);
|
406
|
-
grpc_transport_op* op = grpc_make_transport_op(&sc->closure);
|
407
|
-
grpc_channel_element* elem;
|
408
|
-
|
409
|
-
op->goaway_error =
|
410
|
-
send_goaway ? grpc_error_set_int(
|
411
|
-
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown"),
|
412
|
-
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_OK)
|
413
|
-
: GRPC_ERROR_NONE;
|
414
|
-
op->set_accept_stream = true;
|
415
|
-
sc->slice = grpc_slice_from_copied_string("Server shutdown");
|
416
|
-
op->disconnect_with_error = send_disconnect;
|
417
|
-
|
418
|
-
elem = grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0);
|
419
|
-
elem->filter->start_transport_op(elem, op);
|
420
|
-
}
|
421
|
-
|
422
|
-
void channel_broadcaster_shutdown(channel_broadcaster* cb, bool send_goaway,
|
423
|
-
grpc_error* force_disconnect) {
|
424
|
-
size_t i;
|
425
|
-
|
426
|
-
for (i = 0; i < cb->num_channels; i++) {
|
427
|
-
send_shutdown(cb->channels[i], send_goaway,
|
428
|
-
GRPC_ERROR_REF(force_disconnect));
|
429
|
-
GRPC_CHANNEL_INTERNAL_UNREF(cb->channels[i], "broadcast");
|
430
|
-
}
|
431
|
-
gpr_free(cb->channels);
|
432
|
-
GRPC_ERROR_UNREF(force_disconnect);
|
433
|
-
}
|
434
|
-
|
435
|
-
/*
|
436
|
-
* request_matcher
|
437
|
-
*/
|
438
|
-
|
439
188
|
// The RealRequestMatcher is an implementation of RequestMatcherInterface that
|
440
189
|
// actually uses all the features of RequestMatcherInterface: expecting the
|
441
190
|
// application to explicitly request RPCs and then matching those to incoming
|
442
191
|
// RPCs, along with a slow path by which incoming RPCs are put on a locked
|
443
192
|
// pending list if they aren't able to be matched to an application request.
|
444
|
-
class RealRequestMatcher : public RequestMatcherInterface {
|
193
|
+
class Server::RealRequestMatcher : public RequestMatcherInterface {
|
445
194
|
public:
|
446
|
-
explicit RealRequestMatcher(
|
447
|
-
: server_(server), requests_per_cq_(server->
|
195
|
+
explicit RealRequestMatcher(Server* server)
|
196
|
+
: server_(server), requests_per_cq_(server->cqs_.size()) {}
|
448
197
|
|
449
198
|
~RealRequestMatcher() override {
|
450
199
|
for (LockedMultiProducerSingleConsumerQueue& queue : requests_per_cq_) {
|
@@ -453,25 +202,20 @@ class RealRequestMatcher : public RequestMatcherInterface {
|
|
453
202
|
}
|
454
203
|
|
455
204
|
void ZombifyPending() override {
|
456
|
-
while (
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
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);
|
205
|
+
while (!pending_.empty()) {
|
206
|
+
CallData* calld = pending_.front();
|
207
|
+
calld->SetState(CallData::CallState::ZOMBIED);
|
208
|
+
calld->KillZombie();
|
209
|
+
pending_.pop();
|
466
210
|
}
|
467
211
|
}
|
468
212
|
|
469
213
|
void KillRequests(grpc_error* error) override {
|
470
214
|
for (size_t i = 0; i < requests_per_cq_.size(); i++) {
|
471
|
-
|
472
|
-
while ((rc = reinterpret_cast<
|
215
|
+
RequestedCall* rc;
|
216
|
+
while ((rc = reinterpret_cast<RequestedCall*>(
|
473
217
|
requests_per_cq_[i].Pop())) != nullptr) {
|
474
|
-
|
218
|
+
server_->FailCall(i, rc, GRPC_ERROR_REF(error));
|
475
219
|
}
|
476
220
|
}
|
477
221
|
GRPC_ERROR_UNREF(error);
|
@@ -482,90 +226,90 @@ class RealRequestMatcher : public RequestMatcherInterface {
|
|
482
226
|
}
|
483
227
|
|
484
228
|
void RequestCallWithPossiblePublish(size_t request_queue_index,
|
485
|
-
|
229
|
+
RequestedCall* call) override {
|
486
230
|
if (requests_per_cq_[request_queue_index].Push(&call->mpscq_node)) {
|
487
231
|
/* this was the first queued request: we need to lock and start
|
488
232
|
matching calls */
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
233
|
+
struct PendingCall {
|
234
|
+
RequestedCall* rc = nullptr;
|
235
|
+
CallData* calld;
|
236
|
+
};
|
237
|
+
auto pop_next_pending = [this, request_queue_index] {
|
238
|
+
PendingCall pending_call;
|
239
|
+
{
|
240
|
+
MutexLock lock(&server_->mu_call_);
|
241
|
+
if (!pending_.empty()) {
|
242
|
+
pending_call.rc = reinterpret_cast<RequestedCall*>(
|
243
|
+
requests_per_cq_[request_queue_index].Pop());
|
244
|
+
if (pending_call.rc != nullptr) {
|
245
|
+
pending_call.calld = pending_.front();
|
246
|
+
pending_.pop();
|
247
|
+
}
|
248
|
+
}
|
249
|
+
}
|
250
|
+
return pending_call;
|
251
|
+
};
|
252
|
+
while (true) {
|
253
|
+
PendingCall next_pending = pop_next_pending();
|
254
|
+
if (next_pending.rc == nullptr) break;
|
255
|
+
if (!next_pending.calld->MaybeActivate()) {
|
498
256
|
// Zombied Call
|
499
|
-
|
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);
|
257
|
+
next_pending.calld->KillZombie();
|
505
258
|
} else {
|
506
|
-
|
259
|
+
next_pending.calld->Publish(request_queue_index, next_pending.rc);
|
507
260
|
}
|
508
|
-
gpr_mu_lock(&server_->mu_call);
|
509
261
|
}
|
510
|
-
gpr_mu_unlock(&server_->mu_call);
|
511
262
|
}
|
512
263
|
}
|
513
264
|
|
514
265
|
void MatchOrQueue(size_t start_request_queue_index,
|
515
|
-
|
266
|
+
CallData* calld) override {
|
516
267
|
for (size_t i = 0; i < requests_per_cq_.size(); i++) {
|
517
268
|
size_t cq_idx = (start_request_queue_index + i) % requests_per_cq_.size();
|
518
|
-
|
519
|
-
reinterpret_cast<
|
520
|
-
if (rc
|
521
|
-
continue;
|
522
|
-
} else {
|
269
|
+
RequestedCall* rc =
|
270
|
+
reinterpret_cast<RequestedCall*>(requests_per_cq_[cq_idx].TryPop());
|
271
|
+
if (rc != nullptr) {
|
523
272
|
GRPC_STATS_INC_SERVER_CQS_CHECKED(i);
|
524
|
-
|
525
|
-
|
526
|
-
return;
|
273
|
+
calld->SetState(CallData::CallState::ACTIVATED);
|
274
|
+
calld->Publish(cq_idx, rc);
|
275
|
+
return;
|
527
276
|
}
|
528
277
|
}
|
529
|
-
|
530
|
-
/* no cq to take the request found: queue it on the slow list */
|
278
|
+
// No cq to take the request found; queue it on the slow list.
|
531
279
|
GRPC_STATS_INC_SERVER_SLOWPATH_REQUESTS_QUEUED();
|
532
|
-
gpr_mu_lock(&server_->mu_call);
|
533
|
-
|
534
280
|
// We need to ensure that all the queues are empty. We do this under
|
535
|
-
// the server
|
281
|
+
// the server mu_call_ lock to ensure that if something is added to
|
536
282
|
// an empty request queue, it will block until the call is actually
|
537
283
|
// added to the pending list.
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
284
|
+
RequestedCall* rc = nullptr;
|
285
|
+
size_t cq_idx = 0;
|
286
|
+
size_t loop_count;
|
287
|
+
{
|
288
|
+
MutexLock lock(&server_->mu_call_);
|
289
|
+
for (loop_count = 0; loop_count < requests_per_cq_.size(); loop_count++) {
|
290
|
+
cq_idx =
|
291
|
+
(start_request_queue_index + loop_count) % requests_per_cq_.size();
|
292
|
+
rc = reinterpret_cast<RequestedCall*>(requests_per_cq_[cq_idx].Pop());
|
293
|
+
if (rc != nullptr) {
|
294
|
+
break;
|
295
|
+
}
|
296
|
+
}
|
542
297
|
if (rc == nullptr) {
|
543
|
-
|
544
|
-
|
545
|
-
|
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 */
|
298
|
+
calld->SetState(CallData::CallState::PENDING);
|
299
|
+
pending_.push(calld);
|
300
|
+
return;
|
550
301
|
}
|
551
302
|
}
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
pending_tail_ = pending_head_ = calld;
|
556
|
-
} else {
|
557
|
-
pending_tail_->pending_next = calld;
|
558
|
-
pending_tail_ = calld;
|
559
|
-
}
|
560
|
-
gpr_mu_unlock(&server_->mu_call);
|
303
|
+
GRPC_STATS_INC_SERVER_CQS_CHECKED(loop_count + requests_per_cq_.size());
|
304
|
+
calld->SetState(CallData::CallState::ACTIVATED);
|
305
|
+
calld->Publish(cq_idx, rc);
|
561
306
|
}
|
562
307
|
|
563
|
-
|
308
|
+
Server* server() const override { return server_; }
|
564
309
|
|
565
310
|
private:
|
566
|
-
|
567
|
-
|
568
|
-
call_data* pending_tail_ = nullptr;
|
311
|
+
Server* const server_;
|
312
|
+
std::queue<CallData*> pending_;
|
569
313
|
std::vector<LockedMultiProducerSingleConsumerQueue> requests_per_cq_;
|
570
314
|
};
|
571
315
|
|
@@ -574,17 +318,17 @@ class RealRequestMatcher : public RequestMatcherInterface {
|
|
574
318
|
// will call out to an allocation function passed in at the construction of the
|
575
319
|
// object. These request matchers are designed for the C++ callback API, so they
|
576
320
|
// only support 1 completion queue (passed in at the constructor).
|
577
|
-
class AllocatingRequestMatcherBase : public RequestMatcherInterface {
|
321
|
+
class Server::AllocatingRequestMatcherBase : public RequestMatcherInterface {
|
578
322
|
public:
|
579
|
-
AllocatingRequestMatcherBase(
|
323
|
+
AllocatingRequestMatcherBase(Server* server, grpc_completion_queue* cq)
|
580
324
|
: server_(server), cq_(cq) {
|
581
325
|
size_t idx;
|
582
|
-
for (idx = 0; idx < server->
|
583
|
-
if (server->
|
326
|
+
for (idx = 0; idx < server->cqs_.size(); idx++) {
|
327
|
+
if (server->cqs_[idx] == cq) {
|
584
328
|
break;
|
585
329
|
}
|
586
330
|
}
|
587
|
-
GPR_ASSERT(idx < server->
|
331
|
+
GPR_ASSERT(idx < server->cqs_.size());
|
588
332
|
cq_idx_ = idx;
|
589
333
|
}
|
590
334
|
|
@@ -595,11 +339,11 @@ class AllocatingRequestMatcherBase : public RequestMatcherInterface {
|
|
595
339
|
size_t request_queue_count() const override { return 0; }
|
596
340
|
|
597
341
|
void RequestCallWithPossiblePublish(size_t /*request_queue_index*/,
|
598
|
-
|
342
|
+
RequestedCall* /*call*/) final {
|
599
343
|
GPR_ASSERT(false);
|
600
344
|
}
|
601
345
|
|
602
|
-
|
346
|
+
Server* server() const override { return server_; }
|
603
347
|
|
604
348
|
// Supply the completion queue related to this request matcher
|
605
349
|
grpc_completion_queue* cq() const { return cq_; }
|
@@ -608,471 +352,746 @@ class AllocatingRequestMatcherBase : public RequestMatcherInterface {
|
|
608
352
|
size_t cq_idx() const { return cq_idx_; }
|
609
353
|
|
610
354
|
private:
|
611
|
-
|
355
|
+
Server* const server_;
|
612
356
|
grpc_completion_queue* const cq_;
|
613
357
|
size_t cq_idx_;
|
614
358
|
};
|
615
359
|
|
616
360
|
// An allocating request matcher for non-registered methods (used for generic
|
617
361
|
// API and unimplemented RPCs).
|
618
|
-
class AllocatingRequestMatcherBatch
|
362
|
+
class Server::AllocatingRequestMatcherBatch
|
363
|
+
: public AllocatingRequestMatcherBase {
|
619
364
|
public:
|
620
|
-
AllocatingRequestMatcherBatch(
|
621
|
-
|
622
|
-
std::function<grpc_core::ServerBatchCallAllocation()> allocator)
|
365
|
+
AllocatingRequestMatcherBatch(Server* server, grpc_completion_queue* cq,
|
366
|
+
std::function<BatchCallAllocation()> allocator)
|
623
367
|
: AllocatingRequestMatcherBase(server, cq),
|
624
368
|
allocator_(std::move(allocator)) {}
|
369
|
+
|
625
370
|
void MatchOrQueue(size_t /*start_request_queue_index*/,
|
626
|
-
|
627
|
-
|
628
|
-
GPR_ASSERT(
|
629
|
-
|
630
|
-
|
371
|
+
CallData* calld) override {
|
372
|
+
BatchCallAllocation call_info = allocator_();
|
373
|
+
GPR_ASSERT(server()->ValidateServerRequest(
|
374
|
+
cq(), static_cast<void*>(call_info.tag), nullptr, nullptr) ==
|
375
|
+
GRPC_CALL_OK);
|
376
|
+
RequestedCall* rc = new RequestedCall(
|
631
377
|
static_cast<void*>(call_info.tag), cq(), call_info.call,
|
632
378
|
call_info.initial_metadata, call_info.details);
|
633
|
-
|
634
|
-
|
379
|
+
calld->SetState(CallData::CallState::ACTIVATED);
|
380
|
+
calld->Publish(cq_idx(), rc);
|
635
381
|
}
|
636
382
|
|
637
383
|
private:
|
638
|
-
std::function<
|
384
|
+
std::function<BatchCallAllocation()> allocator_;
|
639
385
|
};
|
640
386
|
|
641
387
|
// An allocating request matcher for registered methods.
|
642
|
-
class AllocatingRequestMatcherRegistered
|
388
|
+
class Server::AllocatingRequestMatcherRegistered
|
389
|
+
: public AllocatingRequestMatcherBase {
|
643
390
|
public:
|
644
391
|
AllocatingRequestMatcherRegistered(
|
645
|
-
|
646
|
-
std::function<
|
392
|
+
Server* server, grpc_completion_queue* cq, RegisteredMethod* rm,
|
393
|
+
std::function<RegisteredCallAllocation()> allocator)
|
647
394
|
: AllocatingRequestMatcherBase(server, cq),
|
648
395
|
registered_method_(rm),
|
649
396
|
allocator_(std::move(allocator)) {}
|
397
|
+
|
650
398
|
void MatchOrQueue(size_t /*start_request_queue_index*/,
|
651
|
-
|
652
|
-
|
653
|
-
GPR_ASSERT(
|
654
|
-
|
655
|
-
|
656
|
-
|
399
|
+
CallData* calld) override {
|
400
|
+
RegisteredCallAllocation call_info = allocator_();
|
401
|
+
GPR_ASSERT(
|
402
|
+
server()->ValidateServerRequest(cq(), static_cast<void*>(call_info.tag),
|
403
|
+
call_info.optional_payload,
|
404
|
+
registered_method_) == GRPC_CALL_OK);
|
405
|
+
RequestedCall* rc = new RequestedCall(
|
657
406
|
static_cast<void*>(call_info.tag), cq(), call_info.call,
|
658
407
|
call_info.initial_metadata, registered_method_, call_info.deadline,
|
659
408
|
call_info.optional_payload);
|
660
|
-
|
661
|
-
|
409
|
+
calld->SetState(CallData::CallState::ACTIVATED);
|
410
|
+
calld->Publish(cq_idx(), rc);
|
662
411
|
}
|
663
412
|
|
664
413
|
private:
|
665
|
-
|
666
|
-
std::function<
|
414
|
+
RegisteredMethod* const registered_method_;
|
415
|
+
std::function<RegisteredCallAllocation()> allocator_;
|
667
416
|
};
|
668
417
|
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
void server_ref(grpc_server* server) { server->internal_refcount.Ref(); }
|
674
|
-
|
675
|
-
void server_delete(grpc_server* server) {
|
676
|
-
registered_method* rm;
|
677
|
-
size_t i;
|
678
|
-
server->channelz_server.reset();
|
679
|
-
grpc_channel_args_destroy(server->channel_args);
|
680
|
-
gpr_mu_destroy(&server->mu_global);
|
681
|
-
gpr_mu_destroy(&server->mu_call);
|
682
|
-
gpr_cv_destroy(&server->starting_cv);
|
683
|
-
while ((rm = server->registered_methods) != nullptr) {
|
684
|
-
server->registered_methods = rm->next;
|
685
|
-
delete rm;
|
686
|
-
}
|
687
|
-
delete server->unregistered_request_matcher;
|
688
|
-
for (i = 0; i < server->cq_count; i++) {
|
689
|
-
GRPC_CQ_INTERNAL_UNREF(server->cqs[i], "server");
|
690
|
-
}
|
691
|
-
gpr_free(server->cqs);
|
692
|
-
gpr_free(server->pollsets);
|
693
|
-
gpr_free(server->shutdown_tags);
|
694
|
-
gpr_free(server);
|
695
|
-
}
|
418
|
+
//
|
419
|
+
// ChannelBroadcaster
|
420
|
+
//
|
696
421
|
|
697
|
-
|
698
|
-
if (GPR_UNLIKELY(server->internal_refcount.Unref())) {
|
699
|
-
server_delete(server);
|
700
|
-
}
|
701
|
-
}
|
422
|
+
namespace {
|
702
423
|
|
703
|
-
|
424
|
+
class ChannelBroadcaster {
|
425
|
+
public:
|
426
|
+
// This can have an empty constructor and destructor since we want to control
|
427
|
+
// when the actual setup and shutdown broadcast take place.
|
704
428
|
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
}
|
429
|
+
// Copies over the channels from the locked server.
|
430
|
+
void FillChannelsLocked(std::vector<grpc_channel*> channels) {
|
431
|
+
GPR_DEBUG_ASSERT(channels_.empty());
|
432
|
+
channels_ = std::move(channels);
|
433
|
+
}
|
710
434
|
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
}
|
435
|
+
// Broadcasts a shutdown on each channel.
|
436
|
+
void BroadcastShutdown(bool send_goaway, grpc_error* force_disconnect) {
|
437
|
+
for (grpc_channel* channel : channels_) {
|
438
|
+
SendShutdown(channel, send_goaway, GRPC_ERROR_REF(force_disconnect));
|
439
|
+
GRPC_CHANNEL_INTERNAL_UNREF(channel, "broadcast");
|
440
|
+
}
|
441
|
+
channels_.clear(); // just for safety against double broadcast
|
442
|
+
GRPC_ERROR_UNREF(force_disconnect);
|
443
|
+
}
|
717
444
|
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
maybe_finish_shutdown(chand->server);
|
724
|
-
GRPC_CLOSURE_INIT(&chand->finish_destroy_channel_closure,
|
725
|
-
finish_destroy_channel, chand, grpc_schedule_on_exec_ctx);
|
445
|
+
private:
|
446
|
+
struct ShutdownCleanupArgs {
|
447
|
+
grpc_closure closure;
|
448
|
+
grpc_slice slice;
|
449
|
+
};
|
726
450
|
|
727
|
-
|
728
|
-
|
451
|
+
static void ShutdownCleanup(void* arg, grpc_error* /*error*/) {
|
452
|
+
ShutdownCleanupArgs* a = static_cast<ShutdownCleanupArgs*>(arg);
|
453
|
+
grpc_slice_unref_internal(a->slice);
|
454
|
+
delete a;
|
729
455
|
}
|
730
456
|
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
457
|
+
static void SendShutdown(grpc_channel* channel, bool send_goaway,
|
458
|
+
grpc_error* send_disconnect) {
|
459
|
+
ShutdownCleanupArgs* sc = new ShutdownCleanupArgs;
|
460
|
+
GRPC_CLOSURE_INIT(&sc->closure, ShutdownCleanup, sc,
|
461
|
+
grpc_schedule_on_exec_ctx);
|
462
|
+
grpc_transport_op* op = grpc_make_transport_op(&sc->closure);
|
463
|
+
grpc_channel_element* elem;
|
464
|
+
op->goaway_error =
|
465
|
+
send_goaway
|
466
|
+
? grpc_error_set_int(
|
467
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown"),
|
468
|
+
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_OK)
|
469
|
+
: GRPC_ERROR_NONE;
|
470
|
+
op->set_accept_stream = true;
|
471
|
+
sc->slice = grpc_slice_from_copied_string("Server shutdown");
|
472
|
+
op->disconnect_with_error = send_disconnect;
|
473
|
+
elem =
|
474
|
+
grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0);
|
475
|
+
elem->filter->start_transport_op(elem, op);
|
476
|
+
}
|
477
|
+
|
478
|
+
std::vector<grpc_channel*> channels_;
|
479
|
+
};
|
738
480
|
|
739
|
-
|
740
|
-
delete static_cast<requested_call*>(req);
|
741
|
-
}
|
481
|
+
} // namespace
|
742
482
|
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
grpc_call* call = calld->call;
|
747
|
-
*rc->call = call;
|
748
|
-
calld->cq_new = server->cqs[cq_idx];
|
749
|
-
GPR_SWAP(grpc_metadata_array, *rc->initial_metadata, calld->initial_metadata);
|
750
|
-
switch (rc->type) {
|
751
|
-
case BATCH_CALL:
|
752
|
-
GPR_ASSERT(calld->host_set);
|
753
|
-
GPR_ASSERT(calld->path_set);
|
754
|
-
rc->data.batch.details->host = grpc_slice_ref_internal(calld->host);
|
755
|
-
rc->data.batch.details->method = grpc_slice_ref_internal(calld->path);
|
756
|
-
rc->data.batch.details->deadline =
|
757
|
-
grpc_millis_to_timespec(calld->deadline, GPR_CLOCK_MONOTONIC);
|
758
|
-
rc->data.batch.details->flags = calld->recv_initial_metadata_flags;
|
759
|
-
break;
|
760
|
-
case REGISTERED_CALL:
|
761
|
-
*rc->data.registered.deadline =
|
762
|
-
grpc_millis_to_timespec(calld->deadline, GPR_CLOCK_MONOTONIC);
|
763
|
-
if (rc->data.registered.optional_payload) {
|
764
|
-
*rc->data.registered.optional_payload = calld->payload;
|
765
|
-
calld->payload = nullptr;
|
766
|
-
}
|
767
|
-
break;
|
768
|
-
default:
|
769
|
-
GPR_UNREACHABLE_CODE(return );
|
770
|
-
}
|
483
|
+
//
|
484
|
+
// Server
|
485
|
+
//
|
771
486
|
|
772
|
-
|
773
|
-
|
774
|
-
|
487
|
+
const grpc_channel_filter Server::kServerTopFilter = {
|
488
|
+
Server::CallData::StartTransportStreamOpBatch,
|
489
|
+
grpc_channel_next_op,
|
490
|
+
sizeof(Server::CallData),
|
491
|
+
Server::CallData::InitCallElement,
|
492
|
+
grpc_call_stack_ignore_set_pollset_or_pollset_set,
|
493
|
+
Server::CallData::DestroyCallElement,
|
494
|
+
sizeof(Server::ChannelData),
|
495
|
+
Server::ChannelData::InitChannelElement,
|
496
|
+
Server::ChannelData::DestroyChannelElement,
|
497
|
+
grpc_channel_next_get_info,
|
498
|
+
"server",
|
499
|
+
};
|
775
500
|
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
|
784
|
-
|
785
|
-
GRPC_CLOSURE_INIT(
|
786
|
-
&calld->kill_zombie_closure, kill_zombie,
|
787
|
-
grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
|
788
|
-
grpc_schedule_on_exec_ctx);
|
789
|
-
grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure,
|
790
|
-
GRPC_ERROR_REF(error));
|
791
|
-
return;
|
501
|
+
namespace {
|
502
|
+
|
503
|
+
grpc_resource_user* CreateDefaultResourceUser(const grpc_channel_args* args) {
|
504
|
+
if (args != nullptr) {
|
505
|
+
grpc_resource_quota* resource_quota =
|
506
|
+
grpc_resource_quota_from_channel_args(args, false /* create */);
|
507
|
+
if (resource_quota != nullptr) {
|
508
|
+
return grpc_resource_user_create(resource_quota, "default");
|
509
|
+
}
|
792
510
|
}
|
511
|
+
return nullptr;
|
512
|
+
}
|
793
513
|
|
794
|
-
|
514
|
+
RefCountedPtr<channelz::ServerNode> CreateChannelzNode(
|
515
|
+
Server* server, const grpc_channel_args* args) {
|
516
|
+
RefCountedPtr<channelz::ServerNode> channelz_node;
|
517
|
+
if (grpc_channel_args_find_bool(args, GRPC_ARG_ENABLE_CHANNELZ,
|
518
|
+
GRPC_ENABLE_CHANNELZ_DEFAULT)) {
|
519
|
+
size_t channel_tracer_max_memory = grpc_channel_args_find_integer(
|
520
|
+
args, GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE,
|
521
|
+
{GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT, 0, INT_MAX});
|
522
|
+
channelz_node =
|
523
|
+
MakeRefCounted<channelz::ServerNode>(channel_tracer_max_memory);
|
524
|
+
channelz_node->AddTraceEvent(
|
525
|
+
channelz::ChannelTrace::Severity::Info,
|
526
|
+
grpc_slice_from_static_string("Server created"));
|
527
|
+
}
|
528
|
+
return channelz_node;
|
795
529
|
}
|
796
530
|
|
797
|
-
|
798
|
-
grpc_server* server, grpc_call_element* elem, RequestMatcherInterface* rm,
|
799
|
-
grpc_server_register_method_payload_handling payload_handling) {
|
800
|
-
call_data* calld = static_cast<call_data*>(elem->call_data);
|
531
|
+
} // namespace
|
801
532
|
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure,
|
807
|
-
GRPC_ERROR_NONE);
|
808
|
-
return;
|
809
|
-
}
|
533
|
+
Server::Server(const grpc_channel_args* args)
|
534
|
+
: channel_args_(grpc_channel_args_copy(args)),
|
535
|
+
default_resource_user_(CreateDefaultResourceUser(args)),
|
536
|
+
channelz_node_(CreateChannelzNode(this, args)) {}
|
810
537
|
|
811
|
-
|
538
|
+
Server::~Server() {
|
539
|
+
grpc_channel_args_destroy(channel_args_);
|
540
|
+
for (size_t i = 0; i < cqs_.size(); i++) {
|
541
|
+
GRPC_CQ_INTERNAL_UNREF(cqs_[i], "server");
|
542
|
+
}
|
543
|
+
}
|
812
544
|
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
grpc_op op;
|
819
|
-
op.op = GRPC_OP_RECV_MESSAGE;
|
820
|
-
op.flags = 0;
|
821
|
-
op.reserved = nullptr;
|
822
|
-
op.data.recv_message.recv_message = &calld->payload;
|
823
|
-
GRPC_CLOSURE_INIT(&calld->publish, publish_new_rpc, elem,
|
824
|
-
grpc_schedule_on_exec_ctx);
|
825
|
-
grpc_call_start_batch_and_execute(calld->call, &op, 1, &calld->publish);
|
826
|
-
break;
|
827
|
-
}
|
545
|
+
void Server::AddListener(OrphanablePtr<ListenerInterface> listener) {
|
546
|
+
channelz::ListenSocketNode* listen_socket_node =
|
547
|
+
listener->channelz_listen_socket_node();
|
548
|
+
if (listen_socket_node != nullptr && channelz_node_ != nullptr) {
|
549
|
+
channelz_node_->AddChildListenSocket(listen_socket_node->Ref());
|
828
550
|
}
|
551
|
+
listeners_.emplace_back(std::move(listener));
|
829
552
|
}
|
830
553
|
|
831
|
-
void
|
832
|
-
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
uint32_t hash;
|
837
|
-
channel_registered_method* rm;
|
838
|
-
|
839
|
-
if (chand->registered_methods && calld->path_set && calld->host_set) {
|
840
|
-
/* TODO(ctiller): unify these two searches */
|
841
|
-
/* check for an exact match with host */
|
842
|
-
hash = GRPC_MDSTR_KV_HASH(grpc_slice_hash_internal(calld->host),
|
843
|
-
grpc_slice_hash_internal(calld->path));
|
844
|
-
for (i = 0; i <= chand->registered_method_max_probes; i++) {
|
845
|
-
rm = &chand->registered_methods[(hash + i) %
|
846
|
-
chand->registered_method_slots];
|
847
|
-
if (rm->server_registered_method == nullptr) break;
|
848
|
-
if (!rm->has_host) continue;
|
849
|
-
if (rm->host != calld->host) continue;
|
850
|
-
if (rm->method != calld->path) continue;
|
851
|
-
if ((rm->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) &&
|
852
|
-
0 == (calld->recv_initial_metadata_flags &
|
853
|
-
GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) {
|
854
|
-
continue;
|
855
|
-
}
|
856
|
-
finish_start_new_rpc(server, elem,
|
857
|
-
rm->server_registered_method->matcher.get(),
|
858
|
-
rm->server_registered_method->payload_handling);
|
859
|
-
return;
|
554
|
+
void Server::Start() {
|
555
|
+
started_ = true;
|
556
|
+
for (grpc_completion_queue* cq : cqs_) {
|
557
|
+
if (grpc_cq_can_listen(cq)) {
|
558
|
+
pollsets_.push_back(grpc_cq_pollset(cq));
|
860
559
|
}
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
if (rm->method != calld->path) continue;
|
869
|
-
if ((rm->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) &&
|
870
|
-
0 == (calld->recv_initial_metadata_flags &
|
871
|
-
GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) {
|
872
|
-
continue;
|
873
|
-
}
|
874
|
-
finish_start_new_rpc(server, elem,
|
875
|
-
rm->server_registered_method->matcher.get(),
|
876
|
-
rm->server_registered_method->payload_handling);
|
877
|
-
return;
|
560
|
+
}
|
561
|
+
if (unregistered_request_matcher_ == nullptr) {
|
562
|
+
unregistered_request_matcher_ = absl::make_unique<RealRequestMatcher>(this);
|
563
|
+
}
|
564
|
+
for (std::unique_ptr<RegisteredMethod>& rm : registered_methods_) {
|
565
|
+
if (rm->matcher == nullptr) {
|
566
|
+
rm->matcher = absl::make_unique<RealRequestMatcher>(this);
|
878
567
|
}
|
879
568
|
}
|
880
|
-
|
881
|
-
|
569
|
+
{
|
570
|
+
MutexLock lock(&mu_global_);
|
571
|
+
starting_ = true;
|
572
|
+
}
|
573
|
+
for (auto& listener : listeners_) {
|
574
|
+
listener.listener->Start(this, &pollsets_);
|
575
|
+
}
|
576
|
+
MutexLock lock(&mu_global_);
|
577
|
+
starting_ = false;
|
578
|
+
starting_cv_.Signal();
|
882
579
|
}
|
883
580
|
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
581
|
+
void Server::SetupTransport(
|
582
|
+
grpc_transport* transport, grpc_pollset* accepting_pollset,
|
583
|
+
const grpc_channel_args* args,
|
584
|
+
const RefCountedPtr<grpc_core::channelz::SocketNode>& socket_node,
|
585
|
+
grpc_resource_user* resource_user) {
|
586
|
+
// Create channel.
|
587
|
+
grpc_channel* channel = grpc_channel_create(
|
588
|
+
nullptr, args, GRPC_SERVER_CHANNEL, transport, resource_user);
|
589
|
+
ChannelData* chand = static_cast<ChannelData*>(
|
590
|
+
grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0)
|
591
|
+
->channel_data);
|
592
|
+
// Set up CQs.
|
593
|
+
size_t cq_idx;
|
594
|
+
for (cq_idx = 0; cq_idx < cqs_.size(); cq_idx++) {
|
595
|
+
if (grpc_cq_pollset(cqs_[cq_idx]) == accepting_pollset) break;
|
596
|
+
}
|
597
|
+
if (cq_idx == cqs_.size()) {
|
598
|
+
// Completion queue not found. Pick a random one to publish new calls to.
|
599
|
+
cq_idx = static_cast<size_t>(rand()) % cqs_.size();
|
889
600
|
}
|
890
|
-
|
601
|
+
// Set up channelz node.
|
602
|
+
intptr_t channelz_socket_uuid = 0;
|
603
|
+
if (socket_node != nullptr) {
|
604
|
+
channelz_socket_uuid = socket_node->uuid();
|
605
|
+
channelz_node_->AddChildSocket(socket_node);
|
606
|
+
}
|
607
|
+
// Initialize chand.
|
608
|
+
chand->InitTransport(Ref(), channel, cq_idx, transport, channelz_socket_uuid);
|
609
|
+
}
|
610
|
+
|
611
|
+
bool Server::HasOpenConnections() {
|
612
|
+
MutexLock lock(&mu_global_);
|
613
|
+
return !channels_.empty();
|
891
614
|
}
|
892
615
|
|
893
|
-
void
|
894
|
-
|
616
|
+
void Server::SetRegisteredMethodAllocator(
|
617
|
+
grpc_completion_queue* cq, void* method_tag,
|
618
|
+
std::function<RegisteredCallAllocation()> allocator) {
|
619
|
+
RegisteredMethod* rm = static_cast<RegisteredMethod*>(method_tag);
|
620
|
+
rm->matcher = absl::make_unique<AllocatingRequestMatcherRegistered>(
|
621
|
+
this, cq, rm, std::move(allocator));
|
895
622
|
}
|
896
623
|
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
624
|
+
void Server::SetBatchMethodAllocator(
|
625
|
+
grpc_completion_queue* cq, std::function<BatchCallAllocation()> allocator) {
|
626
|
+
GPR_DEBUG_ASSERT(unregistered_request_matcher_ == nullptr);
|
627
|
+
unregistered_request_matcher_ =
|
628
|
+
absl::make_unique<AllocatingRequestMatcherBatch>(this, cq,
|
629
|
+
std::move(allocator));
|
630
|
+
}
|
631
|
+
|
632
|
+
void Server::RegisterCompletionQueue(grpc_completion_queue* cq) {
|
633
|
+
for (grpc_completion_queue* queue : cqs_) {
|
634
|
+
if (queue == cq) return;
|
903
635
|
}
|
904
|
-
|
636
|
+
GRPC_CQ_INTERNAL_REF(cq, "server");
|
637
|
+
cqs_.push_back(cq);
|
905
638
|
}
|
906
639
|
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
|
914
|
-
|
640
|
+
namespace {
|
641
|
+
|
642
|
+
bool streq(const std::string& a, const char* b) {
|
643
|
+
return (a.empty() && b == nullptr) ||
|
644
|
+
((b != nullptr) && !strcmp(a.c_str(), b));
|
645
|
+
}
|
646
|
+
|
647
|
+
} // namespace
|
648
|
+
|
649
|
+
Server::RegisteredMethod* Server::RegisterMethod(
|
650
|
+
const char* method, const char* host,
|
651
|
+
grpc_server_register_method_payload_handling payload_handling,
|
652
|
+
uint32_t flags) {
|
653
|
+
if (!method) {
|
654
|
+
gpr_log(GPR_ERROR,
|
655
|
+
"grpc_server_register_method method string cannot be NULL");
|
656
|
+
return nullptr;
|
657
|
+
}
|
658
|
+
for (std::unique_ptr<RegisteredMethod>& m : registered_methods_) {
|
659
|
+
if (streq(m->method, method) && streq(m->host, host)) {
|
660
|
+
gpr_log(GPR_ERROR, "duplicate registration for %s@%s", method,
|
661
|
+
host ? host : "*");
|
662
|
+
return nullptr;
|
915
663
|
}
|
916
664
|
}
|
917
|
-
|
665
|
+
if ((flags & ~GRPC_INITIAL_METADATA_USED_MASK) != 0) {
|
666
|
+
gpr_log(GPR_ERROR, "grpc_server_register_method invalid flags 0x%08x",
|
667
|
+
flags);
|
668
|
+
return nullptr;
|
669
|
+
}
|
670
|
+
registered_methods_.emplace_back(absl::make_unique<RegisteredMethod>(
|
671
|
+
method, host, payload_handling, flags));
|
672
|
+
return registered_methods_.back().get();
|
918
673
|
}
|
919
674
|
|
920
|
-
void
|
921
|
-
|
922
|
-
|
923
|
-
return;
|
924
|
-
}
|
675
|
+
void Server::DoneRequestEvent(void* req, grpc_cq_completion* /*c*/) {
|
676
|
+
delete static_cast<RequestedCall*>(req);
|
677
|
+
}
|
925
678
|
|
926
|
-
|
927
|
-
|
928
|
-
|
929
|
-
|
679
|
+
void Server::FailCall(size_t cq_idx, RequestedCall* rc, grpc_error* error) {
|
680
|
+
*rc->call = nullptr;
|
681
|
+
rc->initial_metadata->count = 0;
|
682
|
+
GPR_ASSERT(error != GRPC_ERROR_NONE);
|
683
|
+
grpc_cq_end_op(cqs_[cq_idx], rc->tag, error, DoneRequestEvent, rc,
|
684
|
+
&rc->completion);
|
685
|
+
}
|
930
686
|
|
931
|
-
|
932
|
-
|
687
|
+
// Before calling MaybeFinishShutdown(), we must hold mu_global_ and not
|
688
|
+
// hold mu_call_.
|
689
|
+
void Server::MaybeFinishShutdown() {
|
690
|
+
if (!shutdown_flag_.load(std::memory_order_acquire) || shutdown_published_) {
|
691
|
+
return;
|
692
|
+
}
|
693
|
+
{
|
694
|
+
MutexLock lock(&mu_call_);
|
695
|
+
KillPendingWorkLocked(
|
696
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
|
697
|
+
}
|
698
|
+
if (!channels_.empty() || listeners_destroyed_ < listeners_.size()) {
|
933
699
|
if (gpr_time_cmp(gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME),
|
934
|
-
|
700
|
+
last_shutdown_message_time_),
|
935
701
|
gpr_time_from_seconds(1, GPR_TIMESPAN)) >= 0) {
|
936
|
-
|
702
|
+
last_shutdown_message_time_ = gpr_now(GPR_CLOCK_REALTIME);
|
937
703
|
gpr_log(GPR_DEBUG,
|
938
|
-
"Waiting for %
|
939
|
-
" before shutting down server",
|
940
|
-
|
941
|
-
|
942
|
-
num_listeners(server));
|
704
|
+
"Waiting for %" PRIuPTR " channels and %" PRIuPTR "/%" PRIuPTR
|
705
|
+
" listeners to be destroyed before shutting down server",
|
706
|
+
channels_.size(), listeners_.size() - listeners_destroyed_,
|
707
|
+
listeners_.size());
|
943
708
|
}
|
944
709
|
return;
|
945
710
|
}
|
946
|
-
|
947
|
-
for (
|
948
|
-
|
949
|
-
grpc_cq_end_op(
|
950
|
-
|
951
|
-
&server->shutdown_tags[i].completion);
|
711
|
+
shutdown_published_ = true;
|
712
|
+
for (auto& shutdown_tag : shutdown_tags_) {
|
713
|
+
Ref().release();
|
714
|
+
grpc_cq_end_op(shutdown_tag.cq, shutdown_tag.tag, GRPC_ERROR_NONE,
|
715
|
+
DoneShutdownEvent, this, &shutdown_tag.completion);
|
952
716
|
}
|
953
717
|
}
|
954
718
|
|
955
|
-
void
|
956
|
-
|
957
|
-
|
958
|
-
|
719
|
+
void Server::KillPendingWorkLocked(grpc_error* error) {
|
720
|
+
if (started_) {
|
721
|
+
unregistered_request_matcher_->KillRequests(GRPC_ERROR_REF(error));
|
722
|
+
unregistered_request_matcher_->ZombifyPending();
|
723
|
+
for (std::unique_ptr<RegisteredMethod>& rm : registered_methods_) {
|
724
|
+
rm->matcher->KillRequests(GRPC_ERROR_REF(error));
|
725
|
+
rm->matcher->ZombifyPending();
|
726
|
+
}
|
727
|
+
}
|
728
|
+
GRPC_ERROR_UNREF(error);
|
729
|
+
}
|
959
730
|
|
960
|
-
|
961
|
-
|
962
|
-
|
963
|
-
|
964
|
-
|
965
|
-
|
966
|
-
calld->host = grpc_slice_ref_internal(
|
967
|
-
GRPC_MDVALUE(calld->recv_initial_metadata->idx.named.authority->md));
|
968
|
-
calld->path_set = true;
|
969
|
-
calld->host_set = true;
|
970
|
-
grpc_metadata_batch_remove(calld->recv_initial_metadata, GRPC_BATCH_PATH);
|
971
|
-
grpc_metadata_batch_remove(calld->recv_initial_metadata,
|
972
|
-
GRPC_BATCH_AUTHORITY);
|
973
|
-
} else {
|
974
|
-
GRPC_ERROR_REF(error);
|
731
|
+
std::vector<grpc_channel*> Server::GetChannelsLocked() const {
|
732
|
+
std::vector<grpc_channel*> channels;
|
733
|
+
channels.reserve(channels_.size());
|
734
|
+
for (const ChannelData* chand : channels_) {
|
735
|
+
channels.push_back(chand->channel());
|
736
|
+
GRPC_CHANNEL_INTERNAL_REF(chand->channel(), "broadcast");
|
975
737
|
}
|
976
|
-
|
977
|
-
|
978
|
-
|
738
|
+
return channels;
|
739
|
+
}
|
740
|
+
|
741
|
+
void Server::ListenerDestroyDone(void* arg, grpc_error* /*error*/) {
|
742
|
+
Server* server = static_cast<Server*>(arg);
|
743
|
+
MutexLock lock(&server->mu_global_);
|
744
|
+
server->listeners_destroyed_++;
|
745
|
+
server->MaybeFinishShutdown();
|
746
|
+
}
|
747
|
+
|
748
|
+
namespace {
|
749
|
+
|
750
|
+
void DonePublishedShutdown(void* /*done_arg*/, grpc_cq_completion* storage) {
|
751
|
+
delete storage;
|
752
|
+
}
|
753
|
+
|
754
|
+
} // namespace
|
755
|
+
|
756
|
+
// - Kills all pending requests-for-incoming-RPC-calls (i.e., the requests made
|
757
|
+
// via grpc_server_request_call() and grpc_server_request_registered_call()
|
758
|
+
// will now be cancelled). See KillPendingWorkLocked().
|
759
|
+
//
|
760
|
+
// - Shuts down the listeners (i.e., the server will no longer listen on the
|
761
|
+
// port for new incoming channels).
|
762
|
+
//
|
763
|
+
// - Iterates through all channels on the server and sends shutdown msg (see
|
764
|
+
// ChannelBroadcaster::BroadcastShutdown() for details) to the clients via
|
765
|
+
// the transport layer. The transport layer then guarantees the following:
|
766
|
+
// -- Sends shutdown to the client (e.g., HTTP2 transport sends GOAWAY).
|
767
|
+
// -- If the server has outstanding calls that are in the process, the
|
768
|
+
// connection is NOT closed until the server is done with all those calls.
|
769
|
+
// -- Once there are no more calls in progress, the channel is closed.
|
770
|
+
void Server::ShutdownAndNotify(grpc_completion_queue* cq, void* tag) {
|
771
|
+
ChannelBroadcaster broadcaster;
|
772
|
+
{
|
773
|
+
// Wait for startup to be finished. Locks mu_global.
|
774
|
+
MutexLock lock(&mu_global_);
|
775
|
+
starting_cv_.WaitUntil(&mu_global_, [this] { return !starting_; });
|
776
|
+
// Stay locked, and gather up some stuff to do.
|
777
|
+
GPR_ASSERT(grpc_cq_begin_op(cq, tag));
|
778
|
+
if (shutdown_published_) {
|
779
|
+
grpc_cq_end_op(cq, tag, GRPC_ERROR_NONE, DonePublishedShutdown, nullptr,
|
780
|
+
new grpc_cq_completion);
|
781
|
+
return;
|
782
|
+
}
|
783
|
+
shutdown_tags_.emplace_back(tag, cq);
|
784
|
+
if (shutdown_flag_.load(std::memory_order_acquire)) {
|
785
|
+
return;
|
786
|
+
}
|
787
|
+
last_shutdown_message_time_ = gpr_now(GPR_CLOCK_REALTIME);
|
788
|
+
broadcaster.FillChannelsLocked(GetChannelsLocked());
|
789
|
+
shutdown_flag_.store(true, std::memory_order_release);
|
790
|
+
// Collect all unregistered then registered calls.
|
791
|
+
{
|
792
|
+
MutexLock lock(&mu_call_);
|
793
|
+
KillPendingWorkLocked(
|
794
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
|
795
|
+
}
|
796
|
+
MaybeFinishShutdown();
|
797
|
+
}
|
798
|
+
// Shutdown listeners.
|
799
|
+
for (auto& listener : listeners_) {
|
800
|
+
channelz::ListenSocketNode* channelz_listen_socket_node =
|
801
|
+
listener.listener->channelz_listen_socket_node();
|
802
|
+
if (channelz_node_ != nullptr && channelz_listen_socket_node != nullptr) {
|
803
|
+
channelz_node_->RemoveChildListenSocket(
|
804
|
+
channelz_listen_socket_node->uuid());
|
805
|
+
}
|
806
|
+
GRPC_CLOSURE_INIT(&listener.destroy_done, ListenerDestroyDone, this,
|
807
|
+
grpc_schedule_on_exec_ctx);
|
808
|
+
listener.listener->SetOnDestroyDone(&listener.destroy_done);
|
809
|
+
listener.listener.reset();
|
979
810
|
}
|
980
|
-
|
981
|
-
|
982
|
-
|
983
|
-
|
984
|
-
|
985
|
-
|
986
|
-
|
987
|
-
|
988
|
-
calld->recv_initial_metadata_error = GRPC_ERROR_REF(error);
|
811
|
+
broadcaster.BroadcastShutdown(/*send_goaway=*/true, GRPC_ERROR_NONE);
|
812
|
+
}
|
813
|
+
|
814
|
+
void Server::CancelAllCalls() {
|
815
|
+
ChannelBroadcaster broadcaster;
|
816
|
+
{
|
817
|
+
MutexLock lock(&mu_global_);
|
818
|
+
broadcaster.FillChannelsLocked(GetChannelsLocked());
|
989
819
|
}
|
990
|
-
|
991
|
-
|
992
|
-
|
993
|
-
|
994
|
-
|
995
|
-
|
996
|
-
|
820
|
+
broadcaster.BroadcastShutdown(
|
821
|
+
/*send_goaway=*/false,
|
822
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Cancelling all calls"));
|
823
|
+
}
|
824
|
+
|
825
|
+
void Server::Orphan() {
|
826
|
+
{
|
827
|
+
MutexLock lock(&mu_global_);
|
828
|
+
GPR_ASSERT(shutdown_flag_.load(std::memory_order_acquire) ||
|
829
|
+
listeners_.empty());
|
830
|
+
GPR_ASSERT(listeners_destroyed_ == listeners_.size());
|
831
|
+
}
|
832
|
+
if (default_resource_user_ != nullptr) {
|
833
|
+
grpc_resource_quota_unref(grpc_resource_user_quota(default_resource_user_));
|
834
|
+
grpc_resource_user_shutdown(default_resource_user_);
|
835
|
+
grpc_resource_user_unref(default_resource_user_);
|
997
836
|
}
|
998
|
-
|
837
|
+
Unref();
|
999
838
|
}
|
1000
839
|
|
1001
|
-
|
1002
|
-
|
1003
|
-
|
1004
|
-
if (
|
1005
|
-
|
1006
|
-
|
1007
|
-
|
1008
|
-
server_recv_trailing_metadata_ready, elem,
|
1009
|
-
grpc_schedule_on_exec_ctx);
|
1010
|
-
GRPC_CALL_COMBINER_STOP(calld->call_combiner,
|
1011
|
-
"deferring server_recv_trailing_metadata_ready "
|
1012
|
-
"until after server_on_recv_initial_metadata");
|
1013
|
-
return;
|
840
|
+
grpc_call_error Server::ValidateServerRequest(
|
841
|
+
grpc_completion_queue* cq_for_notification, void* tag,
|
842
|
+
grpc_byte_buffer** optional_payload, RegisteredMethod* rm) {
|
843
|
+
if ((rm == nullptr && optional_payload != nullptr) ||
|
844
|
+
((rm != nullptr) && ((optional_payload == nullptr) !=
|
845
|
+
(rm->payload_handling == GRPC_SRM_PAYLOAD_NONE)))) {
|
846
|
+
return GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH;
|
1014
847
|
}
|
1015
|
-
|
1016
|
-
|
1017
|
-
|
1018
|
-
|
1019
|
-
calld->original_recv_trailing_metadata_ready, error);
|
848
|
+
if (grpc_cq_begin_op(cq_for_notification, tag) == false) {
|
849
|
+
return GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN;
|
850
|
+
}
|
851
|
+
return GRPC_CALL_OK;
|
1020
852
|
}
|
1021
853
|
|
1022
|
-
|
1023
|
-
|
1024
|
-
|
1025
|
-
|
1026
|
-
|
1027
|
-
|
1028
|
-
|
1029
|
-
|
1030
|
-
|
1031
|
-
|
1032
|
-
|
1033
|
-
&calld->server_on_recv_initial_metadata;
|
1034
|
-
op->payload->recv_initial_metadata.recv_flags =
|
1035
|
-
&calld->recv_initial_metadata_flags;
|
1036
|
-
}
|
1037
|
-
if (op->recv_trailing_metadata) {
|
1038
|
-
calld->original_recv_trailing_metadata_ready =
|
1039
|
-
op->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
|
1040
|
-
op->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
|
1041
|
-
&calld->recv_trailing_metadata_ready;
|
854
|
+
grpc_call_error Server::ValidateServerRequestAndCq(
|
855
|
+
size_t* cq_idx, grpc_completion_queue* cq_for_notification, void* tag,
|
856
|
+
grpc_byte_buffer** optional_payload, RegisteredMethod* rm) {
|
857
|
+
size_t idx;
|
858
|
+
for (idx = 0; idx < cqs_.size(); idx++) {
|
859
|
+
if (cqs_[idx] == cq_for_notification) {
|
860
|
+
break;
|
861
|
+
}
|
862
|
+
}
|
863
|
+
if (idx == cqs_.size()) {
|
864
|
+
return GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
|
1042
865
|
}
|
866
|
+
grpc_call_error error =
|
867
|
+
ValidateServerRequest(cq_for_notification, tag, optional_payload, rm);
|
868
|
+
if (error != GRPC_CALL_OK) {
|
869
|
+
return error;
|
870
|
+
}
|
871
|
+
*cq_idx = idx;
|
872
|
+
return GRPC_CALL_OK;
|
1043
873
|
}
|
1044
874
|
|
1045
|
-
|
1046
|
-
|
1047
|
-
|
1048
|
-
|
875
|
+
grpc_call_error Server::QueueRequestedCall(size_t cq_idx, RequestedCall* rc) {
|
876
|
+
if (shutdown_flag_.load(std::memory_order_acquire)) {
|
877
|
+
FailCall(cq_idx, rc,
|
878
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
|
879
|
+
return GRPC_CALL_OK;
|
880
|
+
}
|
881
|
+
RequestMatcherInterface* rm;
|
882
|
+
switch (rc->type) {
|
883
|
+
case RequestedCall::Type::BATCH_CALL:
|
884
|
+
rm = unregistered_request_matcher_.get();
|
885
|
+
break;
|
886
|
+
case RequestedCall::Type::REGISTERED_CALL:
|
887
|
+
rm = rc->data.registered.method->matcher.get();
|
888
|
+
break;
|
889
|
+
}
|
890
|
+
rm->RequestCallWithPossiblePublish(cq_idx, rc);
|
891
|
+
return GRPC_CALL_OK;
|
1049
892
|
}
|
1050
893
|
|
1051
|
-
|
1052
|
-
|
1053
|
-
|
1054
|
-
|
1055
|
-
|
1056
|
-
|
1057
|
-
|
1058
|
-
|
1059
|
-
|
1060
|
-
|
1061
|
-
|
1062
|
-
|
1063
|
-
|
1064
|
-
|
894
|
+
grpc_call_error Server::RequestCall(grpc_call** call,
|
895
|
+
grpc_call_details* details,
|
896
|
+
grpc_metadata_array* request_metadata,
|
897
|
+
grpc_completion_queue* cq_bound_to_call,
|
898
|
+
grpc_completion_queue* cq_for_notification,
|
899
|
+
void* tag) {
|
900
|
+
size_t cq_idx;
|
901
|
+
grpc_call_error error = ValidateServerRequestAndCq(
|
902
|
+
&cq_idx, cq_for_notification, tag, nullptr, nullptr);
|
903
|
+
if (error != GRPC_CALL_OK) {
|
904
|
+
return error;
|
905
|
+
}
|
906
|
+
RequestedCall* rc =
|
907
|
+
new RequestedCall(tag, cq_bound_to_call, call, request_metadata, details);
|
908
|
+
return QueueRequestedCall(cq_idx, rc);
|
909
|
+
}
|
910
|
+
|
911
|
+
grpc_call_error Server::RequestRegisteredCall(
|
912
|
+
RegisteredMethod* rm, grpc_call** call, gpr_timespec* deadline,
|
913
|
+
grpc_metadata_array* request_metadata, grpc_byte_buffer** optional_payload,
|
914
|
+
grpc_completion_queue* cq_bound_to_call,
|
915
|
+
grpc_completion_queue* cq_for_notification, void* tag_new) {
|
916
|
+
size_t cq_idx;
|
917
|
+
grpc_call_error error = ValidateServerRequestAndCq(
|
918
|
+
&cq_idx, cq_for_notification, tag_new, optional_payload, rm);
|
919
|
+
if (error != GRPC_CALL_OK) {
|
920
|
+
return error;
|
921
|
+
}
|
922
|
+
RequestedCall* rc =
|
923
|
+
new RequestedCall(tag_new, cq_bound_to_call, call, request_metadata, rm,
|
924
|
+
deadline, optional_payload);
|
925
|
+
return QueueRequestedCall(cq_idx, rc);
|
926
|
+
}
|
927
|
+
|
928
|
+
//
|
929
|
+
// Server::ChannelData::ConnectivityWatcher
|
930
|
+
//
|
931
|
+
|
932
|
+
class Server::ChannelData::ConnectivityWatcher
|
933
|
+
: public AsyncConnectivityStateWatcherInterface {
|
934
|
+
public:
|
935
|
+
explicit ConnectivityWatcher(ChannelData* chand) : chand_(chand) {
|
936
|
+
GRPC_CHANNEL_INTERNAL_REF(chand_->channel_, "connectivity");
|
937
|
+
}
|
938
|
+
|
939
|
+
~ConnectivityWatcher() {
|
940
|
+
GRPC_CHANNEL_INTERNAL_UNREF(chand_->channel_, "connectivity");
|
941
|
+
}
|
942
|
+
|
943
|
+
private:
|
944
|
+
void OnConnectivityStateChange(grpc_connectivity_state new_state,
|
945
|
+
const absl::Status& /*status*/) override {
|
946
|
+
// Don't do anything until we are being shut down.
|
947
|
+
if (new_state != GRPC_CHANNEL_SHUTDOWN) return;
|
948
|
+
// Shut down channel.
|
949
|
+
MutexLock lock(&chand_->server_->mu_global_);
|
950
|
+
chand_->Destroy();
|
951
|
+
}
|
952
|
+
|
953
|
+
ChannelData* chand_;
|
954
|
+
};
|
955
|
+
|
956
|
+
//
|
957
|
+
// Server::ChannelData
|
958
|
+
//
|
959
|
+
|
960
|
+
Server::ChannelData::~ChannelData() {
|
961
|
+
if (registered_methods_ != nullptr) {
|
962
|
+
for (const ChannelRegisteredMethod& crm : *registered_methods_) {
|
963
|
+
grpc_slice_unref_internal(crm.method);
|
964
|
+
GPR_DEBUG_ASSERT(crm.method.refcount == &kNoopRefcount ||
|
965
|
+
crm.method.refcount == nullptr);
|
966
|
+
if (crm.has_host) {
|
967
|
+
grpc_slice_unref_internal(crm.host);
|
968
|
+
GPR_DEBUG_ASSERT(crm.host.refcount == &kNoopRefcount ||
|
969
|
+
crm.host.refcount == nullptr);
|
970
|
+
}
|
971
|
+
}
|
972
|
+
registered_methods_.reset();
|
973
|
+
}
|
974
|
+
if (server_ != nullptr) {
|
975
|
+
if (server_->channelz_node_ != nullptr && channelz_socket_uuid_ != 0) {
|
976
|
+
server_->channelz_node_->RemoveChildSocket(channelz_socket_uuid_);
|
977
|
+
}
|
978
|
+
{
|
979
|
+
MutexLock lock(&server_->mu_global_);
|
980
|
+
if (list_position_.has_value()) {
|
981
|
+
server_->channels_.erase(*list_position_);
|
982
|
+
list_position_.reset();
|
983
|
+
}
|
984
|
+
server_->MaybeFinishShutdown();
|
985
|
+
}
|
986
|
+
}
|
987
|
+
}
|
988
|
+
|
989
|
+
void Server::ChannelData::InitTransport(RefCountedPtr<Server> server,
|
990
|
+
grpc_channel* channel, size_t cq_idx,
|
991
|
+
grpc_transport* transport,
|
992
|
+
intptr_t channelz_socket_uuid) {
|
993
|
+
server_ = std::move(server);
|
994
|
+
channel_ = channel;
|
995
|
+
cq_idx_ = cq_idx;
|
996
|
+
channelz_socket_uuid_ = channelz_socket_uuid;
|
997
|
+
// Build a lookup table phrased in terms of mdstr's in this channels context
|
998
|
+
// to quickly find registered methods.
|
999
|
+
size_t num_registered_methods = server_->registered_methods_.size();
|
1000
|
+
if (num_registered_methods > 0) {
|
1001
|
+
uint32_t max_probes = 0;
|
1002
|
+
size_t slots = 2 * num_registered_methods;
|
1003
|
+
registered_methods_.reset(new std::vector<ChannelRegisteredMethod>(slots));
|
1004
|
+
for (std::unique_ptr<RegisteredMethod>& rm : server_->registered_methods_) {
|
1005
|
+
ExternallyManagedSlice host;
|
1006
|
+
ExternallyManagedSlice method(rm->method.c_str());
|
1007
|
+
const bool has_host = !rm->host.empty();
|
1008
|
+
if (has_host) {
|
1009
|
+
host = ExternallyManagedSlice(rm->host.c_str());
|
1010
|
+
}
|
1011
|
+
uint32_t hash =
|
1012
|
+
GRPC_MDSTR_KV_HASH(has_host ? host.Hash() : 0, method.Hash());
|
1013
|
+
uint32_t probes = 0;
|
1014
|
+
for (probes = 0; (*registered_methods_)[(hash + probes) % slots]
|
1015
|
+
.server_registered_method != nullptr;
|
1016
|
+
probes++) {
|
1017
|
+
}
|
1018
|
+
if (probes > max_probes) max_probes = probes;
|
1019
|
+
ChannelRegisteredMethod* crm =
|
1020
|
+
&(*registered_methods_)[(hash + probes) % slots];
|
1021
|
+
crm->server_registered_method = rm.get();
|
1022
|
+
crm->flags = rm->flags;
|
1023
|
+
crm->has_host = has_host;
|
1024
|
+
if (has_host) {
|
1025
|
+
crm->host = host;
|
1026
|
+
}
|
1027
|
+
crm->method = method;
|
1028
|
+
}
|
1029
|
+
GPR_ASSERT(slots <= UINT32_MAX);
|
1030
|
+
registered_method_max_probes_ = max_probes;
|
1031
|
+
}
|
1032
|
+
// Publish channel.
|
1033
|
+
{
|
1034
|
+
MutexLock lock(&server_->mu_global_);
|
1035
|
+
server_->channels_.push_front(this);
|
1036
|
+
list_position_ = server_->channels_.begin();
|
1037
|
+
}
|
1038
|
+
// Start accept_stream transport op.
|
1039
|
+
grpc_transport_op* op = grpc_make_transport_op(nullptr);
|
1040
|
+
op->set_accept_stream = true;
|
1041
|
+
op->set_accept_stream_fn = AcceptStream;
|
1042
|
+
op->set_accept_stream_user_data = this;
|
1043
|
+
op->start_connectivity_watch = MakeOrphanable<ConnectivityWatcher>(this);
|
1044
|
+
if (server_->shutdown_flag_.load(std::memory_order_acquire)) {
|
1045
|
+
op->disconnect_with_error =
|
1046
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown");
|
1047
|
+
}
|
1048
|
+
grpc_transport_perform_op(transport, op);
|
1049
|
+
}
|
1050
|
+
|
1051
|
+
Server::ChannelRegisteredMethod* Server::ChannelData::GetRegisteredMethod(
|
1052
|
+
const grpc_slice& host, const grpc_slice& path, bool is_idempotent) {
|
1053
|
+
if (registered_methods_ == nullptr) return nullptr;
|
1054
|
+
/* TODO(ctiller): unify these two searches */
|
1055
|
+
/* check for an exact match with host */
|
1056
|
+
uint32_t hash = GRPC_MDSTR_KV_HASH(grpc_slice_hash_internal(host),
|
1057
|
+
grpc_slice_hash_internal(path));
|
1058
|
+
for (size_t i = 0; i <= registered_method_max_probes_; i++) {
|
1059
|
+
ChannelRegisteredMethod* rm =
|
1060
|
+
&(*registered_methods_)[(hash + i) % registered_methods_->size()];
|
1061
|
+
if (rm->server_registered_method == nullptr) break;
|
1062
|
+
if (!rm->has_host) continue;
|
1063
|
+
if (rm->host != host) continue;
|
1064
|
+
if (rm->method != path) continue;
|
1065
|
+
if ((rm->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) &&
|
1066
|
+
!is_idempotent) {
|
1067
|
+
continue;
|
1065
1068
|
}
|
1069
|
+
return rm;
|
1070
|
+
}
|
1071
|
+
/* check for a wildcard method definition (no host set) */
|
1072
|
+
hash = GRPC_MDSTR_KV_HASH(0, grpc_slice_hash_internal(path));
|
1073
|
+
for (size_t i = 0; i <= registered_method_max_probes_; i++) {
|
1074
|
+
ChannelRegisteredMethod* rm =
|
1075
|
+
&(*registered_methods_)[(hash + i) % registered_methods_->size()];
|
1076
|
+
if (rm->server_registered_method == nullptr) break;
|
1077
|
+
if (rm->has_host) continue;
|
1078
|
+
if (rm->method != path) continue;
|
1079
|
+
if ((rm->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) &&
|
1080
|
+
!is_idempotent) {
|
1081
|
+
continue;
|
1082
|
+
}
|
1083
|
+
return rm;
|
1066
1084
|
}
|
1085
|
+
return nullptr;
|
1067
1086
|
}
|
1068
1087
|
|
1069
|
-
void
|
1070
|
-
|
1071
|
-
|
1088
|
+
void Server::ChannelData::AcceptStream(void* arg, grpc_transport* /*transport*/,
|
1089
|
+
const void* transport_server_data) {
|
1090
|
+
auto* chand = static_cast<Server::ChannelData*>(arg);
|
1072
1091
|
/* create a call */
|
1073
1092
|
grpc_call_create_args args;
|
1074
|
-
args.channel = chand->
|
1075
|
-
args.server = chand->
|
1093
|
+
args.channel = chand->channel_;
|
1094
|
+
args.server = chand->server_.get();
|
1076
1095
|
args.parent = nullptr;
|
1077
1096
|
args.propagation_mask = 0;
|
1078
1097
|
args.cq = nullptr;
|
@@ -1085,208 +1104,353 @@ void accept_stream(void* cd, grpc_transport* /*transport*/,
|
|
1085
1104
|
grpc_error* error = grpc_call_create(&args, &call);
|
1086
1105
|
grpc_call_element* elem =
|
1087
1106
|
grpc_call_stack_element(grpc_call_get_call_stack(call), 0);
|
1107
|
+
auto* calld = static_cast<Server::CallData*>(elem->call_data);
|
1088
1108
|
if (error != GRPC_ERROR_NONE) {
|
1089
|
-
got_initial_metadata(elem, error);
|
1090
1109
|
GRPC_ERROR_UNREF(error);
|
1110
|
+
calld->FailCallCreation();
|
1091
1111
|
return;
|
1092
1112
|
}
|
1093
|
-
|
1094
|
-
grpc_op op;
|
1095
|
-
op.op = GRPC_OP_RECV_INITIAL_METADATA;
|
1096
|
-
op.flags = 0;
|
1097
|
-
op.reserved = nullptr;
|
1098
|
-
op.data.recv_initial_metadata.recv_initial_metadata =
|
1099
|
-
&calld->initial_metadata;
|
1100
|
-
GRPC_CLOSURE_INIT(&calld->got_initial_metadata, got_initial_metadata, elem,
|
1101
|
-
grpc_schedule_on_exec_ctx);
|
1102
|
-
grpc_call_start_batch_and_execute(call, &op, 1, &calld->got_initial_metadata);
|
1113
|
+
calld->Start(elem);
|
1103
1114
|
}
|
1104
1115
|
|
1105
|
-
|
1106
|
-
|
1107
|
-
|
1108
|
-
|
1109
|
-
|
1110
|
-
return GRPC_ERROR_NONE;
|
1116
|
+
void Server::ChannelData::FinishDestroy(void* cd, grpc_error* /*error*/) {
|
1117
|
+
auto* chand = static_cast<Server::ChannelData*>(cd);
|
1118
|
+
Server* server = chand->server_.get();
|
1119
|
+
GRPC_CHANNEL_INTERNAL_UNREF(chand->channel_, "server");
|
1120
|
+
server->Unref();
|
1111
1121
|
}
|
1112
1122
|
|
1113
|
-
void
|
1114
|
-
|
1115
|
-
|
1116
|
-
|
1117
|
-
|
1118
|
-
|
1119
|
-
|
1123
|
+
void Server::ChannelData::Destroy() {
|
1124
|
+
if (!list_position_.has_value()) return;
|
1125
|
+
GPR_ASSERT(server_ != nullptr);
|
1126
|
+
server_->channels_.erase(*list_position_);
|
1127
|
+
list_position_.reset();
|
1128
|
+
server_->Ref().release();
|
1129
|
+
server_->MaybeFinishShutdown();
|
1130
|
+
GRPC_CLOSURE_INIT(&finish_destroy_channel_closure_, FinishDestroy, this,
|
1131
|
+
grpc_schedule_on_exec_ctx);
|
1132
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_server_channel_trace)) {
|
1133
|
+
gpr_log(GPR_INFO, "Disconnected client");
|
1134
|
+
}
|
1135
|
+
grpc_transport_op* op =
|
1136
|
+
grpc_make_transport_op(&finish_destroy_channel_closure_);
|
1137
|
+
op->set_accept_stream = true;
|
1138
|
+
grpc_channel_next_op(
|
1139
|
+
grpc_channel_stack_element(grpc_channel_get_channel_stack(channel_), 0),
|
1140
|
+
op);
|
1120
1141
|
}
|
1121
1142
|
|
1122
|
-
grpc_error*
|
1123
|
-
|
1124
|
-
channel_data* chand = static_cast<channel_data*>(elem->channel_data);
|
1143
|
+
grpc_error* Server::ChannelData::InitChannelElement(
|
1144
|
+
grpc_channel_element* elem, grpc_channel_element_args* args) {
|
1125
1145
|
GPR_ASSERT(args->is_first);
|
1126
1146
|
GPR_ASSERT(!args->is_last);
|
1127
|
-
|
1128
|
-
chand->channel = nullptr;
|
1129
|
-
chand->next = chand->prev = chand;
|
1130
|
-
chand->registered_methods = nullptr;
|
1147
|
+
new (elem->channel_data) ChannelData();
|
1131
1148
|
return GRPC_ERROR_NONE;
|
1132
1149
|
}
|
1133
1150
|
|
1134
|
-
void
|
1135
|
-
|
1136
|
-
|
1137
|
-
if (chand->registered_methods) {
|
1138
|
-
for (i = 0; i < chand->registered_method_slots; i++) {
|
1139
|
-
grpc_slice_unref_internal(chand->registered_methods[i].method);
|
1140
|
-
GPR_DEBUG_ASSERT(chand->registered_methods[i].method.refcount ==
|
1141
|
-
&grpc_core::kNoopRefcount ||
|
1142
|
-
chand->registered_methods[i].method.refcount == nullptr);
|
1143
|
-
if (chand->registered_methods[i].has_host) {
|
1144
|
-
grpc_slice_unref_internal(chand->registered_methods[i].host);
|
1145
|
-
GPR_DEBUG_ASSERT(chand->registered_methods[i].host.refcount ==
|
1146
|
-
&grpc_core::kNoopRefcount ||
|
1147
|
-
chand->registered_methods[i].host.refcount == nullptr);
|
1148
|
-
}
|
1149
|
-
}
|
1150
|
-
gpr_free(chand->registered_methods);
|
1151
|
-
}
|
1152
|
-
if (chand->server) {
|
1153
|
-
if (chand->server->channelz_server != nullptr &&
|
1154
|
-
chand->channelz_socket_uuid != 0) {
|
1155
|
-
chand->server->channelz_server->RemoveChildSocket(
|
1156
|
-
chand->channelz_socket_uuid);
|
1157
|
-
}
|
1158
|
-
gpr_mu_lock(&chand->server->mu_global);
|
1159
|
-
chand->next->prev = chand->prev;
|
1160
|
-
chand->prev->next = chand->next;
|
1161
|
-
chand->next = chand->prev = chand;
|
1162
|
-
maybe_finish_shutdown(chand->server);
|
1163
|
-
gpr_mu_unlock(&chand->server->mu_global);
|
1164
|
-
server_unref(chand->server);
|
1165
|
-
}
|
1151
|
+
void Server::ChannelData::DestroyChannelElement(grpc_channel_element* elem) {
|
1152
|
+
auto* chand = static_cast<ChannelData*>(elem->channel_data);
|
1153
|
+
chand->~ChannelData();
|
1166
1154
|
}
|
1167
1155
|
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
1171
|
-
|
1172
|
-
|
1173
|
-
|
1156
|
+
//
|
1157
|
+
// Server::CallData
|
1158
|
+
//
|
1159
|
+
|
1160
|
+
Server::CallData::CallData(grpc_call_element* elem,
|
1161
|
+
const grpc_call_element_args& args,
|
1162
|
+
RefCountedPtr<Server> server)
|
1163
|
+
: server_(std::move(server)),
|
1164
|
+
call_(grpc_call_from_top_element(elem)),
|
1165
|
+
call_combiner_(args.call_combiner) {
|
1166
|
+
GRPC_CLOSURE_INIT(&recv_initial_metadata_ready_, RecvInitialMetadataReady,
|
1167
|
+
elem, grpc_schedule_on_exec_ctx);
|
1168
|
+
GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_, RecvTrailingMetadataReady,
|
1169
|
+
elem, grpc_schedule_on_exec_ctx);
|
1170
|
+
}
|
1171
|
+
|
1172
|
+
Server::CallData::~CallData() {
|
1173
|
+
GPR_ASSERT(state_.Load(MemoryOrder::RELAXED) != CallState::PENDING);
|
1174
|
+
GRPC_ERROR_UNREF(recv_initial_metadata_error_);
|
1175
|
+
if (host_.has_value()) {
|
1176
|
+
grpc_slice_unref_internal(*host_);
|
1177
|
+
}
|
1178
|
+
if (path_.has_value()) {
|
1179
|
+
grpc_slice_unref_internal(*path_);
|
1174
1180
|
}
|
1181
|
+
grpc_metadata_array_destroy(&initial_metadata_);
|
1182
|
+
grpc_byte_buffer_destroy(payload_);
|
1183
|
+
}
|
1175
1184
|
|
1176
|
-
|
1177
|
-
|
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;
|
1185
|
+
void Server::CallData::SetState(CallState state) {
|
1186
|
+
state_.Store(state, MemoryOrder::RELAXED);
|
1181
1187
|
}
|
1182
1188
|
|
1183
|
-
bool
|
1184
|
-
|
1185
|
-
|
1189
|
+
bool Server::CallData::MaybeActivate() {
|
1190
|
+
CallState expected = CallState::PENDING;
|
1191
|
+
return state_.CompareExchangeStrong(&expected, CallState::ACTIVATED,
|
1192
|
+
MemoryOrder::ACQ_REL,
|
1193
|
+
MemoryOrder::RELAXED);
|
1186
1194
|
}
|
1187
1195
|
|
1188
|
-
|
1189
|
-
|
1190
|
-
|
1191
|
-
|
1192
|
-
|
1196
|
+
void Server::CallData::FailCallCreation() {
|
1197
|
+
CallState expected_not_started = CallState::NOT_STARTED;
|
1198
|
+
CallState expected_pending = CallState::PENDING;
|
1199
|
+
if (state_.CompareExchangeStrong(&expected_not_started, CallState::ZOMBIED,
|
1200
|
+
MemoryOrder::ACQ_REL,
|
1201
|
+
MemoryOrder::ACQUIRE)) {
|
1202
|
+
KillZombie();
|
1203
|
+
} else if (state_.CompareExchangeStrong(&expected_pending, CallState::ZOMBIED,
|
1204
|
+
MemoryOrder::ACQ_REL,
|
1205
|
+
MemoryOrder::RELAXED)) {
|
1206
|
+
// Zombied call will be destroyed when it's removed from the pending
|
1207
|
+
// queue... later.
|
1193
1208
|
}
|
1209
|
+
}
|
1194
1210
|
|
1195
|
-
|
1196
|
-
|
1211
|
+
void Server::CallData::Start(grpc_call_element* elem) {
|
1212
|
+
grpc_op op;
|
1213
|
+
op.op = GRPC_OP_RECV_INITIAL_METADATA;
|
1214
|
+
op.flags = 0;
|
1215
|
+
op.reserved = nullptr;
|
1216
|
+
op.data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_;
|
1217
|
+
GRPC_CLOSURE_INIT(&recv_initial_metadata_batch_complete_,
|
1218
|
+
RecvInitialMetadataBatchComplete, elem,
|
1219
|
+
grpc_schedule_on_exec_ctx);
|
1220
|
+
grpc_call_start_batch_and_execute(call_, &op, 1,
|
1221
|
+
&recv_initial_metadata_batch_complete_);
|
1222
|
+
}
|
1223
|
+
|
1224
|
+
void Server::CallData::Publish(size_t cq_idx, RequestedCall* rc) {
|
1225
|
+
grpc_call_set_completion_queue(call_, rc->cq_bound_to_call);
|
1226
|
+
*rc->call = call_;
|
1227
|
+
cq_new_ = server_->cqs_[cq_idx];
|
1228
|
+
GPR_SWAP(grpc_metadata_array, *rc->initial_metadata, initial_metadata_);
|
1229
|
+
switch (rc->type) {
|
1230
|
+
case RequestedCall::Type::BATCH_CALL:
|
1231
|
+
GPR_ASSERT(host_.has_value());
|
1232
|
+
GPR_ASSERT(path_.has_value());
|
1233
|
+
rc->data.batch.details->host = grpc_slice_ref_internal(*host_);
|
1234
|
+
rc->data.batch.details->method = grpc_slice_ref_internal(*path_);
|
1235
|
+
rc->data.batch.details->deadline =
|
1236
|
+
grpc_millis_to_timespec(deadline_, GPR_CLOCK_MONOTONIC);
|
1237
|
+
rc->data.batch.details->flags = recv_initial_metadata_flags_;
|
1238
|
+
break;
|
1239
|
+
case RequestedCall::Type::REGISTERED_CALL:
|
1240
|
+
*rc->data.registered.deadline =
|
1241
|
+
grpc_millis_to_timespec(deadline_, GPR_CLOCK_MONOTONIC);
|
1242
|
+
if (rc->data.registered.optional_payload != nullptr) {
|
1243
|
+
*rc->data.registered.optional_payload = payload_;
|
1244
|
+
payload_ = nullptr;
|
1245
|
+
}
|
1246
|
+
break;
|
1247
|
+
default:
|
1248
|
+
GPR_UNREACHABLE_CODE(return );
|
1197
1249
|
}
|
1250
|
+
grpc_cq_end_op(cq_new_, rc->tag, GRPC_ERROR_NONE, Server::DoneRequestEvent,
|
1251
|
+
rc, &rc->completion, true);
|
1252
|
+
}
|
1198
1253
|
|
1199
|
-
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1203
|
-
|
1204
|
-
|
1205
|
-
|
1206
|
-
|
1207
|
-
|
1254
|
+
void Server::CallData::PublishNewRpc(void* arg, grpc_error* error) {
|
1255
|
+
grpc_call_element* call_elem = static_cast<grpc_call_element*>(arg);
|
1256
|
+
auto* calld = static_cast<Server::CallData*>(call_elem->call_data);
|
1257
|
+
auto* chand = static_cast<Server::ChannelData*>(call_elem->channel_data);
|
1258
|
+
RequestMatcherInterface* rm = calld->matcher_;
|
1259
|
+
Server* server = rm->server();
|
1260
|
+
if (error != GRPC_ERROR_NONE ||
|
1261
|
+
server->shutdown_flag_.load(std::memory_order_acquire)) {
|
1262
|
+
calld->state_.Store(CallState::ZOMBIED, MemoryOrder::RELAXED);
|
1263
|
+
calld->KillZombie();
|
1264
|
+
return;
|
1208
1265
|
}
|
1266
|
+
rm->MatchOrQueue(chand->cq_idx(), calld);
|
1267
|
+
}
|
1209
1268
|
|
1210
|
-
|
1211
|
-
};
|
1269
|
+
namespace {
|
1212
1270
|
|
1213
|
-
void
|
1214
|
-
(
|
1215
|
-
gpr_free(storage);
|
1271
|
+
void KillZombieClosure(void* call, grpc_error* /*error*/) {
|
1272
|
+
grpc_call_unref(static_cast<grpc_call*>(call));
|
1216
1273
|
}
|
1217
1274
|
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1221
|
-
|
1222
|
-
|
1223
|
-
|
1275
|
+
} // namespace
|
1276
|
+
|
1277
|
+
void Server::CallData::KillZombie() {
|
1278
|
+
GRPC_CLOSURE_INIT(&kill_zombie_closure_, KillZombieClosure, call_,
|
1279
|
+
grpc_schedule_on_exec_ctx);
|
1280
|
+
ExecCtx::Run(DEBUG_LOCATION, &kill_zombie_closure_, GRPC_ERROR_NONE);
|
1224
1281
|
}
|
1225
1282
|
|
1226
|
-
|
1227
|
-
|
1228
|
-
if (
|
1229
|
-
|
1230
|
-
|
1231
|
-
return
|
1283
|
+
void Server::CallData::StartNewRpc(grpc_call_element* elem) {
|
1284
|
+
auto* chand = static_cast<ChannelData*>(elem->channel_data);
|
1285
|
+
if (server_->shutdown_flag_.load(std::memory_order_acquire)) {
|
1286
|
+
state_.Store(CallState::ZOMBIED, MemoryOrder::RELAXED);
|
1287
|
+
KillZombie();
|
1288
|
+
return;
|
1232
1289
|
}
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1236
|
-
|
1290
|
+
// Find request matcher.
|
1291
|
+
matcher_ = server_->unregistered_request_matcher_.get();
|
1292
|
+
grpc_server_register_method_payload_handling payload_handling =
|
1293
|
+
GRPC_SRM_PAYLOAD_NONE;
|
1294
|
+
if (path_.has_value() && host_.has_value()) {
|
1295
|
+
ChannelRegisteredMethod* rm =
|
1296
|
+
chand->GetRegisteredMethod(*host_, *path_,
|
1297
|
+
(recv_initial_metadata_flags_ &
|
1298
|
+
GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST));
|
1299
|
+
if (rm != nullptr) {
|
1300
|
+
matcher_ = rm->server_registered_method->matcher.get();
|
1301
|
+
payload_handling = rm->server_registered_method->payload_handling;
|
1302
|
+
}
|
1303
|
+
}
|
1304
|
+
// Start recv_message op if needed.
|
1305
|
+
switch (payload_handling) {
|
1306
|
+
case GRPC_SRM_PAYLOAD_NONE:
|
1307
|
+
PublishNewRpc(elem, GRPC_ERROR_NONE);
|
1237
1308
|
break;
|
1238
|
-
case
|
1239
|
-
|
1309
|
+
case GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER: {
|
1310
|
+
grpc_op op;
|
1311
|
+
op.op = GRPC_OP_RECV_MESSAGE;
|
1312
|
+
op.flags = 0;
|
1313
|
+
op.reserved = nullptr;
|
1314
|
+
op.data.recv_message.recv_message = &payload_;
|
1315
|
+
GRPC_CLOSURE_INIT(&publish_, PublishNewRpc, elem,
|
1316
|
+
grpc_schedule_on_exec_ctx);
|
1317
|
+
grpc_call_start_batch_and_execute(call_, &op, 1, &publish_);
|
1240
1318
|
break;
|
1319
|
+
}
|
1241
1320
|
}
|
1242
|
-
rm->RequestCallWithPossiblePublish(cq_idx, rc);
|
1243
|
-
return GRPC_CALL_OK;
|
1244
1321
|
}
|
1245
1322
|
|
1246
|
-
void
|
1247
|
-
|
1248
|
-
*
|
1249
|
-
|
1250
|
-
|
1323
|
+
void Server::CallData::RecvInitialMetadataBatchComplete(void* arg,
|
1324
|
+
grpc_error* error) {
|
1325
|
+
grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
|
1326
|
+
auto* calld = static_cast<Server::CallData*>(elem->call_data);
|
1327
|
+
if (error != GRPC_ERROR_NONE) {
|
1328
|
+
calld->FailCallCreation();
|
1329
|
+
return;
|
1330
|
+
}
|
1331
|
+
calld->StartNewRpc(elem);
|
1332
|
+
}
|
1251
1333
|
|
1252
|
-
|
1253
|
-
|
1334
|
+
void Server::CallData::StartTransportStreamOpBatchImpl(
|
1335
|
+
grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
|
1336
|
+
if (batch->recv_initial_metadata) {
|
1337
|
+
GPR_ASSERT(batch->payload->recv_initial_metadata.recv_flags == nullptr);
|
1338
|
+
recv_initial_metadata_ =
|
1339
|
+
batch->payload->recv_initial_metadata.recv_initial_metadata;
|
1340
|
+
original_recv_initial_metadata_ready_ =
|
1341
|
+
batch->payload->recv_initial_metadata.recv_initial_metadata_ready;
|
1342
|
+
batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
|
1343
|
+
&recv_initial_metadata_ready_;
|
1344
|
+
batch->payload->recv_initial_metadata.recv_flags =
|
1345
|
+
&recv_initial_metadata_flags_;
|
1346
|
+
}
|
1347
|
+
if (batch->recv_trailing_metadata) {
|
1348
|
+
original_recv_trailing_metadata_ready_ =
|
1349
|
+
batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready;
|
1350
|
+
batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
|
1351
|
+
&recv_trailing_metadata_ready_;
|
1352
|
+
}
|
1353
|
+
grpc_call_next_op(elem, batch);
|
1254
1354
|
}
|
1255
|
-
} // namespace
|
1256
1355
|
|
1257
|
-
|
1356
|
+
void Server::CallData::RecvInitialMetadataReady(void* ptr, grpc_error* error) {
|
1357
|
+
grpc_call_element* elem = static_cast<grpc_call_element*>(ptr);
|
1358
|
+
CallData* calld = static_cast<CallData*>(elem->call_data);
|
1359
|
+
grpc_millis op_deadline;
|
1360
|
+
if (error == GRPC_ERROR_NONE) {
|
1361
|
+
GPR_DEBUG_ASSERT(calld->recv_initial_metadata_->idx.named.path != nullptr);
|
1362
|
+
GPR_DEBUG_ASSERT(calld->recv_initial_metadata_->idx.named.authority !=
|
1363
|
+
nullptr);
|
1364
|
+
calld->path_.emplace(grpc_slice_ref_internal(
|
1365
|
+
GRPC_MDVALUE(calld->recv_initial_metadata_->idx.named.path->md)));
|
1366
|
+
calld->host_.emplace(grpc_slice_ref_internal(
|
1367
|
+
GRPC_MDVALUE(calld->recv_initial_metadata_->idx.named.authority->md)));
|
1368
|
+
grpc_metadata_batch_remove(calld->recv_initial_metadata_, GRPC_BATCH_PATH);
|
1369
|
+
grpc_metadata_batch_remove(calld->recv_initial_metadata_,
|
1370
|
+
GRPC_BATCH_AUTHORITY);
|
1371
|
+
} else {
|
1372
|
+
GRPC_ERROR_REF(error);
|
1373
|
+
}
|
1374
|
+
op_deadline = calld->recv_initial_metadata_->deadline;
|
1375
|
+
if (op_deadline != GRPC_MILLIS_INF_FUTURE) {
|
1376
|
+
calld->deadline_ = op_deadline;
|
1377
|
+
}
|
1378
|
+
if (calld->host_.has_value() && calld->path_.has_value()) {
|
1379
|
+
/* do nothing */
|
1380
|
+
} else {
|
1381
|
+
/* Pass the error reference to calld->recv_initial_metadata_error */
|
1382
|
+
grpc_error* src_error = error;
|
1383
|
+
error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
|
1384
|
+
"Missing :authority or :path", &src_error, 1);
|
1385
|
+
GRPC_ERROR_UNREF(src_error);
|
1386
|
+
calld->recv_initial_metadata_error_ = GRPC_ERROR_REF(error);
|
1387
|
+
}
|
1388
|
+
grpc_closure* closure = calld->original_recv_initial_metadata_ready_;
|
1389
|
+
calld->original_recv_initial_metadata_ready_ = nullptr;
|
1390
|
+
if (calld->seen_recv_trailing_metadata_ready_) {
|
1391
|
+
GRPC_CALL_COMBINER_START(calld->call_combiner_,
|
1392
|
+
&calld->recv_trailing_metadata_ready_,
|
1393
|
+
calld->recv_trailing_metadata_error_,
|
1394
|
+
"continue server recv_trailing_metadata_ready");
|
1395
|
+
}
|
1396
|
+
Closure::Run(DEBUG_LOCATION, closure, error);
|
1397
|
+
}
|
1258
1398
|
|
1259
|
-
void
|
1260
|
-
|
1261
|
-
|
1262
|
-
|
1263
|
-
|
1264
|
-
|
1399
|
+
void Server::CallData::RecvTrailingMetadataReady(void* user_data,
|
1400
|
+
grpc_error* error) {
|
1401
|
+
grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
|
1402
|
+
CallData* calld = static_cast<CallData*>(elem->call_data);
|
1403
|
+
if (calld->original_recv_initial_metadata_ready_ != nullptr) {
|
1404
|
+
calld->recv_trailing_metadata_error_ = GRPC_ERROR_REF(error);
|
1405
|
+
calld->seen_recv_trailing_metadata_ready_ = true;
|
1406
|
+
GRPC_CLOSURE_INIT(&calld->recv_trailing_metadata_ready_,
|
1407
|
+
RecvTrailingMetadataReady, elem,
|
1408
|
+
grpc_schedule_on_exec_ctx);
|
1409
|
+
GRPC_CALL_COMBINER_STOP(calld->call_combiner_,
|
1410
|
+
"deferring server recv_trailing_metadata_ready "
|
1411
|
+
"until after recv_initial_metadata_ready");
|
1412
|
+
return;
|
1413
|
+
}
|
1414
|
+
error =
|
1415
|
+
grpc_error_add_child(GRPC_ERROR_REF(error),
|
1416
|
+
GRPC_ERROR_REF(calld->recv_initial_metadata_error_));
|
1417
|
+
Closure::Run(DEBUG_LOCATION, calld->original_recv_trailing_metadata_ready_,
|
1418
|
+
error);
|
1265
1419
|
}
|
1266
1420
|
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
-
|
1271
|
-
|
1272
|
-
new AllocatingRequestMatcherBatch(server, cq, std::move(allocator));
|
1421
|
+
grpc_error* Server::CallData::InitCallElement(
|
1422
|
+
grpc_call_element* elem, const grpc_call_element_args* args) {
|
1423
|
+
auto* chand = static_cast<ChannelData*>(elem->channel_data);
|
1424
|
+
new (elem->call_data) Server::CallData(elem, *args, chand->server());
|
1425
|
+
return GRPC_ERROR_NONE;
|
1273
1426
|
}
|
1274
1427
|
|
1275
|
-
|
1428
|
+
void Server::CallData::DestroyCallElement(
|
1429
|
+
grpc_call_element* elem, const grpc_call_final_info* /*final_info*/,
|
1430
|
+
grpc_closure* /*ignored*/) {
|
1431
|
+
auto* calld = static_cast<CallData*>(elem->call_data);
|
1432
|
+
calld->~CallData();
|
1433
|
+
}
|
1276
1434
|
|
1277
|
-
|
1278
|
-
|
1279
|
-
|
1280
|
-
|
1281
|
-
|
1282
|
-
|
1283
|
-
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
1435
|
+
void Server::CallData::StartTransportStreamOpBatch(
|
1436
|
+
grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
|
1437
|
+
auto* calld = static_cast<CallData*>(elem->call_data);
|
1438
|
+
calld->StartTransportStreamOpBatchImpl(elem, batch);
|
1439
|
+
}
|
1440
|
+
|
1441
|
+
} // namespace grpc_core
|
1442
|
+
|
1443
|
+
//
|
1444
|
+
// C-core API
|
1445
|
+
//
|
1446
|
+
|
1447
|
+
grpc_server* grpc_server_create(const grpc_channel_args* args, void* reserved) {
|
1448
|
+
grpc_core::ExecCtx exec_ctx;
|
1449
|
+
GRPC_API_TRACE("grpc_server_create(%p, %p)", 2, (args, reserved));
|
1450
|
+
grpc_server* c_server = new grpc_server;
|
1451
|
+
c_server->core_server = grpc_core::MakeOrphanable<grpc_core::Server>(args);
|
1452
|
+
return c_server;
|
1453
|
+
}
|
1290
1454
|
|
1291
1455
|
void grpc_server_register_completion_queue(grpc_server* server,
|
1292
1456
|
grpc_completion_queue* cq,
|
@@ -1294,7 +1458,7 @@ void grpc_server_register_completion_queue(grpc_server* server,
|
|
1294
1458
|
GRPC_API_TRACE(
|
1295
1459
|
"grpc_server_register_completion_queue(server=%p, cq=%p, reserved=%p)", 3,
|
1296
1460
|
(server, cq, reserved));
|
1297
|
-
|
1461
|
+
GPR_ASSERT(!reserved);
|
1298
1462
|
auto cq_type = grpc_get_cq_completion_type(cq);
|
1299
1463
|
if (cq_type != GRPC_CQ_NEXT && cq_type != GRPC_CQ_CALLBACK) {
|
1300
1464
|
gpr_log(GPR_INFO,
|
@@ -1304,421 +1468,53 @@ void grpc_server_register_completion_queue(grpc_server* server,
|
|
1304
1468
|
/* Ideally we should log an error and abort but ruby-wrapped-language API
|
1305
1469
|
calls grpc_completion_queue_pluck() on server completion queues */
|
1306
1470
|
}
|
1307
|
-
|
1308
|
-
register_completion_queue(server, cq, reserved);
|
1309
|
-
}
|
1310
|
-
|
1311
|
-
grpc_server* grpc_server_create(const grpc_channel_args* args, void* reserved) {
|
1312
|
-
grpc_core::ExecCtx exec_ctx;
|
1313
|
-
GRPC_API_TRACE("grpc_server_create(%p, %p)", 2, (args, reserved));
|
1314
|
-
|
1315
|
-
grpc_server* server =
|
1316
|
-
static_cast<grpc_server*>(gpr_zalloc(sizeof(grpc_server)));
|
1317
|
-
|
1318
|
-
gpr_mu_init(&server->mu_global);
|
1319
|
-
gpr_mu_init(&server->mu_call);
|
1320
|
-
gpr_cv_init(&server->starting_cv);
|
1321
|
-
|
1322
|
-
/* decremented by grpc_server_destroy */
|
1323
|
-
new (&server->internal_refcount) grpc_core::RefCount();
|
1324
|
-
server->root_channel_data.next = server->root_channel_data.prev =
|
1325
|
-
&server->root_channel_data;
|
1326
|
-
|
1327
|
-
server->channel_args = grpc_channel_args_copy(args);
|
1328
|
-
|
1329
|
-
const grpc_arg* arg = grpc_channel_args_find(args, GRPC_ARG_ENABLE_CHANNELZ);
|
1330
|
-
if (grpc_channel_arg_get_bool(arg, GRPC_ENABLE_CHANNELZ_DEFAULT)) {
|
1331
|
-
arg = grpc_channel_args_find(
|
1332
|
-
args, GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE);
|
1333
|
-
size_t channel_tracer_max_memory = grpc_channel_arg_get_integer(
|
1334
|
-
arg,
|
1335
|
-
{GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT, 0, INT_MAX});
|
1336
|
-
server->channelz_server =
|
1337
|
-
grpc_core::MakeRefCounted<grpc_core::channelz::ServerNode>(
|
1338
|
-
server, channel_tracer_max_memory);
|
1339
|
-
server->channelz_server->AddTraceEvent(
|
1340
|
-
grpc_core::channelz::ChannelTrace::Severity::Info,
|
1341
|
-
grpc_slice_from_static_string("Server created"));
|
1342
|
-
}
|
1343
|
-
|
1344
|
-
if (args != nullptr) {
|
1345
|
-
grpc_resource_quota* resource_quota =
|
1346
|
-
grpc_resource_quota_from_channel_args(args, false /* create */);
|
1347
|
-
if (resource_quota != nullptr) {
|
1348
|
-
server->default_resource_user =
|
1349
|
-
grpc_resource_user_create(resource_quota, "default");
|
1350
|
-
}
|
1351
|
-
}
|
1352
|
-
|
1353
|
-
return server;
|
1471
|
+
server->core_server->RegisterCompletionQueue(cq);
|
1354
1472
|
}
|
1355
1473
|
|
1356
1474
|
void* grpc_server_register_method(
|
1357
1475
|
grpc_server* server, const char* method, const char* host,
|
1358
1476
|
grpc_server_register_method_payload_handling payload_handling,
|
1359
1477
|
uint32_t flags) {
|
1360
|
-
registered_method* m;
|
1361
1478
|
GRPC_API_TRACE(
|
1362
1479
|
"grpc_server_register_method(server=%p, method=%s, host=%s, "
|
1363
1480
|
"flags=0x%08x)",
|
1364
1481
|
4, (server, method, host, flags));
|
1365
|
-
|
1366
|
-
|
1367
|
-
"grpc_server_register_method method string cannot be NULL");
|
1368
|
-
return nullptr;
|
1369
|
-
}
|
1370
|
-
for (m = server->registered_methods; m; m = m->next) {
|
1371
|
-
if (streq(m->method, method) && streq(m->host, host)) {
|
1372
|
-
gpr_log(GPR_ERROR, "duplicate registration for %s@%s", method,
|
1373
|
-
host ? host : "*");
|
1374
|
-
return nullptr;
|
1375
|
-
}
|
1376
|
-
}
|
1377
|
-
if ((flags & ~GRPC_INITIAL_METADATA_USED_MASK) != 0) {
|
1378
|
-
gpr_log(GPR_ERROR, "grpc_server_register_method invalid flags 0x%08x",
|
1379
|
-
flags);
|
1380
|
-
return nullptr;
|
1381
|
-
}
|
1382
|
-
m = new registered_method(method, host, payload_handling, flags);
|
1383
|
-
m->next = server->registered_methods;
|
1384
|
-
server->registered_methods = m;
|
1385
|
-
return m;
|
1482
|
+
return server->core_server->RegisterMethod(method, host, payload_handling,
|
1483
|
+
flags);
|
1386
1484
|
}
|
1387
1485
|
|
1388
1486
|
void grpc_server_start(grpc_server* server) {
|
1389
|
-
size_t i;
|
1390
1487
|
grpc_core::ExecCtx exec_ctx;
|
1391
|
-
|
1392
1488
|
GRPC_API_TRACE("grpc_server_start(server=%p)", 1, (server));
|
1393
|
-
|
1394
|
-
server->started = true;
|
1395
|
-
server->pollset_count = 0;
|
1396
|
-
server->pollsets = static_cast<grpc_pollset**>(
|
1397
|
-
gpr_malloc(sizeof(grpc_pollset*) * server->cq_count));
|
1398
|
-
for (i = 0; i < server->cq_count; i++) {
|
1399
|
-
if (grpc_cq_can_listen(server->cqs[i])) {
|
1400
|
-
server->pollsets[server->pollset_count++] =
|
1401
|
-
grpc_cq_pollset(server->cqs[i]);
|
1402
|
-
}
|
1403
|
-
}
|
1404
|
-
if (server->unregistered_request_matcher == nullptr) {
|
1405
|
-
server->unregistered_request_matcher = new RealRequestMatcher(server);
|
1406
|
-
}
|
1407
|
-
for (registered_method* rm = server->registered_methods; rm; rm = rm->next) {
|
1408
|
-
if (rm->matcher == nullptr) {
|
1409
|
-
rm->matcher.reset(new RealRequestMatcher(server));
|
1410
|
-
}
|
1411
|
-
}
|
1412
|
-
|
1413
|
-
gpr_mu_lock(&server->mu_global);
|
1414
|
-
server->starting = true;
|
1415
|
-
gpr_mu_unlock(&server->mu_global);
|
1416
|
-
|
1417
|
-
for (listener* l = server->listeners; l; l = l->next) {
|
1418
|
-
l->start(server, l->arg, server->pollsets, server->pollset_count);
|
1419
|
-
}
|
1420
|
-
|
1421
|
-
gpr_mu_lock(&server->mu_global);
|
1422
|
-
server->starting = false;
|
1423
|
-
gpr_cv_signal(&server->starting_cv);
|
1424
|
-
gpr_mu_unlock(&server->mu_global);
|
1425
|
-
}
|
1426
|
-
|
1427
|
-
void grpc_server_get_pollsets(grpc_server* server, grpc_pollset*** pollsets,
|
1428
|
-
size_t* pollset_count) {
|
1429
|
-
*pollset_count = server->pollset_count;
|
1430
|
-
*pollsets = server->pollsets;
|
1431
|
-
}
|
1432
|
-
|
1433
|
-
void grpc_server_setup_transport(
|
1434
|
-
grpc_server* s, grpc_transport* transport, grpc_pollset* accepting_pollset,
|
1435
|
-
const grpc_channel_args* args,
|
1436
|
-
const grpc_core::RefCountedPtr<grpc_core::channelz::SocketNode>&
|
1437
|
-
socket_node,
|
1438
|
-
grpc_resource_user* resource_user) {
|
1439
|
-
size_t num_registered_methods;
|
1440
|
-
size_t alloc;
|
1441
|
-
registered_method* rm;
|
1442
|
-
channel_registered_method* crm;
|
1443
|
-
grpc_channel* channel;
|
1444
|
-
channel_data* chand;
|
1445
|
-
uint32_t hash;
|
1446
|
-
size_t slots;
|
1447
|
-
uint32_t probes;
|
1448
|
-
uint32_t max_probes = 0;
|
1449
|
-
grpc_transport_op* op = nullptr;
|
1450
|
-
|
1451
|
-
channel = grpc_channel_create(nullptr, args, GRPC_SERVER_CHANNEL, transport,
|
1452
|
-
resource_user);
|
1453
|
-
chand = static_cast<channel_data*>(
|
1454
|
-
grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0)
|
1455
|
-
->channel_data);
|
1456
|
-
chand->server = s;
|
1457
|
-
server_ref(s);
|
1458
|
-
chand->channel = channel;
|
1459
|
-
if (socket_node != nullptr) {
|
1460
|
-
chand->channelz_socket_uuid = socket_node->uuid();
|
1461
|
-
s->channelz_server->AddChildSocket(socket_node);
|
1462
|
-
} else {
|
1463
|
-
chand->channelz_socket_uuid = 0;
|
1464
|
-
}
|
1465
|
-
|
1466
|
-
size_t cq_idx;
|
1467
|
-
for (cq_idx = 0; cq_idx < s->cq_count; cq_idx++) {
|
1468
|
-
if (grpc_cq_pollset(s->cqs[cq_idx]) == accepting_pollset) break;
|
1469
|
-
}
|
1470
|
-
if (cq_idx == s->cq_count) {
|
1471
|
-
/* completion queue not found: pick a random one to publish new calls to */
|
1472
|
-
cq_idx = static_cast<size_t>(rand()) % s->cq_count;
|
1473
|
-
}
|
1474
|
-
chand->cq_idx = cq_idx;
|
1475
|
-
|
1476
|
-
num_registered_methods = 0;
|
1477
|
-
for (rm = s->registered_methods; rm; rm = rm->next) {
|
1478
|
-
num_registered_methods++;
|
1479
|
-
}
|
1480
|
-
/* build a lookup table phrased in terms of mdstr's in this channels context
|
1481
|
-
to quickly find registered methods */
|
1482
|
-
if (num_registered_methods > 0) {
|
1483
|
-
slots = 2 * num_registered_methods;
|
1484
|
-
alloc = sizeof(channel_registered_method) * slots;
|
1485
|
-
chand->registered_methods =
|
1486
|
-
static_cast<channel_registered_method*>(gpr_zalloc(alloc));
|
1487
|
-
for (rm = s->registered_methods; rm; rm = rm->next) {
|
1488
|
-
grpc_core::ExternallyManagedSlice host;
|
1489
|
-
grpc_core::ExternallyManagedSlice method(rm->method.c_str());
|
1490
|
-
const bool has_host = !rm->host.empty();
|
1491
|
-
if (has_host) {
|
1492
|
-
host = grpc_core::ExternallyManagedSlice(rm->host.c_str());
|
1493
|
-
}
|
1494
|
-
hash = GRPC_MDSTR_KV_HASH(has_host ? host.Hash() : 0, method.Hash());
|
1495
|
-
for (probes = 0; chand->registered_methods[(hash + probes) % slots]
|
1496
|
-
.server_registered_method != nullptr;
|
1497
|
-
probes++)
|
1498
|
-
;
|
1499
|
-
if (probes > max_probes) max_probes = probes;
|
1500
|
-
crm = &chand->registered_methods[(hash + probes) % slots];
|
1501
|
-
crm->server_registered_method = rm;
|
1502
|
-
crm->flags = rm->flags;
|
1503
|
-
crm->has_host = has_host;
|
1504
|
-
if (has_host) {
|
1505
|
-
crm->host = host;
|
1506
|
-
}
|
1507
|
-
crm->method = method;
|
1508
|
-
}
|
1509
|
-
GPR_ASSERT(slots <= UINT32_MAX);
|
1510
|
-
chand->registered_method_slots = static_cast<uint32_t>(slots);
|
1511
|
-
chand->registered_method_max_probes = max_probes;
|
1512
|
-
}
|
1513
|
-
|
1514
|
-
gpr_mu_lock(&s->mu_global);
|
1515
|
-
chand->next = &s->root_channel_data;
|
1516
|
-
chand->prev = chand->next->prev;
|
1517
|
-
chand->next->prev = chand->prev->next = chand;
|
1518
|
-
gpr_mu_unlock(&s->mu_global);
|
1519
|
-
|
1520
|
-
op = grpc_make_transport_op(nullptr);
|
1521
|
-
op->set_accept_stream = true;
|
1522
|
-
op->set_accept_stream_fn = accept_stream;
|
1523
|
-
op->set_accept_stream_user_data = chand;
|
1524
|
-
op->start_connectivity_watch.reset(new ConnectivityWatcher(chand));
|
1525
|
-
if (gpr_atm_acq_load(&s->shutdown_flag) != 0) {
|
1526
|
-
op->disconnect_with_error =
|
1527
|
-
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown");
|
1528
|
-
}
|
1529
|
-
grpc_transport_perform_op(transport, op);
|
1489
|
+
server->core_server->Start();
|
1530
1490
|
}
|
1531
1491
|
|
1532
|
-
/*
|
1533
|
-
- Kills all pending requests-for-incoming-RPC-calls (i.e the requests made via
|
1534
|
-
grpc_server_request_call and grpc_server_request_registered call will now be
|
1535
|
-
cancelled). See 'kill_pending_work_locked()'
|
1536
|
-
|
1537
|
-
- Shuts down the listeners (i.e the server will no longer listen on the port
|
1538
|
-
for new incoming channels).
|
1539
|
-
|
1540
|
-
- Iterates through all channels on the server and sends shutdown msg (see
|
1541
|
-
'channel_broadcaster_shutdown()' for details) to the clients via the
|
1542
|
-
transport layer. The transport layer then guarantees the following:
|
1543
|
-
-- Sends shutdown to the client (for eg: HTTP2 transport sends GOAWAY)
|
1544
|
-
-- If the server has outstanding calls that are in the process, the
|
1545
|
-
connection is NOT closed until the server is done with all those calls
|
1546
|
-
-- Once, there are no more calls in progress, the channel is closed
|
1547
|
-
*/
|
1548
1492
|
void grpc_server_shutdown_and_notify(grpc_server* server,
|
1549
1493
|
grpc_completion_queue* cq, void* tag) {
|
1550
|
-
listener* l;
|
1551
|
-
shutdown_tag* sdt;
|
1552
|
-
channel_broadcaster broadcaster;
|
1553
1494
|
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
|
1554
1495
|
grpc_core::ExecCtx exec_ctx;
|
1555
|
-
|
1556
1496
|
GRPC_API_TRACE("grpc_server_shutdown_and_notify(server=%p, cq=%p, tag=%p)", 3,
|
1557
1497
|
(server, cq, tag));
|
1558
|
-
|
1559
|
-
/* wait for startup to be finished: locks mu_global */
|
1560
|
-
gpr_mu_lock(&server->mu_global);
|
1561
|
-
while (server->starting) {
|
1562
|
-
gpr_cv_wait(&server->starting_cv, &server->mu_global,
|
1563
|
-
gpr_inf_future(GPR_CLOCK_MONOTONIC));
|
1564
|
-
}
|
1565
|
-
|
1566
|
-
/* stay locked, and gather up some stuff to do */
|
1567
|
-
GPR_ASSERT(grpc_cq_begin_op(cq, tag));
|
1568
|
-
if (server->shutdown_published) {
|
1569
|
-
grpc_cq_end_op(cq, tag, GRPC_ERROR_NONE, done_published_shutdown, nullptr,
|
1570
|
-
static_cast<grpc_cq_completion*>(
|
1571
|
-
gpr_malloc(sizeof(grpc_cq_completion))));
|
1572
|
-
gpr_mu_unlock(&server->mu_global);
|
1573
|
-
return;
|
1574
|
-
}
|
1575
|
-
server->shutdown_tags = static_cast<shutdown_tag*>(
|
1576
|
-
gpr_realloc(server->shutdown_tags,
|
1577
|
-
sizeof(shutdown_tag) * (server->num_shutdown_tags + 1)));
|
1578
|
-
sdt = &server->shutdown_tags[server->num_shutdown_tags++];
|
1579
|
-
sdt->tag = tag;
|
1580
|
-
sdt->cq = cq;
|
1581
|
-
if (gpr_atm_acq_load(&server->shutdown_flag)) {
|
1582
|
-
gpr_mu_unlock(&server->mu_global);
|
1583
|
-
return;
|
1584
|
-
}
|
1585
|
-
|
1586
|
-
server->last_shutdown_message_time = gpr_now(GPR_CLOCK_REALTIME);
|
1587
|
-
|
1588
|
-
channel_broadcaster_init(server, &broadcaster);
|
1589
|
-
|
1590
|
-
gpr_atm_rel_store(&server->shutdown_flag, 1);
|
1591
|
-
|
1592
|
-
/* collect all unregistered then registered calls */
|
1593
|
-
gpr_mu_lock(&server->mu_call);
|
1594
|
-
kill_pending_work_locked(
|
1595
|
-
server, GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
|
1596
|
-
gpr_mu_unlock(&server->mu_call);
|
1597
|
-
|
1598
|
-
maybe_finish_shutdown(server);
|
1599
|
-
gpr_mu_unlock(&server->mu_global);
|
1600
|
-
|
1601
|
-
/* Shutdown listeners */
|
1602
|
-
for (l = server->listeners; l; l = l->next) {
|
1603
|
-
GRPC_CLOSURE_INIT(&l->destroy_done, listener_destroy_done, server,
|
1604
|
-
grpc_schedule_on_exec_ctx);
|
1605
|
-
l->destroy(server, l->arg, &l->destroy_done);
|
1606
|
-
if (server->channelz_server != nullptr && l->socket_uuid != 0) {
|
1607
|
-
server->channelz_server->RemoveChildListenSocket(l->socket_uuid);
|
1608
|
-
}
|
1609
|
-
}
|
1610
|
-
|
1611
|
-
channel_broadcaster_shutdown(&broadcaster, true /* send_goaway */,
|
1612
|
-
GRPC_ERROR_NONE);
|
1613
|
-
|
1614
|
-
if (server->default_resource_user != nullptr) {
|
1615
|
-
grpc_resource_quota_unref(
|
1616
|
-
grpc_resource_user_quota(server->default_resource_user));
|
1617
|
-
grpc_resource_user_shutdown(server->default_resource_user);
|
1618
|
-
grpc_resource_user_unref(server->default_resource_user);
|
1619
|
-
}
|
1498
|
+
server->core_server->ShutdownAndNotify(cq, tag);
|
1620
1499
|
}
|
1621
1500
|
|
1622
1501
|
void grpc_server_cancel_all_calls(grpc_server* server) {
|
1623
|
-
channel_broadcaster broadcaster;
|
1624
1502
|
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
|
1625
1503
|
grpc_core::ExecCtx exec_ctx;
|
1626
|
-
|
1627
1504
|
GRPC_API_TRACE("grpc_server_cancel_all_calls(server=%p)", 1, (server));
|
1628
|
-
|
1629
|
-
gpr_mu_lock(&server->mu_global);
|
1630
|
-
channel_broadcaster_init(server, &broadcaster);
|
1631
|
-
gpr_mu_unlock(&server->mu_global);
|
1632
|
-
|
1633
|
-
channel_broadcaster_shutdown(
|
1634
|
-
&broadcaster, false /* send_goaway */,
|
1635
|
-
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Cancelling all calls"));
|
1505
|
+
server->core_server->CancelAllCalls();
|
1636
1506
|
}
|
1637
1507
|
|
1638
1508
|
void grpc_server_destroy(grpc_server* server) {
|
1639
|
-
listener* l;
|
1640
1509
|
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
|
1641
1510
|
grpc_core::ExecCtx exec_ctx;
|
1642
|
-
|
1643
1511
|
GRPC_API_TRACE("grpc_server_destroy(server=%p)", 1, (server));
|
1644
|
-
|
1645
|
-
gpr_mu_lock(&server->mu_global);
|
1646
|
-
GPR_ASSERT(gpr_atm_acq_load(&server->shutdown_flag) || !server->listeners);
|
1647
|
-
GPR_ASSERT(server->listeners_destroyed == num_listeners(server));
|
1648
|
-
|
1649
|
-
while (server->listeners) {
|
1650
|
-
l = server->listeners;
|
1651
|
-
server->listeners = l->next;
|
1652
|
-
gpr_free(l);
|
1653
|
-
}
|
1654
|
-
|
1655
|
-
gpr_mu_unlock(&server->mu_global);
|
1656
|
-
|
1657
|
-
server_unref(server);
|
1658
|
-
}
|
1659
|
-
|
1660
|
-
void grpc_server_add_listener(
|
1661
|
-
grpc_server* server, void* listener_arg,
|
1662
|
-
void (*start)(grpc_server* server, void* arg, grpc_pollset** pollsets,
|
1663
|
-
size_t pollset_count),
|
1664
|
-
void (*destroy)(grpc_server* server, void* arg, grpc_closure* on_done),
|
1665
|
-
grpc_core::RefCountedPtr<grpc_core::channelz::ListenSocketNode> node) {
|
1666
|
-
listener* l = static_cast<listener*>(gpr_malloc(sizeof(listener)));
|
1667
|
-
l->arg = listener_arg;
|
1668
|
-
l->start = start;
|
1669
|
-
l->destroy = destroy;
|
1670
|
-
l->socket_uuid = 0;
|
1671
|
-
if (node != nullptr) {
|
1672
|
-
l->socket_uuid = node->uuid();
|
1673
|
-
if (server->channelz_server != nullptr) {
|
1674
|
-
server->channelz_server->AddChildListenSocket(std::move(node));
|
1675
|
-
}
|
1676
|
-
}
|
1677
|
-
l->next = server->listeners;
|
1678
|
-
server->listeners = l;
|
1679
|
-
}
|
1680
|
-
|
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;
|
1689
|
-
}
|
1690
|
-
if (grpc_cq_begin_op(cq_for_notification, tag) == false) {
|
1691
|
-
return GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN;
|
1692
|
-
}
|
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;
|
1703
|
-
}
|
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;
|
1715
|
-
return GRPC_CALL_OK;
|
1512
|
+
delete server;
|
1716
1513
|
}
|
1717
|
-
} // namespace
|
1718
1514
|
|
1719
1515
|
grpc_call_error grpc_server_request_call(
|
1720
1516
|
grpc_server* server, grpc_call** call, grpc_call_details* details,
|
1721
|
-
grpc_metadata_array*
|
1517
|
+
grpc_metadata_array* request_metadata,
|
1722
1518
|
grpc_completion_queue* cq_bound_to_call,
|
1723
1519
|
grpc_completion_queue* cq_for_notification, void* tag) {
|
1724
1520
|
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
|
@@ -1729,72 +1525,31 @@ grpc_call_error grpc_server_request_call(
|
|
1729
1525
|
"server=%p, call=%p, details=%p, initial_metadata=%p, "
|
1730
1526
|
"cq_bound_to_call=%p, cq_for_notification=%p, tag=%p)",
|
1731
1527
|
7,
|
1732
|
-
(server, call, details,
|
1528
|
+
(server, call, details, request_metadata, cq_bound_to_call,
|
1733
1529
|
cq_for_notification, tag));
|
1734
|
-
|
1735
|
-
|
1736
|
-
|
1737
|
-
&cq_idx, server, cq_for_notification, tag, nullptr, nullptr);
|
1738
|
-
if (error != GRPC_CALL_OK) {
|
1739
|
-
return error;
|
1740
|
-
}
|
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);
|
1530
|
+
return server->core_server->RequestCall(call, details, request_metadata,
|
1531
|
+
cq_bound_to_call, cq_for_notification,
|
1532
|
+
tag);
|
1745
1533
|
}
|
1746
1534
|
|
1747
1535
|
grpc_call_error grpc_server_request_registered_call(
|
1748
1536
|
grpc_server* server, void* rmp, grpc_call** call, gpr_timespec* deadline,
|
1749
|
-
grpc_metadata_array*
|
1537
|
+
grpc_metadata_array* request_metadata, grpc_byte_buffer** optional_payload,
|
1750
1538
|
grpc_completion_queue* cq_bound_to_call,
|
1751
|
-
grpc_completion_queue* cq_for_notification, void*
|
1539
|
+
grpc_completion_queue* cq_for_notification, void* tag_new) {
|
1752
1540
|
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
|
1753
1541
|
grpc_core::ExecCtx exec_ctx;
|
1754
1542
|
GRPC_STATS_INC_SERVER_REQUESTED_CALLS();
|
1755
|
-
|
1543
|
+
auto* rm = static_cast<grpc_core::Server::RegisteredMethod*>(rmp);
|
1756
1544
|
GRPC_API_TRACE(
|
1757
1545
|
"grpc_server_request_registered_call("
|
1758
|
-
"server=%p, rmp=%p, call=%p, deadline=%p,
|
1546
|
+
"server=%p, rmp=%p, call=%p, deadline=%p, request_metadata=%p, "
|
1759
1547
|
"optional_payload=%p, cq_bound_to_call=%p, cq_for_notification=%p, "
|
1760
1548
|
"tag=%p)",
|
1761
1549
|
9,
|
1762
|
-
(server, rmp, call, deadline,
|
1763
|
-
cq_bound_to_call, cq_for_notification,
|
1764
|
-
|
1765
|
-
|
1766
|
-
|
1767
|
-
&cq_idx, server, cq_for_notification, tag, optional_payload, rm);
|
1768
|
-
if (error != GRPC_CALL_OK) {
|
1769
|
-
return error;
|
1770
|
-
}
|
1771
|
-
|
1772
|
-
requested_call* rc =
|
1773
|
-
new requested_call(tag, cq_bound_to_call, call, initial_metadata, rm,
|
1774
|
-
deadline, optional_payload);
|
1775
|
-
return queue_call_request(server, cq_idx, rc);
|
1776
|
-
}
|
1777
|
-
|
1778
|
-
const grpc_channel_args* grpc_server_get_channel_args(grpc_server* server) {
|
1779
|
-
return server->channel_args;
|
1780
|
-
}
|
1781
|
-
|
1782
|
-
grpc_resource_user* grpc_server_get_default_resource_user(grpc_server* server) {
|
1783
|
-
return server->default_resource_user;
|
1784
|
-
}
|
1785
|
-
|
1786
|
-
int grpc_server_has_open_connections(grpc_server* server) {
|
1787
|
-
int r;
|
1788
|
-
gpr_mu_lock(&server->mu_global);
|
1789
|
-
r = server->root_channel_data.next != &server->root_channel_data;
|
1790
|
-
gpr_mu_unlock(&server->mu_global);
|
1791
|
-
return r;
|
1792
|
-
}
|
1793
|
-
|
1794
|
-
grpc_core::channelz::ServerNode* grpc_server_get_channelz_node(
|
1795
|
-
grpc_server* server) {
|
1796
|
-
if (server == nullptr) {
|
1797
|
-
return nullptr;
|
1798
|
-
}
|
1799
|
-
return server->channelz_server.get();
|
1550
|
+
(server, rmp, call, deadline, request_metadata, optional_payload,
|
1551
|
+
cq_bound_to_call, cq_for_notification, tag_new));
|
1552
|
+
return server->core_server->RequestRegisteredCall(
|
1553
|
+
rm, call, deadline, request_metadata, optional_payload, cq_bound_to_call,
|
1554
|
+
cq_for_notification, tag_new);
|
1800
1555
|
}
|