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
@@ -34,12 +34,15 @@
|
|
34
34
|
#include <string.h>
|
35
35
|
|
36
36
|
#include <grpc/support/alloc.h>
|
37
|
-
|
37
|
+
|
38
|
+
#include "src/core/ext/client_channel/lb_policy_registry.h"
|
39
|
+
#include "src/core/ext/client_channel/subchannel.h"
|
40
|
+
#include "src/core/lib/channel/channel_args.h"
|
41
|
+
#include "src/core/lib/iomgr/sockaddr_utils.h"
|
38
42
|
#include "src/core/lib/transport/connectivity_state.h"
|
39
43
|
|
40
44
|
typedef struct pending_pick {
|
41
45
|
struct pending_pick *next;
|
42
|
-
grpc_polling_entity *pollent;
|
43
46
|
uint32_t initial_metadata_flags;
|
44
47
|
grpc_connected_subchannel **target;
|
45
48
|
grpc_closure *on_complete;
|
@@ -119,16 +122,15 @@ static void pf_shutdown(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
|
|
119
122
|
while (pp != NULL) {
|
120
123
|
pending_pick *next = pp->next;
|
121
124
|
*pp->target = NULL;
|
122
|
-
|
123
|
-
p->base.interested_parties);
|
124
|
-
grpc_exec_ctx_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE, NULL);
|
125
|
+
grpc_closure_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE);
|
125
126
|
gpr_free(pp);
|
126
127
|
pp = next;
|
127
128
|
}
|
128
129
|
}
|
129
130
|
|
130
131
|
static void pf_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
131
|
-
grpc_connected_subchannel **target
|
132
|
+
grpc_connected_subchannel **target,
|
133
|
+
grpc_error *error) {
|
132
134
|
pick_first_lb_policy *p = (pick_first_lb_policy *)pol;
|
133
135
|
pending_pick *pp;
|
134
136
|
gpr_mu_lock(&p->mu);
|
@@ -137,11 +139,10 @@ static void pf_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
|
137
139
|
while (pp != NULL) {
|
138
140
|
pending_pick *next = pp->next;
|
139
141
|
if (pp->target == target) {
|
140
|
-
grpc_polling_entity_del_from_pollset_set(exec_ctx, pp->pollent,
|
141
|
-
p->base.interested_parties);
|
142
142
|
*target = NULL;
|
143
|
-
|
144
|
-
|
143
|
+
grpc_closure_sched(
|
144
|
+
exec_ctx, pp->on_complete,
|
145
|
+
GRPC_ERROR_CREATE_REFERENCING("Pick Cancelled", &error, 1));
|
145
146
|
gpr_free(pp);
|
146
147
|
} else {
|
147
148
|
pp->next = p->pending_picks;
|
@@ -150,11 +151,13 @@ static void pf_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
|
150
151
|
pp = next;
|
151
152
|
}
|
152
153
|
gpr_mu_unlock(&p->mu);
|
154
|
+
GRPC_ERROR_UNREF(error);
|
153
155
|
}
|
154
156
|
|
155
157
|
static void pf_cancel_picks(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
156
158
|
uint32_t initial_metadata_flags_mask,
|
157
|
-
uint32_t initial_metadata_flags_eq
|
159
|
+
uint32_t initial_metadata_flags_eq,
|
160
|
+
grpc_error *error) {
|
158
161
|
pick_first_lb_policy *p = (pick_first_lb_policy *)pol;
|
159
162
|
pending_pick *pp;
|
160
163
|
gpr_mu_lock(&p->mu);
|
@@ -164,10 +167,9 @@ static void pf_cancel_picks(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
|
164
167
|
pending_pick *next = pp->next;
|
165
168
|
if ((pp->initial_metadata_flags & initial_metadata_flags_mask) ==
|
166
169
|
initial_metadata_flags_eq) {
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
GRPC_ERROR_CREATE("Pick Cancelled"), NULL);
|
170
|
+
grpc_closure_sched(
|
171
|
+
exec_ctx, pp->on_complete,
|
172
|
+
GRPC_ERROR_CREATE_REFERENCING("Pick Cancelled", &error, 1));
|
171
173
|
gpr_free(pp);
|
172
174
|
} else {
|
173
175
|
pp->next = p->pending_picks;
|
@@ -176,6 +178,7 @@ static void pf_cancel_picks(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
|
176
178
|
pp = next;
|
177
179
|
}
|
178
180
|
gpr_mu_unlock(&p->mu);
|
181
|
+
GRPC_ERROR_UNREF(error);
|
179
182
|
}
|
180
183
|
|
181
184
|
static void start_picking(grpc_exec_ctx *exec_ctx, pick_first_lb_policy *p) {
|
@@ -199,10 +202,8 @@ static void pf_exit_idle(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
|
|
199
202
|
}
|
200
203
|
|
201
204
|
static int pf_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
202
|
-
|
203
|
-
|
204
|
-
uint32_t initial_metadata_flags,
|
205
|
-
grpc_connected_subchannel **target,
|
205
|
+
const grpc_lb_policy_pick_args *pick_args,
|
206
|
+
grpc_connected_subchannel **target, void **user_data,
|
206
207
|
grpc_closure *on_complete) {
|
207
208
|
pick_first_lb_policy *p = (pick_first_lb_policy *)pol;
|
208
209
|
pending_pick *pp;
|
@@ -210,7 +211,7 @@ static int pf_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
|
210
211
|
/* Check atomically for a selected channel */
|
211
212
|
grpc_connected_subchannel *selected = GET_SELECTED(p);
|
212
213
|
if (selected != NULL) {
|
213
|
-
*target = selected;
|
214
|
+
*target = GRPC_CONNECTED_SUBCHANNEL_REF(selected, "picked");
|
214
215
|
return 1;
|
215
216
|
}
|
216
217
|
|
@@ -219,19 +220,16 @@ static int pf_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
|
219
220
|
selected = GET_SELECTED(p);
|
220
221
|
if (selected) {
|
221
222
|
gpr_mu_unlock(&p->mu);
|
222
|
-
*target = selected;
|
223
|
+
*target = GRPC_CONNECTED_SUBCHANNEL_REF(selected, "picked");
|
223
224
|
return 1;
|
224
225
|
} else {
|
225
226
|
if (!p->started_picking) {
|
226
227
|
start_picking(exec_ctx, p);
|
227
228
|
}
|
228
|
-
grpc_polling_entity_add_to_pollset_set(exec_ctx, pollent,
|
229
|
-
p->base.interested_parties);
|
230
229
|
pp = gpr_malloc(sizeof(*pp));
|
231
230
|
pp->next = p->pending_picks;
|
232
|
-
pp->pollent = pollent;
|
233
231
|
pp->target = target;
|
234
|
-
pp->initial_metadata_flags = initial_metadata_flags;
|
232
|
+
pp->initial_metadata_flags = pick_args->initial_metadata_flags;
|
235
233
|
pp->on_complete = on_complete;
|
236
234
|
p->pending_picks = pp;
|
237
235
|
gpr_mu_unlock(&p->mu);
|
@@ -296,6 +294,8 @@ static void pf_connectivity_changed(grpc_exec_ctx *exec_ctx, void *arg,
|
|
296
294
|
} else {
|
297
295
|
loop:
|
298
296
|
switch (p->checking_connectivity) {
|
297
|
+
case GRPC_CHANNEL_INIT:
|
298
|
+
GPR_UNREACHABLE_CODE(return );
|
299
299
|
case GRPC_CHANNEL_READY:
|
300
300
|
grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
|
301
301
|
GRPC_CHANNEL_READY, GRPC_ERROR_NONE,
|
@@ -308,16 +308,15 @@ static void pf_connectivity_changed(grpc_exec_ctx *exec_ctx, void *arg,
|
|
308
308
|
/* drop the pick list: we are connected now */
|
309
309
|
GRPC_LB_POLICY_WEAK_REF(&p->base, "destroy_subchannels");
|
310
310
|
gpr_atm_rel_store(&p->selected, (gpr_atm)selected);
|
311
|
-
|
312
|
-
|
313
|
-
|
311
|
+
grpc_closure_sched(exec_ctx,
|
312
|
+
grpc_closure_create(destroy_subchannels, p,
|
313
|
+
grpc_schedule_on_exec_ctx),
|
314
|
+
GRPC_ERROR_NONE);
|
314
315
|
/* update any calls that were waiting for a pick */
|
315
316
|
while ((pp = p->pending_picks)) {
|
316
317
|
p->pending_picks = pp->next;
|
317
|
-
*pp->target = selected;
|
318
|
-
|
319
|
-
p->base.interested_parties);
|
320
|
-
grpc_exec_ctx_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE, NULL);
|
318
|
+
*pp->target = GRPC_CONNECTED_SUBCHANNEL_REF(selected, "picked");
|
319
|
+
grpc_closure_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE);
|
321
320
|
gpr_free(pp);
|
322
321
|
}
|
323
322
|
grpc_connected_subchannel_notify_on_state_change(
|
@@ -370,8 +369,7 @@ static void pf_connectivity_changed(grpc_exec_ctx *exec_ctx, void *arg,
|
|
370
369
|
while ((pp = p->pending_picks)) {
|
371
370
|
p->pending_picks = pp->next;
|
372
371
|
*pp->target = NULL;
|
373
|
-
|
374
|
-
NULL);
|
372
|
+
grpc_closure_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE);
|
375
373
|
gpr_free(pp);
|
376
374
|
}
|
377
375
|
GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &p->base,
|
@@ -423,8 +421,7 @@ static void pf_ping_one(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
|
423
421
|
if (selected) {
|
424
422
|
grpc_connected_subchannel_ping(exec_ctx, selected, closure);
|
425
423
|
} else {
|
426
|
-
|
427
|
-
NULL);
|
424
|
+
grpc_closure_sched(exec_ctx, closure, GRPC_ERROR_CREATE("Not connected"));
|
428
425
|
}
|
429
426
|
}
|
430
427
|
|
@@ -440,26 +437,46 @@ static void pick_first_factory_unref(grpc_lb_policy_factory *factory) {}
|
|
440
437
|
static grpc_lb_policy *create_pick_first(grpc_exec_ctx *exec_ctx,
|
441
438
|
grpc_lb_policy_factory *factory,
|
442
439
|
grpc_lb_policy_args *args) {
|
443
|
-
GPR_ASSERT(args->addresses != NULL);
|
444
440
|
GPR_ASSERT(args->client_channel_factory != NULL);
|
445
441
|
|
446
|
-
|
442
|
+
/* Find the number of backend addresses. We ignore balancer
|
443
|
+
* addresses, since we don't know how to handle them. */
|
444
|
+
const grpc_arg *arg =
|
445
|
+
grpc_channel_args_find(args->args, GRPC_ARG_LB_ADDRESSES);
|
446
|
+
GPR_ASSERT(arg != NULL && arg->type == GRPC_ARG_POINTER);
|
447
|
+
grpc_lb_addresses *addresses = arg->value.pointer.p;
|
448
|
+
size_t num_addrs = 0;
|
449
|
+
for (size_t i = 0; i < addresses->num_addresses; i++) {
|
450
|
+
if (!addresses->addresses[i].is_balancer) ++num_addrs;
|
451
|
+
}
|
452
|
+
if (num_addrs == 0) return NULL;
|
447
453
|
|
448
454
|
pick_first_lb_policy *p = gpr_malloc(sizeof(*p));
|
449
455
|
memset(p, 0, sizeof(*p));
|
450
456
|
|
451
|
-
p->subchannels =
|
452
|
-
|
453
|
-
memset(p->subchannels, 0, sizeof(*p->subchannels) * args->addresses->naddrs);
|
457
|
+
p->subchannels = gpr_malloc(sizeof(grpc_subchannel *) * num_addrs);
|
458
|
+
memset(p->subchannels, 0, sizeof(*p->subchannels) * num_addrs);
|
454
459
|
grpc_subchannel_args sc_args;
|
455
460
|
size_t subchannel_idx = 0;
|
456
|
-
for (size_t i = 0; i <
|
457
|
-
|
458
|
-
|
459
|
-
|
461
|
+
for (size_t i = 0; i < addresses->num_addresses; i++) {
|
462
|
+
/* Skip balancer addresses, since we only know how to handle backends. */
|
463
|
+
if (addresses->addresses[i].is_balancer) continue;
|
464
|
+
|
465
|
+
if (addresses->addresses[i].user_data != NULL) {
|
466
|
+
gpr_log(GPR_ERROR,
|
467
|
+
"This LB policy doesn't support user data. It will be ignored");
|
468
|
+
}
|
460
469
|
|
470
|
+
memset(&sc_args, 0, sizeof(grpc_subchannel_args));
|
471
|
+
grpc_arg addr_arg =
|
472
|
+
grpc_create_subchannel_address_arg(&addresses->addresses[i].address);
|
473
|
+
grpc_channel_args *new_args =
|
474
|
+
grpc_channel_args_copy_and_add(args->args, &addr_arg, 1);
|
475
|
+
gpr_free(addr_arg.value.string);
|
476
|
+
sc_args.args = new_args;
|
461
477
|
grpc_subchannel *subchannel = grpc_client_channel_factory_create_subchannel(
|
462
478
|
exec_ctx, args->client_channel_factory, &sc_args);
|
479
|
+
grpc_channel_args_destroy(exec_ctx, new_args);
|
463
480
|
|
464
481
|
if (subchannel != NULL) {
|
465
482
|
p->subchannels[subchannel_idx++] = subchannel;
|
@@ -473,7 +490,8 @@ static grpc_lb_policy *create_pick_first(grpc_exec_ctx *exec_ctx,
|
|
473
490
|
p->num_subchannels = subchannel_idx;
|
474
491
|
|
475
492
|
grpc_lb_policy_init(&p->base, &pick_first_lb_policy_vtable);
|
476
|
-
grpc_closure_init(&p->connectivity_changed, pf_connectivity_changed, p
|
493
|
+
grpc_closure_init(&p->connectivity_changed, pf_connectivity_changed, p,
|
494
|
+
grpc_schedule_on_exec_ctx);
|
477
495
|
gpr_mu_init(&p->mu);
|
478
496
|
return &p->base;
|
479
497
|
}
|
@@ -63,9 +63,13 @@
|
|
63
63
|
|
64
64
|
#include <grpc/support/alloc.h>
|
65
65
|
|
66
|
-
#include "src/core/ext/
|
66
|
+
#include "src/core/ext/client_channel/lb_policy_registry.h"
|
67
|
+
#include "src/core/ext/client_channel/subchannel.h"
|
68
|
+
#include "src/core/lib/channel/channel_args.h"
|
67
69
|
#include "src/core/lib/debug/trace.h"
|
70
|
+
#include "src/core/lib/iomgr/sockaddr_utils.h"
|
68
71
|
#include "src/core/lib/transport/connectivity_state.h"
|
72
|
+
#include "src/core/lib/transport/static_metadata.h"
|
69
73
|
|
70
74
|
typedef struct round_robin_lb_policy round_robin_lb_policy;
|
71
75
|
|
@@ -76,15 +80,29 @@ int grpc_lb_round_robin_trace = 0;
|
|
76
80
|
* Once a pick is available, \a target is updated and \a on_complete called. */
|
77
81
|
typedef struct pending_pick {
|
78
82
|
struct pending_pick *next;
|
79
|
-
|
83
|
+
|
84
|
+
/* output argument where to store the pick()ed user_data. It'll be NULL if no
|
85
|
+
* such data is present or there's an error (the definite test for errors is
|
86
|
+
* \a target being NULL). */
|
87
|
+
void **user_data;
|
88
|
+
|
89
|
+
/* bitmask passed to pick() and used for selective cancelling. See
|
90
|
+
* grpc_lb_policy_cancel_picks() */
|
80
91
|
uint32_t initial_metadata_flags;
|
92
|
+
|
93
|
+
/* output argument where to store the pick()ed connected subchannel, or NULL
|
94
|
+
* upon error. */
|
81
95
|
grpc_connected_subchannel **target;
|
96
|
+
|
97
|
+
/* to be invoked once the pick() has completed (regardless of success) */
|
82
98
|
grpc_closure *on_complete;
|
83
99
|
} pending_pick;
|
84
100
|
|
85
101
|
/** List of subchannels in a connectivity READY state */
|
86
102
|
typedef struct ready_list {
|
87
103
|
grpc_subchannel *subchannel;
|
104
|
+
/* references namesake entry in subchannel_data */
|
105
|
+
void *user_data;
|
88
106
|
struct ready_list *next;
|
89
107
|
struct ready_list *prev;
|
90
108
|
} ready_list;
|
@@ -100,20 +118,36 @@ typedef struct {
|
|
100
118
|
grpc_closure connectivity_changed_closure;
|
101
119
|
/** this subchannels current position in subchannel->ready_list */
|
102
120
|
ready_list *ready_list_node;
|
103
|
-
/** last observed connectivity
|
104
|
-
|
121
|
+
/** last observed connectivity. Not updated by
|
122
|
+
* \a grpc_subchannel_notify_on_state_change. Used to determine the previous
|
123
|
+
* state while processing the new state in \a rr_connectivity_changed */
|
124
|
+
grpc_connectivity_state prev_connectivity_state;
|
125
|
+
/** current connectivity state. Updated by \a
|
126
|
+
* grpc_subchannel_notify_on_state_change */
|
127
|
+
grpc_connectivity_state curr_connectivity_state;
|
128
|
+
/** the subchannel's target user data */
|
129
|
+
void *user_data;
|
130
|
+
/** vtable to operate over \a user_data */
|
131
|
+
const grpc_lb_user_data_vtable *user_data_vtable;
|
105
132
|
} subchannel_data;
|
106
133
|
|
107
134
|
struct round_robin_lb_policy {
|
108
135
|
/** base policy: must be first */
|
109
136
|
grpc_lb_policy base;
|
137
|
+
gpr_mu mu;
|
138
|
+
|
139
|
+
/** total number of addresses received at creation time */
|
140
|
+
size_t num_addresses;
|
110
141
|
|
111
142
|
/** all our subchannels */
|
112
143
|
size_t num_subchannels;
|
113
144
|
subchannel_data **subchannels;
|
114
145
|
|
115
|
-
/**
|
116
|
-
|
146
|
+
/** how many subchannels are in TRANSIENT_FAILURE */
|
147
|
+
size_t num_transient_failures;
|
148
|
+
/** how many subchannels are IDLE */
|
149
|
+
size_t num_idle;
|
150
|
+
|
117
151
|
/** have we started picking? */
|
118
152
|
int started_picking;
|
119
153
|
/** are we shutting down? */
|
@@ -165,17 +199,24 @@ static void advance_last_picked_locked(round_robin_lb_policy *p) {
|
|
165
199
|
}
|
166
200
|
|
167
201
|
if (grpc_lb_round_robin_trace) {
|
168
|
-
gpr_log(GPR_DEBUG,
|
169
|
-
p
|
202
|
+
gpr_log(GPR_DEBUG,
|
203
|
+
"[READYLIST, RR: %p] ADVANCED LAST PICK. NOW AT NODE %p (SC %p, "
|
204
|
+
"CSC %p)",
|
205
|
+
(void *)p, (void *)p->ready_list_last_pick,
|
206
|
+
(void *)p->ready_list_last_pick->subchannel,
|
207
|
+
(void *)grpc_subchannel_get_connected_subchannel(
|
208
|
+
p->ready_list_last_pick->subchannel));
|
170
209
|
}
|
171
210
|
}
|
172
211
|
|
173
212
|
/** Prepends (relative to the root at p->ready_list) the connected subchannel \a
|
174
213
|
* csc to the list of ready subchannels. */
|
175
214
|
static ready_list *add_connected_sc_locked(round_robin_lb_policy *p,
|
176
|
-
|
215
|
+
subchannel_data *sd) {
|
177
216
|
ready_list *new_elem = gpr_malloc(sizeof(ready_list));
|
178
|
-
new_elem
|
217
|
+
memset(new_elem, 0, sizeof(ready_list));
|
218
|
+
new_elem->subchannel = sd->subchannel;
|
219
|
+
new_elem->user_data = sd->user_data;
|
179
220
|
if (p->ready_list.prev == NULL) {
|
180
221
|
/* first element */
|
181
222
|
new_elem->next = &p->ready_list;
|
@@ -189,7 +230,8 @@ static ready_list *add_connected_sc_locked(round_robin_lb_policy *p,
|
|
189
230
|
p->ready_list.prev = new_elem;
|
190
231
|
}
|
191
232
|
if (grpc_lb_round_robin_trace) {
|
192
|
-
gpr_log(GPR_DEBUG, "[READYLIST] ADDING NODE %p (SC %p)",
|
233
|
+
gpr_log(GPR_DEBUG, "[READYLIST] ADDING NODE %p (Conn. SC %p)",
|
234
|
+
(void *)new_elem, (void *)sd->subchannel);
|
193
235
|
}
|
194
236
|
return new_elem;
|
195
237
|
}
|
@@ -216,8 +258,8 @@ static void remove_disconnected_sc_locked(round_robin_lb_policy *p,
|
|
216
258
|
}
|
217
259
|
|
218
260
|
if (grpc_lb_round_robin_trace) {
|
219
|
-
gpr_log(GPR_DEBUG, "[READYLIST] REMOVED NODE %p (SC %p)", node,
|
220
|
-
node->subchannel);
|
261
|
+
gpr_log(GPR_DEBUG, "[READYLIST] REMOVED NODE %p (SC %p)", (void *)node,
|
262
|
+
(void *)node->subchannel);
|
221
263
|
}
|
222
264
|
|
223
265
|
node->next = NULL;
|
@@ -227,13 +269,25 @@ static void remove_disconnected_sc_locked(round_robin_lb_policy *p,
|
|
227
269
|
gpr_free(node);
|
228
270
|
}
|
229
271
|
|
272
|
+
static bool is_ready_list_empty(round_robin_lb_policy *p) {
|
273
|
+
return p->ready_list.prev == NULL;
|
274
|
+
}
|
275
|
+
|
230
276
|
static void rr_destroy(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
|
231
277
|
round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
|
232
|
-
size_t i;
|
233
278
|
ready_list *elem;
|
234
|
-
|
279
|
+
|
280
|
+
if (grpc_lb_round_robin_trace) {
|
281
|
+
gpr_log(GPR_DEBUG, "Destroying Round Robin policy at %p", (void *)pol);
|
282
|
+
}
|
283
|
+
|
284
|
+
for (size_t i = 0; i < p->num_subchannels; i++) {
|
235
285
|
subchannel_data *sd = p->subchannels[i];
|
236
|
-
GRPC_SUBCHANNEL_UNREF(exec_ctx, sd->subchannel, "
|
286
|
+
GRPC_SUBCHANNEL_UNREF(exec_ctx, sd->subchannel, "rr_destroy");
|
287
|
+
if (sd->user_data != NULL) {
|
288
|
+
GPR_ASSERT(sd->user_data_vtable != NULL);
|
289
|
+
sd->user_data_vtable->destroy(exec_ctx, sd->user_data);
|
290
|
+
}
|
237
291
|
gpr_free(sd);
|
238
292
|
}
|
239
293
|
|
@@ -251,6 +305,7 @@ static void rr_destroy(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
|
|
251
305
|
gpr_free(elem);
|
252
306
|
elem = tmp;
|
253
307
|
}
|
308
|
+
|
254
309
|
gpr_free(p);
|
255
310
|
}
|
256
311
|
|
@@ -260,18 +315,21 @@ static void rr_shutdown(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
|
|
260
315
|
size_t i;
|
261
316
|
|
262
317
|
gpr_mu_lock(&p->mu);
|
318
|
+
if (grpc_lb_round_robin_trace) {
|
319
|
+
gpr_log(GPR_DEBUG, "Shutting down Round Robin policy at %p", (void *)pol);
|
320
|
+
}
|
263
321
|
|
264
322
|
p->shutdown = 1;
|
265
323
|
while ((pp = p->pending_picks)) {
|
266
324
|
p->pending_picks = pp->next;
|
267
325
|
*pp->target = NULL;
|
268
|
-
|
269
|
-
|
326
|
+
grpc_closure_sched(exec_ctx, pp->on_complete,
|
327
|
+
GRPC_ERROR_CREATE("Channel Shutdown"));
|
270
328
|
gpr_free(pp);
|
271
329
|
}
|
272
330
|
grpc_connectivity_state_set(
|
273
331
|
exec_ctx, &p->state_tracker, GRPC_CHANNEL_SHUTDOWN,
|
274
|
-
GRPC_ERROR_CREATE("Channel Shutdown"), "
|
332
|
+
GRPC_ERROR_CREATE("Channel Shutdown"), "rr_shutdown");
|
275
333
|
for (i = 0; i < p->num_subchannels; i++) {
|
276
334
|
subchannel_data *sd = p->subchannels[i];
|
277
335
|
grpc_subchannel_notify_on_state_change(exec_ctx, sd->subchannel, NULL, NULL,
|
@@ -281,7 +339,8 @@ static void rr_shutdown(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
|
|
281
339
|
}
|
282
340
|
|
283
341
|
static void rr_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
284
|
-
grpc_connected_subchannel **target
|
342
|
+
grpc_connected_subchannel **target,
|
343
|
+
grpc_error *error) {
|
285
344
|
round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
|
286
345
|
pending_pick *pp;
|
287
346
|
gpr_mu_lock(&p->mu);
|
@@ -290,11 +349,10 @@ static void rr_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
|
290
349
|
while (pp != NULL) {
|
291
350
|
pending_pick *next = pp->next;
|
292
351
|
if (pp->target == target) {
|
293
|
-
grpc_polling_entity_del_from_pollset_set(exec_ctx, pp->pollent,
|
294
|
-
p->base.interested_parties);
|
295
352
|
*target = NULL;
|
296
|
-
|
297
|
-
|
353
|
+
grpc_closure_sched(
|
354
|
+
exec_ctx, pp->on_complete,
|
355
|
+
GRPC_ERROR_CREATE_REFERENCING("Pick cancelled", &error, 1));
|
298
356
|
gpr_free(pp);
|
299
357
|
} else {
|
300
358
|
pp->next = p->pending_picks;
|
@@ -303,11 +361,13 @@ static void rr_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
|
303
361
|
pp = next;
|
304
362
|
}
|
305
363
|
gpr_mu_unlock(&p->mu);
|
364
|
+
GRPC_ERROR_UNREF(error);
|
306
365
|
}
|
307
366
|
|
308
367
|
static void rr_cancel_picks(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
309
368
|
uint32_t initial_metadata_flags_mask,
|
310
|
-
uint32_t initial_metadata_flags_eq
|
369
|
+
uint32_t initial_metadata_flags_eq,
|
370
|
+
grpc_error *error) {
|
311
371
|
round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
|
312
372
|
pending_pick *pp;
|
313
373
|
gpr_mu_lock(&p->mu);
|
@@ -317,11 +377,10 @@ static void rr_cancel_picks(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
|
317
377
|
pending_pick *next = pp->next;
|
318
378
|
if ((pp->initial_metadata_flags & initial_metadata_flags_mask) ==
|
319
379
|
initial_metadata_flags_eq) {
|
320
|
-
grpc_polling_entity_del_from_pollset_set(exec_ctx, pp->pollent,
|
321
|
-
p->base.interested_parties);
|
322
380
|
*pp->target = NULL;
|
323
|
-
|
324
|
-
|
381
|
+
grpc_closure_sched(
|
382
|
+
exec_ctx, pp->on_complete,
|
383
|
+
GRPC_ERROR_CREATE_REFERENCING("Pick cancelled", &error, 1));
|
325
384
|
gpr_free(pp);
|
326
385
|
} else {
|
327
386
|
pp->next = p->pending_picks;
|
@@ -330,24 +389,25 @@ static void rr_cancel_picks(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
|
330
389
|
pp = next;
|
331
390
|
}
|
332
391
|
gpr_mu_unlock(&p->mu);
|
392
|
+
GRPC_ERROR_UNREF(error);
|
333
393
|
}
|
334
394
|
|
335
395
|
static void start_picking(grpc_exec_ctx *exec_ctx, round_robin_lb_policy *p) {
|
336
396
|
size_t i;
|
337
397
|
p->started_picking = 1;
|
338
398
|
|
339
|
-
if (grpc_lb_round_robin_trace) {
|
340
|
-
gpr_log(GPR_DEBUG, "LB_POLICY: p=%p num_subchannels=%" PRIuPTR, p,
|
341
|
-
p->num_subchannels);
|
342
|
-
}
|
343
|
-
|
344
399
|
for (i = 0; i < p->num_subchannels; i++) {
|
345
400
|
subchannel_data *sd = p->subchannels[i];
|
346
|
-
|
401
|
+
/* use some sentinel value outside of the range of grpc_connectivity_state
|
402
|
+
* to signal an undefined previous state. We won't be referring to this
|
403
|
+
* value again and it'll be overwritten after the first call to
|
404
|
+
* rr_connectivity_changed */
|
405
|
+
sd->prev_connectivity_state = GRPC_CHANNEL_INIT;
|
406
|
+
sd->curr_connectivity_state = GRPC_CHANNEL_IDLE;
|
407
|
+
GRPC_LB_POLICY_WEAK_REF(&p->base, "rr_connectivity");
|
347
408
|
grpc_subchannel_notify_on_state_change(
|
348
409
|
exec_ctx, sd->subchannel, p->base.interested_parties,
|
349
|
-
&sd->
|
350
|
-
GRPC_LB_POLICY_WEAK_REF(&p->base, "round_robin_connectivity");
|
410
|
+
&sd->curr_connectivity_state, &sd->connectivity_changed_closure);
|
351
411
|
}
|
352
412
|
}
|
353
413
|
|
@@ -361,159 +421,231 @@ static void rr_exit_idle(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
|
|
361
421
|
}
|
362
422
|
|
363
423
|
static int rr_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
364
|
-
|
365
|
-
|
366
|
-
uint32_t initial_metadata_flags,
|
367
|
-
grpc_connected_subchannel **target,
|
424
|
+
const grpc_lb_policy_pick_args *pick_args,
|
425
|
+
grpc_connected_subchannel **target, void **user_data,
|
368
426
|
grpc_closure *on_complete) {
|
369
427
|
round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
|
370
428
|
pending_pick *pp;
|
371
429
|
ready_list *selected;
|
372
430
|
gpr_mu_lock(&p->mu);
|
431
|
+
|
432
|
+
if (grpc_lb_round_robin_trace) {
|
433
|
+
gpr_log(GPR_INFO, "Round Robin %p trying to pick", (void *)pol);
|
434
|
+
}
|
435
|
+
|
373
436
|
if ((selected = peek_next_connected_locked(p))) {
|
374
|
-
|
375
|
-
*target =
|
437
|
+
/* readily available, report right away */
|
438
|
+
*target = GRPC_CONNECTED_SUBCHANNEL_REF(
|
439
|
+
grpc_subchannel_get_connected_subchannel(selected->subchannel),
|
440
|
+
"rr_picked");
|
441
|
+
|
442
|
+
if (user_data != NULL) {
|
443
|
+
*user_data = selected->user_data;
|
444
|
+
}
|
376
445
|
if (grpc_lb_round_robin_trace) {
|
377
446
|
gpr_log(GPR_DEBUG,
|
378
|
-
"[RR PICK] TARGET <-- CONNECTED SUBCHANNEL %p (NODE %p)",
|
379
|
-
selected);
|
447
|
+
"[RR PICK] TARGET <-- CONNECTED SUBCHANNEL %p (NODE %p)",
|
448
|
+
(void *)*target, (void *)selected);
|
380
449
|
}
|
381
450
|
/* only advance the last picked pointer if the selection was used */
|
382
451
|
advance_last_picked_locked(p);
|
452
|
+
gpr_mu_unlock(&p->mu);
|
383
453
|
return 1;
|
384
454
|
} else {
|
455
|
+
/* no pick currently available. Save for later in list of pending picks */
|
385
456
|
if (!p->started_picking) {
|
386
457
|
start_picking(exec_ctx, p);
|
387
458
|
}
|
388
|
-
grpc_polling_entity_add_to_pollset_set(exec_ctx, pollent,
|
389
|
-
p->base.interested_parties);
|
390
459
|
pp = gpr_malloc(sizeof(*pp));
|
391
460
|
pp->next = p->pending_picks;
|
392
|
-
pp->pollent = pollent;
|
393
461
|
pp->target = target;
|
394
462
|
pp->on_complete = on_complete;
|
395
|
-
pp->initial_metadata_flags = initial_metadata_flags;
|
463
|
+
pp->initial_metadata_flags = pick_args->initial_metadata_flags;
|
464
|
+
pp->user_data = user_data;
|
396
465
|
p->pending_picks = pp;
|
397
466
|
gpr_mu_unlock(&p->mu);
|
398
467
|
return 0;
|
399
468
|
}
|
400
469
|
}
|
401
470
|
|
471
|
+
static void update_state_counters(subchannel_data *sd) {
|
472
|
+
round_robin_lb_policy *p = sd->policy;
|
473
|
+
|
474
|
+
/* update p->num_transient_failures (resp. p->num_idle): if the previous
|
475
|
+
* state was TRANSIENT_FAILURE (resp. IDLE), decrement
|
476
|
+
* p->num_transient_failures (resp. p->num_idle). */
|
477
|
+
if (sd->prev_connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
|
478
|
+
GPR_ASSERT(p->num_transient_failures > 0);
|
479
|
+
--p->num_transient_failures;
|
480
|
+
} else if (sd->prev_connectivity_state == GRPC_CHANNEL_IDLE) {
|
481
|
+
GPR_ASSERT(p->num_idle > 0);
|
482
|
+
--p->num_idle;
|
483
|
+
}
|
484
|
+
}
|
485
|
+
|
486
|
+
/* sd is the subchannel_data associted with the updated subchannel.
|
487
|
+
* shutdown_error will only be used upon policy transition to TRANSIENT_FAILURE
|
488
|
+
* or SHUTDOWN */
|
489
|
+
static grpc_connectivity_state update_lb_connectivity_status(
|
490
|
+
grpc_exec_ctx *exec_ctx, subchannel_data *sd, grpc_error *error) {
|
491
|
+
/* In priority order. The first rule to match terminates the search (ie, if we
|
492
|
+
* are on rule n, all previous rules were unfulfilled).
|
493
|
+
*
|
494
|
+
* 1) RULE: ANY subchannel is READY => policy is READY.
|
495
|
+
* CHECK: At least one subchannel is ready iff p->ready_list is NOT empty.
|
496
|
+
*
|
497
|
+
* 2) RULE: ANY subchannel is CONNECTING => policy is CONNECTING.
|
498
|
+
* CHECK: sd->curr_connectivity_state == CONNECTING.
|
499
|
+
*
|
500
|
+
* 3) RULE: ALL subchannels are SHUTDOWN => policy is SHUTDOWN.
|
501
|
+
* CHECK: p->num_subchannels = 0.
|
502
|
+
*
|
503
|
+
* 4) RULE: ALL subchannels are TRANSIENT_FAILURE => policy is
|
504
|
+
* TRANSIENT_FAILURE.
|
505
|
+
* CHECK: p->num_transient_failures == p->num_subchannels.
|
506
|
+
*
|
507
|
+
* 5) RULE: ALL subchannels are IDLE => policy is IDLE.
|
508
|
+
* CHECK: p->num_idle == p->num_subchannels.
|
509
|
+
*/
|
510
|
+
round_robin_lb_policy *p = sd->policy;
|
511
|
+
if (!is_ready_list_empty(p)) { /* 1) READY */
|
512
|
+
grpc_connectivity_state_set(exec_ctx, &p->state_tracker, GRPC_CHANNEL_READY,
|
513
|
+
GRPC_ERROR_NONE, "rr_ready");
|
514
|
+
return GRPC_CHANNEL_READY;
|
515
|
+
} else if (sd->curr_connectivity_state ==
|
516
|
+
GRPC_CHANNEL_CONNECTING) { /* 2) CONNECTING */
|
517
|
+
grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
|
518
|
+
GRPC_CHANNEL_CONNECTING, GRPC_ERROR_NONE,
|
519
|
+
"rr_connecting");
|
520
|
+
return GRPC_CHANNEL_CONNECTING;
|
521
|
+
} else if (p->num_subchannels == 0) { /* 3) SHUTDOWN */
|
522
|
+
grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
|
523
|
+
GRPC_CHANNEL_SHUTDOWN, GRPC_ERROR_REF(error),
|
524
|
+
"rr_shutdown");
|
525
|
+
return GRPC_CHANNEL_SHUTDOWN;
|
526
|
+
} else if (p->num_transient_failures ==
|
527
|
+
p->num_subchannels) { /* 4) TRANSIENT_FAILURE */
|
528
|
+
grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
|
529
|
+
GRPC_CHANNEL_TRANSIENT_FAILURE,
|
530
|
+
GRPC_ERROR_REF(error), "rr_transient_failure");
|
531
|
+
return GRPC_CHANNEL_TRANSIENT_FAILURE;
|
532
|
+
} else if (p->num_idle == p->num_subchannels) { /* 5) IDLE */
|
533
|
+
grpc_connectivity_state_set(exec_ctx, &p->state_tracker, GRPC_CHANNEL_IDLE,
|
534
|
+
GRPC_ERROR_NONE, "rr_idle");
|
535
|
+
return GRPC_CHANNEL_IDLE;
|
536
|
+
}
|
537
|
+
/* no change */
|
538
|
+
return sd->curr_connectivity_state;
|
539
|
+
}
|
540
|
+
|
402
541
|
static void rr_connectivity_changed(grpc_exec_ctx *exec_ctx, void *arg,
|
403
542
|
grpc_error *error) {
|
404
543
|
subchannel_data *sd = arg;
|
405
544
|
round_robin_lb_policy *p = sd->policy;
|
406
545
|
pending_pick *pp;
|
407
|
-
ready_list *selected;
|
408
|
-
|
409
|
-
int unref = 0;
|
410
546
|
|
411
547
|
GRPC_ERROR_REF(error);
|
412
548
|
gpr_mu_lock(&p->mu);
|
413
549
|
|
414
550
|
if (p->shutdown) {
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
551
|
+
gpr_mu_unlock(&p->mu);
|
552
|
+
GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &p->base, "rr_connectivity");
|
553
|
+
GRPC_ERROR_UNREF(error);
|
554
|
+
return;
|
555
|
+
}
|
556
|
+
switch (sd->curr_connectivity_state) {
|
557
|
+
case GRPC_CHANNEL_INIT:
|
558
|
+
GPR_UNREACHABLE_CODE(return );
|
559
|
+
case GRPC_CHANNEL_READY:
|
560
|
+
/* add the newly connected subchannel to the list of connected ones.
|
561
|
+
* Note that it goes to the "end of the line". */
|
562
|
+
sd->ready_list_node = add_connected_sc_locked(p, sd);
|
563
|
+
/* at this point we know there's at least one suitable subchannel. Go
|
564
|
+
* ahead and pick one and notify the pending suitors in
|
565
|
+
* p->pending_picks. This preemtively replicates rr_pick()'s actions. */
|
566
|
+
ready_list *selected = peek_next_connected_locked(p);
|
567
|
+
GPR_ASSERT(selected != NULL);
|
568
|
+
if (p->pending_picks != NULL) {
|
569
|
+
/* if the selected subchannel is going to be used for the pending
|
570
|
+
* picks, update the last picked pointer */
|
571
|
+
advance_last_picked_locked(p);
|
572
|
+
}
|
573
|
+
while ((pp = p->pending_picks)) {
|
574
|
+
p->pending_picks = pp->next;
|
575
|
+
*pp->target = GRPC_CONNECTED_SUBCHANNEL_REF(
|
576
|
+
grpc_subchannel_get_connected_subchannel(selected->subchannel),
|
577
|
+
"rr_picked");
|
578
|
+
if (pp->user_data != NULL) {
|
579
|
+
*pp->user_data = selected->user_data;
|
580
|
+
}
|
581
|
+
if (grpc_lb_round_robin_trace) {
|
582
|
+
gpr_log(GPR_DEBUG,
|
583
|
+
"[RR CONN CHANGED] TARGET <-- SUBCHANNEL %p (NODE %p)",
|
584
|
+
(void *)selected->subchannel, (void *)selected);
|
433
585
|
}
|
586
|
+
grpc_closure_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE);
|
587
|
+
gpr_free(pp);
|
588
|
+
}
|
589
|
+
update_lb_connectivity_status(exec_ctx, sd, error);
|
590
|
+
sd->prev_connectivity_state = sd->curr_connectivity_state;
|
591
|
+
/* renew notification: reuses the "rr_connectivity" weak ref */
|
592
|
+
grpc_subchannel_notify_on_state_change(
|
593
|
+
exec_ctx, sd->subchannel, p->base.interested_parties,
|
594
|
+
&sd->curr_connectivity_state, &sd->connectivity_changed_closure);
|
595
|
+
break;
|
596
|
+
case GRPC_CHANNEL_IDLE:
|
597
|
+
++p->num_idle;
|
598
|
+
/* fallthrough */
|
599
|
+
case GRPC_CHANNEL_CONNECTING:
|
600
|
+
update_state_counters(sd);
|
601
|
+
update_lb_connectivity_status(exec_ctx, sd, error);
|
602
|
+
sd->prev_connectivity_state = sd->curr_connectivity_state;
|
603
|
+
/* renew notification: reuses the "rr_connectivity" weak ref */
|
604
|
+
grpc_subchannel_notify_on_state_change(
|
605
|
+
exec_ctx, sd->subchannel, p->base.interested_parties,
|
606
|
+
&sd->curr_connectivity_state, &sd->connectivity_changed_closure);
|
607
|
+
break;
|
608
|
+
case GRPC_CHANNEL_TRANSIENT_FAILURE:
|
609
|
+
++p->num_transient_failures;
|
610
|
+
/* remove from ready list if still present */
|
611
|
+
if (sd->ready_list_node != NULL) {
|
612
|
+
remove_disconnected_sc_locked(p, sd->ready_list_node);
|
613
|
+
sd->ready_list_node = NULL;
|
614
|
+
}
|
615
|
+
update_lb_connectivity_status(exec_ctx, sd, error);
|
616
|
+
sd->prev_connectivity_state = sd->curr_connectivity_state;
|
617
|
+
/* renew notification: reuses the "rr_connectivity" weak ref */
|
618
|
+
grpc_subchannel_notify_on_state_change(
|
619
|
+
exec_ctx, sd->subchannel, p->base.interested_parties,
|
620
|
+
&sd->curr_connectivity_state, &sd->connectivity_changed_closure);
|
621
|
+
break;
|
622
|
+
case GRPC_CHANNEL_SHUTDOWN:
|
623
|
+
update_state_counters(sd);
|
624
|
+
if (sd->ready_list_node != NULL) {
|
625
|
+
remove_disconnected_sc_locked(p, sd->ready_list_node);
|
626
|
+
sd->ready_list_node = NULL;
|
627
|
+
}
|
628
|
+
--p->num_subchannels;
|
629
|
+
GPR_SWAP(subchannel_data *, p->subchannels[sd->index],
|
630
|
+
p->subchannels[p->num_subchannels]);
|
631
|
+
GRPC_SUBCHANNEL_UNREF(exec_ctx, sd->subchannel, "rr_subchannel_shutdown");
|
632
|
+
p->subchannels[sd->index]->index = sd->index;
|
633
|
+
if (update_lb_connectivity_status(exec_ctx, sd, error) ==
|
634
|
+
GRPC_CHANNEL_SHUTDOWN) {
|
635
|
+
/* the policy is shutting down. Flush all the pending picks... */
|
434
636
|
while ((pp = p->pending_picks)) {
|
435
637
|
p->pending_picks = pp->next;
|
436
|
-
*pp->target =
|
437
|
-
|
438
|
-
if (grpc_lb_round_robin_trace) {
|
439
|
-
gpr_log(GPR_DEBUG,
|
440
|
-
"[RR CONN CHANGED] TARGET <-- SUBCHANNEL %p (NODE %p)",
|
441
|
-
selected->subchannel, selected);
|
442
|
-
}
|
443
|
-
grpc_polling_entity_del_from_pollset_set(exec_ctx, pp->pollent,
|
444
|
-
p->base.interested_parties);
|
445
|
-
grpc_exec_ctx_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE, NULL);
|
638
|
+
*pp->target = NULL;
|
639
|
+
grpc_closure_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE);
|
446
640
|
gpr_free(pp);
|
447
641
|
}
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
case GRPC_CHANNEL_IDLE:
|
454
|
-
grpc_connectivity_state_set(
|
455
|
-
exec_ctx, &p->state_tracker, sd->connectivity_state,
|
456
|
-
GRPC_ERROR_REF(error), "connecting_changed");
|
457
|
-
grpc_subchannel_notify_on_state_change(
|
458
|
-
exec_ctx, sd->subchannel, p->base.interested_parties,
|
459
|
-
&sd->connectivity_state, &sd->connectivity_changed_closure);
|
460
|
-
break;
|
461
|
-
case GRPC_CHANNEL_TRANSIENT_FAILURE:
|
462
|
-
/* renew state notification */
|
463
|
-
grpc_subchannel_notify_on_state_change(
|
464
|
-
exec_ctx, sd->subchannel, p->base.interested_parties,
|
465
|
-
&sd->connectivity_state, &sd->connectivity_changed_closure);
|
466
|
-
|
467
|
-
/* remove from ready list if still present */
|
468
|
-
if (sd->ready_list_node != NULL) {
|
469
|
-
remove_disconnected_sc_locked(p, sd->ready_list_node);
|
470
|
-
sd->ready_list_node = NULL;
|
471
|
-
}
|
472
|
-
grpc_connectivity_state_set(
|
473
|
-
exec_ctx, &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
|
474
|
-
GRPC_ERROR_REF(error), "connecting_transient_failure");
|
475
|
-
break;
|
476
|
-
case GRPC_CHANNEL_SHUTDOWN:
|
477
|
-
if (sd->ready_list_node != NULL) {
|
478
|
-
remove_disconnected_sc_locked(p, sd->ready_list_node);
|
479
|
-
sd->ready_list_node = NULL;
|
480
|
-
}
|
481
|
-
|
482
|
-
p->num_subchannels--;
|
483
|
-
GPR_SWAP(subchannel_data *, p->subchannels[sd->index],
|
484
|
-
p->subchannels[p->num_subchannels]);
|
485
|
-
GRPC_SUBCHANNEL_UNREF(exec_ctx, sd->subchannel, "round_robin");
|
486
|
-
p->subchannels[sd->index]->index = sd->index;
|
487
|
-
gpr_free(sd);
|
488
|
-
|
489
|
-
unref = 1;
|
490
|
-
if (p->num_subchannels == 0) {
|
491
|
-
grpc_connectivity_state_set(
|
492
|
-
exec_ctx, &p->state_tracker, GRPC_CHANNEL_SHUTDOWN,
|
493
|
-
GRPC_ERROR_CREATE_REFERENCING("Round Robin Channels Exhausted",
|
494
|
-
&error, 1),
|
495
|
-
"no_more_channels");
|
496
|
-
while ((pp = p->pending_picks)) {
|
497
|
-
p->pending_picks = pp->next;
|
498
|
-
*pp->target = NULL;
|
499
|
-
grpc_exec_ctx_sched(exec_ctx, pp->on_complete, GRPC_ERROR_NONE,
|
500
|
-
NULL);
|
501
|
-
gpr_free(pp);
|
502
|
-
}
|
503
|
-
} else {
|
504
|
-
grpc_connectivity_state_set(
|
505
|
-
exec_ctx, &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
|
506
|
-
GRPC_ERROR_REF(error), "subchannel_failed");
|
507
|
-
}
|
508
|
-
} /* switch */
|
509
|
-
} /* !unref */
|
510
|
-
|
511
|
-
gpr_mu_unlock(&p->mu);
|
512
|
-
|
513
|
-
if (unref) {
|
514
|
-
GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &p->base, "round_robin_connectivity");
|
642
|
+
}
|
643
|
+
gpr_free(sd);
|
644
|
+
/* unref the "rr_connectivity" weak ref from start_picking */
|
645
|
+
GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &p->base, "rr_connectivity");
|
646
|
+
break;
|
515
647
|
}
|
516
|
-
|
648
|
+
gpr_mu_unlock(&p->mu);
|
517
649
|
GRPC_ERROR_UNREF(error);
|
518
650
|
}
|
519
651
|
|
@@ -547,12 +679,15 @@ static void rr_ping_one(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
|
|
547
679
|
gpr_mu_lock(&p->mu);
|
548
680
|
if ((selected = peek_next_connected_locked(p))) {
|
549
681
|
gpr_mu_unlock(&p->mu);
|
550
|
-
target =
|
682
|
+
target = GRPC_CONNECTED_SUBCHANNEL_REF(
|
683
|
+
grpc_subchannel_get_connected_subchannel(selected->subchannel),
|
684
|
+
"rr_picked");
|
551
685
|
grpc_connected_subchannel_ping(exec_ctx, target, closure);
|
686
|
+
GRPC_CONNECTED_SUBCHANNEL_UNREF(exec_ctx, target, "rr_picked");
|
552
687
|
} else {
|
553
688
|
gpr_mu_unlock(&p->mu);
|
554
|
-
|
555
|
-
|
689
|
+
grpc_closure_sched(exec_ctx, closure,
|
690
|
+
GRPC_ERROR_CREATE("Round Robin not connected"));
|
556
691
|
}
|
557
692
|
}
|
558
693
|
|
@@ -568,25 +703,43 @@ static void round_robin_factory_unref(grpc_lb_policy_factory *factory) {}
|
|
568
703
|
static grpc_lb_policy *round_robin_create(grpc_exec_ctx *exec_ctx,
|
569
704
|
grpc_lb_policy_factory *factory,
|
570
705
|
grpc_lb_policy_args *args) {
|
571
|
-
GPR_ASSERT(args->addresses != NULL);
|
572
706
|
GPR_ASSERT(args->client_channel_factory != NULL);
|
573
707
|
|
708
|
+
/* Find the number of backend addresses. We ignore balancer
|
709
|
+
* addresses, since we don't know how to handle them. */
|
710
|
+
const grpc_arg *arg =
|
711
|
+
grpc_channel_args_find(args->args, GRPC_ARG_LB_ADDRESSES);
|
712
|
+
GPR_ASSERT(arg != NULL && arg->type == GRPC_ARG_POINTER);
|
713
|
+
grpc_lb_addresses *addresses = arg->value.pointer.p;
|
714
|
+
size_t num_addrs = 0;
|
715
|
+
for (size_t i = 0; i < addresses->num_addresses; i++) {
|
716
|
+
if (!addresses->addresses[i].is_balancer) ++num_addrs;
|
717
|
+
}
|
718
|
+
if (num_addrs == 0) return NULL;
|
719
|
+
|
574
720
|
round_robin_lb_policy *p = gpr_malloc(sizeof(*p));
|
575
721
|
memset(p, 0, sizeof(*p));
|
576
722
|
|
577
|
-
p->
|
578
|
-
|
579
|
-
memset(p->subchannels, 0, sizeof(*p->subchannels) *
|
723
|
+
p->num_addresses = num_addrs;
|
724
|
+
p->subchannels = gpr_malloc(sizeof(*p->subchannels) * num_addrs);
|
725
|
+
memset(p->subchannels, 0, sizeof(*p->subchannels) * num_addrs);
|
580
726
|
|
581
727
|
grpc_subchannel_args sc_args;
|
582
728
|
size_t subchannel_idx = 0;
|
583
|
-
for (size_t i = 0; i <
|
584
|
-
|
585
|
-
|
586
|
-
sc_args.addr_len = (size_t)args->addresses->addrs[i].len;
|
729
|
+
for (size_t i = 0; i < addresses->num_addresses; i++) {
|
730
|
+
/* Skip balancer addresses, since we only know how to handle backends. */
|
731
|
+
if (addresses->addresses[i].is_balancer) continue;
|
587
732
|
|
733
|
+
memset(&sc_args, 0, sizeof(grpc_subchannel_args));
|
734
|
+
grpc_arg addr_arg =
|
735
|
+
grpc_create_subchannel_address_arg(&addresses->addresses[i].address);
|
736
|
+
grpc_channel_args *new_args =
|
737
|
+
grpc_channel_args_copy_and_add(args->args, &addr_arg, 1);
|
738
|
+
gpr_free(addr_arg.value.string);
|
739
|
+
sc_args.args = new_args;
|
588
740
|
grpc_subchannel *subchannel = grpc_client_channel_factory_create_subchannel(
|
589
741
|
exec_ctx, args->client_channel_factory, &sc_args);
|
742
|
+
grpc_channel_args_destroy(exec_ctx, new_args);
|
590
743
|
|
591
744
|
if (subchannel != NULL) {
|
592
745
|
subchannel_data *sd = gpr_malloc(sizeof(*sd));
|
@@ -595,12 +748,18 @@ static grpc_lb_policy *round_robin_create(grpc_exec_ctx *exec_ctx,
|
|
595
748
|
sd->policy = p;
|
596
749
|
sd->index = subchannel_idx;
|
597
750
|
sd->subchannel = subchannel;
|
751
|
+
sd->user_data_vtable = addresses->user_data_vtable;
|
752
|
+
if (sd->user_data_vtable != NULL) {
|
753
|
+
sd->user_data =
|
754
|
+
sd->user_data_vtable->copy(addresses->addresses[i].user_data);
|
755
|
+
}
|
598
756
|
++subchannel_idx;
|
599
757
|
grpc_closure_init(&sd->connectivity_changed_closure,
|
600
|
-
rr_connectivity_changed, sd);
|
758
|
+
rr_connectivity_changed, sd, grpc_schedule_on_exec_ctx);
|
601
759
|
}
|
602
760
|
}
|
603
761
|
if (subchannel_idx == 0) {
|
762
|
+
/* couldn't create any subchannel. Bail out */
|
604
763
|
gpr_free(p->subchannels);
|
605
764
|
gpr_free(p);
|
606
765
|
return NULL;
|
@@ -616,6 +775,11 @@ static grpc_lb_policy *round_robin_create(grpc_exec_ctx *exec_ctx,
|
|
616
775
|
grpc_lb_policy_init(&p->base, &round_robin_lb_policy_vtable);
|
617
776
|
grpc_connectivity_state_init(&p->state_tracker, GRPC_CHANNEL_IDLE,
|
618
777
|
"round_robin");
|
778
|
+
|
779
|
+
if (grpc_lb_round_robin_trace) {
|
780
|
+
gpr_log(GPR_DEBUG, "Created RR policy at %p with %lu subchannels",
|
781
|
+
(void *)p, (unsigned long)p->num_subchannels);
|
782
|
+
}
|
619
783
|
gpr_mu_init(&p->mu);
|
620
784
|
return &p->base;
|
621
785
|
}
|