grpc 1.18.0 → 1.22.0
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 +4731 -7404
- data/etc/roots.pem +146 -0
- data/include/grpc/grpc.h +11 -6
- data/include/grpc/grpc_security.h +297 -4
- data/include/grpc/grpc_security_constants.h +1 -1
- data/include/grpc/impl/codegen/byte_buffer.h +13 -0
- data/include/grpc/impl/codegen/gpr_types.h +1 -1
- data/include/grpc/impl/codegen/grpc_types.h +30 -7
- data/include/grpc/impl/codegen/port_platform.h +88 -7
- data/include/grpc/impl/codegen/slice.h +2 -22
- data/include/grpc/impl/codegen/status.h +2 -1
- data/include/grpc/impl/codegen/sync_posix.h +18 -0
- data/include/grpc/slice.h +3 -3
- data/src/core/ext/filters/client_channel/backup_poller.cc +21 -16
- data/src/core/ext/filters/client_channel/backup_poller.h +8 -2
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +3 -1
- data/src/core/ext/filters/client_channel/client_channel.cc +2435 -1557
- data/src/core/ext/filters/client_channel/client_channel.h +2 -10
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -89
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +8 -33
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +22 -34
- data/src/core/ext/filters/client_channel/client_channel_factory.h +19 -38
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -11
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +179 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +68 -0
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +59 -55
- data/src/core/ext/filters/client_channel/health/health_check_client.h +20 -9
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +146 -157
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +29 -32
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +844 -859
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +3 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +2 -6
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +14 -12
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +16 -12
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +185 -312
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +143 -375
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +192 -245
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1554 -955
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +0 -43
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +14 -10
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +2 -2
- data/src/core/ext/filters/client_channel/lb_policy.cc +115 -22
- data/src/core/ext/filters/client_channel/lb_policy.h +260 -129
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +5 -2
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +107 -4
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +10 -3
- data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +96 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +56 -0
- data/src/core/ext/filters/client_channel/parse_address.cc +24 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +121 -122
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +84 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +179 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +24 -10
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +111 -47
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +7 -13
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +39 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +0 -6
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -64
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +28 -0
- data/src/core/{lib/iomgr/network_status_tracker.cc → ext/filters/client_channel/resolver/dns/dns_resolver_selection.h} +8 -15
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +36 -82
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +111 -72
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +13 -8
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +28 -63
- data/src/core/ext/filters/client_channel/resolver.cc +54 -1
- data/src/core/ext/filters/client_channel/resolver.h +52 -23
- data/src/core/ext/filters/client_channel/resolver_factory.h +3 -1
- data/src/core/ext/filters/client_channel/resolver_registry.cc +5 -2
- data/src/core/ext/filters/client_channel/resolver_registry.h +5 -4
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +368 -241
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +58 -76
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +543 -0
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +139 -0
- data/src/core/ext/filters/client_channel/server_address.cc +4 -54
- data/src/core/ext/filters/client_channel/server_address.h +1 -13
- data/src/core/ext/filters/client_channel/service_config.cc +329 -0
- data/src/core/ext/filters/client_channel/service_config.h +205 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +803 -838
- data/src/core/ext/filters/client_channel/subchannel.h +295 -128
- data/src/core/ext/filters/client_channel/subchannel_interface.h +113 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +97 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +94 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +3 -4
- data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
- data/src/core/ext/filters/http/client/http_client_filter.cc +7 -5
- data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +6 -3
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -3
- data/src/core/ext/filters/http/server/http_server_filter.cc +18 -12
- data/src/core/ext/filters/max_age/max_age_filter.cc +5 -2
- data/src/core/ext/filters/message_size/message_size_filter.cc +119 -77
- data/src/core/ext/filters/message_size/message_size_filter.h +33 -0
- data/src/core/ext/transport/chttp2/alpn/alpn.h +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -12
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +45 -47
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +134 -143
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +68 -21
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +4 -4
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +4 -3
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +9 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +156 -94
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -37
- data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -5
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -2
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -4
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +8 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -4
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +74 -55
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +33 -11
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -2
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +7 -14
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +10 -1
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +9 -5
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +9 -3
- data/src/core/ext/transport/chttp2/transport/internal.h +43 -30
- data/src/core/ext/transport/chttp2/transport/parsing.cc +52 -70
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/writing.cc +70 -33
- data/src/core/ext/transport/inproc/inproc_transport.cc +26 -18
- data/src/core/lib/channel/channel_args.cc +2 -101
- data/src/core/lib/channel/channel_args.h +3 -37
- data/src/core/lib/channel/channel_stack.h +10 -6
- data/src/core/lib/channel/channel_trace.cc +4 -4
- data/src/core/lib/channel/channel_trace.h +4 -4
- data/src/core/lib/channel/channelz.cc +168 -38
- data/src/core/lib/channel/channelz.h +40 -44
- data/src/core/lib/channel/channelz_registry.cc +75 -107
- data/src/core/lib/channel/channelz_registry.h +10 -28
- data/src/core/lib/channel/connected_channel.cc +2 -2
- data/src/core/lib/channel/context.h +2 -2
- data/src/core/lib/channel/handshaker.cc +151 -218
- data/src/core/lib/channel/handshaker.h +110 -101
- data/src/core/lib/channel/handshaker_factory.h +11 -19
- data/src/core/lib/channel/handshaker_registry.cc +67 -51
- data/src/core/lib/channel/handshaker_registry.h +21 -16
- data/src/core/lib/compression/algorithm_metadata.h +3 -3
- data/src/core/lib/compression/compression.cc +14 -9
- data/src/core/lib/compression/compression_args.cc +127 -0
- data/src/core/lib/compression/compression_args.h +55 -0
- data/src/core/lib/compression/compression_internal.cc +16 -12
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/compression/stream_compression.cc +3 -2
- data/src/core/lib/compression/stream_compression.h +2 -2
- data/src/core/lib/compression/stream_compression_gzip.cc +9 -9
- data/src/core/lib/debug/trace.cc +13 -7
- data/src/core/lib/debug/trace.h +14 -1
- data/src/core/lib/gpr/arena.h +13 -9
- data/src/core/lib/gpr/cpu_posix.cc +5 -3
- data/src/core/lib/gpr/env.h +3 -6
- data/src/core/lib/gpr/env_linux.cc +6 -1
- data/src/core/lib/gpr/env_posix.cc +5 -0
- data/src/core/lib/gpr/env_windows.cc +7 -5
- data/src/core/lib/gpr/log.cc +9 -13
- data/src/core/lib/gpr/log_posix.cc +2 -1
- data/src/core/lib/gpr/string.cc +20 -7
- data/src/core/lib/gpr/string.h +10 -3
- data/src/core/lib/gpr/sync_posix.cc +65 -4
- data/src/core/lib/gpr/time.cc +8 -0
- data/src/core/lib/gpr/time_posix.cc +21 -2
- data/src/core/lib/gprpp/arena.cc +103 -0
- data/src/core/lib/gprpp/arena.h +121 -0
- data/src/core/lib/gprpp/atomic.h +75 -5
- data/src/core/lib/gprpp/fork.cc +13 -32
- data/src/core/lib/gprpp/fork.h +5 -1
- data/src/core/lib/gprpp/global_config.h +96 -0
- data/src/core/lib/gprpp/global_config_custom.h +29 -0
- data/src/core/lib/gprpp/global_config_env.cc +135 -0
- data/src/core/lib/gprpp/global_config_env.h +131 -0
- data/src/core/lib/gprpp/global_config_generic.h +44 -0
- data/src/core/lib/gprpp/inlined_vector.h +8 -0
- data/src/core/lib/gprpp/map.h +436 -0
- data/src/core/lib/gprpp/memory.h +2 -2
- data/src/core/lib/gprpp/optional.h +48 -0
- data/src/core/lib/gprpp/orphanable.h +6 -5
- data/src/core/lib/gprpp/{mutex_lock.h → pair.h} +15 -19
- data/src/core/lib/gprpp/ref_counted.h +36 -17
- data/src/core/lib/gprpp/sync.h +126 -0
- data/src/core/lib/gprpp/thd.h +42 -7
- data/src/core/lib/gprpp/thd_posix.cc +31 -13
- data/src/core/lib/gprpp/thd_windows.cc +47 -34
- data/src/core/lib/http/httpcli.cc +6 -5
- data/src/core/lib/http/httpcli_security_connector.cc +13 -15
- data/src/core/lib/http/parser.cc +3 -2
- data/src/core/lib/http/parser.h +2 -1
- data/src/core/lib/iomgr/buffer_list.cc +182 -24
- data/src/core/lib/iomgr/buffer_list.h +72 -10
- data/src/core/lib/iomgr/call_combiner.cc +84 -90
- data/src/core/lib/iomgr/call_combiner.h +75 -82
- data/src/core/lib/iomgr/cfstream_handle.cc +203 -0
- data/src/core/lib/iomgr/cfstream_handle.h +86 -0
- data/src/core/lib/iomgr/combiner.cc +11 -3
- data/src/core/lib/iomgr/combiner.h +1 -1
- data/src/core/lib/iomgr/endpoint.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +3 -2
- data/src/core/lib/iomgr/endpoint_cfstream.cc +375 -0
- data/src/core/lib/iomgr/endpoint_cfstream.h +49 -0
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +2 -2
- data/src/core/lib/iomgr/error.cc +21 -17
- data/src/core/lib/iomgr/error.h +36 -6
- data/src/core/lib/iomgr/error_cfstream.cc +52 -0
- data/src/core/lib/iomgr/error_cfstream.h +31 -0
- data/src/core/lib/iomgr/error_internal.h +1 -1
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +44 -28
- data/src/core/lib/iomgr/ev_epollex_linux.cc +173 -194
- data/src/core/lib/iomgr/ev_poll_posix.cc +16 -487
- data/src/core/lib/iomgr/ev_posix.cc +29 -19
- data/src/core/lib/iomgr/ev_posix.h +19 -3
- data/src/core/lib/iomgr/ev_windows.cc +2 -2
- data/src/core/lib/iomgr/exec_ctx.cc +1 -0
- data/src/core/lib/iomgr/exec_ctx.h +137 -8
- data/src/core/lib/iomgr/executor.cc +147 -95
- data/src/core/lib/iomgr/executor.h +55 -49
- data/src/core/lib/iomgr/fork_posix.cc +6 -5
- data/src/core/lib/{gprpp/atomic_with_std.h → iomgr/grpc_if_nametoindex.h} +8 -13
- data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +42 -0
- data/src/core/lib/iomgr/{network_status_tracker.h → grpc_if_nametoindex_unsupported.cc} +15 -9
- data/src/core/lib/iomgr/internal_errqueue.cc +3 -5
- data/src/core/lib/iomgr/internal_errqueue.h +105 -3
- data/src/core/lib/iomgr/iomgr.cc +20 -13
- data/src/core/lib/iomgr/iomgr.h +15 -0
- data/src/core/lib/iomgr/iomgr_custom.cc +17 -3
- data/src/core/lib/iomgr/iomgr_custom.h +2 -0
- data/src/core/lib/iomgr/iomgr_internal.cc +10 -0
- data/src/core/lib/iomgr/iomgr_internal.h +12 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +19 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +93 -0
- data/src/core/lib/iomgr/iomgr_windows.cc +18 -2
- data/src/core/lib/iomgr/lockfree_event.cc +4 -4
- data/src/core/lib/iomgr/port.h +35 -0
- data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
- data/src/core/lib/iomgr/resolve_address_windows.cc +2 -1
- data/src/core/lib/iomgr/resource_quota.cc +40 -37
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +6 -2
- data/src/core/lib/iomgr/socket_windows.cc +19 -0
- data/src/core/lib/iomgr/socket_windows.h +8 -0
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +216 -0
- data/src/core/lib/iomgr/tcp_client_custom.cc +2 -2
- data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
- data/src/core/lib/iomgr/tcp_client_windows.cc +7 -5
- data/src/core/lib/iomgr/tcp_custom.cc +10 -14
- data/src/core/lib/iomgr/tcp_posix.cc +256 -140
- data/src/core/lib/iomgr/tcp_server.cc +5 -0
- data/src/core/lib/iomgr/tcp_server.h +24 -0
- data/src/core/lib/iomgr/tcp_server_custom.cc +14 -12
- data/src/core/lib/iomgr/tcp_server_posix.cc +86 -12
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
- data/src/core/lib/iomgr/tcp_server_windows.cc +13 -11
- data/src/core/lib/iomgr/tcp_uv.cc +5 -7
- data/src/core/lib/iomgr/tcp_windows.cc +8 -14
- data/src/core/lib/iomgr/timer.h +2 -1
- data/src/core/lib/iomgr/timer_generic.cc +16 -16
- data/src/core/lib/iomgr/timer_manager.cc +20 -11
- data/src/core/lib/iomgr/udp_server.cc +8 -6
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -19
- data/src/core/lib/json/json.cc +1 -4
- data/src/core/lib/profiling/basic_timers.cc +10 -4
- data/src/core/lib/security/context/security_context.cc +6 -7
- data/src/core/lib/security/context/security_context.h +3 -4
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
- data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
- data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -0
- data/src/core/lib/security/credentials/credentials.h +9 -1
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -3
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +2 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +10 -6
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +3 -3
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +9 -8
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -2
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +192 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +210 -0
- data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +129 -0
- data/src/core/lib/security/credentials/tls/spiffe_credentials.h +62 -0
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -8
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -12
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +7 -5
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +10 -8
- data/src/core/lib/security/security_connector/security_connector.cc +0 -1
- data/src/core/lib/security/security_connector/security_connector.h +3 -3
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +39 -38
- data/src/core/lib/security/security_connector/ssl_utils.cc +164 -26
- data/src/core/lib/security/security_connector/ssl_utils.h +70 -1
- data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +426 -0
- data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +122 -0
- data/src/core/lib/security/transport/auth_filters.h +5 -2
- data/src/core/lib/security/transport/client_auth_filter.cc +55 -50
- data/src/core/lib/security/transport/secure_endpoint.cc +6 -6
- data/src/core/lib/security/transport/security_handshaker.cc +271 -303
- data/src/core/lib/security/transport/security_handshaker.h +11 -2
- data/src/core/lib/security/transport/server_auth_filter.cc +3 -3
- data/src/core/lib/slice/b64.h +2 -2
- data/src/core/lib/slice/percent_encoding.cc +3 -3
- data/src/core/lib/slice/percent_encoding.h +3 -3
- data/src/core/lib/slice/slice.cc +174 -122
- data/src/core/lib/slice/slice_buffer.cc +54 -21
- data/src/core/lib/slice/slice_hash_table.h +4 -4
- data/src/core/lib/slice/slice_intern.cc +49 -107
- data/src/core/lib/slice/slice_internal.h +264 -3
- data/src/core/lib/slice/slice_string_helpers.cc +10 -1
- data/src/core/lib/slice/slice_string_helpers.h +3 -1
- data/src/core/lib/slice/slice_utils.h +50 -0
- data/src/core/lib/slice/slice_weak_hash_table.h +6 -6
- data/src/core/lib/surface/api_trace.h +1 -1
- data/src/core/lib/surface/byte_buffer_reader.cc +17 -0
- data/src/core/lib/surface/call.cc +67 -46
- data/src/core/lib/surface/call.h +7 -2
- data/src/core/lib/surface/call_details.cc +0 -1
- data/src/core/lib/surface/channel.cc +89 -97
- data/src/core/lib/surface/channel.h +60 -6
- data/src/core/lib/surface/channel_init.h +5 -0
- data/src/core/lib/surface/completion_queue.cc +221 -216
- data/src/core/lib/surface/completion_queue.h +2 -1
- data/src/core/lib/surface/init.cc +82 -33
- data/src/core/lib/surface/init.h +1 -0
- data/src/core/lib/surface/init_secure.cc +1 -1
- data/src/core/lib/surface/lame_client.cc +5 -7
- data/src/core/lib/surface/server.cc +42 -47
- data/src/core/lib/surface/validate_metadata.cc +14 -8
- data/src/core/lib/surface/validate_metadata.h +13 -2
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/bdp_estimator.cc +3 -3
- data/src/core/lib/transport/bdp_estimator.h +2 -2
- data/src/core/lib/transport/connectivity_state.cc +10 -40
- data/src/core/lib/transport/connectivity_state.h +0 -8
- data/src/core/lib/transport/error_utils.cc +12 -0
- data/src/core/lib/transport/metadata.cc +258 -267
- data/src/core/lib/transport/metadata.h +227 -16
- data/src/core/lib/transport/metadata_batch.cc +1 -1
- data/src/core/lib/transport/metadata_batch.h +1 -1
- data/src/core/lib/transport/static_metadata.cc +477 -399
- data/src/core/lib/transport/static_metadata.h +273 -182
- data/src/core/lib/transport/status_metadata.cc +3 -3
- data/src/core/lib/transport/timeout_encoding.cc +1 -1
- data/src/core/lib/transport/timeout_encoding.h +1 -1
- data/src/core/lib/transport/transport.cc +39 -72
- data/src/core/lib/transport/transport.h +59 -24
- data/src/core/lib/transport/transport_impl.h +1 -1
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
- data/src/core/tsi/alts/handshaker/alts_shared_resource.h +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +4 -3
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -1
- data/src/core/tsi/fake_transport_security.cc +4 -4
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
- data/src/core/tsi/ssl_transport_security.cc +12 -10
- data/src/core/tsi/ssl_transport_security.h +24 -4
- data/src/ruby/bin/math_pb.rb +18 -16
- data/src/ruby/ext/grpc/extconf.rb +12 -4
- data/src/ruby/ext/grpc/rb_call_credentials.c +8 -5
- data/src/ruby/ext/grpc/rb_channel.c +14 -10
- data/src/ruby/ext/grpc/rb_channel_credentials.c +8 -4
- data/src/ruby/ext/grpc/rb_compression_options.c +9 -7
- data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc.c +23 -24
- data/src/ruby/ext/grpc/rb_grpc.h +4 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +24 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +36 -0
- data/src/ruby/ext/grpc/rb_server.c +8 -4
- data/src/ruby/lib/grpc/errors.rb +22 -3
- data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
- data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/README.md +1 -1
- data/src/ruby/pb/grpc/health/v1/health_pb.rb +13 -10
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +18 -0
- data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +3 -1
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +58 -56
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -0
- data/src/ruby/spec/errors_spec.rb +141 -0
- data/third_party/cares/cares/ares.h +12 -0
- data/third_party/cares/cares/ares_create_query.c +5 -1
- data/third_party/cares/cares/ares_data.c +74 -73
- data/third_party/cares/cares/ares_destroy.c +6 -1
- data/third_party/cares/cares/ares_gethostbyaddr.c +5 -5
- data/third_party/cares/cares/ares_gethostbyname.c +15 -4
- data/third_party/cares/cares/ares_getnameinfo.c +11 -0
- data/third_party/cares/cares/ares_init.c +274 -173
- data/third_party/cares/cares/ares_library_init.c +21 -3
- data/third_party/cares/cares/ares_options.c +6 -2
- data/third_party/cares/cares/ares_parse_naptr_reply.c +7 -6
- data/third_party/cares/cares/ares_parse_ptr_reply.c +4 -2
- data/third_party/cares/cares/ares_platform.c +7 -0
- data/third_party/cares/cares/ares_private.h +19 -11
- data/third_party/cares/cares/ares_process.c +27 -2
- data/third_party/cares/cares/ares_rules.h +1 -1
- data/third_party/cares/cares/ares_search.c +7 -0
- data/third_party/cares/cares/ares_send.c +6 -0
- data/third_party/cares/cares/ares_strsplit.c +174 -0
- data/third_party/cares/cares/ares_strsplit.h +43 -0
- data/third_party/cares/cares/ares_version.h +4 -4
- data/third_party/cares/cares/config-win32.h +1 -1
- data/third_party/cares/cares/inet_ntop.c +2 -3
- data/third_party/cares/config_darwin/ares_config.h +3 -0
- data/third_party/cares/config_freebsd/ares_config.h +3 -0
- data/third_party/cares/config_linux/ares_config.h +3 -0
- data/third_party/cares/config_openbsd/ares_config.h +3 -0
- metadata +83 -48
- data/src/core/ext/filters/client_channel/request_routing.cc +0 -936
- data/src/core/ext/filters/client_channel/request_routing.h +0 -177
- data/src/core/ext/filters/client_channel/subchannel_index.cc +0 -248
- data/src/core/ext/filters/client_channel/subchannel_index.h +0 -76
- data/src/core/lib/channel/handshaker_factory.cc +0 -42
- data/src/core/lib/gpr/arena.cc +0 -192
- data/src/core/lib/gprpp/atomic_with_atm.h +0 -57
- data/src/core/lib/iomgr/wakeup_fd_cv.cc +0 -107
- data/src/core/lib/iomgr/wakeup_fd_cv.h +0 -69
- data/src/core/lib/transport/service_config.cc +0 -106
- data/src/core/lib/transport/service_config.h +0 -249
@@ -225,27 +225,27 @@ class Chttp2IncomingByteStream : public ByteStream {
|
|
225
225
|
// TODO(roth): When I converted this class to C++, I wanted to make it
|
226
226
|
// inherit from RefCounted or InternallyRefCounted instead of continuing
|
227
227
|
// to use its own custom ref-counting code. However, that would require
|
228
|
-
// using multiple
|
228
|
+
// using multiple inheritance, which sucks in general. And to make matters
|
229
229
|
// worse, it causes problems with our New<> and Delete<> wrappers.
|
230
230
|
// Specifically, unless RefCounted is first in the list of parent classes,
|
231
231
|
// it will see a different value of the address of the object than the one
|
232
232
|
// we actually allocated, in which case gpr_free() will be called on a
|
233
233
|
// different address than the one we got from gpr_malloc(), thus causing a
|
234
234
|
// crash. Given the fragility of depending on that, as well as a desire to
|
235
|
-
// avoid multiple
|
235
|
+
// avoid multiple inheritance in general, I've decided to leave this
|
236
236
|
// alone for now. We can revisit this once we're able to link against
|
237
237
|
// libc++, at which point we can eliminate New<> and Delete<> and
|
238
238
|
// switch to std::shared_ptr<>.
|
239
239
|
void Ref() { refs_.Ref(); }
|
240
240
|
void Unref() {
|
241
|
-
if (refs_.Unref()) {
|
241
|
+
if (GPR_UNLIKELY(refs_.Unref())) {
|
242
242
|
grpc_core::Delete(this);
|
243
243
|
}
|
244
244
|
}
|
245
245
|
|
246
246
|
void PublishError(grpc_error* error);
|
247
247
|
|
248
|
-
grpc_error* Push(grpc_slice slice, grpc_slice* slice_out);
|
248
|
+
grpc_error* Push(const grpc_slice& slice, grpc_slice* slice_out);
|
249
249
|
|
250
250
|
grpc_error* Finished(grpc_error* error, bool reset_on_error);
|
251
251
|
|
@@ -438,7 +438,8 @@ struct grpc_chttp2_transport {
|
|
438
438
|
void* parser_data = nullptr;
|
439
439
|
grpc_chttp2_stream* incoming_stream = nullptr;
|
440
440
|
grpc_error* (*parser)(void* parser_user_data, grpc_chttp2_transport* t,
|
441
|
-
grpc_chttp2_stream* s, grpc_slice slice,
|
441
|
+
grpc_chttp2_stream* s, const grpc_slice& slice,
|
442
|
+
int is_last);
|
442
443
|
|
443
444
|
grpc_chttp2_write_cb* write_cb_pool = nullptr;
|
444
445
|
|
@@ -498,17 +499,23 @@ typedef enum {
|
|
498
499
|
GRPC_METADATA_NOT_PUBLISHED,
|
499
500
|
GRPC_METADATA_SYNTHESIZED_FROM_FAKE,
|
500
501
|
GRPC_METADATA_PUBLISHED_FROM_WIRE,
|
501
|
-
|
502
|
+
GRPC_METADATA_PUBLISHED_AT_CLOSE
|
502
503
|
} grpc_published_metadata_method;
|
503
504
|
|
504
505
|
struct grpc_chttp2_stream {
|
505
506
|
grpc_chttp2_stream(grpc_chttp2_transport* t, grpc_stream_refcount* refcount,
|
506
|
-
const void* server_data,
|
507
|
+
const void* server_data, grpc_core::Arena* arena);
|
507
508
|
~grpc_chttp2_stream();
|
508
509
|
|
509
510
|
void* context;
|
510
511
|
grpc_chttp2_transport* t;
|
511
512
|
grpc_stream_refcount* refcount;
|
513
|
+
// Reffer is a 0-len structure, simply reffing `t` and `refcount` in its ctor
|
514
|
+
// before initializing the rest of the stream, to avoid cache misses. This
|
515
|
+
// field MUST be right after `t` and `refcount`.
|
516
|
+
struct Reffer {
|
517
|
+
explicit Reffer(grpc_chttp2_stream* s);
|
518
|
+
} reffer;
|
512
519
|
|
513
520
|
grpc_closure destroy_stream;
|
514
521
|
grpc_closure* destroy_stream_arg;
|
@@ -576,10 +583,6 @@ struct grpc_chttp2_stream {
|
|
576
583
|
|
577
584
|
grpc_slice_buffer frame_storage; /* protected by t combiner */
|
578
585
|
|
579
|
-
/* Accessed only by transport thread when stream->pending_byte_stream == false
|
580
|
-
* Accessed only by application thread when stream->pending_byte_stream ==
|
581
|
-
* true */
|
582
|
-
grpc_slice_buffer unprocessed_incoming_frames_buffer;
|
583
586
|
grpc_closure* on_next = nullptr; /* protected by t combiner */
|
584
587
|
bool pending_byte_stream = false; /* protected by t combiner */
|
585
588
|
// cached length of buffer to be used by the transport thread in cases where
|
@@ -587,6 +590,10 @@ struct grpc_chttp2_stream {
|
|
587
590
|
// application threads are allowed to modify
|
588
591
|
// unprocessed_incoming_frames_buffer
|
589
592
|
size_t unprocessed_incoming_frames_buffer_cached_length = 0;
|
593
|
+
/* Accessed only by transport thread when stream->pending_byte_stream == false
|
594
|
+
* Accessed only by application thread when stream->pending_byte_stream ==
|
595
|
+
* true */
|
596
|
+
grpc_slice_buffer unprocessed_incoming_frames_buffer;
|
590
597
|
grpc_closure reset_byte_stream;
|
591
598
|
grpc_error* byte_stream_error = GRPC_ERROR_NONE; /* protected by t combiner */
|
592
599
|
bool received_last_frame = false; /* protected by t combiner */
|
@@ -626,19 +633,8 @@ struct grpc_chttp2_stream {
|
|
626
633
|
GRPC_STREAM_COMPRESSION_IDENTITY_COMPRESS;
|
627
634
|
/* Stream decompression method to be used. */
|
628
635
|
grpc_stream_compression_method stream_decompression_method =
|
629
|
-
|
630
|
-
/** Stream compression decompress context */
|
631
|
-
grpc_stream_compression_context* stream_decompression_ctx = nullptr;
|
632
|
-
/** Stream compression compress context */
|
633
|
-
grpc_stream_compression_context* stream_compression_ctx = nullptr;
|
636
|
+
GRPC_STREAM_COMPRESSION_IDENTITY_DECOMPRESS;
|
634
637
|
|
635
|
-
/** Buffer storing data that is compressed but not sent */
|
636
|
-
grpc_slice_buffer compressed_data_buffer;
|
637
|
-
/** Amount of uncompressed bytes sent out when compressed_data_buffer is
|
638
|
-
* emptied */
|
639
|
-
size_t uncompressed_data_size = 0;
|
640
|
-
/** Temporary buffer storing decompressed data */
|
641
|
-
grpc_slice_buffer decompressed_data_buffer;
|
642
638
|
/** Whether bytes stored in unprocessed_incoming_byte_stream is decompressed
|
643
639
|
*/
|
644
640
|
bool unprocessed_incoming_frames_decompressed = false;
|
@@ -648,6 +644,22 @@ struct grpc_chttp2_stream {
|
|
648
644
|
size_t decompressed_header_bytes = 0;
|
649
645
|
/** Byte counter for number of bytes written */
|
650
646
|
size_t byte_counter = 0;
|
647
|
+
|
648
|
+
/** Amount of uncompressed bytes sent out when compressed_data_buffer is
|
649
|
+
* emptied */
|
650
|
+
size_t uncompressed_data_size;
|
651
|
+
/** Stream compression compress context */
|
652
|
+
grpc_stream_compression_context* stream_compression_ctx;
|
653
|
+
/** Buffer storing data that is compressed but not sent */
|
654
|
+
grpc_slice_buffer compressed_data_buffer;
|
655
|
+
|
656
|
+
/** Stream compression decompress context */
|
657
|
+
grpc_stream_compression_context* stream_decompression_ctx;
|
658
|
+
/** Temporary buffer storing decompressed data.
|
659
|
+
* Initialized, used, and destroyed only when stream uses (non-identity)
|
660
|
+
* compression.
|
661
|
+
*/
|
662
|
+
grpc_slice_buffer decompressed_data_buffer;
|
651
663
|
};
|
652
664
|
|
653
665
|
/** Transport writing call flow:
|
@@ -681,7 +693,7 @@ void grpc_chttp2_end_write(grpc_chttp2_transport* t, grpc_error* error);
|
|
681
693
|
/** Process one slice of incoming data; return 1 if the connection is still
|
682
694
|
viable after reading, or 0 if the connection should be torn down */
|
683
695
|
grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
|
684
|
-
grpc_slice slice);
|
696
|
+
const grpc_slice& slice);
|
685
697
|
|
686
698
|
bool grpc_chttp2_list_add_writable_stream(grpc_chttp2_transport* t,
|
687
699
|
grpc_chttp2_stream* s);
|
@@ -740,7 +752,7 @@ grpc_chttp2_stream* grpc_chttp2_parsing_accept_stream(grpc_chttp2_transport* t,
|
|
740
752
|
|
741
753
|
void grpc_chttp2_add_incoming_goaway(grpc_chttp2_transport* t,
|
742
754
|
uint32_t goaway_error,
|
743
|
-
grpc_slice goaway_text);
|
755
|
+
const grpc_slice& goaway_text);
|
744
756
|
|
745
757
|
void grpc_chttp2_parsing_become_skip_parser(grpc_chttp2_transport* t);
|
746
758
|
|
@@ -759,11 +771,12 @@ void grpc_chttp2_complete_closure_step(grpc_chttp2_transport* t,
|
|
759
771
|
// extern grpc_core::TraceFlag grpc_http_trace;
|
760
772
|
// extern grpc_core::TraceFlag grpc_flowctl_trace;
|
761
773
|
|
762
|
-
#define GRPC_CHTTP2_IF_TRACING(stmt)
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
774
|
+
#define GRPC_CHTTP2_IF_TRACING(stmt) \
|
775
|
+
do { \
|
776
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) { \
|
777
|
+
(stmt); \
|
778
|
+
} \
|
779
|
+
} while (0)
|
767
780
|
|
768
781
|
void grpc_chttp2_fake_status(grpc_chttp2_transport* t,
|
769
782
|
grpc_chttp2_stream* stream, grpc_error* error);
|
@@ -28,6 +28,7 @@
|
|
28
28
|
|
29
29
|
#include "src/core/lib/profiling/timers.h"
|
30
30
|
#include "src/core/lib/slice/slice_string_helpers.h"
|
31
|
+
#include "src/core/lib/slice/slice_utils.h"
|
31
32
|
#include "src/core/lib/transport/http2_errors.h"
|
32
33
|
#include "src/core/lib/transport/static_metadata.h"
|
33
34
|
#include "src/core/lib/transport/status_conversion.h"
|
@@ -45,14 +46,14 @@ static grpc_error* init_goaway_parser(grpc_chttp2_transport* t);
|
|
45
46
|
static grpc_error* init_skip_frame_parser(grpc_chttp2_transport* t,
|
46
47
|
int is_header);
|
47
48
|
|
48
|
-
static grpc_error* parse_frame_slice(grpc_chttp2_transport* t,
|
49
|
-
int is_last);
|
49
|
+
static grpc_error* parse_frame_slice(grpc_chttp2_transport* t,
|
50
|
+
const grpc_slice& slice, int is_last);
|
50
51
|
|
51
52
|
grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
|
52
|
-
grpc_slice slice) {
|
53
|
-
uint8_t* beg = GRPC_SLICE_START_PTR(slice);
|
54
|
-
uint8_t* end = GRPC_SLICE_END_PTR(slice);
|
55
|
-
uint8_t* cur = beg;
|
53
|
+
const grpc_slice& slice) {
|
54
|
+
const uint8_t* beg = GRPC_SLICE_START_PTR(slice);
|
55
|
+
const uint8_t* end = GRPC_SLICE_END_PTR(slice);
|
56
|
+
const uint8_t* cur = beg;
|
56
57
|
grpc_error* err;
|
57
58
|
|
58
59
|
if (cur == end) return GRPC_ERROR_NONE;
|
@@ -304,7 +305,7 @@ static grpc_error* init_frame_parser(grpc_chttp2_transport* t) {
|
|
304
305
|
case GRPC_CHTTP2_FRAME_GOAWAY:
|
305
306
|
return init_goaway_parser(t);
|
306
307
|
default:
|
307
|
-
if (grpc_http_trace
|
308
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
|
308
309
|
gpr_log(GPR_ERROR, "Unknown frame type %02x", t->incoming_frame_type);
|
309
310
|
}
|
310
311
|
return init_skip_frame_parser(t, 0);
|
@@ -312,7 +313,7 @@ static grpc_error* init_frame_parser(grpc_chttp2_transport* t) {
|
|
312
313
|
}
|
313
314
|
|
314
315
|
static grpc_error* skip_parser(void* parser, grpc_chttp2_transport* t,
|
315
|
-
grpc_chttp2_stream* s, grpc_slice slice,
|
316
|
+
grpc_chttp2_stream* s, const grpc_slice& slice,
|
316
317
|
int is_last) {
|
317
318
|
return GRPC_ERROR_NONE;
|
318
319
|
}
|
@@ -400,7 +401,7 @@ static void on_initial_header(void* tp, grpc_mdelem md) {
|
|
400
401
|
grpc_chttp2_stream* s = t->incoming_stream;
|
401
402
|
GPR_ASSERT(s != nullptr);
|
402
403
|
|
403
|
-
if (grpc_http_trace
|
404
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
|
404
405
|
char* key = grpc_slice_to_c_string(GRPC_MDKEY(md));
|
405
406
|
char* value =
|
406
407
|
grpc_dump_slice(GRPC_MDVALUE(md), GPR_DUMP_HEX | GPR_DUMP_ASCII);
|
@@ -410,53 +411,42 @@ static void on_initial_header(void* tp, grpc_mdelem md) {
|
|
410
411
|
gpr_free(value);
|
411
412
|
}
|
412
413
|
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
if (
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
grpc_millis timeout;
|
435
|
-
if (cached_timeout != nullptr) {
|
436
|
-
timeout = *cached_timeout;
|
437
|
-
} else {
|
438
|
-
if (GPR_UNLIKELY(
|
439
|
-
!grpc_http2_decode_timeout(GRPC_MDVALUE(md), &timeout))) {
|
440
|
-
char* val = grpc_slice_to_c_string(GRPC_MDVALUE(md));
|
441
|
-
gpr_log(GPR_ERROR, "Ignoring bad timeout value '%s'", val);
|
442
|
-
gpr_free(val);
|
443
|
-
timeout = GRPC_MILLIS_INF_FUTURE;
|
444
|
-
}
|
445
|
-
if (GRPC_MDELEM_IS_INTERNED(md)) {
|
446
|
-
/* store the result */
|
447
|
-
cached_timeout =
|
448
|
-
static_cast<grpc_millis*>(gpr_malloc(sizeof(grpc_millis)));
|
449
|
-
*cached_timeout = timeout;
|
450
|
-
grpc_mdelem_set_user_data(md, free_timeout, cached_timeout);
|
451
|
-
}
|
414
|
+
// If md.payload == GRPC_MDELEM_GRPC_STATUS_1 or GRPC_MDELEM_GRPC_STATUS_2,
|
415
|
+
// then we have seen an error. In fact, if it is a GRPC_STATUS and it's
|
416
|
+
// not equal to GRPC_MDELEM_GRPC_STATUS_0, then we have seen an error.
|
417
|
+
if (grpc_slice_eq_static_interned(GRPC_MDKEY(md), GRPC_MDSTR_GRPC_STATUS) &&
|
418
|
+
!grpc_mdelem_static_value_eq(md, GRPC_MDELEM_GRPC_STATUS_0)) {
|
419
|
+
/* TODO(ctiller): check for a status like " 0" */
|
420
|
+
s->seen_error = true;
|
421
|
+
} else if (grpc_slice_eq_static_interned(GRPC_MDKEY(md),
|
422
|
+
GRPC_MDSTR_GRPC_TIMEOUT)) {
|
423
|
+
grpc_millis* cached_timeout =
|
424
|
+
static_cast<grpc_millis*>(grpc_mdelem_get_user_data(md, free_timeout));
|
425
|
+
grpc_millis timeout;
|
426
|
+
if (cached_timeout != nullptr) {
|
427
|
+
timeout = *cached_timeout;
|
428
|
+
} else {
|
429
|
+
if (GPR_UNLIKELY(
|
430
|
+
!grpc_http2_decode_timeout(GRPC_MDVALUE(md), &timeout))) {
|
431
|
+
char* val = grpc_slice_to_c_string(GRPC_MDVALUE(md));
|
432
|
+
gpr_log(GPR_ERROR, "Ignoring bad timeout value '%s'", val);
|
433
|
+
gpr_free(val);
|
434
|
+
timeout = GRPC_MILLIS_INF_FUTURE;
|
452
435
|
}
|
453
|
-
if (
|
454
|
-
|
455
|
-
|
436
|
+
if (GRPC_MDELEM_IS_INTERNED(md)) {
|
437
|
+
/* store the result */
|
438
|
+
cached_timeout =
|
439
|
+
static_cast<grpc_millis*>(gpr_malloc(sizeof(grpc_millis)));
|
440
|
+
*cached_timeout = timeout;
|
441
|
+
grpc_mdelem_set_user_data(md, free_timeout, cached_timeout);
|
456
442
|
}
|
457
|
-
GRPC_MDELEM_UNREF(md);
|
458
|
-
return;
|
459
443
|
}
|
444
|
+
if (timeout != GRPC_MILLIS_INF_FUTURE) {
|
445
|
+
grpc_chttp2_incoming_metadata_buffer_set_deadline(
|
446
|
+
&s->metadata_buffer[0], grpc_core::ExecCtx::Get()->Now() + timeout);
|
447
|
+
}
|
448
|
+
GRPC_MDELEM_UNREF(md);
|
449
|
+
return;
|
460
450
|
}
|
461
451
|
|
462
452
|
const size_t new_size = s->metadata_buffer[0].size + GRPC_MDELEM_LENGTH(md);
|
@@ -496,7 +486,7 @@ static void on_trailing_header(void* tp, grpc_mdelem md) {
|
|
496
486
|
grpc_chttp2_stream* s = t->incoming_stream;
|
497
487
|
GPR_ASSERT(s != nullptr);
|
498
488
|
|
499
|
-
if (grpc_http_trace
|
489
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
|
500
490
|
char* key = grpc_slice_to_c_string(GRPC_MDKEY(md));
|
501
491
|
char* value =
|
502
492
|
grpc_dump_slice(GRPC_MDVALUE(md), GPR_DUMP_HEX | GPR_DUMP_ASCII);
|
@@ -506,19 +496,11 @@ static void on_trailing_header(void* tp, grpc_mdelem md) {
|
|
506
496
|
gpr_free(value);
|
507
497
|
}
|
508
498
|
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
// payloads are not equal, grpc_mdelem_eq executes more instructions to
|
515
|
-
// determine if they're equal or not.
|
516
|
-
if (md.payload == GRPC_MDELEM_GRPC_STATUS_1.payload ||
|
517
|
-
md.payload == GRPC_MDELEM_GRPC_STATUS_2.payload) {
|
518
|
-
s->seen_error = true;
|
519
|
-
}
|
520
|
-
} else if (grpc_slice_eq(GRPC_MDKEY(md), GRPC_MDSTR_GRPC_STATUS) &&
|
521
|
-
!grpc_mdelem_eq(md, GRPC_MDELEM_GRPC_STATUS_0)) {
|
499
|
+
// If md.payload == GRPC_MDELEM_GRPC_STATUS_1 or GRPC_MDELEM_GRPC_STATUS_2,
|
500
|
+
// then we have seen an error. In fact, if it is a GRPC_STATUS and it's
|
501
|
+
// not equal to GRPC_MDELEM_GRPC_STATUS_0, then we have seen an error.
|
502
|
+
if (grpc_slice_eq_static_interned(GRPC_MDKEY(md), GRPC_MDSTR_GRPC_STATUS) &&
|
503
|
+
!grpc_mdelem_static_value_eq(md, GRPC_MDELEM_GRPC_STATUS_0)) {
|
522
504
|
/* TODO(ctiller): check for a status like " 0" */
|
523
505
|
s->seen_error = true;
|
524
506
|
}
|
@@ -753,15 +735,15 @@ static grpc_error* init_settings_frame_parser(grpc_chttp2_transport* t) {
|
|
753
735
|
return GRPC_ERROR_NONE;
|
754
736
|
}
|
755
737
|
|
756
|
-
static grpc_error* parse_frame_slice(grpc_chttp2_transport* t,
|
757
|
-
int is_last) {
|
738
|
+
static grpc_error* parse_frame_slice(grpc_chttp2_transport* t,
|
739
|
+
const grpc_slice& slice, int is_last) {
|
758
740
|
grpc_chttp2_stream* s = t->incoming_stream;
|
759
741
|
grpc_error* err = t->parser(t->parser_data, t, s, slice, is_last);
|
760
742
|
intptr_t unused;
|
761
743
|
if (GPR_LIKELY(err == GRPC_ERROR_NONE)) {
|
762
744
|
return err;
|
763
745
|
} else if (grpc_error_get_int(err, GRPC_ERROR_INT_STREAM_ID, &unused)) {
|
764
|
-
if (grpc_http_trace
|
746
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
|
765
747
|
const char* msg = grpc_error_string(err);
|
766
748
|
gpr_log(GPR_ERROR, "%s", msg);
|
767
749
|
}
|
@@ -67,7 +67,7 @@ static bool stream_list_pop(grpc_chttp2_transport* t,
|
|
67
67
|
s->included[id] = 0;
|
68
68
|
}
|
69
69
|
*stream = s;
|
70
|
-
if (s && grpc_trace_http2_stream_state
|
70
|
+
if (s && GRPC_TRACE_FLAG_ENABLED(grpc_trace_http2_stream_state)) {
|
71
71
|
gpr_log(GPR_INFO, "%p[%d][%s]: pop from %s", t, s->id,
|
72
72
|
t->is_client ? "cli" : "svr", stream_list_id_string(id));
|
73
73
|
}
|
@@ -89,7 +89,7 @@ static void stream_list_remove(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
|
|
89
89
|
} else {
|
90
90
|
t->lists[id].tail = s->links[id].prev;
|
91
91
|
}
|
92
|
-
if (grpc_trace_http2_stream_state
|
92
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_http2_stream_state)) {
|
93
93
|
gpr_log(GPR_INFO, "%p[%d][%s]: remove from %s", t, s->id,
|
94
94
|
t->is_client ? "cli" : "svr", stream_list_id_string(id));
|
95
95
|
}
|
@@ -121,7 +121,7 @@ static void stream_list_add_tail(grpc_chttp2_transport* t,
|
|
121
121
|
}
|
122
122
|
t->lists[id].tail = s;
|
123
123
|
s->included[id] = 1;
|
124
|
-
if (grpc_trace_http2_stream_state
|
124
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_http2_stream_state)) {
|
125
125
|
gpr_log(GPR_INFO, "%p[%d][%s]: add to %s", t, s->id,
|
126
126
|
t->is_client ? "cli" : "svr", stream_list_id_string(id));
|
127
127
|
}
|
@@ -25,6 +25,7 @@
|
|
25
25
|
|
26
26
|
#include <grpc/support/log.h>
|
27
27
|
|
28
|
+
#include "src/core/lib/compression/stream_compression.h"
|
28
29
|
#include "src/core/lib/debug/stats.h"
|
29
30
|
#include "src/core/lib/profiling/timers.h"
|
30
31
|
#include "src/core/lib/slice/slice_internal.h"
|
@@ -52,7 +53,8 @@ static void maybe_initiate_ping(grpc_chttp2_transport* t) {
|
|
52
53
|
}
|
53
54
|
if (!grpc_closure_list_empty(pq->lists[GRPC_CHTTP2_PCL_INFLIGHT])) {
|
54
55
|
/* ping already in-flight: wait */
|
55
|
-
if (grpc_http_trace
|
56
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) ||
|
57
|
+
GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace)) {
|
56
58
|
gpr_log(GPR_INFO, "%s: Ping delayed [%p]: already pinging",
|
57
59
|
t->is_client ? "CLIENT" : "SERVER", t->peer_string);
|
58
60
|
}
|
@@ -61,7 +63,8 @@ static void maybe_initiate_ping(grpc_chttp2_transport* t) {
|
|
61
63
|
if (t->ping_state.pings_before_data_required == 0 &&
|
62
64
|
t->ping_policy.max_pings_without_data != 0) {
|
63
65
|
/* need to receive something of substance before sending a ping again */
|
64
|
-
if (grpc_http_trace
|
66
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) ||
|
67
|
+
GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace)) {
|
65
68
|
gpr_log(GPR_INFO, "%s: Ping delayed [%p]: too many recent pings: %d/%d",
|
66
69
|
t->is_client ? "CLIENT" : "SERVER", t->peer_string,
|
67
70
|
t->ping_state.pings_before_data_required,
|
@@ -81,7 +84,8 @@ static void maybe_initiate_ping(grpc_chttp2_transport* t) {
|
|
81
84
|
|
82
85
|
if (next_allowed_ping > now) {
|
83
86
|
/* not enough elapsed time between successive pings */
|
84
|
-
if (grpc_http_trace
|
87
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) ||
|
88
|
+
GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace)) {
|
85
89
|
gpr_log(GPR_INFO,
|
86
90
|
"%s: Ping delayed [%p]: not enough time elapsed since last ping. "
|
87
91
|
" Last ping %f: Next ping %f: Now %f",
|
@@ -107,8 +111,9 @@ static void maybe_initiate_ping(grpc_chttp2_transport* t) {
|
|
107
111
|
grpc_chttp2_ping_create(false, pq->inflight_id));
|
108
112
|
GRPC_STATS_INC_HTTP2_PINGS_SENT();
|
109
113
|
t->ping_state.last_ping_sent_time = now;
|
110
|
-
if (grpc_http_trace
|
111
|
-
|
114
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) ||
|
115
|
+
GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace)) {
|
116
|
+
gpr_log(GPR_INFO, "%s: Ping sent [%s]: %d/%d",
|
112
117
|
t->is_client ? "CLIENT" : "SERVER", t->peer_string,
|
113
118
|
t->ping_state.pings_before_data_required,
|
114
119
|
t->ping_policy.max_pings_without_data);
|
@@ -140,7 +145,7 @@ static bool update_list(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
|
|
140
145
|
|
141
146
|
static void report_stall(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
|
142
147
|
const char* staller) {
|
143
|
-
if (grpc_flowctl_trace
|
148
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_flowctl_trace)) {
|
144
149
|
gpr_log(
|
145
150
|
GPR_DEBUG,
|
146
151
|
"%s:%p stream %d moved to stalled list by %s. This is FULLY expected "
|
@@ -150,7 +155,11 @@ static void report_stall(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
|
|
150
155
|
":flowed=%" PRId64 ":peer_initwin=%d:t_win=%" PRId64
|
151
156
|
":s_win=%d:s_delta=%" PRId64 "]",
|
152
157
|
t->peer_string, t, s->id, staller, s->flow_controlled_buffer.length,
|
153
|
-
s->
|
158
|
+
s->stream_compression_method ==
|
159
|
+
GRPC_STREAM_COMPRESSION_IDENTITY_COMPRESS
|
160
|
+
? 0
|
161
|
+
: s->compressed_data_buffer.length,
|
162
|
+
s->flow_controlled_bytes_flowed,
|
154
163
|
t->settings[GRPC_ACKED_SETTINGS]
|
155
164
|
[GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE],
|
156
165
|
t->flow_control->remote_window(),
|
@@ -163,15 +172,6 @@ static void report_stall(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
|
|
163
172
|
}
|
164
173
|
}
|
165
174
|
|
166
|
-
static bool stream_ref_if_not_destroyed(gpr_refcount* r) {
|
167
|
-
gpr_atm count;
|
168
|
-
do {
|
169
|
-
count = gpr_atm_acq_load(&r->count);
|
170
|
-
if (count == 0) return false;
|
171
|
-
} while (!gpr_atm_rel_cas(&r->count, count, count + 1));
|
172
|
-
return true;
|
173
|
-
}
|
174
|
-
|
175
175
|
/* How many bytes would we like to put on the wire during a single syscall */
|
176
176
|
static uint32_t target_write_size(grpc_chttp2_transport* t) {
|
177
177
|
return 1024 * 1024;
|
@@ -254,7 +254,7 @@ class WriteContext {
|
|
254
254
|
while (grpc_chttp2_list_pop_stalled_by_transport(t_, &s)) {
|
255
255
|
if (t_->closed_with_error == GRPC_ERROR_NONE &&
|
256
256
|
grpc_chttp2_list_add_writable_stream(t_, s)) {
|
257
|
-
if (!
|
257
|
+
if (!s->refcount->refs.RefIfNonZero()) {
|
258
258
|
grpc_chttp2_list_remove_writable_stream(t_, s);
|
259
259
|
}
|
260
260
|
}
|
@@ -334,7 +334,23 @@ class DataSendContext {
|
|
334
334
|
|
335
335
|
bool AnyOutgoing() const { return max_outgoing() > 0; }
|
336
336
|
|
337
|
+
void FlushUncompressedBytes() {
|
338
|
+
uint32_t send_bytes = static_cast<uint32_t> GPR_MIN(
|
339
|
+
max_outgoing(), s_->flow_controlled_buffer.length);
|
340
|
+
is_last_frame_ = send_bytes == s_->flow_controlled_buffer.length &&
|
341
|
+
s_->fetching_send_message == nullptr &&
|
342
|
+
s_->send_trailing_metadata != nullptr &&
|
343
|
+
grpc_metadata_batch_is_empty(s_->send_trailing_metadata);
|
344
|
+
grpc_chttp2_encode_data(s_->id, &s_->flow_controlled_buffer, send_bytes,
|
345
|
+
is_last_frame_, &s_->stats.outgoing, &t_->outbuf);
|
346
|
+
s_->flow_control->SentData(send_bytes);
|
347
|
+
s_->sending_bytes += send_bytes;
|
348
|
+
}
|
349
|
+
|
337
350
|
void FlushCompressedBytes() {
|
351
|
+
GPR_DEBUG_ASSERT(s_->stream_compression_method !=
|
352
|
+
GRPC_STREAM_COMPRESSION_IDENTITY_COMPRESS);
|
353
|
+
|
338
354
|
uint32_t send_bytes = static_cast<uint32_t> GPR_MIN(
|
339
355
|
max_outgoing(), s_->compressed_data_buffer.length);
|
340
356
|
bool is_last_data_frame =
|
@@ -363,13 +379,15 @@ class DataSendContext {
|
|
363
379
|
grpc_chttp2_encode_data(s_->id, &s_->compressed_data_buffer, send_bytes,
|
364
380
|
is_last_frame_, &s_->stats.outgoing, &t_->outbuf);
|
365
381
|
s_->flow_control->SentData(send_bytes);
|
366
|
-
s_->byte_counter += send_bytes;
|
367
382
|
if (s_->compressed_data_buffer.length == 0) {
|
368
383
|
s_->sending_bytes += s_->uncompressed_data_size;
|
369
384
|
}
|
370
385
|
}
|
371
386
|
|
372
387
|
void CompressMoreBytes() {
|
388
|
+
GPR_DEBUG_ASSERT(s_->stream_compression_method !=
|
389
|
+
GRPC_STREAM_COMPRESSION_IDENTITY_COMPRESS);
|
390
|
+
|
373
391
|
if (s_->stream_compression_ctx == nullptr) {
|
374
392
|
s_->stream_compression_ctx =
|
375
393
|
grpc_stream_compression_context_create(s_->stream_compression_method);
|
@@ -427,7 +445,7 @@ class StreamWriteContext {
|
|
427
445
|
// https://github.com/grpc/proposal/blob/master/A6-client-retries.md#when-retries-are-valid
|
428
446
|
if (!t_->is_client && s_->fetching_send_message == nullptr &&
|
429
447
|
s_->flow_controlled_buffer.length == 0 &&
|
430
|
-
|
448
|
+
compressed_data_buffer_len() == 0 &&
|
431
449
|
s_->send_trailing_metadata != nullptr &&
|
432
450
|
is_default_initial_metadata(s_->send_initial_metadata)) {
|
433
451
|
ConvertInitialMetadataToTrailingMetadata();
|
@@ -456,6 +474,13 @@ class StreamWriteContext {
|
|
456
474
|
"send_initial_metadata_finished");
|
457
475
|
}
|
458
476
|
|
477
|
+
bool compressed_data_buffer_len() {
|
478
|
+
return s_->stream_compression_method ==
|
479
|
+
GRPC_STREAM_COMPRESSION_IDENTITY_COMPRESS
|
480
|
+
? 0
|
481
|
+
: s_->compressed_data_buffer.length;
|
482
|
+
}
|
483
|
+
|
459
484
|
void FlushWindowUpdates() {
|
460
485
|
/* send any window updates */
|
461
486
|
const uint32_t stream_announce = s_->flow_control->MaybeSendUpdate();
|
@@ -472,7 +497,7 @@ class StreamWriteContext {
|
|
472
497
|
if (!s_->sent_initial_metadata) return;
|
473
498
|
|
474
499
|
if (s_->flow_controlled_buffer.length == 0 &&
|
475
|
-
|
500
|
+
compressed_data_buffer_len() == 0) {
|
476
501
|
return; // early out: nothing to do
|
477
502
|
}
|
478
503
|
|
@@ -489,17 +514,22 @@ class StreamWriteContext {
|
|
489
514
|
return; // early out: nothing to do
|
490
515
|
}
|
491
516
|
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
data_send_context.
|
497
|
-
}
|
498
|
-
|
517
|
+
if (s_->stream_compression_method ==
|
518
|
+
GRPC_STREAM_COMPRESSION_IDENTITY_COMPRESS) {
|
519
|
+
while (s_->flow_controlled_buffer.length > 0 &&
|
520
|
+
data_send_context.max_outgoing() > 0) {
|
521
|
+
data_send_context.FlushUncompressedBytes();
|
522
|
+
}
|
523
|
+
} else {
|
524
|
+
while ((s_->flow_controlled_buffer.length > 0 ||
|
525
|
+
s_->compressed_data_buffer.length > 0) &&
|
526
|
+
data_send_context.max_outgoing() > 0) {
|
527
|
+
if (s_->compressed_data_buffer.length > 0) {
|
528
|
+
data_send_context.FlushCompressedBytes();
|
529
|
+
} else {
|
530
|
+
data_send_context.CompressMoreBytes();
|
531
|
+
}
|
499
532
|
}
|
500
|
-
}
|
501
|
-
if (s_->traced && grpc_endpoint_can_track_err(t_->ep)) {
|
502
|
-
grpc_core::ContextList::Append(&t_->cl, s_);
|
503
533
|
}
|
504
534
|
write_context_->ResetPingClock();
|
505
535
|
if (data_send_context.is_last_frame()) {
|
@@ -508,7 +538,7 @@ class StreamWriteContext {
|
|
508
538
|
data_send_context.CallCallbacks();
|
509
539
|
stream_became_writable_ = true;
|
510
540
|
if (s_->flow_controlled_buffer.length > 0 ||
|
511
|
-
|
541
|
+
compressed_data_buffer_len() > 0) {
|
512
542
|
GRPC_CHTTP2_STREAM_REF(s_, "chttp2_writing:fork");
|
513
543
|
grpc_chttp2_list_add_writable_stream(t_, s_);
|
514
544
|
}
|
@@ -521,7 +551,7 @@ class StreamWriteContext {
|
|
521
551
|
if (s_->send_trailing_metadata == nullptr) return;
|
522
552
|
if (s_->fetching_send_message != nullptr) return;
|
523
553
|
if (s_->flow_controlled_buffer.length != 0) return;
|
524
|
-
if (
|
554
|
+
if (compressed_data_buffer_len() != 0) return;
|
525
555
|
|
526
556
|
GRPC_CHTTP2_IF_TRACING(gpr_log(GPR_INFO, "sending trailing_metadata"));
|
527
557
|
if (grpc_metadata_batch_is_empty(s_->send_trailing_metadata)) {
|
@@ -610,11 +640,18 @@ grpc_chttp2_begin_write_result grpc_chttp2_begin_write(
|
|
610
640
|
(according to available window sizes) and add to the output buffer */
|
611
641
|
while (grpc_chttp2_stream* s = ctx.NextStream()) {
|
612
642
|
StreamWriteContext stream_ctx(&ctx, s);
|
643
|
+
size_t orig_len = t->outbuf.length;
|
613
644
|
stream_ctx.FlushInitialMetadata();
|
614
645
|
stream_ctx.FlushWindowUpdates();
|
615
646
|
stream_ctx.FlushData();
|
616
647
|
stream_ctx.FlushTrailingMetadata();
|
617
|
-
|
648
|
+
if (t->outbuf.length > orig_len) {
|
649
|
+
/* Add this stream to the list of the contexts to be traced at TCP */
|
650
|
+
s->byte_counter += t->outbuf.length - orig_len;
|
651
|
+
if (s->traced && grpc_endpoint_can_track_err(t->ep)) {
|
652
|
+
grpc_core::ContextList::Append(&t->cl, s);
|
653
|
+
}
|
654
|
+
}
|
618
655
|
if (stream_ctx.stream_became_writable()) {
|
619
656
|
if (!grpc_chttp2_list_add_writing_stream(t, s)) {
|
620
657
|
/* already in writing list: drop ref */
|