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.
Files changed (452) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1150 -176
  3. data/etc/roots.pem +40 -196
  4. data/include/grpc/grpc.h +49 -8
  5. data/include/grpc/grpc_security.h +123 -2
  6. data/include/grpc/grpc_security_constants.h +6 -0
  7. data/include/grpc/impl/codegen/fork.h +4 -4
  8. data/include/grpc/impl/codegen/grpc_types.h +26 -5
  9. data/include/grpc/impl/codegen/log.h +112 -0
  10. data/include/grpc/impl/codegen/port_platform.h +55 -4
  11. data/include/grpc/module.modulemap +2 -0
  12. data/include/grpc/support/log.h +2 -80
  13. data/include/grpc/support/string_util.h +2 -0
  14. data/include/grpc/support/sync.h +0 -16
  15. data/src/boringssl/err_data.c +602 -588
  16. data/src/core/ext/{census → filters/census}/grpc_context.cc +0 -0
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +1 -1
  18. data/src/core/ext/filters/client_channel/client_channel.cc +1234 -1070
  19. data/src/core/ext/filters/client_channel/client_channel.h +5 -0
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +113 -0
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +71 -0
  22. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -0
  23. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  24. data/src/core/ext/filters/client_channel/http_proxy.cc +22 -5
  25. data/src/core/ext/filters/client_channel/lb_policy.cc +2 -2
  26. data/src/core/ext/filters/client_channel/lb_policy.h +30 -10
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +11 -9
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +120 -127
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +36 -0
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +36 -102
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +37 -32
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +25 -22
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +4 -2
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.c +19 -0
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.h +54 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.c +19 -0
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.h +54 -0
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +4 -17
  39. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +37 -63
  40. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +306 -239
  41. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +444 -392
  42. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +538 -98
  43. data/src/core/ext/filters/client_channel/lb_policy_factory.cc +8 -0
  44. data/src/core/ext/filters/client_channel/lb_policy_factory.h +4 -0
  45. data/src/core/ext/filters/client_channel/method_params.h +4 -0
  46. data/src/core/ext/filters/client_channel/resolver.h +10 -0
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +36 -19
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +320 -0
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +62 -9
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +49 -294
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +537 -0
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +112 -87
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +17 -2
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +6 -5
  55. 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
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +29 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +32 -15
  58. data/src/core/ext/filters/client_channel/retry_throttle.h +4 -0
  59. data/src/core/ext/filters/client_channel/subchannel.cc +58 -15
  60. data/src/core/ext/filters/client_channel/subchannel.h +11 -0
  61. data/src/core/ext/filters/deadline/deadline_filter.cc +18 -15
  62. data/src/core/ext/filters/deadline/deadline_filter.h +5 -5
  63. data/src/core/ext/filters/http/client/http_client_filter.cc +10 -9
  64. data/src/core/ext/filters/http/client_authority_filter.cc +6 -5
  65. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +6 -6
  66. data/src/core/ext/filters/http/server/http_server_filter.cc +123 -131
  67. data/src/core/ext/filters/http/server/http_server_filter.h +1 -1
  68. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  69. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +1 -1
  70. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +3 -2
  71. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +9 -8
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +97 -48
  73. data/src/core/ext/transport/chttp2/transport/flow_control.cc +10 -7
  74. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +3 -3
  75. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +12 -8
  76. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -3
  77. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +2 -2
  78. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +2 -2
  79. data/src/core/ext/transport/chttp2/transport/parsing.cc +14 -12
  80. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
  81. data/src/core/ext/transport/chttp2/transport/writing.cc +32 -27
  82. data/src/core/ext/transport/inproc/inproc_transport.cc +87 -49
  83. data/src/core/lib/channel/channel_args.cc +28 -0
  84. data/src/core/lib/channel/channel_args.h +4 -0
  85. data/src/core/lib/channel/channel_stack.cc +22 -29
  86. data/src/core/lib/channel/channel_stack.h +2 -2
  87. data/src/core/lib/channel/channel_stack_builder.cc +0 -3
  88. data/src/core/lib/channel/channel_stack_builder.h +0 -2
  89. data/src/core/lib/channel/channel_trace.cc +28 -63
  90. data/src/core/lib/channel/channel_trace.h +13 -17
  91. data/src/core/lib/channel/channelz.cc +153 -0
  92. data/src/core/lib/channel/channelz.h +133 -0
  93. data/src/core/lib/channel/channelz_registry.cc +145 -0
  94. data/src/core/lib/channel/channelz_registry.h +120 -0
  95. data/src/core/lib/channel/connected_channel.cc +8 -1
  96. data/src/core/lib/channel/handshaker.cc +71 -0
  97. data/src/core/lib/channel/handshaker.h +4 -0
  98. data/src/core/lib/debug/stats.h +7 -0
  99. data/src/core/lib/debug/stats_data.cc +5 -0
  100. data/src/core/lib/debug/stats_data.h +120 -0
  101. data/src/core/lib/debug/trace.cc +2 -1
  102. data/src/core/lib/debug/trace.h +12 -1
  103. data/src/core/lib/gpr/alloc.h +28 -0
  104. data/src/core/lib/gpr/arena.cc +38 -45
  105. data/src/core/lib/gpr/log.cc +8 -2
  106. data/src/core/lib/gpr/log_android.cc +4 -0
  107. data/src/core/lib/gpr/log_linux.cc +4 -0
  108. data/src/core/lib/gpr/log_posix.cc +4 -0
  109. data/src/core/lib/gpr/log_windows.cc +5 -0
  110. data/src/core/lib/gpr/string.cc +28 -0
  111. data/src/core/lib/gpr/string.h +10 -0
  112. data/src/core/lib/gprpp/abstract.h +5 -2
  113. data/src/core/lib/gprpp/fork.cc +268 -0
  114. data/src/core/lib/gprpp/fork.h +88 -0
  115. data/src/core/lib/gprpp/inlined_vector.h +87 -37
  116. data/src/core/lib/gprpp/memory.h +12 -0
  117. data/src/core/lib/gprpp/mutex_lock.h +42 -0
  118. data/src/core/lib/gprpp/orphanable.h +10 -12
  119. data/src/core/lib/gprpp/ref_counted.h +10 -12
  120. data/src/core/lib/gprpp/ref_counted_ptr.h +65 -8
  121. data/src/core/lib/gprpp/thd.h +0 -3
  122. data/src/core/lib/gprpp/thd_posix.cc +5 -54
  123. data/src/core/lib/gprpp/thd_windows.cc +0 -7
  124. data/src/core/lib/http/httpcli_security_connector.cc +1 -3
  125. data/src/core/lib/iomgr/call_combiner.cc +13 -13
  126. data/src/core/lib/iomgr/call_combiner.h +84 -1
  127. data/src/core/lib/iomgr/closure.h +6 -5
  128. data/src/core/lib/iomgr/combiner.cc +30 -13
  129. data/src/core/lib/iomgr/combiner.h +1 -1
  130. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
  131. data/src/core/lib/iomgr/error.cc +12 -0
  132. data/src/core/lib/iomgr/error.h +5 -0
  133. data/src/core/lib/iomgr/ev_epoll1_linux.cc +138 -51
  134. data/src/core/lib/iomgr/ev_epollex_linux.cc +276 -93
  135. data/src/core/lib/iomgr/ev_epollsig_linux.cc +58 -50
  136. data/src/core/lib/iomgr/ev_poll_posix.cc +163 -42
  137. data/src/core/lib/iomgr/ev_posix.cc +88 -24
  138. data/src/core/lib/iomgr/ev_posix.h +48 -12
  139. data/src/core/lib/iomgr/exec_ctx.cc +15 -9
  140. data/src/core/lib/iomgr/exec_ctx.h +48 -20
  141. data/src/core/lib/iomgr/executor.cc +274 -142
  142. data/src/core/lib/iomgr/executor.h +82 -16
  143. data/src/core/lib/iomgr/fork_posix.cc +42 -19
  144. data/src/core/lib/iomgr/iocp_windows.cc +9 -4
  145. data/src/core/lib/iomgr/iomgr.cc +2 -0
  146. data/src/core/lib/iomgr/iomgr.h +5 -0
  147. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  148. data/src/core/lib/iomgr/is_epollexclusive_available.cc +1 -0
  149. data/src/core/lib/iomgr/lockfree_event.cc +5 -1
  150. data/src/core/lib/iomgr/polling_entity.cc +11 -2
  151. data/src/core/lib/iomgr/pollset_custom.cc +2 -2
  152. data/src/core/lib/iomgr/port.h +51 -1
  153. data/src/core/lib/iomgr/resolve_address.h +1 -1
  154. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
  155. data/src/core/lib/iomgr/resolve_address_windows.cc +3 -2
  156. data/src/core/lib/iomgr/resource_quota.cc +89 -12
  157. data/src/core/lib/iomgr/resource_quota.h +16 -0
  158. data/src/core/lib/iomgr/sockaddr_posix.h +1 -1
  159. data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
  160. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  161. data/src/core/lib/iomgr/socket_mutator.h +1 -1
  162. data/src/core/lib/iomgr/socket_utils.h +9 -0
  163. data/src/core/lib/iomgr/socket_utils_common_posix.cc +29 -1
  164. data/src/core/lib/iomgr/socket_utils_linux.cc +0 -1
  165. data/src/core/lib/iomgr/socket_utils_posix.cc +2 -3
  166. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  167. data/src/core/lib/iomgr/socket_utils_uv.cc +4 -0
  168. data/src/core/lib/iomgr/socket_utils_windows.cc +4 -0
  169. data/src/core/lib/iomgr/socket_windows.cc +33 -0
  170. data/src/core/lib/iomgr/socket_windows.h +6 -0
  171. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -5
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +10 -11
  173. data/src/core/lib/iomgr/tcp_custom.cc +11 -11
  174. data/src/core/lib/iomgr/tcp_posix.cc +49 -36
  175. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -5
  176. data/src/core/lib/iomgr/tcp_server_posix.cc +16 -36
  177. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  178. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +17 -5
  179. data/src/core/lib/iomgr/tcp_server_windows.cc +1 -0
  180. data/src/core/lib/iomgr/tcp_uv.cc +3 -0
  181. data/src/core/lib/iomgr/tcp_windows.cc +18 -2
  182. data/src/core/lib/iomgr/tcp_windows.h +2 -0
  183. data/src/core/lib/iomgr/timer.h +4 -3
  184. data/src/core/lib/iomgr/timer_generic.cc +133 -51
  185. data/src/core/lib/iomgr/timer_manager.cc +12 -14
  186. data/src/core/lib/iomgr/timer_uv.cc +3 -0
  187. data/src/core/lib/iomgr/udp_server.cc +106 -52
  188. data/src/core/lib/iomgr/udp_server.h +8 -4
  189. data/src/core/lib/json/json.cc +12 -1
  190. data/src/core/lib/json/json.h +5 -0
  191. data/src/core/lib/profiling/basic_timers.cc +1 -0
  192. data/src/core/lib/security/context/security_context.cc +8 -8
  193. data/src/core/lib/security/context/security_context.h +6 -2
  194. data/src/core/lib/security/credentials/alts/alts_credentials.h +0 -20
  195. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +3 -2
  196. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +7 -7
  197. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +1 -38
  198. data/src/core/lib/security/credentials/credentials.h +1 -0
  199. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +89 -115
  200. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +16 -0
  201. data/src/core/lib/security/credentials/jwt/json_token.h +2 -0
  202. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +2 -0
  203. data/src/core/lib/security/credentials/local/local_credentials.cc +77 -0
  204. data/src/core/lib/security/credentials/local/local_credentials.h +40 -0
  205. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +11 -7
  206. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  207. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +17 -3
  208. data/src/core/lib/security/security_connector/alts_security_connector.cc +2 -1
  209. data/src/core/lib/security/security_connector/load_system_roots.h +29 -0
  210. data/src/core/lib/{gpr/fork.h → security/security_connector/load_system_roots_fallback.cc} +10 -13
  211. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +165 -0
  212. data/src/core/lib/security/security_connector/load_system_roots_linux.h +44 -0
  213. data/src/core/lib/security/security_connector/local_security_connector.cc +245 -0
  214. data/src/core/lib/security/security_connector/local_security_connector.h +58 -0
  215. data/src/core/lib/security/security_connector/security_connector.cc +79 -32
  216. data/src/core/lib/security/security_connector/security_connector.h +5 -3
  217. data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
  218. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  219. data/src/core/lib/security/transport/security_handshaker.cc +7 -2
  220. data/src/core/lib/security/transport/server_auth_filter.cc +4 -7
  221. data/src/core/lib/security/util/json_util.cc +4 -0
  222. data/src/core/lib/slice/slice.cc +6 -2
  223. data/src/core/lib/slice/slice_buffer.cc +27 -7
  224. data/src/core/lib/slice/slice_hash_table.h +4 -0
  225. data/src/core/lib/slice/slice_weak_hash_table.h +4 -0
  226. data/src/core/lib/surface/call.cc +119 -58
  227. data/src/core/lib/surface/call.h +7 -0
  228. data/src/core/lib/surface/channel.cc +50 -18
  229. data/src/core/lib/surface/channel.h +4 -0
  230. data/src/core/lib/surface/completion_queue.cc +153 -18
  231. data/src/core/lib/surface/completion_queue.h +20 -2
  232. data/src/core/lib/surface/completion_queue_factory.cc +13 -4
  233. data/src/core/lib/surface/init.cc +7 -8
  234. data/src/core/lib/surface/init.h +0 -1
  235. data/src/core/lib/surface/server.cc +16 -0
  236. data/src/core/lib/surface/version.cc +1 -1
  237. data/src/core/lib/transport/bdp_estimator.cc +3 -3
  238. data/src/core/lib/transport/bdp_estimator.h +2 -2
  239. data/src/core/lib/transport/byte_stream.cc +1 -1
  240. data/src/core/lib/transport/connectivity_state.cc +6 -7
  241. data/src/core/lib/transport/service_config.cc +2 -2
  242. data/src/core/lib/transport/service_config.h +3 -3
  243. data/src/core/lib/transport/transport.cc +22 -10
  244. data/src/core/lib/transport/transport.h +18 -18
  245. data/src/core/lib/transport/transport_op_string.cc +1 -8
  246. data/src/core/plugin_registry/grpc_plugin_registry.cc +0 -4
  247. data/src/core/tsi/alts/crypt/aes_gcm.cc +2 -0
  248. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +19 -7
  249. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +10 -0
  250. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h +2 -2
  251. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +38 -3
  252. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +3 -0
  253. data/src/core/tsi/alts/handshaker/altscontext.pb.c +0 -1
  254. data/src/core/tsi/alts/handshaker/altscontext.pb.h +1 -2
  255. data/src/core/tsi/alts/handshaker/handshaker.pb.c +0 -1
  256. data/src/core/tsi/alts/handshaker/handshaker.pb.h +1 -2
  257. data/src/core/tsi/alts/handshaker/transport_security_common.pb.c +0 -1
  258. data/src/core/tsi/alts/handshaker/transport_security_common.pb.h +1 -1
  259. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +2 -2
  260. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +47 -1
  261. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +3 -1
  262. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +12 -11
  263. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +7 -2
  264. data/src/core/tsi/fake_transport_security.cc +1 -0
  265. data/src/core/tsi/grpc_shadow_boringssl.h +3006 -0
  266. data/src/core/tsi/local_transport_security.cc +209 -0
  267. data/src/core/tsi/local_transport_security.h +51 -0
  268. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
  269. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +5 -5
  270. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +6 -0
  271. data/src/core/tsi/ssl_transport_security.cc +245 -116
  272. data/src/core/tsi/ssl_types.h +2 -0
  273. data/src/core/tsi/transport_security.cc +14 -0
  274. data/src/core/tsi/transport_security.h +2 -0
  275. data/src/core/tsi/transport_security_interface.h +11 -1
  276. data/src/ruby/bin/math_client.rb +17 -9
  277. data/src/ruby/ext/grpc/extconf.rb +1 -26
  278. data/src/ruby/ext/grpc/rb_channel_credentials.c +3 -3
  279. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +42 -16
  280. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +65 -26
  281. data/src/ruby/lib/grpc/generic/active_call.rb +19 -23
  282. data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -1
  283. data/src/ruby/lib/grpc/version.rb +1 -1
  284. data/src/ruby/pb/generate_proto_ruby.sh +7 -1
  285. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +4 -1
  286. data/src/ruby/spec/call_credentials_spec.rb +1 -1
  287. data/src/ruby/spec/call_spec.rb +1 -1
  288. data/src/ruby/spec/channel_credentials_spec.rb +1 -1
  289. data/src/ruby/spec/channel_spec.rb +1 -1
  290. data/src/ruby/spec/client_auth_spec.rb +1 -12
  291. data/src/ruby/spec/client_server_spec.rb +1 -1
  292. data/src/ruby/spec/compression_options_spec.rb +1 -1
  293. data/src/ruby/spec/error_sanity_spec.rb +1 -1
  294. data/src/ruby/spec/generic/client_stub_spec.rb +16 -4
  295. data/src/ruby/spec/generic/rpc_desc_spec.rb +1 -1
  296. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +1 -1
  297. data/src/ruby/spec/generic/service_spec.rb +1 -1
  298. data/src/ruby/spec/google_rpc_status_utils_spec.rb +1 -12
  299. data/src/ruby/spec/pb/duplicate/codegen_spec.rb +1 -0
  300. data/src/ruby/spec/pb/health/checker_spec.rb +1 -1
  301. data/src/ruby/spec/server_credentials_spec.rb +1 -1
  302. data/src/ruby/spec/server_spec.rb +1 -1
  303. data/src/ruby/spec/spec_helper.rb +1 -0
  304. data/src/ruby/spec/support/services.rb +1 -1
  305. data/src/ruby/spec/time_consts_spec.rb +1 -1
  306. data/third_party/address_sorting/address_sorting.c +17 -11
  307. data/third_party/address_sorting/address_sorting_windows.c +43 -3
  308. data/third_party/address_sorting/include/address_sorting/address_sorting.h +3 -0
  309. data/third_party/boringssl/crypto/asn1/a_int.c +33 -28
  310. data/third_party/boringssl/crypto/asn1/a_mbstr.c +24 -22
  311. data/third_party/boringssl/crypto/asn1/a_utf8.c +13 -11
  312. data/third_party/boringssl/crypto/asn1/asn1_locl.h +3 -0
  313. data/third_party/boringssl/crypto/asn1/tasn_dec.c +40 -19
  314. data/third_party/boringssl/crypto/bio/fd.c +1 -0
  315. data/third_party/boringssl/crypto/bio/file.c +2 -0
  316. data/third_party/boringssl/crypto/bn_extra/convert.c +6 -5
  317. data/third_party/boringssl/crypto/bytestring/ber.c +1 -4
  318. data/third_party/boringssl/crypto/bytestring/cbb.c +116 -16
  319. data/third_party/boringssl/crypto/bytestring/cbs.c +151 -20
  320. data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +203 -0
  321. data/third_party/boringssl/crypto/cipher_extra/e_rc2.c +2 -0
  322. data/third_party/boringssl/crypto/cipher_extra/e_tls.c +1 -2
  323. data/third_party/boringssl/crypto/cpu-aarch64-fuchsia.c +55 -0
  324. data/third_party/boringssl/crypto/cpu-aarch64-linux.c +2 -1
  325. data/third_party/boringssl/crypto/dsa/dsa.c +16 -54
  326. data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +9 -10
  327. data/third_party/boringssl/crypto/ecdh/ecdh.c +4 -3
  328. data/third_party/boringssl/crypto/fipsmodule/bcm.c +11 -542
  329. data/third_party/boringssl/crypto/fipsmodule/bn/add.c +57 -112
  330. data/third_party/boringssl/crypto/fipsmodule/bn/asm/x86_64-gcc.c +4 -3
  331. data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +128 -70
  332. data/third_party/boringssl/crypto/fipsmodule/bn/bytes.c +32 -71
  333. data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +64 -118
  334. data/third_party/boringssl/crypto/fipsmodule/bn/div.c +284 -122
  335. data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +31 -65
  336. data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +274 -218
  337. data/third_party/boringssl/crypto/fipsmodule/bn/generic.c +2 -1
  338. data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +187 -27
  339. data/third_party/boringssl/crypto/fipsmodule/bn/jacobi.c +1 -1
  340. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +124 -81
  341. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +8 -30
  342. data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +321 -347
  343. data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +326 -66
  344. data/third_party/boringssl/crypto/fipsmodule/bn/random.c +77 -25
  345. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +199 -222
  346. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +27 -47
  347. data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +155 -96
  348. data/third_party/boringssl/crypto/fipsmodule/bn/sqrt.c +1 -1
  349. data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +10 -10
  350. data/third_party/boringssl/crypto/fipsmodule/des/internal.h +2 -0
  351. data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +78 -47
  352. data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +99 -163
  353. data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +3 -10
  354. data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +44 -23
  355. data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +59 -90
  356. data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +38 -65
  357. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +5378 -5418
  358. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +17 -26
  359. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +15 -11
  360. data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +45 -51
  361. data/third_party/boringssl/crypto/fipsmodule/ec/{util-64.c → util.c} +0 -5
  362. data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +144 -264
  363. data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +78 -62
  364. data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +256 -0
  365. data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +36 -32
  366. data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +9 -7
  367. data/third_party/boringssl/crypto/fipsmodule/rsa/blinding.c +16 -40
  368. data/third_party/boringssl/crypto/fipsmodule/rsa/internal.h +1 -6
  369. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +57 -39
  370. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +309 -142
  371. data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +581 -0
  372. data/third_party/boringssl/crypto/fipsmodule/tls/internal.h +39 -0
  373. data/third_party/boringssl/crypto/fipsmodule/tls/kdf.c +165 -0
  374. data/third_party/boringssl/crypto/internal.h +65 -2
  375. data/third_party/boringssl/crypto/mem.c +0 -2
  376. data/third_party/boringssl/crypto/obj/obj.c +6 -73
  377. data/third_party/boringssl/crypto/thread_pthread.c +35 -5
  378. data/third_party/boringssl/crypto/x509/a_strex.c +11 -11
  379. data/third_party/boringssl/crypto/x509/vpm_int.h +1 -0
  380. data/third_party/boringssl/crypto/x509/x509_vfy.c +4 -0
  381. data/third_party/boringssl/crypto/x509/x509_vpm.c +44 -22
  382. data/third_party/boringssl/crypto/x509/x_name.c +13 -0
  383. data/third_party/boringssl/include/openssl/aead.h +10 -0
  384. data/third_party/boringssl/include/openssl/asn1.h +2 -3
  385. data/third_party/boringssl/include/openssl/base.h +5 -14
  386. data/third_party/boringssl/include/openssl/bio.h +1 -1
  387. data/third_party/boringssl/include/openssl/bn.h +62 -18
  388. data/third_party/boringssl/include/openssl/bytestring.h +53 -28
  389. data/third_party/boringssl/include/openssl/crypto.h +4 -0
  390. data/third_party/boringssl/include/openssl/ec.h +10 -4
  391. data/third_party/boringssl/include/openssl/ec_key.h +7 -6
  392. data/third_party/boringssl/include/openssl/err.h +9 -9
  393. data/third_party/boringssl/include/openssl/evp.h +1 -1
  394. data/third_party/boringssl/include/openssl/rsa.h +35 -10
  395. data/third_party/boringssl/include/openssl/ssl.h +167 -19
  396. data/third_party/boringssl/include/openssl/ssl3.h +0 -1
  397. data/third_party/boringssl/include/openssl/stack.h +1 -1
  398. data/third_party/boringssl/include/openssl/tls1.h +10 -2
  399. data/third_party/boringssl/include/openssl/x509.h +4 -0
  400. data/third_party/boringssl/include/openssl/x509v3.h +1 -0
  401. data/third_party/boringssl/ssl/d1_both.cc +16 -2
  402. data/third_party/boringssl/ssl/dtls_method.cc +1 -1
  403. data/third_party/boringssl/ssl/handoff.cc +285 -0
  404. data/third_party/boringssl/ssl/handshake.cc +26 -12
  405. data/third_party/boringssl/ssl/handshake_client.cc +101 -95
  406. data/third_party/boringssl/ssl/handshake_server.cc +14 -2
  407. data/third_party/boringssl/ssl/internal.h +132 -79
  408. data/third_party/boringssl/ssl/s3_both.cc +2 -2
  409. data/third_party/boringssl/ssl/s3_lib.cc +3 -1
  410. data/third_party/boringssl/ssl/s3_pkt.cc +0 -18
  411. data/third_party/boringssl/ssl/ssl_aead_ctx.cc +1 -4
  412. data/third_party/boringssl/ssl/ssl_asn1.cc +47 -43
  413. data/third_party/boringssl/ssl/ssl_cipher.cc +12 -8
  414. data/third_party/boringssl/ssl/ssl_key_share.cc +3 -1
  415. data/third_party/boringssl/ssl/ssl_lib.cc +83 -14
  416. data/third_party/boringssl/ssl/ssl_privkey.cc +6 -0
  417. data/third_party/boringssl/ssl/ssl_stat.cc +6 -6
  418. data/third_party/boringssl/ssl/ssl_versions.cc +12 -85
  419. data/third_party/boringssl/ssl/ssl_x509.cc +59 -61
  420. data/third_party/boringssl/ssl/t1_enc.cc +73 -124
  421. data/third_party/boringssl/ssl/t1_lib.cc +367 -41
  422. data/third_party/boringssl/ssl/tls13_both.cc +8 -0
  423. data/third_party/boringssl/ssl/tls13_client.cc +98 -184
  424. data/third_party/boringssl/ssl/tls13_enc.cc +88 -158
  425. data/third_party/boringssl/ssl/tls13_server.cc +91 -137
  426. data/third_party/boringssl/ssl/tls_method.cc +0 -17
  427. data/third_party/boringssl/ssl/tls_record.cc +1 -10
  428. data/third_party/boringssl/third_party/fiat/curve25519.c +921 -2753
  429. data/third_party/boringssl/third_party/fiat/curve25519_tables.h +7880 -0
  430. data/third_party/boringssl/third_party/fiat/internal.h +32 -20
  431. data/third_party/boringssl/third_party/fiat/p256.c +1824 -0
  432. metadata +86 -71
  433. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +0 -253
  434. data/src/core/ext/filters/load_reporting/server_load_reporting_filter.cc +0 -222
  435. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc +0 -71
  436. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.h +0 -61
  437. data/src/core/lib/channel/channel_trace_registry.cc +0 -80
  438. data/src/core/lib/channel/channel_trace_registry.h +0 -43
  439. data/src/core/lib/gpr/fork.cc +0 -78
  440. data/src/core/tsi/transport_security_adapter.cc +0 -235
  441. data/src/core/tsi/transport_security_adapter.h +0 -41
  442. data/src/ruby/bin/apis/google/protobuf/empty.rb +0 -29
  443. data/src/ruby/bin/apis/pubsub_demo.rb +0 -241
  444. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub.rb +0 -159
  445. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub_services.rb +0 -88
  446. data/src/ruby/pb/test/client.rb +0 -764
  447. data/src/ruby/pb/test/server.rb +0 -252
  448. data/src/ruby/spec/pb/package_with_underscore/checker_spec.rb +0 -54
  449. data/src/ruby/spec/pb/package_with_underscore/data.proto +0 -23
  450. data/src/ruby/spec/pb/package_with_underscore/service.proto +0 -23
  451. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +0 -247
  452. 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
