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
@@ -40,14 +40,6 @@ extern grpc_core::TraceFlag grpc_client_channel_trace;
40
40
 
41
41
  extern const grpc_channel_filter grpc_client_channel_filter;
42
42
 
43
- void grpc_client_channel_set_channelz_node(
44
- grpc_channel_element* elem, grpc_core::channelz::ClientChannelNode* node);
45
-
46
- void grpc_client_channel_populate_child_refs(
47
- grpc_channel_element* elem,
48
- grpc_core::channelz::ChildRefsList* child_subchannels,
49
- grpc_core::channelz::ChildRefsList* child_channels);
50
-
51
43
  grpc_connectivity_state grpc_client_channel_check_connectivity_state(
52
44
  grpc_channel_element* elem, int try_to_connect);
53
45
 
@@ -60,7 +52,7 @@ void grpc_client_channel_watch_connectivity_state(
60
52
  grpc_closure* watcher_timer_init);
61
53
 
62
54
  /* Debug helper: pull the subchannel call from a call stack element */
63
- grpc_subchannel_call* grpc_client_channel_get_subchannel_call(
64
- grpc_call_element* elem);
55
+ grpc_core::RefCountedPtr<grpc_core::SubchannelCall>
56
+ grpc_client_channel_get_subchannel_call(grpc_call_element* elem);
65
57
 
66
58
  #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_CLIENT_CHANNEL_H */
@@ -29,96 +29,12 @@
29
29
 
