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
@@ -23,72 +23,69 @@
23
23
 
24
24
  #include "src/core/ext/filters/client_channel/client_channel_channelz.h"
25
25
  #include "src/core/ext/filters/client_channel/connector.h"
26
+ #include "src/core/ext/filters/client_channel/subchannel_interface.h"
27
+ #include "src/core/ext/filters/client_channel/subchannel_pool_interface.h"
28
+ #include "src/core/lib/backoff/backoff.h"
26
29
  #include "src/core/lib/channel/channel_stack.h"
27
- #include "src/core/lib/gpr/arena.h"
30
+ #include "src/core/lib/gprpp/arena.h"
31
+ #include "src/core/lib/gprpp/map.h"
28
32
  #include "src/core/lib/gprpp/ref_counted.h"
29
33
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
34
+ #include "src/core/lib/gprpp/sync.h"
30
35
  #include "src/core/lib/iomgr/polling_entity.h"
36
+ #include "src/core/lib/iomgr/timer.h"
31
37
  #include "src/core/lib/transport/connectivity_state.h"
32
38
  #include "src/core/lib/transport/metadata.h"
33
39
 
34
40
  // Channel arg containing a grpc_resolved_address to connect to.
35
41
  #define GRPC_ARG_SUBCHANNEL_ADDRESS "grpc.subchannel_address"
36
42
 
37
- /** A (sub-)channel that knows how to connect to exactly one target
38
- address. Provides a target for load balancing. */
39
- typedef struct grpc_subchannel grpc_subchannel;
40
- typedef struct grpc_subchannel_call grpc_subchannel_call;
41
- typedef struct grpc_subchannel_args grpc_subchannel_args;
42
- typedef struct grpc_subchannel_key grpc_subchannel_key;
43
-
43
+ // For debugging refcounting.
44
44
  #ifndef NDEBUG
45
- #define GRPC_SUBCHANNEL_REF(p, r) \
46
- grpc_subchannel_ref((p), __FILE__, __LINE__, (r))
45
+ #define GRPC_SUBCHANNEL_REF(p, r) (p)->Ref(__FILE__, __LINE__, (r))
47
46
  #define GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(p, r) \
48
- grpc_subchannel_ref_from_weak_ref((p), __FILE__, __LINE__, (r))
49
- #define GRPC_SUBCHANNEL_UNREF(p, r) \
50
- grpc_subchannel_unref((p), __FILE__, __LINE__, (r))
51
- #define GRPC_SUBCHANNEL_WEAK_REF(p, r) \
52
- grpc_subchannel_weak_ref((p), __FILE__, __LINE__, (r))
53
- #define GRPC_SUBCHANNEL_WEAK_UNREF(p, r) \
54
- grpc_subchannel_weak_unref((p), __FILE__, __LINE__, (r))
55
- #define GRPC_SUBCHANNEL_CALL_REF(p, r) \
56
- grpc_subchannel_call_ref((p), __FILE__, __LINE__, (r))
57
- #define GRPC_SUBCHANNEL_CALL_UNREF(p, r) \
58
- grpc_subchannel_call_unref((p), __FILE__, __LINE__, (r))
47
+ (p)->RefFromWeakRef(__FILE__, __LINE__, (r))
48
+ #define GRPC_SUBCHANNEL_UNREF(p, r) (p)->Unref(__FILE__, __LINE__, (r))
49
+ #define GRPC_SUBCHANNEL_WEAK_REF(p, r) (p)->WeakRef(__FILE__, __LINE__, (r))
50
+ #define GRPC_SUBCHANNEL_WEAK_UNREF(p, r) (p)->WeakUnref(__FILE__, __LINE__, (r))
59
51
  #define GRPC_SUBCHANNEL_REF_EXTRA_ARGS \
60
- , const char *file, int line, const char *reason
52
+ const char *file, int line, const char *reason
53
+ #define GRPC_SUBCHANNEL_REF_REASON reason
54
+ #define GRPC_SUBCHANNEL_REF_MUTATE_EXTRA_ARGS \
55
+ , GRPC_SUBCHANNEL_REF_EXTRA_ARGS, const char* purpose
56
+ #define GRPC_SUBCHANNEL_REF_MUTATE_PURPOSE(x) , file, line, reason, x
61
57
  #else
