grpc 1.55.0 → 1.56.0.pre3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (374) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +100 -68
  3. data/include/grpc/event_engine/event_engine.h +4 -3
  4. data/include/grpc/grpc_audit_logging.h +96 -0
  5. data/include/grpc/module.modulemap +2 -0
  6. data/include/grpc/support/json.h +218 -0
  7. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +5 -0
  8. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -0
  9. data/src/core/ext/filters/client_channel/channel_connectivity.cc +4 -4
  10. data/src/core/ext/filters/client_channel/client_channel.cc +86 -104
  11. data/src/core/ext/filters/client_channel/client_channel.h +6 -0
  12. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +19 -18
  13. data/src/core/ext/filters/client_channel/client_channel_internal.h +16 -21
  14. data/src/core/ext/filters/client_channel/config_selector.h +9 -24
  15. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +3 -0
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +5 -4
  17. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +455 -0
  18. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.h +54 -0
  19. data/src/core/ext/filters/client_channel/lb_policy/health_check_client_internal.h +186 -0
  20. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +2 -7
  21. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +52 -20
  22. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +23 -2
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +19 -6
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +1 -9
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +16 -7
  26. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +18 -1
  27. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +12 -9
  28. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -4
  29. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +36 -13
  30. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.cc +76 -6
  31. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +32 -39
  32. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +4 -10
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +52 -47
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +1 -9
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +14 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -43
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +7 -12
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +12 -19
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +35 -33
  40. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +29 -4
  41. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/service_config_helper.cc +1 -1
  42. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +28 -27
  43. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +163 -46
  44. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +16 -1
  45. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -0
  46. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +10 -40
  47. data/src/core/ext/filters/client_channel/subchannel.cc +10 -196
  48. data/src/core/ext/filters/client_channel/subchannel.h +3 -43
  49. data/src/core/ext/filters/http/message_compress/compression_filter.cc +5 -5
  50. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +100 -6
  51. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -8
  52. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -3
  53. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +16 -1
  54. data/src/core/ext/transport/chttp2/transport/flow_control.cc +46 -95
  55. data/src/core/ext/transport/chttp2/transport/internal.h +1 -15
  56. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +11 -2
  57. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +15 -0
  58. data/src/core/ext/xds/certificate_provider_store.cc +4 -9
  59. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  60. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +30 -42
  61. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +14 -9
  62. data/src/core/ext/xds/xds_api.cc +9 -6
  63. data/src/core/ext/xds/xds_api.h +3 -2
  64. data/src/core/ext/xds/xds_audit_logger_registry.cc +122 -0
  65. data/src/core/ext/xds/xds_audit_logger_registry.h +68 -0
  66. data/src/core/ext/xds/xds_bootstrap_grpc.cc +21 -9
  67. data/src/core/ext/xds/xds_bootstrap_grpc.h +5 -0
  68. data/src/core/ext/xds/xds_client.cc +5 -4
  69. data/src/core/ext/xds/xds_client_stats.h +1 -1
  70. data/src/core/ext/xds/xds_cluster.cc +20 -19
  71. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +11 -8
  72. data/src/core/ext/xds/xds_common_types.cc +3 -1
  73. data/src/core/ext/xds/xds_http_fault_filter.cc +16 -13
  74. data/src/core/ext/xds/xds_http_fault_filter.h +2 -1
  75. data/src/core/ext/xds/xds_http_filters.h +4 -2
  76. data/src/core/ext/xds/xds_http_rbac_filter.cc +154 -67
  77. data/src/core/ext/xds/xds_http_rbac_filter.h +2 -1
  78. data/src/core/ext/xds/xds_http_stateful_session_filter.cc +15 -11
  79. data/src/core/ext/xds/xds_http_stateful_session_filter.h +2 -1
  80. data/src/core/ext/xds/xds_lb_policy_registry.cc +22 -16
  81. data/src/core/ext/xds/xds_listener.cc +1 -0
  82. data/src/core/ext/xds/xds_route_config.cc +40 -3
  83. data/src/core/ext/xds/xds_routing.cc +2 -2
  84. data/src/core/ext/xds/xds_transport_grpc.cc +3 -1
  85. data/src/core/lib/avl/avl.h +5 -0
  86. data/src/core/lib/channel/channel_args.cc +80 -22
  87. data/src/core/lib/channel/channel_args.h +34 -1
  88. data/src/core/lib/channel/channel_trace.cc +16 -12
  89. data/src/core/lib/channel/channelz.cc +159 -132
  90. data/src/core/lib/channel/channelz.h +42 -35
  91. data/src/core/lib/channel/channelz_registry.cc +23 -20
  92. data/src/core/lib/channel/connected_channel.cc +17 -6
  93. data/src/core/lib/channel/promise_based_filter.cc +0 -4
  94. data/src/core/lib/channel/promise_based_filter.h +2 -0
  95. data/src/core/lib/compression/compression_internal.cc +2 -5
  96. data/src/core/lib/config/config_vars.cc +20 -18
  97. data/src/core/lib/config/config_vars.h +4 -4
  98. data/src/core/lib/config/load_config.cc +13 -0
  99. data/src/core/lib/config/load_config.h +6 -0
  100. data/src/core/lib/debug/event_log.h +1 -1
  101. data/src/core/lib/debug/stats_data.h +1 -1
  102. data/src/core/lib/debug/trace.cc +24 -55
  103. data/src/core/lib/debug/trace.h +3 -1
  104. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +211 -0
  105. data/src/core/lib/event_engine/cf_engine/cf_engine.h +86 -0
  106. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +354 -0
  107. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +146 -0
  108. data/src/core/lib/event_engine/cf_engine/cftype_unique_ref.h +79 -0
  109. data/src/core/lib/event_engine/default_event_engine.cc +13 -1
  110. data/src/core/lib/event_engine/default_event_engine_factory.cc +14 -2
  111. data/src/core/lib/event_engine/poller.h +2 -2
  112. data/src/core/lib/event_engine/posix.h +4 -0
  113. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +1 -1
  114. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +7 -18
  115. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -0
  116. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +33 -19
  117. data/src/core/lib/event_engine/posix_engine/posix_engine.h +1 -1
  118. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -4
  119. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +7 -8
  120. data/src/core/lib/event_engine/posix_engine/timer_manager.h +1 -1
  121. data/src/core/lib/event_engine/shim.cc +7 -1
  122. data/src/core/lib/event_engine/{thread_pool.cc → thread_pool/original_thread_pool.cc} +28 -25
  123. data/src/core/lib/event_engine/{thread_pool.h → thread_pool/original_thread_pool.h} +11 -15
  124. data/src/core/lib/event_engine/thread_pool/thread_pool.h +50 -0
  125. data/src/core/lib/event_engine/{executor/executor.h → thread_pool/thread_pool_factory.cc} +17 -15
  126. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +489 -0
  127. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +249 -0
  128. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +166 -0
  129. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +108 -0
  130. data/src/core/lib/event_engine/windows/iocp.cc +4 -3
  131. data/src/core/lib/event_engine/windows/iocp.h +3 -3
  132. data/src/core/lib/event_engine/windows/win_socket.cc +6 -6
  133. data/src/core/lib/event_engine/windows/win_socket.h +4 -4
  134. data/src/core/lib/event_engine/windows/windows_endpoint.cc +11 -10
  135. data/src/core/lib/event_engine/windows/windows_endpoint.h +3 -2
  136. data/src/core/lib/event_engine/windows/windows_engine.cc +19 -17
  137. data/src/core/lib/event_engine/windows/windows_engine.h +6 -6
  138. data/src/core/lib/event_engine/windows/windows_listener.cc +3 -3
  139. data/src/core/lib/event_engine/windows/windows_listener.h +3 -2
  140. data/src/core/lib/event_engine/work_queue/basic_work_queue.cc +63 -0
  141. data/src/core/lib/event_engine/work_queue/basic_work_queue.h +71 -0
  142. data/src/core/lib/event_engine/work_queue/work_queue.h +62 -0
  143. data/src/core/lib/experiments/config.cc +38 -7
  144. data/src/core/lib/experiments/config.h +16 -0
  145. data/src/core/lib/experiments/experiments.cc +67 -20
  146. data/src/core/lib/experiments/experiments.h +27 -21
  147. data/src/core/lib/gpr/log_internal.h +55 -0
  148. data/src/core/lib/gprpp/crash.cc +10 -0
  149. data/src/core/lib/gprpp/crash.h +3 -0
  150. data/src/core/lib/gprpp/per_cpu.cc +33 -0
  151. data/src/core/lib/gprpp/per_cpu.h +29 -6
  152. data/src/core/lib/gprpp/time.cc +1 -0
  153. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  154. data/src/core/lib/iomgr/endpoint_cfstream.cc +10 -8
  155. data/src/core/lib/iomgr/ev_apple.cc +12 -12
  156. data/src/core/lib/iomgr/ev_epoll1_linux.cc +10 -3
  157. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +15 -1
  158. data/src/core/lib/iomgr/iocp_windows.cc +24 -3
  159. data/src/core/lib/iomgr/iocp_windows.h +11 -0
  160. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -1
  161. data/src/core/lib/iomgr/socket_utils_common_posix.cc +4 -2
  162. data/src/core/lib/iomgr/socket_windows.cc +61 -7
  163. data/src/core/lib/iomgr/socket_windows.h +9 -2
  164. data/src/core/lib/iomgr/tcp_client_cfstream.cc +14 -3
  165. data/src/core/lib/iomgr/tcp_server_posix.cc +148 -107
  166. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  167. data/src/core/lib/iomgr/tcp_server_windows.cc +1 -1
  168. data/src/core/lib/json/json.h +2 -166
  169. data/src/core/lib/json/json_object_loader.cc +8 -9
  170. data/src/core/lib/json/json_object_loader.h +25 -18
  171. data/src/core/lib/json/json_reader.cc +13 -6
  172. data/src/core/lib/json/json_util.cc +6 -11
  173. data/src/core/lib/json/json_writer.cc +7 -8
  174. data/src/core/lib/load_balancing/lb_policy.h +13 -0
  175. data/src/core/lib/load_balancing/lb_policy_registry.cc +2 -1
  176. data/src/core/lib/matchers/matchers.cc +3 -4
  177. data/src/core/lib/matchers/matchers.h +2 -1
  178. data/src/core/lib/promise/activity.cc +5 -0
  179. data/src/core/lib/promise/activity.h +10 -0
  180. data/src/core/lib/promise/detail/promise_factory.h +1 -1
  181. data/src/core/lib/promise/party.cc +31 -13
  182. data/src/core/lib/promise/party.h +11 -2
  183. data/src/core/lib/promise/pipe.h +9 -2
  184. data/src/core/lib/promise/prioritized_race.h +95 -0
  185. data/src/core/lib/promise/sleep.cc +2 -1
  186. data/src/core/lib/resolver/server_address.cc +0 -8
  187. data/src/core/lib/resolver/server_address.h +0 -6
  188. data/src/core/lib/resource_quota/memory_quota.cc +7 -7
  189. data/src/core/lib/resource_quota/memory_quota.h +1 -2
  190. data/src/core/lib/security/authorization/audit_logging.cc +98 -0
  191. data/src/core/lib/security/authorization/audit_logging.h +73 -0
  192. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +47 -2
  193. data/src/core/lib/security/authorization/grpc_authorization_engine.h +18 -1
  194. data/src/core/lib/security/authorization/rbac_policy.cc +36 -4
  195. data/src/core/lib/security/authorization/rbac_policy.h +19 -2
  196. data/src/core/lib/security/authorization/stdout_logger.cc +75 -0
  197. data/src/core/lib/security/authorization/stdout_logger.h +61 -0
  198. data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +8 -4
  199. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +8 -18
  200. data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +14 -8
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +19 -12
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +4 -2
  203. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +1 -0
  204. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +1 -0
  205. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -0
  206. data/src/core/lib/security/credentials/jwt/json_token.cc +15 -14
  207. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +4 -2
  208. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +1 -0
  209. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +1 -0
  210. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -5
  211. data/src/core/lib/security/util/json_util.cc +1 -0
  212. data/src/core/lib/service_config/service_config_call_data.h +49 -20
  213. data/src/core/lib/service_config/service_config_impl.cc +2 -1
  214. data/src/core/lib/surface/call.cc +38 -23
  215. data/src/core/lib/surface/completion_queue.cc +6 -2
  216. data/src/core/lib/surface/version.cc +2 -2
  217. data/src/core/lib/transport/batch_builder.cc +15 -12
  218. data/src/core/lib/transport/batch_builder.h +39 -35
  219. data/src/core/plugin_registry/grpc_plugin_registry.cc +0 -2
  220. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  221. data/src/ruby/ext/grpc/extconf.rb +8 -9
  222. data/src/ruby/lib/grpc/version.rb +1 -1
  223. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +9 -8
  224. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +1 -1
  225. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +3 -3
  226. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +10 -6
  227. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +7 -4
  228. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +6 -4
  229. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +2 -1
  230. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +5 -9
  231. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +4 -2
  232. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +31 -22
  233. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +29 -26
  234. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +8 -0
  235. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +189 -13
  236. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_openbsd.c +62 -0
  237. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_openbsd.c +31 -0
  238. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +6 -4
  239. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h +795 -795
  240. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +1 -5
  241. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +4 -0
  242. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +18 -6
  243. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +15 -7
  244. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +1 -1
  245. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c +1 -1
  246. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  247. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +3 -0
  248. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +24 -24
  249. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +1 -1
  250. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +7 -7
  251. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +74 -74
  252. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +1 -2
  253. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +11 -11
  254. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz.c +12 -12
  255. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +14 -15
  256. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +1 -1
  257. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +10 -10
  258. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +23 -23
  259. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +13 -13
  260. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +1 -1
  261. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +2 -2
  262. data/third_party/boringssl-with-bazel/src/crypto/{hkdf → fipsmodule/hkdf}/hkdf.c +1 -1
  263. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +2 -10
  264. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +1 -4
  265. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +115 -133
  266. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +12 -14
  267. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +57 -47
  268. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +1 -8
  269. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/polyval.c +27 -28
  270. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +11 -23
  271. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +21 -16
  272. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.c +5 -288
  273. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +143 -83
  274. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +95 -183
  275. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +71 -0
  276. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/internal.h +8 -0
  277. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/kdf.c +33 -0
  278. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +162 -6
  279. data/third_party/boringssl-with-bazel/src/crypto/internal.h +18 -0
  280. data/third_party/boringssl-with-bazel/src/crypto/kyber/kyber.c +18 -11
  281. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +6 -13
  282. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +18 -14
  283. data/third_party/boringssl-with-bazel/src/crypto/{refcount_lock.c → refcount_no_threads.c} +3 -13
  284. data/third_party/boringssl-with-bazel/src/crypto/refcount_win.c +89 -0
  285. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/internal.h +77 -0
  286. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_crypt.c +568 -0
  287. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +62 -0
  288. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +218 -44
  289. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +35 -0
  290. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +588 -39
  291. data/third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c +27 -18
  292. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +1 -1
  293. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +17 -39
  294. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +39 -48
  295. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +0 -140
  296. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +72 -23
  297. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +11 -14
  298. data/third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c +1 -1
  299. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  300. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +1 -1
  301. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +33 -46
  302. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +1 -0
  303. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +3 -5
  304. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +14 -46
  305. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +14 -26
  306. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +17 -10
  307. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +1 -1
  308. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +5 -7
  309. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +6 -4
  310. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +32 -1
  311. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +0 -4
  312. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +1 -4
  313. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +3 -3
  314. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +28 -0
  315. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +2 -11
  316. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -3
  317. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +91 -1
  318. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +5 -0
  319. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +149 -20
  320. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +4 -0
  321. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +4 -0
  322. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +8 -0
  323. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +774 -615
  324. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +42 -10
  325. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +11 -6
  326. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +2 -4
  327. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +24 -16
  328. data/third_party/boringssl-with-bazel/src/ssl/internal.h +65 -18
  329. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +37 -18
  330. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +187 -193
  331. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +13 -129
  332. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +85 -10
  333. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +17 -4
  334. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +27 -19
  335. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +1 -1
  336. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +5 -21
  337. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +5 -2
  338. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64_msvc.h +1281 -0
  339. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64_msvc.h +2002 -0
  340. data/third_party/cares/cares/include/ares.h +23 -1
  341. data/third_party/cares/cares/{src/lib → include}/ares_nameser.h +9 -7
  342. data/third_party/cares/cares/include/ares_rules.h +2 -2
  343. data/third_party/cares/cares/include/ares_version.h +3 -3
  344. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +266 -0
  345. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +240 -0
  346. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +49 -80
  347. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +37 -43
  348. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +12 -4
  349. data/third_party/cares/cares/src/lib/ares_data.c +16 -0
  350. data/third_party/cares/cares/src/lib/ares_data.h +7 -0
  351. data/third_party/cares/cares/src/lib/ares_destroy.c +8 -0
  352. data/third_party/cares/cares/src/lib/ares_expand_name.c +17 -6
  353. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +1 -0
  354. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +156 -78
  355. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +130 -326
  356. data/third_party/cares/cares/src/lib/ares_init.c +97 -485
  357. data/third_party/cares/cares/src/lib/ares_library_init.c +2 -89
  358. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +23 -142
  359. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +22 -142
  360. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +184 -0
  361. data/third_party/cares/cares/src/lib/ares_private.h +30 -16
  362. data/third_party/cares/cares/src/lib/ares_process.c +55 -16
  363. data/third_party/cares/cares/src/lib/ares_query.c +1 -35
  364. data/third_party/cares/cares/src/lib/ares_rand.c +279 -0
  365. data/third_party/cares/cares/src/lib/ares_send.c +5 -7
  366. data/third_party/cares/cares/src/lib/ares_strdup.c +12 -19
  367. data/third_party/cares/cares/src/lib/ares_strsplit.c +44 -128
  368. data/third_party/cares/cares/src/lib/ares_strsplit.h +9 -10
  369. data/third_party/cares/cares/src/lib/inet_net_pton.c +78 -116
  370. data/third_party/cares/cares/src/tools/ares_getopt.h +53 -0
  371. metadata +50 -14
  372. data/src/core/ext/filters/client_channel/health/health_check_client.cc +0 -175
  373. data/src/core/ext/filters/client_channel/health/health_check_client.h +0 -43
  374. data/third_party/cares/cares/src/lib/ares_library_init.h +0 -43
