grpc 1.18.0 → 1.22.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (428) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +4731 -7404
  3. data/etc/roots.pem +146 -0
  4. data/include/grpc/grpc.h +11 -6
  5. data/include/grpc/grpc_security.h +297 -4
  6. data/include/grpc/grpc_security_constants.h +1 -1
  7. data/include/grpc/impl/codegen/byte_buffer.h +13 -0
  8. data/include/grpc/impl/codegen/gpr_types.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +30 -7
  10. data/include/grpc/impl/codegen/port_platform.h +88 -7
  11. data/include/grpc/impl/codegen/slice.h +2 -22
  12. data/include/grpc/impl/codegen/status.h +2 -1
  13. data/include/grpc/impl/codegen/sync_posix.h +18 -0
  14. data/include/grpc/slice.h +3 -3
  15. data/src/core/ext/filters/client_channel/backup_poller.cc +21 -16
  16. data/src/core/ext/filters/client_channel/backup_poller.h +8 -2
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +3 -1
  18. data/src/core/ext/filters/client_channel/client_channel.cc +2435 -1557
  19. data/src/core/ext/filters/client_channel/client_channel.h +2 -10
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -89
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +8 -33
  22. data/src/core/ext/filters/client_channel/client_channel_factory.cc +22 -34
  23. data/src/core/ext/filters/client_channel/client_channel_factory.h +19 -38
  24. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -11
  25. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +179 -0
  26. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +68 -0
  27. data/src/core/ext/filters/client_channel/health/health_check_client.cc +59 -55
  28. data/src/core/ext/filters/client_channel/health/health_check_client.h +20 -9
  29. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +146 -157
  30. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +29 -32
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +844 -859
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +3 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +2 -6
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +6 -2
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +14 -12
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +16 -12
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -3
  39. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +185 -312
  40. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +143 -375
  41. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +192 -245
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1554 -955
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +0 -43
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +14 -10
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +2 -2
  46. data/src/core/ext/filters/client_channel/lb_policy.cc +115 -22
  47. data/src/core/ext/filters/client_channel/lb_policy.h +260 -129
  48. data/src/core/ext/filters/client_channel/lb_policy_factory.h +5 -2
  49. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +107 -4
  50. data/src/core/ext/filters/client_channel/lb_policy_registry.h +10 -3
  51. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +96 -0
  52. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +56 -0
  53. data/src/core/ext/filters/client_channel/parse_address.cc +24 -5
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +121 -122
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +84 -2
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +179 -0
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +24 -10
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +111 -47
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +7 -13
  61. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
  62. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +39 -0
  63. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +0 -6
  64. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -64
  65. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +28 -0
  66. data/src/core/{lib/iomgr/network_status_tracker.cc → ext/filters/client_channel/resolver/dns/dns_resolver_selection.h} +8 -15
  67. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +36 -82
  68. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +111 -72
  69. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +13 -8
  70. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +28 -63
  71. data/src/core/ext/filters/client_channel/resolver.cc +54 -1
  72. data/src/core/ext/filters/client_channel/resolver.h +52 -23
  73. data/src/core/ext/filters/client_channel/resolver_factory.h +3 -1
  74. data/src/core/ext/filters/client_channel/resolver_registry.cc +5 -2
  75. data/src/core/ext/filters/client_channel/resolver_registry.h +5 -4
  76. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +368 -241
  77. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +58 -76
  78. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +543 -0
  79. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +139 -0
  80. data/src/core/ext/filters/client_channel/server_address.cc +4 -54
  81. data/src/core/ext/filters/client_channel/server_address.h +1 -13
  82. data/src/core/ext/filters/client_channel/service_config.cc +329 -0
  83. data/src/core/ext/filters/client_channel/service_config.h +205 -0
  84. data/src/core/ext/filters/client_channel/subchannel.cc +803 -838
  85. data/src/core/ext/filters/client_channel/subchannel.h +295 -128
  86. data/src/core/ext/filters/client_channel/subchannel_interface.h +113 -0
  87. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +97 -0
  88. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +94 -0
  89. data/src/core/ext/filters/deadline/deadline_filter.cc +3 -4
  90. data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
  91. data/src/core/ext/filters/http/client/http_client_filter.cc +7 -5
  92. data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
  93. data/src/core/ext/filters/http/client_authority_filter.cc +6 -3
  94. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -3
  95. data/src/core/ext/filters/http/server/http_server_filter.cc +18 -12
  96. data/src/core/ext/filters/max_age/max_age_filter.cc +5 -2
  97. data/src/core/ext/filters/message_size/message_size_filter.cc +119 -77
  98. data/src/core/ext/filters/message_size/message_size_filter.h +33 -0
  99. data/src/core/ext/transport/chttp2/alpn/alpn.h +1 -1
  100. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -12
  101. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +45 -47
  102. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +134 -143
  103. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +68 -21
  104. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +4 -4
  105. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +4 -4
  106. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +7 -6
  107. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +4 -3
  108. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +9 -7
  109. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +156 -94
  110. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
  111. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
  112. data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -37
  113. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  114. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -5
  115. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -2
  116. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -4
  117. data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -1
  118. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +8 -6
  119. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -1
  120. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -4
  121. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  122. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -6
  123. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -1
  124. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +74 -55
  125. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +33 -11
  126. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -2
  127. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +7 -14
  128. data/src/core/ext/transport/chttp2/transport/hpack_table.h +10 -1
  129. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +9 -5
  130. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +9 -3
  131. data/src/core/ext/transport/chttp2/transport/internal.h +43 -30
  132. data/src/core/ext/transport/chttp2/transport/parsing.cc +52 -70
  133. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
  134. data/src/core/ext/transport/chttp2/transport/writing.cc +70 -33
  135. data/src/core/ext/transport/inproc/inproc_transport.cc +26 -18
  136. data/src/core/lib/channel/channel_args.cc +2 -101
  137. data/src/core/lib/channel/channel_args.h +3 -37
  138. data/src/core/lib/channel/channel_stack.h +10 -6
  139. data/src/core/lib/channel/channel_trace.cc +4 -4
  140. data/src/core/lib/channel/channel_trace.h +4 -4
  141. data/src/core/lib/channel/channelz.cc +168 -38
  142. data/src/core/lib/channel/channelz.h +40 -44
  143. data/src/core/lib/channel/channelz_registry.cc +75 -107
  144. data/src/core/lib/channel/channelz_registry.h +10 -28
  145. data/src/core/lib/channel/connected_channel.cc +2 -2
  146. data/src/core/lib/channel/context.h +2 -2
  147. data/src/core/lib/channel/handshaker.cc +151 -218
  148. data/src/core/lib/channel/handshaker.h +110 -101
  149. data/src/core/lib/channel/handshaker_factory.h +11 -19
  150. data/src/core/lib/channel/handshaker_registry.cc +67 -51
  151. data/src/core/lib/channel/handshaker_registry.h +21 -16
  152. data/src/core/lib/compression/algorithm_metadata.h +3 -3
  153. data/src/core/lib/compression/compression.cc +14 -9
  154. data/src/core/lib/compression/compression_args.cc +127 -0
  155. data/src/core/lib/compression/compression_args.h +55 -0
  156. data/src/core/lib/compression/compression_internal.cc +16 -12
  157. data/src/core/lib/compression/compression_internal.h +1 -1
  158. data/src/core/lib/compression/stream_compression.cc +3 -2
  159. data/src/core/lib/compression/stream_compression.h +2 -2
  160. data/src/core/lib/compression/stream_compression_gzip.cc +9 -9
  161. data/src/core/lib/debug/trace.cc +13 -7
  162. data/src/core/lib/debug/trace.h +14 -1
  163. data/src/core/lib/gpr/arena.h +13 -9
  164. data/src/core/lib/gpr/cpu_posix.cc +5 -3
  165. data/src/core/lib/gpr/env.h +3 -6
  166. data/src/core/lib/gpr/env_linux.cc +6 -1
  167. data/src/core/lib/gpr/env_posix.cc +5 -0
  168. data/src/core/lib/gpr/env_windows.cc +7 -5
  169. data/src/core/lib/gpr/log.cc +9 -13
  170. data/src/core/lib/gpr/log_posix.cc +2 -1
  171. data/src/core/lib/gpr/string.cc +20 -7
  172. data/src/core/lib/gpr/string.h +10 -3
  173. data/src/core/lib/gpr/sync_posix.cc +65 -4
  174. data/src/core/lib/gpr/time.cc +8 -0
  175. data/src/core/lib/gpr/time_posix.cc +21 -2
  176. data/src/core/lib/gprpp/arena.cc +103 -0
  177. data/src/core/lib/gprpp/arena.h +121 -0
  178. data/src/core/lib/gprpp/atomic.h +75 -5
  179. data/src/core/lib/gprpp/fork.cc +13 -32
  180. data/src/core/lib/gprpp/fork.h +5 -1
  181. data/src/core/lib/gprpp/global_config.h +96 -0
  182. data/src/core/lib/gprpp/global_config_custom.h +29 -0
  183. data/src/core/lib/gprpp/global_config_env.cc +135 -0
  184. data/src/core/lib/gprpp/global_config_env.h +131 -0
  185. data/src/core/lib/gprpp/global_config_generic.h +44 -0
  186. data/src/core/lib/gprpp/inlined_vector.h +8 -0
  187. data/src/core/lib/gprpp/map.h +436 -0
  188. data/src/core/lib/gprpp/memory.h +2 -2
  189. data/src/core/lib/gprpp/optional.h +48 -0
  190. data/src/core/lib/gprpp/orphanable.h +6 -5
  191. data/src/core/lib/gprpp/{mutex_lock.h → pair.h} +15 -19
  192. data/src/core/lib/gprpp/ref_counted.h +36 -17
  193. data/src/core/lib/gprpp/sync.h +126 -0
  194. data/src/core/lib/gprpp/thd.h +42 -7
  195. data/src/core/lib/gprpp/thd_posix.cc +31 -13
  196. data/src/core/lib/gprpp/thd_windows.cc +47 -34
  197. data/src/core/lib/http/httpcli.cc +6 -5
  198. data/src/core/lib/http/httpcli_security_connector.cc +13 -15
  199. data/src/core/lib/http/parser.cc +3 -2
  200. data/src/core/lib/http/parser.h +2 -1
  201. data/src/core/lib/iomgr/buffer_list.cc +182 -24
  202. data/src/core/lib/iomgr/buffer_list.h +72 -10
  203. data/src/core/lib/iomgr/call_combiner.cc +84 -90
  204. data/src/core/lib/iomgr/call_combiner.h +75 -82
  205. data/src/core/lib/iomgr/cfstream_handle.cc +203 -0
  206. data/src/core/lib/iomgr/cfstream_handle.h +86 -0
  207. data/src/core/lib/iomgr/combiner.cc +11 -3
  208. data/src/core/lib/iomgr/combiner.h +1 -1
  209. data/src/core/lib/iomgr/endpoint.cc +2 -2
  210. data/src/core/lib/iomgr/endpoint.h +3 -2
  211. data/src/core/lib/iomgr/endpoint_cfstream.cc +375 -0
  212. data/src/core/lib/iomgr/endpoint_cfstream.h +49 -0
  213. data/src/core/lib/iomgr/endpoint_pair_windows.cc +2 -2
  214. data/src/core/lib/iomgr/error.cc +21 -17
  215. data/src/core/lib/iomgr/error.h +36 -6
  216. data/src/core/lib/iomgr/error_cfstream.cc +52 -0
  217. data/src/core/lib/iomgr/error_cfstream.h +31 -0
  218. data/src/core/lib/iomgr/error_internal.h +1 -1
  219. data/src/core/lib/iomgr/ev_epoll1_linux.cc +44 -28
  220. data/src/core/lib/iomgr/ev_epollex_linux.cc +173 -194
  221. data/src/core/lib/iomgr/ev_poll_posix.cc +16 -487
  222. data/src/core/lib/iomgr/ev_posix.cc +29 -19
  223. data/src/core/lib/iomgr/ev_posix.h +19 -3
  224. data/src/core/lib/iomgr/ev_windows.cc +2 -2
  225. data/src/core/lib/iomgr/exec_ctx.cc +1 -0
  226. data/src/core/lib/iomgr/exec_ctx.h +137 -8
  227. data/src/core/lib/iomgr/executor.cc +147 -95
  228. data/src/core/lib/iomgr/executor.h +55 -49
  229. data/src/core/lib/iomgr/fork_posix.cc +6 -5
  230. data/src/core/lib/{gprpp/atomic_with_std.h → iomgr/grpc_if_nametoindex.h} +8 -13
  231. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +42 -0
  232. data/src/core/lib/iomgr/{network_status_tracker.h → grpc_if_nametoindex_unsupported.cc} +15 -9
  233. data/src/core/lib/iomgr/internal_errqueue.cc +3 -5
  234. data/src/core/lib/iomgr/internal_errqueue.h +105 -3
  235. data/src/core/lib/iomgr/iomgr.cc +20 -13
  236. data/src/core/lib/iomgr/iomgr.h +15 -0
  237. data/src/core/lib/iomgr/iomgr_custom.cc +17 -3
  238. data/src/core/lib/iomgr/iomgr_custom.h +2 -0
  239. data/src/core/lib/iomgr/iomgr_internal.cc +10 -0
  240. data/src/core/lib/iomgr/iomgr_internal.h +12 -0
  241. data/src/core/lib/iomgr/iomgr_posix.cc +19 -2
  242. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +93 -0
  243. data/src/core/lib/iomgr/iomgr_windows.cc +18 -2
  244. data/src/core/lib/iomgr/lockfree_event.cc +4 -4
  245. data/src/core/lib/iomgr/port.h +35 -0
  246. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
  247. data/src/core/lib/iomgr/resolve_address_windows.cc +2 -1
  248. data/src/core/lib/iomgr/resource_quota.cc +40 -37
  249. data/src/core/lib/iomgr/socket_utils_common_posix.cc +6 -2
  250. data/src/core/lib/iomgr/socket_windows.cc +19 -0
  251. data/src/core/lib/iomgr/socket_windows.h +8 -0
  252. data/src/core/lib/iomgr/tcp_client_cfstream.cc +216 -0
  253. data/src/core/lib/iomgr/tcp_client_custom.cc +2 -2
  254. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
  255. data/src/core/lib/iomgr/tcp_client_windows.cc +7 -5
  256. data/src/core/lib/iomgr/tcp_custom.cc +10 -14
  257. data/src/core/lib/iomgr/tcp_posix.cc +256 -140
  258. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  259. data/src/core/lib/iomgr/tcp_server.h +24 -0
  260. data/src/core/lib/iomgr/tcp_server_custom.cc +14 -12
  261. data/src/core/lib/iomgr/tcp_server_posix.cc +86 -12
  262. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  263. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -11
  264. data/src/core/lib/iomgr/tcp_uv.cc +5 -7
  265. data/src/core/lib/iomgr/tcp_windows.cc +8 -14
  266. data/src/core/lib/iomgr/timer.h +2 -1
  267. data/src/core/lib/iomgr/timer_generic.cc +16 -16
  268. data/src/core/lib/iomgr/timer_manager.cc +20 -11
  269. data/src/core/lib/iomgr/udp_server.cc +8 -6
  270. data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -19
  271. data/src/core/lib/json/json.cc +1 -4
  272. data/src/core/lib/profiling/basic_timers.cc +10 -4
  273. data/src/core/lib/security/context/security_context.cc +6 -7
  274. data/src/core/lib/security/context/security_context.h +3 -4
  275. data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
  276. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
  277. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -0
  278. data/src/core/lib/security/credentials/credentials.h +9 -1
  279. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -3
  280. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -0
  281. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  282. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +2 -1
  283. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +10 -6
  284. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
  285. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +3 -3
  286. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +9 -8
  287. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -2
  288. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
  289. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +192 -0
  290. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +210 -0
  291. data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +129 -0
  292. data/src/core/lib/security/credentials/tls/spiffe_credentials.h +62 -0
  293. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -8
  294. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -12
  295. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +7 -5
  296. data/src/core/lib/security/security_connector/local/local_security_connector.cc +10 -8
  297. data/src/core/lib/security/security_connector/security_connector.cc +0 -1
  298. data/src/core/lib/security/security_connector/security_connector.h +3 -3
  299. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +39 -38
  300. data/src/core/lib/security/security_connector/ssl_utils.cc +164 -26
  301. data/src/core/lib/security/security_connector/ssl_utils.h +70 -1
  302. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +426 -0
  303. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +122 -0
  304. data/src/core/lib/security/transport/auth_filters.h +5 -2
  305. data/src/core/lib/security/transport/client_auth_filter.cc +55 -50
  306. data/src/core/lib/security/transport/secure_endpoint.cc +6 -6
  307. data/src/core/lib/security/transport/security_handshaker.cc +271 -303
  308. data/src/core/lib/security/transport/security_handshaker.h +11 -2
  309. data/src/core/lib/security/transport/server_auth_filter.cc +3 -3
  310. data/src/core/lib/slice/b64.h +2 -2
  311. data/src/core/lib/slice/percent_encoding.cc +3 -3
  312. data/src/core/lib/slice/percent_encoding.h +3 -3
  313. data/src/core/lib/slice/slice.cc +174 -122
  314. data/src/core/lib/slice/slice_buffer.cc +54 -21
  315. data/src/core/lib/slice/slice_hash_table.h +4 -4
  316. data/src/core/lib/slice/slice_intern.cc +49 -107
  317. data/src/core/lib/slice/slice_internal.h +264 -3
  318. data/src/core/lib/slice/slice_string_helpers.cc +10 -1
  319. data/src/core/lib/slice/slice_string_helpers.h +3 -1
  320. data/src/core/lib/slice/slice_utils.h +50 -0
  321. data/src/core/lib/slice/slice_weak_hash_table.h +6 -6
  322. data/src/core/lib/surface/api_trace.h +1 -1
  323. data/src/core/lib/surface/byte_buffer_reader.cc +17 -0
  324. data/src/core/lib/surface/call.cc +67 -46
  325. data/src/core/lib/surface/call.h +7 -2
  326. data/src/core/lib/surface/call_details.cc +0 -1
  327. data/src/core/lib/surface/channel.cc +89 -97
  328. data/src/core/lib/surface/channel.h +60 -6
  329. data/src/core/lib/surface/channel_init.h +5 -0
  330. data/src/core/lib/surface/completion_queue.cc +221 -216
  331. data/src/core/lib/surface/completion_queue.h +2 -1
  332. data/src/core/lib/surface/init.cc +82 -33
  333. data/src/core/lib/surface/init.h +1 -0
  334. data/src/core/lib/surface/init_secure.cc +1 -1
  335. data/src/core/lib/surface/lame_client.cc +5 -7
  336. data/src/core/lib/surface/server.cc +42 -47
  337. data/src/core/lib/surface/validate_metadata.cc +14 -8
  338. data/src/core/lib/surface/validate_metadata.h +13 -2
  339. data/src/core/lib/surface/version.cc +1 -1
  340. data/src/core/lib/transport/bdp_estimator.cc +3 -3
  341. data/src/core/lib/transport/bdp_estimator.h +2 -2
  342. data/src/core/lib/transport/connectivity_state.cc +10 -40
  343. data/src/core/lib/transport/connectivity_state.h +0 -8
  344. data/src/core/lib/transport/error_utils.cc +12 -0
  345. data/src/core/lib/transport/metadata.cc +258 -267
  346. data/src/core/lib/transport/metadata.h +227 -16
  347. data/src/core/lib/transport/metadata_batch.cc +1 -1
  348. data/src/core/lib/transport/metadata_batch.h +1 -1
  349. data/src/core/lib/transport/static_metadata.cc +477 -399
  350. data/src/core/lib/transport/static_metadata.h +273 -182
  351. data/src/core/lib/transport/status_metadata.cc +3 -3
  352. data/src/core/lib/transport/timeout_encoding.cc +1 -1
  353. data/src/core/lib/transport/timeout_encoding.h +1 -1
  354. data/src/core/lib/transport/transport.cc +39 -72
  355. data/src/core/lib/transport/transport.h +59 -24
  356. data/src/core/lib/transport/transport_impl.h +1 -1
  357. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
  358. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  359. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +1 -1
  360. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +4 -3
  361. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
  362. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -1
  363. data/src/core/tsi/fake_transport_security.cc +4 -4
  364. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
  365. data/src/core/tsi/ssl_transport_security.cc +12 -10
  366. data/src/core/tsi/ssl_transport_security.h +24 -4
  367. data/src/ruby/bin/math_pb.rb +18 -16
  368. data/src/ruby/ext/grpc/extconf.rb +12 -4
  369. data/src/ruby/ext/grpc/rb_call_credentials.c +8 -5
  370. data/src/ruby/ext/grpc/rb_channel.c +14 -10
  371. data/src/ruby/ext/grpc/rb_channel_credentials.c +8 -4
  372. data/src/ruby/ext/grpc/rb_compression_options.c +9 -7
  373. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  374. data/src/ruby/ext/grpc/rb_grpc.c +23 -24
  375. data/src/ruby/ext/grpc/rb_grpc.h +4 -2
  376. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +24 -0
  377. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +36 -0
  378. data/src/ruby/ext/grpc/rb_server.c +8 -4
  379. data/src/ruby/lib/grpc/errors.rb +22 -3
  380. data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
  381. data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -2
  382. data/src/ruby/lib/grpc/version.rb +1 -1
  383. data/src/ruby/pb/README.md +1 -1
  384. data/src/ruby/pb/grpc/health/v1/health_pb.rb +13 -10
  385. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +18 -0
  386. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +3 -1
  387. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +58 -56
  388. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -0
  389. data/src/ruby/spec/errors_spec.rb +141 -0
  390. data/third_party/cares/cares/ares.h +12 -0
  391. data/third_party/cares/cares/ares_create_query.c +5 -1
  392. data/third_party/cares/cares/ares_data.c +74 -73
  393. data/third_party/cares/cares/ares_destroy.c +6 -1
  394. data/third_party/cares/cares/ares_gethostbyaddr.c +5 -5
  395. data/third_party/cares/cares/ares_gethostbyname.c +15 -4
  396. data/third_party/cares/cares/ares_getnameinfo.c +11 -0
  397. data/third_party/cares/cares/ares_init.c +274 -173
  398. data/third_party/cares/cares/ares_library_init.c +21 -3
  399. data/third_party/cares/cares/ares_options.c +6 -2
  400. data/third_party/cares/cares/ares_parse_naptr_reply.c +7 -6
  401. data/third_party/cares/cares/ares_parse_ptr_reply.c +4 -2
  402. data/third_party/cares/cares/ares_platform.c +7 -0
  403. data/third_party/cares/cares/ares_private.h +19 -11
  404. data/third_party/cares/cares/ares_process.c +27 -2
  405. data/third_party/cares/cares/ares_rules.h +1 -1
  406. data/third_party/cares/cares/ares_search.c +7 -0
  407. data/third_party/cares/cares/ares_send.c +6 -0
  408. data/third_party/cares/cares/ares_strsplit.c +174 -0
  409. data/third_party/cares/cares/ares_strsplit.h +43 -0
  410. data/third_party/cares/cares/ares_version.h +4 -4
  411. data/third_party/cares/cares/config-win32.h +1 -1
  412. data/third_party/cares/cares/inet_ntop.c +2 -3
  413. data/third_party/cares/config_darwin/ares_config.h +3 -0
  414. data/third_party/cares/config_freebsd/ares_config.h +3 -0
  415. data/third_party/cares/config_linux/ares_config.h +3 -0
  416. data/third_party/cares/config_openbsd/ares_config.h +3 -0
  417. metadata +83 -48
  418. data/src/core/ext/filters/client_channel/request_routing.cc +0 -936
  419. data/src/core/ext/filters/client_channel/request_routing.h +0 -177
  420. data/src/core/ext/filters/client_channel/subchannel_index.cc +0 -248
  421. data/src/core/ext/filters/client_channel/subchannel_index.h +0 -76
  422. data/src/core/lib/channel/handshaker_factory.cc +0 -42
  423. data/src/core/lib/gpr/arena.cc +0 -192
  424. data/src/core/lib/gprpp/atomic_with_atm.h +0 -57
  425. data/src/core/lib/iomgr/wakeup_fd_cv.cc +0 -107
  426. data/src/core/lib/iomgr/wakeup_fd_cv.h +0 -69
  427. data/src/core/lib/transport/service_config.cc +0 -106
  428. data/src/core/lib/transport/service_config.h +0 -249