62
- #define GRPC_SUBCHANNEL_REF(p, r) grpc_subchannel_ref((p))
63
- #define GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(p, r) \
64
- grpc_subchannel_ref_from_weak_ref((p))
65
- #define GRPC_SUBCHANNEL_UNREF(p, r) grpc_subchannel_unref((p))
66
- #define GRPC_SUBCHANNEL_WEAK_REF(p, r) grpc_subchannel_weak_ref((p))
67
- #define GRPC_SUBCHANNEL_WEAK_UNREF(p, r) grpc_subchannel_weak_unref((p))
68
- #define GRPC_SUBCHANNEL_CALL_REF(p, r) grpc_subchannel_call_ref((p))
69
- #define GRPC_SUBCHANNEL_CALL_UNREF(p, r) grpc_subchannel_call_unref((p))
58
+ #define GRPC_SUBCHANNEL_REF(p, r) (p)->Ref()
59
+ #define GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(p, r) (p)->RefFromWeakRef()
60
+ #define GRPC_SUBCHANNEL_UNREF(p, r) (p)->Unref()
61
+ #define GRPC_SUBCHANNEL_WEAK_REF(p, r) (p)->WeakRef()
62
+ #define GRPC_SUBCHANNEL_WEAK_UNREF(p, r) (p)->WeakUnref()
70
63
  #define GRPC_SUBCHANNEL_REF_EXTRA_ARGS
64
+ #define GRPC_SUBCHANNEL_REF_REASON ""
65
+ #define GRPC_SUBCHANNEL_REF_MUTATE_EXTRA_ARGS
66
+ #define GRPC_SUBCHANNEL_REF_MUTATE_PURPOSE(x)
71
67
  #endif
72
68
 