@@ -16,11 +16,12 @@
16
16
 
17
17
  #include <grpc/support/port_platform.h>
18
18
 
19
+ #include <stdint.h>
19
20
  #include <stdlib.h>
20
21
  #include <string.h>
21
22
 
22
23
  #include <algorithm>
23
- #include <cstdint>
24
+ #include <functional>
24
25
  #include <initializer_list>
25
26
  #include <map>
26
27
  #include <memory>
@@ -29,7 +30,6 @@
29
30
  #include <utility>
30
31
  #include <vector>
31
32
 
32
- #include "absl/functional/any_invocable.h"
33
33
  #include "absl/meta/type_traits.h"
34
34
  #include "absl/random/random.h"
35
35
  #include "absl/status/status.h"
@@ -57,8 +57,10 @@
57
57
  #include <grpc/status.h>
58
58
  #include <grpc/support/log.h>
59
59
 
60
+ #include "src/core/ext/filters/client_channel/client_channel_internal.h"
60
61
  #include "src/core/ext/filters/client_channel/config_selector.h"
61
62
  #include "src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h"
63
+ #include "src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h"
62
64
  #include "src/core/ext/xds/xds_bootstrap.h"
63
65
  #include "src/core/ext/xds/xds_bootstrap_grpc.h"
64
66
  #include "src/core/ext/xds/xds_client_grpc.h"
