grpc 1.0.1 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +3696 -867
- data/etc/roots.pem +39 -111
- data/include/grpc/byte_buffer.h +64 -1
- data/include/grpc/census.h +40 -96
- data/include/grpc/compression.h +2 -1
- data/include/grpc/grpc.h +42 -7
- data/include/grpc/grpc_posix.h +8 -5
- data/include/grpc/impl/codegen/atm.h +3 -0
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
- data/include/grpc/impl/codegen/atm_gcc_sync.h +8 -0
- data/include/grpc/impl/codegen/atm_windows.h +4 -0
- data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -4
- data/include/grpc/impl/codegen/compression_types.h +1 -1
- data/include/grpc/impl/codegen/connectivity_state.h +2 -0
- data/include/grpc/impl/codegen/exec_ctx_fwd.h +41 -0
- data/include/grpc/impl/codegen/gpr_slice.h +84 -0
- data/include/grpc/impl/codegen/{alloc.h → gpr_types.h} +30 -29
- data/include/grpc/impl/codegen/grpc_types.h +91 -9
- data/include/grpc/impl/codegen/port_platform.h +25 -92
- data/include/grpc/impl/codegen/slice.h +54 -97
- data/include/grpc/impl/codegen/sync.h +0 -253
- data/include/grpc/module.modulemap +0 -2
- data/include/grpc/slice.h +132 -0
- data/include/grpc/{impl/codegen/slice_buffer.h → slice_buffer.h} +22 -39
- data/include/grpc/support/alloc.h +40 -1
- data/include/grpc/support/log.h +80 -1
- data/include/grpc/support/log_windows.h +2 -0
- data/include/grpc/support/string_util.h +1 -1
- data/include/grpc/support/sync.h +252 -0
- data/include/grpc/support/time.h +67 -1
- data/src/boringssl/err_data.c +639 -627
- data/src/core/ext/census/base_resources.c +71 -0
- data/src/core/ext/census/base_resources.h +39 -0
- data/src/core/ext/census/gen/census.pb.c +26 -29
- data/src/core/ext/census/gen/census.pb.h +68 -67
- data/src/core/ext/census/gen/trace_context.pb.c +81 -0
- data/src/core/ext/census/gen/trace_context.pb.h +99 -0
- data/src/core/ext/census/grpc_filter.c +22 -16
- data/src/core/ext/census/grpc_plugin.c +2 -1
- data/src/core/ext/census/initialize.c +16 -4
- data/src/core/ext/census/mlog.h +1 -1
- data/src/core/ext/census/placeholders.c +0 -45
- data/src/core/ext/census/resource.c +312 -0
- data/src/core/ext/census/resource.h +63 -0
- data/src/core/ext/census/trace_context.c +86 -0
- data/src/core/ext/census/trace_context.h +68 -0
- data/src/core/ext/census/tracing.c +8 -2
- data/src/core/ext/{client_config → client_channel}/channel_connectivity.c +8 -4
- data/src/core/ext/client_channel/client_channel.c +1218 -0
- data/src/core/ext/{client_config → client_channel}/client_channel.h +8 -11
- data/src/core/ext/{client_config → client_channel}/client_channel_factory.c +33 -3
- data/src/core/ext/{client_config → client_channel}/client_channel_factory.h +15 -8
- data/src/core/ext/{client_config/client_config_plugin.c → client_channel/client_channel_plugin.c} +16 -15
- data/src/core/ext/{client_config → client_channel}/connector.c +1 -1
- data/src/core/ext/{client_config → client_channel}/connector.h +5 -8
- data/{include/grpc/support/slice_buffer.h → src/core/ext/client_channel/default_initial_connect_string.c} +4 -5
- data/src/core/ext/client_channel/http_connect_handshaker.c +399 -0
- data/src/core/ext/client_channel/http_connect_handshaker.h +52 -0
- data/src/core/ext/{client_config → client_channel}/initial_connect_string.c +6 -7
- data/src/core/ext/{client_config → client_channel}/initial_connect_string.h +10 -10
- data/src/core/ext/{client_config → client_channel}/lb_policy.c +11 -11
- data/src/core/ext/{client_config → client_channel}/lb_policy.h +68 -27
- data/src/core/ext/client_channel/lb_policy_factory.c +163 -0
- data/src/core/ext/{client_config → client_channel}/lb_policy_factory.h +64 -9
- data/src/core/ext/{client_config → client_channel}/lb_policy_registry.c +6 -4
- data/src/core/ext/{client_config → client_channel}/lb_policy_registry.h +4 -4
- data/src/core/ext/{client_config → client_channel}/parse_address.c +21 -14
- data/src/core/ext/{client_config → client_channel}/parse_address.h +8 -10
- data/src/core/ext/{client_config → client_channel}/resolver.c +3 -4
- data/src/core/ext/{client_config → client_channel}/resolver.h +11 -15
- data/src/core/ext/{client_config → client_channel}/resolver_factory.c +4 -3
- data/src/core/ext/{client_config → client_channel}/resolver_factory.h +13 -11
- data/src/core/ext/{client_config → client_channel}/resolver_registry.c +54 -34
- data/src/core/ext/{client_config → client_channel}/resolver_registry.h +21 -8
- data/src/core/ext/{client_config → client_channel}/subchannel.c +208 -119
- data/src/core/ext/{client_config → client_channel}/subchannel.h +21 -11
- data/src/core/ext/{client_config → client_channel}/subchannel_index.c +6 -17
- data/src/core/ext/{client_config → client_channel}/subchannel_index.h +7 -7
- data/src/core/ext/{client_config → client_channel}/uri_parser.c +21 -28
- data/src/core/ext/{client_config → client_channel}/uri_parser.h +3 -3
- data/src/core/ext/lb_policy/grpclb/grpclb.c +1406 -0
- data/src/core/ext/lb_policy/grpclb/grpclb.h +44 -0
- data/src/core/ext/lb_policy/grpclb/load_balancer_api.c +117 -37
- data/src/core/ext/lb_policy/grpclb/load_balancer_api.h +31 -12
- data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +6 -36
- data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +22 -42
- data/src/core/ext/lb_policy/pick_first/pick_first.c +64 -46
- data/src/core/ext/lb_policy/round_robin/round_robin.c +324 -160
- data/src/core/ext/load_reporting/load_reporting.c +7 -56
- data/src/core/ext/load_reporting/load_reporting.h +41 -28
- data/src/core/ext/load_reporting/load_reporting_filter.c +132 -42
- data/src/core/ext/load_reporting/load_reporting_filter.h +1 -0
- data/src/core/ext/resolver/dns/native/dns_resolver.c +88 -80
- data/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +57 -102
- data/src/core/ext/transport/chttp2/alpn/alpn.c +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.c +253 -0
- data/src/core/{lib/iomgr/ev_poll_and_epoll_posix.h → ext/transport/chttp2/client/chttp2_connector.h} +5 -5
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +31 -160
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +5 -5
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +44 -243
- data/src/core/ext/transport/chttp2/server/chttp2_server.c +342 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +47 -0
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +11 -124
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +20 -9
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +28 -236
- data/src/core/ext/transport/chttp2/transport/bin_decoder.c +31 -27
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +5 -4
- data/src/core/ext/transport/chttp2/transport/bin_encoder.c +25 -22
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +8 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +0 -3
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +1345 -1521
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -1
- data/src/core/ext/transport/chttp2/transport/frame.h +3 -5
- data/src/core/ext/transport/chttp2/transport/frame_data.c +50 -47
- data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -9
- data/src/core/ext/transport/chttp2/transport/frame_goaway.c +19 -21
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +9 -8
- data/src/core/ext/transport/chttp2/transport/frame_ping.c +13 -12
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +6 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +31 -19
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +8 -7
- data/src/core/ext/transport/chttp2/transport/frame_settings.c +22 -25
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +9 -8
- data/src/core/ext/transport/chttp2/transport/frame_window_update.c +26 -18
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +5 -6
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +68 -58
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -5
- data/src/core/ext/transport/chttp2/transport/hpack_parser.c +327 -214
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +14 -9
- data/src/core/ext/transport/chttp2/transport/hpack_table.c +24 -19
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +9 -6
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +2 -2
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +1 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +284 -436
- data/src/core/ext/transport/chttp2/transport/parsing.c +355 -590
- data/src/core/ext/transport/chttp2/transport/stream_lists.c +36 -309
- data/src/core/ext/transport/chttp2/transport/stream_map.c +13 -34
- data/src/core/ext/transport/chttp2/transport/stream_map.h +3 -4
- data/src/core/ext/transport/chttp2/transport/writing.c +174 -286
- data/src/core/lib/channel/channel_args.c +70 -13
- data/src/core/lib/channel/channel_args.h +28 -2
- data/src/core/lib/channel/channel_stack.c +77 -28
- data/src/core/lib/channel/channel_stack.h +61 -23
- data/src/core/lib/channel/channel_stack_builder.c +33 -25
- data/src/core/lib/channel/channel_stack_builder.h +17 -8
- data/src/core/lib/channel/compress_filter.c +52 -36
- data/src/core/lib/channel/connected_channel.c +20 -12
- data/src/core/lib/channel/connected_channel.h +2 -1
- data/src/core/lib/channel/context.h +13 -1
- data/src/core/lib/channel/deadline_filter.c +344 -0
- data/src/core/lib/channel/deadline_filter.h +99 -0
- data/src/core/lib/channel/handshaker.c +240 -0
- data/src/core/lib/channel/handshaker.h +164 -0
- data/src/core/lib/{security/credentials/google_default/credentials_windows.c → channel/handshaker_factory.c} +16 -23
- data/src/core/lib/channel/handshaker_factory.h +66 -0
- data/src/core/lib/channel/handshaker_registry.c +113 -0
- data/src/core/{ext/client_config/client_config.h → lib/channel/handshaker_registry.h} +26 -16
- data/src/core/lib/channel/http_client_filter.c +248 -46
- data/src/core/lib/channel/http_client_filter.h +3 -0
- data/src/core/lib/channel/http_server_filter.c +136 -24
- data/src/core/lib/channel/message_size_filter.c +261 -0
- data/src/core/lib/channel/message_size_filter.h +39 -0
- data/src/core/lib/compression/message_compress.c +43 -37
- data/src/core/lib/compression/message_compress.h +7 -5
- data/src/core/lib/http/format_request.c +26 -11
- data/src/core/lib/http/format_request.h +7 -5
- data/src/core/lib/http/httpcli.c +45 -27
- data/src/core/lib/http/httpcli.h +4 -4
- data/src/core/lib/http/httpcli_security_connector.c +56 -46
- data/src/core/lib/http/parser.c +17 -14
- data/src/core/lib/http/parser.h +4 -2
- data/src/core/lib/iomgr/closure.c +49 -7
- data/src/core/lib/iomgr/closure.h +56 -14
- data/src/core/lib/iomgr/combiner.c +422 -0
- data/src/core/lib/iomgr/combiner.h +64 -0
- data/src/core/lib/iomgr/endpoint.c +8 -2
- data/src/core/lib/iomgr/endpoint.h +17 -7
- data/src/core/lib/iomgr/endpoint_pair.h +3 -2
- data/src/core/lib/iomgr/endpoint_pair_posix.c +9 -8
- data/src/core/{ext/client_config/lb_policy_factory.c → lib/iomgr/endpoint_pair_uv.c} +18 -13
- data/src/core/lib/iomgr/endpoint_pair_windows.c +7 -6
- data/src/core/lib/iomgr/error.c +72 -6
- data/src/core/lib/iomgr/error.h +30 -3
- data/src/core/lib/iomgr/ev_epoll_linux.c +500 -382
- data/src/core/lib/iomgr/ev_epoll_linux.h +3 -2
- data/src/core/lib/iomgr/ev_poll_posix.c +317 -30
- data/src/core/lib/iomgr/ev_poll_posix.h +1 -0
- data/src/core/lib/iomgr/ev_posix.c +26 -5
- data/src/core/lib/iomgr/ev_posix.h +12 -1
- data/src/core/lib/iomgr/exec_ctx.c +27 -94
- data/src/core/lib/iomgr/exec_ctx.h +19 -22
- data/src/core/lib/iomgr/executor.c +29 -8
- data/src/core/lib/iomgr/executor.h +2 -4
- data/src/core/lib/iomgr/iocp_windows.c +3 -4
- data/src/core/lib/iomgr/iomgr.c +14 -10
- data/src/core/lib/iomgr/iomgr.h +6 -2
- data/src/core/lib/iomgr/iomgr_posix.c +2 -2
- data/src/core/lib/iomgr/iomgr_uv.c +49 -0
- data/src/core/lib/iomgr/iomgr_windows.c +2 -2
- data/src/core/lib/iomgr/load_file.c +3 -3
- data/src/core/lib/iomgr/load_file.h +2 -2
- data/src/core/lib/iomgr/network_status_tracker.c +1 -1
- data/src/core/lib/iomgr/pollset_set_uv.c +62 -0
- data/src/core/lib/iomgr/pollset_set_windows.c +3 -3
- data/src/core/lib/iomgr/pollset_uv.c +142 -0
- data/src/core/lib/iomgr/pollset_uv.h +42 -0
- data/src/core/lib/iomgr/pollset_windows.c +5 -6
- data/src/core/lib/iomgr/port.h +129 -0
- data/src/core/lib/iomgr/resolve_address.h +2 -1
- data/src/core/lib/iomgr/resolve_address_posix.c +14 -13
- data/src/core/lib/iomgr/resolve_address_uv.c +233 -0
- data/src/core/lib/iomgr/resolve_address_windows.c +14 -12
- data/src/core/lib/iomgr/resource_quota.c +832 -0
- data/src/core/lib/iomgr/resource_quota.h +159 -0
- data/src/core/lib/iomgr/sockaddr.h +10 -2
- data/src/core/lib/iomgr/sockaddr_utils.c +63 -36
- data/src/core/lib/iomgr/sockaddr_utils.h +14 -14
- data/src/core/lib/iomgr/socket_mutator.c +98 -0
- data/src/core/lib/iomgr/socket_mutator.h +80 -0
- data/src/core/lib/iomgr/socket_utils.h +42 -0
- data/src/core/lib/iomgr/socket_utils_common_posix.c +28 -13
- data/src/core/lib/iomgr/socket_utils_linux.c +11 -5
- data/src/core/lib/iomgr/socket_utils_posix.c +10 -7
- data/src/core/lib/iomgr/socket_utils_posix.h +11 -4
- data/src/core/lib/iomgr/socket_utils_uv.c +49 -0
- data/src/core/lib/iomgr/socket_utils_windows.c +52 -0
- data/src/core/lib/iomgr/socket_windows.c +14 -6
- data/src/core/lib/iomgr/socket_windows.h +1 -0
- data/src/core/lib/iomgr/tcp_client.h +8 -2
- data/src/core/lib/iomgr/tcp_client_posix.c +131 -82
- data/src/core/lib/iomgr/tcp_client_posix.h +45 -0
- data/src/core/lib/iomgr/tcp_client_uv.c +190 -0
- data/src/core/lib/iomgr/tcp_client_windows.c +54 -30
- data/src/core/lib/iomgr/tcp_posix.c +135 -56
- data/src/core/lib/iomgr/tcp_posix.h +2 -2
- data/src/core/lib/iomgr/tcp_server.h +14 -6
- data/src/core/lib/iomgr/tcp_server_posix.c +154 -118
- data/src/core/lib/iomgr/tcp_server_uv.c +388 -0
- data/src/core/lib/iomgr/tcp_server_windows.c +127 -100
- data/src/core/lib/iomgr/tcp_uv.c +367 -0
- data/src/core/lib/iomgr/tcp_uv.h +59 -0
- data/src/core/lib/iomgr/tcp_windows.c +65 -48
- data/src/core/lib/iomgr/tcp_windows.h +3 -1
- data/src/core/lib/iomgr/timer.h +21 -21
- data/src/core/lib/iomgr/{timer.c → timer_generic.c} +15 -10
- data/src/core/lib/iomgr/timer_generic.h +49 -0
- data/src/core/lib/iomgr/timer_heap.c +6 -0
- data/src/core/lib/iomgr/timer_uv.c +99 -0
- data/src/core/lib/iomgr/timer_uv.h +47 -0
- data/src/core/lib/iomgr/udp_server.c +116 -98
- data/src/core/lib/iomgr/udp_server.h +5 -3
- data/src/core/lib/iomgr/unix_sockets_posix.c +14 -6
- data/src/core/lib/iomgr/unix_sockets_posix.h +6 -5
- data/src/core/lib/iomgr/unix_sockets_posix_noop.c +4 -4
- data/src/core/lib/iomgr/wakeup_fd_cv.c +118 -0
- data/src/core/lib/iomgr/wakeup_fd_cv.h +80 -0
- data/src/core/lib/iomgr/wakeup_fd_eventfd.c +3 -3
- data/src/core/lib/iomgr/wakeup_fd_nospecial.c +3 -3
- data/src/core/lib/iomgr/wakeup_fd_pipe.c +12 -6
- data/src/core/lib/iomgr/wakeup_fd_posix.c +34 -5
- data/src/core/lib/iomgr/wakeup_fd_posix.h +5 -0
- data/src/core/lib/iomgr/workqueue.h +12 -20
- data/src/core/{ext/client_config/client_config.c → lib/iomgr/workqueue_uv.c} +24 -33
- data/{include/grpc/support/slice.h → src/core/lib/iomgr/workqueue_uv.h} +4 -6
- data/src/core/lib/iomgr/workqueue_windows.c +9 -8
- data/src/core/lib/json/json.c +3 -3
- data/src/core/lib/json/json.h +11 -11
- data/src/core/lib/json/json_reader.c +9 -5
- data/src/core/lib/profiling/basic_timers.c +10 -1
- data/src/core/lib/profiling/timers.h +2 -0
- data/src/core/lib/security/context/security_context.c +13 -3
- data/src/core/lib/security/context/security_context.h +20 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.c +28 -14
- data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
- data/src/core/lib/security/credentials/credentials.c +48 -19
- data/src/core/lib/security/credentials/credentials.h +36 -19
- data/src/core/lib/security/credentials/credentials_metadata.c +11 -8
- data/src/core/lib/security/credentials/fake/fake_credentials.c +15 -11
- data/src/core/lib/security/credentials/google_default/{credentials_posix.c → credentials_generic.c} +7 -14
- data/src/core/lib/security/credentials/google_default/google_default_credentials.c +33 -21
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +14 -0
- data/src/core/lib/security/credentials/iam/iam_credentials.c +3 -2
- data/src/core/lib/security/credentials/jwt/json_token.c +1 -0
- data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.c +54 -19
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.c +129 -79
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +9 -6
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +63 -28
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
- data/src/core/lib/security/credentials/plugin/plugin_credentials.c +32 -11
- data/src/core/lib/security/credentials/ssl/ssl_credentials.c +13 -9
- data/src/core/lib/security/transport/client_auth_filter.c +33 -27
- data/src/core/lib/security/transport/secure_endpoint.c +93 -68
- data/src/core/lib/security/transport/secure_endpoint.h +2 -2
- data/src/core/lib/security/transport/security_connector.c +133 -168
- data/src/core/lib/security/transport/security_connector.h +31 -46
- data/src/core/lib/security/transport/security_handshaker.c +501 -0
- data/src/core/lib/security/transport/{handshake.h → security_handshaker.h} +10 -10
- data/src/core/lib/security/transport/server_auth_filter.c +50 -38
- data/src/core/lib/security/util/b64.c +11 -8
- data/src/core/lib/security/util/b64.h +5 -4
- data/src/core/lib/slice/percent_encoding.c +182 -0
- data/src/core/lib/slice/percent_encoding.h +78 -0
- data/src/core/lib/{support → slice}/slice.c +81 -50
- data/src/core/lib/{support → slice}/slice_buffer.c +78 -60
- data/src/core/lib/slice/slice_internal.h +49 -0
- data/src/core/lib/slice/slice_string_helpers.c +90 -0
- data/src/core/lib/{iomgr/workqueue_posix.h → slice/slice_string_helpers.h} +18 -18
- data/src/core/lib/support/backoff.c +24 -13
- data/src/core/lib/support/backoff.h +5 -2
- data/src/core/lib/support/env.h +0 -2
- data/src/core/lib/support/log.c +5 -4
- data/src/core/lib/support/log_linux.c +0 -1
- data/src/core/lib/support/log_posix.c +1 -1
- data/src/core/lib/support/mpscq.c +83 -0
- data/src/core/lib/support/mpscq.h +65 -0
- data/src/core/lib/support/string.c +58 -49
- data/src/core/lib/support/string.h +11 -8
- data/src/core/lib/support/subprocess_posix.c +5 -2
- data/src/core/lib/support/thd.c +1 -1
- data/src/core/lib/support/time.c +43 -79
- data/src/core/lib/support/time_posix.c +1 -1
- data/src/core/lib/support/tmpfile.h +0 -2
- data/src/core/lib/surface/alarm.c +4 -1
- data/src/core/lib/surface/byte_buffer.c +17 -11
- data/src/core/lib/surface/byte_buffer_reader.c +23 -15
- data/src/core/lib/surface/call.c +294 -276
- data/src/core/lib/surface/call.h +24 -9
- data/src/core/lib/surface/call_log_batch.c +5 -3
- data/src/core/lib/surface/channel.c +127 -111
- data/src/core/lib/surface/channel.h +14 -5
- data/src/core/lib/surface/channel_init.c +1 -1
- data/src/core/lib/surface/channel_init.h +10 -1
- data/src/core/lib/surface/channel_ping.c +7 -6
- data/src/core/lib/surface/completion_queue.c +154 -18
- data/src/core/lib/surface/completion_queue.h +5 -0
- data/src/core/lib/surface/init.c +40 -6
- data/src/core/lib/surface/init.h +1 -0
- data/src/core/lib/surface/init_secure.c +5 -2
- data/src/core/lib/surface/lame_client.c +28 -18
- data/src/core/lib/surface/server.c +134 -87
- data/src/core/lib/surface/server.h +8 -0
- data/src/core/lib/surface/validate_metadata.c +1 -1
- data/src/core/lib/surface/version.c +3 -1
- data/src/core/lib/transport/byte_stream.c +7 -4
- data/src/core/lib/transport/byte_stream.h +6 -10
- data/src/core/lib/transport/connectivity_state.c +21 -12
- data/src/core/lib/transport/connectivity_state.h +4 -1
- data/src/core/lib/transport/mdstr_hash_table.c +118 -0
- data/src/core/lib/transport/mdstr_hash_table.h +77 -0
- data/src/core/lib/transport/metadata.c +83 -60
- data/src/core/lib/transport/metadata.h +41 -23
- data/src/core/lib/transport/metadata_batch.c +17 -11
- data/src/core/lib/transport/metadata_batch.h +20 -6
- data/src/core/lib/transport/pid_controller.c +57 -0
- data/src/core/lib/transport/pid_controller.h +64 -0
- data/src/core/lib/transport/service_config.c +251 -0
- data/src/core/lib/transport/service_config.h +71 -0
- data/src/core/lib/transport/static_metadata.c +18 -16
- data/src/core/lib/transport/static_metadata.h +113 -107
- data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.c +3 -3
- data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.h +7 -7
- data/src/core/lib/transport/transport.c +84 -23
- data/src/core/lib/transport/transport.h +53 -8
- data/src/core/lib/transport/transport_impl.h +3 -0
- data/src/core/lib/transport/transport_op_string.c +92 -20
- data/src/core/lib/tsi/ssl_transport_security.c +3 -1
- data/src/core/plugin_registry/grpc_plugin_registry.c +8 -4
- data/src/ruby/ext/grpc/extconf.rb +0 -1
- data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -7
- data/src/ruby/ext/grpc/rb_call.c +15 -5
- data/src/ruby/ext/grpc/rb_channel.c +1 -1
- data/src/ruby/ext/grpc/rb_compression_options.c +466 -0
- data/src/{core/ext/client_config/default_initial_connect_string.c → ruby/ext/grpc/rb_compression_options.h} +10 -5
- data/src/ruby/ext/grpc/rb_grpc.c +3 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +198 -190
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +306 -294
- data/src/ruby/ext/grpc/rb_server.c +18 -12
- data/src/ruby/lib/grpc/errors.rb +154 -2
- data/src/ruby/lib/grpc/generic/active_call.rb +144 -63
- data/src/ruby/lib/grpc/generic/bidi_call.rb +18 -2
- data/src/ruby/lib/grpc/generic/client_stub.rb +7 -5
- data/src/ruby/lib/grpc/generic/rpc_desc.rb +39 -13
- data/src/ruby/lib/grpc/generic/rpc_server.rb +51 -24
- data/src/ruby/lib/grpc/generic/service.rb +3 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/checker.rb +3 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +7 -0
- data/src/ruby/pb/test/client.rb +307 -7
- data/src/ruby/pb/test/server.rb +26 -1
- data/src/ruby/spec/compression_options_spec.rb +164 -0
- data/src/ruby/spec/error_sanity_spec.rb +64 -0
- data/src/ruby/spec/generic/active_call_spec.rb +290 -12
- data/src/ruby/spec/generic/client_stub_spec.rb +91 -41
- data/src/ruby/spec/generic/rpc_desc_spec.rb +36 -16
- data/src/ruby/spec/generic/rpc_server_pool_spec.rb +22 -28
- data/src/ruby/spec/generic/rpc_server_spec.rb +6 -6
- data/src/ruby/spec/pb/health/checker_spec.rb +27 -19
- data/src/ruby/spec/spec_helper.rb +2 -0
- data/third_party/boringssl/crypto/aes/aes.c +12 -12
- data/third_party/boringssl/crypto/aes/mode_wrappers.c +6 -2
- data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +28 -13
- data/third_party/boringssl/crypto/asn1/a_gentm.c +2 -0
- data/third_party/boringssl/crypto/asn1/a_object.c +7 -3
- data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
- data/third_party/boringssl/crypto/asn1/a_time.c +0 -11
- data/third_party/boringssl/crypto/asn1/a_type.c +0 -2
- data/third_party/boringssl/crypto/asn1/a_utctm.c +1 -30
- data/third_party/boringssl/crypto/asn1/asn1_lib.c +56 -76
- data/third_party/boringssl/crypto/asn1/asn1_locl.h +0 -10
- data/third_party/boringssl/crypto/asn1/asn1_par.c +0 -322
- data/third_party/boringssl/crypto/asn1/f_enum.c +1 -108
- data/third_party/boringssl/crypto/asn1/f_int.c +1 -106
- data/third_party/boringssl/crypto/asn1/f_string.c +1 -106
- data/third_party/boringssl/crypto/asn1/tasn_dec.c +10 -14
- data/third_party/boringssl/crypto/asn1/tasn_enc.c +17 -11
- data/third_party/boringssl/crypto/asn1/tasn_typ.c +29 -42
- data/third_party/boringssl/crypto/asn1/tasn_utl.c +1 -1
- data/third_party/boringssl/crypto/base64/base64.c +249 -285
- data/third_party/boringssl/crypto/bio/bio.c +13 -23
- data/third_party/boringssl/crypto/bio/bio_mem.c +3 -2
- data/third_party/boringssl/crypto/bio/connect.c +12 -3
- data/third_party/boringssl/crypto/bio/fd.c +22 -15
- data/third_party/boringssl/crypto/bio/file.c +2 -38
- data/third_party/boringssl/crypto/bio/hexdump.c +1 -2
- data/third_party/boringssl/crypto/bio/internal.h +3 -0
- data/third_party/boringssl/crypto/bio/pair.c +1 -1
- data/third_party/boringssl/crypto/bio/socket.c +10 -2
- data/third_party/boringssl/crypto/bio/socket_helper.c +2 -2
- data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +0 -8
- data/third_party/boringssl/crypto/bn/bn.c +38 -0
- data/third_party/boringssl/crypto/bn/cmp.c +25 -0
- data/third_party/boringssl/crypto/bn/convert.c +73 -76
- data/third_party/boringssl/crypto/bn/div.c +136 -70
- data/third_party/boringssl/crypto/bn/exponentiation.c +86 -381
- data/third_party/boringssl/crypto/bn/gcd.c +213 -296
- data/third_party/boringssl/crypto/bn/generic.c +0 -80
- data/third_party/boringssl/crypto/bn/internal.h +15 -3
- data/third_party/boringssl/crypto/bn/montgomery.c +57 -207
- data/third_party/boringssl/crypto/bn/montgomery_inv.c +160 -0
- data/third_party/boringssl/crypto/bn/mul.c +2 -1
- data/third_party/boringssl/crypto/bn/prime.c +24 -8
- data/third_party/boringssl/crypto/bn/random.c +47 -33
- data/third_party/boringssl/crypto/bn/sqrt.c +4 -5
- data/third_party/boringssl/crypto/buf/buf.c +25 -21
- data/third_party/boringssl/crypto/bytestring/ber.c +1 -0
- data/third_party/boringssl/crypto/bytestring/cbb.c +50 -22
- data/third_party/boringssl/crypto/bytestring/cbs.c +28 -4
- data/third_party/boringssl/crypto/chacha/{chacha_generic.c → chacha.c} +56 -29
- data/third_party/boringssl/crypto/cipher/aead.c +11 -22
- data/third_party/boringssl/crypto/cipher/cipher.c +2 -2
- data/third_party/boringssl/crypto/cipher/e_aes.c +53 -103
- data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +2 -8
- data/third_party/boringssl/crypto/cipher/e_des.c +3 -5
- data/third_party/boringssl/crypto/cipher/e_null.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_rc2.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_rc4.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_ssl3.c +3 -63
- data/third_party/boringssl/crypto/cipher/e_tls.c +12 -83
- data/third_party/boringssl/crypto/cipher/internal.h +8 -10
- data/third_party/boringssl/crypto/cipher/tls_cbc.c +69 -40
- data/third_party/boringssl/crypto/conf/conf.c +2 -1
- data/third_party/boringssl/crypto/cpu-aarch64-linux.c +61 -0
- data/third_party/boringssl/crypto/cpu-arm-linux.c +360 -0
- data/third_party/boringssl/crypto/cpu-arm.c +0 -161
- data/third_party/boringssl/crypto/cpu-intel.c +5 -3
- data/third_party/boringssl/{ssl/test/scoped_types.h → crypto/cpu-ppc64le.c} +21 -9
- data/third_party/boringssl/crypto/crypto.c +29 -7
- data/third_party/boringssl/crypto/curve25519/curve25519.c +284 -242
- data/third_party/boringssl/crypto/curve25519/internal.h +64 -0
- data/third_party/boringssl/crypto/curve25519/spake25519.c +464 -0
- data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +21 -0
- data/third_party/boringssl/crypto/dh/check.c +22 -6
- data/third_party/boringssl/crypto/dh/dh.c +45 -21
- data/third_party/boringssl/crypto/dh/dh_asn1.c +96 -20
- data/third_party/boringssl/crypto/dh/params.c +30 -78
- data/third_party/boringssl/crypto/digest/digest.c +3 -3
- data/third_party/boringssl/crypto/dsa/dsa.c +59 -29
- data/third_party/boringssl/crypto/dsa/dsa_asn1.c +4 -0
- data/third_party/boringssl/crypto/ec/ec.c +84 -140
- data/third_party/boringssl/crypto/ec/ec_asn1.c +82 -52
- data/third_party/boringssl/crypto/ec/ec_key.c +15 -15
- data/third_party/boringssl/crypto/ec/ec_montgomery.c +87 -50
- data/third_party/boringssl/crypto/ec/internal.h +12 -36
- data/third_party/boringssl/crypto/ec/oct.c +11 -11
- data/third_party/boringssl/crypto/ec/p224-64.c +59 -116
- data/third_party/boringssl/crypto/ec/p256-64.c +88 -163
- data/third_party/boringssl/crypto/ec/p256-x86_64.c +46 -58
- data/third_party/boringssl/crypto/ec/simple.c +81 -201
- data/third_party/boringssl/crypto/ec/util-64.c +0 -74
- data/third_party/boringssl/crypto/ecdh/ecdh.c +7 -1
- data/third_party/boringssl/crypto/ecdsa/ecdsa.c +28 -46
- data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +1 -0
- data/third_party/boringssl/crypto/engine/engine.c +1 -1
- data/third_party/boringssl/crypto/err/err.c +3 -3
- data/third_party/boringssl/crypto/evp/evp.c +14 -59
- data/third_party/boringssl/crypto/evp/evp_asn1.c +144 -87
- data/third_party/boringssl/crypto/evp/evp_ctx.c +7 -7
- data/third_party/boringssl/crypto/evp/internal.h +4 -46
- data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +8 -157
- data/third_party/boringssl/crypto/evp/p_ec.c +1 -1
- data/third_party/boringssl/crypto/evp/p_ec_asn1.c +22 -170
- data/third_party/boringssl/crypto/evp/p_rsa.c +1 -1
- data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +10 -548
- data/third_party/boringssl/crypto/evp/print.c +520 -0
- data/third_party/boringssl/crypto/ex_data.c +4 -6
- data/third_party/boringssl/crypto/hkdf/hkdf.c +38 -17
- data/third_party/boringssl/crypto/hmac/hmac.c +6 -6
- data/third_party/boringssl/crypto/internal.h +57 -77
- data/third_party/boringssl/crypto/lhash/lhash.c +6 -10
- data/third_party/boringssl/crypto/md4/md4.c +9 -0
- data/third_party/boringssl/crypto/mem.c +19 -19
- data/third_party/boringssl/crypto/modes/cfb.c +5 -6
- data/third_party/boringssl/crypto/modes/ctr.c +10 -18
- data/third_party/boringssl/crypto/modes/gcm.c +100 -66
- data/third_party/boringssl/crypto/modes/internal.h +15 -27
- data/third_party/boringssl/crypto/modes/ofb.c +9 -22
- data/third_party/boringssl/crypto/newhope/error_correction.c +131 -0
- data/third_party/boringssl/crypto/newhope/internal.h +71 -0
- data/third_party/boringssl/crypto/newhope/newhope.c +174 -0
- data/third_party/boringssl/crypto/newhope/ntt.c +148 -0
- data/third_party/boringssl/crypto/newhope/poly.c +183 -0
- data/third_party/boringssl/crypto/newhope/precomp.c +306 -0
- data/third_party/boringssl/crypto/newhope/reduce.c +42 -0
- data/third_party/boringssl/crypto/obj/obj.c +111 -135
- data/third_party/boringssl/crypto/obj/obj_dat.h +4 -10
- data/third_party/boringssl/crypto/pem/pem_lib.c +6 -43
- data/third_party/boringssl/crypto/pem/pem_pkey.c +10 -19
- data/third_party/boringssl/crypto/pkcs8/p5_pbe.c +1 -0
- data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +2 -1
- data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +2 -2
- data/third_party/boringssl/crypto/pkcs8/pkcs8.c +95 -87
- data/third_party/boringssl/crypto/{test/test_util.h → poly1305/internal.h} +15 -10
- data/third_party/boringssl/crypto/poly1305/poly1305.c +8 -15
- data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +1 -0
- data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +3 -3
- data/third_party/boringssl/crypto/rand/deterministic.c +47 -0
- data/third_party/boringssl/crypto/rand/rand.c +4 -1
- data/third_party/boringssl/crypto/rand/urandom.c +5 -7
- data/third_party/boringssl/crypto/rand/windows.c +5 -8
- data/third_party/boringssl/crypto/rc4/rc4.c +24 -209
- data/third_party/boringssl/crypto/refcount_lock.c +2 -2
- data/third_party/boringssl/crypto/rsa/blinding.c +74 -232
- data/third_party/boringssl/crypto/rsa/internal.h +5 -13
- data/third_party/boringssl/crypto/rsa/padding.c +64 -63
- data/third_party/boringssl/crypto/rsa/rsa.c +50 -28
- data/third_party/boringssl/crypto/rsa/rsa_asn1.c +8 -16
- data/third_party/boringssl/crypto/rsa/rsa_impl.c +134 -122
- data/third_party/boringssl/crypto/sha/sha256.c +2 -2
- data/third_party/boringssl/crypto/sha/sha512.c +7 -7
- data/third_party/boringssl/crypto/stack/stack.c +13 -22
- data/third_party/boringssl/crypto/thread.c +21 -12
- data/third_party/boringssl/crypto/thread_none.c +6 -2
- data/third_party/boringssl/crypto/thread_pthread.c +16 -7
- data/third_party/boringssl/crypto/thread_win.c +38 -85
- data/third_party/boringssl/crypto/x509/a_sign.c +3 -3
- data/third_party/boringssl/crypto/x509/a_strex.c +1 -1
- data/third_party/boringssl/crypto/x509/a_verify.c +2 -2
- data/third_party/boringssl/crypto/{evp → x509}/algorithm.c +37 -53
- data/third_party/boringssl/crypto/x509/asn1_gen.c +1 -2
- data/third_party/boringssl/crypto/x509/by_dir.c +6 -6
- data/third_party/boringssl/crypto/x509/internal.h +66 -0
- data/third_party/boringssl/crypto/x509/rsa_pss.c +385 -0
- data/third_party/boringssl/crypto/x509/t_x509.c +10 -12
- data/third_party/boringssl/crypto/x509/x509.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_att.c +9 -3
- data/third_party/boringssl/crypto/x509/x509_lu.c +34 -44
- data/third_party/boringssl/crypto/x509/x509_obj.c +19 -2
- data/third_party/boringssl/crypto/x509/x509_r2x.c +9 -5
- data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_txt.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_vfy.c +63 -32
- data/third_party/boringssl/crypto/x509/x509_vpm.c +29 -18
- data/third_party/boringssl/crypto/x509/x509cset.c +2 -1
- data/third_party/boringssl/crypto/x509/x_crl.c +2 -2
- data/third_party/boringssl/crypto/x509/x_name.c +14 -17
- data/third_party/boringssl/crypto/x509/x_pubkey.c +10 -7
- data/third_party/boringssl/crypto/x509/x_x509.c +67 -6
- data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -2
- data/third_party/boringssl/crypto/x509v3/pcy_tree.c +2 -1
- data/third_party/boringssl/crypto/x509v3/v3_conf.c +4 -3
- data/third_party/boringssl/crypto/x509v3/v3_cpols.c +5 -0
- data/third_party/boringssl/crypto/x509v3/v3_prn.c +0 -3
- data/third_party/boringssl/crypto/x509v3/v3_purp.c +2 -2
- data/third_party/boringssl/crypto/x509v3/v3_utl.c +2 -1
- data/third_party/boringssl/include/openssl/aead.h +72 -73
- data/third_party/boringssl/include/openssl/arm_arch.h +0 -6
- data/third_party/boringssl/include/openssl/asn1.h +103 -235
- data/third_party/boringssl/include/openssl/asn1_mac.h +17 -74
- data/third_party/boringssl/include/openssl/asn1t.h +1 -11
- data/third_party/boringssl/include/openssl/base.h +145 -3
- data/third_party/boringssl/include/openssl/base64.h +20 -17
- data/third_party/boringssl/include/openssl/bio.h +59 -34
- data/third_party/boringssl/include/openssl/bn.h +118 -51
- data/third_party/boringssl/include/openssl/buf.h +15 -0
- data/third_party/boringssl/include/openssl/bytestring.h +52 -4
- data/third_party/boringssl/include/openssl/chacha.h +2 -2
- data/third_party/boringssl/include/openssl/cipher.h +18 -1
- data/third_party/boringssl/include/openssl/cmac.h +11 -0
- data/third_party/boringssl/include/openssl/conf.h +13 -2
- data/third_party/boringssl/include/openssl/cpu.h +20 -23
- data/third_party/boringssl/include/openssl/crypto.h +22 -1
- data/third_party/boringssl/include/openssl/curve25519.h +96 -4
- data/third_party/boringssl/include/openssl/dh.h +71 -16
- data/third_party/boringssl/include/openssl/digest.h +38 -11
- data/third_party/boringssl/include/openssl/dsa.h +40 -4
- data/third_party/boringssl/include/openssl/ec.h +44 -18
- data/third_party/boringssl/include/openssl/ec_key.h +27 -6
- data/third_party/boringssl/include/openssl/ecdsa.h +11 -0
- data/third_party/boringssl/include/openssl/engine.h +11 -0
- data/third_party/boringssl/include/openssl/evp.h +52 -88
- data/third_party/boringssl/include/openssl/hkdf.h +24 -4
- data/third_party/boringssl/include/openssl/hmac.h +20 -6
- data/third_party/boringssl/include/openssl/md4.h +4 -0
- data/third_party/boringssl/include/openssl/mem.h +19 -0
- data/third_party/boringssl/include/openssl/newhope.h +158 -0
- data/third_party/boringssl/include/openssl/nid.h +4166 -0
- data/third_party/boringssl/include/openssl/obj.h +31 -3
- data/third_party/boringssl/include/openssl/obj_mac.h +17 -4143
- data/third_party/boringssl/include/openssl/{opensslfeatures.h → opensslconf.h} +3 -3
- data/third_party/boringssl/include/openssl/pem.h +5 -0
- data/third_party/boringssl/include/openssl/pkcs8.h +12 -0
- data/third_party/boringssl/include/openssl/rand.h +6 -0
- data/third_party/boringssl/include/openssl/rc4.h +6 -0
- data/third_party/boringssl/{crypto/dh/internal.h → include/openssl/ripemd.h} +38 -11
- data/third_party/boringssl/include/openssl/rsa.h +127 -65
- data/third_party/boringssl/include/openssl/sha.h +14 -10
- data/third_party/boringssl/include/openssl/ssl.h +561 -275
- data/third_party/boringssl/include/openssl/ssl3.h +18 -25
- data/third_party/boringssl/include/openssl/stack.h +2 -4
- data/third_party/boringssl/include/openssl/stack_macros.h +321 -353
- data/third_party/boringssl/include/openssl/thread.h +31 -13
- data/third_party/boringssl/include/openssl/time_support.h +1 -0
- data/third_party/boringssl/include/openssl/tls1.h +37 -33
- data/third_party/boringssl/include/openssl/x509.h +69 -26
- data/third_party/boringssl/include/openssl/x509_vfy.h +12 -10
- data/third_party/boringssl/include/openssl/x509v3.h +23 -2
- data/third_party/boringssl/ssl/custom_extensions.c +3 -5
- data/third_party/boringssl/ssl/d1_both.c +463 -499
- data/third_party/boringssl/ssl/d1_lib.c +38 -109
- data/third_party/boringssl/ssl/d1_pkt.c +173 -334
- data/third_party/boringssl/ssl/d1_srtp.c +20 -18
- data/third_party/boringssl/ssl/{d1_meth.c → dtls_method.c} +88 -15
- data/third_party/boringssl/ssl/dtls_record.c +27 -26
- data/third_party/boringssl/ssl/{s3_clnt.c → handshake_client.c} +816 -904
- data/third_party/boringssl/ssl/handshake_server.c +1932 -0
- data/third_party/boringssl/ssl/internal.h +712 -439
- data/third_party/boringssl/ssl/s3_both.c +445 -257
- data/third_party/boringssl/ssl/s3_enc.c +53 -36
- data/third_party/boringssl/ssl/s3_lib.c +23 -268
- data/third_party/boringssl/ssl/s3_pkt.c +168 -364
- data/third_party/boringssl/ssl/ssl_aead_ctx.c +46 -17
- data/third_party/boringssl/ssl/ssl_asn1.c +56 -26
- data/third_party/boringssl/ssl/ssl_buffer.c +16 -24
- data/third_party/boringssl/ssl/ssl_cert.c +324 -49
- data/third_party/boringssl/ssl/ssl_cipher.c +205 -150
- data/third_party/boringssl/ssl/ssl_ecdh.c +287 -51
- data/third_party/boringssl/ssl/ssl_file.c +21 -68
- data/third_party/boringssl/ssl/ssl_lib.c +881 -510
- data/third_party/boringssl/ssl/ssl_rsa.c +404 -34
- data/third_party/boringssl/ssl/ssl_session.c +324 -103
- data/third_party/boringssl/ssl/ssl_stat.c +6 -88
- data/third_party/boringssl/ssl/t1_enc.c +23 -39
- data/third_party/boringssl/ssl/t1_lib.c +1120 -622
- data/third_party/boringssl/ssl/tls13_both.c +440 -0
- data/third_party/boringssl/ssl/tls13_client.c +682 -0
- data/third_party/boringssl/ssl/tls13_enc.c +391 -0
- data/third_party/boringssl/ssl/tls13_server.c +672 -0
- data/third_party/boringssl/ssl/{s3_meth.c → tls_method.c} +100 -21
- data/third_party/boringssl/ssl/tls_record.c +159 -77
- data/third_party/nanopb/pb.h +60 -28
- data/third_party/nanopb/pb_decode.c +120 -92
- data/third_party/nanopb/pb_decode.h +3 -3
- data/third_party/nanopb/pb_encode.c +73 -67
- data/third_party/nanopb/pb_encode.h +4 -4
- metadata +155 -89
- data/include/grpc/impl/codegen/byte_buffer.h +0 -122
- data/include/grpc/impl/codegen/log.h +0 -118
- data/include/grpc/impl/codegen/time.h +0 -130
- data/src/core/ext/client_config/client_channel.c +0 -593
- data/src/core/ext/client_config/subchannel_call_holder.c +0 -272
- data/src/core/ext/client_config/subchannel_call_holder.h +0 -99
- data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +0 -2046
- data/src/core/lib/iomgr/workqueue_posix.c +0 -151
- data/src/core/lib/security/transport/handshake.c +0 -368
- data/third_party/boringssl/crypto/asn1/a_bytes.c +0 -308
- data/third_party/boringssl/crypto/asn1/bio_asn1.c +0 -477
- data/third_party/boringssl/crypto/asn1/bio_ndef.c +0 -251
- data/third_party/boringssl/crypto/asn1/t_pkey.c +0 -110
- data/third_party/boringssl/crypto/asn1/tasn_prn.c +0 -596
- data/third_party/boringssl/crypto/chacha/chacha_vec.c +0 -328
- data/third_party/boringssl/crypto/directory.h +0 -66
- data/third_party/boringssl/crypto/directory_posix.c +0 -108
- data/third_party/boringssl/crypto/directory_win.c +0 -144
- data/third_party/boringssl/crypto/test/scoped_types.h +0 -140
- data/third_party/boringssl/include/openssl/pqueue.h +0 -146
- data/third_party/boringssl/ssl/d1_clnt.c +0 -561
- data/third_party/boringssl/ssl/d1_srvr.c +0 -476
- data/third_party/boringssl/ssl/pqueue/pqueue.c +0 -197
- data/third_party/boringssl/ssl/s3_srvr.c +0 -2272
- data/third_party/boringssl/ssl/test/async_bio.h +0 -45
- data/third_party/boringssl/ssl/test/packeted_bio.h +0 -44
- data/third_party/boringssl/ssl/test/test_config.h +0 -110
@@ -0,0 +1,63 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2016, Google Inc.
|
4
|
+
* All rights reserved.
|
5
|
+
*
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
7
|
+
* modification, are permitted provided that the following conditions are
|
8
|
+
* met:
|
9
|
+
*
|
10
|
+
* * Redistributions of source code must retain the above copyright
|
11
|
+
* notice, this list of conditions and the following disclaimer.
|
12
|
+
* * Redistributions in binary form must reproduce the above
|
13
|
+
* copyright notice, this list of conditions and the following disclaimer
|
14
|
+
* in the documentation and/or other materials provided with the
|
15
|
+
* distribution.
|
16
|
+
* * Neither the name of Google Inc. nor the names of its
|
17
|
+
* contributors may be used to endorse or promote products derived from
|
18
|
+
* this software without specific prior written permission.
|
19
|
+
*
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
21
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
22
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
23
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
24
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
25
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
26
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
27
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
28
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
29
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
30
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
*
|
32
|
+
*/
|
33
|
+
|
34
|
+
/* Census-internal resource definition and manipluation functions. */
|
35
|
+
#ifndef GRPC_CORE_EXT_CENSUS_RESOURCE_H
|
36
|
+
#define GRPC_CORE_EXT_CENSUS_RESOURCE_H
|
37
|
+
|
38
|
+
#include <grpc/grpc.h>
|
39
|
+
#include "src/core/ext/census/gen/census.pb.h"
|
40
|
+
|
41
|
+
/* Internal representation of a resource. */
|
42
|
+
typedef struct {
|
43
|
+
char *name;
|
44
|
+
char *description;
|
45
|
+
int32_t prefix;
|
46
|
+
int n_numerators;
|
47
|
+
google_census_Resource_BasicUnit *numerators;
|
48
|
+
int n_denominators;
|
49
|
+
google_census_Resource_BasicUnit *denominators;
|
50
|
+
} resource;
|
51
|
+
|
52
|
+
/* Initialize and shutdown the resources subsystem. */
|
53
|
+
void initialize_resources(void);
|
54
|
+
void shutdown_resources(void);
|
55
|
+
|
56
|
+
/* Add a new resource, given a proposed resource structure. Returns the
|
57
|
+
resource ID, or -ve on failure.
|
58
|
+
TODO(aveitch): this function exists to support addition of the base
|
59
|
+
resources. It should be removed when we have the ability to add resources
|
60
|
+
from configuration files. */
|
61
|
+
int32_t define_resource(const resource *base);
|
62
|
+
|
63
|
+
#endif /* GRPC_CORE_EXT_CENSUS_RESOURCE_H */
|
@@ -0,0 +1,86 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2016, Google Inc.
|
4
|
+
* All rights reserved.
|
5
|
+
*
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
7
|
+
* modification, are permitted provided that the following conditions are
|
8
|
+
* met:
|
9
|
+
*
|
10
|
+
* * Redistributions of source code must retain the above copyright
|
11
|
+
* notice, this list of conditions and the following disclaimer.
|
12
|
+
* * Redistributions in binary form must reproduce the above
|
13
|
+
* copyright notice, this list of conditions and the following disclaimer
|
14
|
+
* in the documentation and/or other materials provided with the
|
15
|
+
* distribution.
|
16
|
+
* * Neither the name of Google Inc. nor the names of its
|
17
|
+
* contributors may be used to endorse or promote products derived from
|
18
|
+
* this software without specific prior written permission.
|
19
|
+
*
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
21
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
22
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
23
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
24
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
25
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
26
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
27
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
28
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
29
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
30
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
*
|
32
|
+
*/
|
33
|
+
|
34
|
+
#include "src/core/ext/census/trace_context.h"
|
35
|
+
|
36
|
+
#include <grpc/census.h>
|
37
|
+
#include <grpc/support/log.h>
|
38
|
+
#include <stdbool.h>
|
39
|
+
|
40
|
+
#include "third_party/nanopb/pb_decode.h"
|
41
|
+
#include "third_party/nanopb/pb_encode.h"
|
42
|
+
|
43
|
+
// This function assumes the TraceContext is valid.
|
44
|
+
size_t encode_trace_context(google_trace_TraceContext *ctxt, uint8_t *buffer,
|
45
|
+
const size_t buf_size) {
|
46
|
+
// Create a stream that will write to our buffer.
|
47
|
+
pb_ostream_t stream = pb_ostream_from_buffer(buffer, buf_size);
|
48
|
+
|
49
|
+
// encode message
|
50
|
+
bool status = pb_encode(&stream, google_trace_TraceContext_fields, ctxt);
|
51
|
+
|
52
|
+
if (!status) {
|
53
|
+
gpr_log(GPR_DEBUG, "TraceContext encoding failed: %s",
|
54
|
+
PB_GET_ERROR(&stream));
|
55
|
+
return 0;
|
56
|
+
}
|
57
|
+
|
58
|
+
return stream.bytes_written;
|
59
|
+
}
|
60
|
+
|
61
|
+
bool decode_trace_context(google_trace_TraceContext *ctxt, uint8_t *buffer,
|
62
|
+
const size_t nbytes) {
|
63
|
+
// Create a stream that reads nbytes from the buffer.
|
64
|
+
pb_istream_t stream = pb_istream_from_buffer(buffer, nbytes);
|
65
|
+
|
66
|
+
// decode message
|
67
|
+
bool status = pb_decode(&stream, google_trace_TraceContext_fields, ctxt);
|
68
|
+
|
69
|
+
if (!status) {
|
70
|
+
gpr_log(GPR_DEBUG, "TraceContext decoding failed: %s",
|
71
|
+
PB_GET_ERROR(&stream));
|
72
|
+
return false;
|
73
|
+
}
|
74
|
+
|
75
|
+
// check fields
|
76
|
+
if (!ctxt->has_trace_id) {
|
77
|
+
gpr_log(GPR_DEBUG, "Invalid TraceContext: missing trace_id");
|
78
|
+
return false;
|
79
|
+
}
|
80
|
+
if (!ctxt->has_span_id) {
|
81
|
+
gpr_log(GPR_DEBUG, "Invalid TraceContext: missing span_id");
|
82
|
+
return false;
|
83
|
+
}
|
84
|
+
|
85
|
+
return true;
|
86
|
+
}
|
@@ -0,0 +1,68 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2016, Google Inc.
|
4
|
+
* All rights reserved.
|
5
|
+
*
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
7
|
+
* modification, are permitted provided that the following conditions are
|
8
|
+
* met:
|
9
|
+
*
|
10
|
+
* * Redistributions of source code must retain the above copyright
|
11
|
+
* notice, this list of conditions and the following disclaimer.
|
12
|
+
* * Redistributions in binary form must reproduce the above
|
13
|
+
* copyright notice, this list of conditions and the following disclaimer
|
14
|
+
* in the documentation and/or other materials provided with the
|
15
|
+
* distribution.
|
16
|
+
* * Neither the name of Google Inc. nor the names of its
|
17
|
+
* contributors may be used to endorse or promote products derived from
|
18
|
+
* this software without specific prior written permission.
|
19
|
+
*
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
21
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
22
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
23
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
24
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
25
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
26
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
27
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
28
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
29
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
30
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
*
|
32
|
+
*/
|
33
|
+
|
34
|
+
/* Functions for manipulating trace contexts as defined in
|
35
|
+
src/proto/census/trace.proto */
|
36
|
+
#ifndef GRPC_CORE_EXT_CENSUS_TRACE_CONTEXT_H
|
37
|
+
#define GRPC_CORE_EXT_CENSUS_TRACE_CONTEXT_H
|
38
|
+
|
39
|
+
#include "src/core/ext/census/gen/trace_context.pb.h"
|
40
|
+
|
41
|
+
/* Maximum number of bytes required to encode a TraceContext (31)
|
42
|
+
1 byte for trace_id field
|
43
|
+
1 byte for trace_id length
|
44
|
+
1 byte for trace_id.hi field
|
45
|
+
8 bytes for trace_id.hi (uint64_t)
|
46
|
+
1 byte for trace_id.lo field
|
47
|
+
8 bytes for trace_id.lo (uint64_t)
|
48
|
+
1 byte for span_id field
|
49
|
+
8 bytes for span_id (uint64_t)
|
50
|
+
1 byte for is_sampled field
|
51
|
+
1 byte for is_sampled (bool) */
|
52
|
+
#define TRACE_MAX_CONTEXT_SIZE 31
|
53
|
+
|
54
|
+
/* Encode a trace context (ctxt) into proto format to the buffer provided. The
|
55
|
+
size of buffer must be at least TRACE_MAX_CONTEXT_SIZE. On success, returns the
|
56
|
+
number of bytes successfully encoded into buffer. On failure, returns 0. */
|
57
|
+
size_t encode_trace_context(google_trace_TraceContext *ctxt, uint8_t *buffer,
|
58
|
+
const size_t buf_size);
|
59
|
+
|
60
|
+
/* Decode a proto-encoded TraceContext from the provided buffer into the
|
61
|
+
TraceContext structure (ctxt). The function expects to be supplied the number
|
62
|
+
of bytes to be read from buffer (nbytes). This function will also validate that
|
63
|
+
the TraceContext has a span_id and a trace_id, and will return false if either
|
64
|
+
of these do not exist. On success, returns true and false otherwise. */
|
65
|
+
bool decode_trace_context(google_trace_TraceContext *ctxt, uint8_t *buffer,
|
66
|
+
const size_t nbytes);
|
67
|
+
|
68
|
+
#endif /* GRPC_CORE_EXT_CENSUS_TRACE_CONTEXT_H */
|
@@ -31,15 +31,21 @@
|
|
31
31
|
*
|
32
32
|
*/
|
33
33
|
|
34
|
+
//#include "src/core/ext/census/tracing.h"
|
35
|
+
|
34
36
|
#include <grpc/census.h>
|
37
|
+
#include <stdlib.h>
|
35
38
|
|
36
39
|
/* TODO(aveitch): These are all placeholder implementations. */
|
37
40
|
|
38
41
|
int census_trace_mask(const census_context *context) {
|
42
|
+
abort();
|
39
43
|
return CENSUS_TRACE_MASK_NONE;
|
40
44
|
}
|
41
45
|
|
42
|
-
void census_set_trace_mask(int trace_mask) {}
|
46
|
+
void census_set_trace_mask(int trace_mask) { abort(); }
|
43
47
|
|
44
48
|
void census_trace_print(census_context *context, uint32_t type,
|
45
|
-
const char *buffer, size_t n) {
|
49
|
+
const char *buffer, size_t n) {
|
50
|
+
abort();
|
51
|
+
}
|
@@ -36,7 +36,7 @@
|
|
36
36
|
#include <grpc/support/alloc.h>
|
37
37
|
#include <grpc/support/log.h>
|
38
38
|
|
39
|
-
#include "src/core/ext/
|
39
|
+
#include "src/core/ext/client_channel/client_channel.h"
|
40
40
|
#include "src/core/lib/iomgr/timer.h"
|
41
41
|
#include "src/core/lib/surface/api_trace.h"
|
42
42
|
#include "src/core/lib/surface/completion_queue.h"
|
@@ -59,7 +59,7 @@ grpc_connectivity_state grpc_channel_check_connectivity_state(
|
|
59
59
|
}
|
60
60
|
gpr_log(GPR_ERROR,
|
61
61
|
"grpc_channel_check_connectivity_state called on something that is "
|
62
|
-
"not a
|
62
|
+
"not a client channel, but '%s'",
|
63
63
|
client_channel_elem->filter->name);
|
64
64
|
grpc_exec_ctx_finish(&exec_ctx);
|
65
65
|
return GRPC_CHANNEL_SHUTDOWN;
|
@@ -76,6 +76,7 @@ typedef struct {
|
|
76
76
|
gpr_mu mu;
|
77
77
|
callback_phase phase;
|
78
78
|
grpc_closure on_complete;
|
79
|
+
grpc_closure on_timeout;
|
79
80
|
grpc_timer alarm;
|
80
81
|
grpc_connectivity_state state;
|
81
82
|
grpc_completion_queue *cq;
|
@@ -198,7 +199,10 @@ void grpc_channel_watch_connectivity_state(
|
|
198
199
|
grpc_cq_begin_op(cq, tag);
|
199
200
|
|
200
201
|
gpr_mu_init(&w->mu);
|
201
|
-
grpc_closure_init(&w->on_complete, watch_complete, w
|
202
|
+
grpc_closure_init(&w->on_complete, watch_complete, w,
|
203
|
+
grpc_schedule_on_exec_ctx);
|
204
|
+
grpc_closure_init(&w->on_timeout, timeout_complete, w,
|
205
|
+
grpc_schedule_on_exec_ctx);
|
202
206
|
w->phase = WAITING;
|
203
207
|
w->state = last_observed_state;
|
204
208
|
w->cq = cq;
|
@@ -207,7 +211,7 @@ void grpc_channel_watch_connectivity_state(
|
|
207
211
|
|
208
212
|
grpc_timer_init(&exec_ctx, &w->alarm,
|
209
213
|
gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC),
|
210
|
-
|
214
|
+
&w->on_timeout, gpr_now(GPR_CLOCK_MONOTONIC));
|
211
215
|
|
212
216
|
if (client_channel_elem->filter == &grpc_client_channel_filter) {
|
213
217
|
GRPC_CHANNEL_INTERNAL_REF(channel, "watch_channel_connectivity");
|
@@ -0,0 +1,1218 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2015, Google Inc.
|
4
|
+
* All rights reserved.
|
5
|
+
*
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
7
|
+
* modification, are permitted provided that the following conditions are
|
8
|
+
* met:
|
9
|
+
*
|
10
|
+
* * Redistributions of source code must retain the above copyright
|
11
|
+
* notice, this list of conditions and the following disclaimer.
|
12
|
+
* * Redistributions in binary form must reproduce the above
|
13
|
+
* copyright notice, this list of conditions and the following disclaimer
|
14
|
+
* in the documentation and/or other materials provided with the
|
15
|
+
* distribution.
|
16
|
+
* * Neither the name of Google Inc. nor the names of its
|
17
|
+
* contributors may be used to endorse or promote products derived from
|
18
|
+
* this software without specific prior written permission.
|
19
|
+
*
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
21
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
22
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
23
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
24
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
25
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
26
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
27
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
28
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
29
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
30
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
*
|
32
|
+
*/
|
33
|
+
|
34
|
+
#include "src/core/ext/client_channel/client_channel.h"
|
35
|
+
|
36
|
+
#include <stdbool.h>
|
37
|
+
#include <stdio.h>
|
38
|
+
#include <string.h>
|
39
|
+
|
40
|
+
#include <grpc/support/alloc.h>
|
41
|
+
#include <grpc/support/log.h>
|
42
|
+
#include <grpc/support/string_util.h>
|
43
|
+
#include <grpc/support/sync.h>
|
44
|
+
#include <grpc/support/useful.h>
|
45
|
+
|
46
|
+
#include "src/core/ext/client_channel/lb_policy_registry.h"
|
47
|
+
#include "src/core/ext/client_channel/resolver_registry.h"
|
48
|
+
#include "src/core/ext/client_channel/subchannel.h"
|
49
|
+
#include "src/core/lib/channel/channel_args.h"
|
50
|
+
#include "src/core/lib/channel/connected_channel.h"
|
51
|
+
#include "src/core/lib/channel/deadline_filter.h"
|
52
|
+
#include "src/core/lib/iomgr/iomgr.h"
|
53
|
+
#include "src/core/lib/iomgr/polling_entity.h"
|
54
|
+
#include "src/core/lib/profiling/timers.h"
|
55
|
+
#include "src/core/lib/support/string.h"
|
56
|
+
#include "src/core/lib/surface/channel.h"
|
57
|
+
#include "src/core/lib/transport/connectivity_state.h"
|
58
|
+
#include "src/core/lib/transport/metadata.h"
|
59
|
+
#include "src/core/lib/transport/metadata_batch.h"
|
60
|
+
#include "src/core/lib/transport/service_config.h"
|
61
|
+
#include "src/core/lib/transport/static_metadata.h"
|
62
|
+
|
63
|
+
/* Client channel implementation */
|
64
|
+
|
65
|
+
/*************************************************************************
|
66
|
+
* METHOD-CONFIG TABLE
|
67
|
+
*/
|
68
|
+
|
69
|
+
typedef enum {
|
70
|
+
WAIT_FOR_READY_UNSET,
|
71
|
+
WAIT_FOR_READY_FALSE,
|
72
|
+
WAIT_FOR_READY_TRUE
|
73
|
+
} wait_for_ready_value;
|
74
|
+
|
75
|
+
typedef struct method_parameters {
|
76
|
+
gpr_timespec timeout;
|
77
|
+
wait_for_ready_value wait_for_ready;
|
78
|
+
} method_parameters;
|
79
|
+
|
80
|
+
static void *method_parameters_copy(void *value) {
|
81
|
+
void *new_value = gpr_malloc(sizeof(method_parameters));
|
82
|
+
memcpy(new_value, value, sizeof(method_parameters));
|
83
|
+
return new_value;
|
84
|
+
}
|
85
|
+
|
86
|
+
static void method_parameters_free(grpc_exec_ctx *exec_ctx, void *p) {
|
87
|
+
gpr_free(p);
|
88
|
+
}
|
89
|
+
|
90
|
+
static const grpc_mdstr_hash_table_vtable method_parameters_vtable = {
|
91
|
+
method_parameters_free, method_parameters_copy};
|
92
|
+
|
93
|
+
static void *method_parameters_create_from_json(const grpc_json *json) {
|
94
|
+
wait_for_ready_value wait_for_ready = WAIT_FOR_READY_UNSET;
|
95
|
+
gpr_timespec timeout = {0, 0, GPR_TIMESPAN};
|
96
|
+
for (grpc_json *field = json->child; field != NULL; field = field->next) {
|
97
|
+
if (field->key == NULL) continue;
|
98
|
+
if (strcmp(field->key, "waitForReady") == 0) {
|
99
|
+
if (wait_for_ready != WAIT_FOR_READY_UNSET) return NULL; // Duplicate.
|
100
|
+
if (field->type != GRPC_JSON_TRUE && field->type != GRPC_JSON_FALSE) {
|
101
|
+
return NULL;
|
102
|
+
}
|
103
|
+
wait_for_ready = field->type == GRPC_JSON_TRUE ? WAIT_FOR_READY_TRUE
|
104
|
+
: WAIT_FOR_READY_FALSE;
|
105
|
+
} else if (strcmp(field->key, "timeout") == 0) {
|
106
|
+
if (timeout.tv_sec > 0 || timeout.tv_nsec > 0) return NULL; // Duplicate.
|
107
|
+
if (field->type != GRPC_JSON_STRING) return NULL;
|
108
|
+
size_t len = strlen(field->value);
|
109
|
+
if (field->value[len - 1] != 's') return NULL;
|
110
|
+
char *buf = gpr_strdup(field->value);
|
111
|
+
buf[len - 1] = '\0'; // Remove trailing 's'.
|
112
|
+
char *decimal_point = strchr(buf, '.');
|
113
|
+
if (decimal_point != NULL) {
|
114
|
+
*decimal_point = '\0';
|
115
|
+
timeout.tv_nsec = gpr_parse_nonnegative_int(decimal_point + 1);
|
116
|
+
if (timeout.tv_nsec == -1) {
|
117
|
+
gpr_free(buf);
|
118
|
+
return NULL;
|
119
|
+
}
|
120
|
+
// There should always be exactly 3, 6, or 9 fractional digits.
|
121
|
+
int multiplier = 1;
|
122
|
+
switch (strlen(decimal_point + 1)) {
|
123
|
+
case 9:
|
124
|
+
break;
|
125
|
+
case 6:
|
126
|
+
multiplier *= 1000;
|
127
|
+
break;
|
128
|
+
case 3:
|
129
|
+
multiplier *= 1000000;
|
130
|
+
break;
|
131
|
+
default: // Unsupported number of digits.
|
132
|
+
gpr_free(buf);
|
133
|
+
return NULL;
|
134
|
+
}
|
135
|
+
timeout.tv_nsec *= multiplier;
|
136
|
+
}
|
137
|
+
timeout.tv_sec = gpr_parse_nonnegative_int(buf);
|
138
|
+
if (timeout.tv_sec == -1) return NULL;
|
139
|
+
gpr_free(buf);
|
140
|
+
}
|
141
|
+
}
|
142
|
+
method_parameters *value = gpr_malloc(sizeof(method_parameters));
|
143
|
+
value->timeout = timeout;
|
144
|
+
value->wait_for_ready = wait_for_ready;
|
145
|
+
return value;
|
146
|
+
}
|
147
|
+
|
148
|
+
/*************************************************************************
|
149
|
+
* CHANNEL-WIDE FUNCTIONS
|
150
|
+
*/
|
151
|
+
|
152
|
+
typedef struct client_channel_channel_data {
|
153
|
+
/** resolver for this channel */
|
154
|
+
grpc_resolver *resolver;
|
155
|
+
/** have we started resolving this channel */
|
156
|
+
bool started_resolving;
|
157
|
+
/** client channel factory */
|
158
|
+
grpc_client_channel_factory *client_channel_factory;
|
159
|
+
|
160
|
+
/** mutex protecting all variables below in this data structure */
|
161
|
+
gpr_mu mu;
|
162
|
+
/** currently active load balancer */
|
163
|
+
char *lb_policy_name;
|
164
|
+
grpc_lb_policy *lb_policy;
|
165
|
+
/** service config in JSON form */
|
166
|
+
char *service_config_json;
|
167
|
+
/** maps method names to method_parameters structs */
|
168
|
+
grpc_mdstr_hash_table *method_params_table;
|
169
|
+
/** incoming resolver result - set by resolver.next() */
|
170
|
+
grpc_channel_args *resolver_result;
|
171
|
+
/** a list of closures that are all waiting for config to come in */
|
172
|
+
grpc_closure_list waiting_for_config_closures;
|
173
|
+
/** resolver callback */
|
174
|
+
grpc_closure on_resolver_result_changed;
|
175
|
+
/** connectivity state being tracked */
|
176
|
+
grpc_connectivity_state_tracker state_tracker;
|
177
|
+
/** when an lb_policy arrives, should we try to exit idle */
|
178
|
+
bool exit_idle_when_lb_policy_arrives;
|
179
|
+
/** owning stack */
|
180
|
+
grpc_channel_stack *owning_stack;
|
181
|
+
/** interested parties (owned) */
|
182
|
+
grpc_pollset_set *interested_parties;
|
183
|
+
} channel_data;
|
184
|
+
|
185
|
+
/** We create one watcher for each new lb_policy that is returned from a
|
186
|
+
resolver, to watch for state changes from the lb_policy. When a state
|
187
|
+
change is seen, we update the channel, and create a new watcher. */
|
188
|
+
typedef struct {
|
189
|
+
channel_data *chand;
|
190
|
+
grpc_closure on_changed;
|
191
|
+
grpc_connectivity_state state;
|
192
|
+
grpc_lb_policy *lb_policy;
|
193
|
+
} lb_policy_connectivity_watcher;
|
194
|
+
|
195
|
+
static void watch_lb_policy(grpc_exec_ctx *exec_ctx, channel_data *chand,
|
196
|
+
grpc_lb_policy *lb_policy,
|
197
|
+
grpc_connectivity_state current_state);
|
198
|
+
|
199
|
+
static void set_channel_connectivity_state_locked(grpc_exec_ctx *exec_ctx,
|
200
|
+
channel_data *chand,
|
201
|
+
grpc_connectivity_state state,
|
202
|
+
grpc_error *error,
|
203
|
+
const char *reason) {
|
204
|
+
if ((state == GRPC_CHANNEL_TRANSIENT_FAILURE ||
|
205
|
+
state == GRPC_CHANNEL_SHUTDOWN) &&
|
206
|
+
chand->lb_policy != NULL) {
|
207
|
+
/* cancel picks with wait_for_ready=false */
|
208
|
+
grpc_lb_policy_cancel_picks(
|
209
|
+
exec_ctx, chand->lb_policy,
|
210
|
+
/* mask= */ GRPC_INITIAL_METADATA_WAIT_FOR_READY,
|
211
|
+
/* check= */ 0, GRPC_ERROR_REF(error));
|
212
|
+
}
|
213
|
+
grpc_connectivity_state_set(exec_ctx, &chand->state_tracker, state, error,
|
214
|
+
reason);
|
215
|
+
}
|
216
|
+
|
217
|
+
static void on_lb_policy_state_changed_locked(grpc_exec_ctx *exec_ctx,
|
218
|
+
lb_policy_connectivity_watcher *w,
|
219
|
+
grpc_error *error) {
|
220
|
+
grpc_connectivity_state publish_state = w->state;
|
221
|
+
/* check if the notification is for a stale policy */
|
222
|
+
if (w->lb_policy != w->chand->lb_policy) return;
|
223
|
+
|
224
|
+
if (publish_state == GRPC_CHANNEL_SHUTDOWN && w->chand->resolver != NULL) {
|
225
|
+
publish_state = GRPC_CHANNEL_TRANSIENT_FAILURE;
|
226
|
+
grpc_resolver_channel_saw_error(exec_ctx, w->chand->resolver);
|
227
|
+
GRPC_LB_POLICY_UNREF(exec_ctx, w->chand->lb_policy, "channel");
|
228
|
+
w->chand->lb_policy = NULL;
|
229
|
+
}
|
230
|
+
set_channel_connectivity_state_locked(exec_ctx, w->chand, publish_state,
|
231
|
+
GRPC_ERROR_REF(error), "lb_changed");
|
232
|
+
if (w->state != GRPC_CHANNEL_SHUTDOWN) {
|
233
|
+
watch_lb_policy(exec_ctx, w->chand, w->lb_policy, w->state);
|
234
|
+
}
|
235
|
+
}
|
236
|
+
|
237
|
+
static void on_lb_policy_state_changed(grpc_exec_ctx *exec_ctx, void *arg,
|
238
|
+
grpc_error *error) {
|
239
|
+
lb_policy_connectivity_watcher *w = arg;
|
240
|
+
|
241
|
+
gpr_mu_lock(&w->chand->mu);
|
242
|
+
on_lb_policy_state_changed_locked(exec_ctx, w, error);
|
243
|
+
gpr_mu_unlock(&w->chand->mu);
|
244
|
+
|
245
|
+
GRPC_CHANNEL_STACK_UNREF(exec_ctx, w->chand->owning_stack, "watch_lb_policy");
|
246
|
+
gpr_free(w);
|
247
|
+
}
|
248
|
+
|
249
|
+
static void watch_lb_policy(grpc_exec_ctx *exec_ctx, channel_data *chand,
|
250
|
+
grpc_lb_policy *lb_policy,
|
251
|
+
grpc_connectivity_state current_state) {
|
252
|
+
lb_policy_connectivity_watcher *w = gpr_malloc(sizeof(*w));
|
253
|
+
GRPC_CHANNEL_STACK_REF(chand->owning_stack, "watch_lb_policy");
|
254
|
+
|
255
|
+
w->chand = chand;
|
256
|
+
grpc_closure_init(&w->on_changed, on_lb_policy_state_changed, w,
|
257
|
+
grpc_schedule_on_exec_ctx);
|
258
|
+
w->state = current_state;
|
259
|
+
w->lb_policy = lb_policy;
|
260
|
+
grpc_lb_policy_notify_on_state_change(exec_ctx, lb_policy, &w->state,
|
261
|
+
&w->on_changed);
|
262
|
+
}
|
263
|
+
|
264
|
+
static void on_resolver_result_changed(grpc_exec_ctx *exec_ctx, void *arg,
|
265
|
+
grpc_error *error) {
|
266
|
+
channel_data *chand = arg;
|
267
|
+
char *lb_policy_name = NULL;
|
268
|
+
grpc_lb_policy *lb_policy = NULL;
|
269
|
+
grpc_lb_policy *old_lb_policy;
|
270
|
+
grpc_mdstr_hash_table *method_params_table = NULL;
|
271
|
+
grpc_connectivity_state state = GRPC_CHANNEL_TRANSIENT_FAILURE;
|
272
|
+
bool exit_idle = false;
|
273
|
+
grpc_error *state_error = GRPC_ERROR_CREATE("No load balancing policy");
|
274
|
+
char *service_config_json = NULL;
|
275
|
+
|
276
|
+
if (chand->resolver_result != NULL) {
|
277
|
+
// Find LB policy name.
|
278
|
+
const grpc_arg *channel_arg =
|
279
|
+
grpc_channel_args_find(chand->resolver_result, GRPC_ARG_LB_POLICY_NAME);
|
280
|
+
if (channel_arg != NULL) {
|
281
|
+
GPR_ASSERT(channel_arg->type == GRPC_ARG_STRING);
|
282
|
+
lb_policy_name = channel_arg->value.string;
|
283
|
+
}
|
284
|
+
// Special case: If all of the addresses are balancer addresses,
|
285
|
+
// assume that we should use the grpclb policy, regardless of what the
|
286
|
+
// resolver actually specified.
|
287
|
+
channel_arg =
|
288
|
+
grpc_channel_args_find(chand->resolver_result, GRPC_ARG_LB_ADDRESSES);
|
289
|
+
if (channel_arg != NULL) {
|
290
|
+
GPR_ASSERT(channel_arg->type == GRPC_ARG_POINTER);
|
291
|
+
grpc_lb_addresses *addresses = channel_arg->value.pointer.p;
|
292
|
+
bool found_backend_address = false;
|
293
|
+
for (size_t i = 0; i < addresses->num_addresses; ++i) {
|
294
|
+
if (!addresses->addresses[i].is_balancer) {
|
295
|
+
found_backend_address = true;
|
296
|
+
break;
|
297
|
+
}
|
298
|
+
}
|
299
|
+
if (!found_backend_address) {
|
300
|
+
if (lb_policy_name != NULL && strcmp(lb_policy_name, "grpclb") != 0) {
|
301
|
+
gpr_log(GPR_INFO,
|
302
|
+
"resolver requested LB policy %s but provided only balancer "
|
303
|
+
"addresses, no backend addresses -- forcing use of grpclb LB "
|
304
|
+
"policy",
|
305
|
+
lb_policy_name);
|
306
|
+
}
|
307
|
+
lb_policy_name = "grpclb";
|
308
|
+
}
|
309
|
+
}
|
310
|
+
// Use pick_first if nothing was specified and we didn't select grpclb
|
311
|
+
// above.
|
312
|
+
if (lb_policy_name == NULL) lb_policy_name = "pick_first";
|
313
|
+
// Instantiate LB policy.
|
314
|
+
grpc_lb_policy_args lb_policy_args;
|
315
|
+
lb_policy_args.args = chand->resolver_result;
|
316
|
+
lb_policy_args.client_channel_factory = chand->client_channel_factory;
|
317
|
+
lb_policy =
|
318
|
+
grpc_lb_policy_create(exec_ctx, lb_policy_name, &lb_policy_args);
|
319
|
+
if (lb_policy != NULL) {
|
320
|
+
GRPC_LB_POLICY_REF(lb_policy, "config_change");
|
321
|
+
GRPC_ERROR_UNREF(state_error);
|
322
|
+
state =
|
323
|
+
grpc_lb_policy_check_connectivity(exec_ctx, lb_policy, &state_error);
|
324
|
+
}
|
325
|
+
// Find service config.
|
326
|
+
channel_arg =
|
327
|
+
grpc_channel_args_find(chand->resolver_result, GRPC_ARG_SERVICE_CONFIG);
|
328
|
+
if (channel_arg != NULL) {
|
329
|
+
GPR_ASSERT(channel_arg->type == GRPC_ARG_STRING);
|
330
|
+
service_config_json = gpr_strdup(channel_arg->value.string);
|
331
|
+
grpc_service_config *service_config =
|
332
|
+
grpc_service_config_create(service_config_json);
|
333
|
+
if (service_config != NULL) {
|
334
|
+
method_params_table = grpc_service_config_create_method_config_table(
|
335
|
+
exec_ctx, service_config, method_parameters_create_from_json,
|
336
|
+
&method_parameters_vtable);
|
337
|
+
grpc_service_config_destroy(service_config);
|
338
|
+
}
|
339
|
+
}
|
340
|
+
// Before we clean up, save a copy of lb_policy_name, since it might
|
341
|
+
// be pointing to data inside chand->resolver_result.
|
342
|
+
// The copy will be saved in chand->lb_policy_name below.
|
343
|
+
lb_policy_name = gpr_strdup(lb_policy_name);
|
344
|
+
grpc_channel_args_destroy(exec_ctx, chand->resolver_result);
|
345
|
+
chand->resolver_result = NULL;
|
346
|
+
}
|
347
|
+
|
348
|
+
if (lb_policy != NULL) {
|
349
|
+
grpc_pollset_set_add_pollset_set(exec_ctx, lb_policy->interested_parties,
|
350
|
+
chand->interested_parties);
|
351
|
+
}
|
352
|
+
|
353
|
+
gpr_mu_lock(&chand->mu);
|
354
|
+
if (lb_policy_name != NULL) {
|
355
|
+
gpr_free(chand->lb_policy_name);
|
356
|
+
chand->lb_policy_name = lb_policy_name;
|
357
|
+
}
|
358
|
+
old_lb_policy = chand->lb_policy;
|
359
|
+
chand->lb_policy = lb_policy;
|
360
|
+
if (service_config_json != NULL) {
|
361
|
+
gpr_free(chand->service_config_json);
|
362
|
+
chand->service_config_json = service_config_json;
|
363
|
+
}
|
364
|
+
if (chand->method_params_table != NULL) {
|
365
|
+
grpc_mdstr_hash_table_unref(exec_ctx, chand->method_params_table);
|
366
|
+
}
|
367
|
+
chand->method_params_table = method_params_table;
|
368
|
+
if (lb_policy != NULL) {
|
369
|
+
grpc_closure_list_sched(exec_ctx, &chand->waiting_for_config_closures);
|
370
|
+
} else if (chand->resolver == NULL /* disconnected */) {
|
371
|
+
grpc_closure_list_fail_all(
|
372
|
+
&chand->waiting_for_config_closures,
|
373
|
+
GRPC_ERROR_CREATE_REFERENCING("Channel disconnected", &error, 1));
|
374
|
+
grpc_closure_list_sched(exec_ctx, &chand->waiting_for_config_closures);
|
375
|
+
}
|
376
|
+
if (lb_policy != NULL && chand->exit_idle_when_lb_policy_arrives) {
|
377
|
+
GRPC_LB_POLICY_REF(lb_policy, "exit_idle");
|
378
|
+
exit_idle = true;
|
379
|
+
chand->exit_idle_when_lb_policy_arrives = false;
|
380
|
+
}
|
381
|
+
|
382
|
+
if (error == GRPC_ERROR_NONE && chand->resolver) {
|
383
|
+
set_channel_connectivity_state_locked(
|
384
|
+
exec_ctx, chand, state, GRPC_ERROR_REF(state_error), "new_lb+resolver");
|
385
|
+
if (lb_policy != NULL) {
|
386
|
+
watch_lb_policy(exec_ctx, chand, lb_policy, state);
|
387
|
+
}
|
388
|
+
GRPC_CHANNEL_STACK_REF(chand->owning_stack, "resolver");
|
389
|
+
grpc_resolver_next(exec_ctx, chand->resolver, &chand->resolver_result,
|
390
|
+
&chand->on_resolver_result_changed);
|
391
|
+
gpr_mu_unlock(&chand->mu);
|
392
|
+
} else {
|
393
|
+
if (chand->resolver != NULL) {
|
394
|
+
grpc_resolver_shutdown(exec_ctx, chand->resolver);
|
395
|
+
GRPC_RESOLVER_UNREF(exec_ctx, chand->resolver, "channel");
|
396
|
+
chand->resolver = NULL;
|
397
|
+
}
|
398
|
+
grpc_error *refs[] = {error, state_error};
|
399
|
+
set_channel_connectivity_state_locked(
|
400
|
+
exec_ctx, chand, GRPC_CHANNEL_SHUTDOWN,
|
401
|
+
GRPC_ERROR_CREATE_REFERENCING("Got config after disconnection", refs,
|
402
|
+
GPR_ARRAY_SIZE(refs)),
|
403
|
+
"resolver_gone");
|
404
|
+
gpr_mu_unlock(&chand->mu);
|
405
|
+
}
|
406
|
+
|
407
|
+
if (exit_idle) {
|
408
|
+
grpc_lb_policy_exit_idle(exec_ctx, lb_policy);
|
409
|
+
GRPC_LB_POLICY_UNREF(exec_ctx, lb_policy, "exit_idle");
|
410
|
+
}
|
411
|
+
|
412
|
+
if (old_lb_policy != NULL) {
|
413
|
+
grpc_pollset_set_del_pollset_set(
|
414
|
+
exec_ctx, old_lb_policy->interested_parties, chand->interested_parties);
|
415
|
+
GRPC_LB_POLICY_UNREF(exec_ctx, old_lb_policy, "channel");
|
416
|
+
}
|
417
|
+
|
418
|
+
if (lb_policy != NULL) {
|
419
|
+
GRPC_LB_POLICY_UNREF(exec_ctx, lb_policy, "config_change");
|
420
|
+
}
|
421
|
+
|
422
|
+
GRPC_CHANNEL_STACK_UNREF(exec_ctx, chand->owning_stack, "resolver");
|
423
|
+
GRPC_ERROR_UNREF(state_error);
|
424
|
+
}
|
425
|
+
|
426
|
+
static void cc_start_transport_op(grpc_exec_ctx *exec_ctx,
|
427
|
+
grpc_channel_element *elem,
|
428
|
+
grpc_transport_op *op) {
|
429
|
+
channel_data *chand = elem->channel_data;
|
430
|
+
|
431
|
+
grpc_closure_sched(exec_ctx, op->on_consumed, GRPC_ERROR_NONE);
|
432
|
+
|
433
|
+
GPR_ASSERT(op->set_accept_stream == false);
|
434
|
+
if (op->bind_pollset != NULL) {
|
435
|
+
grpc_pollset_set_add_pollset(exec_ctx, chand->interested_parties,
|
436
|
+
op->bind_pollset);
|
437
|
+
}
|
438
|
+
|
439
|
+
gpr_mu_lock(&chand->mu);
|
440
|
+
if (op->on_connectivity_state_change != NULL) {
|
441
|
+
grpc_connectivity_state_notify_on_state_change(
|
442
|
+
exec_ctx, &chand->state_tracker, op->connectivity_state,
|
443
|
+
op->on_connectivity_state_change);
|
444
|
+
op->on_connectivity_state_change = NULL;
|
445
|
+
op->connectivity_state = NULL;
|
446
|
+
}
|
447
|
+
|
448
|
+
if (op->send_ping != NULL) {
|
449
|
+
if (chand->lb_policy == NULL) {
|
450
|
+
grpc_closure_sched(exec_ctx, op->send_ping,
|
451
|
+
GRPC_ERROR_CREATE("Ping with no load balancing"));
|
452
|
+
} else {
|
453
|
+
grpc_lb_policy_ping_one(exec_ctx, chand->lb_policy, op->send_ping);
|
454
|
+
op->bind_pollset = NULL;
|
455
|
+
}
|
456
|
+
op->send_ping = NULL;
|
457
|
+
}
|
458
|
+
|
459
|
+
if (op->disconnect_with_error != GRPC_ERROR_NONE) {
|
460
|
+
if (chand->resolver != NULL) {
|
461
|
+
set_channel_connectivity_state_locked(
|
462
|
+
exec_ctx, chand, GRPC_CHANNEL_SHUTDOWN,
|
463
|
+
GRPC_ERROR_REF(op->disconnect_with_error), "disconnect");
|
464
|
+
grpc_resolver_shutdown(exec_ctx, chand->resolver);
|
465
|
+
GRPC_RESOLVER_UNREF(exec_ctx, chand->resolver, "channel");
|
466
|
+
chand->resolver = NULL;
|
467
|
+
if (!chand->started_resolving) {
|
468
|
+
grpc_closure_list_fail_all(&chand->waiting_for_config_closures,
|
469
|
+
GRPC_ERROR_REF(op->disconnect_with_error));
|
470
|
+
grpc_closure_list_sched(exec_ctx, &chand->waiting_for_config_closures);
|
471
|
+
}
|
472
|
+
if (chand->lb_policy != NULL) {
|
473
|
+
grpc_pollset_set_del_pollset_set(exec_ctx,
|
474
|
+
chand->lb_policy->interested_parties,
|
475
|
+
chand->interested_parties);
|
476
|
+
GRPC_LB_POLICY_UNREF(exec_ctx, chand->lb_policy, "channel");
|
477
|
+
chand->lb_policy = NULL;
|
478
|
+
}
|
479
|
+
}
|
480
|
+
GRPC_ERROR_UNREF(op->disconnect_with_error);
|
481
|
+
}
|
482
|
+
gpr_mu_unlock(&chand->mu);
|
483
|
+
}
|
484
|
+
|
485
|
+
static void cc_get_channel_info(grpc_exec_ctx *exec_ctx,
|
486
|
+
grpc_channel_element *elem,
|
487
|
+
const grpc_channel_info *info) {
|
488
|
+
channel_data *chand = elem->channel_data;
|
489
|
+
gpr_mu_lock(&chand->mu);
|
490
|
+
if (info->lb_policy_name != NULL) {
|
491
|
+
*info->lb_policy_name = chand->lb_policy_name == NULL
|
492
|
+
? NULL
|
493
|
+
: gpr_strdup(chand->lb_policy_name);
|
494
|
+
}
|
495
|
+
if (info->service_config_json != NULL) {
|
496
|
+
*info->service_config_json = chand->service_config_json == NULL
|
497
|
+
? NULL
|
498
|
+
: gpr_strdup(chand->service_config_json);
|
499
|
+
}
|
500
|
+
gpr_mu_unlock(&chand->mu);
|
501
|
+
}
|
502
|
+
|
503
|
+
/* Constructor for channel_data */
|
504
|
+
static grpc_error *cc_init_channel_elem(grpc_exec_ctx *exec_ctx,
|
505
|
+
grpc_channel_element *elem,
|
506
|
+
grpc_channel_element_args *args) {
|
507
|
+
channel_data *chand = elem->channel_data;
|
508
|
+
memset(chand, 0, sizeof(*chand));
|
509
|
+
GPR_ASSERT(args->is_last);
|
510
|
+
GPR_ASSERT(elem->filter == &grpc_client_channel_filter);
|
511
|
+
// Initialize data members.
|
512
|
+
gpr_mu_init(&chand->mu);
|
513
|
+
chand->owning_stack = args->channel_stack;
|
514
|
+
grpc_closure_init(&chand->on_resolver_result_changed,
|
515
|
+
on_resolver_result_changed, chand,
|
516
|
+
grpc_schedule_on_exec_ctx);
|
517
|
+
chand->interested_parties = grpc_pollset_set_create();
|
518
|
+
grpc_connectivity_state_init(&chand->state_tracker, GRPC_CHANNEL_IDLE,
|
519
|
+
"client_channel");
|
520
|
+
// Record client channel factory.
|
521
|
+
const grpc_arg *arg = grpc_channel_args_find(args->channel_args,
|
522
|
+
GRPC_ARG_CLIENT_CHANNEL_FACTORY);
|
523
|
+
GPR_ASSERT(arg != NULL);
|
524
|
+
GPR_ASSERT(arg->type == GRPC_ARG_POINTER);
|
525
|
+
grpc_client_channel_factory_ref(arg->value.pointer.p);
|
526
|
+
chand->client_channel_factory = arg->value.pointer.p;
|
527
|
+
// Instantiate resolver.
|
528
|
+
arg = grpc_channel_args_find(args->channel_args, GRPC_ARG_SERVER_URI);
|
529
|
+
GPR_ASSERT(arg != NULL);
|
530
|
+
GPR_ASSERT(arg->type == GRPC_ARG_STRING);
|
531
|
+
chand->resolver =
|
532
|
+
grpc_resolver_create(exec_ctx, arg->value.string, args->channel_args,
|
533
|
+
chand->interested_parties);
|
534
|
+
if (chand->resolver == NULL) {
|
535
|
+
return GRPC_ERROR_CREATE("resolver creation failed");
|
536
|
+
}
|
537
|
+
return GRPC_ERROR_NONE;
|
538
|
+
}
|
539
|
+
|
540
|
+
/* Destructor for channel_data */
|
541
|
+
static void cc_destroy_channel_elem(grpc_exec_ctx *exec_ctx,
|
542
|
+
grpc_channel_element *elem) {
|
543
|
+
channel_data *chand = elem->channel_data;
|
544
|
+
|
545
|
+
if (chand->resolver != NULL) {
|
546
|
+
grpc_resolver_shutdown(exec_ctx, chand->resolver);
|
547
|
+
GRPC_RESOLVER_UNREF(exec_ctx, chand->resolver, "channel");
|
548
|
+
}
|
549
|
+
if (chand->client_channel_factory != NULL) {
|
550
|
+
grpc_client_channel_factory_unref(exec_ctx, chand->client_channel_factory);
|
551
|
+
}
|
552
|
+
if (chand->lb_policy != NULL) {
|
553
|
+
grpc_pollset_set_del_pollset_set(exec_ctx,
|
554
|
+
chand->lb_policy->interested_parties,
|
555
|
+
chand->interested_parties);
|
556
|
+
GRPC_LB_POLICY_UNREF(exec_ctx, chand->lb_policy, "channel");
|
557
|
+
}
|
558
|
+
gpr_free(chand->lb_policy_name);
|
559
|
+
gpr_free(chand->service_config_json);
|
560
|
+
if (chand->method_params_table != NULL) {
|
561
|
+
grpc_mdstr_hash_table_unref(exec_ctx, chand->method_params_table);
|
562
|
+
}
|
563
|
+
grpc_connectivity_state_destroy(exec_ctx, &chand->state_tracker);
|
564
|
+
grpc_pollset_set_destroy(chand->interested_parties);
|
565
|
+
gpr_mu_destroy(&chand->mu);
|
566
|
+
}
|
567
|
+
|
568
|
+
/*************************************************************************
|
569
|
+
* PER-CALL FUNCTIONS
|
570
|
+
*/
|
571
|
+
|
572
|
+
#define GET_CALL(call_data) \
|
573
|
+
((grpc_subchannel_call *)(gpr_atm_acq_load(&(call_data)->subchannel_call)))
|
574
|
+
|
575
|
+
#define CANCELLED_CALL ((grpc_subchannel_call *)1)
|
576
|
+
|
577
|
+
typedef enum {
|
578
|
+
GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING,
|
579
|
+
GRPC_SUBCHANNEL_CALL_HOLDER_PICKING_SUBCHANNEL
|
580
|
+
} subchannel_creation_phase;
|
581
|
+
|
582
|
+
/** Call data. Holds a pointer to grpc_subchannel_call and the
|
583
|
+
associated machinery to create such a pointer.
|
584
|
+
Handles queueing of stream ops until a call object is ready, waiting
|
585
|
+
for initial metadata before trying to create a call object,
|
586
|
+
and handling cancellation gracefully. */
|
587
|
+
typedef struct client_channel_call_data {
|
588
|
+
// State for handling deadlines.
|
589
|
+
// The code in deadline_filter.c requires this to be the first field.
|
590
|
+
// TODO(roth): This is slightly sub-optimal in that grpc_deadline_state
|
591
|
+
// and this struct both independently store a pointer to the call
|
592
|
+
// stack and each has its own mutex. If/when we have time, find a way
|
593
|
+
// to avoid this without breaking the grpc_deadline_state abstraction.
|
594
|
+
grpc_deadline_state deadline_state;
|
595
|
+
|
596
|
+
grpc_mdstr *path; // Request path.
|
597
|
+
gpr_timespec call_start_time;
|
598
|
+
gpr_timespec deadline;
|
599
|
+
wait_for_ready_value wait_for_ready_from_service_config;
|
600
|
+
grpc_closure read_service_config;
|
601
|
+
|
602
|
+
grpc_error *cancel_error;
|
603
|
+
|
604
|
+
/** either 0 for no call, 1 for cancelled, or a pointer to a
|
605
|
+
grpc_subchannel_call */
|
606
|
+
gpr_atm subchannel_call;
|
607
|
+
|
608
|
+
gpr_mu mu;
|
609
|
+
|
610
|
+
subchannel_creation_phase creation_phase;
|
611
|
+
grpc_connected_subchannel *connected_subchannel;
|
612
|
+
grpc_polling_entity *pollent;
|
613
|
+
|
614
|
+
grpc_transport_stream_op **waiting_ops;
|
615
|
+
size_t waiting_ops_count;
|
616
|
+
size_t waiting_ops_capacity;
|
617
|
+
|
618
|
+
grpc_closure next_step;
|
619
|
+
|
620
|
+
grpc_call_stack *owning_call;
|
621
|
+
|
622
|
+
grpc_linked_mdelem lb_token_mdelem;
|
623
|
+
} call_data;
|
624
|
+
|
625
|
+
static void add_waiting_locked(call_data *calld, grpc_transport_stream_op *op) {
|
626
|
+
GPR_TIMER_BEGIN("add_waiting_locked", 0);
|
627
|
+
if (calld->waiting_ops_count == calld->waiting_ops_capacity) {
|
628
|
+
calld->waiting_ops_capacity = GPR_MAX(3, 2 * calld->waiting_ops_capacity);
|
629
|
+
calld->waiting_ops =
|
630
|
+
gpr_realloc(calld->waiting_ops,
|
631
|
+
calld->waiting_ops_capacity * sizeof(*calld->waiting_ops));
|
632
|
+
}
|
633
|
+
calld->waiting_ops[calld->waiting_ops_count++] = op;
|
634
|
+
GPR_TIMER_END("add_waiting_locked", 0);
|
635
|
+
}
|
636
|
+
|
637
|
+
static void fail_locked(grpc_exec_ctx *exec_ctx, call_data *calld,
|
638
|
+
grpc_error *error) {
|
639
|
+
size_t i;
|
640
|
+
for (i = 0; i < calld->waiting_ops_count; i++) {
|
641
|
+
grpc_transport_stream_op_finish_with_failure(
|
642
|
+
exec_ctx, calld->waiting_ops[i], GRPC_ERROR_REF(error));
|
643
|
+
}
|
644
|
+
calld->waiting_ops_count = 0;
|
645
|
+
GRPC_ERROR_UNREF(error);
|
646
|
+
}
|
647
|
+
|
648
|
+
typedef struct {
|
649
|
+
grpc_transport_stream_op **ops;
|
650
|
+
size_t nops;
|
651
|
+
grpc_subchannel_call *call;
|
652
|
+
} retry_ops_args;
|
653
|
+
|
654
|
+
static void retry_ops(grpc_exec_ctx *exec_ctx, void *args, grpc_error *error) {
|
655
|
+
retry_ops_args *a = args;
|
656
|
+
size_t i;
|
657
|
+
for (i = 0; i < a->nops; i++) {
|
658
|
+
grpc_subchannel_call_process_op(exec_ctx, a->call, a->ops[i]);
|
659
|
+
}
|
660
|
+
GRPC_SUBCHANNEL_CALL_UNREF(exec_ctx, a->call, "retry_ops");
|
661
|
+
gpr_free(a->ops);
|
662
|
+
gpr_free(a);
|
663
|
+
}
|
664
|
+
|
665
|
+
static void retry_waiting_locked(grpc_exec_ctx *exec_ctx, call_data *calld) {
|
666
|
+
if (calld->waiting_ops_count == 0) {
|
667
|
+
return;
|
668
|
+
}
|
669
|
+
|
670
|
+
retry_ops_args *a = gpr_malloc(sizeof(*a));
|
671
|
+
a->ops = calld->waiting_ops;
|
672
|
+
a->nops = calld->waiting_ops_count;
|
673
|
+
a->call = GET_CALL(calld);
|
674
|
+
if (a->call == CANCELLED_CALL) {
|
675
|
+
gpr_free(a);
|
676
|
+
fail_locked(exec_ctx, calld, GRPC_ERROR_CANCELLED);
|
677
|
+
return;
|
678
|
+
}
|
679
|
+
calld->waiting_ops = NULL;
|
680
|
+
calld->waiting_ops_count = 0;
|
681
|
+
calld->waiting_ops_capacity = 0;
|
682
|
+
GRPC_SUBCHANNEL_CALL_REF(a->call, "retry_ops");
|
683
|
+
grpc_closure_sched(
|
684
|
+
exec_ctx, grpc_closure_create(retry_ops, a, grpc_schedule_on_exec_ctx),
|
685
|
+
GRPC_ERROR_NONE);
|
686
|
+
}
|
687
|
+
|
688
|
+
static void subchannel_ready(grpc_exec_ctx *exec_ctx, void *arg,
|
689
|
+
grpc_error *error) {
|
690
|
+
grpc_call_element *elem = arg;
|
691
|
+
call_data *calld = elem->call_data;
|
692
|
+
channel_data *chand = elem->channel_data;
|
693
|
+
gpr_mu_lock(&calld->mu);
|
694
|
+
GPR_ASSERT(calld->creation_phase ==
|
695
|
+
GRPC_SUBCHANNEL_CALL_HOLDER_PICKING_SUBCHANNEL);
|
696
|
+
grpc_polling_entity_del_from_pollset_set(exec_ctx, calld->pollent,
|
697
|
+
chand->interested_parties);
|
698
|
+
calld->creation_phase = GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING;
|
699
|
+
if (calld->connected_subchannel == NULL) {
|
700
|
+
gpr_atm_no_barrier_store(&calld->subchannel_call, 1);
|
701
|
+
fail_locked(exec_ctx, calld, GRPC_ERROR_CREATE_REFERENCING(
|
702
|
+
"Failed to create subchannel", &error, 1));
|
703
|
+
} else if (GET_CALL(calld) == CANCELLED_CALL) {
|
704
|
+
/* already cancelled before subchannel became ready */
|
705
|
+
grpc_error *cancellation_error = GRPC_ERROR_CREATE_REFERENCING(
|
706
|
+
"Cancelled before creating subchannel", &error, 1);
|
707
|
+
/* if due to deadline, attach the deadline exceeded status to the error */
|
708
|
+
if (gpr_time_cmp(calld->deadline, gpr_now(GPR_CLOCK_MONOTONIC)) < 0) {
|
709
|
+
cancellation_error =
|
710
|
+
grpc_error_set_int(cancellation_error, GRPC_ERROR_INT_GRPC_STATUS,
|
711
|
+
GRPC_STATUS_DEADLINE_EXCEEDED);
|
712
|
+
}
|
713
|
+
fail_locked(exec_ctx, calld, cancellation_error);
|
714
|
+
} else {
|
715
|
+
/* Create call on subchannel. */
|
716
|
+
grpc_subchannel_call *subchannel_call = NULL;
|
717
|
+
grpc_error *new_error = grpc_connected_subchannel_create_call(
|
718
|
+
exec_ctx, calld->connected_subchannel, calld->pollent, calld->path,
|
719
|
+
calld->call_start_time, calld->deadline, &subchannel_call);
|
720
|
+
if (new_error != GRPC_ERROR_NONE) {
|
721
|
+
new_error = grpc_error_add_child(new_error, error);
|
722
|
+
subchannel_call = CANCELLED_CALL;
|
723
|
+
fail_locked(exec_ctx, calld, new_error);
|
724
|
+
}
|
725
|
+
gpr_atm_rel_store(&calld->subchannel_call,
|
726
|
+
(gpr_atm)(uintptr_t)subchannel_call);
|
727
|
+
retry_waiting_locked(exec_ctx, calld);
|
728
|
+
}
|
729
|
+
gpr_mu_unlock(&calld->mu);
|
730
|
+
GRPC_CALL_STACK_UNREF(exec_ctx, calld->owning_call, "pick_subchannel");
|
731
|
+
}
|
732
|
+
|
733
|
+
static char *cc_get_peer(grpc_exec_ctx *exec_ctx, grpc_call_element *elem) {
|
734
|
+
call_data *calld = elem->call_data;
|
735
|
+
grpc_subchannel_call *subchannel_call = GET_CALL(calld);
|
736
|
+
if (subchannel_call == NULL || subchannel_call == CANCELLED_CALL) {
|
737
|
+
return NULL;
|
738
|
+
} else {
|
739
|
+
return grpc_subchannel_call_get_peer(exec_ctx, subchannel_call);
|
740
|
+
}
|
741
|
+
}
|
742
|
+
|
743
|
+
typedef struct {
|
744
|
+
grpc_metadata_batch *initial_metadata;
|
745
|
+
uint32_t initial_metadata_flags;
|
746
|
+
grpc_connected_subchannel **connected_subchannel;
|
747
|
+
grpc_closure *on_ready;
|
748
|
+
grpc_call_element *elem;
|
749
|
+
grpc_closure closure;
|
750
|
+
} continue_picking_args;
|
751
|
+
|
752
|
+
/** Return true if subchannel is available immediately (in which case on_ready
|
753
|
+
should not be called), or false otherwise (in which case on_ready should be
|
754
|
+
called when the subchannel is available). */
|
755
|
+
static bool pick_subchannel(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
|
756
|
+
grpc_metadata_batch *initial_metadata,
|
757
|
+
uint32_t initial_metadata_flags,
|
758
|
+
grpc_connected_subchannel **connected_subchannel,
|
759
|
+
grpc_closure *on_ready, grpc_error *error);
|
760
|
+
|
761
|
+
static void continue_picking(grpc_exec_ctx *exec_ctx, void *arg,
|
762
|
+
grpc_error *error) {
|
763
|
+
continue_picking_args *cpa = arg;
|
764
|
+
if (cpa->connected_subchannel == NULL) {
|
765
|
+
/* cancelled, do nothing */
|
766
|
+
} else if (error != GRPC_ERROR_NONE) {
|
767
|
+
grpc_closure_sched(exec_ctx, cpa->on_ready, GRPC_ERROR_REF(error));
|
768
|
+
} else {
|
769
|
+
call_data *calld = cpa->elem->call_data;
|
770
|
+
gpr_mu_lock(&calld->mu);
|
771
|
+
if (pick_subchannel(exec_ctx, cpa->elem, cpa->initial_metadata,
|
772
|
+
cpa->initial_metadata_flags, cpa->connected_subchannel,
|
773
|
+
cpa->on_ready, GRPC_ERROR_NONE)) {
|
774
|
+
grpc_closure_sched(exec_ctx, cpa->on_ready, GRPC_ERROR_NONE);
|
775
|
+
}
|
776
|
+
gpr_mu_unlock(&calld->mu);
|
777
|
+
}
|
778
|
+
gpr_free(cpa);
|
779
|
+
}
|
780
|
+
|
781
|
+
static bool pick_subchannel(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
|
782
|
+
grpc_metadata_batch *initial_metadata,
|
783
|
+
uint32_t initial_metadata_flags,
|
784
|
+
grpc_connected_subchannel **connected_subchannel,
|
785
|
+
grpc_closure *on_ready, grpc_error *error) {
|
786
|
+
GPR_TIMER_BEGIN("pick_subchannel", 0);
|
787
|
+
|
788
|
+
channel_data *chand = elem->channel_data;
|
789
|
+
call_data *calld = elem->call_data;
|
790
|
+
continue_picking_args *cpa;
|
791
|
+
grpc_closure *closure;
|
792
|
+
|
793
|
+
GPR_ASSERT(connected_subchannel);
|
794
|
+
|
795
|
+
gpr_mu_lock(&chand->mu);
|
796
|
+
if (initial_metadata == NULL) {
|
797
|
+
if (chand->lb_policy != NULL) {
|
798
|
+
grpc_lb_policy_cancel_pick(exec_ctx, chand->lb_policy,
|
799
|
+
connected_subchannel, GRPC_ERROR_REF(error));
|
800
|
+
}
|
801
|
+
for (closure = chand->waiting_for_config_closures.head; closure != NULL;
|
802
|
+
closure = closure->next_data.next) {
|
803
|
+
cpa = closure->cb_arg;
|
804
|
+
if (cpa->connected_subchannel == connected_subchannel) {
|
805
|
+
cpa->connected_subchannel = NULL;
|
806
|
+
grpc_closure_sched(
|
807
|
+
exec_ctx, cpa->on_ready,
|
808
|
+
GRPC_ERROR_CREATE_REFERENCING("Pick cancelled", &error, 1));
|
809
|
+
}
|
810
|
+
}
|
811
|
+
gpr_mu_unlock(&chand->mu);
|
812
|
+
GPR_TIMER_END("pick_subchannel", 0);
|
813
|
+
GRPC_ERROR_UNREF(error);
|
814
|
+
return true;
|
815
|
+
}
|
816
|
+
GPR_ASSERT(error == GRPC_ERROR_NONE);
|
817
|
+
if (chand->lb_policy != NULL) {
|
818
|
+
grpc_lb_policy *lb_policy = chand->lb_policy;
|
819
|
+
GRPC_LB_POLICY_REF(lb_policy, "pick_subchannel");
|
820
|
+
gpr_mu_unlock(&chand->mu);
|
821
|
+
// If the application explicitly set wait_for_ready, use that.
|
822
|
+
// Otherwise, if the service config specified a value for this
|
823
|
+
// method, use that.
|
824
|
+
const bool wait_for_ready_set_from_api =
|
825
|
+
initial_metadata_flags &
|
826
|
+
GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET;
|
827
|
+
const bool wait_for_ready_set_from_service_config =
|
828
|
+
calld->wait_for_ready_from_service_config != WAIT_FOR_READY_UNSET;
|
829
|
+
if (!wait_for_ready_set_from_api &&
|
830
|
+
wait_for_ready_set_from_service_config) {
|
831
|
+
if (calld->wait_for_ready_from_service_config == WAIT_FOR_READY_TRUE) {
|
832
|
+
initial_metadata_flags |= GRPC_INITIAL_METADATA_WAIT_FOR_READY;
|
833
|
+
} else {
|
834
|
+
initial_metadata_flags &= ~GRPC_INITIAL_METADATA_WAIT_FOR_READY;
|
835
|
+
}
|
836
|
+
}
|
837
|
+
const grpc_lb_policy_pick_args inputs = {
|
838
|
+
initial_metadata, initial_metadata_flags, &calld->lb_token_mdelem,
|
839
|
+
gpr_inf_future(GPR_CLOCK_MONOTONIC)};
|
840
|
+
const bool result = grpc_lb_policy_pick(
|
841
|
+
exec_ctx, lb_policy, &inputs, connected_subchannel, NULL, on_ready);
|
842
|
+
GRPC_LB_POLICY_UNREF(exec_ctx, lb_policy, "pick_subchannel");
|
843
|
+
GPR_TIMER_END("pick_subchannel", 0);
|
844
|
+
return result;
|
845
|
+
}
|
846
|
+
if (chand->resolver != NULL && !chand->started_resolving) {
|
847
|
+
chand->started_resolving = true;
|
848
|
+
GRPC_CHANNEL_STACK_REF(chand->owning_stack, "resolver");
|
849
|
+
grpc_resolver_next(exec_ctx, chand->resolver, &chand->resolver_result,
|
850
|
+
&chand->on_resolver_result_changed);
|
851
|
+
}
|
852
|
+
if (chand->resolver != NULL) {
|
853
|
+
cpa = gpr_malloc(sizeof(*cpa));
|
854
|
+
cpa->initial_metadata = initial_metadata;
|
855
|
+
cpa->initial_metadata_flags = initial_metadata_flags;
|
856
|
+
cpa->connected_subchannel = connected_subchannel;
|
857
|
+
cpa->on_ready = on_ready;
|
858
|
+
cpa->elem = elem;
|
859
|
+
grpc_closure_init(&cpa->closure, continue_picking, cpa,
|
860
|
+
grpc_schedule_on_exec_ctx);
|
861
|
+
grpc_closure_list_append(&chand->waiting_for_config_closures, &cpa->closure,
|
862
|
+
GRPC_ERROR_NONE);
|
863
|
+
} else {
|
864
|
+
grpc_closure_sched(exec_ctx, on_ready, GRPC_ERROR_CREATE("Disconnected"));
|
865
|
+
}
|
866
|
+
gpr_mu_unlock(&chand->mu);
|
867
|
+
|
868
|
+
GPR_TIMER_END("pick_subchannel", 0);
|
869
|
+
return false;
|
870
|
+
}
|
871
|
+
|
872
|
+
// The logic here is fairly complicated, due to (a) the fact that we
|
873
|
+
// need to handle the case where we receive the send op before the
|
874
|
+
// initial metadata op, and (b) the need for efficiency, especially in
|
875
|
+
// the streaming case.
|
876
|
+
// TODO(ctiller): Explain this more thoroughly.
|
877
|
+
static void cc_start_transport_stream_op(grpc_exec_ctx *exec_ctx,
|
878
|
+
grpc_call_element *elem,
|
879
|
+
grpc_transport_stream_op *op) {
|
880
|
+
call_data *calld = elem->call_data;
|
881
|
+
channel_data *chand = elem->channel_data;
|
882
|
+
GRPC_CALL_LOG_OP(GPR_INFO, elem, op);
|
883
|
+
grpc_deadline_state_client_start_transport_stream_op(exec_ctx, elem, op);
|
884
|
+
/* try to (atomically) get the call */
|
885
|
+
grpc_subchannel_call *call = GET_CALL(calld);
|
886
|
+
GPR_TIMER_BEGIN("cc_start_transport_stream_op", 0);
|
887
|
+
if (call == CANCELLED_CALL) {
|
888
|
+
grpc_transport_stream_op_finish_with_failure(
|
889
|
+
exec_ctx, op, GRPC_ERROR_REF(calld->cancel_error));
|
890
|
+
GPR_TIMER_END("cc_start_transport_stream_op", 0);
|
891
|
+
return;
|
892
|
+
}
|
893
|
+
if (call != NULL) {
|
894
|
+
grpc_subchannel_call_process_op(exec_ctx, call, op);
|
895
|
+
GPR_TIMER_END("cc_start_transport_stream_op", 0);
|
896
|
+
return;
|
897
|
+
}
|
898
|
+
/* we failed; lock and figure out what to do */
|
899
|
+
gpr_mu_lock(&calld->mu);
|
900
|
+
retry:
|
901
|
+
/* need to recheck that another thread hasn't set the call */
|
902
|
+
call = GET_CALL(calld);
|
903
|
+
if (call == CANCELLED_CALL) {
|
904
|
+
gpr_mu_unlock(&calld->mu);
|
905
|
+
grpc_transport_stream_op_finish_with_failure(
|
906
|
+
exec_ctx, op, GRPC_ERROR_REF(calld->cancel_error));
|
907
|
+
GPR_TIMER_END("cc_start_transport_stream_op", 0);
|
908
|
+
return;
|
909
|
+
}
|
910
|
+
if (call != NULL) {
|
911
|
+
gpr_mu_unlock(&calld->mu);
|
912
|
+
grpc_subchannel_call_process_op(exec_ctx, call, op);
|
913
|
+
GPR_TIMER_END("cc_start_transport_stream_op", 0);
|
914
|
+
return;
|
915
|
+
}
|
916
|
+
/* if this is a cancellation, then we can raise our cancelled flag */
|
917
|
+
if (op->cancel_error != GRPC_ERROR_NONE) {
|
918
|
+
if (!gpr_atm_rel_cas(&calld->subchannel_call, 0,
|
919
|
+
(gpr_atm)(uintptr_t)CANCELLED_CALL)) {
|
920
|
+
goto retry;
|
921
|
+
} else {
|
922
|
+
// Stash a copy of cancel_error in our call data, so that we can use
|
923
|
+
// it for subsequent operations. This ensures that if the call is
|
924
|
+
// cancelled before any ops are passed down (e.g., if the deadline
|
925
|
+
// is in the past when the call starts), we can return the right
|
926
|
+
// error to the caller when the first op does get passed down.
|
927
|
+
calld->cancel_error = GRPC_ERROR_REF(op->cancel_error);
|
928
|
+
switch (calld->creation_phase) {
|
929
|
+
case GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING:
|
930
|
+
fail_locked(exec_ctx, calld, GRPC_ERROR_REF(op->cancel_error));
|
931
|
+
break;
|
932
|
+
case GRPC_SUBCHANNEL_CALL_HOLDER_PICKING_SUBCHANNEL:
|
933
|
+
pick_subchannel(exec_ctx, elem, NULL, 0, &calld->connected_subchannel,
|
934
|
+
NULL, GRPC_ERROR_REF(op->cancel_error));
|
935
|
+
break;
|
936
|
+
}
|
937
|
+
gpr_mu_unlock(&calld->mu);
|
938
|
+
grpc_transport_stream_op_finish_with_failure(
|
939
|
+
exec_ctx, op, GRPC_ERROR_REF(op->cancel_error));
|
940
|
+
GPR_TIMER_END("cc_start_transport_stream_op", 0);
|
941
|
+
return;
|
942
|
+
}
|
943
|
+
}
|
944
|
+
/* if we don't have a subchannel, try to get one */
|
945
|
+
if (calld->creation_phase == GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING &&
|
946
|
+
calld->connected_subchannel == NULL &&
|
947
|
+
op->send_initial_metadata != NULL) {
|
948
|
+
calld->creation_phase = GRPC_SUBCHANNEL_CALL_HOLDER_PICKING_SUBCHANNEL;
|
949
|
+
grpc_closure_init(&calld->next_step, subchannel_ready, elem,
|
950
|
+
grpc_schedule_on_exec_ctx);
|
951
|
+
GRPC_CALL_STACK_REF(calld->owning_call, "pick_subchannel");
|
952
|
+
/* If a subchannel is not available immediately, the polling entity from
|
953
|
+
call_data should be provided to channel_data's interested_parties, so
|
954
|
+
that IO of the lb_policy and resolver could be done under it. */
|
955
|
+
if (pick_subchannel(exec_ctx, elem, op->send_initial_metadata,
|
956
|
+
op->send_initial_metadata_flags,
|
957
|
+
&calld->connected_subchannel, &calld->next_step,
|
958
|
+
GRPC_ERROR_NONE)) {
|
959
|
+
calld->creation_phase = GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING;
|
960
|
+
GRPC_CALL_STACK_UNREF(exec_ctx, calld->owning_call, "pick_subchannel");
|
961
|
+
} else {
|
962
|
+
grpc_polling_entity_add_to_pollset_set(exec_ctx, calld->pollent,
|
963
|
+
chand->interested_parties);
|
964
|
+
}
|
965
|
+
}
|
966
|
+
/* if we've got a subchannel, then let's ask it to create a call */
|
967
|
+
if (calld->creation_phase == GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING &&
|
968
|
+
calld->connected_subchannel != NULL) {
|
969
|
+
grpc_subchannel_call *subchannel_call = NULL;
|
970
|
+
grpc_error *error = grpc_connected_subchannel_create_call(
|
971
|
+
exec_ctx, calld->connected_subchannel, calld->pollent, calld->path,
|
972
|
+
calld->call_start_time, calld->deadline, &subchannel_call);
|
973
|
+
if (error != GRPC_ERROR_NONE) {
|
974
|
+
subchannel_call = CANCELLED_CALL;
|
975
|
+
fail_locked(exec_ctx, calld, GRPC_ERROR_REF(error));
|
976
|
+
grpc_transport_stream_op_finish_with_failure(exec_ctx, op, error);
|
977
|
+
}
|
978
|
+
gpr_atm_rel_store(&calld->subchannel_call,
|
979
|
+
(gpr_atm)(uintptr_t)subchannel_call);
|
980
|
+
retry_waiting_locked(exec_ctx, calld);
|
981
|
+
goto retry;
|
982
|
+
}
|
983
|
+
/* nothing to be done but wait */
|
984
|
+
add_waiting_locked(calld, op);
|
985
|
+
gpr_mu_unlock(&calld->mu);
|
986
|
+
GPR_TIMER_END("cc_start_transport_stream_op", 0);
|
987
|
+
}
|
988
|
+
|
989
|
+
// Gets data from the service config. Invoked when the resolver returns
|
990
|
+
// its initial result.
|
991
|
+
static void read_service_config(grpc_exec_ctx *exec_ctx, void *arg,
|
992
|
+
grpc_error *error) {
|
993
|
+
grpc_call_element *elem = arg;
|
994
|
+
channel_data *chand = elem->channel_data;
|
995
|
+
call_data *calld = elem->call_data;
|
996
|
+
// If this is an error, there's no point in looking at the service config.
|
997
|
+
if (error == GRPC_ERROR_NONE) {
|
998
|
+
// Get the method config table from channel data.
|
999
|
+
gpr_mu_lock(&chand->mu);
|
1000
|
+
grpc_mdstr_hash_table *method_params_table = NULL;
|
1001
|
+
if (chand->method_params_table != NULL) {
|
1002
|
+
method_params_table =
|
1003
|
+
grpc_mdstr_hash_table_ref(chand->method_params_table);
|
1004
|
+
}
|
1005
|
+
gpr_mu_unlock(&chand->mu);
|
1006
|
+
// If the method config table was present, use it.
|
1007
|
+
if (method_params_table != NULL) {
|
1008
|
+
const method_parameters *method_params = grpc_method_config_table_get(
|
1009
|
+
exec_ctx, method_params_table, calld->path);
|
1010
|
+
if (method_params != NULL) {
|
1011
|
+
const bool have_method_timeout =
|
1012
|
+
gpr_time_cmp(method_params->timeout, gpr_time_0(GPR_TIMESPAN)) != 0;
|
1013
|
+
if (have_method_timeout ||
|
1014
|
+
method_params->wait_for_ready != WAIT_FOR_READY_UNSET) {
|
1015
|
+
gpr_mu_lock(&calld->mu);
|
1016
|
+
if (have_method_timeout) {
|
1017
|
+
const gpr_timespec per_method_deadline =
|
1018
|
+
gpr_time_add(calld->call_start_time, method_params->timeout);
|
1019
|
+
if (gpr_time_cmp(per_method_deadline, calld->deadline) < 0) {
|
1020
|
+
calld->deadline = per_method_deadline;
|
1021
|
+
// Reset deadline timer.
|
1022
|
+
grpc_deadline_state_reset(exec_ctx, elem, calld->deadline);
|
1023
|
+
}
|
1024
|
+
}
|
1025
|
+
if (method_params->wait_for_ready != WAIT_FOR_READY_UNSET) {
|
1026
|
+
calld->wait_for_ready_from_service_config =
|
1027
|
+
method_params->wait_for_ready;
|
1028
|
+
}
|
1029
|
+
gpr_mu_unlock(&calld->mu);
|
1030
|
+
}
|
1031
|
+
}
|
1032
|
+
grpc_mdstr_hash_table_unref(exec_ctx, method_params_table);
|
1033
|
+
}
|
1034
|
+
}
|
1035
|
+
GRPC_CALL_STACK_UNREF(exec_ctx, calld->owning_call, "read_service_config");
|
1036
|
+
}
|
1037
|
+
|
1038
|
+
/* Constructor for call_data */
|
1039
|
+
static grpc_error *cc_init_call_elem(grpc_exec_ctx *exec_ctx,
|
1040
|
+
grpc_call_element *elem,
|
1041
|
+
grpc_call_element_args *args) {
|
1042
|
+
channel_data *chand = elem->channel_data;
|
1043
|
+
call_data *calld = elem->call_data;
|
1044
|
+
// Initialize data members.
|
1045
|
+
grpc_deadline_state_init(exec_ctx, elem, args->call_stack);
|
1046
|
+
calld->path = GRPC_MDSTR_REF(args->path);
|
1047
|
+
calld->call_start_time = args->start_time;
|
1048
|
+
calld->deadline = gpr_convert_clock_type(args->deadline, GPR_CLOCK_MONOTONIC);
|
1049
|
+
calld->wait_for_ready_from_service_config = WAIT_FOR_READY_UNSET;
|
1050
|
+
calld->cancel_error = GRPC_ERROR_NONE;
|
1051
|
+
gpr_atm_rel_store(&calld->subchannel_call, 0);
|
1052
|
+
gpr_mu_init(&calld->mu);
|
1053
|
+
calld->connected_subchannel = NULL;
|
1054
|
+
calld->waiting_ops = NULL;
|
1055
|
+
calld->waiting_ops_count = 0;
|
1056
|
+
calld->waiting_ops_capacity = 0;
|
1057
|
+
calld->creation_phase = GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING;
|
1058
|
+
calld->owning_call = args->call_stack;
|
1059
|
+
calld->pollent = NULL;
|
1060
|
+
// If the resolver has already returned results, then we can access
|
1061
|
+
// the service config parameters immediately. Otherwise, we need to
|
1062
|
+
// defer that work until the resolver returns an initial result.
|
1063
|
+
// TODO(roth): This code is almost but not quite identical to the code
|
1064
|
+
// in read_service_config() above. It would be nice to find a way to
|
1065
|
+
// combine them, to avoid having to maintain it twice.
|
1066
|
+
gpr_mu_lock(&chand->mu);
|
1067
|
+
if (chand->lb_policy != NULL) {
|
1068
|
+
// We already have a resolver result, so check for service config.
|
1069
|
+
if (chand->method_params_table != NULL) {
|
1070
|
+
grpc_mdstr_hash_table *method_params_table =
|
1071
|
+
grpc_mdstr_hash_table_ref(chand->method_params_table);
|
1072
|
+
gpr_mu_unlock(&chand->mu);
|
1073
|
+
method_parameters *method_params = grpc_method_config_table_get(
|
1074
|
+
exec_ctx, method_params_table, args->path);
|
1075
|
+
if (method_params != NULL) {
|
1076
|
+
if (gpr_time_cmp(method_params->timeout,
|
1077
|
+
gpr_time_0(GPR_CLOCK_MONOTONIC)) != 0) {
|
1078
|
+
gpr_timespec per_method_deadline =
|
1079
|
+
gpr_time_add(calld->call_start_time, method_params->timeout);
|
1080
|
+
calld->deadline = gpr_time_min(calld->deadline, per_method_deadline);
|
1081
|
+
}
|
1082
|
+
if (method_params->wait_for_ready != WAIT_FOR_READY_UNSET) {
|
1083
|
+
calld->wait_for_ready_from_service_config =
|
1084
|
+
method_params->wait_for_ready;
|
1085
|
+
}
|
1086
|
+
}
|
1087
|
+
grpc_mdstr_hash_table_unref(exec_ctx, method_params_table);
|
1088
|
+
} else {
|
1089
|
+
gpr_mu_unlock(&chand->mu);
|
1090
|
+
}
|
1091
|
+
} else {
|
1092
|
+
// We don't yet have a resolver result, so register a callback to
|
1093
|
+
// get the service config data once the resolver returns.
|
1094
|
+
// Take a reference to the call stack to be owned by the callback.
|
1095
|
+
GRPC_CALL_STACK_REF(calld->owning_call, "read_service_config");
|
1096
|
+
grpc_closure_init(&calld->read_service_config, read_service_config, elem,
|
1097
|
+
grpc_schedule_on_exec_ctx);
|
1098
|
+
grpc_closure_list_append(&chand->waiting_for_config_closures,
|
1099
|
+
&calld->read_service_config, GRPC_ERROR_NONE);
|
1100
|
+
gpr_mu_unlock(&chand->mu);
|
1101
|
+
}
|
1102
|
+
// Start the deadline timer with the current deadline value. If we
|
1103
|
+
// do not yet have service config data, then the timer may be reset
|
1104
|
+
// later.
|
1105
|
+
grpc_deadline_state_start(exec_ctx, elem, calld->deadline);
|
1106
|
+
return GRPC_ERROR_NONE;
|
1107
|
+
}
|
1108
|
+
|
1109
|
+
/* Destructor for call_data */
|
1110
|
+
static void cc_destroy_call_elem(grpc_exec_ctx *exec_ctx,
|
1111
|
+
grpc_call_element *elem,
|
1112
|
+
const grpc_call_final_info *final_info,
|
1113
|
+
void *and_free_memory) {
|
1114
|
+
call_data *calld = elem->call_data;
|
1115
|
+
grpc_deadline_state_destroy(exec_ctx, elem);
|
1116
|
+
GRPC_MDSTR_UNREF(exec_ctx, calld->path);
|
1117
|
+
GRPC_ERROR_UNREF(calld->cancel_error);
|
1118
|
+
grpc_subchannel_call *call = GET_CALL(calld);
|
1119
|
+
if (call != NULL && call != CANCELLED_CALL) {
|
1120
|
+
GRPC_SUBCHANNEL_CALL_UNREF(exec_ctx, call, "client_channel_destroy_call");
|
1121
|
+
}
|
1122
|
+
GPR_ASSERT(calld->creation_phase == GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING);
|
1123
|
+
gpr_mu_destroy(&calld->mu);
|
1124
|
+
GPR_ASSERT(calld->waiting_ops_count == 0);
|
1125
|
+
if (calld->connected_subchannel != NULL) {
|
1126
|
+
GRPC_CONNECTED_SUBCHANNEL_UNREF(exec_ctx, calld->connected_subchannel,
|
1127
|
+
"picked");
|
1128
|
+
}
|
1129
|
+
gpr_free(calld->waiting_ops);
|
1130
|
+
gpr_free(and_free_memory);
|
1131
|
+
}
|
1132
|
+
|
1133
|
+
static void cc_set_pollset_or_pollset_set(grpc_exec_ctx *exec_ctx,
|
1134
|
+
grpc_call_element *elem,
|
1135
|
+
grpc_polling_entity *pollent) {
|
1136
|
+
call_data *calld = elem->call_data;
|
1137
|
+
calld->pollent = pollent;
|
1138
|
+
}
|
1139
|
+
|
1140
|
+
/*************************************************************************
|
1141
|
+
* EXPORTED SYMBOLS
|
1142
|
+
*/
|
1143
|
+
|
1144
|
+
const grpc_channel_filter grpc_client_channel_filter = {
|
1145
|
+
cc_start_transport_stream_op,
|
1146
|
+
cc_start_transport_op,
|
1147
|
+
sizeof(call_data),
|
1148
|
+
cc_init_call_elem,
|
1149
|
+
cc_set_pollset_or_pollset_set,
|
1150
|
+
cc_destroy_call_elem,
|
1151
|
+
sizeof(channel_data),
|
1152
|
+
cc_init_channel_elem,
|
1153
|
+
cc_destroy_channel_elem,
|
1154
|
+
cc_get_peer,
|
1155
|
+
cc_get_channel_info,
|
1156
|
+
"client-channel",
|
1157
|
+
};
|
1158
|
+
|
1159
|
+
grpc_connectivity_state grpc_client_channel_check_connectivity_state(
|
1160
|
+
grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, int try_to_connect) {
|
1161
|
+
channel_data *chand = elem->channel_data;
|
1162
|
+
grpc_connectivity_state out;
|
1163
|
+
gpr_mu_lock(&chand->mu);
|
1164
|
+
out = grpc_connectivity_state_check(&chand->state_tracker, NULL);
|
1165
|
+
if (out == GRPC_CHANNEL_IDLE && try_to_connect) {
|
1166
|
+
if (chand->lb_policy != NULL) {
|
1167
|
+
grpc_lb_policy_exit_idle(exec_ctx, chand->lb_policy);
|
1168
|
+
} else {
|
1169
|
+
chand->exit_idle_when_lb_policy_arrives = true;
|
1170
|
+
if (!chand->started_resolving && chand->resolver != NULL) {
|
1171
|
+
GRPC_CHANNEL_STACK_REF(chand->owning_stack, "resolver");
|
1172
|
+
chand->started_resolving = true;
|
1173
|
+
grpc_resolver_next(exec_ctx, chand->resolver, &chand->resolver_result,
|
1174
|
+
&chand->on_resolver_result_changed);
|
1175
|
+
}
|
1176
|
+
}
|
1177
|
+
}
|
1178
|
+
gpr_mu_unlock(&chand->mu);
|
1179
|
+
return out;
|
1180
|
+
}
|
1181
|
+
|
1182
|
+
typedef struct {
|
1183
|
+
channel_data *chand;
|
1184
|
+
grpc_pollset *pollset;
|
1185
|
+
grpc_closure *on_complete;
|
1186
|
+
grpc_closure my_closure;
|
1187
|
+
} external_connectivity_watcher;
|
1188
|
+
|
1189
|
+
static void on_external_watch_complete(grpc_exec_ctx *exec_ctx, void *arg,
|
1190
|
+
grpc_error *error) {
|
1191
|
+
external_connectivity_watcher *w = arg;
|
1192
|
+
grpc_closure *follow_up = w->on_complete;
|
1193
|
+
grpc_pollset_set_del_pollset(exec_ctx, w->chand->interested_parties,
|
1194
|
+
w->pollset);
|
1195
|
+
GRPC_CHANNEL_STACK_UNREF(exec_ctx, w->chand->owning_stack,
|
1196
|
+
"external_connectivity_watcher");
|
1197
|
+
gpr_free(w);
|
1198
|
+
follow_up->cb(exec_ctx, follow_up->cb_arg, error);
|
1199
|
+
}
|
1200
|
+
|
1201
|
+
void grpc_client_channel_watch_connectivity_state(
|
1202
|
+
grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, grpc_pollset *pollset,
|
1203
|
+
grpc_connectivity_state *state, grpc_closure *on_complete) {
|
1204
|
+
channel_data *chand = elem->channel_data;
|
1205
|
+
external_connectivity_watcher *w = gpr_malloc(sizeof(*w));
|
1206
|
+
w->chand = chand;
|
1207
|
+
w->pollset = pollset;
|
1208
|
+
w->on_complete = on_complete;
|
1209
|
+
grpc_pollset_set_add_pollset(exec_ctx, chand->interested_parties, pollset);
|
1210
|
+
grpc_closure_init(&w->my_closure, on_external_watch_complete, w,
|
1211
|
+
grpc_schedule_on_exec_ctx);
|
1212
|
+
GRPC_CHANNEL_STACK_REF(w->chand->owning_stack,
|
1213
|
+
"external_connectivity_watcher");
|
1214
|
+
gpr_mu_lock(&chand->mu);
|
1215
|
+
grpc_connectivity_state_notify_on_state_change(
|
1216
|
+
exec_ctx, &chand->state_tracker, state, &w->my_closure);
|
1217
|
+
gpr_mu_unlock(&chand->mu);
|
1218
|
+
}
|