grpc 1.64.0 → 1.65.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (622) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +57 -58
  3. data/include/grpc/event_engine/event_engine.h +13 -6
  4. data/include/grpc/impl/channel_arg_names.h +7 -3
  5. data/include/grpc/module.modulemap +1 -0
  6. data/include/grpc/passive_listener.h +62 -0
  7. data/include/grpc/support/log.h +1 -6
  8. data/include/grpc/support/port_platform.h +3 -0
  9. data/src/core/channelz/channel_trace.cc +1 -1
  10. data/src/core/channelz/channel_trace.h +1 -1
  11. data/src/core/channelz/channelz.cc +3 -3
  12. data/src/core/channelz/channelz.h +7 -7
  13. data/src/core/channelz/channelz_registry.cc +4 -3
  14. data/src/core/client_channel/backup_poller.cc +4 -5
  15. data/src/core/client_channel/client_channel.cc +1324 -0
  16. data/src/core/client_channel/client_channel.h +243 -0
  17. data/src/core/client_channel/client_channel_filter.cc +266 -709
  18. data/src/core/client_channel/client_channel_filter.h +11 -64
  19. data/src/core/client_channel/client_channel_internal.h +16 -5
  20. data/src/core/client_channel/client_channel_plugin.cc +1 -14
  21. data/src/core/client_channel/client_channel_service_config.h +3 -3
  22. data/src/core/client_channel/config_selector.cc +1 -1
  23. data/src/core/client_channel/config_selector.h +1 -1
  24. data/src/core/client_channel/dynamic_filters.cc +3 -3
  25. data/src/core/client_channel/dynamic_filters.h +1 -3
  26. data/src/core/client_channel/load_balanced_call_destination.cc +336 -0
  27. data/src/core/client_channel/load_balanced_call_destination.h +49 -0
  28. data/src/core/client_channel/retry_filter.cc +2 -9
  29. data/src/core/client_channel/retry_filter.h +2 -7
  30. data/src/core/client_channel/retry_filter_legacy_call_data.cc +65 -72
  31. data/src/core/client_channel/retry_filter_legacy_call_data.h +0 -2
  32. data/src/core/client_channel/retry_service_config.cc +4 -5
  33. data/src/core/client_channel/retry_service_config.h +3 -3
  34. data/src/core/client_channel/subchannel.cc +220 -112
  35. data/src/core/client_channel/subchannel.h +31 -18
  36. data/src/core/client_channel/subchannel_pool_interface.cc +0 -2
  37. data/src/core/client_channel/subchannel_pool_interface.h +2 -4
  38. data/src/core/client_channel/subchannel_stream_client.cc +36 -49
  39. data/src/core/client_channel/subchannel_stream_client.h +2 -4
  40. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +7 -10
  41. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +1 -0
  42. data/src/core/ext/filters/backend_metrics/backend_metric_provider.h +7 -0
  43. data/src/core/ext/filters/census/grpc_context.cc +2 -4
  44. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +8 -15
  45. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +2 -0
  46. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +3 -7
  47. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +1 -0
  48. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +3 -3
  49. data/src/core/ext/filters/http/client/http_client_filter.cc +1 -0
  50. data/src/core/ext/filters/http/client/http_client_filter.h +1 -0
  51. data/src/core/ext/filters/http/client_authority_filter.cc +1 -0
  52. data/src/core/ext/filters/http/client_authority_filter.h +1 -0
  53. data/src/core/ext/filters/http/message_compress/compression_filter.cc +10 -15
  54. data/src/core/ext/filters/http/message_compress/compression_filter.h +2 -0
  55. data/src/core/ext/filters/http/server/http_server_filter.cc +2 -2
  56. data/src/core/ext/filters/http/server/http_server_filter.h +1 -0
  57. data/src/core/ext/filters/message_size/message_size_filter.cc +6 -9
  58. data/src/core/ext/filters/message_size/message_size_filter.h +6 -6
  59. data/src/core/ext/filters/rbac/rbac_filter.cc +2 -5
  60. data/src/core/ext/filters/rbac/rbac_filter.h +1 -0
  61. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -2
  62. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +1 -1
  63. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +2 -6
  64. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +1 -0
  65. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +3 -3
  66. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  67. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +8 -25
  68. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -5
  69. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +223 -148
  70. data/src/core/ext/transport/chttp2/server/chttp2_server.h +33 -0
  71. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +131 -107
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +8 -8
  73. data/src/core/ext/transport/chttp2/transport/context_list_entry.h +1 -1
  74. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -4
  75. data/src/core/ext/transport/chttp2/transport/flow_control.h +0 -2
  76. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -6
  77. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -2
  78. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +9 -5
  79. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -4
  80. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +9 -2
  81. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +5 -7
  82. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +1 -1
  83. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +3 -8
  84. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
  85. data/src/core/ext/transport/chttp2/transport/http2_settings.h +1 -1
  86. data/src/core/ext/transport/chttp2/transport/internal.h +29 -19
  87. data/src/core/ext/transport/chttp2/transport/parsing.cc +15 -25
  88. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +0 -2
  89. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +0 -2
  90. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +29 -13
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +5 -4
  92. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -5
  93. data/src/core/ext/transport/chttp2/transport/writing.cc +24 -25
  94. data/src/core/ext/transport/inproc/inproc_transport.cc +56 -32
  95. data/src/core/ext/transport/inproc/inproc_transport.h +1 -3
  96. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +13 -15
  97. data/src/core/ext/transport/inproc/legacy_inproc_transport.h +0 -2
  98. data/src/core/handshaker/handshaker.cc +6 -14
  99. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +9 -17
  100. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +3 -2
  101. data/src/core/handshaker/security/secure_endpoint.cc +38 -32
  102. data/src/core/handshaker/security/secure_endpoint.h +0 -2
  103. data/src/core/handshaker/security/security_handshaker.cc +25 -37
  104. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +2 -1
  105. data/src/core/lib/address_utils/parse_address.cc +27 -39
  106. data/src/core/lib/address_utils/sockaddr_utils.cc +5 -6
  107. data/src/core/lib/avl/avl.h +1 -1
  108. data/src/core/lib/channel/channel_args.cc +13 -17
  109. data/src/core/lib/channel/channel_args.h +19 -8
  110. data/src/core/lib/channel/channel_stack.cc +5 -63
  111. data/src/core/lib/channel/channel_stack.h +13 -37
  112. data/src/core/lib/channel/channel_stack_builder.h +0 -5
  113. data/src/core/lib/channel/channel_stack_builder_impl.cc +0 -142
  114. data/src/core/lib/channel/channel_stack_builder_impl.h +0 -2
  115. data/src/core/lib/channel/connected_channel.cc +37 -676
  116. data/src/core/lib/channel/promise_based_filter.cc +41 -47
  117. data/src/core/lib/channel/promise_based_filter.h +124 -477
  118. data/src/core/lib/channel/status_util.cc +1 -1
  119. data/src/core/lib/compression/compression.cc +1 -1
  120. data/src/core/lib/compression/message_compress.cc +6 -6
  121. data/src/core/lib/config/config_vars.cc +2 -7
  122. data/src/core/lib/config/config_vars.h +1 -5
  123. data/src/core/lib/debug/event_log.h +1 -1
  124. data/src/core/lib/debug/trace.cc +43 -59
  125. data/src/core/lib/debug/trace.h +2 -97
  126. data/src/core/lib/debug/trace_flags.cc +255 -0
  127. data/src/core/lib/debug/trace_flags.h +133 -0
  128. data/src/core/lib/debug/trace_impl.h +115 -0
  129. data/src/core/lib/event_engine/ares_resolver.cc +5 -7
  130. data/src/core/lib/event_engine/ares_resolver.h +1 -3
  131. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +1 -1
  132. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +17 -22
  133. data/src/core/lib/event_engine/event_engine.cc +29 -4
  134. data/src/core/lib/event_engine/extensions/supports_fd.h +7 -0
  135. data/src/core/lib/event_engine/extensions/tcp_trace.h +43 -0
  136. data/src/core/lib/event_engine/forkable.cc +4 -5
  137. data/src/core/lib/event_engine/forkable.h +0 -11
  138. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +10 -11
  139. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +4 -3
  140. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +1 -1
  141. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +19 -33
  142. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +3 -2
  143. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +24 -7
  144. data/src/core/lib/event_engine/posix_engine/posix_engine.h +2 -0
  145. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +14 -16
  146. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +18 -22
  147. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +13 -17
  148. data/src/core/lib/event_engine/posix_engine/timer.cc +1 -1
  149. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +4 -6
  150. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -1
  151. data/src/core/lib/event_engine/shim.cc +1 -1
  152. data/src/core/lib/event_engine/tcp_socket_utils.cc +6 -8
  153. data/src/core/lib/event_engine/thread_local.h +1 -1
  154. data/src/core/lib/event_engine/thread_pool/thread_count.h +1 -1
  155. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +19 -21
  156. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -6
  157. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +14 -13
  158. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +4 -3
  159. data/src/core/lib/event_engine/trace.h +6 -17
  160. data/src/core/lib/event_engine/windows/iocp.h +1 -1
  161. data/src/core/lib/event_engine/windows/win_socket.cc +23 -17
  162. data/src/core/lib/event_engine/windows/win_socket.h +4 -5
  163. data/src/core/lib/event_engine/windows/windows_endpoint.cc +6 -9
  164. data/src/core/lib/event_engine/windows/windows_engine.cc +201 -87
  165. data/src/core/lib/event_engine/windows/windows_engine.h +136 -25
  166. data/src/core/lib/event_engine/windows/windows_listener.cc +12 -23
  167. data/src/core/lib/experiments/experiments.cc +35 -151
  168. data/src/core/lib/experiments/experiments.h +12 -45
  169. data/src/core/lib/gprpp/bitset.h +1 -1
  170. data/src/core/lib/gprpp/crash.cc +2 -3
  171. data/src/core/lib/gprpp/dual_ref_counted.h +45 -33
  172. data/src/core/lib/gprpp/dump_args.cc +54 -0
  173. data/src/core/lib/gprpp/dump_args.h +69 -0
  174. data/src/core/lib/gprpp/glob.cc +70 -0
  175. data/src/core/lib/gprpp/glob.h +29 -0
  176. data/src/core/lib/gprpp/per_cpu.cc +1 -1
  177. data/src/core/lib/gprpp/posix/stat.cc +3 -4
  178. data/src/core/lib/gprpp/posix/thd.cc +8 -9
  179. data/src/core/lib/gprpp/ref_counted.h +30 -22
  180. data/src/core/lib/gprpp/single_set_ptr.h +5 -3
  181. data/src/core/lib/gprpp/status_helper.cc +11 -30
  182. data/src/core/lib/gprpp/status_helper.h +3 -31
  183. data/src/core/lib/gprpp/time.cc +3 -4
  184. data/src/core/lib/gprpp/time.h +3 -2
  185. data/src/core/lib/gprpp/unique_type_name.h +1 -1
  186. data/src/core/lib/gprpp/validation_errors.cc +10 -1
  187. data/src/core/lib/gprpp/validation_errors.h +11 -0
  188. data/src/core/lib/gprpp/windows/stat.cc +3 -4
  189. data/src/core/lib/gprpp/windows/thd.cc +3 -2
  190. data/src/core/lib/gprpp/work_serializer.cc +48 -57
  191. data/src/core/lib/iomgr/buffer_list.cc +4 -2
  192. data/src/core/lib/iomgr/call_combiner.cc +18 -27
  193. data/src/core/lib/iomgr/call_combiner.h +1 -3
  194. data/src/core/lib/iomgr/cfstream_handle.cc +4 -6
  195. data/src/core/lib/iomgr/closure.h +2 -4
  196. data/src/core/lib/iomgr/combiner.cc +6 -8
  197. data/src/core/lib/iomgr/combiner.h +0 -2
  198. data/src/core/lib/iomgr/endpoint.cc +0 -6
  199. data/src/core/lib/iomgr/endpoint.h +0 -2
  200. data/src/core/lib/iomgr/endpoint_cfstream.cc +19 -41
  201. data/src/core/lib/iomgr/endpoint_pair_posix.cc +1 -1
  202. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -6
  203. data/src/core/lib/iomgr/error.cc +13 -21
  204. data/src/core/lib/iomgr/error.h +1 -1
  205. data/src/core/lib/iomgr/ev_apple.cc +3 -5
  206. data/src/core/lib/iomgr/ev_epoll1_linux.cc +43 -42
  207. data/src/core/lib/iomgr/ev_poll_posix.cc +38 -29
  208. data/src/core/lib/iomgr/ev_posix.cc +8 -9
  209. data/src/core/lib/iomgr/ev_posix.h +10 -7
  210. data/src/core/lib/iomgr/event_engine_shims/closure.cc +2 -2
  211. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +14 -28
  212. data/src/core/lib/iomgr/exec_ctx.cc +2 -2
  213. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  214. data/src/core/lib/iomgr/executor.cc +6 -15
  215. data/src/core/lib/iomgr/executor.h +1 -1
  216. data/src/core/lib/iomgr/fork_posix.cc +8 -10
  217. data/src/core/lib/iomgr/fork_windows.cc +3 -1
  218. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +2 -3
  219. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +3 -5
  220. data/src/core/lib/iomgr/internal_errqueue.cc +4 -2
  221. data/src/core/lib/iomgr/iocp_windows.cc +4 -3
  222. data/src/core/lib/iomgr/iomgr.cc +13 -17
  223. data/src/core/lib/iomgr/lockfree_event.cc +3 -5
  224. data/src/core/lib/iomgr/pollset.h +0 -2
  225. data/src/core/lib/iomgr/pollset_windows.cc +0 -2
  226. data/src/core/lib/iomgr/resolve_address_posix.cc +7 -14
  227. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  228. data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
  229. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  230. data/src/core/lib/iomgr/socket_utils_common_posix.cc +11 -17
  231. data/src/core/lib/iomgr/socket_windows.cc +4 -6
  232. data/src/core/lib/iomgr/tcp_client_cfstream.cc +3 -5
  233. data/src/core/lib/iomgr/tcp_client_posix.cc +9 -15
  234. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -4
  235. data/src/core/lib/iomgr/tcp_posix.cc +57 -84
  236. data/src/core/lib/iomgr/tcp_posix.h +0 -2
  237. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -3
  238. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +4 -6
  239. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +7 -7
  240. data/src/core/lib/iomgr/tcp_server_windows.cc +10 -16
  241. data/src/core/lib/iomgr/tcp_windows.cc +25 -41
  242. data/src/core/lib/iomgr/timer_generic.cc +17 -20
  243. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  244. data/src/core/lib/iomgr/timer_manager.cc +17 -30
  245. data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
  246. data/src/core/lib/iomgr/vsock.cc +1 -1
  247. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +3 -3
  248. data/src/core/lib/promise/activity.h +27 -4
  249. data/src/core/lib/promise/cancel_callback.h +24 -0
  250. data/src/core/lib/promise/context.h +11 -0
  251. data/src/core/lib/promise/detail/basic_seq.h +1 -2
  252. data/src/core/lib/promise/detail/join_state.h +354 -398
  253. data/src/core/lib/promise/detail/promise_like.h +13 -6
  254. data/src/core/lib/promise/detail/seq_state.h +1178 -1178
  255. data/src/core/lib/promise/for_each.h +6 -6
  256. data/src/core/lib/promise/interceptor_list.h +6 -7
  257. data/src/core/lib/promise/latch.h +9 -9
  258. data/src/core/lib/promise/map.h +17 -0
  259. data/src/core/lib/promise/observable.h +182 -0
  260. data/src/core/lib/promise/party.cc +7 -8
  261. data/src/core/lib/promise/party.h +10 -8
  262. data/src/core/lib/promise/pipe.h +16 -35
  263. data/src/core/lib/promise/promise.h +1 -0
  264. data/src/core/lib/promise/status_flag.h +2 -0
  265. data/src/core/lib/resource_quota/arena.cc +56 -79
  266. data/src/core/lib/resource_quota/arena.h +118 -209
  267. data/src/core/lib/resource_quota/memory_quota.cc +12 -13
  268. data/src/core/lib/resource_quota/memory_quota.h +2 -3
  269. data/src/core/lib/resource_quota/periodic_update.cc +1 -1
  270. data/src/core/lib/resource_quota/resource_quota.h +1 -1
  271. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  272. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  273. data/src/core/lib/security/authorization/evaluate_args.cc +6 -8
  274. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +5 -6
  275. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +1 -0
  276. data/src/core/lib/security/authorization/matchers.cc +3 -3
  277. data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +2 -2
  278. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +2 -3
  279. data/src/core/lib/security/context/security_context.cc +12 -13
  280. data/src/core/lib/security/context/security_context.h +31 -8
  281. data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
  282. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +3 -1
  283. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -3
  284. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +5 -5
  285. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +3 -3
  286. data/src/core/lib/security/credentials/call_creds_util.cc +2 -1
  287. data/src/core/lib/security/credentials/channel_creds_registry.h +2 -2
  288. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +5 -3
  289. data/src/core/lib/security/credentials/composite/composite_credentials.h +1 -1
  290. data/src/core/lib/security/credentials/credentials.cc +6 -6
  291. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -4
  292. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +2 -2
  293. data/src/core/lib/security/credentials/external/external_account_credentials.cc +9 -11
  294. data/src/core/lib/security/credentials/external/external_account_credentials.h +3 -3
  295. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +2 -2
  296. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -4
  297. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +1 -1
  298. data/src/core/lib/security/credentials/fake/fake_credentials.h +1 -1
  299. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +3 -3
  300. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +11 -11
  301. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +1 -1
  302. data/src/core/lib/security/credentials/iam/iam_credentials.h +1 -1
  303. data/src/core/lib/security/credentials/jwt/json_token.cc +14 -15
  304. data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
  305. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +6 -5
  306. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +1 -1
  307. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +50 -54
  308. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +1 -1
  309. data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
  310. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +12 -11
  311. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -4
  312. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
  313. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +1 -3
  314. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +15 -21
  315. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  316. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +21 -30
  317. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +1 -1
  318. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +1 -1
  319. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -4
  320. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +3 -5
  321. data/src/core/lib/security/credentials/tls/tls_credentials.cc +14 -16
  322. data/src/core/lib/security/credentials/tls/tls_utils.cc +4 -4
  323. data/src/core/lib/security/credentials/xds/xds_credentials.cc +1 -1
  324. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -16
  325. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +15 -12
  326. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +6 -6
  327. data/src/core/lib/security/security_connector/load_system_roots_windows.cc +1 -1
  328. data/src/core/lib/security/security_connector/local/local_security_connector.cc +8 -12
  329. data/src/core/lib/security/security_connector/security_connector.cc +1 -4
  330. data/src/core/lib/security/security_connector/security_connector.h +1 -3
  331. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +17 -19
  332. data/src/core/lib/security/security_connector/ssl_utils.cc +19 -21
  333. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +29 -40
  334. data/src/core/lib/security/transport/auth_filters.h +1 -0
  335. data/src/core/lib/security/transport/client_auth_filter.cc +7 -13
  336. data/src/core/lib/security/transport/server_auth_filter.cc +3 -8
  337. data/src/core/lib/security/util/json_util.h +1 -1
  338. data/src/core/lib/slice/slice.h +1 -1
  339. data/src/core/lib/slice/slice_refcount.h +2 -4
  340. data/src/core/lib/slice/slice_string_helpers.cc +1 -1
  341. data/src/core/lib/surface/api_trace.h +1 -3
  342. data/src/core/lib/surface/call.cc +64 -3739
  343. data/src/core/lib/surface/call.h +41 -143
  344. data/src/core/lib/surface/call_log_batch.cc +1 -1
  345. data/src/core/lib/surface/call_utils.cc +276 -0
  346. data/src/core/lib/surface/call_utils.h +449 -0
  347. data/src/core/lib/surface/channel.cc +8 -3
  348. data/src/core/lib/surface/channel.h +10 -7
  349. data/src/core/lib/surface/channel_create.cc +14 -6
  350. data/src/core/lib/surface/channel_create.h +3 -2
  351. data/src/core/lib/surface/channel_init.cc +21 -77
  352. data/src/core/lib/surface/channel_init.h +19 -97
  353. data/src/core/lib/surface/client_call.cc +419 -0
  354. data/src/core/lib/surface/client_call.h +180 -0
  355. data/src/core/lib/surface/completion_queue.cc +28 -33
  356. data/src/core/lib/surface/completion_queue.h +0 -8
  357. data/src/core/lib/surface/filter_stack_call.cc +1157 -0
  358. data/src/core/lib/surface/filter_stack_call.h +369 -0
  359. data/src/core/lib/surface/init.cc +7 -6
  360. data/src/core/lib/surface/lame_client.cc +1 -1
  361. data/src/core/lib/surface/legacy_channel.cc +43 -30
  362. data/src/core/lib/surface/legacy_channel.h +9 -18
  363. data/src/core/lib/surface/server_call.cc +222 -0
  364. data/src/core/lib/surface/server_call.h +167 -0
  365. data/src/core/lib/surface/version.cc +2 -2
  366. data/src/core/lib/transport/bdp_estimator.cc +3 -5
  367. data/src/core/lib/transport/bdp_estimator.h +2 -4
  368. data/src/core/lib/transport/call_arena_allocator.h +9 -7
  369. data/src/core/lib/transport/call_destination.h +76 -0
  370. data/src/core/lib/transport/call_filters.cc +28 -10
  371. data/src/core/lib/transport/call_filters.h +128 -22
  372. data/src/core/lib/transport/call_spine.cc +5 -6
  373. data/src/core/lib/transport/call_spine.h +159 -334
  374. data/src/core/lib/transport/connectivity_state.cc +8 -10
  375. data/src/core/lib/transport/connectivity_state.h +0 -2
  376. data/src/core/lib/transport/interception_chain.cc +155 -0
  377. data/src/core/lib/transport/interception_chain.h +236 -0
  378. data/src/core/lib/transport/metadata_batch.h +10 -1
  379. data/src/core/lib/transport/metadata_info.h +1 -1
  380. data/src/core/lib/transport/transport.cc +3 -6
  381. data/src/core/lib/transport/transport.h +43 -40
  382. data/src/core/load_balancing/child_policy_handler.cc +8 -8
  383. data/src/core/load_balancing/endpoint_list.cc +5 -5
  384. data/src/core/load_balancing/endpoint_list.h +1 -1
  385. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +1 -0
  386. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -0
  387. data/src/core/load_balancing/grpclb/grpclb.cc +25 -29
  388. data/src/core/load_balancing/grpclb/grpclb_balancer_addresses.cc +1 -1
  389. data/src/core/load_balancing/grpclb/load_balancer_api.cc +3 -4
  390. data/src/core/load_balancing/health_check_client.cc +10 -13
  391. data/src/core/load_balancing/lb_policy.cc +5 -8
  392. data/src/core/load_balancing/lb_policy.h +19 -3
  393. data/src/core/load_balancing/lb_policy_factory.h +1 -1
  394. data/src/core/load_balancing/lb_policy_registry.cc +2 -3
  395. data/src/core/load_balancing/lb_policy_registry.h +1 -1
  396. data/src/core/load_balancing/oob_backend_metric.cc +2 -4
  397. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +33 -35
  398. data/src/core/load_balancing/outlier_detection/outlier_detection.h +3 -3
  399. data/src/core/load_balancing/pick_first/pick_first.cc +65 -65
  400. data/src/core/load_balancing/priority/priority.cc +26 -28
  401. data/src/core/load_balancing/ring_hash/ring_hash.cc +11 -13
  402. data/src/core/load_balancing/ring_hash/ring_hash.h +3 -3
  403. data/src/core/load_balancing/rls/rls.cc +82 -82
  404. data/src/core/load_balancing/round_robin/round_robin.cc +17 -20
  405. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +54 -43
  406. data/src/core/load_balancing/weighted_target/weighted_target.cc +21 -24
  407. data/src/core/load_balancing/xds/cds.cc +14 -16
  408. data/src/core/load_balancing/xds/xds_cluster_impl.cc +16 -18
  409. data/src/core/load_balancing/xds/xds_cluster_manager.cc +15 -17
  410. data/src/core/load_balancing/xds/xds_override_host.cc +40 -41
  411. data/src/core/load_balancing/xds/xds_override_host.h +3 -3
  412. data/src/core/load_balancing/xds/xds_wrr_locality.cc +10 -12
  413. data/src/core/plugin_registry/grpc_plugin_registry.cc +5 -1
  414. data/src/core/resolver/binder/binder_resolver.cc +3 -2
  415. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +3 -2
  416. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
  417. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +7 -14
  418. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -5
  419. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  420. data/src/core/resolver/dns/dns_resolver_plugin.cc +6 -5
  421. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +4 -9
  422. data/src/core/resolver/dns/event_engine/service_config_helper.cc +5 -5
  423. data/src/core/resolver/dns/native/dns_resolver.cc +8 -9
  424. data/src/core/resolver/endpoint_addresses.cc +1 -1
  425. data/src/core/resolver/fake/fake_resolver.cc +1 -1
  426. data/src/core/resolver/fake/fake_resolver.h +1 -1
  427. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +13 -14
  428. data/src/core/resolver/polling_resolver.cc +30 -35
  429. data/src/core/resolver/resolver.cc +2 -6
  430. data/src/core/resolver/resolver.h +0 -2
  431. data/src/core/resolver/resolver_registry.cc +6 -8
  432. data/src/core/resolver/sockaddr/sockaddr_resolver.cc +3 -3
  433. data/src/core/resolver/xds/xds_dependency_manager.cc +22 -23
  434. data/src/core/resolver/xds/xds_resolver.cc +13 -15
  435. data/src/core/server/server.cc +269 -389
  436. data/src/core/server/server.h +37 -19
  437. data/src/core/server/server_call_tracer_filter.cc +7 -14
  438. data/src/core/server/server_config_selector.h +1 -1
  439. data/src/core/server/server_config_selector_filter.cc +3 -3
  440. data/src/core/server/server_interface.h +2 -0
  441. data/src/core/server/xds_channel_stack_modifier.cc +1 -1
  442. data/src/core/server/xds_channel_stack_modifier.h +1 -1
  443. data/src/core/server/xds_server_config_fetcher.cc +1 -4
  444. data/src/core/service_config/service_config.h +1 -1
  445. data/src/core/service_config/service_config_call_data.h +13 -11
  446. data/src/core/service_config/service_config_channel_arg_filter.cc +6 -4
  447. data/src/core/service_config/service_config_impl.cc +5 -5
  448. data/src/core/service_config/service_config_impl.h +1 -1
  449. data/src/core/service_config/service_config_parser.cc +3 -6
  450. data/src/core/service_config/service_config_parser.h +1 -1
  451. data/src/core/{lib/channel → telemetry}/call_tracer.cc +20 -30
  452. data/src/core/{lib/channel → telemetry}/call_tracer.h +32 -9
  453. data/src/core/{lib/debug → telemetry}/histogram_view.cc +1 -1
  454. data/src/core/{lib/debug → telemetry}/histogram_view.h +3 -3
  455. data/src/core/telemetry/metrics.cc +178 -0
  456. data/src/core/telemetry/metrics.h +562 -0
  457. data/src/core/{lib/debug → telemetry}/stats.cc +1 -1
  458. data/src/core/{lib/debug → telemetry}/stats.h +5 -5
  459. data/src/core/{lib/debug → telemetry}/stats_data.cc +1 -1
  460. data/src/core/{lib/debug → telemetry}/stats_data.h +4 -4
  461. data/src/core/{lib/channel → telemetry}/tcp_tracer.h +3 -3
  462. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +12 -13
  463. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +25 -27
  464. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +32 -33
  465. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
  466. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -1
  467. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +5 -4
  468. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +5 -3
  469. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  470. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -3
  471. data/src/core/tsi/fake_transport_security.cc +14 -17
  472. data/src/core/tsi/local_transport_security.cc +6 -5
  473. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +4 -4
  474. data/src/core/tsi/ssl_transport_security.cc +76 -81
  475. data/src/core/tsi/ssl_transport_security_utils.cc +74 -18
  476. data/src/core/tsi/ssl_transport_security_utils.h +11 -0
  477. data/src/core/tsi/transport_security.cc +0 -4
  478. data/src/core/tsi/transport_security.h +0 -2
  479. data/src/core/tsi/transport_security_interface.h +0 -4
  480. data/src/core/{lib/gpr → util}/alloc.h +3 -3
  481. data/src/core/{lib/gpr → util}/android/log.cc +0 -19
  482. data/src/core/{lib/gpr → util}/atm.cc +1 -1
  483. data/src/core/{ext/gcp/metadata_query.cc → util/gcp_metadata_query.cc} +25 -26
  484. data/src/core/{ext/gcp/metadata_query.h → util/gcp_metadata_query.h} +11 -11
  485. data/src/core/{lib/http → util/http_client}/format_request.cc +4 -3
  486. data/src/core/{lib/http → util/http_client}/format_request.h +6 -5
  487. data/src/core/{lib/http → util/http_client}/httpcli.cc +9 -10
  488. data/src/core/{lib/http → util/http_client}/httpcli.h +6 -5
  489. data/src/core/{lib/http → util/http_client}/httpcli_security_connector.cc +9 -9
  490. data/src/core/{lib/http → util/http_client}/httpcli_ssl_credentials.h +5 -4
  491. data/src/core/{lib/http → util/http_client}/parser.cc +4 -5
  492. data/src/core/{lib/http → util/http_client}/parser.h +5 -6
  493. data/src/core/{lib → util}/json/json.h +5 -4
  494. data/src/core/{lib → util}/json/json_args.h +5 -5
  495. data/src/core/{lib → util}/json/json_channel_args.h +6 -6
  496. data/src/core/{lib → util}/json/json_object_loader.cc +3 -2
  497. data/src/core/{lib → util}/json/json_object_loader.h +7 -7
  498. data/src/core/{lib → util}/json/json_reader.cc +3 -2
  499. data/src/core/{lib → util}/json/json_reader.h +6 -6
  500. data/src/core/{lib → util}/json/json_util.cc +4 -4
  501. data/src/core/{lib → util}/json/json_util.h +6 -6
  502. data/src/core/{lib → util}/json/json_writer.cc +3 -3
  503. data/src/core/{lib → util}/json/json_writer.h +6 -6
  504. data/src/core/{lib/gpr → util}/linux/log.cc +0 -45
  505. data/src/core/{lib/gpr → util}/log.cc +45 -12
  506. data/src/core/{lib/gpr → util}/msys/tmpfile.cc +2 -2
  507. data/src/core/{lib/gpr → util}/posix/cpu.cc +1 -1
  508. data/src/core/{lib/gpr → util}/posix/log.cc +0 -42
  509. data/src/core/{lib/gpr → util}/posix/time.cc +1 -1
  510. data/src/core/{lib/gpr → util}/posix/tmpfile.cc +2 -2
  511. data/src/core/{lib/gpr → util}/spinlock.h +3 -3
  512. data/src/core/{lib/gpr → util}/string.cc +2 -2
  513. data/src/core/{lib/gpr → util}/string.h +3 -3
  514. data/src/core/{lib/gpr → util}/time_precise.cc +1 -1
  515. data/src/core/{lib/gpr → util}/time_precise.h +3 -3
  516. data/src/core/{lib/gpr → util}/tmpfile.h +3 -3
  517. data/src/core/{lib/gpr → util}/useful.h +3 -3
  518. data/src/core/{lib/gpr → util}/windows/log.cc +1 -44
  519. data/src/core/{lib/gpr → util}/windows/string.cc +1 -1
  520. data/src/core/{lib/gpr → util}/windows/string_util.cc +1 -1
  521. data/src/core/{lib/gpr → util}/windows/time.cc +1 -1
  522. data/src/core/{lib/gpr → util}/windows/tmpfile.cc +1 -1
  523. data/src/core/xds/grpc/certificate_provider_store.cc +3 -3
  524. data/src/core/xds/grpc/certificate_provider_store.h +4 -4
  525. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +3 -3
  526. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +3 -3
  527. data/src/core/xds/grpc/xds_audit_logger_registry.h +1 -1
  528. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +5 -5
  529. data/src/core/xds/grpc/xds_bootstrap_grpc.h +3 -3
  530. data/src/core/xds/grpc/xds_certificate_provider.h +1 -1
  531. data/src/core/xds/grpc/xds_client_grpc.cc +27 -23
  532. data/src/core/xds/grpc/xds_client_grpc.h +2 -2
  533. data/src/core/xds/grpc/xds_cluster.cc +4 -5
  534. data/src/core/xds/grpc/xds_cluster.h +1 -1
  535. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  536. data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +1 -1
  537. data/src/core/xds/grpc/xds_common_types.cc +1 -1
  538. data/src/core/xds/grpc/xds_common_types.h +1 -1
  539. data/src/core/xds/grpc/xds_endpoint.cc +4 -5
  540. data/src/core/xds/grpc/xds_http_fault_filter.cc +2 -2
  541. data/src/core/xds/grpc/xds_http_filters.h +2 -2
  542. data/src/core/xds/grpc/xds_http_rbac_filter.cc +3 -3
  543. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +2 -2
  544. data/src/core/xds/grpc/xds_lb_policy_registry.h +1 -1
  545. data/src/core/xds/grpc/xds_listener.cc +4 -6
  546. data/src/core/xds/grpc/xds_route_config.cc +7 -8
  547. data/src/core/xds/grpc/xds_transport_grpc.cc +2 -2
  548. data/src/core/xds/grpc/xds_transport_grpc.h +1 -1
  549. data/src/core/xds/xds_client/xds_api.cc +5 -9
  550. data/src/core/xds/xds_client/xds_bootstrap.cc +1 -1
  551. data/src/core/xds/xds_client/xds_bootstrap.h +1 -1
  552. data/src/core/xds/xds_client/xds_client.cc +39 -45
  553. data/src/core/xds/xds_client/xds_client.h +0 -3
  554. data/src/core/xds/xds_client/xds_client_stats.cc +20 -18
  555. data/src/core/xds/xds_client/xds_client_stats.h +2 -2
  556. data/src/ruby/ext/grpc/rb_call.c +8 -1
  557. data/src/ruby/ext/grpc/rb_completion_queue.c +15 -32
  558. data/src/ruby/ext/grpc/rb_completion_queue.h +7 -1
  559. data/src/ruby/ext/grpc/rb_server.c +39 -22
  560. data/src/ruby/lib/grpc/version.rb +1 -1
  561. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +4 -0
  562. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +12 -12
  563. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +66 -41
  564. data/third_party/boringssl-with-bazel/src/crypto/dilithium/dilithium.c +1497 -0
  565. data/third_party/boringssl-with-bazel/src/crypto/dilithium/internal.h +58 -0
  566. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -3
  567. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +0 -2
  568. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +2 -0
  569. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +5 -0
  570. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +45 -1
  571. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +33 -23
  572. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c +3 -6
  573. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +9 -4
  574. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +6 -0
  575. data/third_party/boringssl-with-bazel/src/crypto/internal.h +7 -0
  576. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +0 -4
  577. data/third_party/boringssl-with-bazel/src/crypto/x509/v3_utl.c +49 -16
  578. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -10
  579. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +7 -17
  580. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +8 -6
  581. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +3 -0
  582. data/third_party/boringssl-with-bazel/src/include/openssl/experimental/dilithium.h +125 -0
  583. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +0 -23
  584. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +1 -1
  585. data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -10
  586. metadata +95 -91
  587. data/src/core/ext/transport/chttp2/transport/http_trace.cc +0 -19
  588. data/src/core/ext/transport/chttp2/transport/http_trace.h +0 -24
  589. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -23
  590. data/src/core/handshaker/security/tsi_error.cc +0 -31
  591. data/src/core/handshaker/security/tsi_error.h +0 -30
  592. data/src/core/lib/channel/channel_stack_trace.cc +0 -19
  593. data/src/core/lib/channel/channel_stack_trace.h +0 -24
  594. data/src/core/lib/channel/context.h +0 -105
  595. data/src/core/lib/channel/metrics.cc +0 -334
  596. data/src/core/lib/channel/metrics.h +0 -365
  597. data/src/core/lib/event_engine/trace.cc +0 -25
  598. data/src/core/lib/iomgr/ev_windows.cc +0 -30
  599. data/src/core/lib/promise/trace.cc +0 -20
  600. data/src/core/lib/promise/trace.h +0 -24
  601. data/src/core/lib/resource_quota/trace.cc +0 -19
  602. data/src/core/lib/resource_quota/trace.h +0 -24
  603. data/src/core/lib/slice/slice_refcount.cc +0 -20
  604. data/src/core/lib/surface/api_trace.cc +0 -25
  605. data/src/core/lib/surface/call_trace.h +0 -24
  606. data/src/core/lib/surface/wait_for_cq_end_op.cc +0 -75
  607. data/src/core/lib/surface/wait_for_cq_end_op.h +0 -72
  608. data/src/core/lib/transport/batch_builder.cc +0 -172
  609. data/src/core/lib/transport/batch_builder.h +0 -474
  610. data/src/core/resolver/xds/xds_resolver_trace.cc +0 -25
  611. data/src/core/resolver/xds/xds_resolver_trace.h +0 -30
  612. data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +0 -122
  613. /data/src/core/{lib/gpr → util}/alloc.cc +0 -0
  614. /data/src/core/{lib/gpr → util}/iphone/cpu.cc +0 -0
  615. /data/src/core/{lib/gpr → util}/linux/cpu.cc +0 -0
  616. /data/src/core/{lib/gpr → util}/posix/string.cc +0 -0
  617. /data/src/core/{lib/gpr → util}/posix/sync.cc +0 -0
  618. /data/src/core/{lib/gpr → util}/sync.cc +0 -0
  619. /data/src/core/{lib/gpr → util}/sync_abseil.cc +0 -0
  620. /data/src/core/{lib/gpr → util}/time.cc +0 -0
  621. /data/src/core/{lib/gpr → util}/windows/cpu.cc +0 -0
  622. /data/src/core/{lib/gpr → util}/windows/sync.cc +0 -0