@@ -68,6 +70,9 @@
68
70
  #include "src/core/ext/xds/xds_routing.h"
69
71
  #include "src/core/lib/channel/channel_args.h"
70
72
  #include "src/core/lib/channel/channel_fwd.h"
73
+ #include "src/core/lib/channel/channel_stack.h"
74
+ #include "src/core/lib/channel/context.h"
75
+ #include "src/core/lib/channel/promise_based_filter.h"
71
76
  #include "src/core/lib/channel/status_util.h"
72
77
  #include "src/core/lib/config/core_configuration.h"
73
78
  #include "src/core/lib/debug/trace.h"
@@ -75,11 +80,14 @@
75
80
  #include "src/core/lib/gprpp/dual_ref_counted.h"
76
81
  #include "src/core/lib/gprpp/match.h"
77
82
  #include "src/core/lib/gprpp/orphanable.h"
83
+ #include "src/core/lib/gprpp/ref_counted.h"
78
84
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
79
85
  #include "src/core/lib/gprpp/time.h"
80
86
  #include "src/core/lib/gprpp/work_serializer.h"
81
87
  #include "src/core/lib/iomgr/iomgr_fwd.h"
82
88
  #include "src/core/lib/iomgr/pollset_set.h"
89
+ #include "src/core/lib/promise/arena_promise.h"
90
+ #include "src/core/lib/promise/context.h"
83
91
  #include "src/core/lib/resolver/resolver.h"
