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
@@ -0,0 +1,179 @@
1
+ /*
2
+ *
3
+ * Copyright 2019 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include "src/core/lib/iomgr/port.h"
21
+ #if GRPC_ARES == 1 && defined(GRPC_UV)
22
+
23
+ #include <ares.h>
24
+ #include <uv.h>
25
+
26
+ #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h"
27
+
28
+ #include <grpc/support/alloc.h>
29
+ #include <grpc/support/log.h>
30
+ #include <grpc/support/string_util.h>
31
+ #include <grpc/support/time.h>
32
+ #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h"
33
+ #include "src/core/lib/gpr/string.h"
34
+ #include "src/core/lib/iomgr/combiner.h"
35
+
36
+ namespace grpc_core {
37
+
38
+ void ares_uv_poll_cb(uv_poll_t* handle, int status, int events);
39
+
40
+ void ares_uv_poll_close_cb(uv_handle_t* handle) { Delete(handle); }
41
+
42
+ class GrpcPolledFdLibuv : public GrpcPolledFd {
43
+ public:
44
+ GrpcPolledFdLibuv(ares_socket_t as, grpc_combiner* combiner)
45
+ : as_(as), combiner_(combiner) {
46
+ gpr_asprintf(&name_, "c-ares socket: %" PRIdPTR, (intptr_t)as);
47
+ handle_ = New<uv_poll_t>();
48
+ uv_poll_init_socket(uv_default_loop(), handle_, as);
49
+ handle_->data = this;
50
+ GRPC_COMBINER_REF(combiner_, "libuv ares event driver");
51
+ }
52
+
53
+ ~GrpcPolledFdLibuv() {
54
+ gpr_free(name_);
55
+ GRPC_COMBINER_UNREF(combiner_, "libuv ares event driver");
56
+ }
57
+
58
+ void RegisterForOnReadableLocked(grpc_closure* read_closure) override {
59
+ GPR_ASSERT(read_closure_ == nullptr);
60
+ GPR_ASSERT((poll_events_ & UV_READABLE) == 0);
61
+ read_closure_ = read_closure;
62
+ poll_events_ |= UV_READABLE;
63
+ uv_poll_start(handle_, poll_events_, ares_uv_poll_cb);
64
+ }
65
+
66
+ void RegisterForOnWriteableLocked(grpc_closure* write_closure) override {
67
+ GPR_ASSERT(write_closure_ == nullptr);
68
+ GPR_ASSERT((poll_events_ & UV_WRITABLE) == 0);
69
+ write_closure_ = write_closure;
70
+ poll_events_ |= UV_WRITABLE;
71
+ uv_poll_start(handle_, poll_events_, ares_uv_poll_cb);
72
+ }
73
+
74
+ bool IsFdStillReadableLocked() override {
75
+ /* uv_poll_t is based on poll, which is level triggered. So, if cares
76
+ * leaves some data unread, the event will trigger again. */
77
+ return false;
78
+ }
79
+
80
+ void ShutdownInternalLocked(grpc_error* error) {
81
+ uv_poll_stop(handle_);
82
+ uv_close(reinterpret_cast<uv_handle_t*>(handle_), ares_uv_poll_close_cb);
83
+ if (read_closure_ != nullptr) {
84
+ GRPC_CLOSURE_SCHED(read_closure_, GRPC_ERROR_CANCELLED);
85
+ }
86
+ if (write_closure_ != nullptr) {
87
+ GRPC_CLOSURE_SCHED(write_closure_, GRPC_ERROR_CANCELLED);
88
+ }
89
+ }
90
+
91
+ void ShutdownLocked(grpc_error* error) override {
92
+ if (grpc_core::ExecCtx::Get() == nullptr) {
93
+ grpc_core::ExecCtx exec_ctx;
94
+ ShutdownInternalLocked(error);
95
+ } else {
96
+ ShutdownInternalLocked(error);
97
+ }
98
+ }
99
+
100
+ ares_socket_t GetWrappedAresSocketLocked() override { return as_; }
101
+
102
+ const char* GetName() override { return name_; }
103
+
104
+ char* name_;
105
+ ares_socket_t as_;
106
+ uv_poll_t* handle_;
107
+ grpc_closure* read_closure_ = nullptr;
108
+ grpc_closure* write_closure_ = nullptr;
109
+ int poll_events_ = 0;
110
+ grpc_combiner* combiner_;
111
+ };
112
+
113
+ struct AresUvPollCbArg {
114
+ AresUvPollCbArg(uv_poll_t* handle, int status, int events)
115
+ : handle(handle), status(status), events(events) {}
116
+
117
+ uv_poll_t* handle;
118
+ int status;
119
+ int events;
120
+ };
121
+
122
+ static void ares_uv_poll_cb_locked(void* arg, grpc_error* error) {
123
+ grpc_core::UniquePtr<AresUvPollCbArg> arg_struct(
124
+ reinterpret_cast<AresUvPollCbArg*>(arg));
125
+ uv_poll_t* handle = arg_struct->handle;
126
+ int status = arg_struct->status;
127
+ int events = arg_struct->events;
128
+ GrpcPolledFdLibuv* polled_fd =
129
+ reinterpret_cast<GrpcPolledFdLibuv*>(handle->data);
130
+ if (status < 0) {
131
+ error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("cares polling error");
132
+ error =
133
+ grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR,
134
+ grpc_slice_from_static_string(uv_strerror(status)));
135
+ }
136
+ if (events & UV_READABLE) {
137
+ GPR_ASSERT(polled_fd->read_closure_ != nullptr);
138
+ GRPC_CLOSURE_SCHED(polled_fd->read_closure_, error);
139
+ polled_fd->read_closure_ = nullptr;
140
+ polled_fd->poll_events_ &= ~UV_READABLE;
141
+ }
142
+ if (events & UV_WRITABLE) {
143
+ GPR_ASSERT(polled_fd->write_closure_ != nullptr);
144
+ GRPC_CLOSURE_SCHED(polled_fd->write_closure_, error);
145
+ polled_fd->write_closure_ = nullptr;
146
+ polled_fd->poll_events_ &= ~UV_WRITABLE;
147
+ }
148
+ uv_poll_start(handle, polled_fd->poll_events_, ares_uv_poll_cb);
149
+ }
150
+
151
+ void ares_uv_poll_cb(uv_poll_t* handle, int status, int events) {
152
+ grpc_core::ExecCtx exec_ctx;
153
+ GrpcPolledFdLibuv* polled_fd =
154
+ reinterpret_cast<GrpcPolledFdLibuv*>(handle->data);
155
+ AresUvPollCbArg* arg = New<AresUvPollCbArg>(handle, status, events);
156
+ GRPC_CLOSURE_SCHED(
157
+ GRPC_CLOSURE_CREATE(ares_uv_poll_cb_locked, arg,
158
+ grpc_combiner_scheduler(polled_fd->combiner_)),
159
+ GRPC_ERROR_NONE);
160
+ }
161
+
162
+ class GrpcPolledFdFactoryLibuv : public GrpcPolledFdFactory {
163
+ public:
164
+ GrpcPolledFd* NewGrpcPolledFdLocked(ares_socket_t as,
165
+ grpc_pollset_set* driver_pollset_set,
166
+ grpc_combiner* combiner) override {
167
+ return New<GrpcPolledFdLibuv>(as, combiner);
168
+ }
169
+
170
+ void ConfigureAresChannelLocked(ares_channel channel) override {}
171
+ };
172
+
173
+ UniquePtr<GrpcPolledFdFactory> NewGrpcPolledFdFactory(grpc_combiner* combiner) {
174
+ return UniquePtr<GrpcPolledFdFactory>(New<GrpcPolledFdFactoryLibuv>());
175
+ }
176
+
177
+ } // namespace grpc_core
178
+
179
+ #endif /* GRPC_ARES == 1 && defined(GRPC_UV) */
@@ -18,7 +18,7 @@
18
18
  #include <grpc/support/port_platform.h>
