grpc 1.60.0 → 1.62.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (889) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +397 -332
  3. data/include/grpc/event_engine/event_engine.h +25 -16
  4. data/include/grpc/event_engine/extensible.h +68 -0
  5. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  6. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  7. data/include/grpc/event_engine/memory_allocator.h +3 -1
  8. data/include/grpc/event_engine/slice.h +5 -0
  9. data/include/grpc/grpc_security.h +22 -1
  10. data/include/grpc/impl/call.h +29 -0
  11. data/include/grpc/impl/channel_arg_names.h +12 -1
  12. data/include/grpc/impl/slice_type.h +1 -1
  13. data/include/grpc/module.modulemap +1 -0
  14. data/include/grpc/support/port_platform.h +12 -20
  15. data/src/core/{ext/filters/client_channel → client_channel}/backend_metric.cc +3 -3
  16. data/src/core/{ext/filters/client_channel → client_channel}/backend_metric.h +4 -4
  17. data/src/core/{ext/filters/client_channel → client_channel}/backup_poller.cc +1 -1
  18. data/src/core/{ext/filters/client_channel → client_channel}/backup_poller.h +3 -3
  19. data/src/core/{ext/filters/client_channel → client_channel}/channel_connectivity.cc +11 -11
  20. data/src/core/{ext/filters/client_channel → client_channel}/client_channel_channelz.cc +1 -1
  21. data/src/core/{ext/filters/client_channel → client_channel}/client_channel_channelz.h +3 -3
  22. data/src/core/{ext/filters/client_channel → client_channel}/client_channel_factory.cc +1 -1
  23. data/src/core/{ext/filters/client_channel → client_channel}/client_channel_factory.h +4 -4
  24. data/src/core/{ext/filters/client_channel/client_channel.cc → client_channel/client_channel_filter.cc} +278 -236
  25. data/src/core/{ext/filters/client_channel/client_channel.h → client_channel/client_channel_filter.h} +42 -42
  26. data/src/core/{ext/filters/client_channel → client_channel}/client_channel_internal.h +8 -6
  27. data/src/core/{ext/filters/client_channel → client_channel}/client_channel_plugin.cc +5 -5
  28. data/src/core/{ext/filters/client_channel → client_channel}/client_channel_service_config.cc +2 -2
  29. data/src/core/{ext/filters/client_channel → client_channel}/client_channel_service_config.h +5 -5
  30. data/src/core/{ext/filters/client_channel → client_channel}/config_selector.cc +1 -1
  31. data/src/core/{ext/filters/client_channel → client_channel}/config_selector.h +5 -5
  32. data/src/core/{ext/filters/client_channel → client_channel}/connector.h +3 -3
  33. data/src/core/{ext/filters/client_channel → client_channel}/dynamic_filters.cc +1 -1
  34. data/src/core/{ext/filters/client_channel → client_channel}/dynamic_filters.h +3 -3
  35. data/src/core/{ext/filters/client_channel → client_channel}/global_subchannel_pool.cc +3 -3
  36. data/src/core/{ext/filters/client_channel → client_channel}/global_subchannel_pool.h +4 -4
  37. data/src/core/{ext/filters/client_channel → client_channel}/http_proxy_mapper.cc +1 -1
  38. data/src/core/{ext/filters/client_channel → client_channel}/http_proxy_mapper.h +3 -3
  39. data/src/core/{ext/filters/client_channel → client_channel}/local_subchannel_pool.cc +2 -2
  40. data/src/core/{ext/filters/client_channel → client_channel}/local_subchannel_pool.h +4 -4
  41. data/src/core/{ext/filters/client_channel → client_channel}/retry_filter.cc +9 -8
  42. data/src/core/{ext/filters/client_channel → client_channel}/retry_filter.h +8 -8
  43. data/src/core/{ext/filters/client_channel → client_channel}/retry_filter_legacy_call_data.cc +12 -9
  44. data/src/core/{ext/filters/client_channel → client_channel}/retry_filter_legacy_call_data.h +11 -10
  45. data/src/core/{ext/filters/client_channel → client_channel}/retry_service_config.cc +1 -1
  46. data/src/core/{ext/filters/client_channel → client_channel}/retry_service_config.h +4 -4
  47. data/src/core/{ext/filters/client_channel → client_channel}/retry_throttle.cc +1 -1
  48. data/src/core/{ext/filters/client_channel → client_channel}/retry_throttle.h +3 -3
  49. data/src/core/{ext/filters/client_channel → client_channel}/service_config_channel_arg_filter.cc +39 -21
  50. data/src/core/{ext/filters/client_channel → client_channel}/subchannel.cc +2 -2
  51. data/src/core/{ext/filters/client_channel → client_channel}/subchannel.h +6 -6
  52. data/src/core/{ext/filters/client_channel → client_channel}/subchannel_interface_internal.h +5 -5
  53. data/src/core/{ext/filters/client_channel → client_channel}/subchannel_pool_interface.cc +1 -1
  54. data/src/core/{ext/filters/client_channel → client_channel}/subchannel_pool_interface.h +3 -3
  55. data/src/core/{ext/filters/client_channel → client_channel}/subchannel_stream_client.cc +1 -1
  56. data/src/core/{ext/filters/client_channel → client_channel}/subchannel_stream_client.h +4 -4
  57. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +55 -8
  58. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  59. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  60. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  61. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  62. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  63. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  64. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +18 -14
  65. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  66. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +1 -1
  67. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  68. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  69. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  70. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  71. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  72. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  73. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  74. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  75. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  76. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  77. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  78. data/src/core/ext/filters/message_size/message_size_filter.cc +57 -77
  79. data/src/core/ext/filters/message_size/message_size_filter.h +36 -24
  80. data/src/core/ext/filters/rbac/rbac_filter.cc +16 -12
  81. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  82. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +1 -1
  83. data/src/core/ext/filters/server_config_selector/server_config_selector.h +2 -2
  84. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +27 -15
  85. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +48 -51
  86. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +22 -5
  87. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +1 -1
  88. data/src/core/ext/transport/chttp2/alpn/alpn.cc +5 -2
  89. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +7 -7
  90. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +1 -1
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  92. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +67 -145
  93. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  94. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  95. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  96. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  97. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  98. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  99. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  100. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  101. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +5 -0
  102. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -1
  103. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +3 -1
  104. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  105. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  106. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  107. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  108. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  109. data/src/core/ext/transport/inproc/inproc_transport.cc +179 -13
  110. data/src/core/ext/transport/inproc/inproc_transport.h +8 -0
  111. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb.h +351 -164
  112. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb_minitable.c +89 -50
  113. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb_minitable.h +2 -0
  114. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb.h +47 -3
  115. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb_minitable.c +15 -7
  116. data/src/core/ext/upb-gen/envoy/config/cluster/v3/filter.upb.h +32 -3
  117. data/src/core/ext/upb-gen/envoy/config/cluster/v3/filter.upb_minitable.c +8 -5
  118. data/src/core/ext/upb-gen/envoy/config/cluster/v3/outlier_detection.upb.h +28 -0
  119. data/src/core/ext/upb-gen/envoy/config/cluster/v3/outlier_detection.upb_minitable.c +6 -4
  120. data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb.h +0 -1
  121. data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb_minitable.c +0 -1
  122. data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb.h +29 -0
  123. data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb_minitable.c +7 -4
  124. data/src/core/ext/upb-gen/envoy/config/core/v3/base.upb.h +17 -1
  125. data/src/core/ext/upb-gen/envoy/config/core/v3/base.upb_minitable.c +4 -3
  126. data/src/core/ext/upb-gen/envoy/config/core/v3/http_service.upb.h +166 -0
  127. data/src/core/ext/upb-gen/envoy/config/core/v3/http_service.upb_minitable.c +55 -0
  128. data/src/core/ext/upb-gen/envoy/config/core/v3/http_service.upb_minitable.h +30 -0
  129. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb.h +30 -0
  130. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb_minitable.c +7 -5
  131. data/src/core/ext/upb-gen/envoy/config/core/v3/substitution_format_string.upb.h +99 -19
  132. data/src/core/ext/upb-gen/envoy/config/core/v3/substitution_format_string.upb_minitable.c +29 -12
  133. data/src/core/ext/upb-gen/envoy/config/core/v3/substitution_format_string.upb_minitable.h +1 -0
  134. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint.upb.h +15 -0
  135. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint.upb_minitable.c +4 -3
  136. data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb.h +31 -3
  137. data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb_minitable.c +22 -4
  138. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb.h +91 -3
  139. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb_minitable.c +11 -8
  140. data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb.h +30 -0
  141. data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb_minitable.c +7 -4
  142. data/src/core/ext/upb-gen/envoy/config/trace/v3/dynamic_ot.upb.h +1 -0
  143. data/src/core/ext/upb-gen/envoy/config/trace/v3/dynamic_ot.upb_minitable.c +1 -0
  144. data/src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb.h +125 -3
  145. data/src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb_minitable.c +17 -4
  146. data/src/core/ext/upb-gen/envoy/data/accesslog/v3/accesslog.upb.h +19 -1
  147. data/src/core/ext/upb-gen/envoy/data/accesslog/v3/accesslog.upb_minitable.c +4 -3
  148. data/src/core/ext/upb-gen/envoy/extensions/filters/http/router/v3/router.upb.h +1 -0
  149. data/src/core/ext/upb-gen/envoy/extensions/filters/http/router/v3/router.upb_minitable.c +1 -0
  150. data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +15 -0
  151. data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb_minitable.c +5 -2
  152. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +42 -0
  153. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.c +11 -8
  154. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb.h +23 -8
  155. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb_minitable.c +9 -4
  156. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +58 -16
  157. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/tls.upb_minitable.c +14 -11
  158. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  159. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  160. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  161. data/src/core/ext/upb-gen/envoy/service/status/v3/csds.upb.h +15 -0
  162. data/src/core/ext/upb-gen/envoy/service/status/v3/csds.upb_minitable.c +7 -2
  163. data/src/core/ext/upb-gen/envoy/type/matcher/v3/value.upb.h +129 -0
  164. data/src/core/ext/upb-gen/envoy/type/matcher/v3/value.upb_minitable.c +27 -6
  165. data/src/core/ext/upb-gen/envoy/type/matcher/v3/value.upb_minitable.h +1 -0
  166. data/src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb.h +15 -0
  167. data/src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb_minitable.c +5 -2
  168. data/src/core/ext/upbdefs-gen/envoy/config/accesslog/v3/accesslog.upbdefs.c +60 -60
  169. data/src/core/ext/upbdefs-gen/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +278 -256
  170. data/src/core/ext/upbdefs-gen/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +10 -0
  171. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.c +483 -475
  172. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/filter.upbdefs.c +27 -20
  173. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/outlier_detection.upbdefs.c +17 -12
  174. data/src/core/ext/upbdefs-gen/envoy/config/common/matcher/v3/matcher.upbdefs.c +157 -161
  175. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/address.upbdefs.c +105 -97
  176. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/base.upbdefs.c +106 -102
  177. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/http_service.upbdefs.c +52 -0
  178. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/http_service.upbdefs.h +35 -0
  179. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/http_uri.upbdefs.c +14 -13
  180. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/protocol.upbdefs.c +228 -224
  181. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/substitution_format_string.upbdefs.c +32 -26
  182. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/substitution_format_string.upbdefs.h +5 -0
  183. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint.upbdefs.c +31 -28
  184. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route.upbdefs.c +22 -19
  185. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route_components.upbdefs.c +818 -813
  186. data/src/core/ext/upbdefs-gen/envoy/config/tap/v3/common.upbdefs.c +158 -151
  187. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/dynamic_ot.upbdefs.c +27 -23
  188. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/opencensus.upbdefs.c +59 -53
  189. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/opentelemetry.upbdefs.c +40 -18
  190. data/src/core/ext/upbdefs-gen/envoy/data/accesslog/v3/accesslog.upbdefs.c +106 -103
  191. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/router/v3/router.upbdefs.c +16 -12
  192. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +22 -21
  193. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +265 -261
  194. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +127 -125
  195. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +188 -182
  196. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  197. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  198. data/src/core/ext/upbdefs-gen/envoy/service/status/v3/csds.upbdefs.c +57 -56
  199. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/value.upbdefs.c +27 -20
  200. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/value.upbdefs.h +5 -0
  201. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/cel.upbdefs.c +10 -8
  202. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  203. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  204. data/src/core/ext/xds/xds_api.cc +92 -166
  205. data/src/core/ext/xds/xds_api.h +4 -9
  206. data/src/core/ext/xds/xds_bootstrap.h +6 -4
  207. data/src/core/ext/xds/xds_bootstrap_grpc.cc +4 -15
  208. data/src/core/ext/xds/xds_bootstrap_grpc.h +2 -1
  209. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  210. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  211. data/src/core/ext/xds/xds_client.cc +526 -468
  212. data/src/core/ext/xds/xds_client.h +50 -36
  213. data/src/core/ext/xds/xds_client_grpc.cc +56 -16
  214. data/src/core/ext/xds/xds_client_grpc.h +4 -1
  215. data/src/core/ext/xds/xds_client_stats.cc +11 -11
  216. data/src/core/ext/xds/xds_client_stats.h +8 -13
  217. data/src/core/ext/xds/xds_cluster.cc +105 -12
  218. data/src/core/ext/xds/xds_cluster.h +10 -2
  219. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  220. data/src/core/ext/xds/xds_common_types.cc +14 -10
  221. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  222. data/src/core/ext/xds/xds_endpoint.h +6 -2
  223. data/src/core/ext/xds/xds_health_status.cc +12 -2
  224. data/src/core/ext/xds/xds_health_status.h +5 -3
  225. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  226. data/src/core/ext/xds/xds_lb_policy_registry.cc +1 -1
  227. data/src/core/ext/xds/xds_listener.cc +14 -8
  228. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  229. data/src/core/ext/xds/xds_route_config.cc +35 -23
  230. data/src/core/ext/xds/xds_route_config.h +1 -0
  231. data/src/core/ext/xds/xds_server_config_fetcher.cc +63 -59
  232. data/src/core/ext/xds/xds_transport.h +3 -0
  233. data/src/core/ext/xds/xds_transport_grpc.cc +52 -55
  234. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  235. data/src/core/lib/channel/call_tracer.cc +12 -0
  236. data/src/core/lib/channel/call_tracer.h +17 -3
  237. data/src/core/lib/channel/channel_args.cc +24 -14
  238. data/src/core/lib/channel/channel_args.h +89 -14
  239. data/src/core/lib/channel/channel_stack.cc +27 -0
  240. data/src/core/lib/channel/channel_stack.h +10 -10
  241. data/src/core/lib/channel/connected_channel.cc +77 -30
  242. data/src/core/lib/channel/promise_based_filter.cc +4 -4
  243. data/src/core/lib/channel/promise_based_filter.h +1040 -1
  244. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  245. data/src/core/lib/compression/compression_internal.cc +0 -3
  246. data/src/core/lib/config/core_configuration.h +3 -3
  247. data/src/core/lib/event_engine/ares_resolver.cc +141 -73
  248. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  249. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +4 -0
  250. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  251. data/src/core/lib/event_engine/extensions/can_track_errors.h +40 -0
  252. data/src/core/lib/event_engine/extensions/supports_fd.h +160 -0
  253. data/src/core/lib/event_engine/forkable.cc +7 -5
  254. data/src/core/lib/event_engine/posix.h +11 -122
  255. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  256. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +57 -0
  257. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +31 -7
  258. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +1 -0
  259. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +54 -39
  260. data/src/core/lib/event_engine/posix_engine/posix_engine.h +6 -12
  261. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +14 -6
  262. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +21 -3
  263. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  264. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  265. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  266. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  267. data/src/core/lib/event_engine/query_extensions.h +85 -0
  268. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  269. data/src/core/lib/event_engine/shim.cc +3 -17
  270. data/src/core/lib/event_engine/shim.h +0 -2
  271. data/src/core/lib/event_engine/thread_pool/thread_count.cc +28 -7
  272. data/src/core/lib/event_engine/thread_pool/thread_count.h +6 -1
  273. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +109 -5
  274. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +9 -0
  275. data/src/core/lib/event_engine/utils.cc +2 -1
  276. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +1 -0
  277. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +115 -0
  278. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  279. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  280. data/src/core/lib/experiments/config.cc +23 -2
  281. data/src/core/lib/experiments/config.h +9 -0
  282. data/src/core/lib/experiments/experiments.cc +296 -378
  283. data/src/core/lib/experiments/experiments.h +64 -162
  284. data/src/core/lib/gpr/posix/sync.cc +2 -2
  285. data/src/core/lib/gpr/posix/time.cc +0 -5
  286. data/src/core/lib/gpr/windows/sync.cc +2 -2
  287. data/src/core/lib/gprpp/debug_location.h +15 -0
  288. data/src/core/lib/gprpp/down_cast.h +49 -0
  289. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  290. data/src/core/lib/gprpp/linux/env.cc +1 -19
  291. data/src/core/lib/gprpp/load_file.cc +2 -1
  292. data/src/core/lib/gprpp/load_file.h +2 -1
  293. data/src/core/lib/gprpp/orphanable.h +27 -0
  294. data/src/core/lib/gprpp/posix/thd.cc +27 -2
  295. data/src/core/lib/gprpp/ref_counted.h +63 -22
  296. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  297. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  298. data/src/core/lib/gprpp/status_helper.cc +1 -2
  299. data/src/core/lib/gprpp/thd.h +8 -0
  300. data/src/core/lib/gprpp/time.h +4 -3
  301. data/src/core/lib/gprpp/windows/directory_reader.cc +1 -0
  302. data/src/core/lib/gprpp/windows/thd.cc +10 -1
  303. data/src/core/lib/iomgr/combiner.cc +16 -52
  304. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +51 -14
  305. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  306. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +2 -2
  307. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +2 -2
  308. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  309. data/src/core/lib/iomgr/tcp_server_posix.cc +65 -50
  310. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +12 -0
  311. data/src/core/lib/json/json_writer.cc +1 -1
  312. data/src/core/lib/promise/activity.cc +17 -2
  313. data/src/core/lib/promise/activity.h +13 -6
  314. data/src/core/lib/promise/all_ok.h +80 -0
  315. data/src/core/lib/promise/context.h +45 -7
  316. data/src/core/lib/promise/detail/join_state.h +2077 -0
  317. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  318. data/src/core/lib/promise/detail/promise_like.h +8 -1
  319. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  320. data/src/core/lib/promise/detail/status.h +42 -5
  321. data/src/core/lib/promise/for_each.h +13 -4
  322. data/src/core/lib/promise/if.h +4 -0
  323. data/src/core/lib/promise/interceptor_list.h +13 -5
  324. data/src/core/lib/promise/latch.h +9 -6
  325. data/src/core/lib/promise/party.cc +45 -31
  326. data/src/core/lib/promise/party.h +176 -9
  327. data/src/core/lib/promise/pipe.h +2 -7
  328. data/src/core/lib/promise/poll.h +39 -13
  329. data/src/core/lib/promise/promise.h +4 -0
  330. data/src/core/lib/promise/seq.h +107 -7
  331. data/src/core/lib/promise/sleep.cc +1 -1
  332. data/src/core/lib/promise/status_flag.h +226 -0
  333. data/src/core/lib/promise/try_join.h +132 -0
  334. data/src/core/lib/promise/try_seq.h +132 -10
  335. data/src/core/lib/resource_quota/arena.h +2 -2
  336. data/src/core/lib/resource_quota/memory_quota.cc +61 -12
  337. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  338. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  339. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  340. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  341. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  342. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  343. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  344. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +9 -11
  345. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  346. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  347. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  348. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +11 -10
  349. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +9 -7
  350. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  351. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +1 -1
  352. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +16 -24
  353. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  354. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  355. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  356. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  357. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  358. data/src/core/lib/security/credentials/xds/xds_credentials.cc +22 -29
  359. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  360. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -1
  361. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +3 -7
  362. data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
  363. data/src/core/lib/security/security_connector/ssl_utils.cc +26 -17
  364. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  365. data/src/core/lib/security/transport/auth_filters.h +71 -4
  366. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  367. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  368. data/src/core/lib/security/transport/security_handshaker.cc +0 -8
  369. data/src/core/lib/security/transport/security_handshaker.h +0 -6
  370. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  371. data/src/core/lib/slice/slice_buffer.h +6 -1
  372. data/src/core/lib/surface/builtins.cc +1 -1
  373. data/src/core/lib/surface/call.cc +783 -210
  374. data/src/core/lib/surface/call.h +26 -13
  375. data/src/core/lib/surface/call_trace.cc +46 -5
  376. data/src/core/lib/surface/channel.cc +15 -25
  377. data/src/core/lib/surface/channel.h +4 -26
  378. data/src/core/lib/surface/channel_init.cc +81 -7
  379. data/src/core/lib/surface/channel_init.h +129 -5
  380. data/src/core/lib/surface/init.cc +15 -9
  381. data/src/core/lib/surface/server.cc +255 -239
  382. data/src/core/lib/surface/server.h +26 -54
  383. data/src/core/lib/surface/version.cc +2 -2
  384. data/src/core/lib/surface/wait_for_cq_end_op.cc +75 -0
  385. data/src/core/lib/surface/wait_for_cq_end_op.h +72 -0
  386. data/src/core/lib/transport/batch_builder.cc +2 -3
  387. data/src/core/lib/transport/batch_builder.h +1 -1
  388. data/src/core/lib/transport/call_factory.cc +41 -0
  389. data/src/core/lib/transport/call_factory.h +56 -0
  390. data/src/core/lib/transport/call_filters.cc +371 -0
  391. data/src/core/lib/transport/call_filters.h +1500 -0
  392. data/src/core/lib/transport/call_final_info.cc +38 -0
  393. data/src/core/lib/transport/call_final_info.h +54 -0
  394. data/src/core/lib/transport/call_size_estimator.cc +41 -0
  395. data/src/core/lib/transport/call_size_estimator.h +52 -0
  396. data/src/core/lib/transport/call_spine.cc +107 -0
  397. data/src/core/lib/transport/call_spine.h +429 -0
  398. data/src/core/lib/transport/connectivity_state.cc +3 -2
  399. data/src/core/lib/transport/connectivity_state.h +4 -0
  400. data/src/core/lib/transport/handshaker.cc +0 -8
  401. data/src/core/lib/transport/handshaker.h +0 -7
  402. data/src/core/lib/transport/message.cc +45 -0
  403. data/src/core/lib/transport/message.h +61 -0
  404. data/src/core/lib/transport/metadata.cc +37 -0
  405. data/src/core/lib/transport/metadata.h +78 -0
  406. data/src/core/lib/transport/metadata_batch.cc +4 -2
  407. data/src/core/lib/transport/metadata_batch.h +6 -6
  408. data/src/core/lib/transport/transport.cc +3 -57
  409. data/src/core/lib/transport/transport.h +23 -102
  410. data/src/core/load_balancing/address_filtering.cc +108 -0
  411. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/address_filtering.h +7 -6
  412. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/backend_metric_data.h +3 -3
  413. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/child_policy_handler.cc +6 -5
  414. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/child_policy_handler.h +4 -4
  415. data/src/core/{lib/load_balancing → load_balancing}/delegating_helper.h +5 -5
  416. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/endpoint_list.cc +18 -21
  417. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/endpoint_list.h +14 -11
  418. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/grpclb/client_load_reporting_filter.cc +2 -2
  419. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/grpclb/client_load_reporting_filter.h +3 -3
  420. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/grpclb/grpclb.cc +158 -111
  421. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/grpclb/grpclb.h +3 -3
  422. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/grpclb/grpclb_balancer_addresses.cc +1 -1
  423. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/grpclb/grpclb_balancer_addresses.h +4 -4
  424. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/grpclb/grpclb_client_stats.cc +1 -1
  425. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/grpclb/grpclb_client_stats.h +3 -3
  426. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/grpclb/load_balancer_api.cc +1 -1
  427. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/grpclb/load_balancer_api.h +4 -4
  428. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/health_check_client.cc +15 -10
  429. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/health_check_client.h +4 -4
  430. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/health_check_client_internal.h +7 -7
  431. data/src/core/{lib/load_balancing → load_balancing}/lb_policy.cc +1 -1
  432. data/src/core/{lib/load_balancing → load_balancing}/lb_policy.h +7 -7
  433. data/src/core/{lib/load_balancing → load_balancing}/lb_policy_factory.h +4 -4
  434. data/src/core/{lib/load_balancing → load_balancing}/lb_policy_registry.cc +2 -2
  435. data/src/core/{lib/load_balancing → load_balancing}/lb_policy_registry.h +5 -5
  436. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/oob_backend_metric.cc +15 -10
  437. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/oob_backend_metric.h +5 -5
  438. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/oob_backend_metric_internal.h +8 -8
  439. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/outlier_detection/outlier_detection.cc +20 -21
  440. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/outlier_detection/outlier_detection.h +3 -3
  441. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/pick_first/pick_first.cc +100 -99
  442. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/pick_first/pick_first.h +4 -4
  443. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/priority/priority.cc +13 -11
  444. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/ring_hash/ring_hash.cc +20 -23
  445. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/ring_hash/ring_hash.h +4 -4
  446. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/rls/rls.cc +51 -29
  447. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/round_robin/round_robin.cc +32 -35
  448. data/src/core/{lib/load_balancing → load_balancing}/subchannel_interface.h +3 -3
  449. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/subchannel_list.h +17 -17
  450. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/weighted_round_robin/static_stride_scheduler.cc +1 -1
  451. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/weighted_round_robin/static_stride_scheduler.h +3 -3
  452. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/weighted_round_robin/weighted_round_robin.cc +47 -45
  453. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/weighted_target/weighted_target.cc +18 -16
  454. data/src/core/load_balancing/xds/cds.cc +757 -0
  455. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/xds/xds_channel_args.h +4 -4
  456. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/xds/xds_cluster_impl.cc +241 -131
  457. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/xds/xds_cluster_manager.cc +15 -13
  458. data/src/core/load_balancing/xds/xds_override_host.cc +1313 -0
  459. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/xds/xds_override_host.h +6 -10
  460. data/src/core/{ext/filters/client_channel/lb_policy → load_balancing}/xds/xds_wrr_locality.cc +13 -14
  461. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  462. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  463. data/src/core/{ext/filters/client_channel/resolver → resolver}/binder/binder_resolver.cc +3 -3
  464. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/c_ares/dns_resolver_ares.cc +11 -10
  465. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/c_ares/dns_resolver_ares.h +3 -3
  466. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/c_ares/grpc_ares_ev_driver.h +4 -4
  467. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  468. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -2
  469. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/c_ares/grpc_ares_wrapper.cc +2 -2
  470. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/c_ares/grpc_ares_wrapper.h +4 -4
  471. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/c_ares/grpc_ares_wrapper_posix.cc +1 -1
  472. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -2
  473. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/dns_resolver_plugin.cc +7 -5
  474. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/dns_resolver_plugin.h +3 -3
  475. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/event_engine/event_engine_client_channel_resolver.cc +12 -10
  476. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/event_engine/event_engine_client_channel_resolver.h +5 -5
  477. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/event_engine/service_config_helper.cc +1 -1
  478. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/event_engine/service_config_helper.h +3 -3
  479. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/native/dns_resolver.cc +4 -4
  480. data/src/core/{ext/filters/client_channel/resolver → resolver}/dns/native/dns_resolver.h +3 -3
  481. data/src/core/{lib/resolver → resolver}/endpoint_addresses.cc +1 -2
  482. data/src/core/{lib/resolver → resolver}/endpoint_addresses.h +51 -3
  483. data/src/core/{ext/filters/client_channel/resolver → resolver}/fake/fake_resolver.cc +4 -4
  484. data/src/core/{ext/filters/client_channel/resolver → resolver}/fake/fake_resolver.h +4 -4
  485. data/src/core/{ext/filters/client_channel/resolver → resolver}/google_c2p/google_c2p_resolver.cc +5 -5
  486. data/src/core/{ext/filters/client_channel/resolver → resolver}/polling_resolver.cc +9 -11
  487. data/src/core/{ext/filters/client_channel/resolver → resolver}/polling_resolver.h +5 -5
  488. data/src/core/{lib/resolver → resolver}/resolver.cc +1 -1
  489. data/src/core/{lib/resolver → resolver}/resolver.h +6 -6
  490. data/src/core/{lib/resolver → resolver}/resolver_factory.h +4 -4
  491. data/src/core/{lib/resolver → resolver}/resolver_registry.cc +1 -1
  492. data/src/core/{lib/resolver → resolver}/resolver_registry.h +5 -5
  493. data/src/core/{lib/resolver → resolver}/server_address.h +4 -4
  494. data/src/core/{ext/filters/client_channel/resolver → resolver}/sockaddr/sockaddr_resolver.cc +3 -3
  495. data/src/core/resolver/xds/xds_dependency_manager.cc +1031 -0
  496. data/src/core/resolver/xds/xds_dependency_manager.h +277 -0
  497. data/src/core/{ext/filters/client_channel/resolver → resolver}/xds/xds_resolver.cc +136 -278
  498. data/src/core/{ext/filters/client_channel/resolver/xds/xds_resolver.h → resolver/xds/xds_resolver_attributes.h} +6 -5
  499. data/src/core/resolver/xds/xds_resolver_trace.cc +25 -0
  500. data/src/core/resolver/xds/xds_resolver_trace.h +30 -0
  501. data/src/core/{lib/service_config → service_config}/service_config.h +4 -4
  502. data/src/core/{lib/service_config → service_config}/service_config_call_data.h +5 -5
  503. data/src/core/{lib/service_config → service_config}/service_config_impl.cc +2 -2
  504. data/src/core/{lib/service_config → service_config}/service_config_impl.h +5 -5
  505. data/src/core/{lib/service_config → service_config}/service_config_parser.cc +1 -1
  506. data/src/core/{lib/service_config → service_config}/service_config_parser.h +3 -3
  507. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  508. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  509. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  510. data/src/core/tsi/fake_transport_security.cc +1 -1
  511. data/src/core/tsi/ssl_transport_security.cc +65 -43
  512. data/src/ruby/ext/grpc/extconf.rb +0 -1
  513. data/src/ruby/ext/grpc/rb_channel.c +11 -5
  514. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  515. data/src/ruby/ext/grpc/rb_event_thread.c +9 -3
  516. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  517. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  518. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  519. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  520. data/src/ruby/lib/grpc/version.rb +1 -1
  521. data/third_party/abseil-cpp/absl/algorithm/algorithm.h +8 -103
  522. data/third_party/abseil-cpp/absl/algorithm/container.h +57 -71
  523. data/third_party/abseil-cpp/absl/base/attributes.h +51 -12
  524. data/third_party/abseil-cpp/absl/base/call_once.h +15 -9
  525. data/third_party/abseil-cpp/absl/base/casts.h +1 -1
  526. data/third_party/abseil-cpp/absl/base/config.h +91 -24
  527. data/third_party/abseil-cpp/absl/base/internal/endian.h +13 -12
  528. data/third_party/abseil-cpp/absl/base/internal/identity.h +4 -2
  529. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +19 -18
  530. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +1 -1
  531. data/third_party/abseil-cpp/absl/base/internal/nullability_impl.h +106 -0
  532. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +9 -11
  533. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +2 -0
  534. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +17 -4
  535. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +20 -0
  536. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +10 -4
  537. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +13 -6
  538. data/third_party/abseil-cpp/absl/base/log_severity.cc +1 -0
  539. data/third_party/abseil-cpp/absl/base/log_severity.h +23 -10
  540. data/third_party/abseil-cpp/absl/base/no_destructor.h +217 -0
  541. data/third_party/abseil-cpp/absl/base/nullability.h +224 -0
  542. data/third_party/abseil-cpp/absl/base/optimization.h +1 -0
  543. data/third_party/abseil-cpp/absl/base/options.h +27 -1
  544. data/third_party/abseil-cpp/absl/base/prefetch.h +25 -14
  545. data/third_party/abseil-cpp/absl/base/thread_annotations.h +0 -2
  546. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +3 -3
  547. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +1 -1
  548. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +4 -2
  549. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +13 -9
  550. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -12
  551. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +12 -1
  552. data/third_party/abseil-cpp/absl/container/internal/layout.h +6 -21
  553. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +11 -2
  554. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +148 -31
  555. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +717 -278
  556. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +26 -2
  557. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h +6 -0
  558. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +34 -5
  559. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy.h +6 -3
  560. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_fallback.cc +4 -2
  561. data/third_party/abseil-cpp/absl/crc/internal/{crc_memcpy_x86_64.cc → crc_memcpy_x86_arm_combined.cc} +65 -47
  562. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +10 -2
  563. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +4 -2
  564. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +24 -0
  565. data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +35 -33
  566. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +41 -17
  567. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +108 -44
  568. data/third_party/abseil-cpp/absl/flags/declare.h +0 -5
  569. data/third_party/abseil-cpp/absl/flags/flag.h +1 -10
  570. data/third_party/abseil-cpp/absl/flags/internal/flag.h +0 -5
  571. data/third_party/abseil-cpp/absl/flags/marshalling.cc +10 -1
  572. data/third_party/abseil-cpp/absl/flags/reflection.cc +2 -1
  573. data/third_party/abseil-cpp/absl/functional/function_ref.h +8 -0
  574. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +2 -2
  575. data/third_party/abseil-cpp/absl/hash/internal/hash.h +49 -2
  576. data/third_party/abseil-cpp/absl/numeric/bits.h +37 -18
  577. data/third_party/abseil-cpp/absl/random/distributions.h +1 -1
  578. data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +248 -0
  579. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +55 -14
  580. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +53 -2
  581. data/third_party/abseil-cpp/absl/status/status.cc +36 -238
  582. data/third_party/abseil-cpp/absl/status/status.h +95 -53
  583. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +1 -3
  584. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +3 -2
  585. data/third_party/abseil-cpp/absl/status/statusor.cc +5 -2
  586. data/third_party/abseil-cpp/absl/status/statusor.h +43 -3
  587. data/third_party/abseil-cpp/absl/strings/ascii.cc +84 -12
  588. data/third_party/abseil-cpp/absl/strings/ascii.h +8 -6
  589. data/third_party/abseil-cpp/absl/strings/charconv.cc +19 -12
  590. data/third_party/abseil-cpp/absl/strings/charconv.h +6 -3
  591. data/third_party/abseil-cpp/absl/strings/charset.h +164 -0
  592. data/third_party/abseil-cpp/absl/strings/cord.cc +266 -69
  593. data/third_party/abseil-cpp/absl/strings/cord.h +138 -92
  594. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +19 -33
  595. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +4 -3
  596. data/third_party/abseil-cpp/absl/strings/escaping.cc +5 -4
  597. data/third_party/abseil-cpp/absl/strings/has_absl_stringify.h +63 -0
  598. data/third_party/abseil-cpp/absl/strings/has_ostream_operator.h +42 -0
  599. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +0 -6
  600. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +19 -45
  601. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +23 -28
  602. data/third_party/abseil-cpp/absl/strings/internal/has_absl_stringify.h +15 -26
  603. data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +12 -4
  604. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +145 -8
  605. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +72 -24
  606. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +17 -1
  607. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +7 -4
  608. data/third_party/abseil-cpp/absl/strings/internal/str_format/constexpr_parser.h +8 -3
  609. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +10 -4
  610. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +5 -4
  611. data/third_party/abseil-cpp/absl/strings/match.cc +3 -0
  612. data/third_party/abseil-cpp/absl/strings/numbers.cc +396 -153
  613. data/third_party/abseil-cpp/absl/strings/numbers.h +193 -35
  614. data/third_party/abseil-cpp/absl/strings/str_cat.cc +151 -21
  615. data/third_party/abseil-cpp/absl/strings/str_cat.h +127 -25
  616. data/third_party/abseil-cpp/absl/strings/str_format.h +30 -20
  617. data/third_party/abseil-cpp/absl/strings/str_join.h +16 -16
  618. data/third_party/abseil-cpp/absl/strings/str_replace.cc +12 -3
  619. data/third_party/abseil-cpp/absl/strings/str_replace.h +8 -5
  620. data/third_party/abseil-cpp/absl/strings/str_split.cc +8 -6
  621. data/third_party/abseil-cpp/absl/strings/str_split.h +18 -0
  622. data/third_party/abseil-cpp/absl/strings/string_view.cc +26 -5
  623. data/third_party/abseil-cpp/absl/strings/string_view.h +91 -26
  624. data/third_party/abseil-cpp/absl/strings/strip.h +5 -2
  625. data/third_party/abseil-cpp/absl/strings/substitute.cc +12 -4
  626. data/third_party/abseil-cpp/absl/strings/substitute.h +103 -91
  627. data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.h +2 -2
  628. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -0
  629. data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.h +4 -2
  630. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +296 -332
  631. data/third_party/abseil-cpp/absl/synchronization/mutex.h +89 -34
  632. data/third_party/abseil-cpp/absl/time/civil_time.h +26 -0
  633. data/third_party/abseil-cpp/absl/time/clock.h +5 -1
  634. data/third_party/abseil-cpp/absl/time/duration.cc +3 -3
  635. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +2 -2
  636. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +1 -1
  637. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +9 -14
  638. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +0 -8
  639. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +18 -0
  640. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +18 -0
  641. data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
  642. data/third_party/abseil-cpp/absl/types/optional.h +3 -2
  643. data/third_party/abseil-cpp/absl/types/span.h +9 -4
  644. data/third_party/abseil-cpp/absl/utility/utility.h +11 -93
  645. data/third_party/boringssl-with-bazel/err_data.c +278 -276
  646. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +1 -1
  647. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +9 -9
  648. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strex.c +8 -21
  649. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
  650. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +19 -1
  651. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +1 -1
  652. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +11 -3
  653. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +4 -1
  654. data/third_party/boringssl-with-bazel/src/crypto/asn1/posix_time.c +1 -1
  655. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +3 -3
  656. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -6
  657. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +4 -13
  658. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +1 -6
  659. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +27 -4
  660. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -4
  661. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -4
  662. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c +8 -0
  663. data/third_party/boringssl-with-bazel/src/crypto/buf/buf.c +1 -11
  664. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +7 -8
  665. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +42 -12
  666. data/third_party/boringssl-with-bazel/src/crypto/bytestring/internal.h +0 -22
  667. data/third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.c +9 -9
  668. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +34 -1
  669. data/third_party/boringssl-with-bazel/src/crypto/chacha/internal.h +49 -3
  670. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c +30 -42
  671. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +87 -96
  672. data/third_party/boringssl-with-bazel/src/crypto/conf/internal.h +5 -1
  673. data/third_party/boringssl-with-bazel/src/crypto/cpu_intel.c +4 -2
  674. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +11 -0
  675. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +4 -0
  676. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +1 -2
  677. data/third_party/boringssl-with-bazel/src/crypto/des/des.c +105 -31
  678. data/third_party/boringssl-with-bazel/src/crypto/des/internal.h +10 -81
  679. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +2 -15
  680. data/third_party/boringssl-with-bazel/src/crypto/engine/engine.c +1 -9
  681. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +1 -5
  682. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c +2 -5
  683. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c +1 -4
  684. data/third_party/boringssl-with-bazel/src/crypto/evp/p_hkdf.c +1 -2
  685. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c +1 -3
  686. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +2 -2
  687. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/add.c +2 -8
  688. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +1 -1
  689. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bytes.c +26 -17
  690. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/ctx.c +1 -1
  691. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +4 -2
  692. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.c +26 -5
  693. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/generic.c +10 -41
  694. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +49 -2
  695. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +26 -0
  696. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery_inv.c +27 -26
  697. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +2 -6
  698. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c +1 -8
  699. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/random.c +8 -2
  700. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +11 -2
  701. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +11 -24
  702. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aesccm.c +43 -50
  703. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +2 -6
  704. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +4 -0
  705. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +1 -2
  706. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +16 -9
  707. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +7 -6
  708. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +2 -7
  709. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +51 -13
  710. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +17 -0
  711. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +5 -2
  712. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +1 -2
  713. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +1 -3
  714. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +6 -5
  715. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +1 -2
  716. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +153 -6
  717. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +87 -7
  718. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +39 -5
  719. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +32 -5
  720. data/third_party/boringssl-with-bazel/src/crypto/internal.h +254 -54
  721. data/third_party/boringssl-with-bazel/src/crypto/keccak/internal.h +70 -0
  722. data/third_party/boringssl-with-bazel/src/crypto/{kyber → keccak}/keccak.c +124 -49
  723. data/third_party/boringssl-with-bazel/src/crypto/kyber/internal.h +8 -39
  724. data/third_party/boringssl-with-bazel/src/crypto/kyber/kyber.c +39 -29
  725. data/third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c +3 -6
  726. data/third_party/boringssl-with-bazel/src/crypto/mem.c +17 -33
  727. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +36 -16
  728. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +0 -3
  729. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +31 -0
  730. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +2 -4
  731. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +3 -3
  732. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +9 -13
  733. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +3 -6
  734. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c +4 -0
  735. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_crypt.c +3 -1
  736. data/third_party/boringssl-with-bazel/src/crypto/spx/address.c +101 -0
  737. data/third_party/boringssl-with-bazel/src/crypto/spx/address.h +50 -0
  738. data/third_party/boringssl-with-bazel/src/crypto/spx/fors.c +133 -0
  739. data/third_party/boringssl-with-bazel/src/crypto/spx/fors.h +54 -0
  740. data/third_party/boringssl-with-bazel/src/crypto/spx/internal.h +79 -0
  741. data/third_party/boringssl-with-bazel/src/crypto/spx/merkle.c +150 -0
  742. data/third_party/boringssl-with-bazel/src/crypto/spx/merkle.h +61 -0
  743. data/third_party/boringssl-with-bazel/src/crypto/spx/params.h +71 -0
  744. data/third_party/boringssl-with-bazel/src/crypto/spx/spx.c +139 -0
  745. data/third_party/boringssl-with-bazel/src/crypto/spx/spx_util.c +53 -0
  746. data/third_party/boringssl-with-bazel/src/crypto/spx/spx_util.h +44 -0
  747. data/third_party/boringssl-with-bazel/src/crypto/spx/thash.c +136 -0
  748. data/third_party/boringssl-with-bazel/src/crypto/spx/thash.h +70 -0
  749. data/third_party/boringssl-with-bazel/src/crypto/spx/wots.c +135 -0
  750. data/third_party/boringssl-with-bazel/src/crypto/spx/wots.h +45 -0
  751. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +4 -9
  752. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +10 -22
  753. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +3 -6
  754. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +12 -36
  755. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +1 -2
  756. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +0 -2
  757. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +14 -9
  758. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +23 -33
  759. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +225 -51
  760. data/third_party/boringssl-with-bazel/src/crypto/x509/policy.c +2 -6
  761. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +6 -2
  762. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +1 -1
  763. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +1 -4
  764. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +1 -3
  765. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_akey.c +1 -1
  766. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_akeya.c +3 -1
  767. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_alt.c +5 -6
  768. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_bcons.c +1 -1
  769. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_bitst.c +1 -1
  770. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_conf.c +0 -2
  771. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_cpols.c +1 -1
  772. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_crld.c +1 -2
  773. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_enum.c +1 -0
  774. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_extku.c +1 -1
  775. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_genn.c +12 -12
  776. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_ia5.c +1 -1
  777. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_info.c +4 -6
  778. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_int.c +1 -1
  779. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_lib.c +3 -2
  780. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_ncons.c +2 -2
  781. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_ocsp.c +1 -1
  782. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_pcons.c +1 -1
  783. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_pmaps.c +1 -1
  784. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_prn.c +3 -4
  785. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_purp.c +92 -335
  786. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_skey.c +1 -2
  787. data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/v3_utl.c +20 -18
  788. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +35 -32
  789. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +44 -59
  790. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +0 -1
  791. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +107 -255
  792. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +32 -20
  793. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +25 -152
  794. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +0 -1
  795. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +330 -944
  796. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +93 -215
  797. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +28 -6
  798. data/third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c +1 -1
  799. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +35 -129
  800. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +7 -8
  801. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +46 -50
  802. data/third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c +2 -0
  803. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +1 -4
  804. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +6 -6
  805. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +0 -21
  806. data/third_party/boringssl-with-bazel/src/include/openssl/asm_base.h +5 -6
  807. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +3 -1
  808. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +24 -0
  809. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +14 -5
  810. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +22 -0
  811. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +1 -0
  812. data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +4 -1
  813. data/third_party/boringssl-with-bazel/src/include/openssl/curve25519.h +2 -2
  814. data/third_party/boringssl-with-bazel/src/include/openssl/des.h +0 -13
  815. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +33 -11
  816. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1 -1
  817. data/third_party/boringssl-with-bazel/src/include/openssl/ex_data.h +5 -4
  818. data/third_party/boringssl-with-bazel/src/include/openssl/kyber.h +26 -18
  819. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +13 -6
  820. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +5 -1
  821. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +1 -0
  822. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +19 -5
  823. data/third_party/boringssl-with-bazel/src/include/openssl/posix_time.h +45 -0
  824. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +5 -0
  825. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +20 -3
  826. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +18 -20
  827. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +76 -60
  828. data/third_party/boringssl-with-bazel/src/include/openssl/target.h +31 -6
  829. data/third_party/boringssl-with-bazel/src/include/openssl/time.h +3 -22
  830. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +2 -1
  831. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +2806 -941
  832. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +38 -1025
  833. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3_errors.h +124 -0
  834. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +1 -2
  835. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +82 -9
  836. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +42 -4
  837. data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -0
  838. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +4 -5
  839. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +9 -1
  840. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +0 -1
  841. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +5 -1
  842. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +5 -1
  843. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64_adx.h +4 -2
  844. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +21 -0
  845. data/third_party/cares/config_linux/ares_config.h +2 -38
  846. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  847. data/third_party/zlib/adler32.c +5 -27
  848. data/third_party/zlib/compress.c +5 -16
  849. data/third_party/zlib/crc32.c +86 -162
  850. data/third_party/zlib/deflate.c +233 -336
  851. data/third_party/zlib/deflate.h +8 -8
  852. data/third_party/zlib/gzguts.h +11 -12
  853. data/third_party/zlib/infback.c +7 -23
  854. data/third_party/zlib/inffast.c +1 -4
  855. data/third_party/zlib/inffast.h +1 -1
  856. data/third_party/zlib/inflate.c +30 -99
  857. data/third_party/zlib/inftrees.c +6 -11
  858. data/third_party/zlib/inftrees.h +3 -3
  859. data/third_party/zlib/trees.c +224 -302
  860. data/third_party/zlib/uncompr.c +4 -12
  861. data/third_party/zlib/zconf.h +6 -2
  862. data/third_party/zlib/zlib.h +191 -188
  863. data/third_party/zlib/zutil.c +16 -44
  864. data/third_party/zlib/zutil.h +10 -10
  865. metadata +241 -184
  866. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +0 -75
  867. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +0 -711
  868. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  869. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +0 -922
  870. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  871. data/src/core/lib/iomgr/load_file.cc +0 -78
  872. data/src/core/lib/iomgr/load_file.h +0 -35
  873. data/src/core/lib/transport/pid_controller.cc +0 -51
  874. data/src/core/lib/transport/pid_controller.h +0 -116
  875. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +0 -137
  876. data/third_party/abseil-cpp/absl/base/internal/thread_annotations.h +0 -280
  877. data/third_party/abseil-cpp/absl/flags/flag.cc +0 -38
  878. data/third_party/abseil-cpp/absl/flags/internal/flag_msvc.inc +0 -116
  879. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +0 -158
  880. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +0 -773
  881. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +0 -607
  882. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +0 -118
  883. data/third_party/boringssl-with-bazel/src/crypto/x509/x_info.c +0 -100
  884. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +0 -111
  885. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +0 -197
  886. data/third_party/upb/upb/collections/array.h +0 -17
  887. data/third_party/upb/upb/collections/map.h +0 -17
  888. data/third_party/upb/upb/upb.hpp +0 -18
  889. /data/third_party/boringssl-with-bazel/src/crypto/{x509v3 → x509}/ext_dat.h +0 -0