@@ -43,7 +43,6 @@
43
43
  #include "src/core/lib/gprpp/thd.h"
44
44
  #include "src/core/lib/iomgr/block_annotate.h"
45
45
  #include "src/core/lib/iomgr/iomgr_internal.h"
46
- #include "src/core/lib/iomgr/wakeup_fd_cv.h"
47
46
  #include "src/core/lib/iomgr/wakeup_fd_posix.h"
48
47
  #include "src/core/lib/profiling/timers.h"
49
48
 
@@ -126,7 +125,7 @@ struct grpc_fd {
126
125
  grpc_fork_fd_list* fork_fd_list;
127
126
  };
128
127
 
129
- /* True when GRPC_ENABLE_FORK_SUPPORT=1. We do not support fork with poll-cv */
128
+ /* True when GRPC_ENABLE_FORK_SUPPORT=1. */
130
129
  static bool track_fds_for_fork = false;
131
130
 
132
131
  /* Only used when GRPC_ENABLE_FORK_SUPPORT=1 */
@@ -256,56 +255,6 @@ struct grpc_pollset_set {
256
255
  grpc_fd** fds;
257
256
  };
258
257
 
259
- /*******************************************************************************
260
- * condition variable polling definitions
261
- */
262
-
263
- #define POLLCV_THREAD_GRACE_MS 1000
264
- #define CV_POLL_PERIOD_MS 1000
265
- #define CV_DEFAULT_TABLE_SIZE 16
266
-
267
- typedef struct poll_result {
268
- gpr_refcount refcount;
269
- grpc_cv_node* watchers;
270
- int watchcount;
271
- struct pollfd* fds;
272
- nfds_t nfds;
273
- int retval;
274
- int err;
275
- int completed;
276
- } poll_result;
277
-
278
- typedef struct poll_args {
279
- grpc_core::Thread poller_thd;
280
- gpr_cv trigger;
281
- int trigger_set;
282
- bool harvestable;
283
- gpr_cv harvest;
284
- bool joinable;
285
- gpr_cv join;
286
- struct pollfd* fds;
287
- nfds_t nfds;
288
- poll_result* result;
289
- struct poll_args* next;
290
- struct poll_args* prev;
291
- } poll_args;
292
-
293
- // This is a 2-tiered cache, we mantain a hash table
294
- // of active poll calls, so we can wait on the result
295
- // of that call. We also maintain freelists of inactive
296
- // poll args and of dead poller threads.
297
- typedef struct poll_hash_table {
298
- poll_args* free_pollers;
299
- poll_args** active_pollers;
300
- poll_args* dead_pollers;
301
- unsigned int size;
302
- unsigned int count;
303
- } poll_hash_table;
304
-
305
- // TODO(kpayson64): Eliminate use of global non-POD variables
306
- poll_hash_table poll_cache;
307
- grpc_cv_fd_table g_cvfds;
308
-
309
258
  /*******************************************************************************
310
259
  * functions to track opened fds. No-ops unless track_fds_for_fork is true.
311
260
  */