@@ -0,0 +1,1324 @@
1
+ // Copyright 2015 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include <grpc/support/port_platform.h>
16
+
17
+ #include "src/core/client_channel/client_channel.h"
18
+
19
+ #include <inttypes.h>
20
+ #include <limits.h>
21
+
22
+ #include <algorithm>
23
+ #include <functional>
24
+ #include <new>
25
+ #include <set>
26
+ #include <type_traits>
27
+ #include <utility>
28
+ #include <vector>
29
+
30
+ #include "absl/cleanup/cleanup.h"
31
+ #include "absl/status/status.h"
32
+ #include "absl/status/statusor.h"
33
+ #include "absl/strings/cord.h"
34
+ #include "absl/strings/numbers.h"
35
+ #include "absl/strings/str_cat.h"
36
+ #include "absl/strings/str_join.h"
37
+ #include "absl/strings/string_view.h"
38
+ #include "absl/types/optional.h"
39
+ #include "absl/types/variant.h"
40
+
41
+ #include <grpc/event_engine/event_engine.h>
42
+ #include <grpc/impl/channel_arg_names.h>
43
+ #include <grpc/slice.h>
44
+ #include <grpc/status.h>
45
+ #include <grpc/support/json.h>
46
+ #include <grpc/support/log.h>
47
+ #include <grpc/support/metrics.h>
48
+ #include <grpc/support/string_util.h>
49
+ #include <grpc/support/time.h>
50
+
51
+ #include "src/core/client_channel/client_channel_internal.h"
52
+ #include "src/core/client_channel/client_channel_service_config.h"
53
+ #include "src/core/client_channel/config_selector.h"
54
+ #include "src/core/client_channel/dynamic_filters.h"
55
+ #include "src/core/client_channel/global_subchannel_pool.h"
56
+ #include "src/core/client_channel/local_subchannel_pool.h"
57
+ #include "src/core/client_channel/subchannel.h"
58
+ #include "src/core/client_channel/subchannel_interface_internal.h"
59
+ #include "src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h"
60
+ #include "src/core/lib/channel/channel_args.h"
61
+ #include "src/core/lib/channel/status_util.h"
62
+ #include "src/core/lib/config/core_configuration.h"
63
+ #include "src/core/lib/debug/trace.h"
64
+ #include "src/core/lib/gprpp/crash.h"
65
+ #include "src/core/lib/gprpp/debug_location.h"
66
+ #include "src/core/lib/gprpp/sync.h"
67
+ #include "src/core/lib/gprpp/work_serializer.h"
68
+ #include "src/core/lib/iomgr/resolved_address.h"
69
+ #include "src/core/lib/promise/context.h"
70
+ #include "src/core/lib/promise/exec_ctx_wakeup_scheduler.h"
71
+ #include "src/core/lib/promise/loop.h"
72
+ #include "src/core/lib/promise/map.h"
73
+ #include "src/core/lib/promise/poll.h"
74
+ #include "src/core/lib/promise/sleep.h"
75
+ #include "src/core/lib/promise/try_seq.h"
76
+ #include "src/core/lib/security/credentials/credentials.h"
77
+ #include "src/core/lib/slice/slice.h"
78
+ #include "src/core/lib/slice/slice_internal.h"
79
+ #include "src/core/lib/surface/call.h"
80
+ #include "src/core/lib/surface/channel.h"
81
+ #include "src/core/lib/surface/client_call.h"
82
+ #include "src/core/lib/surface/completion_queue.h"
83
+ #include "src/core/lib/transport/call_spine.h"
84
+ #include "src/core/lib/transport/connectivity_state.h"
85
+ #include "src/core/lib/transport/metadata_batch.h"
86
+ #include "src/core/load_balancing/child_policy_handler.h"
87
+ #include "src/core/load_balancing/lb_policy.h"
88
+ #include "src/core/load_balancing/lb_policy_registry.h"
89
+ #include "src/core/load_balancing/subchannel_interface.h"
90
+ #include "src/core/resolver/endpoint_addresses.h"
91
+ #include "src/core/resolver/resolver_registry.h"
92
+ #include "src/core/service_config/service_config_impl.h"
93
+ #include "src/core/telemetry/metrics.h"
94
+ #include "src/core/util/json/json.h"
95
+ #include "src/core/util/useful.h"
96
+
97
+ namespace grpc_core {
98
+
99
+ using grpc_event_engine::experimental::EventEngine;
100
+
101
+ using internal::ClientChannelMethodParsedConfig;
102
+
103
+ //
104
+ // ClientChannel::ResolverResultHandler
105
+ //
106
+
107
+ class ClientChannel::ResolverResultHandler : public Resolver::ResultHandler {
108
+ public:
109
+ explicit ResolverResultHandler(
110
+ WeakRefCountedPtr<ClientChannel> client_channel)
111
+ : client_channel_(std::move(client_channel)) {}
112
+
113
+ ~ResolverResultHandler() override {
114
+ GRPC_TRACE_LOG(client_channel, INFO)
115
+ << "client_channel=" << client_channel_.get()
116
+ << ": resolver shutdown complete";
117
+ }
118
+
119
+ void ReportResult(Resolver::Result result) override
120
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_) {
121
+ client_channel_->OnResolverResultChangedLocked(std::move(result));
122
+ }
123
+
124
+ private:
125
+ WeakRefCountedPtr<ClientChannel> client_channel_;
126
+ };
127
+
128
+ //
129
+ // ClientChannel::SubchannelWrapper
130
+ //
131
+
132
+ // This class is a wrapper for Subchannel that hides details of the
133
+ // channel's implementation (such as the connected subchannel) from the
134
+ // LB policy API.
135
+ //
136
+ // Note that no synchronization is needed here, because even if the
137
+ // underlying subchannel is shared between channels, this wrapper will only
138
+ // be used within one channel, so it will always be synchronized by the
139
+ // control plane work_serializer.
140
+ class ClientChannel::SubchannelWrapper
141
+ : public SubchannelInterfaceWithCallDestination {
142
+ public:
143
+ SubchannelWrapper(WeakRefCountedPtr<ClientChannel> client_channel,
144
+ RefCountedPtr<Subchannel> subchannel);
145
+ ~SubchannelWrapper() override;
146
+
147
+ void Orphaned() override;
148
+ void WatchConnectivityState(
149
+ std::unique_ptr<ConnectivityStateWatcherInterface> watcher) override
150
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_);
151
+ void CancelConnectivityStateWatch(
152
+ ConnectivityStateWatcherInterface* watcher) override
153
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_);
154
+
155
+ RefCountedPtr<UnstartedCallDestination> call_destination() override {
156
+ return subchannel_->call_destination();
157
+ }
158
+
159
+ void RequestConnection() override { subchannel_->RequestConnection(); }
160
+
161
+ void ResetBackoff() override { subchannel_->ResetBackoff(); }
162
+
163
+ void AddDataWatcher(std::unique_ptr<DataWatcherInterface> watcher) override
164
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_);
165
+ void CancelDataWatcher(DataWatcherInterface* watcher) override
166
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_);
167
+ void ThrottleKeepaliveTime(int new_keepalive_time);
168
+
169
+ private:
170
+ class WatcherWrapper;
171
+
172
+ // A heterogenous lookup comparator for data watchers that allows
173
+ // unique_ptr keys to be looked up as raw pointers.
174
+ struct DataWatcherLessThan {
175
+ using is_transparent = void;
176
+ bool operator()(const std::unique_ptr<DataWatcherInterface>& p1,
177
+ const std::unique_ptr<DataWatcherInterface>& p2) const {
178
+ return p1 < p2;
179
+ }
180
+ bool operator()(const std::unique_ptr<DataWatcherInterface>& p1,
181
+ const DataWatcherInterface* p2) const {
182
+ return p1.get() < p2;
183
+ }
184
+ bool operator()(const DataWatcherInterface* p1,
185
+ const std::unique_ptr<DataWatcherInterface>& p2) const {
186
+ return p1 < p2.get();
187
+ }
188
+ };
189
+
190
+ WeakRefCountedPtr<ClientChannel> client_channel_;
191
+ RefCountedPtr<Subchannel> subchannel_;
192
+ // Maps from the address of the watcher passed to us by the LB policy
193
+ // to the address of the WrapperWatcher that we passed to the underlying
194
+ // subchannel. This is needed so that when the LB policy calls
195
+ // CancelConnectivityStateWatch() with its watcher, we know the
196
+ // corresponding WrapperWatcher to cancel on the underlying subchannel.
197
+ std::map<ConnectivityStateWatcherInterface*, WatcherWrapper*> watcher_map_
198
+ ABSL_GUARDED_BY(*client_channel_->work_serializer_);
199
+ std::set<std::unique_ptr<DataWatcherInterface>, DataWatcherLessThan>
200
+ data_watchers_ ABSL_GUARDED_BY(*client_channel_->work_serializer_);
201
+ };
202
+
203
+ // This wrapper provides a bridge between the internal Subchannel API
204
+ // and the SubchannelInterface API that we expose to LB policies.
205
+ // It implements Subchannel::ConnectivityStateWatcherInterface and wraps
206
+ // the instance of SubchannelInterface::ConnectivityStateWatcherInterface
207
+ // that was passed in by the LB policy. We pass an instance of this
208
+ // class to the underlying Subchannel, and when we get updates from
209
+ // the subchannel, we pass those on to the wrapped watcher to return
210
+ // the update to the LB policy.
211
+ //
212
+ // This class handles things like hopping into the WorkSerializer
213
+ // before passing notifications to the LB policy and propagating
214
+ // keepalive information betwen subchannels.
215
+ class ClientChannel::SubchannelWrapper::WatcherWrapper
216
+ : public Subchannel::ConnectivityStateWatcherInterface {
217
+ public:
218
+ WatcherWrapper(
219
+ std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
220
+ watcher,
221
+ RefCountedPtr<SubchannelWrapper> subchannel_wrapper)
222
+ : watcher_(std::move(watcher)),
223
+ subchannel_wrapper_(std::move(subchannel_wrapper)) {}
224
+
225
+ ~WatcherWrapper() override {
226
+ subchannel_wrapper_.reset(DEBUG_LOCATION, "WatcherWrapper");
227
+ }
228
+
229
+ void OnConnectivityStateChange(
230
+ RefCountedPtr<ConnectivityStateWatcherInterface> self,
231
+ grpc_connectivity_state state, const absl::Status& status) override {
232
+ GRPC_TRACE_LOG(client_channel, INFO)
233
+ << "client_channel=" << subchannel_wrapper_->client_channel_.get()
234
+ << ": connectivity change for subchannel wrapper "
235
+ << subchannel_wrapper_.get() << " subchannel "
236
+ << subchannel_wrapper_->subchannel_.get()
237
+ << "; hopping into work_serializer";
238
+ self.release(); // Held by callback.
239
+ subchannel_wrapper_->client_channel_->work_serializer_->Run(
240
+ [this, state, status]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(
241
+ *subchannel_wrapper_->client_channel_->work_serializer_) {
242
+ ApplyUpdateInControlPlaneWorkSerializer(state, status);
243
+ Unref();
244
+ },
245
+ DEBUG_LOCATION);
246
+ }
247
+
248
+ grpc_pollset_set* interested_parties() override { return nullptr; }
249
+
250
+ private:
251
+ void ApplyUpdateInControlPlaneWorkSerializer(grpc_connectivity_state state,
252
+ const absl::Status& status)
253
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(
254
+ *subchannel_wrapper_->client_channel_->work_serializer_) {
255
+ GRPC_TRACE_LOG(client_channel, INFO)
256
+ << "client_channel=" << subchannel_wrapper_->client_channel_.get()
257
+ << ": processing connectivity change in work serializer for subchannel "
258
+ "wrapper "
259
+ << subchannel_wrapper_.get() << " subchannel "
260
+ << subchannel_wrapper_->subchannel_.get()
261
+ << " watcher=" << watcher_.get()
262
+ << "state=" << ConnectivityStateName(state) << " status=" << status;
263
+ absl::optional<absl::Cord> keepalive_throttling =
264
+ status.GetPayload(kKeepaliveThrottlingKey);
265
+ if (keepalive_throttling.has_value()) {
266
+ int new_keepalive_time = -1;
267
+ if (absl::SimpleAtoi(std::string(keepalive_throttling.value()),
268
+ &new_keepalive_time)) {
269
+ if (new_keepalive_time >
270
+ subchannel_wrapper_->client_channel_->keepalive_time_) {
271
+ subchannel_wrapper_->client_channel_->keepalive_time_ =
272
+ new_keepalive_time;
273
+ GRPC_TRACE_LOG(client_channel, INFO)
274
+ << "client_channel=" << subchannel_wrapper_->client_channel_.get()
275
+ << ": throttling keepalive time to "
276
+ << subchannel_wrapper_->client_channel_->keepalive_time_;
277
+ // Propagate the new keepalive time to all subchannels. This is so
278
+ // that new transports created by any subchannel (and not just the
279
+ // subchannel that received the GOAWAY), use the new keepalive time.
280
+ for (auto* subchannel_wrapper :
281
+ subchannel_wrapper_->client_channel_->subchannel_wrappers_) {
282
+ subchannel_wrapper->ThrottleKeepaliveTime(new_keepalive_time);
283
+ }
284
+ }
285
+ } else {
286
+ gpr_log(GPR_ERROR,
287
+ "client_channel=%p: Illegal keepalive throttling value %s",
288
+ subchannel_wrapper_->client_channel_.get(),
289
+ std::string(keepalive_throttling.value()).c_str());
290
+ }
291
+ }
292
+ // Propagate status only in state TF.
293
+ // We specifically want to avoid propagating the status for
294
+ // state IDLE that the real subchannel gave us only for the
295
+ // purpose of keepalive propagation.
296
+ watcher_->OnConnectivityStateChange(
297
+ state,
298
+ state == GRPC_CHANNEL_TRANSIENT_FAILURE ? status : absl::OkStatus());
299
+ }
300
+
301
+ std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
302
+ watcher_;
303
+ RefCountedPtr<SubchannelWrapper> subchannel_wrapper_;
304
+ };
305
+
306
+ ClientChannel::SubchannelWrapper::SubchannelWrapper(
307
+ WeakRefCountedPtr<ClientChannel> client_channel,
308
+ RefCountedPtr<Subchannel> subchannel)
309
+ : SubchannelInterfaceWithCallDestination(
310
+ GRPC_TRACE_FLAG_ENABLED(client_channel) ? "SubchannelWrapper"
311
+ : nullptr),
312
+ client_channel_(std::move(client_channel)),
313
+ subchannel_(std::move(subchannel)) {
314
+ GRPC_TRACE_LOG(client_channel, INFO)
315
+ << "client_channel=" << client_channel_.get()
316
+ << ": creating subchannel wrapper " << this << " for subchannel "
317
+ << subchannel_.get();
318
+ #ifndef NDEBUG
319
+ DCHECK(client_channel_->work_serializer_->RunningInWorkSerializer());
320
+ #endif
321
+ if (client_channel_->channelz_node_ != nullptr) {
322
+ auto* subchannel_node = subchannel_->channelz_node();
323
+ if (subchannel_node != nullptr) {
324
+ auto it =
325
+ client_channel_->subchannel_refcount_map_.find(subchannel_.get());
326
+ if (it == client_channel_->subchannel_refcount_map_.end()) {
327
+ client_channel_->channelz_node_->AddChildSubchannel(
328
+ subchannel_node->uuid());
329
+ it = client_channel_->subchannel_refcount_map_
330
+ .emplace(subchannel_.get(), 0)
331
+ .first;
332
+ }
333
+ ++it->second;
334
+ }
335
+ }
336
+ client_channel_->subchannel_wrappers_.insert(this);
337
+ }
338
+
339
+ ClientChannel::SubchannelWrapper::~SubchannelWrapper() {
340
+ GRPC_TRACE_LOG(client_channel, INFO)
341
+ << "client_channel=" << client_channel_.get()
342
+ << ": destroying subchannel wrapper " << this << " for subchannel "
343
+ << subchannel_.get();
344
+ }
345
+
346
+ void ClientChannel::SubchannelWrapper::Orphaned() {
347
+ // Make sure we clean up the channel's subchannel maps inside the
348
+ // WorkSerializer.
349
+ auto self = WeakRefAsSubclass<SubchannelWrapper>(DEBUG_LOCATION,
350
+ "subchannel map cleanup");
351
+ client_channel_->work_serializer_->Run(
352
+ [self]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(
353
+ *self->client_channel_->work_serializer_) {
354
+ self->client_channel_->subchannel_wrappers_.erase(self.get());
355
+ if (self->client_channel_->channelz_node_ != nullptr) {
356
+ auto* subchannel_node = self->subchannel_->channelz_node();
357
+ if (subchannel_node != nullptr) {
358
+ auto it = self->client_channel_->subchannel_refcount_map_.find(
359
+ self->subchannel_.get());
360
+ CHECK(it != self->client_channel_->subchannel_refcount_map_.end());
361
+ --it->second;
362
+ if (it->second == 0) {
363
+ self->client_channel_->channelz_node_->RemoveChildSubchannel(
364
+ subchannel_node->uuid());
365
+ self->client_channel_->subchannel_refcount_map_.erase(it);
366
+ }
367
+ }
368
+ }
369
+ },
370
+ DEBUG_LOCATION);
371
+ }
372
+
373
+ void ClientChannel::SubchannelWrapper::WatchConnectivityState(
374
+ std::unique_ptr<ConnectivityStateWatcherInterface> watcher) {
375
+ auto& watcher_wrapper = watcher_map_[watcher.get()];
376
+ CHECK(watcher_wrapper == nullptr);
377
+ watcher_wrapper = new WatcherWrapper(
378
+ std::move(watcher),
379
+ RefAsSubclass<SubchannelWrapper>(DEBUG_LOCATION, "WatcherWrapper"));
380
+ subchannel_->WatchConnectivityState(
381
+ RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface>(
382
+ watcher_wrapper));
383
+ }
384
+
385
+ void ClientChannel::SubchannelWrapper::CancelConnectivityStateWatch(
386
+ ConnectivityStateWatcherInterface* watcher) {
387
+ auto it = watcher_map_.find(watcher);
388
+ CHECK(it != watcher_map_.end());
389
+ subchannel_->CancelConnectivityStateWatch(it->second);
390
+ watcher_map_.erase(it);
391
+ }
392
+
393
+ void ClientChannel::SubchannelWrapper::AddDataWatcher(
394
+ std::unique_ptr<DataWatcherInterface> watcher) {
395
+ static_cast<InternalSubchannelDataWatcherInterface*>(watcher.get())
396
+ ->SetSubchannel(subchannel_.get());
397
+ CHECK(data_watchers_.insert(std::move(watcher)).second);
398
+ }
399
+
400
+ void ClientChannel::SubchannelWrapper::CancelDataWatcher(
401
+ DataWatcherInterface* watcher) {
402
+ auto it = data_watchers_.find(watcher);
403
+ if (it != data_watchers_.end()) data_watchers_.erase(it);
404
+ }
405
+
406
+ void ClientChannel::SubchannelWrapper::ThrottleKeepaliveTime(
407
+ int new_keepalive_time) {
408
+ subchannel_->ThrottleKeepaliveTime(new_keepalive_time);
409
+ }
410
+
411
+ //
412
+ // ClientChannel::ClientChannelControlHelper
413
+ //
414
+
415
+ class ClientChannel::ClientChannelControlHelper
416
+ : public LoadBalancingPolicy::ChannelControlHelper {
417
+ public:
418
+ explicit ClientChannelControlHelper(
419
+ WeakRefCountedPtr<ClientChannel> client_channel)
420
+ : client_channel_(std::move(client_channel)) {}
421
+
422
+ ~ClientChannelControlHelper() override {
423
+ client_channel_.reset(DEBUG_LOCATION, "ClientChannelControlHelper");
424
+ }
425
+
426
+ RefCountedPtr<SubchannelInterface> CreateSubchannel(
427
+ const grpc_resolved_address& address, const ChannelArgs& per_address_args,
428
+ const ChannelArgs& args) override
429
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_) {
430
+ // If shutting down, do nothing.
431
+ if (client_channel_->resolver_ == nullptr) return nullptr;
432
+ ChannelArgs subchannel_args = Subchannel::MakeSubchannelArgs(
433
+ args, per_address_args, client_channel_->subchannel_pool_,
434
+ client_channel_->default_authority_);
435
+ // Create subchannel.
436
+ RefCountedPtr<Subchannel> subchannel =
437
+ client_channel_->client_channel_factory_->CreateSubchannel(
438
+ address, subchannel_args);
439
+ if (subchannel == nullptr) return nullptr;
440
+ // Make sure the subchannel has updated keepalive time.
441
+ subchannel->ThrottleKeepaliveTime(client_channel_->keepalive_time_);
442
+ // Create and return wrapper for the subchannel.
443
+ return MakeRefCounted<SubchannelWrapper>(client_channel_,
444
+ std::move(subchannel));
445
+ }
446
+
447
+ void UpdateState(
448
+ grpc_connectivity_state state, const absl::Status& status,
449
+ RefCountedPtr<LoadBalancingPolicy::SubchannelPicker> picker) override
450
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_) {
451
+ if (client_channel_->resolver_ == nullptr) return; // Shutting down.
452
+ if (GRPC_TRACE_FLAG_ENABLED(client_channel)) {
453
+ const char* extra = client_channel_->disconnect_error_.ok()
454
+ ? ""
455
+ : " (ignoring -- channel shutting down)";
456
+ gpr_log(GPR_INFO,
457
+ "client_channel=%p: update: state=%s status=(%s) picker=%p%s",
458
+ client_channel_.get(), ConnectivityStateName(state),
459
+ status.ToString().c_str(), picker.get(), extra);
460
+ }
461
+ // Do update only if not shutting down.
462
+ if (client_channel_->disconnect_error_.ok()) {
463
+ client_channel_->UpdateStateAndPickerLocked(state, status, "helper",
464
+ std::move(picker));
465
+ }
466
+ }
467
+
468
+ void RequestReresolution() override
469
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_) {
470
+ if (client_channel_->resolver_ == nullptr) return; // Shutting down.
471
+ GRPC_TRACE_LOG(client_channel, INFO)
472
+ << "client_channel=" << client_channel_.get()
473
+ << ": started name re-resolving";
474
+ client_channel_->resolver_->RequestReresolutionLocked();
475
+ }
476
+
477
+ absl::string_view GetTarget() override { return client_channel_->target(); }
478
+
479
+ absl::string_view GetAuthority() override {
480
+ return client_channel_->default_authority_;
481
+ }
482
+
483
+ RefCountedPtr<grpc_channel_credentials> GetChannelCredentials() override {
484
+ return client_channel_->channel_args_.GetObject<grpc_channel_credentials>()
485
+ ->duplicate_without_call_credentials();
486
+ }
487
+
488
+ RefCountedPtr<grpc_channel_credentials> GetUnsafeChannelCredentials()
489
+ override {
490
+ return client_channel_->channel_args_.GetObject<grpc_channel_credentials>()
491
+ ->Ref();
492
+ }
493
+
494
+ EventEngine* GetEventEngine() override {
495
+ return client_channel_->event_engine();
496
+ }
497
+
498
+ GlobalStatsPluginRegistry::StatsPluginGroup& GetStatsPluginGroup() override {
499
+ return client_channel_->stats_plugin_group_;
500
+ }
501
+
502
+ void AddTraceEvent(TraceSeverity severity, absl::string_view message) override
503
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(*client_channel_->work_serializer_) {
504
+ if (client_channel_->resolver_ == nullptr) return; // Shutting down.
505
+ if (client_channel_->channelz_node_ != nullptr) {
506
+ client_channel_->channelz_node_->AddTraceEvent(
507
+ ConvertSeverityEnum(severity),
508
+ grpc_slice_from_copied_buffer(message.data(), message.size()));
509
+ }
510
+ }
511
+
512
+ private:
513
+ static channelz::ChannelTrace::Severity ConvertSeverityEnum(
514
+ TraceSeverity severity) {
515
+ if (severity == TRACE_INFO) return channelz::ChannelTrace::Info;
516
+ if (severity == TRACE_WARNING) return channelz::ChannelTrace::Warning;
517
+ return channelz::ChannelTrace::Error;
518
+ }
519
+
520
+ WeakRefCountedPtr<ClientChannel> client_channel_;
521
+ };
522
+
523
+ //
524
+ // ClientChannel implementation
525
+ //
526
+
527
+ namespace {
528
+
529
+ RefCountedPtr<SubchannelPoolInterface> GetSubchannelPool(
530
+ const ChannelArgs& args) {
531
+ if (args.GetBool(GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL).value_or(false)) {
532
+ return MakeRefCounted<LocalSubchannelPool>();
533
+ }
534
+ return GlobalSubchannelPool::instance();
535
+ }
536
+
537
+ } // namespace
538
+
539
+ absl::StatusOr<RefCountedPtr<Channel>> ClientChannel::Create(
540
+ std::string target, ChannelArgs channel_args) {
541
+ // Get URI to resolve, using proxy mapper if needed.
542
+ if (target.empty()) {
543
+ return absl::InternalError("target URI is empty in client channel");
544
+ }
545
+ std::string uri_to_resolve = CoreConfiguration::Get()
546
+ .proxy_mapper_registry()
547
+ .MapName(target, &channel_args)
548
+ .value_or(target);
549
+ // Make sure the URI to resolve is valid, so that we know that
550
+ // resolver creation will succeed later.
551
+ if (!CoreConfiguration::Get().resolver_registry().IsValidTarget(
552
+ uri_to_resolve)) {
553
+ return absl::InvalidArgumentError(
554
+ absl::StrCat("invalid target URI: ", uri_to_resolve));
555
+ }
556
+ // Get default service config. If none is specified via the client API,
557
+ // we use an empty config.
558
+ absl::optional<absl::string_view> service_config_json =
559
+ channel_args.GetString(GRPC_ARG_SERVICE_CONFIG);
560
+ if (!service_config_json.has_value()) service_config_json = "{}";
561
+ auto default_service_config =
562
+ ServiceConfigImpl::Create(channel_args, *service_config_json);
563
+ if (!default_service_config.ok()) return default_service_config.status();
564
+ // Strip out service config channel arg, so that it doesn't affect
565
+ // subchannel uniqueness when the args flow down to that layer.
566
+ channel_args = channel_args.Remove(GRPC_ARG_SERVICE_CONFIG);
567
+ // Check client channel factory.
568
+ auto* client_channel_factory = channel_args.GetObject<ClientChannelFactory>();
569
+ if (client_channel_factory == nullptr) {
570
+ return absl::InternalError(
571
+ "Missing client channel factory in args for client channel");
572
+ }
573
+ auto* call_destination_factory =
574
+ channel_args.GetObject<CallDestinationFactory>();
575
+ if (call_destination_factory == nullptr) {
576
+ return absl::InternalError(
577
+ "Missing call destination factory in args for client channel");
578
+ }
579
+ if (channel_args.GetObject<EventEngine>() == nullptr) {
580
+ return absl::InternalError(
581
+ "Missing event engine in args for client channel");
582
+ }
583
+ // Success. Construct channel.
584
+ return MakeRefCounted<ClientChannel>(
585
+ std::move(target), std::move(channel_args), std::move(uri_to_resolve),
586
+ std::move(*default_service_config), client_channel_factory,
587
+ call_destination_factory);
588
+ }
589
+
590
+ namespace {
591
+ std::string GetDefaultAuthorityFromChannelArgs(const ChannelArgs& channel_args,
592
+ absl::string_view target) {
593
+ absl::optional<std::string> default_authority =
594
+ channel_args.GetOwnedString(GRPC_ARG_DEFAULT_AUTHORITY);
595
+ if (!default_authority.has_value()) {
596
+ return CoreConfiguration::Get().resolver_registry().GetDefaultAuthority(
597
+ target);
598
+ } else {
599
+ return std::move(*default_authority);
600
+ }
601
+ }
602
+ } // namespace
603
+
604
+ ClientChannel::ClientChannel(
605
+ std::string target, ChannelArgs channel_args, std::string uri_to_resolve,
606
+ RefCountedPtr<ServiceConfig> default_service_config,
607
+ ClientChannelFactory* client_channel_factory,
608
+ CallDestinationFactory* call_destination_factory)
609
+ : Channel(std::move(target), channel_args),
610
+ channel_args_(std::move(channel_args)),
611
+ event_engine_(channel_args_.GetObjectRef<EventEngine>()),
612
+ uri_to_resolve_(std::move(uri_to_resolve)),
613
+ service_config_parser_index_(
614
+ internal::ClientChannelServiceConfigParser::ParserIndex()),
615
+ default_service_config_(std::move(default_service_config)),
616
+ client_channel_factory_(client_channel_factory),
617
+ default_authority_(
618
+ GetDefaultAuthorityFromChannelArgs(channel_args_, this->target())),
619
+ channelz_node_(channel_args_.GetObject<channelz::ChannelNode>()),
620
+ idle_timeout_(GetClientIdleTimeout(channel_args_)),
621
+ resolver_data_for_calls_(ResolverDataForCalls{}),
622
+ picker_(nullptr),
623
+ call_destination_(
624
+ call_destination_factory->CreateCallDestination(picker_)),
625
+ work_serializer_(std::make_shared<WorkSerializer>(event_engine_)),
626
+ state_tracker_("client_channel", GRPC_CHANNEL_IDLE),
627
+ subchannel_pool_(GetSubchannelPool(channel_args_)) {
628
+ GRPC_TRACE_LOG(client_channel, INFO)
629
+ << "client_channel=" << this << ": creating client_channel";
630
+ // Set initial keepalive time.
631
+ auto keepalive_arg = channel_args_.GetInt(GRPC_ARG_KEEPALIVE_TIME_MS);
632
+ if (keepalive_arg.has_value()) {
633
+ keepalive_time_ = Clamp(*keepalive_arg, 1, INT_MAX);
634
+ } else {
635
+ keepalive_time_ = -1; // unset
636
+ }
637
+ // Get stats plugins for channel.
638
+ experimental::StatsPluginChannelScope scope(this->target(),
639
+ default_authority_);
640
+ stats_plugin_group_ =
641
+ GlobalStatsPluginRegistry::GetStatsPluginsForChannel(scope);
642
+ }
643
+
644
+ ClientChannel::~ClientChannel() {
645
+ GRPC_TRACE_LOG(client_channel, INFO)
646
+ << "client_channel=" << this << ": destroying";
647
+ }
648
+
649
+ void ClientChannel::Orphaned() {
650
+ GRPC_TRACE_LOG(client_channel, INFO)
651
+ << "client_channel=" << this << ": shutting down";
652
+ // Weird capture then copy needed to satisfy thread safety analysis,
653
+ // otherwise it seems to fail to recognize the correct lock is taken in the
654
+ // lambda.
655
+ auto self = WeakRefAsSubclass<ClientChannel>();
656
+ work_serializer_->Run(
657
+ [self]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(*self->work_serializer_) {
658
+ self->DestroyResolverAndLbPolicyLocked();
659
+ },
660
+ DEBUG_LOCATION);
661
+ // IncreaseCallCount() introduces a phony call and prevents the idle
662
+ // timer from being reset by other threads.
663
+ idle_state_.IncreaseCallCount();
664
+ idle_activity_.Reset();
665
+ }
666
+
667
+ grpc_connectivity_state ClientChannel::CheckConnectivityState(
668
+ bool try_to_connect) {
669
+ // state_tracker_ is guarded by work_serializer_, which we're not
670
+ // holding here. But the one method of state_tracker_ that *is*
671
+ // thread-safe to call without external synchronization is the state()
672
+ // method, so we can disable thread-safety analysis for this one read.
673
+ grpc_connectivity_state state =
674
+ ABSL_TS_UNCHECKED_READ(state_tracker_).state();
675
+ if (state == GRPC_CHANNEL_IDLE && try_to_connect) {
676
+ auto self = WeakRefAsSubclass<ClientChannel>(); // Held by callback.
677
+ work_serializer_->Run(
678
+ [self]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(*self->work_serializer_) {
679
+ self->TryToConnectLocked();
680
+ },
681
+ DEBUG_LOCATION);
682
+ }
683
+ return state;
684
+ }
685
+
686
+ void ClientChannel::WatchConnectivityState(grpc_connectivity_state, Timestamp,
687
+ grpc_completion_queue*, void*) {
688
+ // TODO(ctiller): implement
689
+ Crash("not implemented");
690
+ }
691
+
692
+ void ClientChannel::AddConnectivityWatcher(
693
+ grpc_connectivity_state,
694
+ OrphanablePtr<AsyncConnectivityStateWatcherInterface>) {
695
+ Crash("not implemented");
696
+ // TODO(ctiller): to make this work, need to change WorkSerializer to use
697
+ // absl::AnyInvocable<> instead of std::function<>
698
+ // work_serializer_->Run(
699
+ // [self = RefAsSubclass<ClientChannel>(), initial_state,
700
+ // watcher = std::move(watcher)]()
701
+ // ABSL_EXCLUSIVE_LOCKS_REQUIRED(*work_serializer_) {
702
+ // self->state_tracker_.AddWatcher(initial_state, std::move(watcher));
703
+ // },
704
+ // DEBUG_LOCATION);
705
+ }
706
+
707
+ void ClientChannel::RemoveConnectivityWatcher(
708
+ AsyncConnectivityStateWatcherInterface* watcher) {
709
+ auto self = RefAsSubclass<ClientChannel>(); // Held by callback.
710
+ work_serializer_->Run(
711
+ [self, watcher]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(*self->work_serializer_) {
712
+ self->state_tracker_.RemoveWatcher(watcher);
713
+ },
714
+ DEBUG_LOCATION);
715
+ }
716
+
717
+ void ClientChannel::GetInfo(const grpc_channel_info* info) {
718
+ MutexLock lock(&info_mu_);
719
+ if (info->lb_policy_name != nullptr) {
720
+ *info->lb_policy_name = gpr_strdup(info_lb_policy_name_.c_str());
721
+ }
722
+ if (info->service_config_json != nullptr) {
723
+ *info->service_config_json = gpr_strdup(info_service_config_json_.c_str());
724
+ }
725
+ }
726
+
727
+ void ClientChannel::ResetConnectionBackoff() {
728
+ auto self = RefAsSubclass<ClientChannel>();
729
+ work_serializer_->Run(
730
+ [self]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(*self->work_serializer_) {
731
+ if (self->lb_policy_ != nullptr) self->lb_policy_->ResetBackoffLocked();
732
+ },
733
+ DEBUG_LOCATION);
734
+ }
735
+
736
+ namespace {
737
+
738
+ // A class to handle CQ completion for a ping.
739
+ class PingRequest {
740
+ public:
741
+ PingRequest(grpc_completion_queue* cq, void* tag) : cq_(cq), tag_(tag) {
742
+ grpc_cq_begin_op(cq, tag);
743
+ }
744
+
745
+ // Triggers CQ completion and eventually deletes the PingRequest object.
746
+ void Complete(grpc_error_handle error) {
747
+ grpc_cq_end_op(cq_, tag_, error, Destroy, this, &completion_storage_);
748
+ }
749
+
750
+ private:
751
+ static void Destroy(void* arg, grpc_cq_completion* /*storage*/) {
752
+ delete static_cast<PingRequest*>(arg);
753
+ }
754
+
755
+ grpc_completion_queue* cq_;
756
+ void* tag_;
757
+ grpc_cq_completion completion_storage_;
758
+ };
759
+
760
+ } // namespace
761
+
762
+ void ClientChannel::Ping(grpc_completion_queue*, void*) {
763
+ // TODO(ctiller): implement
764
+ Crash("not implemented");
765
+ }
766
+
767
+ grpc_call* ClientChannel::CreateCall(
768
+ grpc_call* parent_call, uint32_t propagation_mask,
769
+ grpc_completion_queue* cq, grpc_pollset_set* /*pollset_set_alternative*/,
770
+ Slice path, absl::optional<Slice> authority, Timestamp deadline, bool) {
771
+ return MakeClientCall(parent_call, propagation_mask, cq, std::move(path),
772
+ std::move(authority), false, deadline,
773
+ compression_options(), event_engine_.get(),
774
+ call_arena_allocator()->MakeArena(), Ref());
775
+ }
776
+
777
+ void ClientChannel::StartCall(UnstartedCallHandler unstarted_handler) {
778
+ // Increment call count.
779
+ if (idle_timeout_ != Duration::Zero()) idle_state_.IncreaseCallCount();
780
+ // Exit IDLE if needed.
781
+ CheckConnectivityState(/*try_to_connect=*/true);
782
+ // Spawn a promise to wait for the resolver result.
783
+ // This will eventually start the call.
784
+ unstarted_handler.SpawnGuardedUntilCallCompletes(
785
+ "wait-for-name-resolution",
786
+ [self = RefAsSubclass<ClientChannel>(), unstarted_handler]() mutable {
787
+ const bool wait_for_ready =
788
+ unstarted_handler.UnprocessedClientInitialMetadata()
789
+ .GetOrCreatePointer(WaitForReady())
790
+ ->value;
791
+ return Map(
792
+ // Wait for the resolver result.
793
+ CheckDelayed(self->resolver_data_for_calls_.NextWhen(
794
+ [wait_for_ready](
795
+ const absl::StatusOr<ResolverDataForCalls> result) {
796
+ bool got_result = false;
797
+ // If the resolver reports an error but the call is
798
+ // wait_for_ready, keep waiting for the next result
799
+ // instead of failing the call.
800
+ if (!result.ok()) {
801
+ got_result = !wait_for_ready;
802
+ } else {
803
+ // Not an error. Make sure we actually have a result.
804
+ got_result = result->config_selector != nullptr;
805
+ }
806
+ return got_result;
807
+ })),
808
+ // Handle resolver result.
809
+ [self, unstarted_handler](
810
+ std::tuple<absl::StatusOr<ResolverDataForCalls>, bool>
811
+ result_and_delayed) mutable {
812
+ auto& resolver_data = std::get<0>(result_and_delayed);
813
+ const bool was_queued = std::get<1>(result_and_delayed);
814
+ if (!resolver_data.ok()) return resolver_data.status();
815
+ // Apply service config to call.
816
+ absl::Status status = self->ApplyServiceConfigToCall(
817
+ *resolver_data->config_selector,
818
+ unstarted_handler.UnprocessedClientInitialMetadata());
819
+ if (!status.ok()) return status;
820
+ // If the call was queued, add trace annotation.
821
+ if (was_queued) {
822
+ auto* call_tracer =
823
+ MaybeGetContext<CallTracerAnnotationInterface>();
824
+ if (call_tracer != nullptr) {
825
+ call_tracer->RecordAnnotation(
826
+ "Delayed name resolution complete.");
827
+ }
828
+ }
829
+ // Start the call on the destination provided by the
830
+ // resolver.
831
+ resolver_data->call_destination->StartCall(
832
+ std::move(unstarted_handler));
833
+ return absl::OkStatus();
834
+ });
835
+ });
836
+ }
837
+
838
+ void ClientChannel::CreateResolverLocked() {
839
+ GRPC_TRACE_LOG(client_channel, INFO)
840
+ << "client_channel=" << this << ": starting name resolution for "
841
+ << uri_to_resolve_;
842
+ resolver_ = CoreConfiguration::Get().resolver_registry().CreateResolver(
843
+ uri_to_resolve_, channel_args_, nullptr, work_serializer_,
844
+ std::make_unique<ResolverResultHandler>(
845
+ WeakRefAsSubclass<ClientChannel>()));
846
+ // Since the validity of the args was checked when the channel was created,
847
+ // CreateResolver() must return a non-null result.
848
+ CHECK(resolver_ != nullptr);
849
+ UpdateStateLocked(GRPC_CHANNEL_CONNECTING, absl::Status(),
850
+ "started resolving");
851
+ resolver_->StartLocked();
852
+ GRPC_TRACE_LOG(client_channel, INFO)
853
+ << "client_channel=" << this << ": created resolver=" << resolver_.get();
854
+ }
855
+
856
+ void ClientChannel::DestroyResolverAndLbPolicyLocked() {
857
+ if (resolver_ != nullptr) {
858
+ GRPC_TRACE_LOG(client_channel, INFO)
859
+ << "client_channel=" << this
860
+ << ": shutting down resolver=" << resolver_.get();
861
+ resolver_.reset();
862
+ saved_service_config_.reset();
863
+ saved_config_selector_.reset();
864
+ resolver_data_for_calls_.Set(ResolverDataForCalls{nullptr, nullptr});
865
+ // Clear LB policy if set.
866
+ if (lb_policy_ != nullptr) {
867
+ GRPC_TRACE_LOG(client_channel, INFO)
868
+ << "client_channel=" << this
869
+ << ": shutting down lb_policy=" << lb_policy_.get();
870
+ lb_policy_.reset();
871
+ picker_.Set(MakeRefCounted<LoadBalancingPolicy::DropPicker>(
872
+ absl::UnavailableError("Channel shutdown")));
873
+ }
874
+ }
875
+ }
876
+
877
+ void ClientChannel::TryToConnectLocked() {
878
+ if (disconnect_error_.ok()) {
879
+ if (lb_policy_ != nullptr) {
880
+ lb_policy_->ExitIdleLocked();
881
+ } else if (resolver_ == nullptr) {
882
+ CreateResolverLocked();
883
+ }
884
+ }
885
+ }
886
+
887
+ namespace {
888
+
889
+ RefCountedPtr<LoadBalancingPolicy::Config> ChooseLbPolicy(
890
+ const Resolver::Result& resolver_result,
891
+ const internal::ClientChannelGlobalParsedConfig* parsed_service_config) {
892
+ // Prefer the LB policy config found in the service config.
893
+ if (parsed_service_config->parsed_lb_config() != nullptr) {
894
+ return parsed_service_config->parsed_lb_config();
895
+ }
896
+ // Try the deprecated LB policy name from the service config.
897
+ // If not, try the setting from channel args.
898
+ absl::optional<absl::string_view> policy_name;
899
+ if (!parsed_service_config->parsed_deprecated_lb_policy().empty()) {
900
+ policy_name = parsed_service_config->parsed_deprecated_lb_policy();
901
+ } else {
902
+ policy_name = resolver_result.args.GetString(GRPC_ARG_LB_POLICY_NAME);
903
+ bool requires_config = false;
904
+ if (policy_name.has_value() &&
905
+ (!CoreConfiguration::Get()
906
+ .lb_policy_registry()
907
+ .LoadBalancingPolicyExists(*policy_name, &requires_config) ||
908
+ requires_config)) {
909
+ if (requires_config) {
910
+ gpr_log(GPR_ERROR,
911
+ "LB policy: %s passed through channel_args must not "
912
+ "require a config. Using pick_first instead.",
913
+ std::string(*policy_name).c_str());
914
+ } else {
915
+ gpr_log(GPR_ERROR,
916
+ "LB policy: %s passed through channel_args does not exist. "
917
+ "Using pick_first instead.",
918
+ std::string(*policy_name).c_str());
919
+ }
920
+ policy_name = "pick_first";
921
+ }
922
+ }
923
+ // Use pick_first if nothing was specified and we didn't select grpclb
924
+ // above.
925
+ if (!policy_name.has_value()) policy_name = "pick_first";
926
+ // Now that we have the policy name, construct an empty config for it.
927
+ Json config_json = Json::FromArray({Json::FromObject({
928
+ {std::string(*policy_name), Json::FromObject({})},
929
+ })});
930
+ auto lb_policy_config =
931
+ CoreConfiguration::Get().lb_policy_registry().ParseLoadBalancingConfig(
932
+ config_json);
933
+ // The policy name came from one of three places:
934
+ // - The deprecated loadBalancingPolicy field in the service config,
935
+ // in which case the code in ClientChannelServiceConfigParser
936
+ // already verified that the policy does not require a config.
937
+ // - One of the hard-coded values here, all of which are known to not
938
+ // require a config.
939
+ // - A channel arg, in which case we check that the specified policy exists
940
+ // and accepts an empty config. If not, we revert to using pick_first
941
+ // lb_policy
942
+ CHECK_OK(lb_policy_config);
943
+ return std::move(*lb_policy_config);
944
+ }
945
+
946
+ } // namespace
947
+
948
+ void ClientChannel::OnResolverResultChangedLocked(Resolver::Result result) {
949
+ // Handle race conditions.
950
+ if (resolver_ == nullptr) return;
951
+ GRPC_TRACE_LOG(client_channel, INFO)
952
+ << "client_channel=" << this << ": got resolver result";
953
+ // Grab resolver result health callback.
954
+ auto resolver_callback = std::move(result.result_health_callback);
955
+ absl::Status resolver_result_status;
956
+ // We only want to trace the address resolution in the follow cases:
957
+ // (a) Address resolution resulted in service config change.
958
+ // (b) Address resolution that causes number of backends to go from
959
+ // zero to non-zero.
960
+ // (c) Address resolution that causes number of backends to go from
961
+ // non-zero to zero.
962
+ // (d) Address resolution that causes a new LB policy to be created.
963
+ //
964
+ // We track a list of strings to eventually be concatenated and traced.
965
+ std::vector<const char*> trace_strings;
966
+ const bool resolution_contains_addresses =
967
+ result.addresses.ok() && !result.addresses->empty();
968
+ if (!resolution_contains_addresses &&
969
+ previous_resolution_contained_addresses_) {
970
+ trace_strings.push_back("Address list became empty");
971
+ } else if (resolution_contains_addresses &&
972
+ !previous_resolution_contained_addresses_) {
973
+ trace_strings.push_back("Address list became non-empty");
974
+ }
975
+ previous_resolution_contained_addresses_ = resolution_contains_addresses;
976
+ std::string service_config_error_string_storage;
977
+ if (!result.service_config.ok()) {
978
+ service_config_error_string_storage =
979
+ result.service_config.status().ToString();
980
+ trace_strings.push_back(service_config_error_string_storage.c_str());
981
+ }
982
+ // Choose the service config.
983
+ RefCountedPtr<ServiceConfig> service_config;
984
+ RefCountedPtr<ConfigSelector> config_selector;
985
+ if (!result.service_config.ok()) {
986
+ GRPC_TRACE_LOG(client_channel, INFO)
987
+ << "client_channel=" << this
988
+ << ": resolver returned service config error: "
989
+ << result.service_config.status();
990
+ // If the service config was invalid, then fallback to the
991
+ // previously returned service config, if any.
992
+ if (saved_service_config_ != nullptr) {
993
+ GRPC_TRACE_LOG(client_channel, INFO)
994
+ << "client_channel=" << this
995
+ << ": resolver returned invalid service config; "
996
+ "continuing to use previous service config";
997
+ service_config = saved_service_config_;
998
+ config_selector = saved_config_selector_;
999
+ } else {
1000
+ // We received a service config error and we don't have a
1001
+ // previous service config to fall back to. Put the channel into
1002
+ // TRANSIENT_FAILURE.
1003
+ OnResolverErrorLocked(result.service_config.status());
1004
+ trace_strings.push_back("no valid service config");
1005
+ resolver_result_status =
1006
+ absl::UnavailableError("no valid service config");
1007
+ }
1008
+ } else if (*result.service_config == nullptr) {
1009
+ // Resolver did not return any service config.
1010
+ GRPC_TRACE_LOG(client_channel, INFO)
1011
+ << "client_channel=" << this
1012
+ << ": resolver returned no service config; using default service "
1013
+ "config for channel";
1014
+ service_config = default_service_config_;
1015
+ } else {
1016
+ // Use ServiceConfig and ConfigSelector returned by resolver.
1017
+ service_config = std::move(*result.service_config);
1018
+ config_selector = result.args.GetObjectRef<ConfigSelector>();
1019
+ }
1020
+ // Note: The only case in which service_config is null here is if the
1021
+ // resolver returned a service config error and we don't have a previous
1022
+ // service config to fall back to.
1023
+ if (service_config != nullptr) {
1024
+ // Extract global config for client channel.
1025
+ const internal::ClientChannelGlobalParsedConfig* parsed_service_config =
1026
+ static_cast<const internal::ClientChannelGlobalParsedConfig*>(
1027
+ service_config->GetGlobalParsedConfig(
1028
+ service_config_parser_index_));
1029
+ // Choose LB policy config.
1030
+ RefCountedPtr<LoadBalancingPolicy::Config> lb_policy_config =
1031
+ ChooseLbPolicy(result, parsed_service_config);
1032
+ // Check if the ServiceConfig has changed.
1033
+ const bool service_config_changed =
1034
+ saved_service_config_ == nullptr ||
1035
+ service_config->json_string() != saved_service_config_->json_string();
1036
+ // Check if the ConfigSelector has changed.
1037
+ const bool config_selector_changed = !ConfigSelector::Equals(
1038
+ saved_config_selector_.get(), config_selector.get());
1039
+ // If either has changed, apply the global parameters now.
1040
+ if (service_config_changed || config_selector_changed) {
1041
+ // Update service config in control plane.
1042
+ UpdateServiceConfigInControlPlaneLocked(
1043
+ std::move(service_config), std::move(config_selector),
1044
+ std::string(lb_policy_config->name()));
1045
+ // TODO(ncteisen): might be worth somehow including a snippet of the
1046
+ // config in the trace, at the risk of bloating the trace logs.
1047
+ trace_strings.push_back("Service config changed");
1048
+ } else {
1049
+ GRPC_TRACE_LOG(client_channel, INFO)
1050
+ << "client_channel=" << this << ": service config not changed";
1051
+ }
1052
+ // Create or update LB policy, as needed.
1053
+ resolver_result_status = CreateOrUpdateLbPolicyLocked(
1054
+ std::move(lb_policy_config),
1055
+ parsed_service_config->health_check_service_name(), std::move(result));
1056
+ // Start using new service config for calls.
1057
+ // This needs to happen after the LB policy has been updated, since
1058
+ // the ConfigSelector may need the LB policy to know about new
1059
+ // destinations before it can send RPCs to those destinations.
1060
+ if (service_config_changed || config_selector_changed) {
1061
+ UpdateServiceConfigInDataPlaneLocked();
1062
+ }
1063
+ }
1064
+ // Invoke resolver callback if needed.
1065
+ if (resolver_callback != nullptr) {
1066
+ resolver_callback(std::move(resolver_result_status));
1067
+ }
1068
+ // Add channel trace event.
1069
+ if (!trace_strings.empty()) {
1070
+ std::string message =
1071
+ absl::StrCat("Resolution event: ", absl::StrJoin(trace_strings, ", "));
1072
+ if (channelz_node_ != nullptr) {
1073
+ channelz_node_->AddTraceEvent(channelz::ChannelTrace::Severity::Info,
1074
+ grpc_slice_from_cpp_string(message));
1075
+ }
1076
+ }
1077
+ }
1078
+
1079
+ void ClientChannel::OnResolverErrorLocked(absl::Status status) {
1080
+ if (resolver_ == nullptr) return;
1081
+ GRPC_TRACE_LOG(client_channel, INFO)
1082
+ << "client_channel=" << this
1083
+ << ": resolver transient failure: " << status;
1084
+ // If we already have an LB policy from a previous resolution
1085
+ // result, then we continue to let it set the connectivity state.
1086
+ // Otherwise, we go into TRANSIENT_FAILURE.
1087
+ if (lb_policy_ == nullptr) {
1088
+ // Update connectivity state.
1089
+ UpdateStateLocked(GRPC_CHANNEL_TRANSIENT_FAILURE, status,
1090
+ "resolver failure");
1091
+ // Send updated resolver result.
1092
+ resolver_data_for_calls_.Set(
1093
+ MaybeRewriteIllegalStatusCode(status, "resolver"));
1094
+ }
1095
+ }
1096
+
1097
+ absl::Status ClientChannel::CreateOrUpdateLbPolicyLocked(
1098
+ RefCountedPtr<LoadBalancingPolicy::Config> lb_policy_config,
1099
+ const absl::optional<std::string>& health_check_service_name,
1100
+ Resolver::Result result) {
1101
+ // Construct update.
1102
+ LoadBalancingPolicy::UpdateArgs update_args;
1103
+ if (!result.addresses.ok()) {
1104
+ update_args.addresses = result.addresses.status();
1105
+ } else {
1106
+ update_args.addresses = std::make_shared<EndpointAddressesListIterator>(
1107
+ std::move(*result.addresses));
1108
+ }
1109
+ update_args.config = std::move(lb_policy_config);
1110
+ update_args.resolution_note = std::move(result.resolution_note);
1111
+ // Remove the config selector from channel args so that we're not holding
1112
+ // unnecessary refs that cause it to be destroyed somewhere other than in
1113
+ // the WorkSerializer.
1114
+ update_args.args = result.args.Remove(GRPC_ARG_CONFIG_SELECTOR);
1115
+ // Add health check service name to channel args.
1116
+ if (health_check_service_name.has_value()) {
1117
+ update_args.args = update_args.args.Set(GRPC_ARG_HEALTH_CHECK_SERVICE_NAME,
1118
+ *health_check_service_name);
1119
+ }
1120
+ // Create policy if needed.
1121
+ if (lb_policy_ == nullptr) {
1122
+ lb_policy_ = CreateLbPolicyLocked(update_args.args);
1123
+ }
1124
+ // Update the policy.
1125
+ GRPC_TRACE_LOG(client_channel, INFO)
1126
+ << "client_channel=" << this << ": Updating child policy "
1127
+ << lb_policy_.get();
1128
+ return lb_policy_->UpdateLocked(std::move(update_args));
1129
+ }
1130
+
1131
+ // Creates a new LB policy.
1132
+ OrphanablePtr<LoadBalancingPolicy> ClientChannel::CreateLbPolicyLocked(
1133
+ const ChannelArgs& args) {
1134
+ // The LB policy will start in state CONNECTING but will not
1135
+ // necessarily send us an update synchronously, so set state to
1136
+ // CONNECTING (in case the resolver had previously failed and put the
1137
+ // channel into TRANSIENT_FAILURE) and make sure we have a queueing picker.
1138
+ UpdateStateAndPickerLocked(
1139
+ GRPC_CHANNEL_CONNECTING, absl::Status(), "started resolving",
1140
+ MakeRefCounted<LoadBalancingPolicy::QueuePicker>(nullptr));
1141
+ // Now create the LB policy.
1142
+ LoadBalancingPolicy::Args lb_policy_args;
1143
+ lb_policy_args.work_serializer = work_serializer_;
1144
+ lb_policy_args.channel_control_helper =
1145
+ std::make_unique<ClientChannelControlHelper>(
1146
+ WeakRefAsSubclass<ClientChannel>());
1147
+ lb_policy_args.args = args;
1148
+ OrphanablePtr<LoadBalancingPolicy> lb_policy =
1149
+ MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
1150
+ &client_channel_trace);
1151
+ GRPC_TRACE_LOG(client_channel, INFO)
1152
+ << "client_channel=" << this << ": created new LB policy "
1153
+ << lb_policy.get();
1154
+ return lb_policy;
1155
+ }
1156
+
1157
+ void ClientChannel::UpdateServiceConfigInControlPlaneLocked(
1158
+ RefCountedPtr<ServiceConfig> service_config,
1159
+ RefCountedPtr<ConfigSelector> config_selector, std::string lb_policy_name) {
1160
+ std::string service_config_json(service_config->json_string());
1161
+ // Update service config.
1162
+ GRPC_TRACE_LOG(client_channel, INFO)
1163
+ << "client_channel=" << this << ": using service config: \""
1164
+ << service_config_json << "\"";
1165
+ saved_service_config_ = std::move(service_config);
1166
+ // Update config selector.
1167
+ GRPC_TRACE_LOG(client_channel, INFO)
1168
+ << "client_channel=" << this << ": using ConfigSelector "
1169
+ << config_selector.get();
1170
+ saved_config_selector_ = std::move(config_selector);
1171
+ // Update the data used by GetChannelInfo().
1172
+ {
1173
+ MutexLock lock(&info_mu_);
1174
+ info_lb_policy_name_ = std::move(lb_policy_name);
1175
+ info_service_config_json_ = std::move(service_config_json);
1176
+ }
1177
+ }
1178
+
1179
+ void ClientChannel::UpdateServiceConfigInDataPlaneLocked() {
1180
+ GRPC_TRACE_LOG(client_channel, INFO)
1181
+ << "client_channel=" << this << ": switching to ConfigSelector "
1182
+ << saved_config_selector_.get();
1183
+ // Use default config selector if resolver didn't supply one.
1184
+ RefCountedPtr<ConfigSelector> config_selector = saved_config_selector_;
1185
+ if (config_selector == nullptr) {
1186
+ config_selector =
1187
+ MakeRefCounted<DefaultConfigSelector>(saved_service_config_);
1188
+ }
1189
+ // Construct filter stack.
1190
+ InterceptionChainBuilder builder(channel_args_.SetObject(this));
1191
+ if (idle_timeout_ != Duration::Zero()) {
1192
+ builder.AddOnServerTrailingMetadata([this](ServerMetadata&) {
1193
+ if (idle_state_.DecreaseCallCount()) StartIdleTimer();
1194
+ });
1195
+ }
1196
+ CoreConfiguration::Get().channel_init().AddToInterceptionChainBuilder(
1197
+ GRPC_CLIENT_CHANNEL, builder);
1198
+ // TODO(roth): add filters returned by config selector
1199
+ // Create call destination.
1200
+ const bool enable_retries =
1201
+ !channel_args_.WantMinimalStack() &&
1202
+ channel_args_.GetBool(GRPC_ARG_ENABLE_RETRIES).value_or(true);
1203
+ if (enable_retries) {
1204
+ Crash("call v3 stack does not yet support retries");
1205
+ }
1206
+ auto top_of_stack_call_destination = builder.Build(call_destination_);
1207
+ // Send result to data plane.
1208
+ if (!top_of_stack_call_destination.ok()) {
1209
+ resolver_data_for_calls_.Set(MaybeRewriteIllegalStatusCode(
1210
+ top_of_stack_call_destination.status(), "channel construction"));
1211
+ } else {
1212
+ resolver_data_for_calls_.Set(ResolverDataForCalls{
1213
+ std::move(config_selector), std::move(*top_of_stack_call_destination)});
1214
+ }
1215
+ }
1216
+
1217
+ void ClientChannel::UpdateStateLocked(grpc_connectivity_state state,
1218
+ const absl::Status& status,
1219
+ const char* reason) {
1220
+ if (state != GRPC_CHANNEL_SHUTDOWN &&
1221
+ state_tracker_.state() == GRPC_CHANNEL_SHUTDOWN) {
1222
+ Crash("Illegal transition SHUTDOWN -> anything");
1223
+ }
1224
+ state_tracker_.SetState(state, status, reason);
1225
+ if (channelz_node_ != nullptr) {
1226
+ channelz_node_->SetConnectivityState(state);
1227
+ channelz_node_->AddTraceEvent(
1228
+ channelz::ChannelTrace::Severity::Info,
1229
+ grpc_slice_from_static_string(
1230
+ channelz::ChannelNode::GetChannelConnectivityStateChangeString(
1231
+ state)));
1232
+ }
1233
+ }
1234
+
1235
+ void ClientChannel::UpdateStateAndPickerLocked(
1236
+ grpc_connectivity_state state, const absl::Status& status,
1237
+ const char* reason,
1238
+ RefCountedPtr<LoadBalancingPolicy::SubchannelPicker> picker) {
1239
+ UpdateStateLocked(state, status, reason);
1240
+ picker_.Set(std::move(picker));
1241
+ }
1242
+
1243
+ void ClientChannel::StartIdleTimer() {
1244
+ GRPC_TRACE_LOG(client_channel, INFO)
1245
+ << "client_channel=" << this << ": idle timer started";
1246
+ auto self = WeakRefAsSubclass<ClientChannel>();
1247
+ auto promise = Loop([self]() {
1248
+ return TrySeq(Sleep(Timestamp::Now() + self->idle_timeout_),
1249
+ [self]() -> Poll<LoopCtl<absl::Status>> {
1250
+ if (self->idle_state_.CheckTimer()) {
1251
+ return Continue{};
1252
+ } else {
1253
+ return absl::OkStatus();
1254
+ }
1255
+ });
1256
+ });
1257
+ idle_activity_.Set(MakeActivity(
1258
+ std::move(promise), ExecCtxWakeupScheduler{},
1259
+ [self = std::move(self)](absl::Status status) mutable {
1260
+ if (status.ok()) {
1261
+ self->work_serializer_->Run(
1262
+ [self]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(*self->work_serializer_) {
1263
+ self->DestroyResolverAndLbPolicyLocked();
1264
+ self->UpdateStateAndPickerLocked(
1265
+ GRPC_CHANNEL_IDLE, absl::OkStatus(),
1266
+ "channel entering IDLE", nullptr);
1267
+ // TODO(roth): In case there's a race condition, we
1268
+ // might need to check for any calls that are queued
1269
+ // waiting for a resolver result or an LB pick.
1270
+ },
1271
+ DEBUG_LOCATION);
1272
+ }
1273
+ },
1274
+ GetContext<EventEngine>()));
1275
+ }
1276
+
1277
+ absl::Status ClientChannel::ApplyServiceConfigToCall(
1278
+ ConfigSelector& config_selector,
1279
+ ClientMetadata& client_initial_metadata) const {
1280
+ GRPC_TRACE_LOG(client_channel_call, INFO)
1281
+ << "client_channel=" << this << ": " << GetContext<Activity>()->DebugTag()
1282
+ << " service config to call";
1283
+ // Create a ClientChannelServiceConfigCallData for the call. This stores
1284
+ // a ref to the ServiceConfig and caches the right set of parsed configs
1285
+ // to use for the call. The ClientChannelServiceConfigCallData will store
1286
+ // itself in the call context, so that it can be accessed by filters
1287
+ // below us in the stack, and it will be cleaned up when the call ends.
1288
+ auto* service_config_call_data =
1289
+ GetContext<Arena>()->New<ClientChannelServiceConfigCallData>(
1290
+ GetContext<Arena>());
1291
+ // Use the ConfigSelector to determine the config for the call.
1292
+ absl::Status call_config_status = config_selector.GetCallConfig(
1293
+ {&client_initial_metadata, GetContext<Arena>(),
1294
+ service_config_call_data});
1295
+ if (!call_config_status.ok()) {
1296
+ return MaybeRewriteIllegalStatusCode(call_config_status, "ConfigSelector");
1297
+ }
1298
+ // Apply our own method params to the call.
1299
+ auto* method_params = DownCast<ClientChannelMethodParsedConfig*>(
1300
+ service_config_call_data->GetMethodParsedConfig(
1301
+ service_config_parser_index_));
1302
+ if (method_params != nullptr) {
1303
+ // If the service config specifies a deadline, update the call's
1304
+ // deadline timer.
1305
+ if (method_params->timeout() != Duration::Zero()) {
1306
+ Call* call = GetContext<Call>();
1307
+ const Timestamp per_method_deadline =
1308
+ Timestamp::FromCycleCounterRoundUp(call->start_time()) +
1309
+ method_params->timeout();
1310
+ call->UpdateDeadline(per_method_deadline);
1311
+ }
1312
+ // If the service config set wait_for_ready and the application
1313
+ // did not explicitly set it, use the value from the service config.
1314
+ auto* wait_for_ready =
1315
+ client_initial_metadata.GetOrCreatePointer(WaitForReady());
1316
+ if (method_params->wait_for_ready().has_value() &&
1317
+ !wait_for_ready->explicitly_set) {
1318
+ wait_for_ready->value = method_params->wait_for_ready().value();
1319
+ }
1320
+ }
1321
+ return absl::OkStatus();
1322
+ }
1323
+
1324
+ } // namespace grpc_core