- #define MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL 1
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
- // only for type fd... one ref to the owner fd
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
- /* refst format:
148
- bit 0 : 1=Active / 0=Orphaned
149
- bits 1-n : refcount
150
- Ref/Unref by two to avoid altering the orphaned bit */
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
- gpr_mu_init(&new_fd->pollable_mu);
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
- gpr_atm_no_barrier_store(&new_fd->read_notifier_pollset, (gpr_atm)NULL);
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
- bool already_closed, const char* reason) {
379
- bool is_fd_closed = already_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 if (!is_fd_closed) {
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
- gpr_log(GPR_DEBUG, "TODO: handle fd removal?");
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(GPR_DEBUG, "add fd %p (%d) to pollable %p", fd, fd->fd, p);
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 = fd;
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(GPR_DEBUG,
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::mu_guard lock(&p->mu);
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(GPR_DEBUG, "PS:%p kicked_specific_but_already_kicked", p);
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(GPR_DEBUG, "PS:%p kicked_specific_but_awake", p);
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(GPR_DEBUG, "PS:%p kicked_specific_via_wakeup_fd", p);
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(GPR_DEBUG, "PS:%p kicked_specific_via_cv", p);
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(GPR_DEBUG,
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(GPR_DEBUG, "PS:%p kicked_any_without_poller", pollset);
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(GPR_DEBUG, "PS:%p kicked_any_but_awake", pollset);
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, grpc_pollset* notifier) {
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 grpc_error* fd_get_or_become_pollable(grpc_fd* fd, pollable** p) {
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 = "fd_get_or_become_pollable";
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 < MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL) &&
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(GPR_DEBUG, "PS:%p got pollset_wakeup %p", pollset, data_ptr);
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 = static_cast<grpc_fd*>(data_ptr);
779
- bool cancel = (ev->events & (EPOLLERR | EPOLLHUP)) != 0;
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(GPR_DEBUG,
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 (read_ev || cancel) {
789
- fd_become_readable(fd, pollset);
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(GPR_DEBUG, "POLLABLE:%p[%s] poll for %dms", p, desc, timeout);
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(GPR_DEBUG, "POLLABLE:%p got %d events", p, r);
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(GPR_DEBUG, "PS:%p wait %p w=%p for %dms", pollset,
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(GPR_DEBUG, "PS:%p timeout_wait %p w=%p", pollset,
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(GPR_DEBUG, "PS:%p wakeup %p w=%p", pollset,
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(GPR_DEBUG, "PS:%p spurious_wakeup %p w=%p", pollset,
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(GPR_DEBUG,
994
- "PS:%p work hdl=%p worker=%p now=%" PRIdPTR " deadline=%" PRIdPTR
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(GPR_DEBUG,
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, fd_get_or_become_pollable(fd, &pollset->active_pollable),
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
- GPR_DEBUG,
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->owner_fd->orphan_mu);
1085
- if ((gpr_atm_no_barrier_load(&pollset->active_pollable->owner_fd->refst) &
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->owner_fd->orphan_mu);
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(GPR_DEBUG,
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->owner_fd->orphan_mu);
1131
- if ((gpr_atm_no_barrier_load(&pollset->active_pollable->owner_fd->refst) &
1132
- 1) == 0) {
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(GPR_DEBUG, "PSS:%p: add fd %p (%d)", pss, fd, fd->fd);
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(GPR_DEBUG, "PSS:%p: del fd %p", pss, fd);
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(GPR_DEBUG, "PSS:%p: del pollset %p", pss, ps);
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(GPR_DEBUG, "PSS:%p: add pollset %p", pss, ps);
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(GPR_DEBUG, "PSS: merge (%p, %p)", a, b);
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(ctiller): there's probably a better heuristic here
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(GPR_DEBUG, "PSS: parent %p to %p", b, a);
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(GRPC_POSIX_SOCKET)
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(GRPC_POSIX_SOCKET) */
1675
+ #endif /* defined(GRPC_POSIX_SOCKET_EV_EPOLLEX) */
1493
1676
 
1494
1677
  #endif /* !defined(GRPC_LINUX_EPOLL_CREATE1) */