84
92
  #include "src/core/lib/resolver/resolver_factory.h"
85
93
  #include "src/core/lib/resolver/server_address.h"
@@ -87,13 +95,14 @@
87
95
  #include "src/core/lib/service_config/service_config.h"
88
96
  #include "src/core/lib/service_config/service_config_impl.h"
89
97
  #include "src/core/lib/transport/metadata_batch.h"
98
+ #include "src/core/lib/transport/transport.h"
90
99
  #include "src/core/lib/uri/uri_parser.h"
91
100
 
92
101
  namespace grpc_core {
93
102
 
94
103
  TraceFlag grpc_xds_resolver_trace(false, "xds_resolver");
95
104
 
96
- UniqueTypeName XdsClusterAttributeTypeName() {
105
+ UniqueTypeName XdsClusterAttribute::TypeName() {
97
106
  static UniqueTypeName::Factory kFactory("xds_cluster_name");
98
107
  return kFactory.Create();
99
108
  }
@@ -239,14 +248,9 @@ class XdsResolver : public Resolver {
239
248
  // back into the WorkSerializer to remove the entry from the map.
240
249
  class ClusterState : public DualRefCounted<ClusterState> {
241
250
  public:
242
- using ClusterStateMap =
243
- std::map<std::string, WeakRefCountedPtr<ClusterState>>;
244
-
245
251
  ClusterState(RefCountedPtr<XdsResolver> resolver,
246
- const std::string& cluster_name)
247
- : resolver_(std::move(resolver)),
248
- it_(resolver_->cluster_state_map_.emplace(cluster_name, WeakRef())
249
- .first) {}
252
+ absl::string_view cluster_name)
253
+ : resolver_(std::move(resolver)), cluster_name_(cluster_name) {}
250
254
 
251
255
  void Orphan() override {
252
256
  auto* resolver = resolver_.get();
@@ -257,11 +261,37 @@ class XdsResolver : public Resolver {
257
261
  DEBUG_LOCATION);
258
262
  }
259
263
 
260
- const std::string& cluster() const { return it_->first; }
264
+ const std::string& cluster_name() const { return cluster_name_; }
261
265
 
262
266
  private:
263
267
  RefCountedPtr<XdsResolver> resolver_;
264
- ClusterStateMap::iterator it_;
268
+ std::string cluster_name_;
269
+ };
270
+
271
+ // A map containing cluster refs held by the XdsConfigSelector. A ref to
272
+ // this map will be taken by each call processed by the XdsConfigSelector,
273
+ // stored in a the call's call attributes, and later unreffed
274
+ // by the ClusterSelection filter.
275
+ class XdsClusterMap : public RefCounted<XdsClusterMap> {
276
+ public:
277
+ explicit XdsClusterMap(
278
+ std::map<absl::string_view, RefCountedPtr<ClusterState>> clusters)
279
+ : clusters_(std::move(clusters)) {}
280
+
281
+ bool operator==(const XdsClusterMap& other) const {
282
+ return clusters_ == other.clusters_;
283
+ }
284
+
285
+ RefCountedPtr<ClusterState> Find(absl::string_view name) const {
286
+ auto it = clusters_.find(name);
287
+ if (it == clusters_.end()) {
288
+ return nullptr;
289
+ }
290
+ return it->second;
291
+ }
292
+
293
+ private:
294
+ std::map<absl::string_view, RefCountedPtr<ClusterState>> clusters_;
265
295
  };
266
296
 
267
297
  class XdsConfigSelector : public ConfigSelector {
@@ -276,10 +306,10 @@ class XdsResolver : public Resolver {
276
306
  const auto* other_xds = static_cast<const XdsConfigSelector*>(other);
277
307
  // Don't need to compare resolver_, since that will always be the same.
278
308
  return route_table_ == other_xds->route_table_ &&
279
- clusters_ == other_xds->clusters_;
309
+ *cluster_map_ == *other_xds->cluster_map_;
280
310
  }
281
311
 
282
- absl::StatusOr<CallConfig> GetCallConfig(GetCallConfigArgs args) override;
312
+ absl::Status GetCallConfig(GetCallConfigArgs args) override;
283
313
 
284
314
  std::vector<const grpc_channel_filter*> GetFilters() override {
285
315
  return filters_;
@@ -305,7 +335,6 @@ class XdsResolver : public Resolver {
305
335
 
306
336
  class RouteListIterator;
307
337
 
308
- void MaybeAddCluster(const std::string& name);
309
338
  absl::StatusOr<RefCountedPtr<ServiceConfig>> CreateMethodConfig(
310
339
  const XdsRouteConfigResource::Route& route,
311
340
  const XdsRouteConfigResource::Route::RouteAction::ClusterWeight*
@@ -313,10 +342,92 @@ class XdsResolver : public Resolver {
313
342
 
314
343
  RefCountedPtr<XdsResolver> resolver_;
315
344
  RouteTable route_table_;
316
- std::map<absl::string_view, RefCountedPtr<ClusterState>> clusters_;
345
+ RefCountedPtr<XdsClusterMap> cluster_map_;
317
346
  std::vector<const grpc_channel_filter*> filters_;
318
347
  };
319
348
 
349
+ class ClusterSelectionFilter : public ChannelFilter {
350
+ public:
351
+ const static grpc_channel_filter kFilter;
352
+
353
+ static absl::StatusOr<ClusterSelectionFilter> Create(
354
+ const ChannelArgs& /* unused */, ChannelFilter::Args filter_args) {
355
+ return ClusterSelectionFilter(filter_args);
356
+ }
357
+
358
+ // Construct a promise for one call.
359
+ ArenaPromise<ServerMetadataHandle> MakeCallPromise(
360
+ CallArgs call_args, NextPromiseFactory next_promise_factory) override {
361
+ auto* service_config_call_data =
362
+ static_cast<ClientChannelServiceConfigCallData*>(
363
+ GetContext<grpc_call_context_element>()
364
+ [GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA]
365
+ .value);
366
+ GPR_ASSERT(service_config_call_data != nullptr);
367
+ auto* cluster_data = static_cast<XdsClusterMapAttribute*>(
368
+ service_config_call_data->GetCallAttribute(
369
+ XdsClusterMapAttribute::TypeName()));
370
+ auto* cluster_name_attribute = static_cast<XdsClusterAttribute*>(
371
+ service_config_call_data->GetCallAttribute(
372
+ XdsClusterAttribute::TypeName()));
373
+ if (cluster_data != nullptr && cluster_name_attribute != nullptr) {
374
+ auto cluster =
375
+ cluster_data->LockAndGetCluster(cluster_name_attribute->cluster());
376
+ if (cluster != nullptr) {
377
+ service_config_call_data->SetOnCommit(
378
+ [cluster = std::move(cluster)]() mutable { cluster.reset(); });
379
+ }
380
+ }
381
+ return next_promise_factory(std::move(call_args));
382
+ }
383
+
384
+ private:
385
+ explicit ClusterSelectionFilter(ChannelFilter::Args filter_args)
386
+ : filter_args_(filter_args) {}
387
+
388
+ ChannelFilter::Args filter_args_;
389
+ };
390
+
391
+ RefCountedPtr<ClusterState> GetOrCreateClusterState(
392
+ absl::string_view cluster_name) {
393
+ auto it = cluster_state_map_.find(cluster_name);
394
+ if (it == cluster_state_map_.end()) {
395
+ auto cluster = MakeRefCounted<ClusterState>(Ref(), cluster_name);
396
+ cluster_state_map_.emplace(cluster->cluster_name(), cluster->WeakRef());
397
+ return cluster;
398
+ }
399
+ return it->second->Ref();
400
+ }
401
+
402
+ class XdsClusterMapAttribute
403
+ : public ServiceConfigCallData::CallAttributeInterface {
404
+ public:
405
+ static UniqueTypeName TypeName() {
406
+ static UniqueTypeName::Factory factory("xds_cluster_lb_data");
407
+ return factory.Create();
408
+ }
409
+
410
+ explicit XdsClusterMapAttribute(RefCountedPtr<XdsClusterMap> cluster_map)
411
+ : cluster_map_(std::move(cluster_map)) {}
412
+
413
+ // This method can be called only once. The first call will release the
414
+ // reference to the cluster map, and subsequent calls will return nullptr.
415
+ RefCountedPtr<ClusterState> LockAndGetCluster(
416
+ absl::string_view cluster_name) {
417
+ if (cluster_map_ == nullptr) {
418
+ return nullptr;
419
+ }
420
+ auto cluster = cluster_map_->Find(cluster_name);
421
+ cluster_map_.reset();
422
+ return cluster;
423
+ }
424
+
425
+ UniqueTypeName type() const override { return TypeName(); }
426
+
427
+ private:
428
+ RefCountedPtr<XdsClusterMap> cluster_map_;
429
+ };
430
+
320
431
  void OnListenerUpdate(XdsListenerResource listener);
321
432
  void OnRouteConfigUpdate(XdsRouteConfigResource rds_update);
322
433
  void OnError(absl::string_view context, absl::Status status);
@@ -350,7 +461,8 @@ class XdsResolver : public Resolver {
350
461
  std::string /*LB policy config*/>
351
462
  cluster_specifier_plugin_map_;
352
463
 
353
- ClusterState::ClusterStateMap cluster_state_map_;
464
+ std::map<absl::string_view, WeakRefCountedPtr<ClusterState>>
465
+ cluster_state_map_;
354
466
  };
355
467
 
356
468
  //
@@ -363,6 +475,11 @@ bool MethodConfigsEqual(const ServiceConfig* sc1, const ServiceConfig* sc2) {
363
475
  return sc1->json_string() == sc2->json_string();
364
476
  }
365
477
 
478
+ const grpc_channel_filter XdsResolver::ClusterSelectionFilter::kFilter =
479
+ MakePromiseBasedFilter<ClusterSelectionFilter, FilterEndpoint::kClient,
480
+ kFilterExaminesServerInitialMetadata>(
481
+ "cluster_selection_filter");
482
+
366
483
  bool XdsResolver::XdsConfigSelector::Route::ClusterWeightState::operator==(
367
484
  const ClusterWeightState& other) const {
368
485
  return range_end == other.range_end && cluster == other.cluster &&
@@ -416,6 +533,13 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
416
533
  // moving the entry in a reallocation will cause the string_view to point to
417
534
  // invalid data.
418
535
  route_table_.reserve(resolver_->current_virtual_host_->routes.size());
536
+ std::map<absl::string_view, RefCountedPtr<ClusterState>> clusters;
537
+ auto maybe_add_cluster = [&](absl::string_view cluster_name) {
538
+ if (clusters.find(cluster_name) != clusters.end()) return;
539
+ auto cluster_state = resolver_->GetOrCreateClusterState(cluster_name);
540
+ absl::string_view name = cluster_state->cluster_name();
541
+ clusters.emplace(name, std::move(cluster_state));
542
+ };
419
543
  for (auto& route : resolver_->current_virtual_host_->routes) {
420
544
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
421
545
  gpr_log(GPR_INFO, "[xds_resolver %p] XdsConfigSelector %p: route: %s",
@@ -445,7 +569,7 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
445
569
  return;
446
570
  }
447
571
  route_entry.method_config = std::move(*result);
448
- MaybeAddCluster(
572
+ maybe_add_cluster(
449
573
  absl::StrCat("cluster:", cluster_name.cluster_name));
450
574
  },
451
575
  // WeightedClusters
@@ -467,7 +591,8 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
467
591
  cluster_weight_state.cluster = weighted_cluster.name;
468
592
  route_entry.weighted_cluster_state.push_back(
469
593
  std::move(cluster_weight_state));
470
- MaybeAddCluster(absl::StrCat("cluster:", weighted_cluster.name));
594
+ maybe_add_cluster(
595
+ absl::StrCat("cluster:", weighted_cluster.name));
471
596
  }
472
597
  },
473
598
  // ClusterSpecifierPlugin
@@ -479,13 +604,14 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
479
604
  return;
480
605
  }
481
606
  route_entry.method_config = std::move(*result);
482
- MaybeAddCluster(absl::StrCat(
607
+ maybe_add_cluster(absl::StrCat(
483
608
  "cluster_specifier_plugin:",
484
609
  cluster_specifier_plugin_name.cluster_specifier_plugin_name));
485
610
  });
486
611
  if (!status->ok()) return;
487
612
  }
488
613
  }
614
+ cluster_map_ = MakeRefCounted<XdsClusterMap>(std::move(clusters));
489
615
  // Populate filter list.
490
616
  const auto& http_filter_registry =
491
617
  static_cast<const GrpcXdsBootstrap&>(resolver_->xds_client_->bootstrap())
@@ -502,6 +628,7 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
502
628
  filters_.push_back(filter_impl->channel_filter());
503
629
  }
504
630
  }
631
+ filters_.push_back(&ClusterSelectionFilter::kFilter);
505
632
  }