30
30
  namespace grpc_core {
31
31
  namespace channelz {
32
- namespace {
33
32
 
34
- void* client_channel_channelz_copy(void* p) { return p; }
35
-
36
- void client_channel_channelz_destroy(void* p) {}
37
-
38
- int client_channel_channelz_cmp(void* a, void* b) { return GPR_ICMP(a, b); }
39
-
40
- } // namespace
41
-
42
- static const grpc_arg_pointer_vtable client_channel_channelz_vtable = {
43
- client_channel_channelz_copy, client_channel_channelz_destroy,
44
- client_channel_channelz_cmp};
45
-
46
- ClientChannelNode::ClientChannelNode(grpc_channel* channel,
47
- size_t channel_tracer_max_nodes,
48
- bool is_top_level_channel)
49
- : ChannelNode(channel, channel_tracer_max_nodes, is_top_level_channel) {
50
- client_channel_ =
51
- grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel));
52
- grpc_client_channel_set_channelz_node(client_channel_, this);
53
- GPR_ASSERT(client_channel_->filter == &grpc_client_channel_filter);
54
- }
55
-
56
- void ClientChannelNode::PopulateConnectivityState(grpc_json* json) {
57
- grpc_connectivity_state state;
58
- if (ChannelIsDestroyed()) {
59
- state = GRPC_CHANNEL_SHUTDOWN;
60
- } else {
61
- state =
62
- grpc_client_channel_check_connectivity_state(client_channel_, false);
63
- }
64
- json = grpc_json_create_child(nullptr, json, "state", nullptr,
65
- GRPC_JSON_OBJECT, false);
66
- grpc_json_create_child(nullptr, json, "state",
67
- grpc_connectivity_state_name(state), GRPC_JSON_STRING,
68
- false);
69
- }
70
-
71
- void ClientChannelNode::PopulateChildRefs(grpc_json* json) {
72
- ChildRefsList child_subchannels;
73
- ChildRefsList child_channels;
74
- grpc_json* json_iterator = nullptr;
75
- grpc_client_channel_populate_child_refs(client_channel_, &child_subchannels,
76
- &child_channels);
77
- if (!child_subchannels.empty()) {
78
- grpc_json* array_parent = grpc_json_create_child(
79
- nullptr, json, "subchannelRef", nullptr, GRPC_JSON_ARRAY, false);
80
- for (size_t i = 0; i < child_subchannels.size(); ++i) {
81
- json_iterator =
82
- grpc_json_create_child(json_iterator, array_parent, nullptr, nullptr,
83
- GRPC_JSON_OBJECT, false);
84
- grpc_json_add_number_string_child(json_iterator, nullptr, "subchannelId",
85
- child_subchannels[i]);
86
- }
87
- }
88
- if (!child_channels.empty()) {
89
- grpc_json* array_parent = grpc_json_create_child(
90
- nullptr, json, "channelRef", nullptr, GRPC_JSON_ARRAY, false);
91
- json_iterator = nullptr;
92
- for (size_t i = 0; i < child_channels.size(); ++i) {
93
- json_iterator =
94
- grpc_json_create_child(json_iterator, array_parent, nullptr, nullptr,
95
- GRPC_JSON_OBJECT, false);
96
- grpc_json_add_number_string_child(json_iterator, nullptr, "channelId",
97
- child_channels[i]);
98
- }
99
- }
100
- }
101
-
102
- grpc_arg ClientChannelNode::CreateChannelArg() {
103
- return grpc_channel_arg_pointer_create(
104
- const_cast<char*>(GRPC_ARG_CHANNELZ_CHANNEL_NODE_CREATION_FUNC),
105
- reinterpret_cast<void*>(MakeClientChannelNode),
106
- &client_channel_channelz_vtable);
107
- }
108
-
109
- RefCountedPtr<ChannelNode> ClientChannelNode::MakeClientChannelNode(
110
- grpc_channel* channel, size_t channel_tracer_max_nodes,
111
- bool is_top_level_channel) {
112
- return MakeRefCounted<ClientChannelNode>(channel, channel_tracer_max_nodes,
113
- is_top_level_channel);
114
- }
115
-
116
- SubchannelNode::SubchannelNode(grpc_subchannel* subchannel,
33
+ SubchannelNode::SubchannelNode(Subchannel* subchannel,
117
34
  size_t channel_tracer_max_nodes)
118
35
  : BaseNode(EntityType::kSubchannel),
119
36
  subchannel_(subchannel),
120
- target_(
121
- UniquePtr<char>(gpr_strdup(grpc_subchannel_get_target(subchannel_)))),
37
+ target_(UniquePtr<char>(gpr_strdup(subchannel_->GetTargetAddress()))),
122
38
  trace_(channel_tracer_max_nodes) {}
123
39
 
124
40
  SubchannelNode::~SubchannelNode() {}
@@ -128,8 +44,9 @@ void SubchannelNode::PopulateConnectivityState(grpc_json* json) {
128
44
  if (subchannel_ == nullptr) {
129
45
  state = GRPC_CHANNEL_SHUTDOWN;
130
46
  } else {
131
- state = grpc_subchannel_check_connectivity(
132
- subchannel_, nullptr, true /* inhibit_health_checking */);
47
+ state = subchannel_->CheckConnectivityState(
48
+ nullptr /* health_check_service_name */,
49
+ nullptr /* connected_subchannel */);
133
50
  }
134
51
  json = grpc_json_create_child(nullptr, json, "state", nullptr,
135
52
  GRPC_JSON_OBJECT, false);
@@ -170,7 +87,7 @@ grpc_json* SubchannelNode::RenderJson() {
170
87
  call_counter_.PopulateCallCounts(json);
171
88
  json = top_level_json;
172
89
  // populate the child socket.
173
- intptr_t socket_uuid = grpc_subchannel_get_child_socket_uuid(subchannel_);
90
+ intptr_t socket_uuid = subchannel_->GetChildSocketUuid();
174
91
  if (socket_uuid != 0) {
175
92
  grpc_json* array_parent = grpc_json_create_child(
176
93
  nullptr, json, "socketRef", nullptr, GRPC_JSON_ARRAY, false);
@@ -26,40 +26,15 @@
26
26
  #include "src/core/lib/channel/channel_trace.h"
27
27
  #include "src/core/lib/channel/channelz.h"
28
28
 
29
- typedef struct grpc_subchannel grpc_subchannel;
30
-
31
29
  namespace grpc_core {
32
- namespace channelz {
33
-
34
- // Subtype of ChannelNode that overrides and provides client_channel specific
35
- // functionality like querying for connectivity_state and subchannel data.
36
- class ClientChannelNode : public ChannelNode {
37
- public:
38
- static RefCountedPtr<ChannelNode> MakeClientChannelNode(
39
- grpc_channel* channel, size_t channel_tracer_max_nodes,
40
- bool is_top_level_channel);
41
30
 
42
- ClientChannelNode(grpc_channel* channel, size_t channel_tracer_max_nodes,
43
- bool is_top_level_channel);
44
- virtual ~ClientChannelNode() {}
31
+ class Subchannel;
45
32
 
46
- // Overriding template methods from ChannelNode to render information that
47
- // only ClientChannelNode knows about.
48
- void PopulateConnectivityState(grpc_json* json) override;
49
- void PopulateChildRefs(grpc_json* json) override;
50
-
51
- // Helper to create a channel arg to ensure this type of ChannelNode is
52
- // created.
53
- static grpc_arg CreateChannelArg();
54
-
55
- private:
56
- grpc_channel_element* client_channel_;
57
- };
33
+ namespace channelz {
58
34
 
59
- // Handles channelz bookkeeping for sockets
60
35
  class SubchannelNode : public BaseNode {
61
36
  public:
62
- SubchannelNode(grpc_subchannel* subchannel, size_t channel_tracer_max_nodes);
37
+ SubchannelNode(Subchannel* subchannel, size_t channel_tracer_max_nodes);
63
38
  ~SubchannelNode() override;
64
39
 
65
40
  void MarkSubchannelDestroyed() {
@@ -70,11 +45,11 @@ class SubchannelNode : public BaseNode {
70
45
  grpc_json* RenderJson() override;
71
46
 
72
47
  // proxy methods to composed classes.
73
- void AddTraceEvent(ChannelTrace::Severity severity, grpc_slice data) {
48
+ void AddTraceEvent(ChannelTrace::Severity severity, const grpc_slice& data) {
74
49
  trace_.AddTraceEvent(severity, data);
75
50
  }
76
51
  void AddTraceEventWithReference(ChannelTrace::Severity severity,
77
- grpc_slice data,
52
+ const grpc_slice& data,
78
53
  RefCountedPtr<BaseNode> referenced_channel) {
79
54
  trace_.AddTraceEventWithReference(severity, data,
80
55
  std::move(referenced_channel));
@@ -84,12 +59,12 @@ class SubchannelNode : public BaseNode {
84
59
  void RecordCallSucceeded() { call_counter_.RecordCallSucceeded(); }
85
60
 
86
61
  private:
87
- grpc_subchannel* subchannel_;
62
+ void PopulateConnectivityState(grpc_json* json);
63
+
64
+ Subchannel* subchannel_;
88
65
  UniquePtr<char> target_;
89
66
  CallCountingHelper call_counter_;
90
67
  ChannelTrace trace_;
91
-
92
- void PopulateConnectivityState(grpc_json* json);
93
68
  };
94
69
 
95
70
  } // namespace channelz
@@ -21,47 +21,35 @@
21
21
  #include "src/core/ext/filters/client_channel/client_channel_factory.h"
22
22
  #include "src/core/lib/channel/channel_args.h"
23
23
 
24
- void grpc_client_channel_factory_ref(grpc_client_channel_factory* factory) {
25
- factory->vtable->ref(factory);
26
- }
24
+ // Channel arg key for client channel factory.
25
+ #define GRPC_ARG_CLIENT_CHANNEL_FACTORY "grpc.client_channel_factory"
27
26
 
28
- void grpc_client_channel_factory_unref(grpc_client_channel_factory* factory) {
29
- factory->vtable->unref(factory);
30
- }
27
+ namespace grpc_core {
31
28
 
32
- grpc_subchannel* grpc_client_channel_factory_create_subchannel(
33
- grpc_client_channel_factory* factory, const grpc_subchannel_args* args) {
34
- return factory->vtable->create_subchannel(factory, args);
35
- }
29
+ namespace {
36
30
 
37
- grpc_channel* grpc_client_channel_factory_create_channel(
38
- grpc_client_channel_factory* factory, const char* target,
39
- grpc_client_channel_type type, const grpc_channel_args* args) {
40
- return factory->vtable->create_client_channel(factory, target, type, args);
31
+ void* factory_arg_copy(void* f) { return f; }
32
+ void factory_arg_destroy(void* f) {}
33
+ int factory_arg_cmp(void* factory1, void* factory2) {
34
+ return GPR_ICMP(factory1, factory2);
41
35
  }
36
+ const grpc_arg_pointer_vtable factory_arg_vtable = {
37
+ factory_arg_copy, factory_arg_destroy, factory_arg_cmp};
42
38
 
43
- static void* factory_arg_copy(void* factory) {
44
- grpc_client_channel_factory_ref(
45
- static_cast<grpc_client_channel_factory*>(factory));
46
- return factory;
47
- }
39
+ } // namespace
48
40
 
49
- static void factory_arg_destroy(void* factory) {
50
- grpc_client_channel_factory_unref(
51
- static_cast<grpc_client_channel_factory*>(factory));
41
+ grpc_arg ClientChannelFactory::CreateChannelArg(ClientChannelFactory* factory) {
42
+ return grpc_channel_arg_pointer_create(
43
+ const_cast<char*>(GRPC_ARG_CLIENT_CHANNEL_FACTORY), factory,
44
+ &factory_arg_vtable);
52
45
  }
53
46
 
54
- static int factory_arg_cmp(void* factory1, void* factory2) {
55
- if (factory1 < factory2) return -1;
56
- if (factory1 > factory2) return 1;
57
- return 0;
47
+ ClientChannelFactory* ClientChannelFactory::GetFromChannelArgs(
48
+ const grpc_channel_args* args) {
49
+ const grpc_arg* arg =
50
+ grpc_channel_args_find(args, GRPC_ARG_CLIENT_CHANNEL_FACTORY);
51
+ if (arg == nullptr || arg->type != GRPC_ARG_POINTER) return nullptr;
52
+ return static_cast<ClientChannelFactory*>(arg->value.pointer.p);
58
53
  }
59
54
 
60
- static const grpc_arg_pointer_vtable factory_arg_vtable = {
61
- factory_arg_copy, factory_arg_destroy, factory_arg_cmp};
62
-
63
- grpc_arg grpc_client_channel_factory_create_channel_arg(
64
- grpc_client_channel_factory* factory) {
65
- return grpc_channel_arg_pointer_create((char*)GRPC_ARG_CLIENT_CHANNEL_FACTORY,
66
- factory, &factory_arg_vtable);
67
- }
55
+ } // namespace grpc_core
@@ -24,51 +24,32 @@
24
24
  #include <grpc/impl/codegen/grpc_types.h>
25
25
 
26
26
  #include "src/core/ext/filters/client_channel/subchannel.h"
27
- #include "src/core/lib/channel/channel_stack.h"
27
+ #include "src/core/lib/gprpp/abstract.h"
28
28
 
29
- // Channel arg key for client channel factory.
30
- #define GRPC_ARG_CLIENT_CHANNEL_FACTORY "grpc.client_channel_factory"
29
+ namespace grpc_core {
31
30
 
32
- typedef struct grpc_client_channel_factory grpc_client_channel_factory;
33
- typedef struct grpc_client_channel_factory_vtable
34
- grpc_client_channel_factory_vtable;
31
+ class ClientChannelFactory {
32
+ public:
33
+ virtual ~ClientChannelFactory() = default;
35
34
 
36
- typedef enum {
37
- GRPC_CLIENT_CHANNEL_TYPE_REGULAR, /** for the user-level regular calls */
38
- GRPC_CLIENT_CHANNEL_TYPE_LOAD_BALANCING, /** for communication with a load
39
- balancing service */
40
- } grpc_client_channel_type;
35
+ // Creates a subchannel with the specified args.
36
+ virtual Subchannel* CreateSubchannel(const grpc_channel_args* args)
37
+ GRPC_ABSTRACT;
41
38
 
42
- /** Constructor for new configured channels.
43
- Creating decorators around this type is encouraged to adapt behavior. */
44
- struct grpc_client_channel_factory {
45
- const grpc_client_channel_factory_vtable* vtable;
46
- };
47
-
48
- struct grpc_client_channel_factory_vtable {
49
- void (*ref)(grpc_client_channel_factory* factory);
50
- void (*unref)(grpc_client_channel_factory* factory);
51
- grpc_subchannel* (*create_subchannel)(grpc_client_channel_factory* factory,
52
- const grpc_subchannel_args* args);
53
- grpc_channel* (*create_client_channel)(grpc_client_channel_factory* factory,
54
- const char* target,
55
- grpc_client_channel_type type,
56
- const grpc_channel_args* args);
57
- };
39
+ // Creates a channel for the specified target with the specified args.
40
+ virtual grpc_channel* CreateChannel(
41
+ const char* target, const grpc_channel_args* args) GRPC_ABSTRACT;
58
42
 
59
- void grpc_client_channel_factory_ref(grpc_client_channel_factory* factory);
60
- void grpc_client_channel_factory_unref(grpc_client_channel_factory* factory);
43
+ // Returns a channel arg containing the specified factory.
44
+ static grpc_arg CreateChannelArg(ClientChannelFactory* factory);
61
45
 
62
- /** Create a new grpc_subchannel */
63
- grpc_subchannel* grpc_client_channel_factory_create_subchannel(
64
- grpc_client_channel_factory* factory, const grpc_subchannel_args* args);
46
+ // Returns the factory from args, or null if not found.
47
+ static ClientChannelFactory* GetFromChannelArgs(
48
+ const grpc_channel_args* args);
65
49
 
66
- /** Create a new grpc_channel */
67
- grpc_channel* grpc_client_channel_factory_create_channel(
68
- grpc_client_channel_factory* factory, const char* target,
69
- grpc_client_channel_type type, const grpc_channel_args* args);
50
+ GRPC_ABSTRACT_BASE_CLASS
51
+ };
70
52
 
71
- grpc_arg grpc_client_channel_factory_create_channel_arg(
72
- grpc_client_channel_factory* factory);
53
+ } // namespace grpc_core
73
54
 
74
55
  #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_CLIENT_CHANNEL_FACTORY_H */
@@ -24,48 +24,46 @@
24
24
 
25
25
  #include <grpc/support/alloc.h>
26
26
 
27
+ #include "src/core/ext/filters/client_channel/backup_poller.h"
27
28
  #include "src/core/ext/filters/client_channel/client_channel.h"
28
29
  #include "src/core/ext/filters/client_channel/client_channel_channelz.h"
30
+ #include "src/core/ext/filters/client_channel/global_subchannel_pool.h"
29
31
  #include "src/core/ext/filters/client_channel/http_connect_handshaker.h"
30
32
  #include "src/core/ext/filters/client_channel/http_proxy.h"
31
33
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
32
34
  #include "src/core/ext/filters/client_channel/proxy_mapper_registry.h"
33
35
  #include "src/core/ext/filters/client_channel/resolver_registry.h"
36
+ #include "src/core/ext/filters/client_channel/resolver_result_parsing.h"
34
37
  #include "src/core/ext/filters/client_channel/retry_throttle.h"
35
- #include "src/core/ext/filters/client_channel/subchannel_index.h"
36
38
  #include "src/core/lib/surface/channel_init.h"
37
39
 
38
40
  static bool append_filter(grpc_channel_stack_builder* builder, void* arg) {
39
- const grpc_channel_args* args =
40
- grpc_channel_stack_builder_get_channel_arguments(builder);
41
- grpc_arg args_to_add[] = {
42
- grpc_core::channelz::ClientChannelNode::CreateChannelArg()};
43
- grpc_channel_args* new_args = grpc_channel_args_copy_and_add(
44
- args, args_to_add, GPR_ARRAY_SIZE(args_to_add));
45
- grpc_channel_stack_builder_set_channel_arguments(builder, new_args);
46
- grpc_channel_args_destroy(new_args);
47
41
  return grpc_channel_stack_builder_append_filter(
48
42
  builder, static_cast<const grpc_channel_filter*>(arg), nullptr, nullptr);
49
43
  }
50
44
 
51
45
  void grpc_client_channel_init(void) {
46
+ grpc_core::ServiceConfig::Init();
47
+ grpc_core::internal::ClientChannelServiceConfigParser::Register();
52
48
  grpc_core::LoadBalancingPolicyRegistry::Builder::InitRegistry();
53
49
  grpc_core::ResolverRegistry::Builder::InitRegistry();
54
50
  grpc_core::internal::ServerRetryThrottleMap::Init();
55
51
  grpc_proxy_mapper_registry_init();
56
52
  grpc_register_http_proxy_mapper();
57
- grpc_subchannel_index_init();
53
+ grpc_core::GlobalSubchannelPool::Init();
58
54
  grpc_channel_init_register_stage(
59
55
  GRPC_CLIENT_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, append_filter,
60
56
  (void*)&grpc_client_channel_filter);
61
57
  grpc_http_connect_register_handshaker_factory();
58
+ grpc_client_channel_global_init_backup_polling();
62
59
  }
63
60
 
64
61
  void grpc_client_channel_shutdown(void) {
65
- grpc_subchannel_index_shutdown();
62
+ grpc_core::GlobalSubchannelPool::Shutdown();
66
63
  grpc_channel_init_shutdown();
67
64
  grpc_proxy_mapper_registry_shutdown();
68
65
  grpc_core::internal::ServerRetryThrottleMap::Shutdown();
69
66
  grpc_core::ResolverRegistry::Builder::ShutdownRegistry();
70
67
  grpc_core::LoadBalancingPolicyRegistry::Builder::ShutdownRegistry();
68
+ grpc_core::ServiceConfig::Shutdown();
71
69
  }
@@ -0,0 +1,179 @@
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
+ #include <grpc/support/port_platform.h>
20
+
21
+ #include "src/core/ext/filters/client_channel/global_subchannel_pool.h"
22
+
23
+ #include "src/core/ext/filters/client_channel/subchannel.h"
24
+
25
+ namespace grpc_core {
26
+
27
+ GlobalSubchannelPool::GlobalSubchannelPool() {
28
+ subchannel_map_ = grpc_avl_create(&subchannel_avl_vtable_);
29
+ gpr_mu_init(&mu_);
30
+ }
31
+
32
+ GlobalSubchannelPool::~GlobalSubchannelPool() {
33
+ gpr_mu_destroy(&mu_);
34
+ grpc_avl_unref(subchannel_map_, nullptr);
35
+ }
36
+
37
+ void GlobalSubchannelPool::Init() {
38
+ instance_ = New<RefCountedPtr<GlobalSubchannelPool>>(
39
+ MakeRefCounted<GlobalSubchannelPool>());
40
+ }
41
+
42
+ void GlobalSubchannelPool::Shutdown() {
43
+ // To ensure Init() was called before.
44
+ GPR_ASSERT(instance_ != nullptr);
45
+ // To ensure Shutdown() was not called before.
46
+ GPR_ASSERT(*instance_ != nullptr);
47
+ instance_->reset();
48
+ Delete(instance_);
49
+ }
50
+
51
+ RefCountedPtr<GlobalSubchannelPool> GlobalSubchannelPool::instance() {
52
+ GPR_ASSERT(instance_ != nullptr);
53
+ GPR_ASSERT(*instance_ != nullptr);
54
+ return *instance_;
55
+ }
56
+
57
+ Subchannel* GlobalSubchannelPool::RegisterSubchannel(SubchannelKey* key,
58
+ Subchannel* constructed) {
59
+ Subchannel* c = nullptr;
60
+ // Compare and swap (CAS) loop:
61
+ while (c == nullptr) {
62
+ // Ref the shared map to have a local copy.
63
+ gpr_mu_lock(&mu_);
64
+ grpc_avl old_map = grpc_avl_ref(subchannel_map_, nullptr);
65
+ gpr_mu_unlock(&mu_);
66
+ // Check to see if a subchannel already exists.
67
+ c = static_cast<Subchannel*>(grpc_avl_get(old_map, key, nullptr));
68
+ if (c != nullptr) {
69
+ // The subchannel already exists. Try to reuse it.
70
+ c = GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(c, "subchannel_register+reuse");
71
+ if (c != nullptr) {
72
+ GRPC_SUBCHANNEL_UNREF(constructed,
73
+ "subchannel_register+found_existing");
74
+ // Exit the CAS loop without modifying the shared map.
75
+ } // Else, reuse failed, so retry CAS loop.
76
+ } else {
77
+ // There hasn't been such subchannel. Add one.
78
+ // Note that we should ref the old map first because grpc_avl_add() will
79
+ // unref it while we still need to access it later.
80
+ grpc_avl new_map = grpc_avl_add(
81
+ grpc_avl_ref(old_map, nullptr), New<SubchannelKey>(*key),
82
+ GRPC_SUBCHANNEL_WEAK_REF(constructed, "subchannel_register+new"),
83
+ nullptr);
84
+ // Try to publish the change to the shared map. It may happen (but
85
+ // unlikely) that some other thread has changed the shared map, so compare
86
+ // to make sure it's unchanged before swapping. Retry if it's changed.
87
+ gpr_mu_lock(&mu_);
88
+ if (old_map.root == subchannel_map_.root) {
89
+ GPR_SWAP(grpc_avl, new_map, subchannel_map_);
90
+ c = constructed;
91
+ }
92
+ gpr_mu_unlock(&mu_);
93
+ grpc_avl_unref(new_map, nullptr);
94
+ }
95
+ grpc_avl_unref(old_map, nullptr);
96
+ }
97
+ return c;
98
+ }
99
+
100
+ void GlobalSubchannelPool::UnregisterSubchannel(SubchannelKey* key) {
101
+ bool done = false;
102
+ // Compare and swap (CAS) loop:
103
+ while (!done) {
104
+ // Ref the shared map to have a local copy.
105
+ gpr_mu_lock(&mu_);
106
+ grpc_avl old_map = grpc_avl_ref(subchannel_map_, nullptr);
107
+ gpr_mu_unlock(&mu_);
108
+ // Remove the subchannel.
109
+ // Note that we should ref the old map first because grpc_avl_remove() will
110
+ // unref it while we still need to access it later.
111
+ grpc_avl new_map =
112
+ grpc_avl_remove(grpc_avl_ref(old_map, nullptr), key, nullptr);
113
+ // Try to publish the change to the shared map. It may happen (but
114
+ // unlikely) that some other thread has changed the shared map, so compare
115
+ // to make sure it's unchanged before swapping. Retry if it's changed.
116
+ gpr_mu_lock(&mu_);
117
+ if (old_map.root == subchannel_map_.root) {
118
+ GPR_SWAP(grpc_avl, new_map, subchannel_map_);
119
+ done = true;
120
+ }
121
+ gpr_mu_unlock(&mu_);
122
+ grpc_avl_unref(new_map, nullptr);
123
+ grpc_avl_unref(old_map, nullptr);
124
+ }
125
+ }
126
+
127
+ Subchannel* GlobalSubchannelPool::FindSubchannel(SubchannelKey* key) {
128
+ // Lock, and take a reference to the subchannel map.
129
+ // We don't need to do the search under a lock as AVL's are immutable.
130
+ gpr_mu_lock(&mu_);
131
+ grpc_avl index = grpc_avl_ref(subchannel_map_, nullptr);
132
+ gpr_mu_unlock(&mu_);
133
+ Subchannel* c = static_cast<Subchannel*>(grpc_avl_get(index, key, nullptr));
134
+ if (c != nullptr) c = GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(c, "found_from_pool");
135
+ grpc_avl_unref(index, nullptr);
136
+ return c;
137
+ }
138
+
139
+ RefCountedPtr<GlobalSubchannelPool>* GlobalSubchannelPool::instance_ = nullptr;
140
+
141
+ namespace {
142
+
143
+ void sck_avl_destroy(void* p, void* user_data) {
144
+ SubchannelKey* key = static_cast<SubchannelKey*>(p);
145
+ Delete(key);
146
+ }
147
+
148
+ void* sck_avl_copy(void* p, void* unused) {
149
+ const SubchannelKey* key = static_cast<const SubchannelKey*>(p);
150
+ auto* new_key = New<SubchannelKey>(*key);
151
+ return static_cast<void*>(new_key);
152
+ }
153
+
154
+ long sck_avl_compare(void* a, void* b, void* unused) {
155
+ const SubchannelKey* key_a = static_cast<const SubchannelKey*>(a);
156
+ const SubchannelKey* key_b = static_cast<const SubchannelKey*>(b);
157
+ return key_a->Cmp(*key_b);
158
+ }
159
+
160
+ void scv_avl_destroy(void* p, void* user_data) {
161
+ GRPC_SUBCHANNEL_WEAK_UNREF((Subchannel*)p, "global_subchannel_pool");
162
+ }
163
+
164
+ void* scv_avl_copy(void* p, void* unused) {
165
+ GRPC_SUBCHANNEL_WEAK_REF((Subchannel*)p, "global_subchannel_pool");
166
+ return p;
167
+ }
168
+
169
+ } // namespace
170
+
171
+ const grpc_avl_vtable GlobalSubchannelPool::subchannel_avl_vtable_ = {
172
+ sck_avl_destroy, // destroy_key
173
+ sck_avl_copy, // copy_key
174
+ sck_avl_compare, // compare_keys
175
+ scv_avl_destroy, // destroy_value
176
+ scv_avl_copy // copy_value
177
+ };
178
+
179
+ } // namespace grpc_core
@@ -0,0 +1,68 @@
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_GLOBAL_SUBCHANNEL_POOL_H
20
+ #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_GLOBAL_SUBCHANNEL_POOL_H
21
+
22
+ #include <grpc/support/port_platform.h>
23
+
24
+ #include "src/core/ext/filters/client_channel/subchannel_pool_interface.h"
25
+
26
+ namespace grpc_core {
27
+
28
+ // The global subchannel pool. It shares subchannels among channels. There
29
+ // should be only one instance of this class. Init() should be called once at
30
+ // the filter initialization time; Shutdown() should be called once at the
31
+ // filter shutdown time.
32
+ // TODO(juanlishen): Enable subchannel retention.
33
+ class GlobalSubchannelPool final : public SubchannelPoolInterface {
34
+ public:
35
+ // The ctor and dtor are not intended to use directly.
36
+ GlobalSubchannelPool();
37
+ ~GlobalSubchannelPool() override;
38
+
39
+ // Should be called exactly once at filter initialization time.
40
+ static void Init();
41
+ // Should be called exactly once at filter shutdown time.
42
+ static void Shutdown();
43
+
44
+ // Gets the singleton instance.
45
+ static RefCountedPtr<GlobalSubchannelPool> instance();
46
+
47
+ // Implements interface methods.
48
+ Subchannel* RegisterSubchannel(SubchannelKey* key,
49
+ Subchannel* constructed) override;
50
+ void UnregisterSubchannel(SubchannelKey* key) override;
51
+ Subchannel* FindSubchannel(SubchannelKey* key) override;
52
+
53
+ private:
54
+ // The singleton instance. (It's a pointer to RefCountedPtr so that this
55
+ // non-local static object can be trivially destructible.)
56
+ static RefCountedPtr<GlobalSubchannelPool>* instance_;
57
+
58
+ // The vtable for subchannel operations in an AVL tree.
59
+ static const grpc_avl_vtable subchannel_avl_vtable_;
60
+ // A map from subchannel key to subchannel.
61
+ grpc_avl subchannel_map_;
62
+ // To protect subchannel_map_.
63
+ gpr_mu mu_;
64
+ };
65
+
66
+ } // namespace grpc_core
67
+
68
+ #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_GLOBAL_SUBCHANNEL_POOL_H */