@@ -0,0 +1,1313 @@
1
+ //
2
+ // Copyright 2022 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include "src/core/load_balancing/xds/xds_override_host.h"
20
+
21
+ #include <stddef.h>
22
+
23
+ #include <algorithm>
24
+ #include <functional>
25
+ #include <map>
26
+ #include <memory>
27
+ #include <set>
28
+ #include <string>
29
+ #include <tuple>
30
+ #include <type_traits>
31
+ #include <utility>
32
+ #include <vector>
33
+
34
+ #include "absl/base/thread_annotations.h"
35
+ #include "absl/functional/function_ref.h"
36
+ #include "absl/status/status.h"
37
+ #include "absl/status/statusor.h"
38
+ #include "absl/strings/str_cat.h"
39
+ #include "absl/strings/str_join.h"
40
+ #include "absl/strings/str_split.h"
41
+ #include "absl/strings/string_view.h"
42
+ #include "absl/types/optional.h"
43
+ #include "absl/types/span.h"
44
+ #include "absl/types/variant.h"
45
+
46
+ #include <grpc/event_engine/event_engine.h>
47
+ #include <grpc/impl/connectivity_state.h>
48
+ #include <grpc/support/log.h>
49
+
50
+ #include "src/core/client_channel/client_channel_internal.h"
51
+ #include "src/core/load_balancing/child_policy_handler.h"
52
+ #include "src/core/ext/filters/stateful_session/stateful_session_filter.h"
53
+ #include "src/core/ext/xds/xds_health_status.h"
54
+ #include "src/core/lib/address_utils/parse_address.h"
55
+ #include "src/core/lib/address_utils/sockaddr_utils.h"
56
+ #include "src/core/lib/channel/channel_args.h"
57
+ #include "src/core/lib/config/core_configuration.h"
58
+ #include "src/core/lib/debug/trace.h"
59
+ #include "src/core/lib/experiments/experiments.h"
60
+ #include "src/core/lib/gprpp/debug_location.h"
61
+ #include "src/core/lib/gprpp/match.h"
62
+ #include "src/core/lib/gprpp/orphanable.h"
63
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
64
+ #include "src/core/lib/gprpp/ref_counted_string.h"
65
+ #include "src/core/lib/gprpp/sync.h"
66
+ #include "src/core/lib/gprpp/validation_errors.h"
67
+ #include "src/core/lib/gprpp/work_serializer.h"
68
+ #include "src/core/lib/iomgr/closure.h"
69
+ #include "src/core/lib/iomgr/error.h"
70
+ #include "src/core/lib/iomgr/exec_ctx.h"
71
+ #include "src/core/lib/iomgr/iomgr_fwd.h"
72
+ #include "src/core/lib/iomgr/pollset_set.h"
73
+ #include "src/core/lib/iomgr/resolved_address.h"
74
+ #include "src/core/lib/json/json.h"
75
+ #include "src/core/lib/json/json_args.h"
76
+ #include "src/core/lib/json/json_object_loader.h"
77
+ #include "src/core/lib/transport/connectivity_state.h"
78
+ #include "src/core/load_balancing/delegating_helper.h"
79
+ #include "src/core/load_balancing/lb_policy.h"
80
+ #include "src/core/load_balancing/lb_policy_factory.h"
81
+ #include "src/core/load_balancing/lb_policy_registry.h"
82
+ #include "src/core/load_balancing/subchannel_interface.h"
83
+ #include "src/core/resolver/endpoint_addresses.h"
84
+ #include "src/core/resolver/xds/xds_dependency_manager.h"
85
+
86
+ namespace grpc_core {
87
+
88
+ using ::grpc_event_engine::experimental::EventEngine;
89
+
90
+ TraceFlag grpc_lb_xds_override_host_trace(false, "xds_override_host_lb");
91
+
92
+ namespace {
93
+ template <typename Value>
94
+ struct PtrLessThan {
95
+ using is_transparent = void;
96
+
97
+ bool operator()(const std::unique_ptr<Value>& v1,
98
+ const std::unique_ptr<Value>& v2) const {
99
+ return v1 < v2;
100
+ }
101
+ bool operator()(const Value* v1, const Value* v2) const { return v1 < v2; }
102
+ bool operator()(const Value* v1, const std::unique_ptr<Value>& v2) const {
103
+ return v1 < v2.get();
104
+ }
105
+ bool operator()(const std::unique_ptr<Value>& v1, const Value* v2) const {
106
+ return v1.get() < v2;
107
+ }
108
+ };
109
+
110
+ //
111
+ // xds_override_host LB policy
112
+ //
113
+
114
+ class XdsOverrideHostLb : public LoadBalancingPolicy {
115
+ public:
116
+ explicit XdsOverrideHostLb(Args args);
117
+
118
+ absl::string_view name() const override {
119
+ return XdsOverrideHostLbConfig::Name();
120
+ }
121
+
122
+ absl::Status UpdateLocked(UpdateArgs args) override;
123
+ void ExitIdleLocked() override;
124
+ void ResetBackoffLocked() override;
125
+
126
+ private:
127
+ class SubchannelEntry;
128
+
129
+ class SubchannelWrapper : public DelegatingSubchannel {
130
+ public:
131
+ SubchannelWrapper(RefCountedPtr<SubchannelInterface> subchannel,
132
+ RefCountedPtr<XdsOverrideHostLb> policy);
133
+
134
+ // Called immediately after construction. We use two-phase initialization
135
+ // to avoid doing an allocation while holding the lock.
136
+ void set_subchannel_entry(RefCountedPtr<SubchannelEntry> subchannel_entry) {
137
+ subchannel_entry_ = std::move(subchannel_entry);
138
+ }
139
+
140
+ void WatchConnectivityState(
141
+ std::unique_ptr<ConnectivityStateWatcherInterface> watcher) override;
142
+
143
+ void CancelConnectivityStateWatch(
144
+ ConnectivityStateWatcherInterface* watcher) override;
145
+
146
+ RefCountedStringValue address_list() const
147
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
148
+ return subchannel_entry_->address_list();
149
+ }
150
+
151
+ void set_last_used_time()
152
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
153
+ subchannel_entry_->set_last_used_time();
154
+ }
155
+
156
+ XdsOverrideHostLb* policy() const { return policy_.get(); }
157
+
158
+ RefCountedPtr<SubchannelWrapper> Clone() const {
159
+ auto subchannel =
160
+ MakeRefCounted<SubchannelWrapper>(wrapped_subchannel(), policy_);
161
+ subchannel->set_subchannel_entry(subchannel_entry_);
162
+ return subchannel;
163
+ }
164
+
165
+ private:
166
+ class ConnectivityStateWatcher : public ConnectivityStateWatcherInterface {
167
+ public:
168
+ explicit ConnectivityStateWatcher(
169
+ WeakRefCountedPtr<SubchannelWrapper> subchannel)
170
+ : subchannel_(std::move(subchannel)) {}
171
+
172
+ void OnConnectivityStateChange(grpc_connectivity_state state,
173
+ absl::Status status) override {
174
+ subchannel_->UpdateConnectivityState(state, status);
175
+ }
176
+
177
+ grpc_pollset_set* interested_parties() override {
178
+ return subchannel_->policy()->interested_parties();
179
+ }
180
+
181
+ private:
182
+ WeakRefCountedPtr<SubchannelWrapper> subchannel_;
183
+ };
184
+
185
+ void Orphan() override;
186
+
187
+ void UpdateConnectivityState(grpc_connectivity_state state,
188
+ absl::Status status);
189
+
190
+ RefCountedPtr<XdsOverrideHostLb> policy_;
191
+ RefCountedPtr<SubchannelEntry> subchannel_entry_;
192
+ ConnectivityStateWatcher* watcher_;
193
+ std::set<std::unique_ptr<ConnectivityStateWatcherInterface>,
194
+ PtrLessThan<ConnectivityStateWatcherInterface>>
195
+ watchers_;
196
+ };
197
+
198
+ // An entry in the subchannel map.
199
+ //
200
+ // The entry may hold either an owned (RefCountedPtr<>) or unowned
201
+ // (raw pointer) SubchannelWrapper, but not both. It will be unowned
202
+ // in the case where the SubchannelWrapper is owned by the child policy.
203
+ // It will be owned in the case where the child policy has not created a
204
+ // subchannel but we have RPCs whose cookies point to that address.
205
+ //
206
+ // Note that when a SubchannelWrapper is orphaned, it will try to
207
+ // acquire the lock to remove itself from the entry. This means that
208
+ // whenever we need to remove an owned subchannel from an entry, if we
209
+ // released our ref to the SubchannelWrapper immediately, we would
210
+ // cause a deadlock, since our caller is already holding the lock. To
211
+ // avoid that, any method that may result in releasing a ref to the
212
+ // SubchannelWrapper will instead return that ref to the caller, who is
213
+ // responsible for releasing the ref after releasing the lock.
214
+ class SubchannelEntry : public RefCounted<SubchannelEntry> {
215
+ public:
216
+ bool HasOwnedSubchannel() const
217
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
218
+ auto* sc = absl::get_if<RefCountedPtr<SubchannelWrapper>>(&subchannel_);
219
+ return sc != nullptr && *sc != nullptr;
220
+ }
221
+
222
+ // Sets the unowned subchannel. If the entry previously had an
223
+ // owned subchannel, returns the ref to it.
224
+ RefCountedPtr<SubchannelWrapper> SetUnownedSubchannel(
225
+ SubchannelWrapper* subchannel)
226
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_);
227
+
228
+ // Sets the owned subchannel. Must not be called if the entry
229
+ // already has an owned subchannel.
230
+ void SetOwnedSubchannel(RefCountedPtr<SubchannelWrapper> subchannel)
231
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
232
+ GPR_DEBUG_ASSERT(!HasOwnedSubchannel());
233
+ subchannel_ = std::move(subchannel);
234
+ }
235
+
236
+ // Returns a pointer to the subchannel, regardless of whether it's
237
+ // owned or not.
238
+ SubchannelWrapper* GetSubchannel() const
239
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_);
240
+
241
+ // Returns a ref to the subchannel, regardless of whether it's owned
242
+ // or not. Returns null if there is no subchannel or if the
243
+ // subchannel's ref count is 0.
244
+ RefCountedPtr<SubchannelWrapper> GetSubchannelRef() const
245
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_);
246
+
247
+ // If the entry has an owned subchannel, moves it out of the entry
248
+ // and returns it.
249
+ RefCountedPtr<SubchannelWrapper> TakeOwnedSubchannel()
250
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_);
251
+
252
+ // Unsets the entry's subchannel.
253
+ // If the entry had an owned subchannel, moves the ref into
254
+ // owned_subchannels.
255
+ void UnsetSubchannel(
256
+ std::vector<RefCountedPtr<SubchannelWrapper>>* owned_subchannels)
257
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_);
258
+
259
+ // Called when a SubchannelWrapper is orphaned. May replace the
260
+ // unowned SubchannelWrapper with an owned one based on
261
+ // last_used_time_ and connection_idle_timeout.
262
+ void OnSubchannelWrapperOrphan(SubchannelWrapper* wrapper,
263
+ Duration connection_idle_timeout)
264
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_);
265
+
266
+ grpc_connectivity_state connectivity_state() const
267
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
268
+ return connectivity_state_;
269
+ }
270
+ void set_connectivity_state(grpc_connectivity_state state)
271
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
272
+ connectivity_state_ = state;
273
+ }
274
+
275
+ XdsHealthStatus eds_health_status() const
276
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
277
+ return eds_health_status_;
278
+ }
279
+ void set_eds_health_status(XdsHealthStatus eds_health_status)
280
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
281
+ eds_health_status_ = eds_health_status;
282
+ }
283
+
284
+ RefCountedStringValue address_list() const
285
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
286
+ return address_list_;
287
+ }
288
+ void set_address_list(RefCountedStringValue address_list)
289
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
290
+ address_list_ = std::move(address_list);
291
+ }
292
+
293
+ Timestamp last_used_time() const
294
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
295
+ return last_used_time_;
296
+ }
297
+ void set_last_used_time()
298
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
299
+ last_used_time_ = Timestamp::Now();
300
+ }
301
+
302
+ private:
303
+ grpc_connectivity_state connectivity_state_
304
+ ABSL_GUARDED_BY(&XdsOverrideHostLb::mu_) = GRPC_CHANNEL_IDLE;
305
+ absl::variant<SubchannelWrapper*, RefCountedPtr<SubchannelWrapper>>
306
+ subchannel_ ABSL_GUARDED_BY(&XdsOverrideHostLb::mu_);
307
+ XdsHealthStatus eds_health_status_ ABSL_GUARDED_BY(
308
+ &XdsOverrideHostLb::mu_) = XdsHealthStatus(XdsHealthStatus::kUnknown);
309
+ RefCountedStringValue address_list_
310
+ ABSL_GUARDED_BY(&XdsOverrideHostLb::mu_);
311
+ Timestamp last_used_time_ ABSL_GUARDED_BY(&XdsOverrideHostLb::mu_) =
312
+ Timestamp::InfPast();
313
+ };
314
+
315
+ // A picker that wraps the picker from the child for cases when cookie is
316
+ // present.
317
+ class Picker : public SubchannelPicker {
318
+ public:
319
+ Picker(RefCountedPtr<XdsOverrideHostLb> xds_override_host_lb,
320
+ RefCountedPtr<SubchannelPicker> picker,
321
+ XdsHealthStatusSet override_host_health_status_set);
322
+
323
+ PickResult Pick(PickArgs args) override;
324
+
325
+ private:
326
+ class SubchannelConnectionRequester {
327
+ public:
328
+ explicit SubchannelConnectionRequester(
329
+ RefCountedPtr<SubchannelWrapper> subchannel)
330
+ : subchannel_(std::move(subchannel)) {
331
+ GRPC_CLOSURE_INIT(&closure_, RunInExecCtx, this, nullptr);
332
+ // Hop into ExecCtx, so that we don't get stuck running
333
+ // arbitrary WorkSerializer callbacks while doing a pick.
334
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, absl::OkStatus());
335
+ }
336
+
337
+ private:
338
+ static void RunInExecCtx(void* arg, grpc_error_handle /*error*/) {
339
+ auto* self = static_cast<SubchannelConnectionRequester*>(arg);
340
+ self->subchannel_->policy()->work_serializer()->Run(
341
+ [self]() {
342
+ self->subchannel_->RequestConnection();
343
+ delete self;
344
+ },
345
+ DEBUG_LOCATION);
346
+ }
347
+
348
+ RefCountedPtr<SubchannelWrapper> subchannel_;
349
+ grpc_closure closure_;
350
+ };
351
+
352
+ class SubchannelCreationRequester {
353
+ public:
354
+ SubchannelCreationRequester(RefCountedPtr<XdsOverrideHostLb> policy,
355
+ absl::string_view address)
356
+ : policy_(std::move(policy)), address_(address) {
357
+ GRPC_CLOSURE_INIT(&closure_, RunInExecCtx, this, nullptr);
358
+ // Hop into ExecCtx, so that we don't get stuck running
359
+ // arbitrary WorkSerializer callbacks while doing a pick.
360
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, absl::OkStatus());
361
+ }
362
+
363
+ private:
364
+ static void RunInExecCtx(void* arg, grpc_error_handle /*error*/) {
365
+ auto* self = static_cast<SubchannelCreationRequester*>(arg);
366
+ self->policy_->work_serializer()->Run(
367
+ [self]() {
368
+ self->policy_->CreateSubchannelForAddress(self->address_);
369
+ delete self;
370
+ },
371
+ DEBUG_LOCATION);
372
+ }
373
+
374
+ RefCountedPtr<XdsOverrideHostLb> policy_;
375
+ std::string address_;
376
+ grpc_closure closure_;
377
+ };
378
+
379
+ absl::optional<LoadBalancingPolicy::PickResult> PickOverridenHost(
380
+ XdsOverrideHostAttribute* override_host_attr) const;
381
+
382
+ RefCountedPtr<XdsOverrideHostLb> policy_;
383
+ RefCountedPtr<SubchannelPicker> picker_;
384
+ XdsHealthStatusSet override_host_health_status_set_;
385
+ };
386
+
387
+ class Helper
388
+ : public ParentOwningDelegatingChannelControlHelper<XdsOverrideHostLb> {
389
+ public:
390
+ explicit Helper(RefCountedPtr<XdsOverrideHostLb> xds_override_host_policy)
391
+ : ParentOwningDelegatingChannelControlHelper(
392
+ std::move(xds_override_host_policy)) {}
393
+
394
+ RefCountedPtr<SubchannelInterface> CreateSubchannel(
395
+ const grpc_resolved_address& address,
396
+ const ChannelArgs& per_address_args, const ChannelArgs& args) override;
397
+ void UpdateState(grpc_connectivity_state state, const absl::Status& status,
398
+ RefCountedPtr<SubchannelPicker> picker) override;
399
+ };
400
+
401
+ class IdleTimer : public InternallyRefCounted<IdleTimer> {
402
+ public:
403
+ IdleTimer(RefCountedPtr<XdsOverrideHostLb> policy, Duration duration);
404
+
405
+ void Orphan() override;
406
+
407
+ private:
408
+ void OnTimerLocked();
409
+
410
+ RefCountedPtr<XdsOverrideHostLb> policy_;
411
+ absl::optional<EventEngine::TaskHandle> timer_handle_;
412
+ };
413
+
414
+ ~XdsOverrideHostLb() override;
415
+
416
+ void ShutdownLocked() override;
417
+
418
+ void ResetState();
419
+ void ReportTransientFailure(absl::Status status);
420
+
421
+ OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
422
+ const ChannelArgs& args);
423
+
424
+ void MaybeUpdatePickerLocked();
425
+
426
+ void UpdateAddressMap(const EndpointAddressesIterator& endpoints);
427
+
428
+ RefCountedPtr<SubchannelWrapper> AdoptSubchannel(
429
+ const grpc_resolved_address& address,
430
+ RefCountedPtr<SubchannelInterface> subchannel);
431
+
432
+ void CreateSubchannelForAddress(absl::string_view address);
433
+
434
+ void CleanupSubchannels();
435
+
436
+ // State from most recent resolver update.
437
+ ChannelArgs args_;
438
+ XdsHealthStatusSet override_host_status_set_;
439
+ Duration connection_idle_timeout_;
440
+
441
+ // Internal state.
442
+ bool shutting_down_ = false;
443
+
444
+ OrphanablePtr<LoadBalancingPolicy> child_policy_;
445
+
446
+ // Latest state and picker reported by the child policy.
447
+ grpc_connectivity_state state_ = GRPC_CHANNEL_CONNECTING;
448
+ absl::Status status_;
449
+ RefCountedPtr<SubchannelPicker> picker_;
450
+ Mutex mu_;
451
+ std::map<std::string, RefCountedPtr<SubchannelEntry>, std::less<>>
452
+ subchannel_map_ ABSL_GUARDED_BY(mu_);
453
+
454
+ // Timer handle for periodic subchannel sweep.
455
+ OrphanablePtr<IdleTimer> idle_timer_;
456
+ };
457
+
458
+ //
459
+ // XdsOverrideHostLb::Picker
460
+ //
461
+
462
+ XdsOverrideHostLb::Picker::Picker(
463
+ RefCountedPtr<XdsOverrideHostLb> xds_override_host_lb,
464
+ RefCountedPtr<SubchannelPicker> picker,
465
+ XdsHealthStatusSet override_host_health_status_set)
466
+ : policy_(std::move(xds_override_host_lb)),
467
+ picker_(std::move(picker)),
468
+ override_host_health_status_set_(override_host_health_status_set) {
469
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
470
+ gpr_log(GPR_INFO, "[xds_override_host_lb %p] constructed new picker %p",
471
+ policy_.get(), this);
472
+ }
473
+ }
474
+
475
+ absl::optional<LoadBalancingPolicy::PickResult>
476
+ XdsOverrideHostLb::Picker::PickOverridenHost(
477
+ XdsOverrideHostAttribute* override_host_attr) const {
478
+ GPR_ASSERT(override_host_attr != nullptr);
479
+ auto cookie_address_list = override_host_attr->cookie_address_list();
480
+ if (cookie_address_list.empty()) return absl::nullopt;
481
+ // The cookie has an address list, so look through the addresses in order.
482
+ absl::string_view address_with_no_subchannel;
483
+ RefCountedPtr<SubchannelWrapper> idle_subchannel;
484
+ bool found_connecting = false;
485
+ {
486
+ MutexLock lock(&policy_->mu_);
487
+ for (absl::string_view address : absl::StrSplit(cookie_address_list, ',')) {
488
+ auto it = policy_->subchannel_map_.find(address);
489
+ if (it == policy_->subchannel_map_.end()) continue;
490
+ if (!override_host_health_status_set_.Contains(
491
+ it->second->eds_health_status())) {
492
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
493
+ gpr_log(GPR_INFO,
494
+ "Subchannel %s health status is not overridden (%s)",
495
+ std::string(address).c_str(),
496
+ it->second->eds_health_status().ToString());
497
+ }
498
+ continue;
499
+ }
500
+ auto subchannel = it->second->GetSubchannelRef();
501
+ if (subchannel == nullptr) {
502
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
503
+ gpr_log(GPR_INFO, "No subchannel for %s",
504
+ std::string(address).c_str());
505
+ }
506
+ if (address_with_no_subchannel.empty()) {
507
+ address_with_no_subchannel = it->first;
508
+ }
509
+ continue;
510
+ }
511
+ auto connectivity_state = it->second->connectivity_state();
512
+ if (connectivity_state == GRPC_CHANNEL_READY) {
513
+ // Found a READY subchannel. Pass back the actual address list
514
+ // and return the subchannel.
515
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
516
+ gpr_log(GPR_INFO, "Picker override found READY subchannel %s",
517
+ std::string(address).c_str());
518
+ }
519
+ it->second->set_last_used_time();
520
+ override_host_attr->set_actual_address_list(it->second->address_list());
521
+ return PickResult::Complete(subchannel->wrapped_subchannel());
522
+ } else if (connectivity_state == GRPC_CHANNEL_IDLE) {
523
+ if (idle_subchannel == nullptr) idle_subchannel = std::move(subchannel);
524
+ } else if (connectivity_state == GRPC_CHANNEL_CONNECTING) {
525
+ found_connecting = true;
526
+ }
527
+ }
528
+ }
529
+ // No READY subchannel found. If we found an IDLE subchannel, trigger
530
+ // a connection attempt and queue the pick until that attempt completes.
531
+ if (idle_subchannel != nullptr) {
532
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
533
+ gpr_log(GPR_INFO, "Picker override found IDLE subchannel");
534
+ }
535
+ // Deletes itself after the connection is requested.
536
+ new SubchannelConnectionRequester(std::move(idle_subchannel));
537
+ return PickResult::Queue();
538
+ }
539
+ // No READY or IDLE subchannels. If we found a CONNECTING subchannel,
540
+ // queue the pick and wait for the connection attempt to complete.
541
+ if (found_connecting) {
542
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
543
+ gpr_log(GPR_INFO, "Picker override found CONNECTING subchannel");
544
+ }
545
+ return PickResult::Queue();
546
+ }
547
+ // No READY, IDLE, or CONNECTING subchannels found. If we found an
548
+ // entry that has no subchannel, then queue the pick and trigger
549
+ // creation of a subchannel for that entry.
550
+ if (!address_with_no_subchannel.empty()) {
551
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
552
+ gpr_log(GPR_INFO, "Picker override found entry with no subchannel");
553
+ }
554
+ if (!IsWorkSerializerDispatchEnabled()) {
555
+ new SubchannelCreationRequester(policy_, address_with_no_subchannel);
556
+ } else {
557
+ policy_->work_serializer()->Run(
558
+ [policy = policy_,
559
+ address = std::string(address_with_no_subchannel)]() {
560
+ policy->CreateSubchannelForAddress(address);
561
+ },
562
+ DEBUG_LOCATION);
563
+ }
564
+ return PickResult::Queue();
565
+ }
566
+ // No entry found that was not in TRANSIENT_FAILURE.
567
+ return absl::nullopt;
568
+ }
569
+
570
+ LoadBalancingPolicy::PickResult XdsOverrideHostLb::Picker::Pick(PickArgs args) {
571
+ auto* call_state = static_cast<ClientChannelLbCallState*>(args.call_state);
572
+ auto* override_host_attr = static_cast<XdsOverrideHostAttribute*>(
573
+ call_state->GetCallAttribute(XdsOverrideHostAttribute::TypeName()));
574
+ if (override_host_attr != nullptr) {
575
+ auto overridden_host_pick = PickOverridenHost(override_host_attr);
576
+ if (overridden_host_pick.has_value()) {
577
+ return std::move(*overridden_host_pick);
578
+ }
579
+ }
580
+ // No usable override. Delegate to child picker.
581
+ if (picker_ == nullptr) { // Should never happen.
582
+ return PickResult::Fail(absl::InternalError(
583
+ "xds_override_host picker not given any child picker"));
584
+ }
585
+ auto result = picker_->Pick(args);
586
+ auto complete_pick = absl::get_if<PickResult::Complete>(&result.result);
587
+ if (complete_pick != nullptr) {
588
+ auto* wrapper =
589
+ static_cast<SubchannelWrapper*>(complete_pick->subchannel.get());
590
+ // Populate the address list in the override host attribute so that
591
+ // the StatefulSession filter can set the cookie.
592
+ if (override_host_attr != nullptr) {
593
+ MutexLock lock(&wrapper->policy()->mu_);
594
+ wrapper->set_last_used_time();
595
+ override_host_attr->set_actual_address_list(wrapper->address_list());
596
+ }
597
+ // Unwrap the subchannel.
598
+ complete_pick->subchannel = wrapper->wrapped_subchannel();
599
+ }
600
+ return result;
601
+ }
602
+
603
+ //
604
+ // XdsOverrideHostLb::IdleTimer
605
+ //
606
+
607
+ XdsOverrideHostLb::IdleTimer::IdleTimer(RefCountedPtr<XdsOverrideHostLb> policy,
608
+ Duration duration)
609
+ : policy_(std::move(policy)) {
610
+ // Min time between timer runs is 5s so that we don't kill ourselves
611
+ // with lock contention and CPU usage due to sweeps over the map.
612
+ duration = std::max(duration, Duration::Seconds(5));
613
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
614
+ gpr_log(GPR_INFO,
615
+ "[xds_override_host_lb %p] idle timer %p: subchannel cleanup "
616
+ "pass will run in %s",
617
+ policy_.get(), this, duration.ToString().c_str());
618
+ }
619
+ timer_handle_ = policy_->channel_control_helper()->GetEventEngine()->RunAfter(
620
+ duration, [self = RefAsSubclass<IdleTimer>()]() mutable {
621
+ ApplicationCallbackExecCtx callback_exec_ctx;
622
+ ExecCtx exec_ctx;
623
+ auto self_ptr = self.get();
624
+ self_ptr->policy_->work_serializer()->Run(
625
+ [self = std::move(self)]() { self->OnTimerLocked(); },
626
+ DEBUG_LOCATION);
627
+ });
628
+ }
629
+
630
+ void XdsOverrideHostLb::IdleTimer::Orphan() {
631
+ if (timer_handle_.has_value()) {
632
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
633
+ gpr_log(GPR_INFO, "[xds_override_host_lb %p] idle timer %p: cancelling",
634
+ policy_.get(), this);
635
+ }
636
+ policy_->channel_control_helper()->GetEventEngine()->Cancel(*timer_handle_);
637
+ timer_handle_.reset();
638
+ }
639
+ Unref();
640
+ }
641
+
642
+ void XdsOverrideHostLb::IdleTimer::OnTimerLocked() {
643
+ if (timer_handle_.has_value()) {
644
+ timer_handle_.reset();
645
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
646
+ gpr_log(GPR_INFO, "[xds_override_host_lb %p] idle timer %p: timer fired",
647
+ policy_.get(), this);
648
+ }
649
+ policy_->CleanupSubchannels();
650
+ }
651
+ }
652
+
653
+ //
654
+ // XdsOverrideHostLb
655
+ //
656
+
657
+ XdsOverrideHostLb::XdsOverrideHostLb(Args args)
658
+ : LoadBalancingPolicy(std::move(args)) {
659
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
660
+ gpr_log(GPR_INFO, "[xds_override_host_lb %p] created", this);
661
+ }
662
+ }
663
+
664
+ XdsOverrideHostLb::~XdsOverrideHostLb() {
665
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
666
+ gpr_log(GPR_INFO,
667
+ "[xds_override_host_lb %p] destroying xds_override_host LB policy",
668
+ this);
669
+ }
670
+ }
671
+
672
+ void XdsOverrideHostLb::ShutdownLocked() {
673
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
674
+ gpr_log(GPR_INFO, "[xds_override_host_lb %p] shutting down", this);
675
+ }
676
+ shutting_down_ = true;
677
+ ResetState();
678
+ }
679
+
680
+ void XdsOverrideHostLb::ResetState() {
681
+ {
682
+ // Drop subchannel refs after releasing the lock to avoid deadlock.
683
+ std::vector<RefCountedPtr<SubchannelWrapper>> subchannel_refs_to_drop;
684
+ MutexLock lock(&mu_);
685
+ subchannel_refs_to_drop.reserve(subchannel_map_.size());
686
+ for (auto& p : subchannel_map_) {
687
+ p.second->UnsetSubchannel(&subchannel_refs_to_drop);
688
+ }
689
+ subchannel_map_.clear();
690
+ }
691
+ // Cancel timer, if any.
692
+ idle_timer_.reset();
693
+ // Remove the child policy's interested_parties pollset_set from the
694
+ // xDS policy.
695
+ if (child_policy_ != nullptr) {
696
+ grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(),
697
+ interested_parties());
698
+ child_policy_.reset();
699
+ }
700
+ // Drop our ref to the child's picker, in case it's holding a ref to
701
+ // the child.
702
+ picker_.reset();
703
+ }
704
+
705
+ void XdsOverrideHostLb::ReportTransientFailure(absl::Status status) {
706
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
707
+ gpr_log(GPR_INFO,
708
+ "[xds_override_host_lb %p] reporting TRANSIENT_FAILURE: %s", this,
709
+ status.ToString().c_str());
710
+ }
711
+ ResetState();
712
+ channel_control_helper()->UpdateState(
713
+ GRPC_CHANNEL_TRANSIENT_FAILURE, status,
714
+ MakeRefCounted<TransientFailurePicker>(status));
715
+ }
716
+
717
+ void XdsOverrideHostLb::ExitIdleLocked() {
718
+ if (child_policy_ != nullptr) child_policy_->ExitIdleLocked();
719
+ }
720
+
721
+ void XdsOverrideHostLb::ResetBackoffLocked() {
722
+ if (child_policy_ != nullptr) child_policy_->ResetBackoffLocked();
723
+ }
724
+
725
+ XdsHealthStatus GetEndpointHealthStatus(const EndpointAddresses& endpoint) {
726
+ return XdsHealthStatus(static_cast<XdsHealthStatus::HealthStatus>(
727
+ endpoint.args()
728
+ .GetInt(GRPC_ARG_XDS_HEALTH_STATUS)
729
+ .value_or(XdsHealthStatus::HealthStatus::kUnknown)));
730
+ }
731
+
732
+ // Wraps the endpoint iterator and filters out endpoints in state DRAINING.
733
+ class ChildEndpointIterator : public EndpointAddressesIterator {
734
+ public:
735
+ explicit ChildEndpointIterator(
736
+ std::shared_ptr<EndpointAddressesIterator> parent_it)
737
+ : parent_it_(std::move(parent_it)) {}
738
+
739
+ void ForEach(absl::FunctionRef<void(const EndpointAddresses&)> callback)
740
+ const override {
741
+ parent_it_->ForEach([&](const EndpointAddresses& endpoint) {
742
+ XdsHealthStatus status = GetEndpointHealthStatus(endpoint);
743
+ if (status.status() != XdsHealthStatus::kDraining) {
744
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
745
+ gpr_log(GPR_INFO,
746
+ "[xds_override_host_lb %p] endpoint %s: not draining, "
747
+ "passing to child",
748
+ this, endpoint.ToString().c_str());
749
+ }
750
+ callback(endpoint);
751
+ }
752
+ });
753
+ }
754
+
755
+ private:
756
+ std::shared_ptr<EndpointAddressesIterator> parent_it_;
757
+ };
758
+
759
+ absl::Status XdsOverrideHostLb::UpdateLocked(UpdateArgs args) {
760
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
761
+ gpr_log(GPR_INFO, "[xds_override_host_lb %p] Received update", this);
762
+ }
763
+ // Grab new LB policy config.
764
+ if (args.config == nullptr) {
765
+ return absl::InvalidArgumentError("Missing policy config");
766
+ }
767
+ auto new_config = args.config.TakeAsSubclass<XdsOverrideHostLbConfig>();
768
+ // Get xDS config.
769
+ auto new_xds_config =
770
+ args.args.GetObjectRef<XdsDependencyManager::XdsConfig>();
771
+ if (new_xds_config == nullptr) {
772
+ // Should never happen.
773
+ absl::Status status = absl::InternalError(
774
+ "xDS config not passed to xds_cluster_impl LB policy");
775
+ ReportTransientFailure(status);
776
+ return status;
777
+ }
778
+ auto it = new_xds_config->clusters.find(new_config->cluster_name());
779
+ if (it == new_xds_config->clusters.end() || !it->second.ok() ||
780
+ it->second->cluster == nullptr) {
781
+ // Should never happen.
782
+ absl::Status status = absl::InternalError(absl::StrCat(
783
+ "xDS config has no entry for cluster ", new_config->cluster_name()));
784
+ ReportTransientFailure(status);
785
+ return status;
786
+ }
787
+ args_ = std::move(args.args);
788
+ override_host_status_set_ = it->second->cluster->override_host_statuses;
789
+ connection_idle_timeout_ = it->second->cluster->connection_idle_timeout;
790
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
791
+ gpr_log(GPR_INFO,
792
+ "[xds_override_host_lb %p] override host status set: %s "
793
+ "connection idle timeout: %s",
794
+ this, override_host_status_set_.ToString().c_str(),
795
+ connection_idle_timeout_.ToString().c_str());
796
+ }
797
+ // Update address map and wrap endpoint iterator for child policy.
798
+ if (args.addresses.ok()) {
799
+ UpdateAddressMap(**args.addresses);
800
+ args.addresses =
801
+ std::make_shared<ChildEndpointIterator>(std::move(*args.addresses));
802
+ } else {
803
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
804
+ gpr_log(GPR_INFO, "[xds_override_host_lb %p] address error: %s", this,
805
+ args.addresses.status().ToString().c_str());
806
+ }
807
+ }
808
+ // Create child policy if needed.
809
+ if (child_policy_ == nullptr) {
810
+ child_policy_ = CreateChildPolicyLocked(args.args);
811
+ }
812
+ // Update child policy.
813
+ UpdateArgs update_args;
814
+ update_args.addresses = std::move(args.addresses);
815
+ update_args.resolution_note = std::move(args.resolution_note);
816
+ update_args.config = new_config->child_config();
817
+ update_args.args = args_;
818
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
819
+ gpr_log(GPR_INFO,
820
+ "[xds_override_host_lb %p] Updating child policy handler %p", this,
821
+ child_policy_.get());
822
+ }
823
+ return child_policy_->UpdateLocked(std::move(update_args));
824
+ }
825
+
826
+ void XdsOverrideHostLb::MaybeUpdatePickerLocked() {
827
+ if (picker_ != nullptr) {
828
+ auto xds_override_host_picker = MakeRefCounted<Picker>(
829
+ RefAsSubclass<XdsOverrideHostLb>(), picker_, override_host_status_set_);
830
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
831
+ gpr_log(GPR_INFO,
832
+ "[xds_override_host_lb %p] updating connectivity: state=%s "
833
+ "status=(%s) picker=%p",
834
+ this, ConnectivityStateName(state_), status_.ToString().c_str(),
835
+ xds_override_host_picker.get());
836
+ }
837
+ channel_control_helper()->UpdateState(state_, status_,
838
+ std::move(xds_override_host_picker));
839
+ }
840
+ }
841
+
842
+ OrphanablePtr<LoadBalancingPolicy> XdsOverrideHostLb::CreateChildPolicyLocked(
843
+ const ChannelArgs& args) {
844
+ LoadBalancingPolicy::Args lb_policy_args;
845
+ lb_policy_args.work_serializer = work_serializer();
846
+ lb_policy_args.args = args;
847
+ lb_policy_args.channel_control_helper = std::make_unique<Helper>(
848
+ RefAsSubclass<XdsOverrideHostLb>(DEBUG_LOCATION, "Helper"));
849
+ OrphanablePtr<LoadBalancingPolicy> lb_policy =
850
+ MakeOrphanable<ChildPolicyHandler>(std::move(lb_policy_args),
851
+ &grpc_lb_xds_override_host_trace);
852
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
853
+ gpr_log(GPR_INFO,
854
+ "[xds_override_host_lb %p] Created new child policy handler %p",
855
+ this, lb_policy.get());
856
+ }
857
+ // Add our interested_parties pollset_set to that of the newly created
858
+ // child policy. This will make the child policy progress upon activity on
859
+ // this policy, which in turn is tied to the application's call.
860
+ grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(),
861
+ interested_parties());
862
+ return lb_policy;
863
+ }
864
+
865
+ void XdsOverrideHostLb::UpdateAddressMap(
866
+ const EndpointAddressesIterator& endpoints) {
867
+ // Construct a map of address info from which to update subchannel_map_.
868
+ struct AddressInfo {
869
+ XdsHealthStatus eds_health_status;
870
+ RefCountedStringValue address_list;
871
+ AddressInfo(XdsHealthStatus status, RefCountedStringValue addresses)
872
+ : eds_health_status(status), address_list(std::move(addresses)) {}
873
+ };
874
+ std::map<const std::string, AddressInfo> addresses_for_map;
875
+ endpoints.ForEach([&](const EndpointAddresses& endpoint) {
876
+ XdsHealthStatus status = GetEndpointHealthStatus(endpoint);
877
+ // Skip draining hosts if not in the override status set.
878
+ if (status.status() == XdsHealthStatus::kDraining &&
879
+ !override_host_status_set_.Contains(status)) {
880
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
881
+ gpr_log(GPR_INFO,
882
+ "[xds_override_host_lb %p] endpoint %s: draining but not in "
883
+ "override_host_status set -- ignoring",
884
+ this, endpoint.ToString().c_str());
885
+ }
886
+ return;
887
+ }
888
+ std::vector<std::string> addresses;
889
+ addresses.reserve(endpoint.addresses().size());
890
+ for (const auto& address : endpoint.addresses()) {
891
+ auto key = grpc_sockaddr_to_string(&address, /*normalize=*/false);
892
+ if (!key.ok()) {
893
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
894
+ gpr_log(GPR_INFO,
895
+ "[xds_override_host_lb %p] no key for endpoint address; "
896
+ "not adding to map",
897
+ this);
898
+ }
899
+ } else {
900
+ addresses.push_back(*std::move(key));
901
+ }
902
+ }
903
+ absl::Span<const std::string> addresses_span = addresses;
904
+ for (size_t i = 0; i < addresses.size(); ++i) {
905
+ std::string start = absl::StrJoin(addresses_span.subspan(0, i), ",");
906
+ std::string end = absl::StrJoin(addresses_span.subspan(i + 1), ",");
907
+ RefCountedStringValue address_list(
908
+ absl::StrCat(addresses[i], (start.empty() ? "" : ","), start,
909
+ (end.empty() ? "" : ","), end));
910
+ addresses_for_map.emplace(
911
+ std::piecewise_construct, std::forward_as_tuple(addresses[i]),
912
+ std::forward_as_tuple(status, std::move(address_list)));
913
+ }
914
+ });
915
+ // Now grab the lock and update subchannel_map_ from addresses_for_map.
916
+ const Timestamp now = Timestamp::Now();
917
+ const Timestamp idle_threshold = now - connection_idle_timeout_;
918
+ Duration next_time = connection_idle_timeout_;
919
+ {
920
+ // Drop subchannel refs after releasing the lock to avoid deadlock.
921
+ std::vector<RefCountedPtr<SubchannelWrapper>> subchannel_refs_to_drop;
922
+ MutexLock lock(&mu_);
923
+ for (auto it = subchannel_map_.begin(); it != subchannel_map_.end();) {
924
+ if (addresses_for_map.find(it->first) == addresses_for_map.end()) {
925
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
926
+ gpr_log(GPR_INFO, "[xds_override_host_lb %p] removing map key %s",
927
+ this, it->first.c_str());
928
+ }
929
+ it->second->UnsetSubchannel(&subchannel_refs_to_drop);
930
+ it = subchannel_map_.erase(it);
931
+ } else {
932
+ ++it;
933
+ }
934
+ }
935
+ for (auto& p : addresses_for_map) {
936
+ const auto& address = p.first;
937
+ auto& address_info = p.second;
938
+ auto it = subchannel_map_.find(address);
939
+ if (it == subchannel_map_.end()) {
940
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
941
+ gpr_log(GPR_INFO, "[xds_override_host_lb %p] adding map key %s", this,
942
+ address.c_str());
943
+ }
944
+ it = subchannel_map_.emplace(address, MakeRefCounted<SubchannelEntry>())
945
+ .first;
946
+ }
947
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
948
+ gpr_log(GPR_INFO,
949
+ "[xds_override_host_lb %p] map key %s: setting "
950
+ "eds_health_status=%s address_list=%s",
951
+ this, address.c_str(),
952
+ address_info.eds_health_status.ToString(),
953
+ address_info.address_list.c_str());
954
+ }
955
+ it->second->set_eds_health_status(address_info.eds_health_status);
956
+ it->second->set_address_list(std::move(address_info.address_list));
957
+ // Check the entry's last_used_time to determine the next time at
958
+ // which the timer needs to run.
959
+ if (it->second->last_used_time() > idle_threshold) {
960
+ const Duration next_time_for_entry =
961
+ it->second->last_used_time() + connection_idle_timeout_ - now;
962
+ next_time = std::min(next_time, next_time_for_entry);
963
+ }
964
+ }
965
+ }
966
+ idle_timer_ =
967
+ MakeOrphanable<IdleTimer>(RefAsSubclass<XdsOverrideHostLb>(), next_time);
968
+ }
969
+
970
+ RefCountedPtr<XdsOverrideHostLb::SubchannelWrapper>
971
+ XdsOverrideHostLb::AdoptSubchannel(
972
+ const grpc_resolved_address& address,
973
+ RefCountedPtr<SubchannelInterface> subchannel) {
974
+ auto wrapper = MakeRefCounted<SubchannelWrapper>(
975
+ std::move(subchannel), RefAsSubclass<XdsOverrideHostLb>());
976
+ auto key = grpc_sockaddr_to_string(&address, /*normalize=*/false);
977
+ if (key.ok()) {
978
+ // Drop ref to previously owned subchannel (if any) after releasing
979
+ // the lock.
980
+ RefCountedPtr<SubchannelWrapper> subchannel_ref_to_drop;
981
+ MutexLock lock(&mu_);
982
+ auto it = subchannel_map_.find(*key);
983
+ if (it != subchannel_map_.end()) {
984
+ wrapper->set_subchannel_entry(it->second);
985
+ subchannel_ref_to_drop = it->second->SetUnownedSubchannel(wrapper.get());
986
+ }
987
+ }
988
+ return wrapper;
989
+ }
990
+
991
+ void XdsOverrideHostLb::CreateSubchannelForAddress(absl::string_view address) {
992
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
993
+ gpr_log(GPR_INFO,
994
+ "[xds_override_host_lb %p] creating owned subchannel for %s", this,
995
+ std::string(address).c_str());
996
+ }
997
+ auto addr = StringToSockaddr(address);
998
+ GPR_ASSERT(addr.ok());
999
+ // Note: We don't currently have any cases where per_address_args need to
1000
+ // be passed through. If we encounter any such cases in the future, we
1001
+ // will need to change this to store those attributes from the resolver
1002
+ // update in the map entry.
1003
+ auto subchannel = channel_control_helper()->CreateSubchannel(
1004
+ *addr, /*per_address_args=*/ChannelArgs(), args_);
1005
+ auto wrapper = MakeRefCounted<SubchannelWrapper>(
1006
+ std::move(subchannel), RefAsSubclass<XdsOverrideHostLb>());
1007
+ {
1008
+ MutexLock lock(&mu_);
1009
+ auto it = subchannel_map_.find(address);
1010
+ // This can happen if the map entry was removed between the time that
1011
+ // the picker requested the subchannel creation and the time that we got
1012
+ // here. In that case, we can just make it a no-op, since the update
1013
+ // that removed the entry will have generated a new picker already.
1014
+ if (it == subchannel_map_.end()) return;
1015
+ // This can happen if the picker requests subchannel creation for
1016
+ // the same address multiple times.
1017
+ if (it->second->HasOwnedSubchannel()) return;
1018
+ wrapper->set_subchannel_entry(it->second);
1019
+ it->second->SetOwnedSubchannel(std::move(wrapper));
1020
+ }
1021
+ MaybeUpdatePickerLocked();
1022
+ }
1023
+
1024
+ void XdsOverrideHostLb::CleanupSubchannels() {
1025
+ const Timestamp now = Timestamp::Now();
1026
+ const Timestamp idle_threshold = now - connection_idle_timeout_;
1027
+ Duration next_time = connection_idle_timeout_;
1028
+ std::vector<RefCountedPtr<SubchannelWrapper>> subchannel_refs_to_drop;
1029
+ {
1030
+ MutexLock lock(&mu_);
1031
+ if (subchannel_map_.empty()) return;
1032
+ for (const auto& p : subchannel_map_) {
1033
+ if (p.second->last_used_time() <= idle_threshold) {
1034
+ auto subchannel = p.second->TakeOwnedSubchannel();
1035
+ if (subchannel != nullptr) {
1036
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
1037
+ gpr_log(GPR_INFO,
1038
+ "[xds_override_host_lb %p] dropping subchannel for %s",
1039
+ this, p.first.c_str());
1040
+ }
1041
+ subchannel_refs_to_drop.push_back(std::move(subchannel));
1042
+ }
1043
+ } else {
1044
+ // Not dropping the subchannel. Check the entry's last_used_time to
1045
+ // determine the next time at which the timer needs to run.
1046
+ const Duration next_time_for_entry =
1047
+ p.second->last_used_time() + connection_idle_timeout_ - now;
1048
+ next_time = std::min(next_time, next_time_for_entry);
1049
+ }
1050
+ }
1051
+ }
1052
+ idle_timer_ =
1053
+ MakeOrphanable<IdleTimer>(RefAsSubclass<XdsOverrideHostLb>(), next_time);
1054
+ }
1055
+
1056
+ //
1057
+ // XdsOverrideHostLb::Helper
1058
+ //
1059
+
1060
+ RefCountedPtr<SubchannelInterface> XdsOverrideHostLb::Helper::CreateSubchannel(
1061
+ const grpc_resolved_address& address, const ChannelArgs& per_address_args,
1062
+ const ChannelArgs& args) {
1063
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
1064
+ auto key = grpc_sockaddr_to_string(&address, /*normalize=*/false);
1065
+ gpr_log(GPR_INFO,
1066
+ "[xds_override_host_lb %p] creating subchannel for %s, "
1067
+ "per_address_args=%s, args=%s",
1068
+ this, key.value_or("<unknown>").c_str(),
1069
+ per_address_args.ToString().c_str(), args.ToString().c_str());
1070
+ }
1071
+ auto subchannel = parent()->channel_control_helper()->CreateSubchannel(
1072
+ address, per_address_args, args);
1073
+ return parent()->AdoptSubchannel(address, std::move(subchannel));
1074
+ }
1075
+
1076
+ void XdsOverrideHostLb::Helper::UpdateState(
1077
+ grpc_connectivity_state state, const absl::Status& status,
1078
+ RefCountedPtr<SubchannelPicker> picker) {
1079
+ if (parent()->shutting_down_) return;
1080
+ // Save the state and picker.
1081
+ parent()->state_ = state;
1082
+ parent()->status_ = status;
1083
+ parent()->picker_ = std::move(picker);
1084
+ // Wrap the picker and return it to the channel.
1085
+ parent()->MaybeUpdatePickerLocked();
1086
+ }
1087
+
1088
+ //
1089
+ // XdsOverrideHostLb::SubchannelWrapper
1090
+ //
1091
+
1092
+ XdsOverrideHostLb::SubchannelWrapper::SubchannelWrapper(
1093
+ RefCountedPtr<SubchannelInterface> subchannel,
1094
+ RefCountedPtr<XdsOverrideHostLb> policy)
1095
+ : DelegatingSubchannel(std::move(subchannel)), policy_(std::move(policy)) {
1096
+ auto watcher = std::make_unique<ConnectivityStateWatcher>(
1097
+ WeakRefAsSubclass<SubchannelWrapper>());
1098
+ watcher_ = watcher.get();
1099
+ wrapped_subchannel()->WatchConnectivityState(std::move(watcher));
1100
+ }
1101
+
1102
+ void XdsOverrideHostLb::SubchannelWrapper::WatchConnectivityState(
1103
+ std::unique_ptr<ConnectivityStateWatcherInterface> watcher) {
1104
+ watchers_.insert(std::move(watcher));
1105
+ }
1106
+
1107
+ void XdsOverrideHostLb::SubchannelWrapper::CancelConnectivityStateWatch(
1108
+ ConnectivityStateWatcherInterface* watcher) {
1109
+ auto it = watchers_.find(watcher);
1110
+ if (it != watchers_.end()) {
1111
+ watchers_.erase(it);
1112
+ }
1113
+ }
1114
+
1115
+ void XdsOverrideHostLb::SubchannelWrapper::Orphan() {
1116
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
1117
+ gpr_log(GPR_INFO,
1118
+ "[xds_override_host_lb %p] subchannel wrapper %p orphaned",
1119
+ policy_.get(), this);
1120
+ }
1121
+ if (!IsWorkSerializerDispatchEnabled()) {
1122
+ wrapped_subchannel()->CancelConnectivityStateWatch(watcher_);
1123
+ if (subchannel_entry_ != nullptr) {
1124
+ MutexLock lock(&policy()->mu_);
1125
+ subchannel_entry_->OnSubchannelWrapperOrphan(
1126
+ this, policy()->connection_idle_timeout_);
1127
+ }
1128
+ return;
1129
+ }
1130
+ policy()->work_serializer()->Run(
1131
+ [self = WeakRefAsSubclass<SubchannelWrapper>()]() {
1132
+ self->wrapped_subchannel()->CancelConnectivityStateWatch(
1133
+ self->watcher_);
1134
+ if (self->subchannel_entry_ != nullptr) {
1135
+ MutexLock lock(&self->policy()->mu_);
1136
+ self->subchannel_entry_->OnSubchannelWrapperOrphan(
1137
+ self.get(), self->policy()->connection_idle_timeout_);
1138
+ }
1139
+ },
1140
+ DEBUG_LOCATION);
1141
+ }
1142
+
1143
+ void XdsOverrideHostLb::SubchannelWrapper::UpdateConnectivityState(
1144
+ grpc_connectivity_state state, absl::Status status) {
1145
+ bool update_picker = false;
1146
+ if (subchannel_entry_ != nullptr) {
1147
+ MutexLock lock(&policy()->mu_);
1148
+ if (subchannel_entry_->connectivity_state() != state) {
1149
+ subchannel_entry_->set_connectivity_state(state);
1150
+ update_picker = subchannel_entry_->HasOwnedSubchannel() &&
1151
+ subchannel_entry_->GetSubchannel() == this;
1152
+ }
1153
+ }
1154
+ // Sending connectivity state notifications to the watchers may cause the set
1155
+ // of watchers to change, so we can't be iterating over the set of watchers
1156
+ // while we send the notifications
1157
+ std::vector<ConnectivityStateWatcherInterface*> watchers;
1158
+ watchers.reserve(watchers_.size());
1159
+ for (const auto& watcher : watchers_) {
1160
+ watchers.push_back(watcher.get());
1161
+ }
1162
+ for (const auto& watcher : watchers) {
1163
+ if (watchers_.find(watcher) != watchers_.end()) {
1164
+ watcher->OnConnectivityStateChange(state, status);
1165
+ }
1166
+ }
1167
+ if (update_picker) policy()->MaybeUpdatePickerLocked();
1168
+ }
1169
+
1170
+ //
1171
+ // XdsOverrideHostLb::SubchannelEntry
1172
+ //
1173
+
1174
+ RefCountedPtr<XdsOverrideHostLb::SubchannelWrapper>
1175
+ XdsOverrideHostLb::SubchannelEntry::SetUnownedSubchannel(
1176
+ SubchannelWrapper* subchannel)
1177
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
1178
+ auto owned_subchannel = TakeOwnedSubchannel();
1179
+ subchannel_ = subchannel;
1180
+ return owned_subchannel;
1181
+ }
1182
+
1183
+ XdsOverrideHostLb::SubchannelWrapper*
1184
+ XdsOverrideHostLb::SubchannelEntry::GetSubchannel() const
1185
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
1186
+ return Match(
1187
+ subchannel_, [](SubchannelWrapper* subchannel) { return subchannel; },
1188
+ [](const RefCountedPtr<SubchannelWrapper>& subchannel) {
1189
+ return subchannel.get();
1190
+ });
1191
+ }
1192
+
1193
+ RefCountedPtr<XdsOverrideHostLb::SubchannelWrapper>
1194
+ XdsOverrideHostLb::SubchannelEntry::GetSubchannelRef() const
1195
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
1196
+ auto* sc = GetSubchannel();
1197
+ if (sc == nullptr) return nullptr;
1198
+ return sc->RefIfNonZero().TakeAsSubclass<SubchannelWrapper>();
1199
+ }
1200
+
1201
+ RefCountedPtr<XdsOverrideHostLb::SubchannelWrapper>
1202
+ XdsOverrideHostLb::SubchannelEntry::TakeOwnedSubchannel()
1203
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
1204
+ return MatchMutable(
1205
+ &subchannel_,
1206
+ [](SubchannelWrapper**) -> RefCountedPtr<SubchannelWrapper> {
1207
+ return nullptr;
1208
+ },
1209
+ [](RefCountedPtr<SubchannelWrapper>* subchannel) {
1210
+ return std::move(*subchannel);
1211
+ });
1212
+ }
1213
+
1214
+ void XdsOverrideHostLb::SubchannelEntry::UnsetSubchannel(
1215
+ std::vector<RefCountedPtr<SubchannelWrapper>>* owned_subchannels)
1216
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
1217
+ auto subchannel = TakeOwnedSubchannel();
1218
+ if (subchannel != nullptr) {
1219
+ owned_subchannels->push_back(std::move(subchannel));
1220
+ }
1221
+ subchannel_ = nullptr;
1222
+ }
1223
+
1224
+ void XdsOverrideHostLb::SubchannelEntry::OnSubchannelWrapperOrphan(
1225
+ SubchannelWrapper* wrapper, Duration connection_idle_timeout)
1226
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsOverrideHostLb::mu_) {
1227
+ auto* subchannel = GetSubchannel();
1228
+ if (subchannel != wrapper) return;
1229
+ if (last_used_time_ < (Timestamp::Now() - connection_idle_timeout)) {
1230
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
1231
+ gpr_log(GPR_INFO,
1232
+ "[xds_override_host_lb] removing unowned subchannel wrapper %p",
1233
+ subchannel);
1234
+ }
1235
+ subchannel_ = nullptr;
1236
+ } else {
1237
+ // The subchannel is being released by the child policy, but it
1238
+ // is still within its idle timeout, so we make a new copy of
1239
+ // the wrapper with the same underlying subchannel, and we hold
1240
+ // our own ref to it.
1241
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) {
1242
+ gpr_log(GPR_INFO,
1243
+ "[xds_override_host_lb] subchannel wrapper %p: cloning "
1244
+ "to gain ownership",
1245
+ subchannel);
1246
+ }
1247
+ subchannel_ = wrapper->Clone();
1248
+ }
1249
+ }
1250
+
1251
+ //
1252
+ // factory
1253
+ //
1254
+
1255
+ class XdsOverrideHostLbFactory : public LoadBalancingPolicyFactory {
1256
+ public:
1257
+ OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
1258
+ LoadBalancingPolicy::Args args) const override {
1259
+ return MakeOrphanable<XdsOverrideHostLb>(std::move(args));
1260
+ }
1261
+
1262
+ absl::string_view name() const override {
1263
+ return XdsOverrideHostLbConfig::Name();
1264
+ }
1265
+
1266
+ absl::StatusOr<RefCountedPtr<LoadBalancingPolicy::Config>>
1267
+ ParseLoadBalancingConfig(const Json& json) const override {
1268
+ return LoadFromJson<RefCountedPtr<XdsOverrideHostLbConfig>>(
1269
+ json, JsonArgs(),
1270
+ "errors validating xds_override_host LB policy config");
1271
+ }
1272
+ };
1273
+
1274
+ } // namespace
1275
+
1276
+ void RegisterXdsOverrideHostLbPolicy(CoreConfiguration::Builder* builder) {
1277
+ builder->lb_policy_registry()->RegisterLoadBalancingPolicyFactory(
1278
+ std::make_unique<XdsOverrideHostLbFactory>());
1279
+ }
1280
+
1281
+ //
1282
+ // XdsOverrideHostLbConfig
1283
+ //
1284
+
1285
+ const JsonLoaderInterface* XdsOverrideHostLbConfig::JsonLoader(
1286
+ const JsonArgs&) {
1287
+ static const auto kJsonLoader =
1288
+ JsonObjectLoader<XdsOverrideHostLbConfig>()
1289
+ // Child policy config is parsed in JsonPostLoad
1290
+ .Field("clusterName", &XdsOverrideHostLbConfig::cluster_name_)
1291
+ .Finish();
1292
+ return kJsonLoader;
1293
+ }
1294
+
1295
+ void XdsOverrideHostLbConfig::JsonPostLoad(const Json& json, const JsonArgs&,
1296
+ ValidationErrors* errors) {
1297
+ ValidationErrors::ScopedField field(errors, ".childPolicy");
1298
+ auto it = json.object().find("childPolicy");
1299
+ if (it == json.object().end()) {
1300
+ errors->AddError("field not present");
1301
+ } else {
1302
+ auto child_policy_config =
1303
+ CoreConfiguration::Get().lb_policy_registry().ParseLoadBalancingConfig(
1304
+ it->second);
1305
+ if (!child_policy_config.ok()) {
1306
+ errors->AddError(child_policy_config.status().message());
1307
+ } else {
1308
+ child_config_ = std::move(*child_policy_config);
1309
+ }
1310
+ }
1311
+ }
1312
+
1313
+ } // namespace grpc_core