@@ -367,7 +316,7 @@ static void fork_fd_list_add_wakeup_fd(grpc_cached_wakeup_fd* fd) {
367
316
  #define UNREF_BY(fd, n, reason) unref_by(fd, n, reason, __FILE__, __LINE__)
368
317
  static void ref_by(grpc_fd* fd, int n, const char* reason, const char* file,
369
318
  int line) {
370
- if (grpc_trace_fd_refcount.enabled()) {
319
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_fd_refcount)) {
371
320
  gpr_log(GPR_DEBUG,
372
321
  "FD %d %p ref %d %" PRIdPTR " -> %" PRIdPTR " [%s; %s:%d]",
373
322
  fd->fd, fd, n, gpr_atm_no_barrier_load(&fd->refst),
@@ -384,7 +333,7 @@ static void ref_by(grpc_fd* fd, int n) {
384
333
  #ifndef NDEBUG
385
334
  static void unref_by(grpc_fd* fd, int n, const char* reason, const char* file,
386
335
  int line) {
387
- if (grpc_trace_fd_refcount.enabled()) {
336
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_fd_refcount)) {
388
337
  gpr_log(GPR_DEBUG,
389
338
  "FD %d %p unref %d %" PRIdPTR " -> %" PRIdPTR " [%s; %s:%d]",
390
339
  fd->fd, fd, n, gpr_atm_no_barrier_load(&fd->refst),
@@ -612,7 +561,7 @@ static void fd_notify_on_write(grpc_fd* fd, grpc_closure* closure) {
612
561
  }
613
562
 
614
563
  static void fd_notify_on_error(grpc_fd* fd, grpc_closure* closure) {
615
- if (grpc_polling_trace.enabled()) {
564
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
616
565
  gpr_log(GPR_ERROR, "Polling engine does not support tracking errors.");
617
566
  }
618
567
  GRPC_CLOSURE_SCHED(closure, GRPC_ERROR_CANCELLED);
@@ -631,7 +580,7 @@ static void fd_set_writable(grpc_fd* fd) {
631
580
  }
632
581
 
633
582
  static void fd_set_error(grpc_fd* fd) {
634
- if (grpc_polling_trace.enabled()) {
583
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
635
584
  gpr_log(GPR_ERROR, "Polling engine does not support tracking errors.");
636
585
  }
637
586
  }
@@ -1063,7 +1012,7 @@ static grpc_error* pollset_work(grpc_pollset* pollset,
1063
1012
  r = grpc_poll_function(pfds, pfd_count, timeout);
1064
1013
  GRPC_SCHEDULING_END_BLOCKING_REGION;
1065
1014
 
1066
- if (grpc_polling_trace.enabled()) {
1015
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1067
1016
  gpr_log(GPR_INFO, "%p poll=%d", pollset, r);
1068
1017
  }
1069
1018
 
@@ -1087,7 +1036,7 @@ static grpc_error* pollset_work(grpc_pollset* pollset,
1087
1036
  }
1088
1037
  } else {
1089
1038
  if (pfds[0].revents & POLLIN_CHECK) {
1090
- if (grpc_polling_trace.enabled()) {
1039
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1091
1040
  gpr_log(GPR_INFO, "%p: got_wakeup", pollset);
1092
1041
  }
1093
1042
  work_combine_error(
@@ -1097,7 +1046,7 @@ static grpc_error* pollset_work(grpc_pollset* pollset,
1097
1046
  if (watchers[i].fd == nullptr) {
1098
1047
  fd_end_poll(&watchers[i], 0, 0);
1099
1048
  } else {
1100
- if (grpc_polling_trace.enabled()) {
1049
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1101
1050
  gpr_log(GPR_INFO, "%p got_event: %d r:%d w:%d [%d]", pollset,
1102
1051
  pfds[i].fd, (pfds[i].revents & POLLIN_CHECK) != 0,
1103
1052
  (pfds[i].revents & POLLOUT_CHECK) != 0, pfds[i].revents);
@@ -1364,431 +1313,20 @@ static void pollset_set_del_fd(grpc_pollset_set* pollset_set, grpc_fd* fd) {
1364
1313
  }
1365
1314
 
1366
1315
  /*******************************************************************************
1367
- * Condition Variable polling extensions
1316
+ * event engine binding
1368
1317
  */
1369
1318
 
1370
- static void run_poll(void* args);
1371
- static void cache_poller_locked(poll_args* args);
1372
- static void cache_harvest_locked();
1373
-
1374
- static void cache_insert_locked(poll_args* args) {
1375
- uint32_t key = gpr_murmur_hash3(args->fds, args->nfds * sizeof(struct pollfd),
1376
- 0xDEADBEEF);
1377
- key = key % poll_cache.size;
1378
- if (poll_cache.active_pollers[key]) {
1379
- poll_cache.active_pollers[key]->prev = args;
1380
- }
1381
- args->next = poll_cache.active_pollers[key];
1382
- args->prev = nullptr;
1383
- poll_cache.active_pollers[key] = args;
1384
- poll_cache.count++;
1385
- }
1386
-
1387
- static void init_result(poll_args* pargs) {
1388
- pargs->result = static_cast<poll_result*>(gpr_malloc(sizeof(poll_result)));
1389
- gpr_ref_init(&pargs->result->refcount, 1);
1390
- pargs->result->watchers = nullptr;
1391
- pargs->result->watchcount = 0;
1392
- pargs->result->fds = static_cast<struct pollfd*>(
1393
- gpr_malloc(sizeof(struct pollfd) * pargs->nfds));
1394
- memcpy(pargs->result->fds, pargs->fds, sizeof(struct pollfd) * pargs->nfds);
1395
- pargs->result->nfds = pargs->nfds;
1396
- pargs->result->retval = 0;
1397
- pargs->result->err = 0;
1398
- pargs->result->completed = 0;
1399
- }
1400
-
1401
- // Creates a poll_args object for a given arguments to poll().
1402
- // This object may return a poll_args in the cache.
1403
- static poll_args* get_poller_locked(struct pollfd* fds, nfds_t count) {
1404
- uint32_t key =
1405
- gpr_murmur_hash3(fds, count * sizeof(struct pollfd), 0xDEADBEEF);
1406
- key = key % poll_cache.size;
1407
- poll_args* curr = poll_cache.active_pollers[key];
1408
- while (curr) {
1409
- if (curr->nfds == count &&
1410
- memcmp(curr->fds, fds, count * sizeof(struct pollfd)) == 0) {
1411
- gpr_free(fds);
1412
- return curr;
1413
- }
1414
- curr = curr->next;
1415
- }
1416
-
1417
- if (poll_cache.free_pollers) {
1418
- poll_args* pargs = poll_cache.free_pollers;
1419
- poll_cache.free_pollers = pargs->next;
1420
- if (poll_cache.free_pollers) {
1421
- poll_cache.free_pollers->prev = nullptr;
1422
- }
1423
- pargs->fds = fds;
1424
- pargs->nfds = count;
1425
- pargs->next = nullptr;
1426
- pargs->prev = nullptr;
1427
- init_result(pargs);
1428
- cache_poller_locked(pargs);
1429
- return pargs;
1430
- }
1431
-
1432
- poll_args* pargs =
1433
- static_cast<poll_args*>(gpr_malloc(sizeof(struct poll_args)));
1434
- gpr_cv_init(&pargs->trigger);
1435
- gpr_cv_init(&pargs->harvest);
1436
- gpr_cv_init(&pargs->join);
1437
- pargs->harvestable = false;
1438
- pargs->joinable = false;
1439
- pargs->fds = fds;
1440
- pargs->nfds = count;
1441
- pargs->next = nullptr;
1442
- pargs->prev = nullptr;
1443
- pargs->trigger_set = 0;
1444
- init_result(pargs);
1445
- cache_poller_locked(pargs);
1446
- gpr_ref(&g_cvfds.pollcount);
1447
- pargs->poller_thd = grpc_core::Thread("grpc_poller", &run_poll, pargs);
1448
- pargs->poller_thd.Start();
1449
- return pargs;
1450
- }
1451
-
1452
- static void cache_delete_locked(poll_args* args) {
1453
- if (!args->prev) {
1454
- uint32_t key = gpr_murmur_hash3(
1455
- args->fds, args->nfds * sizeof(struct pollfd), 0xDEADBEEF);
1456
- key = key % poll_cache.size;
1457
- GPR_ASSERT(poll_cache.active_pollers[key] == args);
1458
- poll_cache.active_pollers[key] = args->next;
1459
- } else {
1460
- args->prev->next = args->next;
1461
- }
1462
-
1463
- if (args->next) {
1464
- args->next->prev = args->prev;
1465
- }
1466
-
1467
- poll_cache.count--;
1468
- if (poll_cache.free_pollers) {
1469
- poll_cache.free_pollers->prev = args;
1470
- }
1471
- args->prev = nullptr;
1472
- args->next = poll_cache.free_pollers;
1473
- gpr_free(args->fds);
1474
- poll_cache.free_pollers = args;
1475
- }
1476
-
1477
- static void cache_poller_locked(poll_args* args) {
1478
- if (poll_cache.count + 1 > poll_cache.size / 2) {
1479
- poll_args** old_active_pollers = poll_cache.active_pollers;
1480
- poll_cache.size = poll_cache.size * 2;
1481
- poll_cache.count = 0;
1482
- poll_cache.active_pollers =
1483
- static_cast<poll_args**>(gpr_malloc(sizeof(void*) * poll_cache.size));
1484
- for (unsigned int i = 0; i < poll_cache.size; i++) {
1485
- poll_cache.active_pollers[i] = nullptr;
1486
- }
1487
- for (unsigned int i = 0; i < poll_cache.size / 2; i++) {
1488
- poll_args* curr = old_active_pollers[i];
1489
- poll_args* next = nullptr;
1490
- while (curr) {
1491
- next = curr->next;
1492
- cache_insert_locked(curr);
1493
- curr = next;
1494
- }
1495
- }
1496
- gpr_free(old_active_pollers);
1497
- }
1498
-
1499
- cache_insert_locked(args);
1500
- }
1501
-
1502
- static void cache_destroy_locked(poll_args* args) {
1503
- if (args->next) {
1504
- args->next->prev = args->prev;
1505
- }
1506
-
1507
- if (args->prev) {
1508
- args->prev->next = args->next;
1509
- } else {
1510
- poll_cache.free_pollers = args->next;
1511
- }
1512
-
1513
- // Now move this args to the dead poller list for later join
1514
- if (poll_cache.dead_pollers != nullptr) {
1515
- poll_cache.dead_pollers->prev = args;
1516
- }
1517
- args->prev = nullptr;
1518
- args->next = poll_cache.dead_pollers;
1519
- poll_cache.dead_pollers = args;
1520
- }
1521
-
1522
- static void cache_harvest_locked() {
1523
- while (poll_cache.dead_pollers) {
1524
- poll_args* args = poll_cache.dead_pollers;
1525
- poll_cache.dead_pollers = poll_cache.dead_pollers->next;
1526
- // Keep the list consistent in case new dead pollers get added when we
1527
- // release the lock below to wait on joining
1528
- if (poll_cache.dead_pollers) {
1529
- poll_cache.dead_pollers->prev = nullptr;
1530
- }
1531
- args->harvestable = true;
1532
- gpr_cv_signal(&args->harvest);
1533
- while (!args->joinable) {
1534
- gpr_cv_wait(&args->join, &g_cvfds.mu,
1535
- gpr_inf_future(GPR_CLOCK_MONOTONIC));
1536
- }
1537
- args->poller_thd.Join();
1538
- gpr_free(args);
1539
- }
1540
- }
1541
-
1542
- static void decref_poll_result(poll_result* res) {
1543
- if (gpr_unref(&res->refcount)) {
1544
- GPR_ASSERT(!res->watchers);
1545
- gpr_free(res->fds);
1546
- gpr_free(res);
1547
- }
1548
- }
1549
-
1550
- void remove_cvn(grpc_cv_node** head, grpc_cv_node* target) {
1551
- if (target->next) {
1552
- target->next->prev = target->prev;
1553
- }
1554
-
1555
- if (target->prev) {
1556
- target->prev->next = target->next;
1557
- } else {
1558
- *head = target->next;
1559
- }
1560
- }
1561
-
1562
- gpr_timespec thread_grace;
1563
-
1564
- // Poll in a background thread
1565
- static void run_poll(void* args) {
1566
- poll_args* pargs = static_cast<poll_args*>(args);
1567
- while (1) {
1568
- poll_result* result = pargs->result;
1569
- int retval = g_cvfds.poll(result->fds, result->nfds, CV_POLL_PERIOD_MS);
1570
- gpr_mu_lock(&g_cvfds.mu);
1571
- cache_harvest_locked();
1572
- if (retval != 0) {
1573
- result->completed = 1;
1574
- result->retval = retval;
1575
- result->err = errno;
1576
- grpc_cv_node* watcher = result->watchers;
1577
- while (watcher) {
1578
- gpr_cv_signal(watcher->cv);
1579
- watcher = watcher->next;
1580
- }
1581
- }
1582
- if (result->watchcount == 0 || result->completed) {
1583
- cache_delete_locked(pargs);
1584
- decref_poll_result(result);
1585
- // Leave this polling thread alive for a grace period to do another poll()
1586
- // op
1587
- gpr_timespec deadline = gpr_now(GPR_CLOCK_MONOTONIC);
1588
- deadline = gpr_time_add(deadline, thread_grace);
1589
- pargs->trigger_set = 0;
1590
- gpr_cv_wait(&pargs->trigger, &g_cvfds.mu, deadline);
1591
- cache_harvest_locked();
1592
- if (!pargs->trigger_set) {
1593
- cache_destroy_locked(pargs);
1594
- break;
1595
- }
1596
- }
1597
- gpr_mu_unlock(&g_cvfds.mu);
1598
- }
1599
-
1600
- if (gpr_unref(&g_cvfds.pollcount)) {
1601
- gpr_cv_signal(&g_cvfds.shutdown_cv);
1602
- }
1603
- while (!pargs->harvestable) {
1604
- gpr_cv_wait(&pargs->harvest, &g_cvfds.mu,
1605
- gpr_inf_future(GPR_CLOCK_MONOTONIC));
1606
- }
1607
- pargs->joinable = true;
1608
- gpr_cv_signal(&pargs->join);
1609
- gpr_mu_unlock(&g_cvfds.mu);
1610
- }
1611
-
1612
- // This function overrides poll() to handle condition variable wakeup fds
1613
- static int cvfd_poll(struct pollfd* fds, nfds_t nfds, int timeout) {
1614
- if (timeout == 0) {
1615
- // Don't bother using background threads for polling if timeout is 0,
1616
- // poll-cv might not wait for a poll to return otherwise.
1617
- // https://github.com/grpc/grpc/issues/13298
1618
- return poll(fds, nfds, 0);
1619
- }
1620
- unsigned int i;
1621
- int res, idx;
1622
- grpc_cv_node* pollcv;
1623
- int skip_poll = 0;
1624
- nfds_t nsockfds = 0;
1625
- poll_result* result = nullptr;
1626
- gpr_mu_lock(&g_cvfds.mu);
1627
- cache_harvest_locked();
1628
- pollcv = static_cast<grpc_cv_node*>(gpr_malloc(sizeof(grpc_cv_node)));
1629
- pollcv->next = nullptr;
1630
- gpr_cv pollcv_cv;
1631
- gpr_cv_init(&pollcv_cv);
1632
- pollcv->cv = &pollcv_cv;
1633
- grpc_cv_node* fd_cvs =
1634
- static_cast<grpc_cv_node*>(gpr_malloc(nfds * sizeof(grpc_cv_node)));
1635
-
1636
- for (i = 0; i < nfds; i++) {
1637
- fds[i].revents = 0;
1638
- if (fds[i].fd < 0 && (fds[i].events & POLLIN)) {
1639
- idx = GRPC_FD_TO_IDX(fds[i].fd);
1640
- fd_cvs[i].cv = &pollcv_cv;
1641
- fd_cvs[i].prev = nullptr;
1642
- fd_cvs[i].next = g_cvfds.cvfds[idx].cvs;
1643
- if (g_cvfds.cvfds[idx].cvs) {
1644
- g_cvfds.cvfds[idx].cvs->prev = &(fd_cvs[i]);
1645
- }
1646
- g_cvfds.cvfds[idx].cvs = &(fd_cvs[i]);
1647
- // Don't bother polling if a wakeup fd is ready
1648
- if (g_cvfds.cvfds[idx].is_set) {
1649
- skip_poll = 1;
1650
- }
1651
- } else if (fds[i].fd >= 0) {
1652
- nsockfds++;
1653
- }
1654
- }
1319
+ static bool is_any_background_poller_thread(void) { return false; }
1655
1320
 
1656
- gpr_timespec deadline = gpr_now(GPR_CLOCK_MONOTONIC);
1657
- if (timeout < 0) {
1658
- deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC);
1659
- } else {
1660
- deadline =
1661
- gpr_time_add(deadline, gpr_time_from_millis(timeout, GPR_TIMESPAN));
1662
- }
1663
-
1664
- res = 0;
1665
- if (!skip_poll && nsockfds > 0) {
1666
- struct pollfd* pollfds = static_cast<struct pollfd*>(
1667
- gpr_malloc(sizeof(struct pollfd) * nsockfds));
1668
- idx = 0;
1669
- for (i = 0; i < nfds; i++) {
1670
- if (fds[i].fd >= 0) {
1671
- pollfds[idx].fd = fds[i].fd;
1672
- pollfds[idx].events = fds[i].events;
1673
- pollfds[idx].revents = 0;
1674
- idx++;
1675
- }
1676
- }
1677
- poll_args* pargs = get_poller_locked(pollfds, nsockfds);
1678
- result = pargs->result;
1679
- pollcv->next = result->watchers;
1680
- pollcv->prev = nullptr;
1681
- if (result->watchers) {
1682
- result->watchers->prev = pollcv;
1683
- }
1684
- result->watchers = pollcv;
1685
- result->watchcount++;
1686
- gpr_ref(&result->refcount);
1687
-
1688
- pargs->trigger_set = 1;
1689
- gpr_cv_signal(&pargs->trigger);
1690
- gpr_cv_wait(&pollcv_cv, &g_cvfds.mu, deadline);
1691
- cache_harvest_locked();
1692
- res = result->retval;
1693
- errno = result->err;
1694
- result->watchcount--;
1695
- remove_cvn(&result->watchers, pollcv);
1696
- } else if (!skip_poll) {
1697
- gpr_cv_wait(&pollcv_cv, &g_cvfds.mu, deadline);
1698
- cache_harvest_locked();
1699
- }
1700
-
1701
- idx = 0;
1702
- for (i = 0; i < nfds; i++) {
1703
- if (fds[i].fd < 0 && (fds[i].events & POLLIN)) {
1704
- remove_cvn(&g_cvfds.cvfds[GRPC_FD_TO_IDX(fds[i].fd)].cvs, &(fd_cvs[i]));
1705
- if (g_cvfds.cvfds[GRPC_FD_TO_IDX(fds[i].fd)].is_set) {
1706
- fds[i].revents = POLLIN;
1707
- if (res >= 0) res++;
1708
- }
1709
- } else if (!skip_poll && fds[i].fd >= 0 && result->completed) {
1710
- fds[i].revents = result->fds[idx].revents;
1711
- idx++;
1712
- }
1713
- }
1714
-
1715
- gpr_free(fd_cvs);
1716
- gpr_free(pollcv);
1717
- if (result) {
1718
- decref_poll_result(result);
1719
- }
1720
-
1721
- gpr_mu_unlock(&g_cvfds.mu);
1722
-
1723
- return res;
1724
- }
1725
-
1726
- static void global_cv_fd_table_init() {
1727
- gpr_mu_init(&g_cvfds.mu);
1728
- gpr_mu_lock(&g_cvfds.mu);
1729
- gpr_cv_init(&g_cvfds.shutdown_cv);
1730
- gpr_ref_init(&g_cvfds.pollcount, 1);
1731
- g_cvfds.size = CV_DEFAULT_TABLE_SIZE;
1732
- g_cvfds.cvfds = static_cast<grpc_fd_node*>(
1733
- gpr_malloc(sizeof(grpc_fd_node) * CV_DEFAULT_TABLE_SIZE));
1734
- g_cvfds.free_fds = nullptr;
1735
- thread_grace = gpr_time_from_millis(POLLCV_THREAD_GRACE_MS, GPR_TIMESPAN);
1736
- for (int i = 0; i < CV_DEFAULT_TABLE_SIZE; i++) {
1737
- g_cvfds.cvfds[i].is_set = 0;
1738
- g_cvfds.cvfds[i].cvs = nullptr;
1739
- g_cvfds.cvfds[i].next_free = g_cvfds.free_fds;
1740
- g_cvfds.free_fds = &g_cvfds.cvfds[i];
1741
- }
1742
- // Override the poll function with one that supports cvfds
1743
- g_cvfds.poll = grpc_poll_function;
1744
- grpc_poll_function = &cvfd_poll;
1745
-
1746
- // Initialize the cache
1747
- poll_cache.size = 32;
1748
- poll_cache.count = 0;
1749
- poll_cache.free_pollers = nullptr;
1750
- poll_cache.active_pollers =
1751
- static_cast<poll_args**>(gpr_malloc(sizeof(void*) * 32));
1752
- for (unsigned int i = 0; i < poll_cache.size; i++) {
1753
- poll_cache.active_pollers[i] = nullptr;
1754
- }
1755
- poll_cache.dead_pollers = nullptr;
1756
-
1757
- gpr_mu_unlock(&g_cvfds.mu);
1758
- }
1321
+ static void shutdown_background_closure(void) {}
1759
1322
 
1760
- static void global_cv_fd_table_shutdown() {
1761
- gpr_mu_lock(&g_cvfds.mu);
1762
- // Attempt to wait for all abandoned poll() threads to terminate
1763
- // Not doing so will result in reported memory leaks
1764
- if (!gpr_unref(&g_cvfds.pollcount)) {
1765
- int res = gpr_cv_wait(&g_cvfds.shutdown_cv, &g_cvfds.mu,
1766
- gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC),
1767
- gpr_time_from_seconds(3, GPR_TIMESPAN)));
1768
- GPR_ASSERT(res == 0);
1769
- }
1770
- gpr_cv_destroy(&g_cvfds.shutdown_cv);
1771
- grpc_poll_function = g_cvfds.poll;
1772
- gpr_free(g_cvfds.cvfds);
1773
-
1774
- cache_harvest_locked();
1775
- gpr_free(poll_cache.active_pollers);
1776
-
1777
- gpr_mu_unlock(&g_cvfds.mu);
1778
- gpr_mu_destroy(&g_cvfds.mu);
1323
+ static bool add_closure_to_background_poller(grpc_closure* closure,
1324
+ grpc_error* error) {
1325
+ return false;
1779
1326
  }
1780
1327
 
1781
- /*******************************************************************************
1782
- * event engine binding
1783
- */
1784
-
1785
- static void shutdown_background_closure(void) {}
1786
-
1787
1328
  static void shutdown_engine(void) {
1788
1329
  pollset_global_shutdown();
1789
- if (grpc_cv_wakeup_fds_enabled()) {
1790
- global_cv_fd_table_shutdown();
1791
- }
1792
1330
  if (track_fds_for_fork) {
1793
1331
  gpr_mu_destroy(&fork_fd_list_mu);
1794
1332
  grpc_core::Fork::SetResetChildPollingEngineFunc(nullptr);
@@ -1828,8 +1366,10 @@ static const grpc_event_engine_vtable vtable = {
1828
1366
  pollset_set_add_fd,
1829
1367
  pollset_set_del_fd,
1830
1368
 
1369
+ is_any_background_poller_thread,
1831
1370
  shutdown_background_closure,
1832
1371
  shutdown_engine,
1372
+ add_closure_to_background_poller,
1833
1373
  };
1834
1374
 
1835
1375
  /* Called by the child process's post-fork handler to close open fds, including
@@ -1869,15 +1409,4 @@ const grpc_event_engine_vtable* grpc_init_poll_posix(bool explicit_request) {
1869
1409
  return &vtable;
1870
1410
  }
1871
1411
 
1872
- const grpc_event_engine_vtable* grpc_init_poll_cv_posix(bool explicit_request) {
1873
- global_cv_fd_table_init();
1874
- grpc_enable_cv_wakeup_fds(1);
1875
- if (!GRPC_LOG_IF_ERROR("pollset_global_init", pollset_global_init())) {
1876
- global_cv_fd_table_shutdown();
1877
- grpc_enable_cv_wakeup_fds(0);
1878
- return nullptr;
1879
- }
1880
- return &vtable;
1881
- }
1882
-
1883
1412
  #endif /* GRPC_POSIX_SOCKET_EV_POLL */
@@ -31,31 +31,36 @@
31
31
  #include <grpc/support/string_util.h>
32
32
 
33
33
  #include "src/core/lib/debug/trace.h"
34
- #include "src/core/lib/gpr/env.h"
35
34
  #include "src/core/lib/gpr/useful.h"
35
+ #include "src/core/lib/gprpp/global_config.h"
36
36
  #include "src/core/lib/iomgr/ev_epoll1_linux.h"
37
37
  #include "src/core/lib/iomgr/ev_epollex_linux.h"
38
38
  #include "src/core/lib/iomgr/ev_poll_posix.h"
39
39
  #include "src/core/lib/iomgr/internal_errqueue.h"
40
40
 
41
- grpc_core::TraceFlag grpc_polling_trace(false,
42
- "polling"); /* Disabled by default */
41
+ GPR_GLOBAL_CONFIG_DEFINE_STRING(
42
+ grpc_poll_strategy, "all",
43
+ "Declares which polling engines to try when starting gRPC. "
44
+ "This is a comma-separated list of engines, which are tried in priority "
45
+ "order first -> last.")
46
+
47
+ grpc_core::DebugOnlyTraceFlag grpc_polling_trace(
48
+ false, "polling"); /* Disabled by default */
43
49
 
44
50
  /* Traces fd create/close operations */
45
- grpc_core::TraceFlag grpc_fd_trace(false, "fd_trace");
51
+ grpc_core::DebugOnlyTraceFlag grpc_fd_trace(false, "fd_trace");
46
52
  grpc_core::DebugOnlyTraceFlag grpc_trace_fd_refcount(false, "fd_refcount");
47
53
  grpc_core::DebugOnlyTraceFlag grpc_polling_api_trace(false, "polling_api");
48
54
 
49
- #ifndef NDEBUG
50
-
51
55
  // Polling API trace only enabled in debug builds
56
+ #ifndef NDEBUG
52
57
  #define GRPC_POLLING_API_TRACE(format, ...) \
53
- if (grpc_polling_api_trace.enabled()) { \
58
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_api_trace)) { \
54
59
  gpr_log(GPR_INFO, "(polling-api) " format, __VA_ARGS__); \
55
60
  }
56
61
  #else
57
62
  #define GRPC_POLLING_API_TRACE(...)
58
- #endif
63
+ #endif // NDEBUG
59
64
 
60
65
  /** Default poll() function - a pointer so that it can be overridden by some
61
66
  * tests */
@@ -66,7 +71,7 @@ int aix_poll(struct pollfd fds[], nfds_t nfds, int timeout) {
66
71
  return poll(fds, nfds, timeout);
67
72
  }
68
73
  grpc_poll_function_type grpc_poll_function = aix_poll;
69
- #endif
74
+ #endif // GPR_AIX
70
75
 
71
76
  grpc_wakeup_fd grpc_global_wakeup_fd;
72
77
 
@@ -126,10 +131,9 @@ static event_engine_factory g_factories[] = {
126
131
  {ENGINE_HEAD_CUSTOM, nullptr}, {ENGINE_HEAD_CUSTOM, nullptr},
127
132
  {ENGINE_HEAD_CUSTOM, nullptr}, {ENGINE_HEAD_CUSTOM, nullptr},
128
133
  {"epollex", grpc_init_epollex_linux}, {"epoll1", grpc_init_epoll1_linux},
129
- {"poll", grpc_init_poll_posix}, {"poll-cv", grpc_init_poll_cv_posix},
130
- {"none", init_non_polling}, {ENGINE_TAIL_CUSTOM, nullptr},
134
+ {"poll", grpc_init_poll_posix}, {"none", init_non_polling},
135
+ {ENGINE_TAIL_CUSTOM, nullptr}, {ENGINE_TAIL_CUSTOM, nullptr},
131
136
  {ENGINE_TAIL_CUSTOM, nullptr}, {ENGINE_TAIL_CUSTOM, nullptr},
132
- {ENGINE_TAIL_CUSTOM, nullptr},
133
137
  };
134
138
 
135
139
  static void add(const char* beg, const char* end, char*** ss, size_t* ns) {
@@ -206,14 +210,11 @@ void grpc_register_event_engine_factory(const char* name,
206
210
  const char* grpc_get_poll_strategy_name() { return g_poll_strategy_name; }
207
211
 
208
212
  void grpc_event_engine_init(void) {
209
- char* s = gpr_getenv("GRPC_POLL_STRATEGY");
210
- if (s == nullptr) {
211
- s = gpr_strdup("all");
212
- }
213
+ grpc_core::UniquePtr<char> value = GPR_GLOBAL_CONFIG_GET(grpc_poll_strategy);
213
214
 
214
215
  char** strings = nullptr;
215
216
  size_t nstrings = 0;
216
- split(s, &strings, &nstrings);
217
+ split(value.get(), &strings, &nstrings);
217
218
 
218
219
  for (size_t i = 0; g_event_engine == nullptr && i < nstrings; i++) {
219
220
  try_engine(strings[i]);
@@ -225,10 +226,10 @@ void grpc_event_engine_init(void) {
225
226
  gpr_free(strings);
226
227
 
227
228
  if (g_event_engine == nullptr) {
228
- gpr_log(GPR_ERROR, "No event engine could be initialized from %s", s);
229
+ gpr_log(GPR_ERROR, "No event engine could be initialized from %s",
230
+ value.get());
229
231
  abort();
230
232
  }
231
- gpr_free(s);
232
233
  }
233
234
 
234
235
  void grpc_event_engine_shutdown(void) {
@@ -399,6 +400,15 @@ void grpc_pollset_set_del_fd(grpc_pollset_set* pollset_set, grpc_fd* fd) {
399
400
  g_event_engine->pollset_set_del_fd(pollset_set, fd);
400
401
  }
401
402
 
403
+ bool grpc_is_any_background_poller_thread(void) {
404
+ return g_event_engine->is_any_background_poller_thread();
405
+ }
406
+
407
+ bool grpc_add_closure_to_background_poller(grpc_closure* closure,
408
+ grpc_error* error) {
409
+ return g_event_engine->add_closure_to_background_poller(closure, error);
410
+ }
411
+
402
412
  void grpc_shutdown_background_closure(void) {
403
413
  g_event_engine->shutdown_background_closure();
404
414
  }