19
19
 
20
20
  #include "src/core/lib/iomgr/port.h"
21
- #if GRPC_ARES == 1 && defined(GPR_WINDOWS)
21
+ #if GRPC_ARES == 1 && defined(GRPC_WINDOWS_SOCKET_ARES_EV_DRIVER)
22
22
 
23
23
  #include <ares.h>
24
24
 
@@ -109,6 +109,7 @@ class GrpcPolledFdWindows : public GrpcPolledFd {
109
109
  read_closure_ = read_closure;
110
110
  GPR_ASSERT(GRPC_SLICE_LENGTH(read_buf_) == 0);
111
111
  grpc_slice_unref_internal(read_buf_);
112
+ GPR_ASSERT(!read_buf_has_data_);
112
113
  read_buf_ = GRPC_SLICE_MALLOC(4192);
113
114
  WSABUF buffer;
114
115
  buffer.buf = (char*)GRPC_SLICE_START_PTR(read_buf_);
@@ -120,13 +121,14 @@ class GrpcPolledFdWindows : public GrpcPolledFd {
120
121
  nullptr, &flags, (sockaddr*)recv_from_source_addr_,
121
122
  &recv_from_source_addr_len_,
122
123
  &winsocket_->read_info.overlapped, nullptr)) {
123
- char* msg = gpr_format_message(WSAGetLastError());
124
+ int wsa_last_error = WSAGetLastError();
125
+ char* msg = gpr_format_message(wsa_last_error);
124
126
  grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
125
127
  GRPC_CARES_TRACE_LOG(
126
128
  "RegisterForOnReadableLocked: WSARecvFrom error:|%s|. fd:|%s|", msg,
127
129
  GetName());
128
130
  gpr_free(msg);
129
- if (WSAGetLastError() != WSA_IO_PENDING) {
131
+ if (wsa_last_error != WSA_IO_PENDING) {
130
132
  ScheduleAndNullReadClosure(error);
131
133
  return;
132
134
  }
@@ -174,7 +176,7 @@ class GrpcPolledFdWindows : public GrpcPolledFd {
174
176
  GRPC_CARES_TRACE_LOG(
175
177
  "RecvFrom called on fd:|%s|. Current read buf length:|%d|", GetName(),
176
178
  GRPC_SLICE_LENGTH(read_buf_));
177
- if (GRPC_SLICE_LENGTH(read_buf_) == 0) {
179
+ if (!read_buf_has_data_) {
178
180
  WSASetLastError(WSAEWOULDBLOCK);
179
181
  return -1;
180
182
  }
@@ -185,6 +187,9 @@ class GrpcPolledFdWindows : public GrpcPolledFd {
185
187
  }
186
188
  read_buf_ = grpc_slice_sub_no_ref(read_buf_, bytes_read,
187
189
  GRPC_SLICE_LENGTH(read_buf_));
190
+ if (GRPC_SLICE_LENGTH(read_buf_) == 0) {
191
+ read_buf_has_data_ = false;
192
+ }
188
193
  /* c-ares overloads this recv_from virtual socket function to receive
189
194
  * data on both UDP and TCP sockets, and from is nullptr for TCP. */
190
195
  if (from != nullptr) {
@@ -226,15 +231,15 @@ class GrpcPolledFdWindows : public GrpcPolledFd {
226
231
 
227
232
  ares_ssize_t TrySendWriteBufSyncNonBlocking() {
228
233
  GPR_ASSERT(write_state_ == WRITE_IDLE);
229
- ares_ssize_t total_sent;
230
234
  DWORD bytes_sent = 0;
231
235
  if (SendWriteBuf(&bytes_sent, nullptr) != 0) {
232
- char* msg = gpr_format_message(WSAGetLastError());
236
+ int wsa_last_error = WSAGetLastError();
237
+ char* msg = gpr_format_message(wsa_last_error);
233
238
  GRPC_CARES_TRACE_LOG(
234
239
  "TrySendWriteBufSyncNonBlocking: SendWriteBuf error:|%s|. fd:|%s|",
235
240
  msg, GetName());
236
241
  gpr_free(msg);
237
- if (WSAGetLastError() == WSA_IO_PENDING) {
242
+ if (wsa_last_error == WSA_IO_PENDING) {
238
243
  WSASetLastError(WSAEWOULDBLOCK);
239
244
  write_state_ = WRITE_REQUESTED;
240
245
  }
@@ -284,9 +289,10 @@ class GrpcPolledFdWindows : public GrpcPolledFd {
284
289
  int out =
285
290
  WSAConnect(s, target, target_len, nullptr, nullptr, nullptr, nullptr);
286
291
  if (out != 0) {
287
- char* msg = gpr_format_message(WSAGetLastError());
292
+ int wsa_last_error = WSAGetLastError();
293
+ char* msg = gpr_format_message(wsa_last_error);
288
294
  GRPC_CARES_TRACE_LOG("Connect error code:|%d|, msg:|%s|. fd:|%s|",
289
- WSAGetLastError(), msg, GetName());
295
+ wsa_last_error, msg, GetName());
290
296
  gpr_free(msg);
291
297
  // c-ares expects a posix-style connect API
292
298
  out = -1;
@@ -299,6 +305,11 @@ class GrpcPolledFdWindows : public GrpcPolledFd {
299
305
  polled_fd->OnIocpReadableInner(error);
300
306
  }
301
307
 
308
+ // TODO(apolcyn): improve this error handling to be less conversative.
309
+ // An e.g. ECONNRESET error here should result in errors when
310
+ // c-ares reads from this socket later, but it shouldn't necessarily cancel
311
+ // the entire resolution attempt. Doing so will allow the "inject broken
312
+ // nameserver list" test to pass on Windows.
302
313
  void OnIocpReadableInner(grpc_error* error) {
303
314
  if (error == GRPC_ERROR_NONE) {
304
315
  if (winsocket_->read_info.wsa_error != 0) {
@@ -320,6 +331,7 @@ class GrpcPolledFdWindows : public GrpcPolledFd {
320
331
  if (error == GRPC_ERROR_NONE) {
321
332
  read_buf_ = grpc_slice_sub_no_ref(read_buf_, 0,
322
333
  winsocket_->read_info.bytes_transfered);
334
+ read_buf_has_data_ = true;
323
335
  } else {
324
336
  grpc_slice_unref_internal(read_buf_);
325
337
  read_buf_ = grpc_empty_slice();
@@ -367,6 +379,7 @@ class GrpcPolledFdWindows : public GrpcPolledFd {
367
379
  char recv_from_source_addr_[200];
368
380
  ares_socklen_t recv_from_source_addr_len_;
369
381
  grpc_slice read_buf_;
382
+ bool read_buf_has_data_ = false;
370
383
  grpc_slice write_buf_;
371
384
  grpc_closure* read_closure_ = nullptr;
372
385
  grpc_closure* write_closure_ = nullptr;
@@ -442,7 +455,8 @@ class SockToPolledFdMap {
442
455
  */
443
456
  static ares_socket_t Socket(int af, int type, int protocol, void* user_data) {
444
457
  SockToPolledFdMap* map = static_cast<SockToPolledFdMap*>(user_data);
445
- SOCKET s = WSASocket(af, type, protocol, nullptr, 0, WSA_FLAG_OVERLAPPED);
458
+ SOCKET s = WSASocket(af, type, protocol, nullptr, 0,
459
+ grpc_get_default_wsa_socket_flags());
446
460
  if (s == INVALID_SOCKET) {
447
461
  return s;
448
462
  }
@@ -18,7 +18,7 @@
18
18
 
19
19
  #include <grpc/support/port_platform.h>
20
20
 
21
- #if GRPC_ARES == 1 && !defined(GRPC_UV)
21
+ #if GRPC_ARES == 1
22
22
 
23
23
  #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h"
24
24
  #include "src/core/lib/iomgr/sockaddr.h"
@@ -47,9 +47,6 @@
47
47
  using grpc_core::ServerAddress;
48
48
  using grpc_core::ServerAddressList;
49
49
 
50
- static gpr_once g_basic_init = GPR_ONCE_INIT;
51
- static gpr_mu g_init_mu;
52
-
53
50
  grpc_core::TraceFlag grpc_trace_cares_address_sorting(false,
54
51
  "cares_address_sorting");
55
52
 
@@ -70,9 +67,7 @@ struct grpc_ares_request {
70
67
  /** number of ongoing queries */
71
68
  size_t pending_queries;
72
69
 
73
- /** is there at least one successful query, set in on_done_cb */
74
- bool success;
75
- /** the errors explaining the request failure, set in on_done_cb */
70
+ /** the errors explaining query failures, appended to in query callbacks */
76
71
  grpc_error* error;
77
72
  };
78
73
 
@@ -89,8 +84,6 @@ typedef struct grpc_ares_hostbyname_request {
89
84
  bool is_balancer;
90
85
  } grpc_ares_hostbyname_request;
91
86
 
92
- static void do_basic_init(void) { gpr_mu_init(&g_init_mu); }
93
-
94
87
  static void log_address_sorting_list(const ServerAddressList& addresses,
95
88
  const char* input_output_str) {
96
89
  for (size_t i = 0; i < addresses.size(); i++) {
@@ -108,7 +101,7 @@ static void log_address_sorting_list(const ServerAddressList& addresses,
108
101
  }
109
102
 
110
103
  void grpc_cares_wrapper_address_sorting_sort(ServerAddressList* addresses) {
111
- if (grpc_trace_cares_address_sorting.enabled()) {
104
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_cares_address_sorting)) {
112
105
  log_address_sorting_list(*addresses, "input");
113
106
  }
114
107
  address_sorting_sortable* sortables = (address_sorting_sortable*)gpr_zalloc(
@@ -127,7 +120,7 @@ void grpc_cares_wrapper_address_sorting_sort(ServerAddressList* addresses) {
127
120
  }
128
121
  gpr_free(sortables);
129
122
  *addresses = std::move(sorted);
130
- if (grpc_trace_cares_address_sorting.enabled()) {
123
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_cares_address_sorting)) {
131
124
  log_address_sorting_list(*addresses, "output");
132
125
  }
133
126
  }
@@ -150,6 +143,10 @@ void grpc_ares_complete_request_locked(grpc_ares_request* r) {
150
143
  ServerAddressList* addresses = r->addresses_out->get();
151
144
  if (addresses != nullptr) {
152
145
  grpc_cares_wrapper_address_sorting_sort(addresses);
146
+ GRPC_ERROR_UNREF(r->error);
147
+ r->error = GRPC_ERROR_NONE;
148
+ // TODO(apolcyn): allow c-ares to return a service config
149
+ // with no addresses along side it
153
150
  }
154
151
  GRPC_CLOSURE_SCHED(r->on_done, r->error);
155
152
  }
@@ -157,6 +154,10 @@ void grpc_ares_complete_request_locked(grpc_ares_request* r) {
157
154
  static grpc_ares_hostbyname_request* create_hostbyname_request_locked(
158
155
  grpc_ares_request* parent_request, char* host, uint16_t port,
159
156
  bool is_balancer) {
157
+ GRPC_CARES_TRACE_LOG(
158
+ "request:%p create_hostbyname_request_locked host:%s port:%d "
159
+ "is_balancer:%d",
160
+ parent_request, host, port, is_balancer);
160
161
  grpc_ares_hostbyname_request* hr = static_cast<grpc_ares_hostbyname_request*>(
161
162
  gpr_zalloc(sizeof(grpc_ares_hostbyname_request)));
162
163
  hr->parent_request = parent_request;
@@ -180,9 +181,9 @@ static void on_hostbyname_done_locked(void* arg, int status, int timeouts,
180
181
  static_cast<grpc_ares_hostbyname_request*>(arg);
181
182
  grpc_ares_request* r = hr->parent_request;
182
183
  if (status == ARES_SUCCESS) {
183
- GRPC_ERROR_UNREF(r->error);
184
- r->error = GRPC_ERROR_NONE;
185
- r->success = true;
184
+ GRPC_CARES_TRACE_LOG(
185
+ "request:%p on_hostbyname_done_locked host=%s ARES_SUCCESS", r,
186
+ hr->host);
186
187
  if (*r->addresses_out == nullptr) {
187
188
  *r->addresses_out = grpc_core::MakeUnique<ServerAddressList>();
188
189
  }
@@ -234,17 +235,15 @@ static void on_hostbyname_done_locked(void* arg, int status, int timeouts,
234
235
  }
235
236
  }
236
237
  }
237
- } else if (!r->success) {
238
+ } else {
238
239
  char* error_msg;
239
240
  gpr_asprintf(&error_msg, "C-ares status is not ARES_SUCCESS: %s",
240
241
  ares_strerror(status));
242
+ GRPC_CARES_TRACE_LOG("request:%p on_hostbyname_done_locked host=%s %s", r,
243
+ hr->host, error_msg);
241
244
  grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_msg);
242
245
  gpr_free(error_msg);
243
- if (r->error == GRPC_ERROR_NONE) {
244
- r->error = error;
245
- } else {
246
- r->error = grpc_error_add_child(error, r->error);
247
- }
246
+ r->error = grpc_error_add_child(error, r->error);
248
247
  }
249
248
  destroy_hostbyname_request_locked(hr);
250
249
  }
@@ -252,11 +251,12 @@ static void on_hostbyname_done_locked(void* arg, int status, int timeouts,
252
251
  static void on_srv_query_done_locked(void* arg, int status, int timeouts,
253
252
  unsigned char* abuf, int alen) {
254
253
  grpc_ares_request* r = static_cast<grpc_ares_request*>(arg);
255
- GRPC_CARES_TRACE_LOG("request:%p on_query_srv_done_locked", r);
256
254
  if (status == ARES_SUCCESS) {
257
- GRPC_CARES_TRACE_LOG("request:%p on_query_srv_done_locked ARES_SUCCESS", r);
255
+ GRPC_CARES_TRACE_LOG("request:%p on_srv_query_done_locked ARES_SUCCESS", r);
258
256
  struct ares_srv_reply* reply;
259
257
  const int parse_status = ares_parse_srv_reply(abuf, alen, &reply);
258
+ GRPC_CARES_TRACE_LOG("request:%p ares_parse_srv_reply: %d", r,
259
+ parse_status);
260
260
  if (parse_status == ARES_SUCCESS) {
261
261
  ares_channel* channel =
262
262
  grpc_ares_ev_driver_get_channel_locked(r->ev_driver);
@@ -278,17 +278,15 @@ static void on_srv_query_done_locked(void* arg, int status, int timeouts,
278
278
  if (reply != nullptr) {
279
279
  ares_free_data(reply);
280
280
  }
281
- } else if (!r->success) {
281
+ } else {
282
282
  char* error_msg;
283
283
  gpr_asprintf(&error_msg, "C-ares status is not ARES_SUCCESS: %s",
284
284
  ares_strerror(status));
285
+ GRPC_CARES_TRACE_LOG("request:%p on_srv_query_done_locked %s", r,
286
+ error_msg);
285
287
  grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_msg);
286
288
  gpr_free(error_msg);
287
- if (r->error == GRPC_ERROR_NONE) {
288
- r->error = error;
289
- } else {
290
- r->error = grpc_error_add_child(error, r->error);
291
- }
289
+ r->error = grpc_error_add_child(error, r->error);
292
290
  }
293
291
  grpc_ares_request_unref_locked(r);
294
292
  }
@@ -299,12 +297,12 @@ static void on_txt_done_locked(void* arg, int status, int timeouts,
299
297
  unsigned char* buf, int len) {
300
298
  char* error_msg;
301
299
  grpc_ares_request* r = static_cast<grpc_ares_request*>(arg);
302
- GRPC_CARES_TRACE_LOG("request:%p on_txt_done_locked", r);
303
300
  const size_t prefix_len = sizeof(g_service_config_attribute_prefix) - 1;
304
301
  struct ares_txt_ext* result = nullptr;
305
302
  struct ares_txt_ext* reply = nullptr;
306
303
  grpc_error* error = GRPC_ERROR_NONE;
307
304
  if (status != ARES_SUCCESS) goto fail;
305
+ GRPC_CARES_TRACE_LOG("request:%p on_txt_done_locked ARES_SUCCESS", r);
308
306
  status = ares_parse_txt_reply_ext(buf, len, &reply);
309
307
  if (status != ARES_SUCCESS) goto fail;
310
308
  // Find service config in TXT record.
@@ -342,12 +340,9 @@ fail:
342
340
  gpr_asprintf(&error_msg, "C-ares TXT lookup status is not ARES_SUCCESS: %s",
343
341
  ares_strerror(status));
344
342
  error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_msg);
343
+ GRPC_CARES_TRACE_LOG("request:%p on_txt_done_locked %s", r, error_msg);
345
344
  gpr_free(error_msg);
346
- if (r->error == GRPC_ERROR_NONE) {
347
- r->error = error;
348
- } else {
349
- r->error = grpc_error_add_child(error, r->error);
350
- }
345
+ r->error = grpc_error_add_child(error, r->error);
351
346
  done:
352
347
  grpc_ares_request_unref_locked(r);
353
348
  }
@@ -527,6 +522,76 @@ static bool target_matches_localhost(const char* name) {
527
522
  return out;
528
523
  }
529
524
 
525
+ #ifdef GRPC_ARES_RESOLVE_LOCALHOST_MANUALLY
526
+ static bool inner_maybe_resolve_localhost_manually_locked(
527
+ const char* name, const char* default_port,
528
+ grpc_core::UniquePtr<grpc_core::ServerAddressList>* addrs, char** host,
529
+ char** port) {
530
+ gpr_split_host_port(name, host, port);
531
+ if (*host == nullptr) {
532
+ gpr_log(GPR_ERROR,
533
+ "Failed to parse %s into host:port during manual localhost "
534
+ "resolution check.",
535
+ name);
536
+ return false;
537
+ }
538
+ if (*port == nullptr) {
539
+ if (default_port == nullptr) {
540
+ gpr_log(GPR_ERROR,
541
+ "No port or default port for %s during manual localhost "
542
+ "resolution check.",
543
+ name);
544
+ return false;
545
+ }
546
+ *port = gpr_strdup(default_port);
547
+ }
548
+ if (gpr_stricmp(*host, "localhost") == 0) {
549
+ GPR_ASSERT(*addrs == nullptr);
550
+ *addrs = grpc_core::MakeUnique<grpc_core::ServerAddressList>();
551
+ uint16_t numeric_port = grpc_strhtons(*port);
552
+ // Append the ipv6 loopback address.
553
+ struct sockaddr_in6 ipv6_loopback_addr;
554
+ memset(&ipv6_loopback_addr, 0, sizeof(ipv6_loopback_addr));
555
+ ((char*)&ipv6_loopback_addr.sin6_addr)[15] = 1;
556
+ ipv6_loopback_addr.sin6_family = AF_INET6;
557
+ ipv6_loopback_addr.sin6_port = numeric_port;
558
+ (*addrs)->emplace_back(&ipv6_loopback_addr, sizeof(ipv6_loopback_addr),
559
+ nullptr /* args */);
560
+ // Append the ipv4 loopback address.
561
+ struct sockaddr_in ipv4_loopback_addr;
562
+ memset(&ipv4_loopback_addr, 0, sizeof(ipv4_loopback_addr));
563
+ ((char*)&ipv4_loopback_addr.sin_addr)[0] = 0x7f;
564
+ ((char*)&ipv4_loopback_addr.sin_addr)[3] = 0x01;
565
+ ipv4_loopback_addr.sin_family = AF_INET;
566
+ ipv4_loopback_addr.sin_port = numeric_port;
567
+ (*addrs)->emplace_back(&ipv4_loopback_addr, sizeof(ipv4_loopback_addr),
568
+ nullptr /* args */);
569
+ // Let the address sorter figure out which one should be tried first.
570
+ grpc_cares_wrapper_address_sorting_sort(addrs->get());
571
+ return true;
572
+ }
573
+ return false;
574
+ }
575
+
576
+ static bool grpc_ares_maybe_resolve_localhost_manually_locked(
577
+ const char* name, const char* default_port,
578
+ grpc_core::UniquePtr<grpc_core::ServerAddressList>* addrs) {
579
+ char* host = nullptr;
580
+ char* port = nullptr;
581
+ bool out = inner_maybe_resolve_localhost_manually_locked(name, default_port,
582
+ addrs, &host, &port);
583
+ gpr_free(host);
584
+ gpr_free(port);
585
+ return out;
586
+ }
587
+ #else /* GRPC_ARES_RESOLVE_LOCALHOST_MANUALLY */
588
+ static bool grpc_ares_maybe_resolve_localhost_manually_locked(
589
+ const char* name, const char* default_port,
590
+ grpc_core::UniquePtr<grpc_core::ServerAddressList>* addrs) {
591
+ return false;
592
+ }
593
+ #endif /* GRPC_ARES_RESOLVE_LOCALHOST_MANUALLY */
594
+
530
595
  static grpc_ares_request* grpc_dns_lookup_ares_locked_impl(
531
596
  const char* dns_server, const char* name, const char* default_port,
532
597
  grpc_pollset_set* interested_parties, grpc_closure* on_done,
@@ -539,7 +604,6 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl(
539
604
  r->on_done = on_done;
540
605
  r->addresses_out = addrs;
541
606
  r->service_config_json_out = service_config_json;
542
- r->success = false;
543
607
  r->error = GRPC_ERROR_NONE;
544
608
  r->pending_queries = 0;
545
609
  GRPC_CARES_TRACE_LOG(
@@ -548,13 +612,13 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl(
548
612
  r, name, default_port);
549
613
  // Early out if the target is an ipv4 or ipv6 literal.
550
614
  if (resolve_as_ip_literal_locked(name, default_port, addrs)) {
551
- GRPC_CLOSURE_SCHED(on_done, GRPC_ERROR_NONE);
615
+ grpc_ares_complete_request_locked(r);
552
616
  return r;
553
617
  }
554
618
  // Early out if the target is localhost and we're on Windows.
555
619
  if (grpc_ares_maybe_resolve_localhost_manually_locked(name, default_port,
556
620
  addrs)) {
557
- GRPC_CLOSURE_SCHED(on_done, GRPC_ERROR_NONE);
621
+ grpc_ares_complete_request_locked(r);
558
622
  return r;
559
623
  }
560
624
  // Don't query for SRV and TXT records if the target is "localhost", so
@@ -588,12 +652,12 @@ static void grpc_cancel_ares_request_locked_impl(grpc_ares_request* r) {
588
652
  void (*grpc_cancel_ares_request_locked)(grpc_ares_request* r) =
589
653
  grpc_cancel_ares_request_locked_impl;
590
654
 
655
+ // ares_library_init and ares_library_cleanup are currently no-op except under
656
+ // Windows. Calling them may cause race conditions when other parts of the
657
+ // binary calls these functions concurrently.
658
+ #ifdef GPR_WINDOWS
591
659
  grpc_error* grpc_ares_init(void) {
592
- gpr_once_init(&g_basic_init, do_basic_init);
593
- gpr_mu_lock(&g_init_mu);
594
660
  int status = ares_library_init(ARES_LIB_INIT_ALL);
595
- gpr_mu_unlock(&g_init_mu);
596
-
597
661
  if (status != ARES_SUCCESS) {
598
662
  char* error_msg;
599
663
  gpr_asprintf(&error_msg, "ares_library_init failed: %s",
@@ -605,11 +669,11 @@ grpc_error* grpc_ares_init(void) {
605
669
  return GRPC_ERROR_NONE;
606
670
  }
607
671
 
608
- void grpc_ares_cleanup(void) {
609
- gpr_mu_lock(&g_init_mu);
610
- ares_library_cleanup();
611
- gpr_mu_unlock(&g_init_mu);
612
- }
672
+ void grpc_ares_cleanup(void) { ares_library_cleanup(); }
673
+ #else
674
+ grpc_error* grpc_ares_init(void) { return GRPC_ERROR_NONE; }
675
+ void grpc_ares_cleanup(void) {}
676
+ #endif // GPR_WINDOWS
613
677
 
614
678
  /*
615
679
  * grpc_resolve_address_ares related structs and functions
@@ -699,4 +763,4 @@ void (*grpc_resolve_address_ares)(
699
763
  grpc_pollset_set* interested_parties, grpc_closure* on_done,
700
764
  grpc_resolved_addresses** addrs) = grpc_resolve_address_ares_impl;
701
765
 
702
- #endif /* GRPC_ARES == 1 && !defined(GRPC_UV) */
766
+ #endif /* GRPC_ARES == 1 */
@@ -26,16 +26,18 @@
26
26
  #include "src/core/lib/iomgr/polling_entity.h"
27
27
  #include "src/core/lib/iomgr/resolve_address.h"
28
28
 
29
- #define GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS 10000
29
+ #define GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS 120000
30
30
 
31
31
  extern grpc_core::TraceFlag grpc_trace_cares_address_sorting;
32
32
 
33
33
  extern grpc_core::TraceFlag grpc_trace_cares_resolver;
34
34
 
35
- #define GRPC_CARES_TRACE_LOG(format, ...) \
36
- if (grpc_trace_cares_resolver.enabled()) { \
37
- gpr_log(GPR_DEBUG, "(c-ares resolver) " format, __VA_ARGS__); \
38
- }
35
+ #define GRPC_CARES_TRACE_LOG(format, ...) \
36
+ do { \
37
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_cares_resolver)) { \
38
+ gpr_log(GPR_DEBUG, "(c-ares resolver) " format, __VA_ARGS__); \
39
+ } \
40
+ } while (0)
39
41
 
40
42
  typedef struct grpc_ares_request grpc_ares_request;
41
43
 
@@ -85,14 +87,6 @@ void grpc_ares_complete_request_locked(grpc_ares_request* request);
85
87
  /* E.g., return false if ipv6 is known to not be available. */
86
88
  bool grpc_ares_query_ipv6();
87
89
 
88
- /* Maybe (depending on the current platform) checks if "name" matches
89
- * "localhost" and if so fills in addrs with the correct sockaddr structures.
90
- * Returns a bool indicating whether or not such an action was performed.
91
- * See https://github.com/grpc/grpc/issues/15158. */
92
- bool grpc_ares_maybe_resolve_localhost_manually_locked(
93
- const char* name, const char* default_port,
94
- grpc_core::UniquePtr<grpc_core::ServerAddressList>* addrs);
95
-
96
90
  /* Sorts destinations in lb_addrs according to RFC 6724. */
97
91
  void grpc_cares_wrapper_address_sorting_sort(
98
92
  grpc_core::ServerAddressList* addresses);
@@ -18,7 +18,7 @@
18
18
 
19
19
  #include <grpc/support/port_platform.h>
20
20
 
21
- #if GRPC_ARES != 1 || defined(GRPC_UV)
21
+ #if GRPC_ARES != 1
22
22
 
23
23
  #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h"
24
24
 
@@ -62,4 +62,4 @@ void (*grpc_resolve_address_ares)(
62
62
  grpc_pollset_set* interested_parties, grpc_closure* on_done,
63
63
  grpc_resolved_addresses** addrs) = grpc_resolve_address_ares_impl;
64
64
 
65
- #endif /* GRPC_ARES != 1 || defined(GRPC_UV) */
65
+ #endif /* GRPC_ARES != 1 */