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,12 +40,51 @@
40
40
  #include "src/core/lib/slice/slice_internal.h"
41
41
  #include "src/core/lib/surface/channel.h"
42
42
  #include "src/core/lib/surface/server.h"
43
+ #include "src/core/lib/transport/connectivity_state.h"
43
44
  #include "src/core/lib/transport/error_utils.h"
44
45
  #include "src/core/lib/uri/uri_parser.h"
45
46
 
46
47
  namespace grpc_core {
47
48
  namespace channelz {
48
49
 
50
+ //
51
+ // channel arg code
52
+ //
53
+
54
+ namespace {
55
+
56
+ void* parent_uuid_copy(void* p) { return p; }
57
+ void parent_uuid_destroy(void* p) {}
58
+ int parent_uuid_cmp(void* p1, void* p2) { return GPR_ICMP(p1, p2); }
59
+ const grpc_arg_pointer_vtable parent_uuid_vtable = {
60
+ parent_uuid_copy, parent_uuid_destroy, parent_uuid_cmp};
61
+
62
+ } // namespace
63
+
64
+ grpc_arg MakeParentUuidArg(intptr_t parent_uuid) {
65
+ // We would ideally like to store the uuid in an integer argument.
66
+ // Unfortunately, that won't work, because intptr_t (the type used for
67
+ // uuids) doesn't fit in an int (the type used for integer args).
68
+ // So instead, we use a hack to store it as a pointer, because
69
+ // intptr_t should be the same size as void*.
70
+ static_assert(sizeof(intptr_t) <= sizeof(void*),
71
+ "can't fit intptr_t inside of void*");
72
+ return grpc_channel_arg_pointer_create(
73
+ const_cast<char*>(GRPC_ARG_CHANNELZ_PARENT_UUID),
74
+ reinterpret_cast<void*>(parent_uuid), &parent_uuid_vtable);
75
+ }
76
+
77
+ intptr_t GetParentUuidFromArgs(const grpc_channel_args& args) {
78
+ const grpc_arg* arg =
79
+ grpc_channel_args_find(&args, GRPC_ARG_CHANNELZ_PARENT_UUID);
80
+ if (arg == nullptr || arg->type != GRPC_ARG_POINTER) return 0;
81
+ return reinterpret_cast<intptr_t>(arg->value.pointer.p);
82
+ }
83
+
84
+ //
85
+ // BaseNode
86
+ //
87
+
49
88
  BaseNode::BaseNode(EntityType type) : type_(type), uuid_(-1) {
50
89
  // The registry will set uuid_ under its lock.
51
90
  ChannelzRegistry::Register(this);
@@ -61,6 +100,10 @@ char* BaseNode::RenderJsonString() {
61
100
  return json_str;
62
101
  }
63
102
 
103
+ //
104
+ // CallCountingHelper
105
+ //
106
+
64
107
  CallCountingHelper::CallCountingHelper() {
65
108
  num_cores_ = GPR_MAX(1, gpr_cpu_num_cores());
66
109
  per_cpu_counter_data_storage_ = static_cast<AtomicCounterData*>(
@@ -137,15 +180,17 @@ void CallCountingHelper::PopulateCallCounts(grpc_json* json) {
137
180
  }
138
181
  }
139
182
 
140
- ChannelNode::ChannelNode(grpc_channel* channel, size_t channel_tracer_max_nodes,
141
- bool is_top_level_channel)
142
- : BaseNode(is_top_level_channel ? EntityType::kTopLevelChannel
143
- : EntityType::kInternalChannel),
144
- channel_(channel),
145
- target_(UniquePtr<char>(grpc_channel_get_target(channel_))),
146
- trace_(channel_tracer_max_nodes) {}
183
+ //
184
+ // ChannelNode
185
+ //
147
186
 
148
- ChannelNode::~ChannelNode() {}
187
+ ChannelNode::ChannelNode(UniquePtr<char> target,
188
+ size_t channel_tracer_max_nodes, intptr_t parent_uuid)
189
+ : BaseNode(parent_uuid == 0 ? EntityType::kTopLevelChannel
190
+ : EntityType::kInternalChannel),
191
+ target_(std::move(target)),
192
+ trace_(channel_tracer_max_nodes),
193
+ parent_uuid_(parent_uuid) {}
149
194
 
150
195
  grpc_json* ChannelNode::RenderJson() {
151
196
  // We need to track these three json objects to build our object
@@ -167,9 +212,19 @@ grpc_json* ChannelNode::RenderJson() {
167
212
  GRPC_JSON_OBJECT, false);
168
213
  json = data;
169
214
  json_iterator = nullptr;
170
- // template method. Child classes may override this to add their specific
171
- // functionality.
172
- PopulateConnectivityState(json);
215
+ // connectivity state
216
+ // If low-order bit is on, then the field is set.
217
+ int state_field = connectivity_state_.Load(MemoryOrder::RELAXED);
218
+ if ((state_field & 1) != 0) {
219
+ grpc_connectivity_state state =
220
+ static_cast<grpc_connectivity_state>(state_field >> 1);
221
+ json = grpc_json_create_child(nullptr, json, "state", nullptr,
222
+ GRPC_JSON_OBJECT, false);
223
+ grpc_json_create_child(nullptr, json, "state",
224
+ grpc_connectivity_state_name(state),
225
+ GRPC_JSON_STRING, false);
226
+ json = data;
227
+ }
173
228
  // populate the target.
174
229
  GPR_ASSERT(target_.get() != nullptr);
175
230
  grpc_json_create_child(nullptr, json, "target", target_.get(),
@@ -189,13 +244,64 @@ grpc_json* ChannelNode::RenderJson() {
189
244
  return top_level_json;
190
245
  }
191
246
 
192
- RefCountedPtr<ChannelNode> ChannelNode::MakeChannelNode(
193
- grpc_channel* channel, size_t channel_tracer_max_nodes,
194
- bool is_top_level_channel) {
195
- return MakeRefCounted<grpc_core::channelz::ChannelNode>(
196
- channel, channel_tracer_max_nodes, is_top_level_channel);
247
+ void ChannelNode::PopulateChildRefs(grpc_json* json) {
248
+ MutexLock lock(&child_mu_);
249
+ grpc_json* json_iterator = nullptr;
250
+ if (!child_subchannels_.empty()) {
251
+ grpc_json* array_parent = grpc_json_create_child(
252
+ nullptr, json, "subchannelRef", nullptr, GRPC_JSON_ARRAY, false);
253
+ for (const auto& p : child_subchannels_) {
254
+ json_iterator =
255
+ grpc_json_create_child(json_iterator, array_parent, nullptr, nullptr,
256
+ GRPC_JSON_OBJECT, false);
257
+ grpc_json_add_number_string_child(json_iterator, nullptr, "subchannelId",
258
+ p.first);
259
+ }
260
+ }
261
+ if (!child_channels_.empty()) {
262
+ grpc_json* array_parent = grpc_json_create_child(
263
+ nullptr, json, "channelRef", nullptr, GRPC_JSON_ARRAY, false);
264
+ json_iterator = nullptr;
265
+ for (const auto& p : child_channels_) {
266
+ json_iterator =
267
+ grpc_json_create_child(json_iterator, array_parent, nullptr, nullptr,
268
+ GRPC_JSON_OBJECT, false);
269
+ grpc_json_add_number_string_child(json_iterator, nullptr, "channelId",
270
+ p.first);
271
+ }
272
+ }
273
+ }
274
+
275
+ void ChannelNode::SetConnectivityState(grpc_connectivity_state state) {
276
+ // Store with low-order bit set to indicate that the field is set.
277
+ int state_field = (state << 1) + 1;
278
+ connectivity_state_.Store(state_field, MemoryOrder::RELAXED);
279
+ }
280
+
281
+ void ChannelNode::AddChildChannel(intptr_t child_uuid) {
282
+ MutexLock lock(&child_mu_);
283
+ child_channels_.insert(MakePair(child_uuid, true));
284
+ }
285
+
286
+ void ChannelNode::RemoveChildChannel(intptr_t child_uuid) {
287
+ MutexLock lock(&child_mu_);
288
+ child_channels_.erase(child_uuid);
197
289
  }
198
290
 
291
+ void ChannelNode::AddChildSubchannel(intptr_t child_uuid) {
292
+ MutexLock lock(&child_mu_);
293
+ child_subchannels_.insert(MakePair(child_uuid, true));
294
+ }
295
+
296
+ void ChannelNode::RemoveChildSubchannel(intptr_t child_uuid) {
297
+ MutexLock lock(&child_mu_);
298
+ child_subchannels_.erase(child_uuid);
299
+ }
300
+
301
+ //
302
+ // ServerNode
303
+ //
304
+
199
305
  ServerNode::ServerNode(grpc_server* server, size_t channel_tracer_max_nodes)
200
306
  : BaseNode(EntityType::kServer),
201
307
  server_(server),
@@ -281,8 +387,14 @@ grpc_json* ServerNode::RenderJson() {
281
387
  return top_level_json;
282
388
  }
283
389
 
284
- static void PopulateSocketAddressJson(grpc_json* json, const char* name,
285
- const char* addr_str) {
390
+ //
391
+ // SocketNode
392
+ //
393
+
394
+ namespace {
395
+
396
+ void PopulateSocketAddressJson(grpc_json* json, const char* name,
397
+ const char* addr_str) {
286
398
  if (addr_str == nullptr) return;
287
399
  grpc_json* json_iterator = nullptr;
288
400
  json_iterator = grpc_json_create_child(json_iterator, json, name, nullptr,
@@ -312,7 +424,6 @@ static void PopulateSocketAddressJson(grpc_json* json, const char* name,
312
424
  b64_host, GRPC_JSON_STRING, true);
313
425
  gpr_free(host);
314
426
  gpr_free(port);
315
-
316
427
  } else if (uri != nullptr && strcmp(uri->scheme, "unix") == 0) {
317
428
  json_iterator = grpc_json_create_child(json_iterator, json, "uds_address",
318
429
  nullptr, GRPC_JSON_OBJECT, false);
@@ -332,6 +443,8 @@ static void PopulateSocketAddressJson(grpc_json* json, const char* name,
332
443
  grpc_uri_destroy(uri);
333
444
  }
334
445
 
446
+ } // namespace
447
+
335
448
  SocketNode::SocketNode(UniquePtr<char> local, UniquePtr<char> remote)
336
449
  : BaseNode(EntityType::kSocket),
337
450
  local_(std::move(local)),
@@ -385,56 +498,73 @@ grpc_json* SocketNode::RenderJson() {
385
498
  json = data;
386
499
  json_iterator = nullptr;
387
500
  gpr_timespec ts;
388
- if (streams_started_ != 0) {
501
+ gpr_atm streams_started = gpr_atm_no_barrier_load(&streams_started_);
502
+ if (streams_started != 0) {
389
503
  json_iterator = grpc_json_add_number_string_child(
390
- json, json_iterator, "streamsStarted", streams_started_);
391
- if (last_local_stream_created_millis_ != 0) {
392
- ts = grpc_millis_to_timespec(last_local_stream_created_millis_,
504
+ json, json_iterator, "streamsStarted", streams_started);
505
+ gpr_atm last_local_stream_created_millis =
506
+ gpr_atm_no_barrier_load(&last_local_stream_created_millis_);
507
+ if (last_local_stream_created_millis != 0) {
508
+ ts = grpc_millis_to_timespec(last_local_stream_created_millis,
393
509
  GPR_CLOCK_REALTIME);
394
510
  json_iterator = grpc_json_create_child(
395
511
  json_iterator, json, "lastLocalStreamCreatedTimestamp",
396
512
  gpr_format_timespec(ts), GRPC_JSON_STRING, true);
397
513
  }
398
- if (last_remote_stream_created_millis_ != 0) {
399
- ts = grpc_millis_to_timespec(last_remote_stream_created_millis_,
514
+ gpr_atm last_remote_stream_created_millis =
515
+ gpr_atm_no_barrier_load(&last_remote_stream_created_millis_);
516
+ if (last_remote_stream_created_millis != 0) {
517
+ ts = grpc_millis_to_timespec(last_remote_stream_created_millis,
400
518
  GPR_CLOCK_REALTIME);
401
519
  json_iterator = grpc_json_create_child(
402
520
  json_iterator, json, "lastRemoteStreamCreatedTimestamp",
403
521
  gpr_format_timespec(ts), GRPC_JSON_STRING, true);
404
522
  }
405
523
  }
406
- if (streams_succeeded_ != 0) {
524
+ gpr_atm streams_succeeded = gpr_atm_no_barrier_load(&streams_succeeded_);
525
+ if (streams_succeeded != 0) {
407
526
  json_iterator = grpc_json_add_number_string_child(
408
- json, json_iterator, "streamsSucceeded", streams_succeeded_);
527
+ json, json_iterator, "streamsSucceeded", streams_succeeded);
409
528
  }
410
- if (streams_failed_) {
529
+ gpr_atm streams_failed = gpr_atm_no_barrier_load(&streams_failed_);
530
+ if (streams_failed) {
411
531
  json_iterator = grpc_json_add_number_string_child(
412
- json, json_iterator, "streamsFailed", streams_failed_);
532
+ json, json_iterator, "streamsFailed", streams_failed);
413
533
  }
414
- if (messages_sent_ != 0) {
534
+ gpr_atm messages_sent = gpr_atm_no_barrier_load(&messages_sent_);
535
+ if (messages_sent != 0) {
415
536
  json_iterator = grpc_json_add_number_string_child(
416
- json, json_iterator, "messagesSent", messages_sent_);
417
- ts = grpc_millis_to_timespec(last_message_sent_millis_, GPR_CLOCK_REALTIME);
537
+ json, json_iterator, "messagesSent", messages_sent);
538
+ ts = grpc_millis_to_timespec(
539
+ gpr_atm_no_barrier_load(&last_message_sent_millis_),
540
+ GPR_CLOCK_REALTIME);
418
541
  json_iterator =
419
542
  grpc_json_create_child(json_iterator, json, "lastMessageSentTimestamp",
420
543
  gpr_format_timespec(ts), GRPC_JSON_STRING, true);
421
544
  }
422
- if (messages_received_ != 0) {
545
+ gpr_atm messages_received = gpr_atm_no_barrier_load(&messages_received_);
546
+ if (messages_received != 0) {
423
547
  json_iterator = grpc_json_add_number_string_child(
424
- json, json_iterator, "messagesReceived", messages_received_);
425
- ts = grpc_millis_to_timespec(last_message_received_millis_,
426
- GPR_CLOCK_REALTIME);
548
+ json, json_iterator, "messagesReceived", messages_received);
549
+ ts = grpc_millis_to_timespec(
550
+ gpr_atm_no_barrier_load(&last_message_received_millis_),
551
+ GPR_CLOCK_REALTIME);
427
552
  json_iterator = grpc_json_create_child(
428
553
  json_iterator, json, "lastMessageReceivedTimestamp",
429
554
  gpr_format_timespec(ts), GRPC_JSON_STRING, true);
430
555
  }
431
- if (keepalives_sent_ != 0) {
556
+ gpr_atm keepalives_sent = gpr_atm_no_barrier_load(&keepalives_sent_);
557
+ if (keepalives_sent != 0) {
432
558
  json_iterator = grpc_json_add_number_string_child(
433
- json, json_iterator, "keepAlivesSent", keepalives_sent_);
559
+ json, json_iterator, "keepAlivesSent", keepalives_sent);
434
560
  }
435
561
  return top_level_json;
436
562
  }
437
563
 
564
+ //
565
+ // ListenSocketNode
566
+ //
567
+
438
568
  ListenSocketNode::ListenSocketNode(UniquePtr<char> local_addr)
439
569
  : BaseNode(EntityType::kSocket), local_addr_(std::move(local_addr)) {}
440
570
 
@@ -26,19 +26,19 @@
26
26
  #include "src/core/lib/channel/channel_trace.h"
27
27
  #include "src/core/lib/gprpp/inlined_vector.h"
28
28
  #include "src/core/lib/gprpp/manual_constructor.h"
29
+ #include "src/core/lib/gprpp/map.h"
29
30
  #include "src/core/lib/gprpp/ref_counted.h"
30
31
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
32
+ #include "src/core/lib/gprpp/sync.h"
31
33
  #include "src/core/lib/iomgr/error.h"
32
34
  #include "src/core/lib/iomgr/exec_ctx.h"
33
35
  #include "src/core/lib/json/json.h"
34
36
 
35
- // Channel arg key for client channel factory.
36
- #define GRPC_ARG_CHANNELZ_CHANNEL_NODE_CREATION_FUNC \
37
- "grpc.channelz_channel_node_creation_func"
37
+ // Channel arg key for channelz node.
38
+ #define GRPC_ARG_CHANNELZ_CHANNEL_NODE "grpc.channelz_channel_node"
38
39
 
39
- // Channel arg key to signal that the channel is an internal channel.
40
- #define GRPC_ARG_CHANNELZ_CHANNEL_IS_INTERNAL_CHANNEL \
41
- "grpc.channelz_channel_is_internal_channel"
40
+ // Channel arg key to encode the channelz uuid of the channel's parent.
41
+ #define GRPC_ARG_CHANNELZ_PARENT_UUID "grpc.channelz_parent_uuid"
42
42
 
43
43
  /** This is the default value for whether or not to enable channelz. If
44
44
  * GRPC_ARG_ENABLE_CHANNELZ is set, it will override this default value. */
@@ -54,6 +54,10 @@ namespace grpc_core {
54
54
 
55
55
  namespace channelz {
56
56
 
57
+ // Helpers for getting and setting GRPC_ARG_CHANNELZ_PARENT_UUID.
58
+ grpc_arg MakeParentUuidArg(intptr_t parent_uuid);
59
+ intptr_t GetParentUuidFromArgs(const grpc_channel_args& args);
60
+
57
61
  // TODO(ncteisen), this only contains the uuids of the children for now,
58
62
  // since that is all that is strictly needed. In a future enhancement we will
59
63
  // add human readable names as in the channelz.proto
@@ -147,44 +151,19 @@ class CallCountingHelper {
147
151
  // Handles channelz bookkeeping for channels
148
152
  class ChannelNode : public BaseNode {
149
153
  public:
150
- static RefCountedPtr<ChannelNode> MakeChannelNode(
151
- grpc_channel* channel, size_t channel_tracer_max_nodes,
152
- bool is_top_level_channel);
154
+ ChannelNode(UniquePtr<char> target, size_t channel_tracer_max_nodes,
155
+ intptr_t parent_uuid);
153
156
 
154
- ChannelNode(grpc_channel* channel, size_t channel_tracer_max_nodes,
155
- bool is_top_level_channel);
156
- ~ChannelNode() override;
157
+ intptr_t parent_uuid() const { return parent_uuid_; }
157
158
 
158
159
  grpc_json* RenderJson() override;
159
160
 
160
- // template methods. RenderJSON uses these methods to render its JSON
161
- // representation. These are virtual so that children classes may provide
162
- // their specific mechanism for populating these parts of the channelz
163
- // object.
164
- //
165
- // ChannelNode does not have a notion of connectivity state or child refs,
166
- // so it leaves these implementations blank.
167
- //
168
- // This is utilizing the template method design pattern.
169
- //
170
- // TODO(ncteisen): remove these template methods in favor of manual traversal
171
- // and mutation of the grpc_json object.
172
- virtual void PopulateConnectivityState(grpc_json* json) {}
173
- virtual void PopulateChildRefs(grpc_json* json) {}
174
-
175
- void MarkChannelDestroyed() {
176
- GPR_ASSERT(channel_ != nullptr);
177
- channel_ = nullptr;
178
- }
179
-
180
- bool ChannelIsDestroyed() { return channel_ == nullptr; }
181
-
182
161
  // proxy methods to composed classes.
183
- void AddTraceEvent(ChannelTrace::Severity severity, grpc_slice data) {
162
+ void AddTraceEvent(ChannelTrace::Severity severity, const grpc_slice& data) {
184
163
  trace_.AddTraceEvent(severity, data);
185
164
  }
186
165
  void AddTraceEventWithReference(ChannelTrace::Severity severity,
187
- grpc_slice data,
166
+ const grpc_slice& data,
188
167
  RefCountedPtr<BaseNode> referenced_channel) {
189
168
  trace_.AddTraceEventWithReference(severity, data,
190
169
  std::move(referenced_channel));
@@ -193,13 +172,35 @@ class ChannelNode : public BaseNode {
193
172
  void RecordCallFailed() { call_counter_.RecordCallFailed(); }
194
173
  void RecordCallSucceeded() { call_counter_.RecordCallSucceeded(); }
195
174
 
175
+ void SetConnectivityState(grpc_connectivity_state state);
176
+
177
+ void AddChildChannel(intptr_t child_uuid);
178
+ void RemoveChildChannel(intptr_t child_uuid);
179
+
180
+ void AddChildSubchannel(intptr_t child_uuid);
181
+ void RemoveChildSubchannel(intptr_t child_uuid);
182
+
196
183
  private:
184
+ void PopulateChildRefs(grpc_json* json);
185
+
197
186
  // to allow the channel trace test to access trace_.
198
187
  friend class testing::ChannelNodePeer;
199
- grpc_channel* channel_ = nullptr;
188
+
200
189
  UniquePtr<char> target_;
201
190
  CallCountingHelper call_counter_;
202
191
  ChannelTrace trace_;
192
+ const intptr_t parent_uuid_;
193
+
194
+ // Least significant bit indicates whether the value is set. Remaining
195
+ // bits are a grpc_connectivity_state value.
196
+ Atomic<int> connectivity_state_{0};
197
+
198
+ Mutex child_mu_; // Guards child maps below.
199
+ // TODO(roth): We don't actually use the values here, only the keys, so
200
+ // these should be sets instead of maps, but we don't currently have a set
201
+ // implementation. Change this if/when we have one.
202
+ Map<intptr_t, bool> child_channels_;
203
+ Map<intptr_t, bool> child_subchannels_;
203
204
  };
204
205
 
205
206
  // Handles channelz bookkeeping for servers
@@ -214,11 +215,11 @@ class ServerNode : public BaseNode {
214
215
  intptr_t pagination_limit);
215
216
 
216
217
  // proxy methods to composed classes.
217
- void AddTraceEvent(ChannelTrace::Severity severity, grpc_slice data) {
218
+ void AddTraceEvent(ChannelTrace::Severity severity, const grpc_slice& data) {
218
219
  trace_.AddTraceEvent(severity, data);
219
220
  }
220
221
  void AddTraceEventWithReference(ChannelTrace::Severity severity,
221
- grpc_slice data,
222
+ const grpc_slice& data,
222
223
  RefCountedPtr<BaseNode> referenced_channel) {
223
224
  trace_.AddTraceEventWithReference(severity, data,
224
225
  std::move(referenced_channel));
@@ -285,11 +286,6 @@ class ListenSocketNode : public BaseNode {
285
286
  UniquePtr<char> local_addr_;
286
287
  };
287
288
 
288
- // Creation functions
289
-
290
- typedef RefCountedPtr<ChannelNode> (*ChannelNodeCreationFunc)(grpc_channel*,
291
- size_t, bool);
292
-
293
289
  } // namespace channelz
294
290
  } // namespace grpc_core
295
291