506
633
 
507
634
  XdsResolver::XdsConfigSelector::~XdsConfigSelector() {
@@ -509,7 +636,7 @@ XdsResolver::XdsConfigSelector::~XdsConfigSelector() {
509
636
  gpr_log(GPR_INFO, "[xds_resolver %p] destroying XdsConfigSelector %p",
510
637
  resolver_.get(), this);
511
638
  }
512
- clusters_.clear();
639
+ cluster_map_.reset();
513
640
  resolver_->MaybeRemoveUnusedClusters();
514
641
  }
515
642
 
@@ -595,18 +722,6 @@ XdsResolver::XdsConfigSelector::CreateMethodConfig(
595
722
  return nullptr;
596
723
  }
597
724
 
598
- void XdsResolver::XdsConfigSelector::MaybeAddCluster(const std::string& name) {
599
- if (clusters_.find(name) == clusters_.end()) {
600
- auto it = resolver_->cluster_state_map_.find(name);
601
- if (it == resolver_->cluster_state_map_.end()) {
602
- auto new_cluster_state = MakeRefCounted<ClusterState>(resolver_, name);
603
- clusters_[new_cluster_state->cluster()] = std::move(new_cluster_state);
604
- } else {
605
- clusters_[it->second->cluster()] = it->second->Ref();
606
- }
607
- }
608
- }
609
-
610
725
  absl::optional<uint64_t> HeaderHashHelper(
611
726
  const XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header&
612
727
  header_policy,
@@ -628,8 +743,8 @@ absl::optional<uint64_t> HeaderHashHelper(
628
743
  return XXH64(header_value->data(), header_value->size(), 0);
629
744
  }
630
745
 
631
- absl::StatusOr<ConfigSelector::CallConfig>
632
- XdsResolver::XdsConfigSelector::GetCallConfig(GetCallConfigArgs args) {
746
+ absl::Status XdsResolver::XdsConfigSelector::GetCallConfig(
747
+ GetCallConfigArgs args) {
633
748
  Slice* path = args.initial_metadata->get_pointer(HttpPathMetadata());
634
749
  GPR_ASSERT(path != nullptr);
635
750
  auto route_index = XdsRouting::GetRouteForRequest(
@@ -694,8 +809,8 @@ XdsResolver::XdsConfigSelector::GetCallConfig(GetCallConfigArgs args) {
694
809
  cluster_specifier_plugin_name.cluster_specifier_plugin_name);
695
810
  method_config = entry.method_config;
696
811
  });
697
- auto it = clusters_.find(cluster_name);
698
- GPR_ASSERT(it != clusters_.end());
812
+ auto cluster = cluster_map_->Find(cluster_name);
813
+ GPR_ASSERT(cluster != nullptr);
699
814
  // Generate a hash.
700
815
  absl::optional<uint64_t> hash;
701
816
  for (const auto& hash_policy : route_action->hash_policies) {
@@ -725,23 +840,25 @@ XdsResolver::XdsConfigSelector::GetCallConfig(GetCallConfigArgs args) {
725
840
  if (!hash.has_value()) {
726
841
  hash = absl::Uniform<uint64_t>(absl::BitGen());
727
842
  }
728
- CallConfig call_config;
843
+ // Populate service config call data.
729
844
  if (method_config != nullptr) {
730
- call_config.method_configs =
845
+ auto* parsed_method_configs =
731
846
  method_config->GetMethodParsedConfigVector(grpc_empty_slice());
732
- call_config.service_config = std::move(method_config);
847
+ args.service_config_call_data->SetServiceConfig(std::move(method_config),
848
+ parsed_method_configs);
733
849
  }
734
- call_config.call_attributes[XdsClusterAttributeTypeName()] = it->first;
850
+ args.service_config_call_data->SetCallAttribute(
851
+ args.arena->New<XdsClusterAttribute>(cluster->cluster_name()));
735
852
  std::string hash_string = absl::StrCat(hash.value());
736
853
  char* hash_value =
737
854
  static_cast<char*>(args.arena->Alloc(hash_string.size() + 1));
738
855
  memcpy(hash_value, hash_string.c_str(), hash_string.size());
739
856
  hash_value[hash_string.size()] = '\0';
740
- call_config.call_attributes[RequestHashAttributeName()] = hash_value;
741
- call_config.on_commit = [cluster_state = it->second->Ref()]() mutable {
742
- cluster_state.reset();
743
- };
744
- return std::move(call_config);
857
+ args.service_config_call_data->SetCallAttribute(
858
+ args.arena->New<RequestHashAttribute>(hash_value));
859
+ args.service_config_call_data->SetCallAttribute(
860
+ args.arena->ManagedNew<XdsClusterMapAttribute>(cluster_map_));
861
+ return absl::OkStatus();
745
862
  }
746
863
 
747
864
  //
@@ -19,12 +19,27 @@
19
19
 
20
20
  #include <grpc/support/port_platform.h>
21
21
 
22
+ #include "absl/strings/string_view.h"
23
+
22
24
  #include "src/core/lib/gprpp/unique_type_name.h"
25
+ #include "src/core/lib/service_config/service_config_call_data.h"
23
26
 
24
27
  namespace grpc_core {
25
28
 
26
- UniqueTypeName XdsClusterAttributeTypeName();
29
+ class XdsClusterAttribute
30
+ : public ServiceConfigCallData::CallAttributeInterface {
31
+ public:
32
+ static UniqueTypeName TypeName();
33
+
34
+ explicit XdsClusterAttribute(absl::string_view cluster) : cluster_(cluster) {}
35
+
36
+ absl::string_view cluster() const { return cluster_; }
37
+
38
+ private:
39
+ UniqueTypeName type() const override { return TypeName(); }
27
40
 
41
+ absl::string_view cluster_;
42
+ };
28
43
  } // namespace grpc_core
29
44
 
30
45
  #endif // GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RESOLVER_XDS_XDS_RESOLVER_H
@@ -29,6 +29,7 @@
29
29
 
30
30
  #include <grpc/grpc.h>
31
31
  #include <grpc/status.h>
32
+ #include <grpc/support/json.h>
32
33
  #include <grpc/support/log.h>
33
34
 
34
35
  #include "src/core/lib/channel/channel_args.h"
@@ -34,11 +34,11 @@
34
34
  #include "src/core/lib/channel/channel_fwd.h"
35
35
  #include "src/core/lib/channel/channel_stack.h"
36
36
  #include "src/core/lib/channel/channel_stack_builder.h"
37
- #include "src/core/lib/channel/context.h"
38
37
  #include "src/core/lib/config/core_configuration.h"
39
38
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
40
39
  #include "src/core/lib/iomgr/closure.h"
41
40
  #include "src/core/lib/iomgr/error.h"
41
+ #include "src/core/lib/resource_quota/arena.h"
42
42
  #include "src/core/lib/service_config/service_config.h"
43
43
  #include "src/core/lib/service_config/service_config_call_data.h"
44
44
  #include "src/core/lib/service_config/service_config_impl.h"
@@ -75,55 +75,25 @@ class ServiceConfigChannelArgChannelData {
75
75
  RefCountedPtr<ServiceConfig> service_config_;
76
76
  };
77
77
 
78
- class ServiceConfigChannelArgCallData {
79
- public:
80
- ServiceConfigChannelArgCallData(
81
- RefCountedPtr<ServiceConfig> service_config,
82
- const ServiceConfigParser::ParsedConfigVector* method_config,
83
- const grpc_call_element_args* args)
84
- : call_context_(args->context),
85
- service_config_call_data_(std::move(service_config), method_config,
86
- /*call_attributes=*/{}) {
87
- GPR_DEBUG_ASSERT(args->context != nullptr);
88
- // No need to set the destroy function, since it will be cleaned up
89
- // when this filter is destroyed in the filter stack.
90
- args->context[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value =
91
- &service_config_call_data_;
92
- }
93
-
94
- ~ServiceConfigChannelArgCallData() {
95
- // Remove the entry from call context, just in case anyone above us
96
- // tries to look at it during call stack destruction.
97
- call_context_[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value = nullptr;
98
- }
99
-
100
- private:
101
- grpc_call_context_element* call_context_;
102
- ServiceConfigCallData service_config_call_data_;
103
- };
104
-
105
78
  grpc_error_handle ServiceConfigChannelArgInitCallElem(
106
79
  grpc_call_element* elem, const grpc_call_element_args* args) {
107
80
  auto* chand =
108
81
  static_cast<ServiceConfigChannelArgChannelData*>(elem->channel_data);
109
- auto* calld = static_cast<ServiceConfigChannelArgCallData*>(elem->call_data);
110
82
  RefCountedPtr<ServiceConfig> service_config = chand->service_config();
111
- const ServiceConfigParser::ParsedConfigVector* method_config = nullptr;
83
+ const ServiceConfigParser::ParsedConfigVector* method_configs = nullptr;
112
84
  if (service_config != nullptr) {
113
- method_config = service_config->GetMethodParsedConfigVector(args->path);
85
+ method_configs = service_config->GetMethodParsedConfigVector(args->path);
114
86
  }
115
- new (calld) ServiceConfigChannelArgCallData(std::move(service_config),
116
- method_config, args);
87
+ auto* service_config_call_data =
88
+ args->arena->New<ServiceConfigCallData>(args->arena, args->context);
89
+ service_config_call_data->SetServiceConfig(std::move(service_config),
90
+ method_configs);
117
91
  return absl::OkStatus();
118
92
  }
119
93
 
120
94
  void ServiceConfigChannelArgDestroyCallElem(
121
- grpc_call_element* elem, const grpc_call_final_info* /* final_info */,
122
- grpc_closure* /* then_schedule_closure */) {
123
- ServiceConfigChannelArgCallData* calld =
124
- static_cast<ServiceConfigChannelArgCallData*>(elem->call_data);
125
- calld->~ServiceConfigChannelArgCallData();
126
- }
95
+ grpc_call_element* /*elem*/, const grpc_call_final_info* /*final_info*/,
96
+ grpc_closure* /*then_schedule_closure*/) {}
127
97
 
128
98
  grpc_error_handle ServiceConfigChannelArgInitChannelElem(
129
99
  grpc_channel_element* elem, grpc_channel_element_args* args) {
@@ -143,7 +113,7 @@ const grpc_channel_filter ServiceConfigChannelArgFilter = {
143
113
  grpc_call_next_op,
144
114
  nullptr,
145
115
  grpc_channel_next_op,
146
- sizeof(ServiceConfigChannelArgCallData),
116
+ 0,
147
117
  ServiceConfigChannelArgInitCallElem,
148
118
  grpc_call_stack_ignore_set_pollset_or_pollset_set,
149
119
  ServiceConfigChannelArgDestroyCallElem,