grpc 1.64.3 → 1.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (632) 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 +7 -17
  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 +32 -43
  82. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +1 -3
  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 +3 -8
  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 +6 -5
  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 -3738
  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 +40 -27
  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/util/log.cc +165 -0
  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 +6 -6
  555. data/src/core/xds/xds_client/xds_client_stats.h +2 -2
  556. data/src/ruby/bin/math_pb.rb +1 -22
  557. data/src/ruby/ext/grpc/rb_call.c +8 -1
  558. data/src/ruby/ext/grpc/rb_completion_queue.c +15 -32
  559. data/src/ruby/ext/grpc/rb_completion_queue.h +7 -1
  560. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
  561. data/src/ruby/ext/grpc/rb_server.c +39 -22
  562. data/src/ruby/lib/grpc/version.rb +1 -1
  563. data/src/ruby/pb/grpc/health/v1/health_pb.rb +1 -22
  564. data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services_pb.rb +5 -5
  565. data/src/ruby/pb/grpc/testing/metrics_pb.rb +10 -19
  566. data/src/ruby/pb/grpc/testing/metrics_services_pb.rb +5 -5
  567. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +1 -22
  568. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +1 -22
  569. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +1 -22
  570. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +4 -0
  571. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +12 -12
  572. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +66 -41
  573. data/third_party/boringssl-with-bazel/src/crypto/dilithium/dilithium.c +1497 -0
  574. data/third_party/boringssl-with-bazel/src/crypto/dilithium/internal.h +58 -0
  575. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -3
  576. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +0 -2
  577. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +2 -0
  578. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +5 -0
  579. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +45 -1
  580. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +33 -23
  581. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c +3 -6
  582. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +9 -4
  583. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +6 -0
  584. data/third_party/boringssl-with-bazel/src/crypto/internal.h +7 -0
  585. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +0 -4
  586. data/third_party/boringssl-with-bazel/src/crypto/x509/v3_utl.c +49 -16
  587. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -10
  588. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +7 -17
  589. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +8 -6
  590. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +3 -0
  591. data/third_party/boringssl-with-bazel/src/include/openssl/experimental/dilithium.h +125 -0
  592. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +0 -23
  593. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +1 -1
  594. data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -10
  595. metadata +103 -93
  596. data/src/core/ext/transport/chttp2/transport/http_trace.cc +0 -19
  597. data/src/core/ext/transport/chttp2/transport/http_trace.h +0 -24
  598. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -23
  599. data/src/core/handshaker/security/tsi_error.cc +0 -31
  600. data/src/core/handshaker/security/tsi_error.h +0 -30
  601. data/src/core/lib/channel/channel_stack_trace.cc +0 -19
  602. data/src/core/lib/channel/channel_stack_trace.h +0 -24
  603. data/src/core/lib/channel/context.h +0 -105
  604. data/src/core/lib/channel/metrics.cc +0 -334
  605. data/src/core/lib/channel/metrics.h +0 -365
  606. data/src/core/lib/event_engine/trace.cc +0 -25
  607. data/src/core/lib/gpr/log.cc +0 -166
  608. data/src/core/lib/iomgr/ev_windows.cc +0 -30
  609. data/src/core/lib/promise/trace.cc +0 -20
  610. data/src/core/lib/promise/trace.h +0 -24
  611. data/src/core/lib/resource_quota/trace.cc +0 -19
  612. data/src/core/lib/resource_quota/trace.h +0 -24
  613. data/src/core/lib/slice/slice_refcount.cc +0 -20
  614. data/src/core/lib/surface/api_trace.cc +0 -25
  615. data/src/core/lib/surface/call_trace.h +0 -24
  616. data/src/core/lib/surface/wait_for_cq_end_op.cc +0 -75
  617. data/src/core/lib/surface/wait_for_cq_end_op.h +0 -72
  618. data/src/core/lib/transport/batch_builder.cc +0 -172
  619. data/src/core/lib/transport/batch_builder.h +0 -474
  620. data/src/core/resolver/xds/xds_resolver_trace.cc +0 -25
  621. data/src/core/resolver/xds/xds_resolver_trace.h +0 -30
  622. data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +0 -122
  623. /data/src/core/{lib/gpr → util}/alloc.cc +0 -0
  624. /data/src/core/{lib/gpr → util}/iphone/cpu.cc +0 -0
  625. /data/src/core/{lib/gpr → util}/linux/cpu.cc +0 -0
  626. /data/src/core/{lib/gpr → util}/posix/string.cc +0 -0
  627. /data/src/core/{lib/gpr → util}/posix/sync.cc +0 -0
  628. /data/src/core/{lib/gpr → util}/sync.cc +0 -0
  629. /data/src/core/{lib/gpr → util}/sync_abseil.cc +0 -0
  630. /data/src/core/{lib/gpr → util}/time.cc +0 -0
  631. /data/src/core/{lib/gpr → util}/windows/cpu.cc +0 -0
  632. /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