grpc-flamingo 1.11.0 → 1.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Makefile +1150 -176
- data/etc/roots.pem +40 -196
- data/include/grpc/grpc.h +49 -8
- data/include/grpc/grpc_security.h +123 -2
- data/include/grpc/grpc_security_constants.h +6 -0
- data/include/grpc/impl/codegen/fork.h +4 -4
- data/include/grpc/impl/codegen/grpc_types.h +26 -5
- data/include/grpc/impl/codegen/log.h +112 -0
- data/include/grpc/impl/codegen/port_platform.h +55 -4
- data/include/grpc/module.modulemap +2 -0
- data/include/grpc/support/log.h +2 -80
- data/include/grpc/support/string_util.h +2 -0
- data/include/grpc/support/sync.h +0 -16
- data/src/boringssl/err_data.c +602 -588
- data/src/core/ext/{census → filters/census}/grpc_context.cc +0 -0
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +1 -1
- data/src/core/ext/filters/client_channel/client_channel.cc +1234 -1070
- data/src/core/ext/filters/client_channel/client_channel.h +5 -0
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +113 -0
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +71 -0
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -0
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
- data/src/core/ext/filters/client_channel/http_proxy.cc +22 -5
- data/src/core/ext/filters/client_channel/lb_policy.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy.h +30 -10
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +11 -9
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +120 -127
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +36 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +36 -102
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +37 -32
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +25 -22
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +4 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.c +19 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.h +54 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.c +19 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.h +54 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +4 -17
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +37 -63
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +306 -239
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +444 -392
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +538 -98
- data/src/core/ext/filters/client_channel/lb_policy_factory.cc +8 -0
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +4 -0
- data/src/core/ext/filters/client_channel/method_params.h +4 -0
- data/src/core/ext/filters/client_channel/resolver.h +10 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +36 -19
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +320 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +62 -9
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +49 -294
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +537 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +112 -87
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +17 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +6 -5
- data/src/core/ext/filters/{load_reporting/server_load_reporting_filter.h → client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc} +7 -8
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +29 -0
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +32 -15
- data/src/core/ext/filters/client_channel/retry_throttle.h +4 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +58 -15
- data/src/core/ext/filters/client_channel/subchannel.h +11 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +18 -15
- data/src/core/ext/filters/deadline/deadline_filter.h +5 -5
- data/src/core/ext/filters/http/client/http_client_filter.cc +10 -9
- data/src/core/ext/filters/http/client_authority_filter.cc +6 -5
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +6 -6
- data/src/core/ext/filters/http/server/http_server_filter.cc +123 -131
- data/src/core/ext/filters/http/server/http_server_filter.h +1 -1
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +1 -1
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +3 -2
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +9 -8
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +97 -48
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +10 -7
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +12 -8
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/parsing.cc +14 -12
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/writing.cc +32 -27
- data/src/core/ext/transport/inproc/inproc_transport.cc +87 -49
- data/src/core/lib/channel/channel_args.cc +28 -0
- data/src/core/lib/channel/channel_args.h +4 -0
- data/src/core/lib/channel/channel_stack.cc +22 -29
- data/src/core/lib/channel/channel_stack.h +2 -2
- data/src/core/lib/channel/channel_stack_builder.cc +0 -3
- data/src/core/lib/channel/channel_stack_builder.h +0 -2
- data/src/core/lib/channel/channel_trace.cc +28 -63
- data/src/core/lib/channel/channel_trace.h +13 -17
- data/src/core/lib/channel/channelz.cc +153 -0
- data/src/core/lib/channel/channelz.h +133 -0
- data/src/core/lib/channel/channelz_registry.cc +145 -0
- data/src/core/lib/channel/channelz_registry.h +120 -0
- data/src/core/lib/channel/connected_channel.cc +8 -1
- data/src/core/lib/channel/handshaker.cc +71 -0
- data/src/core/lib/channel/handshaker.h +4 -0
- data/src/core/lib/debug/stats.h +7 -0
- data/src/core/lib/debug/stats_data.cc +5 -0
- data/src/core/lib/debug/stats_data.h +120 -0
- data/src/core/lib/debug/trace.cc +2 -1
- data/src/core/lib/debug/trace.h +12 -1
- data/src/core/lib/gpr/alloc.h +28 -0
- data/src/core/lib/gpr/arena.cc +38 -45
- data/src/core/lib/gpr/log.cc +8 -2
- data/src/core/lib/gpr/log_android.cc +4 -0
- data/src/core/lib/gpr/log_linux.cc +4 -0
- data/src/core/lib/gpr/log_posix.cc +4 -0
- data/src/core/lib/gpr/log_windows.cc +5 -0
- data/src/core/lib/gpr/string.cc +28 -0
- data/src/core/lib/gpr/string.h +10 -0
- data/src/core/lib/gprpp/abstract.h +5 -2
- data/src/core/lib/gprpp/fork.cc +268 -0
- data/src/core/lib/gprpp/fork.h +88 -0
- data/src/core/lib/gprpp/inlined_vector.h +87 -37
- data/src/core/lib/gprpp/memory.h +12 -0
- data/src/core/lib/gprpp/mutex_lock.h +42 -0
- data/src/core/lib/gprpp/orphanable.h +10 -12
- data/src/core/lib/gprpp/ref_counted.h +10 -12
- data/src/core/lib/gprpp/ref_counted_ptr.h +65 -8
- data/src/core/lib/gprpp/thd.h +0 -3
- data/src/core/lib/gprpp/thd_posix.cc +5 -54
- data/src/core/lib/gprpp/thd_windows.cc +0 -7
- data/src/core/lib/http/httpcli_security_connector.cc +1 -3
- data/src/core/lib/iomgr/call_combiner.cc +13 -13
- data/src/core/lib/iomgr/call_combiner.h +84 -1
- data/src/core/lib/iomgr/closure.h +6 -5
- data/src/core/lib/iomgr/combiner.cc +30 -13
- data/src/core/lib/iomgr/combiner.h +1 -1
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
- data/src/core/lib/iomgr/error.cc +12 -0
- data/src/core/lib/iomgr/error.h +5 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +138 -51
- data/src/core/lib/iomgr/ev_epollex_linux.cc +276 -93
- data/src/core/lib/iomgr/ev_epollsig_linux.cc +58 -50
- data/src/core/lib/iomgr/ev_poll_posix.cc +163 -42
- data/src/core/lib/iomgr/ev_posix.cc +88 -24
- data/src/core/lib/iomgr/ev_posix.h +48 -12
- data/src/core/lib/iomgr/exec_ctx.cc +15 -9
- data/src/core/lib/iomgr/exec_ctx.h +48 -20
- data/src/core/lib/iomgr/executor.cc +274 -142
- data/src/core/lib/iomgr/executor.h +82 -16
- data/src/core/lib/iomgr/fork_posix.cc +42 -19
- data/src/core/lib/iomgr/iocp_windows.cc +9 -4
- data/src/core/lib/iomgr/iomgr.cc +2 -0
- data/src/core/lib/iomgr/iomgr.h +5 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
- data/src/core/lib/iomgr/is_epollexclusive_available.cc +1 -0
- data/src/core/lib/iomgr/lockfree_event.cc +5 -1
- data/src/core/lib/iomgr/polling_entity.cc +11 -2
- data/src/core/lib/iomgr/pollset_custom.cc +2 -2
- data/src/core/lib/iomgr/port.h +51 -1
- data/src/core/lib/iomgr/resolve_address.h +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
- data/src/core/lib/iomgr/resolve_address_windows.cc +3 -2
- data/src/core/lib/iomgr/resource_quota.cc +89 -12
- data/src/core/lib/iomgr/resource_quota.h +16 -0
- data/src/core/lib/iomgr/sockaddr_posix.h +1 -1
- data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
- data/src/core/lib/iomgr/socket_mutator.cc +1 -1
- data/src/core/lib/iomgr/socket_mutator.h +1 -1
- data/src/core/lib/iomgr/socket_utils.h +9 -0
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +29 -1
- data/src/core/lib/iomgr/socket_utils_linux.cc +0 -1
- data/src/core/lib/iomgr/socket_utils_posix.cc +2 -3
- data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
- data/src/core/lib/iomgr/socket_utils_uv.cc +4 -0
- data/src/core/lib/iomgr/socket_utils_windows.cc +4 -0
- data/src/core/lib/iomgr/socket_windows.cc +33 -0
- data/src/core/lib/iomgr/socket_windows.h +6 -0
- data/src/core/lib/iomgr/tcp_client_custom.cc +5 -5
- data/src/core/lib/iomgr/tcp_client_posix.cc +10 -11
- data/src/core/lib/iomgr/tcp_custom.cc +11 -11
- data/src/core/lib/iomgr/tcp_posix.cc +49 -36
- data/src/core/lib/iomgr/tcp_server_custom.cc +5 -5
- data/src/core/lib/iomgr/tcp_server_posix.cc +16 -36
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +17 -5
- data/src/core/lib/iomgr/tcp_server_windows.cc +1 -0
- data/src/core/lib/iomgr/tcp_uv.cc +3 -0
- data/src/core/lib/iomgr/tcp_windows.cc +18 -2
- data/src/core/lib/iomgr/tcp_windows.h +2 -0
- data/src/core/lib/iomgr/timer.h +4 -3
- data/src/core/lib/iomgr/timer_generic.cc +133 -51
- data/src/core/lib/iomgr/timer_manager.cc +12 -14
- data/src/core/lib/iomgr/timer_uv.cc +3 -0
- data/src/core/lib/iomgr/udp_server.cc +106 -52
- data/src/core/lib/iomgr/udp_server.h +8 -4
- data/src/core/lib/json/json.cc +12 -1
- data/src/core/lib/json/json.h +5 -0
- data/src/core/lib/profiling/basic_timers.cc +1 -0
- data/src/core/lib/security/context/security_context.cc +8 -8
- data/src/core/lib/security/context/security_context.h +6 -2
- data/src/core/lib/security/credentials/alts/alts_credentials.h +0 -20
- data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +3 -2
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +7 -7
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +1 -38
- data/src/core/lib/security/credentials/credentials.h +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +89 -115
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +16 -0
- data/src/core/lib/security/credentials/jwt/json_token.h +2 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +2 -0
- data/src/core/lib/security/credentials/local/local_credentials.cc +77 -0
- data/src/core/lib/security/credentials/local/local_credentials.h +40 -0
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +11 -7
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +17 -3
- data/src/core/lib/security/security_connector/alts_security_connector.cc +2 -1
- data/src/core/lib/security/security_connector/load_system_roots.h +29 -0
- data/src/core/lib/{gpr/fork.h → security/security_connector/load_system_roots_fallback.cc} +10 -13
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +165 -0
- data/src/core/lib/security/security_connector/load_system_roots_linux.h +44 -0
- data/src/core/lib/security/security_connector/local_security_connector.cc +245 -0
- data/src/core/lib/security/security_connector/local_security_connector.h +58 -0
- data/src/core/lib/security/security_connector/security_connector.cc +79 -32
- data/src/core/lib/security/security_connector/security_connector.h +5 -3
- data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
- data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
- data/src/core/lib/security/transport/security_handshaker.cc +7 -2
- data/src/core/lib/security/transport/server_auth_filter.cc +4 -7
- data/src/core/lib/security/util/json_util.cc +4 -0
- data/src/core/lib/slice/slice.cc +6 -2
- data/src/core/lib/slice/slice_buffer.cc +27 -7
- data/src/core/lib/slice/slice_hash_table.h +4 -0
- data/src/core/lib/slice/slice_weak_hash_table.h +4 -0
- data/src/core/lib/surface/call.cc +119 -58
- data/src/core/lib/surface/call.h +7 -0
- data/src/core/lib/surface/channel.cc +50 -18
- data/src/core/lib/surface/channel.h +4 -0
- data/src/core/lib/surface/completion_queue.cc +153 -18
- data/src/core/lib/surface/completion_queue.h +20 -2
- data/src/core/lib/surface/completion_queue_factory.cc +13 -4
- data/src/core/lib/surface/init.cc +7 -8
- data/src/core/lib/surface/init.h +0 -1
- data/src/core/lib/surface/server.cc +16 -0
- 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/byte_stream.cc +1 -1
- data/src/core/lib/transport/connectivity_state.cc +6 -7
- data/src/core/lib/transport/service_config.cc +2 -2
- data/src/core/lib/transport/service_config.h +3 -3
- data/src/core/lib/transport/transport.cc +22 -10
- data/src/core/lib/transport/transport.h +18 -18
- data/src/core/lib/transport/transport_op_string.cc +1 -8
- data/src/core/plugin_registry/grpc_plugin_registry.cc +0 -4
- data/src/core/tsi/alts/crypt/aes_gcm.cc +2 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +19 -7
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +10 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h +2 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +38 -3
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +3 -0
- data/src/core/tsi/alts/handshaker/altscontext.pb.c +0 -1
- data/src/core/tsi/alts/handshaker/altscontext.pb.h +1 -2
- data/src/core/tsi/alts/handshaker/handshaker.pb.c +0 -1
- data/src/core/tsi/alts/handshaker/handshaker.pb.h +1 -2
- data/src/core/tsi/alts/handshaker/transport_security_common.pb.c +0 -1
- data/src/core/tsi/alts/handshaker/transport_security_common.pb.h +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +2 -2
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +47 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +3 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +12 -11
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +7 -2
- data/src/core/tsi/fake_transport_security.cc +1 -0
- data/src/core/tsi/grpc_shadow_boringssl.h +3006 -0
- data/src/core/tsi/local_transport_security.cc +209 -0
- data/src/core/tsi/local_transport_security.h +51 -0
- data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +5 -5
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +6 -0
- data/src/core/tsi/ssl_transport_security.cc +245 -116
- data/src/core/tsi/ssl_types.h +2 -0
- data/src/core/tsi/transport_security.cc +14 -0
- data/src/core/tsi/transport_security.h +2 -0
- data/src/core/tsi/transport_security_interface.h +11 -1
- data/src/ruby/bin/math_client.rb +17 -9
- data/src/ruby/ext/grpc/extconf.rb +1 -26
- data/src/ruby/ext/grpc/rb_channel_credentials.c +3 -3
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +42 -16
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +65 -26
- data/src/ruby/lib/grpc/generic/active_call.rb +19 -23
- data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/generate_proto_ruby.sh +7 -1
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +4 -1
- data/src/ruby/spec/call_credentials_spec.rb +1 -1
- data/src/ruby/spec/call_spec.rb +1 -1
- data/src/ruby/spec/channel_credentials_spec.rb +1 -1
- data/src/ruby/spec/channel_spec.rb +1 -1
- data/src/ruby/spec/client_auth_spec.rb +1 -12
- data/src/ruby/spec/client_server_spec.rb +1 -1
- data/src/ruby/spec/compression_options_spec.rb +1 -1
- data/src/ruby/spec/error_sanity_spec.rb +1 -1
- data/src/ruby/spec/generic/client_stub_spec.rb +16 -4
- data/src/ruby/spec/generic/rpc_desc_spec.rb +1 -1
- data/src/ruby/spec/generic/rpc_server_pool_spec.rb +1 -1
- data/src/ruby/spec/generic/service_spec.rb +1 -1
- data/src/ruby/spec/google_rpc_status_utils_spec.rb +1 -12
- data/src/ruby/spec/pb/duplicate/codegen_spec.rb +1 -0
- data/src/ruby/spec/pb/health/checker_spec.rb +1 -1
- data/src/ruby/spec/server_credentials_spec.rb +1 -1
- data/src/ruby/spec/server_spec.rb +1 -1
- data/src/ruby/spec/spec_helper.rb +1 -0
- data/src/ruby/spec/support/services.rb +1 -1
- data/src/ruby/spec/time_consts_spec.rb +1 -1
- data/third_party/address_sorting/address_sorting.c +17 -11
- data/third_party/address_sorting/address_sorting_windows.c +43 -3
- data/third_party/address_sorting/include/address_sorting/address_sorting.h +3 -0
- data/third_party/boringssl/crypto/asn1/a_int.c +33 -28
- data/third_party/boringssl/crypto/asn1/a_mbstr.c +24 -22
- data/third_party/boringssl/crypto/asn1/a_utf8.c +13 -11
- data/third_party/boringssl/crypto/asn1/asn1_locl.h +3 -0
- data/third_party/boringssl/crypto/asn1/tasn_dec.c +40 -19
- data/third_party/boringssl/crypto/bio/fd.c +1 -0
- data/third_party/boringssl/crypto/bio/file.c +2 -0
- data/third_party/boringssl/crypto/bn_extra/convert.c +6 -5
- data/third_party/boringssl/crypto/bytestring/ber.c +1 -4
- data/third_party/boringssl/crypto/bytestring/cbb.c +116 -16
- data/third_party/boringssl/crypto/bytestring/cbs.c +151 -20
- data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +203 -0
- data/third_party/boringssl/crypto/cipher_extra/e_rc2.c +2 -0
- data/third_party/boringssl/crypto/cipher_extra/e_tls.c +1 -2
- data/third_party/boringssl/crypto/cpu-aarch64-fuchsia.c +55 -0
- data/third_party/boringssl/crypto/cpu-aarch64-linux.c +2 -1
- data/third_party/boringssl/crypto/dsa/dsa.c +16 -54
- data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +9 -10
- data/third_party/boringssl/crypto/ecdh/ecdh.c +4 -3
- data/third_party/boringssl/crypto/fipsmodule/bcm.c +11 -542
- data/third_party/boringssl/crypto/fipsmodule/bn/add.c +57 -112
- data/third_party/boringssl/crypto/fipsmodule/bn/asm/x86_64-gcc.c +4 -3
- data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +128 -70
- data/third_party/boringssl/crypto/fipsmodule/bn/bytes.c +32 -71
- data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +64 -118
- data/third_party/boringssl/crypto/fipsmodule/bn/div.c +284 -122
- data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +31 -65
- data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +274 -218
- data/third_party/boringssl/crypto/fipsmodule/bn/generic.c +2 -1
- data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +187 -27
- data/third_party/boringssl/crypto/fipsmodule/bn/jacobi.c +1 -1
- data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +124 -81
- data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +8 -30
- data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +321 -347
- data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +326 -66
- data/third_party/boringssl/crypto/fipsmodule/bn/random.c +77 -25
- data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +199 -222
- data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +27 -47
- data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +155 -96
- data/third_party/boringssl/crypto/fipsmodule/bn/sqrt.c +1 -1
- data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +10 -10
- data/third_party/boringssl/crypto/fipsmodule/des/internal.h +2 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +78 -47
- data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +99 -163
- data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +3 -10
- data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +44 -23
- data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +59 -90
- data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +38 -65
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +5378 -5418
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +17 -26
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +15 -11
- data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +45 -51
- data/third_party/boringssl/crypto/fipsmodule/ec/{util-64.c → util.c} +0 -5
- data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +144 -264
- data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +78 -62
- data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +256 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +36 -32
- data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +9 -7
- data/third_party/boringssl/crypto/fipsmodule/rsa/blinding.c +16 -40
- data/third_party/boringssl/crypto/fipsmodule/rsa/internal.h +1 -6
- data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +57 -39
- data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +309 -142
- data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +581 -0
- data/third_party/boringssl/crypto/fipsmodule/tls/internal.h +39 -0
- data/third_party/boringssl/crypto/fipsmodule/tls/kdf.c +165 -0
- data/third_party/boringssl/crypto/internal.h +65 -2
- data/third_party/boringssl/crypto/mem.c +0 -2
- data/third_party/boringssl/crypto/obj/obj.c +6 -73
- data/third_party/boringssl/crypto/thread_pthread.c +35 -5
- data/third_party/boringssl/crypto/x509/a_strex.c +11 -11
- data/third_party/boringssl/crypto/x509/vpm_int.h +1 -0
- data/third_party/boringssl/crypto/x509/x509_vfy.c +4 -0
- data/third_party/boringssl/crypto/x509/x509_vpm.c +44 -22
- data/third_party/boringssl/crypto/x509/x_name.c +13 -0
- data/third_party/boringssl/include/openssl/aead.h +10 -0
- data/third_party/boringssl/include/openssl/asn1.h +2 -3
- data/third_party/boringssl/include/openssl/base.h +5 -14
- data/third_party/boringssl/include/openssl/bio.h +1 -1
- data/third_party/boringssl/include/openssl/bn.h +62 -18
- data/third_party/boringssl/include/openssl/bytestring.h +53 -28
- data/third_party/boringssl/include/openssl/crypto.h +4 -0
- data/third_party/boringssl/include/openssl/ec.h +10 -4
- data/third_party/boringssl/include/openssl/ec_key.h +7 -6
- data/third_party/boringssl/include/openssl/err.h +9 -9
- data/third_party/boringssl/include/openssl/evp.h +1 -1
- data/third_party/boringssl/include/openssl/rsa.h +35 -10
- data/third_party/boringssl/include/openssl/ssl.h +167 -19
- data/third_party/boringssl/include/openssl/ssl3.h +0 -1
- data/third_party/boringssl/include/openssl/stack.h +1 -1
- data/third_party/boringssl/include/openssl/tls1.h +10 -2
- data/third_party/boringssl/include/openssl/x509.h +4 -0
- data/third_party/boringssl/include/openssl/x509v3.h +1 -0
- data/third_party/boringssl/ssl/d1_both.cc +16 -2
- data/third_party/boringssl/ssl/dtls_method.cc +1 -1
- data/third_party/boringssl/ssl/handoff.cc +285 -0
- data/third_party/boringssl/ssl/handshake.cc +26 -12
- data/third_party/boringssl/ssl/handshake_client.cc +101 -95
- data/third_party/boringssl/ssl/handshake_server.cc +14 -2
- data/third_party/boringssl/ssl/internal.h +132 -79
- data/third_party/boringssl/ssl/s3_both.cc +2 -2
- data/third_party/boringssl/ssl/s3_lib.cc +3 -1
- data/third_party/boringssl/ssl/s3_pkt.cc +0 -18
- data/third_party/boringssl/ssl/ssl_aead_ctx.cc +1 -4
- data/third_party/boringssl/ssl/ssl_asn1.cc +47 -43
- data/third_party/boringssl/ssl/ssl_cipher.cc +12 -8
- data/third_party/boringssl/ssl/ssl_key_share.cc +3 -1
- data/third_party/boringssl/ssl/ssl_lib.cc +83 -14
- data/third_party/boringssl/ssl/ssl_privkey.cc +6 -0
- data/third_party/boringssl/ssl/ssl_stat.cc +6 -6
- data/third_party/boringssl/ssl/ssl_versions.cc +12 -85
- data/third_party/boringssl/ssl/ssl_x509.cc +59 -61
- data/third_party/boringssl/ssl/t1_enc.cc +73 -124
- data/third_party/boringssl/ssl/t1_lib.cc +367 -41
- data/third_party/boringssl/ssl/tls13_both.cc +8 -0
- data/third_party/boringssl/ssl/tls13_client.cc +98 -184
- data/third_party/boringssl/ssl/tls13_enc.cc +88 -158
- data/third_party/boringssl/ssl/tls13_server.cc +91 -137
- data/third_party/boringssl/ssl/tls_method.cc +0 -17
- data/third_party/boringssl/ssl/tls_record.cc +1 -10
- data/third_party/boringssl/third_party/fiat/curve25519.c +921 -2753
- data/third_party/boringssl/third_party/fiat/curve25519_tables.h +7880 -0
- data/third_party/boringssl/third_party/fiat/internal.h +32 -20
- data/third_party/boringssl/third_party/fiat/p256.c +1824 -0
- metadata +86 -71
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +0 -253
- data/src/core/ext/filters/load_reporting/server_load_reporting_filter.cc +0 -222
- data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc +0 -71
- data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.h +0 -61
- data/src/core/lib/channel/channel_trace_registry.cc +0 -80
- data/src/core/lib/channel/channel_trace_registry.h +0 -43
- data/src/core/lib/gpr/fork.cc +0 -78
- data/src/core/tsi/transport_security_adapter.cc +0 -235
- data/src/core/tsi/transport_security_adapter.h +0 -41
- data/src/ruby/bin/apis/google/protobuf/empty.rb +0 -29
- data/src/ruby/bin/apis/pubsub_demo.rb +0 -241
- data/src/ruby/bin/apis/tech/pubsub/proto/pubsub.rb +0 -159
- data/src/ruby/bin/apis/tech/pubsub/proto/pubsub_services.rb +0 -88
- data/src/ruby/pb/test/client.rb +0 -764
- data/src/ruby/pb/test/server.rb +0 -252
- data/src/ruby/spec/pb/package_with_underscore/checker_spec.rb +0 -54
- data/src/ruby/spec/pb/package_with_underscore/data.proto +0 -23
- data/src/ruby/spec/pb/package_with_underscore/service.proto +0 -23
- data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +0 -247
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-64.c +0 -1674
@@ -33,6 +33,7 @@
|
|
33
33
|
#include <poll.h>
|
34
34
|
#include <pthread.h>
|
35
35
|
#include <string.h>
|
36
|
+
#include <sys/epoll.h>
|
36
37
|
#include <sys/socket.h>
|
37
38
|
#include <sys/syscall.h>
|
38
39
|
#include <unistd.h>
|
@@ -45,6 +46,7 @@
|
|
45
46
|
#include "src/core/lib/gpr/tls.h"
|
46
47
|
#include "src/core/lib/gpr/useful.h"
|
47
48
|
#include "src/core/lib/gprpp/manual_constructor.h"
|
49
|
+
#include "src/core/lib/gprpp/mutex_lock.h"
|
48
50
|
#include "src/core/lib/iomgr/block_annotate.h"
|
49
51
|
#include "src/core/lib/iomgr/iomgr_internal.h"
|
50
52
|
#include "src/core/lib/iomgr/is_epollexclusive_available.h"
|
@@ -59,7 +61,11 @@
|
|
59
61
|
//#define GRPC_EPOLLEX_CREATE_WORKERS_ON_HEAP 1
|
60
62
|
|
61
63
|
#define MAX_EPOLL_EVENTS 100
|
62
|
-
|
64
|
+
// TODO(juanlishen): We use a greater-than-one value here as a workaround fix to
|
65
|
+
// a keepalive ping timeout issue. We may want to revert https://github
|
66
|
+
// .com/grpc/grpc/pull/14943 once we figure out the root cause.
|
67
|
+
#define MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL 16
|
68
|
+
#define MAX_FDS_IN_CACHE 32
|
63
69
|
|
64
70
|
grpc_core::DebugOnlyTraceFlag grpc_trace_pollable_refcount(false,
|
65
71
|
"pollable_refcount");
|
@@ -72,6 +78,18 @@ typedef enum { PO_MULTI, PO_FD, PO_EMPTY } pollable_type;
|
|
72
78
|
|
73
79
|
typedef struct pollable pollable;
|
74
80
|
|
81
|
+
typedef struct cached_fd {
|
82
|
+
// Set to the grpc_fd's salt value. See 'salt' variable' in grpc_fd for more
|
83
|
+
// details
|
84
|
+
intptr_t salt;
|
85
|
+
|
86
|
+
// The underlying fd
|
87
|
+
int fd;
|
88
|
+
|
89
|
+
// A recency time counter that helps to determine the LRU fd in the cache
|
90
|
+
uint64_t last_used;
|
91
|
+
} cached_fd;
|
92
|
+
|
75
93
|
/// A pollable is something that can be polled: it has an epoll set to poll on,
|
76
94
|
/// and a wakeup fd for kicks
|
77
95
|
/// There are three broad types:
|
@@ -87,8 +105,10 @@ struct pollable {
|
|
87
105
|
int epfd;
|
88
106
|
grpc_wakeup_fd wakeup;
|
89
107
|
|
90
|
-
//
|
91
|
-
grpc_fd* owner_fd;
|
108
|
+
// The following are relevant only for type PO_FD
|
109
|
+
grpc_fd* owner_fd; // Set to the owner_fd if the type is PO_FD
|
110
|
+
gpr_mu owner_orphan_mu; // Synchronizes access to owner_orphaned field
|
111
|
+
bool owner_orphaned; // Is the owner fd orphaned
|
92
112
|
|
93
113
|
grpc_pollset_set* pollset_set;
|
94
114
|
pollable* next;
|
@@ -100,6 +120,33 @@ struct pollable {
|
|
100
120
|
int event_cursor;
|
101
121
|
int event_count;
|
102
122
|
struct epoll_event events[MAX_EPOLL_EVENTS];
|
123
|
+
|
124
|
+
// We may be calling pollable_add_fd() on the same (pollable, fd) multiple
|
125
|
+
// times. To prevent pollable_add_fd() from making multiple sys calls to
|
126
|
+
// epoll_ctl() to add the fd, we maintain a cache of what fds are already
|
127
|
+
// present in the underlying epoll-set.
|
128
|
+
//
|
129
|
+
// Since this is not a correctness issue, we do not need to maintain all the
|
130
|
+
// fds in the cache. Hence we just use an LRU cache of size 'MAX_FDS_IN_CACHE'
|
131
|
+
//
|
132
|
+
// NOTE: An ideal implementation of this should do the following:
|
133
|
+
// 1) Add fds to the cache in pollable_add_fd() function (i.e whenever the fd
|
134
|
+
// is added to the pollable's epoll set)
|
135
|
+
// 2) Remove the fd from the cache whenever the fd is removed from the
|
136
|
+
// underlying epoll set (i.e whenever fd_orphan() is called).
|
137
|
+
//
|
138
|
+
// Implementing (2) above (i.e removing fds from cache on fd_orphan) adds a
|
139
|
+
// lot of complexity since an fd can be present in multiple pollables. So our
|
140
|
+
// implementation ONLY DOES (1) and NOT (2).
|
141
|
+
//
|
142
|
+
// The cache_fd.salt variable helps here to maintain correctness (it serves as
|
143
|
+
// an epoch that differentiates one grpc_fd from the other even though both of
|
144
|
+
// them may have the same fd number)
|
145
|
+
//
|
146
|
+
// The following implements LRU-eviction cache of fds in this pollable
|
147
|
+
cached_fd fd_cache[MAX_FDS_IN_CACHE];
|
148
|
+
int fd_cache_size;
|
149
|
+
uint64_t fd_cache_counter; // Recency timer tick counter
|
103
150
|
};
|
104
151
|
|
105
152
|
static const char* pollable_type_string(pollable_type t) {
|
@@ -142,12 +189,24 @@ static void pollable_unref(pollable* p, int line, const char* reason);
|
|
142
189
|
* Fd Declarations
|
143
190
|
*/
|
144
191
|
|
192
|
+
// Monotonically increasing Epoch counter that is assinged to each grpc_fd. See
|
193
|
+
// the description of 'salt' variable in 'grpc_fd' for more details
|
194
|
+
// TODO: (sreek/kpayson) gpr_atm is intptr_t which may not be wide-enough on
|
195
|
+
// 32-bit systems. Change this to int_64 - atleast on 32-bit systems
|
196
|
+
static gpr_atm g_fd_salt;
|
197
|
+
|
145
198
|
struct grpc_fd {
|
146
199
|
int fd;
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
200
|
+
|
201
|
+
// Since fd numbers can be reused (after old fds are closed), this serves as
|
202
|
+
// an epoch that uniquely identifies this fd (i.e the pair (salt, fd) is
|
203
|
+
// unique (until the salt counter (i.e g_fd_salt) overflows)
|
204
|
+
intptr_t salt;
|
205
|
+
|
206
|
+
// refst format:
|
207
|
+
// bit 0 : 1=Active / 0=Orphaned
|
208
|
+
// bits 1-n : refcount
|
209
|
+
// Ref/Unref by two to avoid altering the orphaned bit
|
151
210
|
gpr_atm refst;
|
152
211
|
|
153
212
|
gpr_mu orphan_mu;
|
@@ -157,15 +216,15 @@ struct grpc_fd {
|
|
157
216
|
|
158
217
|
grpc_core::ManualConstructor<grpc_core::LockfreeEvent> read_closure;
|
159
218
|
grpc_core::ManualConstructor<grpc_core::LockfreeEvent> write_closure;
|
219
|
+
grpc_core::ManualConstructor<grpc_core::LockfreeEvent> error_closure;
|
160
220
|
|
161
221
|
struct grpc_fd* freelist_next;
|
162
222
|
grpc_closure* on_done_closure;
|
163
223
|
|
164
|
-
/* The pollset that last noticed that the fd is readable. The actual type
|
165
|
-
* stored in this is (grpc_pollset *) */
|
166
|
-
gpr_atm read_notifier_pollset;
|
167
|
-
|
168
224
|
grpc_iomgr_object iomgr_object;
|
225
|
+
|
226
|
+
// Do we need to track EPOLLERR events separately?
|
227
|
+
bool track_err;
|
169
228
|
};
|
170
229
|
|
171
230
|
static void fd_global_init(void);
|
@@ -198,6 +257,7 @@ struct grpc_pollset_worker {
|
|
198
257
|
|
199
258
|
struct grpc_pollset {
|
200
259
|
gpr_mu mu;
|
260
|
+
gpr_atm worker_count;
|
201
261
|
pollable* active_pollable;
|
202
262
|
bool kicked_without_poller;
|
203
263
|
grpc_closure* shutdown_closure;
|
@@ -277,20 +337,44 @@ static void ref_by(grpc_fd* fd, int n) {
|
|
277
337
|
GPR_ASSERT(gpr_atm_no_barrier_fetch_add(&fd->refst, n) > 0);
|
278
338
|
}
|
279
339
|
|
340
|
+
#ifndef NDEBUG
|
341
|
+
#define INVALIDATE_FD(fd) invalidate_fd(fd)
|
342
|
+
/* Since an fd is never really destroyed (i.e gpr_free() is not called), it is
|
343
|
+
* hard to cases where fd fields are accessed even after calling fd_destroy().
|
344
|
+
* The following invalidates fd fields to make catching such errors easier */
|
345
|
+
static void invalidate_fd(grpc_fd* fd) {
|
346
|
+
fd->fd = -1;
|
347
|
+
fd->salt = -1;
|
348
|
+
gpr_atm_no_barrier_store(&fd->refst, -1);
|
349
|
+
memset(&fd->orphan_mu, -1, sizeof(fd->orphan_mu));
|
350
|
+
memset(&fd->pollable_mu, -1, sizeof(fd->pollable_mu));
|
351
|
+
fd->pollable_obj = nullptr;
|
352
|
+
fd->on_done_closure = nullptr;
|
353
|
+
memset(&fd->iomgr_object, -1, sizeof(fd->iomgr_object));
|
354
|
+
fd->track_err = false;
|
355
|
+
}
|
356
|
+
#else
|
357
|
+
#define INVALIDATE_FD(fd)
|
358
|
+
#endif
|
359
|
+
|
360
|
+
/* Uninitialize and add to the freelist */
|
280
361
|
static void fd_destroy(void* arg, grpc_error* error) {
|
281
362
|
grpc_fd* fd = static_cast<grpc_fd*>(arg);
|
282
|
-
/* Add the fd to the freelist */
|
283
363
|
grpc_iomgr_unregister_object(&fd->iomgr_object);
|
284
364
|
POLLABLE_UNREF(fd->pollable_obj, "fd_pollable");
|
285
365
|
gpr_mu_destroy(&fd->pollable_mu);
|
286
366
|
gpr_mu_destroy(&fd->orphan_mu);
|
287
|
-
gpr_mu_lock(&fd_freelist_mu);
|
288
|
-
fd->freelist_next = fd_freelist;
|
289
|
-
fd_freelist = fd;
|
290
367
|
|
291
368
|
fd->read_closure->DestroyEvent();
|
292
369
|
fd->write_closure->DestroyEvent();
|
370
|
+
fd->error_closure->DestroyEvent();
|
293
371
|
|
372
|
+
INVALIDATE_FD(fd);
|
373
|
+
|
374
|
+
/* Add the fd to the freelist */
|
375
|
+
gpr_mu_lock(&fd_freelist_mu);
|
376
|
+
fd->freelist_next = fd_freelist;
|
377
|
+
fd_freelist = fd;
|
294
378
|
gpr_mu_unlock(&fd_freelist_mu);
|
295
379
|
}
|
296
380
|
|
@@ -329,7 +413,7 @@ static void fd_global_shutdown(void) {
|
|
329
413
|
gpr_mu_destroy(&fd_freelist_mu);
|
330
414
|
}
|
331
415
|
|
332
|
-
static grpc_fd* fd_create(int fd, const char* name) {
|
416
|
+
static grpc_fd* fd_create(int fd, const char* name, bool track_err) {
|
333
417
|
grpc_fd* new_fd = nullptr;
|
334
418
|
|
335
419
|
gpr_mu_lock(&fd_freelist_mu);
|
@@ -343,17 +427,18 @@ static grpc_fd* fd_create(int fd, const char* name) {
|
|
343
427
|
new_fd = static_cast<grpc_fd*>(gpr_malloc(sizeof(grpc_fd)));
|
344
428
|
new_fd->read_closure.Init();
|
345
429
|
new_fd->write_closure.Init();
|
430
|
+
new_fd->error_closure.Init();
|
346
431
|
}
|
347
432
|
|
348
|
-
|
433
|
+
new_fd->fd = fd;
|
434
|
+
new_fd->salt = gpr_atm_no_barrier_fetch_add(&g_fd_salt, 1);
|
435
|
+
gpr_atm_rel_store(&new_fd->refst, (gpr_atm)1);
|
349
436
|
gpr_mu_init(&new_fd->orphan_mu);
|
437
|
+
gpr_mu_init(&new_fd->pollable_mu);
|
350
438
|
new_fd->pollable_obj = nullptr;
|
351
|
-
gpr_atm_rel_store(&new_fd->refst, (gpr_atm)1);
|
352
|
-
new_fd->fd = fd;
|
353
439
|
new_fd->read_closure->InitEvent();
|
354
440
|
new_fd->write_closure->InitEvent();
|
355
|
-
|
356
|
-
|
441
|
+
new_fd->error_closure->InitEvent();
|
357
442
|
new_fd->freelist_next = nullptr;
|
358
443
|
new_fd->on_done_closure = nullptr;
|
359
444
|
|
@@ -366,6 +451,8 @@ static grpc_fd* fd_create(int fd, const char* name) {
|
|
366
451
|
}
|
367
452
|
#endif
|
368
453
|
gpr_free(fd_name);
|
454
|
+
|
455
|
+
new_fd->track_err = track_err;
|
369
456
|
return new_fd;
|
370
457
|
}
|
371
458
|
|
@@ -375,24 +462,36 @@ static int fd_wrapped_fd(grpc_fd* fd) {
|
|
375
462
|
}
|
376
463
|
|
377
464
|
static void fd_orphan(grpc_fd* fd, grpc_closure* on_done, int* release_fd,
|
378
|
-
|
379
|
-
bool is_fd_closed =
|
465
|
+
const char* reason) {
|
466
|
+
bool is_fd_closed = false;
|
380
467
|
|
381
468
|
gpr_mu_lock(&fd->orphan_mu);
|
382
469
|
|
470
|
+
// Get the fd->pollable_obj and set the owner_orphaned on that pollable to
|
471
|
+
// true so that the pollable will no longer access its owner_fd field.
|
472
|
+
gpr_mu_lock(&fd->pollable_mu);
|
473
|
+
pollable* pollable_obj = fd->pollable_obj;
|
474
|
+
gpr_mu_unlock(&fd->pollable_mu);
|
475
|
+
|
476
|
+
if (pollable_obj) {
|
477
|
+
gpr_mu_lock(&pollable_obj->owner_orphan_mu);
|
478
|
+
pollable_obj->owner_orphaned = true;
|
479
|
+
}
|
480
|
+
|
383
481
|
fd->on_done_closure = on_done;
|
384
482
|
|
385
483
|
/* If release_fd is not NULL, we should be relinquishing control of the file
|
386
484
|
descriptor fd->fd (but we still own the grpc_fd structure). */
|
387
485
|
if (release_fd != nullptr) {
|
388
486
|
*release_fd = fd->fd;
|
389
|
-
} else
|
487
|
+
} else {
|
390
488
|
close(fd->fd);
|
391
489
|
is_fd_closed = true;
|
392
490
|
}
|
393
491
|
|
492
|
+
// TODO(sreek): handle fd removal (where is_fd_closed=false)
|
394
493
|
if (!is_fd_closed) {
|
395
|
-
|
494
|
+
GRPC_FD_TRACE("epoll_fd %p (%d) was orphaned but not closed.", fd, fd->fd);
|
396
495
|
}
|
397
496
|
|
398
497
|
/* Remove the active status but keep referenced. We want this grpc_fd struct
|
@@ -401,16 +500,15 @@ static void fd_orphan(grpc_fd* fd, grpc_closure* on_done, int* release_fd,
|
|
401
500
|
|
402
501
|
GRPC_CLOSURE_SCHED(fd->on_done_closure, GRPC_ERROR_NONE);
|
403
502
|
|
503
|
+
if (pollable_obj) {
|
504
|
+
gpr_mu_unlock(&pollable_obj->owner_orphan_mu);
|
505
|
+
}
|
506
|
+
|
404
507
|
gpr_mu_unlock(&fd->orphan_mu);
|
405
508
|
|
406
509
|
UNREF_BY(fd, 2, reason); /* Drop the reference */
|
407
510
|
}
|
408
511
|
|
409
|
-
static grpc_pollset* fd_get_read_notifier_pollset(grpc_fd* fd) {
|
410
|
-
gpr_atm notifier = gpr_atm_acq_load(&fd->read_notifier_pollset);
|
411
|
-
return (grpc_pollset*)notifier;
|
412
|
-
}
|
413
|
-
|
414
512
|
static bool fd_is_shutdown(grpc_fd* fd) {
|
415
513
|
return fd->read_closure->IsShutdown();
|
416
514
|
}
|
@@ -418,8 +516,14 @@ static bool fd_is_shutdown(grpc_fd* fd) {
|
|
418
516
|
/* Might be called multiple times */
|
419
517
|
static void fd_shutdown(grpc_fd* fd, grpc_error* why) {
|
420
518
|
if (fd->read_closure->SetShutdown(GRPC_ERROR_REF(why))) {
|
421
|
-
shutdown(fd->fd, SHUT_RDWR)
|
519
|
+
if (shutdown(fd->fd, SHUT_RDWR)) {
|
520
|
+
if (errno != ENOTCONN) {
|
521
|
+
gpr_log(GPR_ERROR, "Error shutting down fd %d. errno: %d",
|
522
|
+
grpc_fd_wrapped_fd(fd), errno);
|
523
|
+
}
|
524
|
+
}
|
422
525
|
fd->write_closure->SetShutdown(GRPC_ERROR_REF(why));
|
526
|
+
fd->error_closure->SetShutdown(GRPC_ERROR_REF(why));
|
423
527
|
}
|
424
528
|
GRPC_ERROR_UNREF(why);
|
425
529
|
}
|
@@ -432,6 +536,10 @@ static void fd_notify_on_write(grpc_fd* fd, grpc_closure* closure) {
|
|
432
536
|
fd->write_closure->NotifyOn(closure);
|
433
537
|
}
|
434
538
|
|
539
|
+
static void fd_notify_on_error(grpc_fd* fd, grpc_closure* closure) {
|
540
|
+
fd->error_closure->NotifyOn(closure);
|
541
|
+
}
|
542
|
+
|
435
543
|
/*******************************************************************************
|
436
544
|
* Pollable Definitions
|
437
545
|
*/
|
@@ -443,9 +551,13 @@ static grpc_error* pollable_create(pollable_type type, pollable** p) {
|
|
443
551
|
if (epfd == -1) {
|
444
552
|
return GRPC_OS_ERROR(errno, "epoll_create1");
|
445
553
|
}
|
554
|
+
GRPC_FD_TRACE("Pollable_create: created epfd: %d (type: %d)", epfd, type);
|
446
555
|
*p = static_cast<pollable*>(gpr_malloc(sizeof(**p)));
|
447
556
|
grpc_error* err = grpc_wakeup_fd_init(&(*p)->wakeup);
|
448
557
|
if (err != GRPC_ERROR_NONE) {
|
558
|
+
GRPC_FD_TRACE(
|
559
|
+
"Pollable_create: closed epfd: %d (type: %d). wakeupfd_init error",
|
560
|
+
epfd, type);
|
449
561
|
close(epfd);
|
450
562
|
gpr_free(*p);
|
451
563
|
*p = nullptr;
|
@@ -456,6 +568,9 @@ static grpc_error* pollable_create(pollable_type type, pollable** p) {
|
|
456
568
|
ev.data.ptr = (void*)(1 | (intptr_t) & (*p)->wakeup);
|
457
569
|
if (epoll_ctl(epfd, EPOLL_CTL_ADD, (*p)->wakeup.read_fd, &ev) != 0) {
|
458
570
|
err = GRPC_OS_ERROR(errno, "epoll_ctl");
|
571
|
+
GRPC_FD_TRACE(
|
572
|
+
"Pollable_create: closed epfd: %d (type: %d). epoll_ctl error", epfd,
|
573
|
+
type);
|
459
574
|
close(epfd);
|
460
575
|
grpc_wakeup_fd_destroy(&(*p)->wakeup);
|
461
576
|
gpr_free(*p);
|
@@ -468,11 +583,15 @@ static grpc_error* pollable_create(pollable_type type, pollable** p) {
|
|
468
583
|
gpr_mu_init(&(*p)->mu);
|
469
584
|
(*p)->epfd = epfd;
|
470
585
|
(*p)->owner_fd = nullptr;
|
586
|
+
gpr_mu_init(&(*p)->owner_orphan_mu);
|
587
|
+
(*p)->owner_orphaned = false;
|
471
588
|
(*p)->pollset_set = nullptr;
|
472
589
|
(*p)->next = (*p)->prev = *p;
|
473
590
|
(*p)->root_worker = nullptr;
|
474
591
|
(*p)->event_cursor = 0;
|
475
592
|
(*p)->event_count = 0;
|
593
|
+
(*p)->fd_cache_size = 0;
|
594
|
+
(*p)->fd_cache_counter = 0;
|
476
595
|
return GRPC_ERROR_NONE;
|
477
596
|
}
|
478
597
|
|
@@ -502,8 +621,10 @@ static void pollable_unref(pollable* p, int line, const char* reason) {
|
|
502
621
|
}
|
503
622
|
#endif
|
504
623
|
if (p != nullptr && gpr_unref(&p->refs)) {
|
624
|
+
GRPC_FD_TRACE("pollable_unref: Closing epfd: %d", p->epfd);
|
505
625
|
close(p->epfd);
|
506
626
|
grpc_wakeup_fd_destroy(&p->wakeup);
|
627
|
+
gpr_mu_destroy(&p->owner_orphan_mu);
|
507
628
|
gpr_free(p);
|
508
629
|
}
|
509
630
|
}
|
@@ -512,15 +633,53 @@ static grpc_error* pollable_add_fd(pollable* p, grpc_fd* fd) {
|
|
512
633
|
grpc_error* error = GRPC_ERROR_NONE;
|
513
634
|
static const char* err_desc = "pollable_add_fd";
|
514
635
|
const int epfd = p->epfd;
|
636
|
+
gpr_mu_lock(&p->mu);
|
637
|
+
p->fd_cache_counter++;
|
638
|
+
|
639
|
+
// Handle the case of overflow for our cache counter by
|
640
|
+
// reseting the recency-counter on all cache objects
|
641
|
+
if (p->fd_cache_counter == 0) {
|
642
|
+
for (int i = 0; i < p->fd_cache_size; i++) {
|
643
|
+
p->fd_cache[i].last_used = 0;
|
644
|
+
}
|
645
|
+
}
|
646
|
+
|
647
|
+
int lru_idx = 0;
|
648
|
+
for (int i = 0; i < p->fd_cache_size; i++) {
|
649
|
+
if (p->fd_cache[i].fd == fd->fd && p->fd_cache[i].salt == fd->salt) {
|
650
|
+
GRPC_STATS_INC_POLLSET_FD_CACHE_HITS();
|
651
|
+
p->fd_cache[i].last_used = p->fd_cache_counter;
|
652
|
+
gpr_mu_unlock(&p->mu);
|
653
|
+
return GRPC_ERROR_NONE;
|
654
|
+
} else if (p->fd_cache[i].last_used < p->fd_cache[lru_idx].last_used) {
|
655
|
+
lru_idx = i;
|
656
|
+
}
|
657
|
+
}
|
658
|
+
|
659
|
+
// Add to cache
|
660
|
+
if (p->fd_cache_size < MAX_FDS_IN_CACHE) {
|
661
|
+
lru_idx = p->fd_cache_size;
|
662
|
+
p->fd_cache_size++;
|
663
|
+
}
|
664
|
+
p->fd_cache[lru_idx].fd = fd->fd;
|
665
|
+
p->fd_cache[lru_idx].salt = fd->salt;
|
666
|
+
p->fd_cache[lru_idx].last_used = p->fd_cache_counter;
|
667
|
+
gpr_mu_unlock(&p->mu);
|
515
668
|
|
516
669
|
if (grpc_polling_trace.enabled()) {
|
517
|
-
gpr_log(
|
670
|
+
gpr_log(GPR_INFO, "add fd %p (%d) to pollable %p", fd, fd->fd, p);
|
518
671
|
}
|
519
672
|
|
520
673
|
struct epoll_event ev_fd;
|
521
674
|
ev_fd.events =
|
522
675
|
static_cast<uint32_t>(EPOLLET | EPOLLIN | EPOLLOUT | EPOLLEXCLUSIVE);
|
523
|
-
ev_fd.data.ptr
|
676
|
+
/* Use the second least significant bit of ev_fd.data.ptr to store track_err
|
677
|
+
* to avoid synchronization issues when accessing it after receiving an event.
|
678
|
+
* Accessing fd would be a data race there because the fd might have been
|
679
|
+
* returned to the free list at that point. */
|
680
|
+
ev_fd.data.ptr = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(fd) |
|
681
|
+
(fd->track_err ? 2 : 0));
|
682
|
+
GRPC_STATS_INC_SYSCALL_EPOLL_CTL();
|
524
683
|
if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd->fd, &ev_fd) != 0) {
|
525
684
|
switch (errno) {
|
526
685
|
case EEXIST:
|
@@ -556,7 +715,7 @@ static void pollset_global_shutdown(void) {
|
|
556
715
|
/* pollset->mu must be held while calling this function */
|
557
716
|
static void pollset_maybe_finish_shutdown(grpc_pollset* pollset) {
|
558
717
|
if (grpc_polling_trace.enabled()) {
|
559
|
-
gpr_log(
|
718
|
+
gpr_log(GPR_INFO,
|
560
719
|
"PS:%p (pollable:%p) maybe_finish_shutdown sc=%p (target:!NULL) "
|
561
720
|
"rw=%p (target:NULL) cpsc=%d (target:0)",
|
562
721
|
pollset, pollset->active_pollable, pollset->shutdown_closure,
|
@@ -577,18 +736,18 @@ static void pollset_maybe_finish_shutdown(grpc_pollset* pollset) {
|
|
577
736
|
static grpc_error* kick_one_worker(grpc_pollset_worker* specific_worker) {
|
578
737
|
GPR_TIMER_SCOPE("kick_one_worker", 0);
|
579
738
|
pollable* p = specific_worker->pollable_obj;
|
580
|
-
grpc_core::
|
739
|
+
grpc_core::MutexLock lock(&p->mu);
|
581
740
|
GPR_ASSERT(specific_worker != nullptr);
|
582
741
|
if (specific_worker->kicked) {
|
583
742
|
if (grpc_polling_trace.enabled()) {
|
584
|
-
gpr_log(
|
743
|
+
gpr_log(GPR_INFO, "PS:%p kicked_specific_but_already_kicked", p);
|
585
744
|
}
|
586
745
|
GRPC_STATS_INC_POLLSET_KICKED_AGAIN();
|
587
746
|
return GRPC_ERROR_NONE;
|
588
747
|
}
|
589
748
|
if (gpr_tls_get(&g_current_thread_worker) == (intptr_t)specific_worker) {
|
590
749
|
if (grpc_polling_trace.enabled()) {
|
591
|
-
gpr_log(
|
750
|
+
gpr_log(GPR_INFO, "PS:%p kicked_specific_but_awake", p);
|
592
751
|
}
|
593
752
|
GRPC_STATS_INC_POLLSET_KICK_OWN_THREAD();
|
594
753
|
specific_worker->kicked = true;
|
@@ -597,7 +756,7 @@ static grpc_error* kick_one_worker(grpc_pollset_worker* specific_worker) {
|
|
597
756
|
if (specific_worker == p->root_worker) {
|
598
757
|
GRPC_STATS_INC_POLLSET_KICK_WAKEUP_FD();
|
599
758
|
if (grpc_polling_trace.enabled()) {
|
600
|
-
gpr_log(
|
759
|
+
gpr_log(GPR_INFO, "PS:%p kicked_specific_via_wakeup_fd", p);
|
601
760
|
}
|
602
761
|
specific_worker->kicked = true;
|
603
762
|
grpc_error* error = grpc_wakeup_fd_wakeup(&p->wakeup);
|
@@ -606,7 +765,7 @@ static grpc_error* kick_one_worker(grpc_pollset_worker* specific_worker) {
|
|
606
765
|
if (specific_worker->initialized_cv) {
|
607
766
|
GRPC_STATS_INC_POLLSET_KICK_WAKEUP_CV();
|
608
767
|
if (grpc_polling_trace.enabled()) {
|
609
|
-
gpr_log(
|
768
|
+
gpr_log(GPR_INFO, "PS:%p kicked_specific_via_cv", p);
|
610
769
|
}
|
611
770
|
specific_worker->kicked = true;
|
612
771
|
gpr_cv_signal(&specific_worker->cv);
|
@@ -622,7 +781,7 @@ static grpc_error* pollset_kick(grpc_pollset* pollset,
|
|
622
781
|
GPR_TIMER_SCOPE("pollset_kick", 0);
|
623
782
|
GRPC_STATS_INC_POLLSET_KICK();
|
624
783
|
if (grpc_polling_trace.enabled()) {
|
625
|
-
gpr_log(
|
784
|
+
gpr_log(GPR_INFO,
|
626
785
|
"PS:%p kick %p tls_pollset=%p tls_worker=%p pollset.root_worker=%p",
|
627
786
|
pollset, specific_worker,
|
628
787
|
(void*)gpr_tls_get(&g_current_thread_pollset),
|
@@ -632,7 +791,7 @@ static grpc_error* pollset_kick(grpc_pollset* pollset,
|
|
632
791
|
if (gpr_tls_get(&g_current_thread_pollset) != (intptr_t)pollset) {
|
633
792
|
if (pollset->root_worker == nullptr) {
|
634
793
|
if (grpc_polling_trace.enabled()) {
|
635
|
-
gpr_log(
|
794
|
+
gpr_log(GPR_INFO, "PS:%p kicked_any_without_poller", pollset);
|
636
795
|
}
|
637
796
|
GRPC_STATS_INC_POLLSET_KICKED_WITHOUT_POLLER();
|
638
797
|
pollset->kicked_without_poller = true;
|
@@ -658,7 +817,7 @@ static grpc_error* pollset_kick(grpc_pollset* pollset,
|
|
658
817
|
}
|
659
818
|
} else {
|
660
819
|
if (grpc_polling_trace.enabled()) {
|
661
|
-
gpr_log(
|
820
|
+
gpr_log(GPR_INFO, "PS:%p kicked_any_but_awake", pollset);
|
662
821
|
}
|
663
822
|
GRPC_STATS_INC_POLLSET_KICK_OWN_THREAD();
|
664
823
|
return GRPC_ERROR_NONE;
|
@@ -685,6 +844,7 @@ static grpc_error* pollset_kick_all(grpc_pollset* pollset) {
|
|
685
844
|
|
686
845
|
static void pollset_init(grpc_pollset* pollset, gpr_mu** mu) {
|
687
846
|
gpr_mu_init(&pollset->mu);
|
847
|
+
gpr_atm_no_barrier_store(&pollset->worker_count, 0);
|
688
848
|
pollset->active_pollable = POLLABLE_REF(g_empty_pollable, "pollset");
|
689
849
|
pollset->kicked_without_poller = false;
|
690
850
|
pollset->shutdown_closure = nullptr;
|
@@ -705,24 +865,21 @@ static int poll_deadline_to_millis_timeout(grpc_millis millis) {
|
|
705
865
|
return static_cast<int>(delta);
|
706
866
|
}
|
707
867
|
|
708
|
-
static void fd_become_readable(grpc_fd* fd
|
709
|
-
fd->read_closure->SetReady();
|
710
|
-
|
711
|
-
/* Note, it is possible that fd_become_readable might be called twice with
|
712
|
-
different 'notifier's when an fd becomes readable and it is in two epoll
|
713
|
-
sets (This can happen briefly during polling island merges). In such cases
|
714
|
-
it does not really matter which notifer is set as the read_notifier_pollset
|
715
|
-
(They would both point to the same polling island anyway) */
|
716
|
-
/* Use release store to match with acquire load in fd_get_read_notifier */
|
717
|
-
gpr_atm_rel_store(&fd->read_notifier_pollset, (gpr_atm)notifier);
|
718
|
-
}
|
868
|
+
static void fd_become_readable(grpc_fd* fd) { fd->read_closure->SetReady(); }
|
719
869
|
|
720
870
|
static void fd_become_writable(grpc_fd* fd) { fd->write_closure->SetReady(); }
|
721
871
|
|
722
|
-
static
|
872
|
+
static void fd_has_errors(grpc_fd* fd) { fd->error_closure->SetReady(); }
|
873
|
+
|
874
|
+
/* Get the pollable_obj attached to this fd. If none is attached, create a new
|
875
|
+
* pollable object (of type PO_FD), attach it to the fd and return it
|
876
|
+
*
|
877
|
+
* Note that if a pollable object is already attached to the fd, it may be of
|
878
|
+
* either PO_FD or PO_MULTI type */
|
879
|
+
static grpc_error* get_fd_pollable(grpc_fd* fd, pollable** p) {
|
723
880
|
gpr_mu_lock(&fd->pollable_mu);
|
724
881
|
grpc_error* error = GRPC_ERROR_NONE;
|
725
|
-
static const char* err_desc = "
|
882
|
+
static const char* err_desc = "get_fd_pollable";
|
726
883
|
if (fd->pollable_obj == nullptr) {
|
727
884
|
if (append_error(&error, pollable_create(PO_FD, &fd->pollable_obj),
|
728
885
|
err_desc)) {
|
@@ -758,8 +915,20 @@ static grpc_error* pollable_process_events(grpc_pollset* pollset,
|
|
758
915
|
pollable* pollable_obj, bool drain) {
|
759
916
|
GPR_TIMER_SCOPE("pollable_process_events", 0);
|
760
917
|
static const char* err_desc = "pollset_process_events";
|
918
|
+
// Use a simple heuristic to determine how many fd events to process
|
919
|
+
// per loop iteration. (events/workers)
|
920
|
+
int handle_count = 1;
|
921
|
+
int worker_count = gpr_atm_no_barrier_load(&pollset->worker_count);
|
922
|
+
GPR_ASSERT(worker_count > 0);
|
923
|
+
handle_count =
|
924
|
+
(pollable_obj->event_count - pollable_obj->event_cursor) / worker_count;
|
925
|
+
if (handle_count == 0) {
|
926
|
+
handle_count = 1;
|
927
|
+
} else if (handle_count > MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL) {
|
928
|
+
handle_count = MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL;
|
929
|
+
}
|
761
930
|
grpc_error* error = GRPC_ERROR_NONE;
|
762
|
-
for (int i = 0; (drain || i <
|
931
|
+
for (int i = 0; (drain || i < handle_count) &&
|
763
932
|
pollable_obj->event_cursor != pollable_obj->event_count;
|
764
933
|
i++) {
|
765
934
|
int n = pollable_obj->event_cursor++;
|
@@ -767,7 +936,7 @@ static grpc_error* pollable_process_events(grpc_pollset* pollset,
|
|
767
936
|
void* data_ptr = ev->data.ptr;
|
768
937
|
if (1 & (intptr_t)data_ptr) {
|
769
938
|
if (grpc_polling_trace.enabled()) {
|
770
|
-
gpr_log(
|
939
|
+
gpr_log(GPR_INFO, "PS:%p got pollset_wakeup %p", pollset, data_ptr);
|
771
940
|
}
|
772
941
|
append_error(&error,
|
773
942
|
grpc_wakeup_fd_consume_wakeup(
|
@@ -775,20 +944,28 @@ static grpc_error* pollable_process_events(grpc_pollset* pollset,
|
|
775
944
|
(intptr_t)data_ptr)),
|
776
945
|
err_desc);
|
777
946
|
} else {
|
778
|
-
grpc_fd* fd =
|
779
|
-
|
947
|
+
grpc_fd* fd =
|
948
|
+
reinterpret_cast<grpc_fd*>(reinterpret_cast<intptr_t>(data_ptr) & ~2);
|
949
|
+
bool track_err = reinterpret_cast<intptr_t>(data_ptr) & 2;
|
950
|
+
bool cancel = (ev->events & EPOLLHUP) != 0;
|
951
|
+
bool error = (ev->events & EPOLLERR) != 0;
|
780
952
|
bool read_ev = (ev->events & (EPOLLIN | EPOLLPRI)) != 0;
|
781
953
|
bool write_ev = (ev->events & EPOLLOUT) != 0;
|
954
|
+
bool err_fallback = error && !track_err;
|
955
|
+
|
782
956
|
if (grpc_polling_trace.enabled()) {
|
783
|
-
gpr_log(
|
957
|
+
gpr_log(GPR_INFO,
|
784
958
|
"PS:%p got fd %p: cancel=%d read=%d "
|
785
959
|
"write=%d",
|
786
960
|
pollset, fd, cancel, read_ev, write_ev);
|
787
961
|
}
|
788
|
-
if (
|
789
|
-
|
962
|
+
if (error && !err_fallback) {
|
963
|
+
fd_has_errors(fd);
|
964
|
+
}
|
965
|
+
if (read_ev || cancel || err_fallback) {
|
966
|
+
fd_become_readable(fd);
|
790
967
|
}
|
791
|
-
if (write_ev || cancel) {
|
968
|
+
if (write_ev || cancel || err_fallback) {
|
792
969
|
fd_become_writable(fd);
|
793
970
|
}
|
794
971
|
}
|
@@ -810,7 +987,7 @@ static grpc_error* pollable_epoll(pollable* p, grpc_millis deadline) {
|
|
810
987
|
|
811
988
|
if (grpc_polling_trace.enabled()) {
|
812
989
|
char* desc = pollable_desc(p);
|
813
|
-
gpr_log(
|
990
|
+
gpr_log(GPR_INFO, "POLLABLE:%p[%s] poll for %dms", p, desc, timeout);
|
814
991
|
gpr_free(desc);
|
815
992
|
}
|
816
993
|
|
@@ -829,7 +1006,7 @@ static grpc_error* pollable_epoll(pollable* p, grpc_millis deadline) {
|
|
829
1006
|
if (r < 0) return GRPC_OS_ERROR(errno, "epoll_wait");
|
830
1007
|
|
831
1008
|
if (grpc_polling_trace.enabled()) {
|
832
|
-
gpr_log(
|
1009
|
+
gpr_log(GPR_INFO, "POLLABLE:%p got %d events", p, r);
|
833
1010
|
}
|
834
1011
|
|
835
1012
|
p->event_cursor = 0;
|
@@ -884,6 +1061,7 @@ static bool begin_worker(grpc_pollset* pollset, grpc_pollset_worker* worker,
|
|
884
1061
|
GPR_TIMER_SCOPE("begin_worker", 0);
|
885
1062
|
bool do_poll =
|
886
1063
|
(pollset->shutdown_closure == nullptr && !pollset->already_shutdown);
|
1064
|
+
gpr_atm_no_barrier_fetch_add(&pollset->worker_count, 1);
|
887
1065
|
if (worker_hdl != nullptr) *worker_hdl = worker;
|
888
1066
|
worker->initialized_cv = false;
|
889
1067
|
worker->kicked = false;
|
@@ -899,7 +1077,7 @@ static bool begin_worker(grpc_pollset* pollset, grpc_pollset_worker* worker,
|
|
899
1077
|
gpr_mu_unlock(&pollset->mu);
|
900
1078
|
if (grpc_polling_trace.enabled() &&
|
901
1079
|
worker->pollable_obj->root_worker != worker) {
|
902
|
-
gpr_log(
|
1080
|
+
gpr_log(GPR_INFO, "PS:%p wait %p w=%p for %dms", pollset,
|
903
1081
|
worker->pollable_obj, worker,
|
904
1082
|
poll_deadline_to_millis_timeout(deadline));
|
905
1083
|
}
|
@@ -907,19 +1085,19 @@ static bool begin_worker(grpc_pollset* pollset, grpc_pollset_worker* worker,
|
|
907
1085
|
if (gpr_cv_wait(&worker->cv, &worker->pollable_obj->mu,
|
908
1086
|
grpc_millis_to_timespec(deadline, GPR_CLOCK_REALTIME))) {
|
909
1087
|
if (grpc_polling_trace.enabled()) {
|
910
|
-
gpr_log(
|
1088
|
+
gpr_log(GPR_INFO, "PS:%p timeout_wait %p w=%p", pollset,
|
911
1089
|
worker->pollable_obj, worker);
|
912
1090
|
}
|
913
1091
|
do_poll = false;
|
914
1092
|
} else if (worker->kicked) {
|
915
1093
|
if (grpc_polling_trace.enabled()) {
|
916
|
-
gpr_log(
|
1094
|
+
gpr_log(GPR_INFO, "PS:%p wakeup %p w=%p", pollset,
|
917
1095
|
worker->pollable_obj, worker);
|
918
1096
|
}
|
919
1097
|
do_poll = false;
|
920
1098
|
} else if (grpc_polling_trace.enabled() &&
|
921
1099
|
worker->pollable_obj->root_worker != worker) {
|
922
|
-
gpr_log(
|
1100
|
+
gpr_log(GPR_INFO, "PS:%p spurious_wakeup %p w=%p", pollset,
|
923
1101
|
worker->pollable_obj, worker);
|
924
1102
|
}
|
925
1103
|
}
|
@@ -964,6 +1142,7 @@ static void end_worker(grpc_pollset* pollset, grpc_pollset_worker* worker,
|
|
964
1142
|
if (worker->initialized_cv) {
|
965
1143
|
gpr_cv_destroy(&worker->cv);
|
966
1144
|
}
|
1145
|
+
gpr_atm_no_barrier_fetch_add(&pollset->worker_count, -1);
|
967
1146
|
}
|
968
1147
|
|
969
1148
|
#ifndef NDEBUG
|
@@ -990,8 +1169,8 @@ static grpc_error* pollset_work(grpc_pollset* pollset,
|
|
990
1169
|
WORKER_PTR->originator = gettid();
|
991
1170
|
#endif
|
992
1171
|
if (grpc_polling_trace.enabled()) {
|
993
|
-
gpr_log(
|
994
|
-
"PS:%p work hdl=%p worker=%p now=%"
|
1172
|
+
gpr_log(GPR_INFO,
|
1173
|
+
"PS:%p work hdl=%p worker=%p now=%" PRId64 " deadline=%" PRId64
|
995
1174
|
" kwp=%d pollable=%p",
|
996
1175
|
pollset, worker_hdl, WORKER_PTR, grpc_core::ExecCtx::Get()->Now(),
|
997
1176
|
deadline, pollset->kicked_without_poller, pollset->active_pollable);
|
@@ -1031,13 +1210,13 @@ static grpc_error* pollset_transition_pollable_from_empty_to_fd_locked(
|
|
1031
1210
|
static const char* err_desc = "pollset_transition_pollable_from_empty_to_fd";
|
1032
1211
|
grpc_error* error = GRPC_ERROR_NONE;
|
1033
1212
|
if (grpc_polling_trace.enabled()) {
|
1034
|
-
gpr_log(
|
1213
|
+
gpr_log(GPR_INFO,
|
1035
1214
|
"PS:%p add fd %p (%d); transition pollable from empty to fd",
|
1036
1215
|
pollset, fd, fd->fd);
|
1037
1216
|
}
|
1038
1217
|
append_error(&error, pollset_kick_all(pollset), err_desc);
|
1039
1218
|
POLLABLE_UNREF(pollset->active_pollable, "pollset");
|
1040
|
-
append_error(&error,
|
1219
|
+
append_error(&error, get_fd_pollable(fd, &pollset->active_pollable),
|
1041
1220
|
err_desc);
|
1042
1221
|
return error;
|
1043
1222
|
}
|
@@ -1048,7 +1227,7 @@ static grpc_error* pollset_transition_pollable_from_fd_to_multi_locked(
|
|
1048
1227
|
grpc_error* error = GRPC_ERROR_NONE;
|
1049
1228
|
if (grpc_polling_trace.enabled()) {
|
1050
1229
|
gpr_log(
|
1051
|
-
|
1230
|
+
GPR_INFO,
|
1052
1231
|
"PS:%p add fd %p (%d); transition pollable from fd %p to multipoller",
|
1053
1232
|
pollset, and_add_fd, and_add_fd ? and_add_fd->fd : -1,
|
1054
1233
|
pollset->active_pollable->owner_fd);
|
@@ -1081,9 +1260,8 @@ static grpc_error* pollset_add_fd_locked(grpc_pollset* pollset, grpc_fd* fd) {
|
|
1081
1260
|
error = pollset_transition_pollable_from_empty_to_fd_locked(pollset, fd);
|
1082
1261
|
break;
|
1083
1262
|
case PO_FD:
|
1084
|
-
gpr_mu_lock(&po_at_start->
|
1085
|
-
if (
|
1086
|
-
1) == 0) {
|
1263
|
+
gpr_mu_lock(&po_at_start->owner_orphan_mu);
|
1264
|
+
if (po_at_start->owner_orphaned) {
|
1087
1265
|
error =
|
1088
1266
|
pollset_transition_pollable_from_empty_to_fd_locked(pollset, fd);
|
1089
1267
|
} else {
|
@@ -1091,7 +1269,7 @@ static grpc_error* pollset_add_fd_locked(grpc_pollset* pollset, grpc_fd* fd) {
|
|
1091
1269
|
error =
|
1092
1270
|
pollset_transition_pollable_from_fd_to_multi_locked(pollset, fd);
|
1093
1271
|
}
|
1094
|
-
gpr_mu_unlock(&po_at_start->
|
1272
|
+
gpr_mu_unlock(&po_at_start->owner_orphan_mu);
|
1095
1273
|
break;
|
1096
1274
|
case PO_MULTI:
|
1097
1275
|
error = pollable_add_fd(pollset->active_pollable, fd);
|
@@ -1118,7 +1296,7 @@ static grpc_error* pollset_as_multipollable_locked(grpc_pollset* pollset,
|
|
1118
1296
|
/* Any workers currently polling on this pollset must now be woked up so
|
1119
1297
|
* that they can pick up the new active_pollable */
|
1120
1298
|
if (grpc_polling_trace.enabled()) {
|
1121
|
-
gpr_log(
|
1299
|
+
gpr_log(GPR_INFO,
|
1122
1300
|
"PS:%p active pollable transition from empty to multi",
|
1123
1301
|
pollset);
|
1124
1302
|
}
|
@@ -1127,16 +1305,17 @@ static grpc_error* pollset_as_multipollable_locked(grpc_pollset* pollset,
|
|
1127
1305
|
append_error(&error, pollset_kick_all(pollset), err_desc);
|
1128
1306
|
break;
|
1129
1307
|
case PO_FD:
|
1130
|
-
gpr_mu_lock(&po_at_start->
|
1131
|
-
if (
|
1132
|
-
|
1308
|
+
gpr_mu_lock(&po_at_start->owner_orphan_mu);
|
1309
|
+
if (po_at_start->owner_orphaned) {
|
1310
|
+
// Unlock before Unref'ing the pollable
|
1311
|
+
gpr_mu_unlock(&po_at_start->owner_orphan_mu);
|
1133
1312
|
POLLABLE_UNREF(pollset->active_pollable, "pollset");
|
1134
1313
|
error = pollable_create(PO_MULTI, &pollset->active_pollable);
|
1135
1314
|
} else {
|
1136
1315
|
error = pollset_transition_pollable_from_fd_to_multi_locked(pollset,
|
1137
1316
|
nullptr);
|
1317
|
+
gpr_mu_unlock(&po_at_start->owner_orphan_mu);
|
1138
1318
|
}
|
1139
|
-
gpr_mu_unlock(&po_at_start->owner_fd->orphan_mu);
|
1140
1319
|
break;
|
1141
1320
|
case PO_MULTI:
|
1142
1321
|
break;
|
@@ -1205,7 +1384,7 @@ static void pollset_set_unref(grpc_pollset_set* pss) {
|
|
1205
1384
|
static void pollset_set_add_fd(grpc_pollset_set* pss, grpc_fd* fd) {
|
1206
1385
|
GPR_TIMER_SCOPE("pollset_set_add_fd", 0);
|
1207
1386
|
if (grpc_polling_trace.enabled()) {
|
1208
|
-
gpr_log(
|
1387
|
+
gpr_log(GPR_INFO, "PSS:%p: add fd %p (%d)", pss, fd, fd->fd);
|
1209
1388
|
}
|
1210
1389
|
grpc_error* error = GRPC_ERROR_NONE;
|
1211
1390
|
static const char* err_desc = "pollset_set_add_fd";
|
@@ -1229,7 +1408,7 @@ static void pollset_set_add_fd(grpc_pollset_set* pss, grpc_fd* fd) {
|
|
1229
1408
|
static void pollset_set_del_fd(grpc_pollset_set* pss, grpc_fd* fd) {
|
1230
1409
|
GPR_TIMER_SCOPE("pollset_set_del_fd", 0);
|
1231
1410
|
if (grpc_polling_trace.enabled()) {
|
1232
|
-
gpr_log(
|
1411
|
+
gpr_log(GPR_INFO, "PSS:%p: del fd %p", pss, fd);
|
1233
1412
|
}
|
1234
1413
|
pss = pss_lock_adam(pss);
|
1235
1414
|
size_t i;
|
@@ -1250,7 +1429,7 @@ static void pollset_set_del_fd(grpc_pollset_set* pss, grpc_fd* fd) {
|
|
1250
1429
|
static void pollset_set_del_pollset(grpc_pollset_set* pss, grpc_pollset* ps) {
|
1251
1430
|
GPR_TIMER_SCOPE("pollset_set_del_pollset", 0);
|
1252
1431
|
if (grpc_polling_trace.enabled()) {
|
1253
|
-
gpr_log(
|
1432
|
+
gpr_log(GPR_INFO, "PSS:%p: del pollset %p", pss, ps);
|
1254
1433
|
}
|
1255
1434
|
pss = pss_lock_adam(pss);
|
1256
1435
|
size_t i;
|
@@ -1302,7 +1481,7 @@ static grpc_error* add_fds_to_pollsets(grpc_fd** fds, size_t fd_count,
|
|
1302
1481
|
static void pollset_set_add_pollset(grpc_pollset_set* pss, grpc_pollset* ps) {
|
1303
1482
|
GPR_TIMER_SCOPE("pollset_set_add_pollset", 0);
|
1304
1483
|
if (grpc_polling_trace.enabled()) {
|
1305
|
-
gpr_log(
|
1484
|
+
gpr_log(GPR_INFO, "PSS:%p: add pollset %p", pss, ps);
|
1306
1485
|
}
|
1307
1486
|
grpc_error* error = GRPC_ERROR_NONE;
|
1308
1487
|
static const char* err_desc = "pollset_set_add_pollset";
|
@@ -1339,7 +1518,7 @@ static void pollset_set_add_pollset_set(grpc_pollset_set* a,
|
|
1339
1518
|
grpc_pollset_set* b) {
|
1340
1519
|
GPR_TIMER_SCOPE("pollset_set_add_pollset_set", 0);
|
1341
1520
|
if (grpc_polling_trace.enabled()) {
|
1342
|
-
gpr_log(
|
1521
|
+
gpr_log(GPR_INFO, "PSS: merge (%p, %p)", a, b);
|
1343
1522
|
}
|
1344
1523
|
grpc_error* error = GRPC_ERROR_NONE;
|
1345
1524
|
static const char* err_desc = "pollset_set_add_fd";
|
@@ -1366,14 +1545,14 @@ static void pollset_set_add_pollset_set(grpc_pollset_set* a,
|
|
1366
1545
|
gpr_mu_unlock(b_mu);
|
1367
1546
|
}
|
1368
1547
|
// try to do the least copying possible
|
1369
|
-
// TODO(
|
1548
|
+
// TODO(sreek): there's probably a better heuristic here
|
1370
1549
|
const size_t a_size = a->fd_count + a->pollset_count;
|
1371
1550
|
const size_t b_size = b->fd_count + b->pollset_count;
|
1372
1551
|
if (b_size > a_size) {
|
1373
1552
|
GPR_SWAP(grpc_pollset_set*, a, b);
|
1374
1553
|
}
|
1375
1554
|
if (grpc_polling_trace.enabled()) {
|
1376
|
-
gpr_log(
|
1555
|
+
gpr_log(GPR_INFO, "PSS: parent %p to %p", b, a);
|
1377
1556
|
}
|
1378
1557
|
gpr_ref(&a->refs);
|
1379
1558
|
b->parent = a;
|
@@ -1428,6 +1607,7 @@ static void shutdown_engine(void) {
|
|
1428
1607
|
|
1429
1608
|
static const grpc_event_engine_vtable vtable = {
|
1430
1609
|
sizeof(grpc_pollset),
|
1610
|
+
true,
|
1431
1611
|
|
1432
1612
|
fd_create,
|
1433
1613
|
fd_wrapped_fd,
|
@@ -1435,8 +1615,11 @@ static const grpc_event_engine_vtable vtable = {
|
|
1435
1615
|
fd_shutdown,
|
1436
1616
|
fd_notify_on_read,
|
1437
1617
|
fd_notify_on_write,
|
1618
|
+
fd_notify_on_error,
|
1619
|
+
fd_become_readable,
|
1620
|
+
fd_become_writable,
|
1621
|
+
fd_has_errors,
|
1438
1622
|
fd_is_shutdown,
|
1439
|
-
fd_get_read_notifier_pollset,
|
1440
1623
|
|
1441
1624
|
pollset_init,
|
1442
1625
|
pollset_shutdown,
|
@@ -1481,7 +1664,7 @@ const grpc_event_engine_vtable* grpc_init_epollex_linux(
|
|
1481
1664
|
}
|
1482
1665
|
|
1483
1666
|
#else /* defined(GRPC_LINUX_EPOLL_CREATE1) */
|
1484
|
-
#if defined(
|
1667
|
+
#if defined(GRPC_POSIX_SOCKET_EV_EPOLLEX)
|
1485
1668
|
#include "src/core/lib/iomgr/ev_epollex_linux.h"
|
1486
1669
|
/* If GRPC_LINUX_EPOLL_CREATE1 is not defined, it means
|
1487
1670
|
epoll_create1 is not available. Return NULL */
|
@@ -1489,6 +1672,6 @@ const grpc_event_engine_vtable* grpc_init_epollex_linux(
|
|
1489
1672
|
bool explicitly_requested) {
|
1490
1673
|
return nullptr;
|
1491
1674
|
}
|
1492
|
-
#endif /* defined(
|
1675
|
+
#endif /* defined(GRPC_POSIX_SOCKET_EV_EPOLLEX) */
|
1493
1676
|
|
1494
1677
|
#endif /* !defined(GRPC_LINUX_EPOLL_CREATE1) */
|