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,543 @@
1
+ /*
2
+ *
3
+ * Copyright 2015 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
+
19
+ #include <grpc/support/port_platform.h>
20
+
21
+ #include "src/core/ext/filters/client_channel/resolving_lb_policy.h"
22
+
23
+ #include <inttypes.h>
24
+ #include <limits.h>
25
+ #include <stdbool.h>
26
+ #include <stdio.h>
27
+ #include <string.h>
28
+
29
+ #include <grpc/support/alloc.h>
30
+ #include <grpc/support/log.h>
31
+ #include <grpc/support/string_util.h>
32
+ #include <grpc/support/sync.h>
33
+
34
+ #include "src/core/ext/filters/client_channel/backup_poller.h"
35
+ #include "src/core/ext/filters/client_channel/http_connect_handshaker.h"
36
+ #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
37
+ #include "src/core/ext/filters/client_channel/proxy_mapper_registry.h"
38
+ #include "src/core/ext/filters/client_channel/resolver_registry.h"
39
+ #include "src/core/ext/filters/client_channel/retry_throttle.h"
40
+ #include "src/core/ext/filters/client_channel/server_address.h"
41
+ #include "src/core/ext/filters/client_channel/service_config.h"
42
+ #include "src/core/ext/filters/client_channel/subchannel.h"
43
+ #include "src/core/ext/filters/deadline/deadline_filter.h"
44
+ #include "src/core/lib/backoff/backoff.h"
45
+ #include "src/core/lib/channel/channel_args.h"
46
+ #include "src/core/lib/channel/connected_channel.h"
47
+ #include "src/core/lib/channel/status_util.h"
48
+ #include "src/core/lib/gpr/string.h"
49
+ #include "src/core/lib/gprpp/inlined_vector.h"
50
+ #include "src/core/lib/gprpp/manual_constructor.h"
51
+ #include "src/core/lib/gprpp/sync.h"
52
+ #include "src/core/lib/iomgr/combiner.h"
53
+ #include "src/core/lib/iomgr/iomgr.h"
54
+ #include "src/core/lib/iomgr/polling_entity.h"
55
+ #include "src/core/lib/profiling/timers.h"
56
+ #include "src/core/lib/slice/slice_internal.h"
57
+ #include "src/core/lib/slice/slice_string_helpers.h"
58
+ #include "src/core/lib/surface/channel.h"
59
+ #include "src/core/lib/transport/connectivity_state.h"
60
+ #include "src/core/lib/transport/error_utils.h"
61
+ #include "src/core/lib/transport/metadata.h"
62
+ #include "src/core/lib/transport/metadata_batch.h"
63
+ #include "src/core/lib/transport/static_metadata.h"
64
+ #include "src/core/lib/transport/status_metadata.h"
65
+
66
+ namespace grpc_core {
67
+
68
+ //
69
+ // ResolvingLoadBalancingPolicy::ResolverResultHandler
70
+ //
71
+
72
+ class ResolvingLoadBalancingPolicy::ResolverResultHandler
73
+ : public Resolver::ResultHandler {
74
+ public:
75
+ explicit ResolverResultHandler(
76
+ RefCountedPtr<ResolvingLoadBalancingPolicy> parent)
77
+ : parent_(std::move(parent)) {}
78
+
79
+ ~ResolverResultHandler() {
80
+ if (GRPC_TRACE_FLAG_ENABLED(*(parent_->tracer_))) {
81
+ gpr_log(GPR_INFO, "resolving_lb=%p: resolver shutdown complete",
82
+ parent_.get());
83
+ }
84
+ }
85
+
86
+ void ReturnResult(Resolver::Result result) override {
87
+ parent_->OnResolverResultChangedLocked(std::move(result));
88
+ }
89
+
90
+ void ReturnError(grpc_error* error) override {
91
+ parent_->OnResolverError(error);
92
+ }
93
+
94
+ private:
95
+ RefCountedPtr<ResolvingLoadBalancingPolicy> parent_;
96
+ };
97
+
98
+ //
99
+ // ResolvingLoadBalancingPolicy::ResolvingControlHelper
100
+ //
101
+
102
+ class ResolvingLoadBalancingPolicy::ResolvingControlHelper
103
+ : public LoadBalancingPolicy::ChannelControlHelper {
104
+ public:
105
+ explicit ResolvingControlHelper(
106
+ RefCountedPtr<ResolvingLoadBalancingPolicy> parent)
107
+ : parent_(std::move(parent)) {}
108
+
109
+ RefCountedPtr<SubchannelInterface> CreateSubchannel(
110
+ const grpc_channel_args& args) override {
111
+ if (parent_->resolver_ == nullptr) return nullptr; // Shutting down.
112
+ if (!CalledByCurrentChild() && !CalledByPendingChild()) return nullptr;
113
+ return parent_->channel_control_helper()->CreateSubchannel(args);
114
+ }
115
+
116
+ grpc_channel* CreateChannel(const char* target,
117
+ const grpc_channel_args& args) override {
118
+ if (parent_->resolver_ == nullptr) return nullptr; // Shutting down.
119
+ if (!CalledByCurrentChild() && !CalledByPendingChild()) return nullptr;
120
+ return parent_->channel_control_helper()->CreateChannel(target, args);
121
+ }
122
+
123
+ void UpdateState(grpc_connectivity_state state,
124
+ UniquePtr<SubchannelPicker> picker) override {
125
+ if (parent_->resolver_ == nullptr) return; // Shutting down.
126
+ // If this request is from the pending child policy, ignore it until
127
+ // it reports READY, at which point we swap it into place.
128
+ if (CalledByPendingChild()) {
129
+ if (GRPC_TRACE_FLAG_ENABLED(*(parent_->tracer_))) {
130
+ gpr_log(GPR_INFO,
131
+ "resolving_lb=%p helper=%p: pending child policy %p reports "
132
+ "state=%s",
133
+ parent_.get(), this, child_,
134
+ grpc_connectivity_state_name(state));
135
+ }
136
+ if (state != GRPC_CHANNEL_READY) return;
137
+ grpc_pollset_set_del_pollset_set(
138
+ parent_->lb_policy_->interested_parties(),
139
+ parent_->interested_parties());
140
+ parent_->lb_policy_ = std::move(parent_->pending_lb_policy_);
141
+ } else if (!CalledByCurrentChild()) {
142
+ // This request is from an outdated child, so ignore it.
143
+ return;
144
+ }
145
+ parent_->channel_control_helper()->UpdateState(state, std::move(picker));
146
+ }
147
+
148
+ void RequestReresolution() override {
149
+ // If there is a pending child policy, ignore re-resolution requests
150
+ // from the current child policy (or any outdated child).
151
+ if (parent_->pending_lb_policy_ != nullptr && !CalledByPendingChild()) {
152
+ return;
153
+ }
154
+ if (GRPC_TRACE_FLAG_ENABLED(*(parent_->tracer_))) {
155
+ gpr_log(GPR_INFO, "resolving_lb=%p: started name re-resolving",
156
+ parent_.get());
157
+ }
158
+ if (parent_->resolver_ != nullptr) {
159
+ parent_->resolver_->RequestReresolutionLocked();
160
+ }
161
+ }
162
+
163
+ void set_child(LoadBalancingPolicy* child) { child_ = child; }
164
+
165
+ private:
166
+ bool CalledByPendingChild() const {
167
+ GPR_ASSERT(child_ != nullptr);
168
+ return child_ == parent_->pending_lb_policy_.get();
169
+ }
170
+
171
+ bool CalledByCurrentChild() const {
172
+ GPR_ASSERT(child_ != nullptr);
173
+ return child_ == parent_->lb_policy_.get();
174
+ };
175
+
176
+ RefCountedPtr<ResolvingLoadBalancingPolicy> parent_;
177
+ LoadBalancingPolicy* child_ = nullptr;
178
+ };
179
+
180
+ //
181
+ // ResolvingLoadBalancingPolicy
182
+ //
183
+
184
+ ResolvingLoadBalancingPolicy::ResolvingLoadBalancingPolicy(
185
+ Args args, TraceFlag* tracer, UniquePtr<char> target_uri,
186
+ UniquePtr<char> child_policy_name,
187
+ RefCountedPtr<LoadBalancingPolicy::Config> child_lb_config,
188
+ grpc_error** error)
189
+ : LoadBalancingPolicy(std::move(args)),
190
+ tracer_(tracer),
191
+ target_uri_(std::move(target_uri)),
192
+ child_policy_name_(std::move(child_policy_name)),
193
+ child_lb_config_(std::move(child_lb_config)) {
194
+ GPR_ASSERT(child_policy_name_ != nullptr);
195
+ // Don't fetch service config, since this ctor is for use in nested LB
196
+ // policies, not at the top level, and we only fetch the service
197
+ // config at the top level.
198
+ grpc_arg arg = grpc_channel_arg_integer_create(
199
+ const_cast<char*>(GRPC_ARG_SERVICE_CONFIG_DISABLE_RESOLUTION), 0);
200
+ grpc_channel_args* new_args =
201
+ grpc_channel_args_copy_and_add(args.args, &arg, 1);
202
+ *error = Init(*new_args);
203
+ grpc_channel_args_destroy(new_args);
204
+ }
205
+
206
+ ResolvingLoadBalancingPolicy::ResolvingLoadBalancingPolicy(
207
+ Args args, TraceFlag* tracer, UniquePtr<char> target_uri,
208
+ ProcessResolverResultCallback process_resolver_result,
209
+ void* process_resolver_result_user_data, grpc_error** error)
210
+ : LoadBalancingPolicy(std::move(args)),
211
+ tracer_(tracer),
212
+ target_uri_(std::move(target_uri)),
213
+ process_resolver_result_(process_resolver_result),
214
+ process_resolver_result_user_data_(process_resolver_result_user_data) {
215
+ GPR_ASSERT(process_resolver_result != nullptr);
216
+ *error = Init(*args.args);
217
+ }
218
+
219
+ grpc_error* ResolvingLoadBalancingPolicy::Init(const grpc_channel_args& args) {
220
+ resolver_ = ResolverRegistry::CreateResolver(
221
+ target_uri_.get(), &args, interested_parties(), combiner(),
222
+ UniquePtr<Resolver::ResultHandler>(New<ResolverResultHandler>(Ref())));
223
+ if (resolver_ == nullptr) {
224
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING("resolver creation failed");
225
+ }
226
+ // Return our picker to the channel.
227
+ channel_control_helper()->UpdateState(
228
+ GRPC_CHANNEL_IDLE, UniquePtr<SubchannelPicker>(New<QueuePicker>(Ref())));
229
+ return GRPC_ERROR_NONE;
230
+ }
231
+
232
+ ResolvingLoadBalancingPolicy::~ResolvingLoadBalancingPolicy() {
233
+ GPR_ASSERT(resolver_ == nullptr);
234
+ GPR_ASSERT(lb_policy_ == nullptr);
235
+ }
236
+
237
+ void ResolvingLoadBalancingPolicy::ShutdownLocked() {
238
+ if (resolver_ != nullptr) {
239
+ resolver_.reset();
240
+ if (lb_policy_ != nullptr) {
241
+ if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
242
+ gpr_log(GPR_INFO, "resolving_lb=%p: shutting down lb_policy=%p", this,
243
+ lb_policy_.get());
244
+ }
245
+ grpc_pollset_set_del_pollset_set(lb_policy_->interested_parties(),
246
+ interested_parties());
247
+ lb_policy_.reset();
248
+ }
249
+ if (pending_lb_policy_ != nullptr) {
250
+ if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
251
+ gpr_log(GPR_INFO, "resolving_lb=%p: shutting down pending lb_policy=%p",
252
+ this, pending_lb_policy_.get());
253
+ }
254
+ grpc_pollset_set_del_pollset_set(pending_lb_policy_->interested_parties(),
255
+ interested_parties());
256
+ pending_lb_policy_.reset();
257
+ }
258
+ }
259
+ }
260
+
261
+ void ResolvingLoadBalancingPolicy::ExitIdleLocked() {
262
+ if (lb_policy_ != nullptr) {
263
+ lb_policy_->ExitIdleLocked();
264
+ if (pending_lb_policy_ != nullptr) pending_lb_policy_->ExitIdleLocked();
265
+ } else {
266
+ if (!started_resolving_ && resolver_ != nullptr) {
267
+ StartResolvingLocked();
268
+ }
269
+ }
270
+ }
271
+
272
+ void ResolvingLoadBalancingPolicy::ResetBackoffLocked() {
273
+ if (resolver_ != nullptr) {
274
+ resolver_->ResetBackoffLocked();
275
+ resolver_->RequestReresolutionLocked();
276
+ }
277
+ if (lb_policy_ != nullptr) lb_policy_->ResetBackoffLocked();
278
+ if (pending_lb_policy_ != nullptr) pending_lb_policy_->ResetBackoffLocked();
279
+ }
280
+
281
+ void ResolvingLoadBalancingPolicy::StartResolvingLocked() {
282
+ if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
283
+ gpr_log(GPR_INFO, "resolving_lb=%p: starting name resolution", this);
284
+ }
285
+ GPR_ASSERT(!started_resolving_);
286
+ started_resolving_ = true;
287
+ channel_control_helper()->UpdateState(
288
+ GRPC_CHANNEL_CONNECTING,
289
+ UniquePtr<SubchannelPicker>(New<QueuePicker>(Ref())));
290
+ resolver_->StartLocked();
291
+ }
292
+
293
+ void ResolvingLoadBalancingPolicy::OnResolverError(grpc_error* error) {
294
+ if (resolver_ == nullptr) {
295
+ GRPC_ERROR_UNREF(error);
296
+ return;
297
+ }
298
+ if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
299
+ gpr_log(GPR_INFO, "resolving_lb=%p: resolver transient failure: %s", this,
300
+ grpc_error_string(error));
301
+ }
302
+ // If we already have an LB policy from a previous resolution
303
+ // result, then we continue to let it set the connectivity state.
304
+ // Otherwise, we go into TRANSIENT_FAILURE.
305
+ if (lb_policy_ == nullptr) {
306
+ grpc_error* state_error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
307
+ "Resolver transient failure", &error, 1);
308
+ channel_control_helper()->UpdateState(
309
+ GRPC_CHANNEL_TRANSIENT_FAILURE,
310
+ UniquePtr<SubchannelPicker>(New<TransientFailurePicker>(state_error)));
311
+ }
312
+ GRPC_ERROR_UNREF(error);
313
+ }
314
+
315
+ void ResolvingLoadBalancingPolicy::CreateOrUpdateLbPolicyLocked(
316
+ const char* lb_policy_name,
317
+ RefCountedPtr<LoadBalancingPolicy::Config> lb_policy_config,
318
+ Resolver::Result result, TraceStringVector* trace_strings) {
319
+ // If the child policy name changes, we need to create a new child
320
+ // policy. When this happens, we leave child_policy_ as-is and store
321
+ // the new child policy in pending_child_policy_. Once the new child
322
+ // policy transitions into state READY, we swap it into child_policy_,
323
+ // replacing the original child policy. So pending_child_policy_ is
324
+ // non-null only between when we apply an update that changes the child
325
+ // policy name and when the new child reports state READY.
326
+ //
327
+ // Updates can arrive at any point during this transition. We always
328
+ // apply updates relative to the most recently created child policy,
329
+ // even if the most recent one is still in pending_child_policy_. This
330
+ // is true both when applying the updates to an existing child policy
331
+ // and when determining whether we need to create a new policy.
332
+ //
333
+ // As a result of this, there are several cases to consider here:
334
+ //
335
+ // 1. We have no existing child policy (i.e., we have started up but
336
+ // have not yet received a serverlist from the balancer or gone
337
+ // into fallback mode; in this case, both child_policy_ and
338
+ // pending_child_policy_ are null). In this case, we create a
339
+ // new child policy and store it in child_policy_.
340
+ //
341
+ // 2. We have an existing child policy and have no pending child policy
342
+ // from a previous update (i.e., either there has not been a
343
+ // previous update that changed the policy name, or we have already
344
+ // finished swapping in the new policy; in this case, child_policy_
345
+ // is non-null but pending_child_policy_ is null). In this case:
346
+ // a. If child_policy_->name() equals child_policy_name, then we
347
+ // update the existing child policy.
348
+ // b. If child_policy_->name() does not equal child_policy_name,
349
+ // we create a new policy. The policy will be stored in
350
+ // pending_child_policy_ and will later be swapped into
351
+ // child_policy_ by the helper when the new child transitions
352
+ // into state READY.
353
+ //
354
+ // 3. We have an existing child policy and have a pending child policy
355
+ // from a previous update (i.e., a previous update set
356
+ // pending_child_policy_ as per case 2b above and that policy has
357
+ // not yet transitioned into state READY and been swapped into
358
+ // child_policy_; in this case, both child_policy_ and
359
+ // pending_child_policy_ are non-null). In this case:
360
+ // a. If pending_child_policy_->name() equals child_policy_name,
361
+ // then we update the existing pending child policy.
362
+ // b. If pending_child_policy->name() does not equal
363
+ // child_policy_name, then we create a new policy. The new
364
+ // policy is stored in pending_child_policy_ (replacing the one
365
+ // that was there before, which will be immediately shut down)
366
+ // and will later be swapped into child_policy_ by the helper
367
+ // when the new child transitions into state READY.
368
+ const bool create_policy =
369
+ // case 1
370
+ lb_policy_ == nullptr ||
371
+ // case 2b
372
+ (pending_lb_policy_ == nullptr &&
373
+ strcmp(lb_policy_->name(), lb_policy_name) != 0) ||
374
+ // case 3b
375
+ (pending_lb_policy_ != nullptr &&
376
+ strcmp(pending_lb_policy_->name(), lb_policy_name) != 0);
377
+ LoadBalancingPolicy* policy_to_update = nullptr;
378
+ if (create_policy) {
379
+ // Cases 1, 2b, and 3b: create a new child policy.
380
+ // If lb_policy_ is null, we set it (case 1), else we set
381
+ // pending_lb_policy_ (cases 2b and 3b).
382
+ if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
383
+ gpr_log(GPR_INFO, "resolving_lb=%p: Creating new %schild policy %s", this,
384
+ lb_policy_ == nullptr ? "" : "pending ", lb_policy_name);
385
+ }
386
+ auto& lb_policy = lb_policy_ == nullptr ? lb_policy_ : pending_lb_policy_;
387
+ lb_policy =
388
+ CreateLbPolicyLocked(lb_policy_name, *result.args, trace_strings);
389
+ policy_to_update = lb_policy.get();
390
+ } else {
391
+ // Cases 2a and 3a: update an existing policy.
392
+ // If we have a pending child policy, send the update to the pending
393
+ // policy (case 3a), else send it to the current policy (case 2a).
394
+ policy_to_update = pending_lb_policy_ != nullptr ? pending_lb_policy_.get()
395
+ : lb_policy_.get();
396
+ }
397
+ GPR_ASSERT(policy_to_update != nullptr);
398
+ // Update the policy.
399
+ if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
400
+ gpr_log(GPR_INFO, "resolving_lb=%p: Updating %schild policy %p", this,
401
+ policy_to_update == pending_lb_policy_.get() ? "pending " : "",
402
+ policy_to_update);
403
+ }
404
+ UpdateArgs update_args;
405
+ update_args.addresses = std::move(result.addresses);
406
+ update_args.config = std::move(lb_policy_config);
407
+ // TODO(roth): Once channel args is converted to C++, use std::move() here.
408
+ update_args.args = result.args;
409
+ result.args = nullptr;
410
+ policy_to_update->UpdateLocked(std::move(update_args));
411
+ }
412
+
413
+ // Creates a new LB policy.
414
+ // Updates trace_strings to indicate what was done.
415
+ OrphanablePtr<LoadBalancingPolicy>
416
+ ResolvingLoadBalancingPolicy::CreateLbPolicyLocked(
417
+ const char* lb_policy_name, const grpc_channel_args& args,
418
+ TraceStringVector* trace_strings) {
419
+ ResolvingControlHelper* helper = New<ResolvingControlHelper>(Ref());
420
+ LoadBalancingPolicy::Args lb_policy_args;
421
+ lb_policy_args.combiner = combiner();
422
+ lb_policy_args.channel_control_helper =
423
+ UniquePtr<ChannelControlHelper>(helper);
424
+ lb_policy_args.args = &args;
425
+ OrphanablePtr<LoadBalancingPolicy> lb_policy =
426
+ LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
427
+ lb_policy_name, std::move(lb_policy_args));
428
+ if (GPR_UNLIKELY(lb_policy == nullptr)) {
429
+ gpr_log(GPR_ERROR, "could not create LB policy \"%s\"", lb_policy_name);
430
+ char* str;
431
+ gpr_asprintf(&str, "Could not create LB policy \"%s\"", lb_policy_name);
432
+ trace_strings->push_back(str);
433
+ return nullptr;
434
+ }
435
+ helper->set_child(lb_policy.get());
436
+ if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
437
+ gpr_log(GPR_INFO, "resolving_lb=%p: created new LB policy \"%s\" (%p)",
438
+ this, lb_policy_name, lb_policy.get());
439
+ }
440
+ char* str;
441
+ gpr_asprintf(&str, "Created new LB policy \"%s\"", lb_policy_name);
442
+ trace_strings->push_back(str);
443
+ grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(),
444
+ interested_parties());
445
+ return lb_policy;
446
+ }
447
+
448
+ void ResolvingLoadBalancingPolicy::MaybeAddTraceMessagesForAddressChangesLocked(
449
+ bool resolution_contains_addresses, TraceStringVector* trace_strings) {
450
+ if (!resolution_contains_addresses &&
451
+ previous_resolution_contained_addresses_) {
452
+ trace_strings->push_back(gpr_strdup("Address list became empty"));
453
+ } else if (resolution_contains_addresses &&
454
+ !previous_resolution_contained_addresses_) {
455
+ trace_strings->push_back(gpr_strdup("Address list became non-empty"));
456
+ }
457
+ previous_resolution_contained_addresses_ = resolution_contains_addresses;
458
+ }
459
+
460
+ void ResolvingLoadBalancingPolicy::ConcatenateAndAddChannelTraceLocked(
461
+ TraceStringVector* trace_strings) const {
462
+ if (!trace_strings->empty()) {
463
+ gpr_strvec v;
464
+ gpr_strvec_init(&v);
465
+ gpr_strvec_add(&v, gpr_strdup("Resolution event: "));
466
+ bool is_first = 1;
467
+ for (size_t i = 0; i < trace_strings->size(); ++i) {
468
+ if (!is_first) gpr_strvec_add(&v, gpr_strdup(", "));
469
+ is_first = false;
470
+ gpr_strvec_add(&v, (*trace_strings)[i]);
471
+ }
472
+ size_t len = 0;
473
+ UniquePtr<char> message(gpr_strvec_flatten(&v, &len));
474
+ channel_control_helper()->AddTraceEvent(ChannelControlHelper::TRACE_INFO,
475
+ message.get());
476
+ gpr_strvec_destroy(&v);
477
+ }
478
+ }
479
+
480
+ void ResolvingLoadBalancingPolicy::OnResolverResultChangedLocked(
481
+ Resolver::Result result) {
482
+ // Handle race conditions.
483
+ if (resolver_ == nullptr) return;
484
+ if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
485
+ gpr_log(GPR_INFO, "resolving_lb=%p: got resolver result", this);
486
+ }
487
+ // We only want to trace the address resolution in the follow cases:
488
+ // (a) Address resolution resulted in service config change.
489
+ // (b) Address resolution that causes number of backends to go from
490
+ // zero to non-zero.
491
+ // (c) Address resolution that causes number of backends to go from
492
+ // non-zero to zero.
493
+ // (d) Address resolution that causes a new LB policy to be created.
494
+ //
495
+ // We track a list of strings to eventually be concatenated and traced.
496
+ TraceStringVector trace_strings;
497
+ const bool resolution_contains_addresses = result.addresses.size() > 0;
498
+ // Process the resolver result.
499
+ const char* lb_policy_name = nullptr;
500
+ RefCountedPtr<LoadBalancingPolicy::Config> lb_policy_config;
501
+ bool service_config_changed = false;
502
+ char* service_config_error_string = nullptr;
503
+ if (process_resolver_result_ != nullptr) {
504
+ grpc_error* service_config_error = GRPC_ERROR_NONE;
505
+ service_config_changed = process_resolver_result_(
506
+ process_resolver_result_user_data_, result, &lb_policy_name,
507
+ &lb_policy_config, &service_config_error);
508
+ if (service_config_error != GRPC_ERROR_NONE) {
509
+ service_config_error_string =
510
+ gpr_strdup(grpc_error_string(service_config_error));
511
+ if (lb_policy_name == nullptr) {
512
+ // Use an empty lb_policy_name as an indicator that we received an
513
+ // invalid service config and we don't have a fallback service config.
514
+ OnResolverError(service_config_error);
515
+ } else {
516
+ GRPC_ERROR_UNREF(service_config_error);
517
+ }
518
+ }
519
+ } else {
520
+ lb_policy_name = child_policy_name_.get();
521
+ lb_policy_config = child_lb_config_;
522
+ }
523
+ if (lb_policy_name != nullptr) {
524
+ // Create or update LB policy, as needed.
525
+ CreateOrUpdateLbPolicyLocked(lb_policy_name, lb_policy_config,
526
+ std::move(result), &trace_strings);
527
+ }
528
+ // Add channel trace event.
529
+ if (service_config_changed) {
530
+ // TODO(ncteisen): might be worth somehow including a snippet of the
531
+ // config in the trace, at the risk of bloating the trace logs.
532
+ trace_strings.push_back(gpr_strdup("Service config changed"));
533
+ }
534
+ if (service_config_error_string != nullptr) {
535
+ trace_strings.push_back(service_config_error_string);
536
+ service_config_error_string = nullptr;
537
+ }
538
+ MaybeAddTraceMessagesForAddressChangesLocked(resolution_contains_addresses,
539
+ &trace_strings);
540
+ ConcatenateAndAddChannelTraceLocked(&trace_strings);
541
+ }
542
+
543
+ } // namespace grpc_core
@@ -0,0 +1,139 @@
1
+ /*
2
+ *
3
+ * Copyright 2018 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
+
19
+ #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RESOLVING_LB_POLICY_H
20
+ #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RESOLVING_LB_POLICY_H
21
+
22
+ #include <grpc/support/port_platform.h>
23
+
24
+ #include "src/core/ext/filters/client_channel/lb_policy.h"
25
+ #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
26
+ #include "src/core/ext/filters/client_channel/resolver.h"
27
+ #include "src/core/lib/channel/channel_args.h"
28
+ #include "src/core/lib/channel/channel_stack.h"
29
+ #include "src/core/lib/debug/trace.h"
30
+ #include "src/core/lib/gprpp/inlined_vector.h"
31
+ #include "src/core/lib/gprpp/orphanable.h"
32
+ #include "src/core/lib/iomgr/call_combiner.h"
33
+ #include "src/core/lib/iomgr/closure.h"
34
+ #include "src/core/lib/iomgr/polling_entity.h"
35
+ #include "src/core/lib/iomgr/pollset_set.h"
36
+ #include "src/core/lib/transport/connectivity_state.h"
37
+ #include "src/core/lib/transport/metadata_batch.h"
38
+
39
+ namespace grpc_core {
40
+
41
+ // An LB policy that wraps a resolver and a child LB policy to make use
42
+ // of the addresses returned by the resolver.
43
+ //
44
+ // When used in the client_channel code, the resolver will attempt to
45
+ // fetch the service config, and the child LB policy name and config
46
+ // will be determined based on the service config.
47
+ //
48
+ // When used in an LB policy implementation that needs to do another
49
+ // round of resolution before creating a child policy, the resolver does
50
+ // not fetch the service config, and the caller must pre-determine the
51
+ // child LB policy and config to use.
52
+ class ResolvingLoadBalancingPolicy : public LoadBalancingPolicy {
53
+ public:
54
+ // If error is set when this returns, then construction failed, and
55
+ // the caller may not use the new object.
56
+ ResolvingLoadBalancingPolicy(
57
+ Args args, TraceFlag* tracer, UniquePtr<char> target_uri,
58
+ UniquePtr<char> child_policy_name,
59
+ RefCountedPtr<LoadBalancingPolicy::Config> child_lb_config,
60
+ grpc_error** error);
61
+
62
+ // Private ctor, to be used by client_channel only!
63
+ //
64
+ // Synchronous callback that takes the resolver result and sets
65
+ // lb_policy_name and lb_policy_config to point to the right data.
66
+ // Returns true if the service config has changed since the last result.
67
+ // If the returned service_config_error is not none and lb_policy_name is
68
+ // empty, it means that we don't have a valid service config to use, and we
69
+ // should set the channel to be in TRANSIENT_FAILURE.
70
+ typedef bool (*ProcessResolverResultCallback)(
71
+ void* user_data, const Resolver::Result& result,
72
+ const char** lb_policy_name,
73
+ RefCountedPtr<LoadBalancingPolicy::Config>* lb_policy_config,
74
+ grpc_error** service_config_error);
75
+ // If error is set when this returns, then construction failed, and
76
+ // the caller may not use the new object.
77
+ ResolvingLoadBalancingPolicy(
78
+ Args args, TraceFlag* tracer, UniquePtr<char> target_uri,
79
+ ProcessResolverResultCallback process_resolver_result,
80
+ void* process_resolver_result_user_data, grpc_error** error);
81
+
82
+ virtual const char* name() const override { return "resolving_lb"; }
83
+
84
+ // No-op -- should never get updates from the channel.
85
+ // TODO(roth): Need to support updating child LB policy's config for xds
86
+ // use case.
87
+ void UpdateLocked(UpdateArgs args) override {}
88
+
89
+ void ExitIdleLocked() override;
90
+
91
+ void ResetBackoffLocked() override;
92
+
93
+ private:
94
+ using TraceStringVector = InlinedVector<char*, 3>;
95
+
96
+ class ResolverResultHandler;
97
+ class ResolvingControlHelper;
98
+
99
+ ~ResolvingLoadBalancingPolicy();
100
+
101
+ grpc_error* Init(const grpc_channel_args& args);
102
+ void ShutdownLocked() override;
103
+
104
+ void StartResolvingLocked();
105
+ void OnResolverError(grpc_error* error);
106
+ void CreateOrUpdateLbPolicyLocked(
107
+ const char* lb_policy_name,
108
+ RefCountedPtr<LoadBalancingPolicy::Config> lb_policy_config,
109
+ Resolver::Result result, TraceStringVector* trace_strings);
110
+ OrphanablePtr<LoadBalancingPolicy> CreateLbPolicyLocked(
111
+ const char* lb_policy_name, const grpc_channel_args& args,
112
+ TraceStringVector* trace_strings);
113
+ void MaybeAddTraceMessagesForAddressChangesLocked(
114
+ bool resolution_contains_addresses, TraceStringVector* trace_strings);
115
+ void ConcatenateAndAddChannelTraceLocked(
116
+ TraceStringVector* trace_strings) const;
117
+ void OnResolverResultChangedLocked(Resolver::Result result);
118
+
119
+ // Passed in from caller at construction time.
120
+ TraceFlag* tracer_;
121
+ UniquePtr<char> target_uri_;
122
+ ProcessResolverResultCallback process_resolver_result_ = nullptr;
123
+ void* process_resolver_result_user_data_ = nullptr;
124
+ UniquePtr<char> child_policy_name_;
125
+ RefCountedPtr<LoadBalancingPolicy::Config> child_lb_config_;
126
+
127
+ // Resolver and associated state.
128
+ OrphanablePtr<Resolver> resolver_;
129
+ bool started_resolving_ = false;
130
+ bool previous_resolution_contained_addresses_ = false;
131
+
132
+ // Child LB policy.
133
+ OrphanablePtr<LoadBalancingPolicy> lb_policy_;
134
+ OrphanablePtr<LoadBalancingPolicy> pending_lb_policy_;
135
+ };
136
+
137
+ } // namespace grpc_core
138
+
139
+ #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RESOLVING_LB_POLICY_H */