73
69
  namespace grpc_core {
74
70
 
75
- class ConnectedSubchannel : public RefCounted<ConnectedSubchannel> {
71
+ class SubchannelCall;
72
+
73
+ class ConnectedSubchannel : public ConnectedSubchannelInterface {
76
74
  public:
77
75
  struct CallArgs {
78
76
  grpc_polling_entity* pollent;
79
77
  grpc_slice path;
80
78
  gpr_timespec start_time;
81
79
  grpc_millis deadline;
82
- gpr_arena* arena;
80
+ Arena* arena;
83
81
  grpc_call_context_element* context;
84
- grpc_call_combiner* call_combiner;
82
+ CallCombiner* call_combiner;
85
83
  size_t parent_data_size;
86
84
  };
87
85
 
88
86
  ConnectedSubchannel(
89
87
  grpc_channel_stack* channel_stack, const grpc_channel_args* args,
90
- grpc_core::RefCountedPtr<grpc_core::channelz::SubchannelNode>
91
- channelz_subchannel,
88
+ RefCountedPtr<channelz::SubchannelNode> channelz_subchannel,
92
89
  intptr_t socket_uuid);
93
90
  ~ConnectedSubchannel();
94
91
 
@@ -96,10 +93,11 @@ class ConnectedSubchannel : public RefCounted<ConnectedSubchannel> {
96
93
  grpc_connectivity_state* state,
97
94
  grpc_closure* closure);
98
95
  void Ping(grpc_closure* on_initiate, grpc_closure* on_ack);
99
- grpc_error* CreateCall(const CallArgs& args, grpc_subchannel_call** call);
96
+ RefCountedPtr<SubchannelCall> CreateCall(const CallArgs& args,
97
+ grpc_error** error);
100
98
 
101
99
  grpc_channel_stack* channel_stack() const { return channel_stack_; }
102
- const grpc_channel_args* args() const { return args_; }
100
+ const grpc_channel_args* args() const override { return args_; }
103
101
  channelz::SubchannelNode* channelz_subchannel() const {
104
102
  return channelz_subchannel_.get();
105
103
  }
@@ -112,107 +110,276 @@ class ConnectedSubchannel : public RefCounted<ConnectedSubchannel> {
112
110
  grpc_channel_args* args_;
113
111
  // ref counted pointer to the channelz node in this connected subchannel's
114
112
  // owning subchannel.
115
- grpc_core::RefCountedPtr<grpc_core::channelz::SubchannelNode>
116
- channelz_subchannel_;
113
+ RefCountedPtr<channelz::SubchannelNode> channelz_subchannel_;
117
114
  // uuid of this subchannel's socket. 0 if this subchannel is not connected.
118
115
  const intptr_t socket_uuid_;
119
116
  };
120
117
 
121
- } // namespace grpc_core
118
+ // Implements the interface of RefCounted<>.
119
+ class SubchannelCall {
120
+ public:
121
+ SubchannelCall(RefCountedPtr<ConnectedSubchannel> connected_subchannel,
122
+ const ConnectedSubchannel::CallArgs& args)
123
+ : connected_subchannel_(std::move(connected_subchannel)),
124
+ deadline_(args.deadline) {}
125
+
126
+ // Continues processing a transport stream op batch.
127
+ void StartTransportStreamOpBatch(grpc_transport_stream_op_batch* batch);
128
+
129
+ // Returns a pointer to the parent data associated with the subchannel call.
130
+ // The data will be of the size specified in \a parent_data_size field of
131
+ // the args passed to \a ConnectedSubchannel::CreateCall().
132
+ void* GetParentData();
122
133
 
123
- grpc_subchannel* grpc_subchannel_ref(
124
- grpc_subchannel* channel GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
125
- grpc_subchannel* grpc_subchannel_ref_from_weak_ref(
126
- grpc_subchannel* channel GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
127
- void grpc_subchannel_unref(
128
- grpc_subchannel* channel GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
129
- grpc_subchannel* grpc_subchannel_weak_ref(
130
- grpc_subchannel* channel GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
131
- void grpc_subchannel_weak_unref(
132
- grpc_subchannel* channel GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
133
- grpc_subchannel_call* grpc_subchannel_call_ref(
134
- grpc_subchannel_call* call GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
135
- void grpc_subchannel_call_unref(
136
- grpc_subchannel_call* call GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
137
-
138
- grpc_core::channelz::SubchannelNode* grpc_subchannel_get_channelz_node(
139
- grpc_subchannel* subchannel);
140
-
141
- intptr_t grpc_subchannel_get_child_socket_uuid(grpc_subchannel* subchannel);
142
-
143
- /** Returns a pointer to the parent data associated with \a subchannel_call.
144
- The data will be of the size specified in \a parent_data_size
145
- field of the args passed to \a grpc_connected_subchannel_create_call(). */
146
- void* grpc_connected_subchannel_call_get_parent_data(
147
- grpc_subchannel_call* subchannel_call);
148
-
149
- /** poll the current connectivity state of a channel */
150
- grpc_connectivity_state grpc_subchannel_check_connectivity(
151
- grpc_subchannel* channel, grpc_error** error, bool inhibit_health_checking);
152
-
153
- /** Calls notify when the connectivity state of a channel becomes different
154
- from *state. Updates *state with the new state of the channel. */
155
- void grpc_subchannel_notify_on_state_change(
156
- grpc_subchannel* channel, grpc_pollset_set* interested_parties,
157
- grpc_connectivity_state* state, grpc_closure* notify,
158
- bool inhibit_health_checks);
159
-
160
- /** retrieve the grpc_core::ConnectedSubchannel - or nullptr if not connected
161
- * (which may happen before it initially connects or during transient failures)
162
- * */
163
- grpc_core::RefCountedPtr<grpc_core::ConnectedSubchannel>
164
- grpc_subchannel_get_connected_subchannel(grpc_subchannel* c);
165
-
166
- /** return the subchannel index key for \a subchannel */
167
- const grpc_subchannel_key* grpc_subchannel_get_key(
168
- const grpc_subchannel* subchannel);
169
-
170
- // Resets the connection backoff of the subchannel.
171
- // TODO(roth): Move connection backoff out of subchannels and up into LB
172
- // policy code (probably by adding a SubchannelGroup between
173
- // SubchannelList and SubchannelData), at which point this method can
174
- // go away.
175
- void grpc_subchannel_reset_backoff(grpc_subchannel* subchannel);
176
-
177
- /** continue processing a transport op */
178
- void grpc_subchannel_call_process_op(grpc_subchannel_call* subchannel_call,
179
- grpc_transport_stream_op_batch* op);
180
-
181
- /** Must be called once per call. Sets the 'then_schedule_closure' argument for
182
- call stack destruction. */
183
- void grpc_subchannel_call_set_cleanup_closure(
184
- grpc_subchannel_call* subchannel_call, grpc_closure* closure);
185
-
186
- grpc_call_stack* grpc_subchannel_call_get_call_stack(
187
- grpc_subchannel_call* subchannel_call);
188
-
189
- struct grpc_subchannel_args {
190
- /* When updating this struct, also update subchannel_index.c */
191
-
192
- /** Channel filters for this channel - wrapped factories will likely
193
- want to mutate this */
194
- const grpc_channel_filter** filters;
195
- /** The number of filters in the above array */
196
- size_t filter_count;
197
- /** Channel arguments to be supplied to the newly created channel */
198
- const grpc_channel_args* args;
134
+ // Returns the call stack of the subchannel call.
135
+ grpc_call_stack* GetCallStack();
136
+
137
+ // Sets the 'then_schedule_closure' argument for call stack destruction.
138
+ // Must be called once per call.
139
+ void SetAfterCallStackDestroy(grpc_closure* closure);
140
+
141
+ // Interface of RefCounted<>.
142
+ RefCountedPtr<SubchannelCall> Ref() GRPC_MUST_USE_RESULT;
143
+ RefCountedPtr<SubchannelCall> Ref(const DebugLocation& location,
144
+ const char* reason) GRPC_MUST_USE_RESULT;
145
+ // When refcount drops to 0, destroys itself and the associated call stack,
146
+ // but does NOT free the memory because it's in the call arena.
147
+ void Unref();
148
+ void Unref(const DebugLocation& location, const char* reason);
149
+
150
+ static void Destroy(void* arg, grpc_error* error);
151
+
152
+ private:
153
+ // Allow RefCountedPtr<> to access IncrementRefCount().
154
+ template <typename T>
155
+ friend class RefCountedPtr;
156
+
157
+ // If channelz is enabled, intercepts recv_trailing so that we may check the
158
+ // status and associate it to a subchannel.
159
+ void MaybeInterceptRecvTrailingMetadata(
160
+ grpc_transport_stream_op_batch* batch);
161
+
162
+ static void RecvTrailingMetadataReady(void* arg, grpc_error* error);
163
+
164
+ // Interface of RefCounted<>.
165
+ void IncrementRefCount();
166
+ void IncrementRefCount(const DebugLocation& location, const char* reason);
167
+
168
+ RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
169
+ grpc_closure* after_call_stack_destroy_ = nullptr;
170
+ // State needed to support channelz interception of recv trailing metadata.
171
+ grpc_closure recv_trailing_metadata_ready_;
172
+ grpc_closure* original_recv_trailing_metadata_ = nullptr;
173
+ grpc_metadata_batch* recv_trailing_metadata_ = nullptr;
174
+ grpc_millis deadline_;
199
175
  };
200
176
 
201
- /** create a subchannel given a connector */
202
- grpc_subchannel* grpc_subchannel_create(grpc_connector* connector,
203
- const grpc_subchannel_args* args);
177
+ // A subchannel that knows how to connect to exactly one target address. It
178
+ // provides a target for load balancing.
179
+ class Subchannel {
180
+ public:
181
+ typedef SubchannelInterface::ConnectivityStateWatcher
182
+ ConnectivityStateWatcher;
183
+
184
+ // The ctor and dtor are not intended to use directly.
185
+ Subchannel(SubchannelKey* key, grpc_connector* connector,
186
+ const grpc_channel_args* args);
187
+ ~Subchannel();
188
+
189
+ // Creates a subchannel given \a connector and \a args.
190
+ static Subchannel* Create(grpc_connector* connector,
191
+ const grpc_channel_args* args);
192
+
193
+ // Strong and weak refcounting.
194
+ Subchannel* Ref(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
195
+ void Unref(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
196
+ Subchannel* WeakRef(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
197
+ void WeakUnref(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
198
+ // Attempts to return a strong ref when only the weak refcount is guaranteed
199
+ // non-zero. If the strong refcount is zero, does not alter the refcount and
200
+ // returns null.
201
+ Subchannel* RefFromWeakRef(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
202
+
203
+ intptr_t GetChildSocketUuid();
204
+
205
+ // Gets the string representing the subchannel address.
206
+ // Caller doesn't take ownership.
207
+ const char* GetTargetAddress();
208
+
209
+ channelz::SubchannelNode* channelz_node();
210
+
211
+ // Returns the current connectivity state of the subchannel.
212
+ // If health_check_service_name is non-null, the returned connectivity
213
+ // state will be based on the state reported by the backend for that
214
+ // service name.
215
+ // If the return value is GRPC_CHANNEL_READY, also sets *connected_subchannel.
216
+ grpc_connectivity_state CheckConnectivityState(
217
+ const char* health_check_service_name,
218
+ RefCountedPtr<ConnectedSubchannel>* connected_subchannel);
219
+
220
+ // Starts watching the subchannel's connectivity state.
221
+ // The first callback to the watcher will be delivered when the
222
+ // subchannel's connectivity state becomes a value other than
223
+ // initial_state, which may happen immediately.
224
+ // Subsequent callbacks will be delivered as the subchannel's state
225
+ // changes.
226
+ // The watcher will be destroyed either when the subchannel is
227
+ // destroyed or when CancelConnectivityStateWatch() is called.
228
+ void WatchConnectivityState(grpc_connectivity_state initial_state,
229
+ UniquePtr<char> health_check_service_name,
230
+ UniquePtr<ConnectivityStateWatcher> watcher);
231
+
232
+ // Cancels a connectivity state watch.
233
+ // If the watcher has already been destroyed, this is a no-op.
234
+ void CancelConnectivityStateWatch(const char* health_check_service_name,
235
+ ConnectivityStateWatcher* watcher);
236
+
237
+ // Attempt to connect to the backend. Has no effect if already connected.
238
+ void AttemptToConnect();
239
+
240
+ // Resets the connection backoff of the subchannel.
241
+ // TODO(roth): Move connection backoff out of subchannels and up into LB
242
+ // policy code (probably by adding a SubchannelGroup between
243
+ // SubchannelList and SubchannelData), at which point this method can
244
+ // go away.
245
+ void ResetBackoff();
246
+
247
+ // Returns a new channel arg encoding the subchannel address as a URI
248
+ // string. Caller is responsible for freeing the string.
249
+ static grpc_arg CreateSubchannelAddressArg(const grpc_resolved_address* addr);
250
+
251
+ // Returns the URI string from the subchannel address arg in \a args.
252
+ static const char* GetUriFromSubchannelAddressArg(
253
+ const grpc_channel_args* args);
254
+
255
+ // Sets \a addr from the subchannel address arg in \a args.
256
+ static void GetAddressFromSubchannelAddressArg(const grpc_channel_args* args,
257
+ grpc_resolved_address* addr);
258
+
259
+ private:
260
+ // A linked list of ConnectivityStateWatchers that are monitoring the
261
+ // subchannel's state.
262
+ class ConnectivityStateWatcherList {
263
+ public:
264
+ ~ConnectivityStateWatcherList() { Clear(); }
265
+
266
+ void AddWatcherLocked(UniquePtr<ConnectivityStateWatcher> watcher);
267
+ void RemoveWatcherLocked(ConnectivityStateWatcher* watcher);
268
+
269
+ // Notifies all watchers in the list about a change to state.
270
+ void NotifyLocked(Subchannel* subchannel, grpc_connectivity_state state);
271
+
272
+ void Clear() { watchers_.clear(); }
273
+
274
+ bool empty() const { return watchers_.empty(); }
275
+
276
+ private:
277
+ // TODO(roth): This could be a set instead of a map if we had a set
278
+ // implementation.
279
+ Map<ConnectivityStateWatcher*, UniquePtr<ConnectivityStateWatcher>>
280
+ watchers_;
281
+ };
204
282
 
205
- /// Sets \a addr from \a args.
206
- void grpc_get_subchannel_address_arg(const grpc_channel_args* args,
207
- grpc_resolved_address* addr);
283
+ // A map that tracks ConnectivityStateWatchers using a particular health
284
+ // check service name.
285
+ //
286
+ // There is one entry in the map for each health check service name.
287
+ // Entries exist only as long as there are watchers using the
288
+ // corresponding service name.
289
+ //
290
+ // A health check client is maintained only while the subchannel is in
291
+ // state READY.
292
+ class HealthWatcherMap {
293
+ public:
294
+ void AddWatcherLocked(Subchannel* subchannel,
295
+ grpc_connectivity_state initial_state,
296
+ UniquePtr<char> health_check_service_name,
297
+ UniquePtr<ConnectivityStateWatcher> watcher);
298
+ void RemoveWatcherLocked(const char* health_check_service_name,
299
+ ConnectivityStateWatcher* watcher);
300
+
301
+ // Notifies the watcher when the subchannel's state changes.
302
+ void NotifyLocked(grpc_connectivity_state state);
303
+
304
+ grpc_connectivity_state CheckConnectivityStateLocked(
305
+ Subchannel* subchannel, const char* health_check_service_name);
306
+
307
+ void ShutdownLocked();
308
+
309
+ private:
310
+ class HealthWatcher;
311
+
312
+ Map<const char*, OrphanablePtr<HealthWatcher>, StringLess> map_;
313
+ };
314
+
315
+ class ConnectedSubchannelStateWatcher;
208
316
 
209
- const char* grpc_subchannel_get_target(grpc_subchannel* subchannel);
317
+ // Sets the subchannel's connectivity state to \a state.
318
+ void SetConnectivityStateLocked(grpc_connectivity_state state);
210
319
 
211
- /// Returns the URI string for the address to connect to.
212
- const char* grpc_get_subchannel_address_uri_arg(const grpc_channel_args* args);
320
+ // Methods for connection.
321
+ void MaybeStartConnectingLocked();
322
+ static void OnRetryAlarm(void* arg, grpc_error* error);
323
+ void ContinueConnectingLocked();
324
+ static void OnConnectingFinished(void* arg, grpc_error* error);
325
+ bool PublishTransportLocked();
326
+ void Disconnect();
213
327
 
214
- /// Returns a new channel arg encoding the subchannel address as a string.
215
- /// Caller is responsible for freeing the string.
216
- grpc_arg grpc_create_subchannel_address_arg(const grpc_resolved_address* addr);
328
+ gpr_atm RefMutate(gpr_atm delta,
329
+ int barrier GRPC_SUBCHANNEL_REF_MUTATE_EXTRA_ARGS);
330
+
331
+ // The subchannel pool this subchannel is in.
332
+ RefCountedPtr<SubchannelPoolInterface> subchannel_pool_;
333
+ // TODO(juanlishen): Consider using args_ as key_ directly.
334
+ // Subchannel key that identifies this subchannel in the subchannel pool.
335
+ SubchannelKey* key_;
336
+ // Channel args.
337
+ grpc_channel_args* args_;
338
+ // pollset_set tracking who's interested in a connection being setup.
339
+ grpc_pollset_set* pollset_set_;
340
+ // Protects the other members.
341
+ Mutex mu_;
342
+ // Refcount
343
+ // - lower INTERNAL_REF_BITS bits are for internal references:
344
+ // these do not keep the subchannel open.
345
+ // - upper remaining bits are for public references: these do
346
+ // keep the subchannel open
347
+ gpr_atm ref_pair_;
348
+
349
+ // Connection states.
350
+ grpc_connector* connector_ = nullptr;
351
+ // Set during connection.
352
+ grpc_connect_out_args connecting_result_;
353
+ grpc_closure on_connecting_finished_;
354
+ // Active connection, or null.
355
+ RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
356
+ bool connecting_ = false;
357
+ bool disconnected_ = false;
358
+
359
+ // Connectivity state tracking.
360
+ grpc_connectivity_state state_ = GRPC_CHANNEL_IDLE;
361
+ // The list of watchers without a health check service name.
362
+ ConnectivityStateWatcherList watcher_list_;
363
+ // The map of watchers with health check service names.
364
+ HealthWatcherMap health_watcher_map_;
365
+
366
+ // Backoff state.
367
+ BackOff backoff_;
368
+ grpc_millis next_attempt_deadline_;
369
+ grpc_millis min_connect_timeout_ms_;
370
+ bool backoff_begun_ = false;
371
+
372
+ // Retry alarm.
373
+ grpc_timer retry_alarm_;
374
+ grpc_closure on_retry_alarm_;
375
+ bool have_retry_alarm_ = false;
376
+ // reset_backoff() was called while alarm was pending.
377
+ bool retry_immediately_ = false;
378
+
379
+ // Channelz tracking.
380
+ RefCountedPtr<channelz::SubchannelNode> channelz_node_;
381
+ };
382
+
383
+ } // namespace grpc_core
217
384
 
218
385
  #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_SUBCHANNEL_H */
@@ -0,0 +1,113 @@
1
+ /*
2
+ *
3
+ * Copyright 2019 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+
19
+ #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_SUBCHANNEL_INTERFACE_H
20
+ #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_SUBCHANNEL_INTERFACE_H
21
+
22
+ #include <grpc/support/port_platform.h>
23
+
24
+ #include "src/core/lib/debug/trace.h"
25
+ #include "src/core/lib/gprpp/ref_counted.h"
26
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
27
+
28
+ namespace grpc_core {
29
+
30
+ // TODO(roth): In a subsequent PR, remove this from this API.
31
+ class ConnectedSubchannelInterface
32
+ : public RefCounted<ConnectedSubchannelInterface> {
33
+ public:
34
+ virtual const grpc_channel_args* args() const GRPC_ABSTRACT;
35
+
36
+ protected:
37
+ template <typename TraceFlagT = TraceFlag>
38
+ explicit ConnectedSubchannelInterface(TraceFlagT* trace_flag = nullptr)
39
+ : RefCounted<ConnectedSubchannelInterface>(trace_flag) {}
40
+ };
41
+
42
+ class SubchannelInterface : public RefCounted<SubchannelInterface> {
43
+ public:
44
+ class ConnectivityStateWatcher {
45
+ public:
46
+ virtual ~ConnectivityStateWatcher() = default;
47
+
48
+ // Will be invoked whenever the subchannel's connectivity state
49
+ // changes. There will be only one invocation of this method on a
50
+ // given watcher instance at any given time.
51
+ //
52
+ // When the state changes to READY, connected_subchannel will
53
+ // contain a ref to the connected subchannel. When it changes from
54
+ // READY to some other state, the implementation must release its
55
+ // ref to the connected subchannel.
56
+ virtual void OnConnectivityStateChange(
57
+ grpc_connectivity_state new_state,
58
+ RefCountedPtr<ConnectedSubchannelInterface>
59
+ connected_subchannel) // NOLINT
60
+ GRPC_ABSTRACT;
61
+
62
+ // TODO(roth): Remove this as soon as we move to EventManager-based
63
+ // polling.
64
+ virtual grpc_pollset_set* interested_parties() GRPC_ABSTRACT;
65
+
66
+ GRPC_ABSTRACT_BASE_CLASS
67
+ };
68
+
69
+ virtual ~SubchannelInterface() = default;
70
+
71
+ // Returns the current connectivity state of the subchannel.
72
+ virtual grpc_connectivity_state CheckConnectivityState(
73
+ RefCountedPtr<ConnectedSubchannelInterface>* connected_subchannel)
74
+ GRPC_ABSTRACT;
75
+
76
+ // Starts watching the subchannel's connectivity state.
77
+ // The first callback to the watcher will be delivered when the
78
+ // subchannel's connectivity state becomes a value other than
79
+ // initial_state, which may happen immediately.
80
+ // Subsequent callbacks will be delivered as the subchannel's state
81
+ // changes.
82
+ // The watcher will be destroyed either when the subchannel is
83
+ // destroyed or when CancelConnectivityStateWatch() is called.
84
+ // There can be only one watcher of a given subchannel. It is not
85
+ // valid to call this method a second time without first cancelling
86
+ // the previous watcher using CancelConnectivityStateWatch().
87
+ virtual void WatchConnectivityState(
88
+ grpc_connectivity_state initial_state,
89
+ UniquePtr<ConnectivityStateWatcher> watcher) GRPC_ABSTRACT;
90
+
91
+ // Cancels a connectivity state watch.
92
+ // If the watcher has already been destroyed, this is a no-op.
93
+ virtual void CancelConnectivityStateWatch(ConnectivityStateWatcher* watcher)
94
+ GRPC_ABSTRACT;
95
+
96
+ // Attempt to connect to the backend. Has no effect if already connected.
97
+ // If the subchannel is currently in backoff delay due to a previously
98
+ // failed attempt, the new connection attempt will not start until the
99
+ // backoff delay has elapsed.
100
+ virtual void AttemptToConnect() GRPC_ABSTRACT;
101
+
102
+ // Resets the subchannel's connection backoff state. If AttemptToConnect()
103
+ // has been called since the subchannel entered TRANSIENT_FAILURE state,
104
+ // starts a new connection attempt immediately; otherwise, a new connection
105
+ // attempt will be started as soon as AttemptToConnect() is called.
106
+ virtual void ResetBackoff() GRPC_ABSTRACT;
107
+
108
+ GRPC_ABSTRACT_BASE_CLASS
109
+ };
110
+
111
+ } // namespace grpc_core
112
+
113
+ #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_SUBCHANNEL_INTERFACE_H */