grpc 1.42.0 → 1.43.1

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

Potentially problematic release.


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

Files changed (739) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +85 -34
  3. data/include/grpc/event_engine/event_engine.h +37 -13
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -31
  5. data/include/grpc/event_engine/memory_allocator.h +27 -11
  6. data/include/grpc/event_engine/memory_request.h +57 -0
  7. data/include/grpc/grpc_security.h +276 -145
  8. data/include/grpc/grpc_security_constants.h +1 -14
  9. data/include/grpc/impl/codegen/port_platform.h +7 -3
  10. data/src/core/ext/filters/client_channel/backend_metric.cc +6 -7
  11. data/src/core/ext/filters/client_channel/backend_metric.h +3 -2
  12. data/src/core/ext/filters/client_channel/client_channel.cc +81 -40
  13. data/src/core/ext/filters/client_channel/client_channel.h +5 -4
  14. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -2
  15. data/src/core/ext/filters/client_channel/dynamic_filters.cc +4 -4
  16. data/src/core/ext/filters/client_channel/health/health_check_client.h +1 -1
  17. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +12 -14
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1 -2
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -2
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -2
  21. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +27 -80
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +82 -34
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +47 -91
  25. data/src/core/ext/filters/client_channel/lb_policy.h +75 -59
  26. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +3 -3
  27. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +2 -2
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +8 -12
  29. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +3 -3
  30. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +6 -12
  31. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +222 -294
  32. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -7
  33. data/src/core/ext/filters/client_channel/resolver_registry.h +1 -2
  34. data/src/core/ext/filters/client_channel/subchannel.cc +4 -4
  35. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  36. data/src/core/ext/filters/http/client/http_client_filter.cc +14 -30
  37. data/src/core/ext/filters/http/http_filters_plugin.cc +3 -5
  38. data/src/core/ext/filters/http/server/http_server_filter.cc +11 -28
  39. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +67 -0
  40. data/src/core/ext/filters/server_config_selector/server_config_selector.h +70 -0
  41. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +265 -0
  42. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +32 -0
  43. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -20
  44. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -2
  45. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +8 -5
  46. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +11 -14
  47. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +6 -3
  48. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +54 -79
  49. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -3
  50. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +9 -13
  51. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +6 -6
  52. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +53 -62
  53. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -2
  54. data/src/core/ext/transport/chttp2/transport/context_list.cc +2 -3
  55. data/src/core/ext/transport/chttp2/transport/context_list.h +2 -3
  56. data/src/core/ext/transport/chttp2/transport/flow_control.cc +8 -8
  57. data/src/core/ext/transport/chttp2/transport/flow_control.h +2 -2
  58. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +83 -19
  59. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +33 -1
  60. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +66 -92
  61. data/src/core/ext/transport/chttp2/transport/internal.h +8 -4
  62. data/src/core/ext/transport/inproc/inproc_transport.cc +16 -7
  63. data/src/core/ext/transport/inproc/inproc_transport.h +1 -1
  64. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +197 -165
  65. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +2 -0
  66. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +41 -0
  67. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +18 -0
  68. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +26 -2
  69. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  70. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +107 -82
  71. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +2 -0
  72. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +188 -160
  73. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +2 -0
  74. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +35 -22
  75. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +2 -0
  76. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +253 -218
  77. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +2 -0
  78. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +16 -5
  79. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +2 -0
  80. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +36 -25
  81. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +2 -0
  82. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +56 -39
  83. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +2 -0
  84. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +16 -5
  85. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +2 -0
  86. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +162 -128
  87. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +2 -0
  88. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +51 -36
  89. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +2 -0
  90. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +15 -4
  91. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +2 -0
  92. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +25 -13
  93. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +2 -0
  94. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +114 -90
  95. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +2 -0
  96. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +89 -71
  97. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +2 -0
  98. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +17 -6
  99. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +2 -0
  100. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +117 -93
  101. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +2 -0
  102. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +13 -2
  103. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +2 -0
  104. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +21 -9
  105. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +2 -0
  106. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +18 -7
  107. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +2 -0
  108. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +22 -11
  109. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +2 -0
  110. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +17 -6
  111. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +2 -0
  112. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +41 -27
  113. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +2 -0
  114. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +59 -43
  115. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +2 -0
  116. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +58 -43
  117. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +2 -0
  118. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +15 -4
  119. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +2 -0
  120. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +73 -57
  121. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +2 -0
  122. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +81 -64
  123. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +2 -0
  124. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +25 -14
  125. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +2 -0
  126. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +19 -7
  127. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +2 -0
  128. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +63 -45
  129. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +2 -0
  130. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +66 -47
  131. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +2 -0
  132. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +93 -75
  133. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +2 -0
  134. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +41 -28
  135. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +2 -0
  136. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +503 -440
  137. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2 -0
  138. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +26 -13
  139. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +2 -0
  140. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +21 -9
  141. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +2 -0
  142. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +13 -2
  143. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +2 -0
  144. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +35 -20
  145. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +2 -0
  146. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +44 -31
  147. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +2 -0
  148. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +22 -11
  149. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +2 -0
  150. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +210 -181
  151. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +2 -0
  152. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +7 -0
  153. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +5 -3
  154. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +64 -48
  155. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +2 -0
  156. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +33 -20
  157. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +2 -0
  158. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +81 -65
  159. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +2 -0
  160. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +12 -1
  161. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +2 -0
  162. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +12 -1
  163. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +2 -0
  164. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +75 -58
  165. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +2 -0
  166. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +12 -1
  167. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +2 -0
  168. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +12 -1
  169. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +2 -0
  170. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +25 -13
  171. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +2 -0
  172. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +12 -1
  173. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +2 -0
  174. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +12 -1
  175. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +2 -0
  176. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +61 -46
  177. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +2 -0
  178. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +26 -12
  179. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +2 -0
  180. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +22 -10
  181. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +2 -0
  182. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +17 -6
  183. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +2 -0
  184. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +16 -5
  185. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +2 -0
  186. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +15 -4
  187. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +2 -0
  188. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +27 -14
  189. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +2 -0
  190. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +25 -13
  191. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +2 -0
  192. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +20 -8
  193. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +2 -0
  194. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +30 -17
  195. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +2 -0
  196. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +38 -21
  197. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +2 -0
  198. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +41 -26
  199. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +2 -0
  200. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +7 -0
  201. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +2 -0
  202. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +17 -5
  203. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +2 -0
  204. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +22 -9
  205. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +2 -0
  206. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +15 -4
  207. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +2 -0
  208. data/src/core/ext/upb-generated/google/api/annotations.upb.c +20 -0
  209. data/src/core/ext/upb-generated/google/api/annotations.upb.h +7 -0
  210. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +116 -93
  211. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +2 -0
  212. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.c +102 -0
  213. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.h +306 -0
  214. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.c +56 -0
  215. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.h +135 -0
  216. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +122 -98
  217. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +2 -0
  218. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.c +115 -0
  219. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.h +371 -0
  220. data/src/core/ext/upb-generated/google/api/http.upb.c +35 -22
  221. data/src/core/ext/upb-generated/google/api/http.upb.h +2 -0
  222. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +14 -3
  223. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +2 -0
  224. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +247 -210
  225. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +2 -0
  226. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +14 -3
  227. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +2 -0
  228. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +12 -1
  229. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +2 -0
  230. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +37 -23
  231. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +2 -0
  232. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +14 -3
  233. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +2 -0
  234. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +37 -18
  235. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +2 -0
  236. data/src/core/ext/upb-generated/google/rpc/status.upb.c +17 -6
  237. data/src/core/ext/upb-generated/google/rpc/status.upb.h +2 -0
  238. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +26 -14
  239. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +2 -0
  240. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +105 -83
  241. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +2 -0
  242. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +20 -8
  243. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +2 -0
  244. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +16 -4
  245. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +2 -0
  246. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +65 -47
  247. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +34 -36
  248. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +26 -13
  249. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +2 -0
  250. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +67 -7
  251. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +27 -0
  252. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +27 -3
  253. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -0
  254. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +19 -0
  255. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +7 -0
  256. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +27 -3
  257. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -0
  258. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +26 -2
  259. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  260. data/src/core/ext/upb-generated/validate/validate.upb.c +320 -251
  261. data/src/core/ext/upb-generated/validate/validate.upb.h +20 -0
  262. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +54 -9
  263. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +17 -0
  264. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +13 -2
  265. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +2 -0
  266. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +24 -12
  267. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +2 -0
  268. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +19 -7
  269. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +2 -0
  270. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +18 -7
  271. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +2 -0
  272. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +27 -15
  273. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +2 -0
  274. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +18 -7
  275. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +2 -0
  276. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +28 -15
  277. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +2 -0
  278. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +16 -5
  279. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +2 -0
  280. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +2 -49
  281. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +2 -2
  282. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +2 -7
  283. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +2 -35
  284. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +2 -41
  285. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +2 -11
  286. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +2 -55
  287. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +2 -7
  288. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +2 -7
  289. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +2 -19
  290. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +2 -7
  291. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +2 -53
  292. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +2 -15
  293. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +2 -7
  294. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +2 -9
  295. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +2 -33
  296. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +2 -21
  297. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +2 -7
  298. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +2 -33
  299. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +2 -7
  300. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +2 -9
  301. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +2 -7
  302. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +2 -7
  303. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +2 -7
  304. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +2 -13
  305. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +2 -17
  306. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +2 -15
  307. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +2 -7
  308. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +2 -17
  309. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +2 -19
  310. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +2 -7
  311. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +2 -9
  312. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +2 -21
  313. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +2 -23
  314. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +2 -11
  315. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +2 -111
  316. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +2 -11
  317. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +2 -9
  318. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +2 -7
  319. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +2 -15
  320. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +2 -11
  321. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +2 -7
  322. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +2 -43
  323. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +2 -2
  324. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +2 -17
  325. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +2 -11
  326. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +2 -17
  327. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +2 -7
  328. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +2 -7
  329. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +2 -19
  330. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +2 -7
  331. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +2 -7
  332. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +2 -9
  333. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +2 -7
  334. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +2 -7
  335. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +2 -15
  336. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +2 -13
  337. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +2 -9
  338. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +2 -7
  339. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +2 -7
  340. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +2 -7
  341. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +2 -11
  342. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +2 -9
  343. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +2 -9
  344. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +2 -11
  345. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +2 -19
  346. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +2 -15
  347. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +2 -2
  348. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +2 -9
  349. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +2 -11
  350. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +2 -7
  351. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +2 -2
  352. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +2 -11
  353. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +2 -7
  354. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +2 -59
  355. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +2 -7
  356. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +2 -7
  357. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +2 -13
  358. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +2 -7
  359. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +2 -23
  360. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +2 -7
  361. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +2 -11
  362. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +2 -7
  363. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +2 -2
  364. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +2 -7
  365. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +2 -7
  366. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +2 -51
  367. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +2 -13
  368. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +2 -7
  369. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +2 -9
  370. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +2 -9
  371. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +2 -7
  372. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +2 -9
  373. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +2 -7
  374. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +2 -7
  375. data/src/core/ext/xds/certificate_provider_registry.cc +1 -1
  376. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  377. data/src/core/ext/xds/xds_api.cc +409 -304
  378. data/src/core/ext/xds/xds_api.h +3 -1
  379. data/src/core/ext/xds/xds_bootstrap.cc +6 -3
  380. data/src/core/ext/xds/xds_certificate_provider.h +1 -2
  381. data/src/core/ext/xds/xds_channel_stack_modifier.cc +3 -4
  382. data/src/core/ext/xds/xds_client.cc +395 -291
  383. data/src/core/ext/xds/xds_client.h +47 -38
  384. data/src/core/ext/xds/xds_routing.cc +247 -0
  385. data/src/core/ext/xds/xds_routing.h +98 -0
  386. data/src/core/ext/xds/xds_server_config_fetcher.cc +975 -261
  387. data/src/core/lib/avl/avl.h +389 -88
  388. data/src/core/lib/backoff/backoff.cc +2 -2
  389. data/src/core/lib/channel/channel_args.cc +17 -17
  390. data/src/core/lib/channel/channel_args.h +11 -10
  391. data/src/core/lib/channel/channel_args_preconditioning.cc +47 -0
  392. data/src/core/lib/channel/channel_args_preconditioning.h +62 -0
  393. data/src/core/lib/channel/channel_stack_builder.cc +0 -2
  394. data/src/core/lib/channel/channel_trace.cc +6 -6
  395. data/src/core/lib/channel/channelz.cc +1 -1
  396. data/src/core/lib/compression/compression_args.cc +7 -5
  397. data/src/core/lib/compression/compression_args.h +6 -4
  398. data/src/core/lib/config/core_configuration.cc +3 -1
  399. data/src/core/lib/config/core_configuration.h +11 -0
  400. data/src/core/lib/debug/trace.h +2 -2
  401. data/src/core/lib/event_engine/{endpoint_config.cc → channel_args_endpoint_config.cc} +2 -1
  402. data/src/core/lib/event_engine/{endpoint_config_internal.h → channel_args_endpoint_config.h} +3 -3
  403. data/src/core/lib/event_engine/event_engine.cc +0 -13
  404. data/src/core/lib/event_engine/event_engine_factory.cc +49 -0
  405. data/src/core/lib/event_engine/event_engine_factory.h +33 -0
  406. data/src/core/lib/event_engine/memory_allocator.cc +70 -0
  407. data/src/core/lib/gpr/tls.h +6 -0
  408. data/src/core/lib/gprpp/cpp_impl_of.h +45 -0
  409. data/src/core/lib/gprpp/global_config_env.cc +7 -7
  410. data/src/core/lib/gprpp/global_config_env.h +2 -2
  411. data/src/core/lib/gprpp/manual_constructor.h +2 -3
  412. data/src/core/lib/gprpp/orphanable.h +1 -1
  413. data/src/core/lib/gprpp/ref_counted.h +1 -1
  414. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -4
  415. data/src/core/lib/gprpp/status_helper.h +1 -1
  416. data/src/core/lib/gprpp/table.h +13 -1
  417. data/src/core/lib/http/httpcli.cc +30 -26
  418. data/src/core/lib/http/httpcli.h +14 -12
  419. data/src/core/lib/iomgr/buffer_list.cc +9 -9
  420. data/src/core/lib/iomgr/buffer_list.h +13 -13
  421. data/src/core/lib/iomgr/call_combiner.cc +2 -3
  422. data/src/core/lib/iomgr/endpoint.h +0 -1
  423. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -24
  424. data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
  425. data/src/core/lib/iomgr/endpoint_pair_posix.cc +9 -11
  426. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -14
  427. data/src/core/lib/iomgr/event_engine/endpoint.cc +2 -3
  428. data/src/core/lib/iomgr/event_engine/iomgr.cc +5 -25
  429. data/src/core/lib/iomgr/event_engine/resolver.cc +3 -2
  430. data/src/core/lib/iomgr/event_engine/tcp.cc +7 -5
  431. data/src/core/lib/iomgr/event_engine/timer.cc +4 -3
  432. data/src/core/lib/iomgr/exec_ctx.h +11 -11
  433. data/src/core/lib/iomgr/executor.cc +12 -15
  434. data/src/core/lib/iomgr/executor.h +1 -1
  435. data/src/core/lib/iomgr/tcp_client.cc +2 -4
  436. data/src/core/lib/iomgr/tcp_client.h +1 -3
  437. data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -9
  438. data/src/core/lib/iomgr/tcp_client_custom.cc +4 -10
  439. data/src/core/lib/iomgr/tcp_client_posix.cc +7 -23
  440. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  441. data/src/core/lib/iomgr/tcp_client_windows.cc +1 -10
  442. data/src/core/lib/iomgr/tcp_custom.cc +9 -36
  443. data/src/core/lib/iomgr/tcp_custom.h +0 -1
  444. data/src/core/lib/iomgr/tcp_posix.cc +28 -33
  445. data/src/core/lib/iomgr/tcp_posix.h +1 -3
  446. data/src/core/lib/iomgr/tcp_server.cc +4 -6
  447. data/src/core/lib/iomgr/tcp_server.h +6 -8
  448. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -15
  449. data/src/core/lib/iomgr/tcp_server_posix.cc +18 -22
  450. data/src/core/lib/iomgr/tcp_server_utils_posix.h +19 -18
  451. data/src/core/lib/iomgr/tcp_server_windows.cc +5 -12
  452. data/src/core/lib/iomgr/tcp_windows.cc +2 -7
  453. data/src/core/lib/iomgr/tcp_windows.h +1 -2
  454. data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
  455. data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
  456. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +1 -1
  457. data/src/core/lib/iomgr/work_serializer.cc +115 -44
  458. data/src/core/lib/iomgr/work_serializer.h +16 -4
  459. data/src/core/lib/json/json_reader.cc +83 -35
  460. data/src/core/lib/json/json_util.cc +1 -1
  461. data/src/core/lib/promise/activity.cc +115 -0
  462. data/src/core/lib/promise/activity.h +499 -0
  463. data/src/core/lib/promise/context.h +86 -0
  464. data/src/core/lib/promise/detail/basic_seq.h +407 -0
  465. data/src/core/lib/promise/detail/promise_factory.h +189 -0
  466. data/src/core/lib/promise/detail/promise_like.h +85 -0
  467. data/src/core/lib/promise/detail/status.h +44 -0
  468. data/src/core/lib/promise/detail/switch.h +1455 -0
  469. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +48 -0
  470. data/src/core/lib/promise/loop.h +108 -0
  471. data/src/core/lib/promise/map.h +88 -0
  472. data/src/core/lib/promise/poll.h +60 -0
  473. data/src/core/lib/promise/race.h +84 -0
  474. data/src/core/lib/promise/seq.h +71 -0
  475. data/src/core/lib/resource_quota/api.cc +108 -0
  476. data/src/core/lib/resource_quota/api.h +41 -0
  477. data/src/core/lib/resource_quota/memory_quota.cc +454 -0
  478. data/src/core/lib/resource_quota/memory_quota.h +421 -0
  479. data/src/core/lib/resource_quota/resource_quota.cc +33 -0
  480. data/src/core/lib/resource_quota/resource_quota.h +58 -0
  481. data/src/core/lib/resource_quota/thread_quota.cc +43 -0
  482. data/src/core/lib/resource_quota/thread_quota.h +57 -0
  483. data/src/core/lib/resource_quota/trace.cc +19 -0
  484. data/src/core/lib/resource_quota/trace.h +24 -0
  485. data/src/core/lib/security/authorization/evaluate_args.cc +13 -19
  486. data/src/core/lib/security/authorization/evaluate_args.h +2 -1
  487. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +3 -1
  488. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +11 -12
  489. data/src/core/lib/security/credentials/external/external_account_credentials.cc +9 -10
  490. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +3 -4
  491. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +4 -6
  492. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
  493. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +4 -6
  494. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +18 -22
  495. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +11 -12
  496. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +7 -8
  497. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +201 -0
  498. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +106 -0
  499. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +11 -90
  500. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +19 -82
  501. data/src/core/lib/security/credentials/tls/tls_credentials.cc +21 -10
  502. data/src/core/lib/security/credentials/xds/xds_credentials.cc +28 -33
  503. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +3 -3
  504. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +2 -2
  505. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +3 -4
  506. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  507. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +7 -7
  508. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -2
  509. data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -1
  510. data/src/core/lib/security/security_connector/ssl_utils.cc +10 -2
  511. data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
  512. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +344 -195
  513. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +64 -41
  514. data/src/core/lib/security/transport/security_handshaker.cc +2 -2
  515. data/src/core/lib/slice/percent_encoding.cc +30 -86
  516. data/src/core/lib/slice/percent_encoding.h +5 -11
  517. data/src/core/lib/slice/slice.cc +7 -7
  518. data/src/core/lib/slice/slice.h +341 -0
  519. data/src/core/lib/slice/slice_buffer.cc +4 -0
  520. data/src/core/lib/slice/slice_intern.cc +1 -1
  521. data/src/core/lib/slice/slice_refcount.h +5 -1
  522. data/src/core/lib/slice/slice_refcount_base.h +19 -11
  523. data/src/core/lib/slice/static_slice.cc +331 -483
  524. data/src/core/lib/slice/static_slice.h +101 -132
  525. data/src/core/lib/surface/builtins.cc +1 -1
  526. data/src/core/lib/surface/call.cc +85 -59
  527. data/src/core/lib/surface/channel.cc +4 -29
  528. data/src/core/lib/surface/channel.h +2 -12
  529. data/src/core/lib/surface/completion_queue.cc +2 -2
  530. data/src/core/lib/surface/init.cc +0 -1
  531. data/src/core/lib/surface/lame_client.cc +24 -17
  532. data/src/core/lib/surface/server.cc +22 -22
  533. data/src/core/lib/surface/server.h +8 -9
  534. data/src/core/lib/surface/validate_metadata.cc +2 -2
  535. data/src/core/lib/surface/version.cc +2 -2
  536. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  537. data/src/core/lib/transport/byte_stream.cc +4 -0
  538. data/src/core/lib/transport/metadata.h +4 -4
  539. data/src/core/lib/transport/metadata_batch.cc +5 -0
  540. data/src/core/lib/transport/metadata_batch.h +174 -99
  541. data/src/core/lib/transport/parsed_metadata.cc +35 -0
  542. data/src/core/lib/transport/parsed_metadata.h +180 -61
  543. data/src/core/lib/transport/pid_controller.cc +4 -4
  544. data/src/core/lib/transport/static_metadata.cc +529 -614
  545. data/src/core/lib/transport/static_metadata.h +0 -18
  546. data/src/core/lib/transport/transport.cc +4 -26
  547. data/src/core/lib/transport/transport.h +0 -1
  548. data/src/core/lib/transport/transport_op_string.cc +1 -1
  549. data/src/core/lib/uri/uri_parser.cc +19 -19
  550. data/src/core/lib/uri/uri_parser.h +2 -0
  551. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -2
  552. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  553. data/src/core/tsi/local_transport_security.cc +15 -15
  554. data/src/core/tsi/ssl_transport_security.cc +30 -1
  555. data/src/core/tsi/ssl_transport_security.h +1 -0
  556. data/src/ruby/ext/grpc/extconf.rb +1 -1
  557. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +6 -10
  558. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +9 -15
  559. data/src/ruby/lib/grpc/version.rb +1 -1
  560. data/third_party/abseil-cpp/absl/algorithm/container.h +101 -91
  561. data/third_party/abseil-cpp/absl/base/attributes.h +64 -31
  562. data/third_party/abseil-cpp/absl/base/config.h +67 -37
  563. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
  564. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -1
  565. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
  566. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +69 -0
  567. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -4
  568. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +16 -0
  569. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +4 -4
  570. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  571. data/third_party/abseil-cpp/absl/container/fixed_array.h +0 -5
  572. data/third_party/abseil-cpp/absl/container/inlined_vector.h +105 -97
  573. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
  574. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +18 -102
  575. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +37 -78
  576. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +388 -423
  577. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
  578. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -8
  579. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +251 -120
  580. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
  581. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +12 -11
  582. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +6 -2
  583. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +12 -5
  584. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
  585. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +234 -0
  586. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -7
  587. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
  588. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +21 -3
  589. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
  590. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +2 -0
  591. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +14 -0
  592. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
  593. data/third_party/abseil-cpp/absl/functional/function_ref.h +4 -1
  594. data/third_party/abseil-cpp/absl/hash/hash.h +22 -0
  595. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
  596. data/third_party/abseil-cpp/absl/hash/internal/hash.h +88 -37
  597. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.cc → low_level_hash.cc} +23 -11
  598. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.h → low_level_hash.h} +14 -12
  599. data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
  600. data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
  601. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -10
  602. data/third_party/abseil-cpp/absl/numeric/int128.h +146 -73
  603. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
  604. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
  605. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.cc +4 -4
  606. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.h +6 -6
  607. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +230 -0
  608. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +5 -5
  609. data/third_party/abseil-cpp/absl/status/status.cc +9 -17
  610. data/third_party/abseil-cpp/absl/status/status.h +19 -15
  611. data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
  612. data/third_party/abseil-cpp/absl/status/statusor.h +31 -21
  613. data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
  614. data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
  615. data/third_party/abseil-cpp/absl/strings/cord.cc +453 -359
  616. data/third_party/abseil-cpp/absl/strings/cord.h +197 -70
  617. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
  618. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +6 -0
  619. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +140 -63
  620. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1128 -0
  621. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +939 -0
  622. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +185 -0
  623. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +265 -0
  624. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +68 -0
  625. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +211 -0
  626. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +129 -0
  627. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
  628. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +7 -7
  629. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +55 -181
  630. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
  631. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
  632. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
  633. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
  634. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
  635. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
  636. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +445 -0
  637. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
  638. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +87 -0
  639. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
  640. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +121 -0
  641. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
  642. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -0
  643. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
  644. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +1 -1
  645. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
  646. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +36 -18
  647. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
  648. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +24 -16
  649. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
  650. data/third_party/abseil-cpp/absl/strings/numbers.cc +1 -1
  651. data/third_party/abseil-cpp/absl/strings/numbers.h +34 -0
  652. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  653. data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
  654. data/third_party/abseil-cpp/absl/strings/string_view.cc +16 -21
  655. data/third_party/abseil-cpp/absl/strings/string_view.h +120 -39
  656. data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
  657. data/third_party/abseil-cpp/absl/strings/substitute.h +99 -74
  658. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
  659. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
  660. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -1
  661. data/third_party/abseil-cpp/absl/synchronization/mutex.h +3 -3
  662. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
  663. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
  664. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  665. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
  666. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
  667. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
  668. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
  669. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
  670. data/third_party/abseil-cpp/absl/time/time.h +67 -36
  671. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
  672. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
  673. data/third_party/abseil-cpp/absl/types/span.h +3 -3
  674. data/third_party/boringssl-with-bazel/err_data.c +681 -677
  675. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +19 -11
  676. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +41 -30
  677. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
  678. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
  679. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
  680. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
  681. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +28 -0
  682. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +48 -272
  683. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
  684. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
  685. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
  686. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -7
  687. data/third_party/boringssl-with-bazel/src/crypto/mem.c +18 -0
  688. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
  689. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -23
  690. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
  691. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +8 -2
  692. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +216 -11
  693. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -1
  694. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  695. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
  696. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -1
  697. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
  698. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +1 -1
  699. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +1 -0
  700. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +0 -1
  701. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +21 -4
  702. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +971 -253
  703. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +3 -3
  704. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +0 -1
  705. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
  706. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +17 -41
  707. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
  708. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
  709. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +29 -55
  710. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +3 -9
  711. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
  712. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +24 -28
  713. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +6 -9
  714. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +12 -43
  715. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +4 -3
  716. data/third_party/boringssl-with-bazel/src/ssl/internal.h +3 -3
  717. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
  718. data/third_party/upb/upb/decode.c +309 -178
  719. data/third_party/upb/upb/decode_fast.c +1 -1
  720. data/third_party/upb/upb/decode_internal.h +1 -0
  721. data/third_party/upb/upb/def.c +330 -85
  722. data/third_party/upb/upb/def.h +45 -14
  723. data/third_party/upb/upb/def.hpp +17 -4
  724. data/third_party/upb/upb/encode.c +100 -40
  725. data/third_party/upb/upb/msg.c +22 -9
  726. data/third_party/upb/upb/msg_internal.h +90 -8
  727. data/third_party/upb/upb/reflection.c +98 -58
  728. data/third_party/upb/upb/reflection.h +6 -2
  729. data/third_party/upb/upb/text_encode.c +3 -3
  730. data/third_party/upb/upb/upb.c +8 -0
  731. metadata +116 -56
  732. data/src/core/lib/avl/avl.cc +0 -306
  733. data/src/core/lib/gprpp/match.h +0 -73
  734. data/src/core/lib/gprpp/overload.h +0 -59
  735. data/src/core/lib/iomgr/event_engine/iomgr.h +0 -42
  736. data/src/core/lib/iomgr/resource_quota.cc +0 -1106
  737. data/src/core/lib/iomgr/resource_quota.h +0 -226
  738. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
  739. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
@@ -78,6 +78,43 @@ char* g_fallback_bootstrap_config ABSL_GUARDED_BY(*g_mu) = nullptr;
78
78
 
79
79
  } // namespace
80
80
 
81
+ class XdsClient::Notifier {
82
+ public:
83
+ // Helper template function to invoke `OnError()` on a list of watchers \a
84
+ // watchers_list within \a work_serializer. Works with all 4 resource types.
85
+ template <class T>
86
+ static void ScheduleNotifyWatchersOnErrorInWorkSerializer(
87
+ XdsClient* xds_client, const T& watchers_list, grpc_error_handle error,
88
+ const DebugLocation& location) {
89
+ xds_client->work_serializer_.Schedule(
90
+ [watchers_list, error]()
91
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client->work_serializer_) {
92
+ for (const auto& p : watchers_list) {
93
+ p.first->OnError(GRPC_ERROR_REF(error));
94
+ }
95
+ GRPC_ERROR_UNREF(error);
96
+ },
97
+ location);
98
+ }
99
+
100
+ // Helper template function to invoke `OnResourceDoesNotExist()` on a list of
101
+ // watchers \a watchers_list within \a work_serializer. Works with all 4
102
+ // resource types.
103
+ template <class T>
104
+ static void ScheduleNotifyWatchersOnResourceDoesNotExistInWorkSerializer(
105
+ XdsClient* xds_client, const T& watchers_list,
106
+ const DebugLocation& location) {
107
+ xds_client->work_serializer_.Schedule(
108
+ [watchers_list]()
109
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client->work_serializer_) {
110
+ for (const auto& p : watchers_list) {
111
+ p.first->OnResourceDoesNotExist();
112
+ }
113
+ },
114
+ location);
115
+ }
116
+ };
117
+
81
118
  //
82
119
  // Internal class declarations
83
120
  //
@@ -136,10 +173,10 @@ class XdsClient::ChannelState::AdsCallState
136
173
  bool seen_response() const { return seen_response_; }
137
174
 
138
175
  void SubscribeLocked(const std::string& type_url,
139
- const XdsApi::ResourceName& resource)
176
+ const XdsApi::ResourceName& name)
140
177
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
141
178
  void UnsubscribeLocked(const std::string& type_url,
142
- const XdsApi::ResourceName& resource,
179
+ const XdsApi::ResourceName& name,
143
180
  bool delay_unsubscription)
144
181
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
145
182
 
@@ -148,24 +185,20 @@ class XdsClient::ChannelState::AdsCallState
148
185
  private:
149
186
  class ResourceState : public InternallyRefCounted<ResourceState> {
150
187
  public:
151
- ResourceState(const std::string& type_url,
152
- const XdsApi::ResourceName& resource,
153
- bool sent_initial_request)
154
- : type_url_(type_url),
155
- resource_(resource),
156
- sent_initial_request_(sent_initial_request) {
188
+ ResourceState(const std::string& type_url, const XdsApi::ResourceName& name)
189
+ : type_url_(type_url), name_(name) {
157
190
  GRPC_CLOSURE_INIT(&timer_callback_, OnTimer, this,
158
191
  grpc_schedule_on_exec_ctx);
159
192
  }
160
193
 
161
194
  void Orphan() override {
162
- Finish();
195
+ MaybeCancelTimer();
163
196
  Unref(DEBUG_LOCATION, "Orphan");
164
197
  }
165
198
 
166
- void Start(RefCountedPtr<AdsCallState> ads_calld) {
167
- if (sent_initial_request_) return;
168
- sent_initial_request_ = true;
199
+ void MaybeStartTimer(RefCountedPtr<AdsCallState> ads_calld) {
200
+ if (timer_started_) return;
201
+ timer_started_ = true;
169
202
  ads_calld_ = std::move(ads_calld);
170
203
  Ref(DEBUG_LOCATION, "timer").release();
171
204
  timer_pending_ = true;
@@ -175,7 +208,7 @@ class XdsClient::ChannelState::AdsCallState
175
208
  &timer_callback_);
176
209
  }
177
210
 
178
- void Finish() {
211
+ void MaybeCancelTimer() {
179
212
  if (timer_pending_) {
180
213
  grpc_timer_cancel(&timer_);
181
214
  timer_pending_ = false;
@@ -189,6 +222,7 @@ class XdsClient::ChannelState::AdsCallState
189
222
  MutexLock lock(&self->ads_calld_->xds_client()->mu_);
190
223
  self->OnTimerLocked(GRPC_ERROR_REF(error));
191
224
  }
225
+ self->ads_calld_->xds_client()->work_serializer_.DrainQueue();
192
226
  self->ads_calld_.reset();
193
227
  self->Unref(DEBUG_LOCATION, "timer");
194
228
  }
@@ -201,8 +235,8 @@ class XdsClient::ChannelState::AdsCallState
201
235
  GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
202
236
  "timeout obtaining resource {type=%s name=%s} from xds server",
203
237
  type_url_,
204
- XdsApi::ConstructFullResourceName(resource_.authority,
205
- type_url_, resource_.id)));
238
+ XdsApi::ConstructFullResourceName(name_.authority, type_url_,
239
+ name_.id)));
206
240
  watcher_error = grpc_error_set_int(
207
241
  watcher_error, GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
208
242
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
@@ -210,32 +244,31 @@ class XdsClient::ChannelState::AdsCallState
210
244
  grpc_error_std_string(watcher_error).c_str());
211
245
  }
212
246
  auto& authority_state =
213
- ads_calld_->xds_client()->authority_state_map_[resource_.authority];
247
+ ads_calld_->xds_client()->authority_state_map_[name_.authority];
214
248
  if (type_url_ == XdsApi::kLdsTypeUrl) {
215
- ListenerState& state = authority_state.listener_map[resource_.id];
249
+ ListenerState& state = authority_state.listener_map[name_.id];
216
250
  state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
217
- for (const auto& p : state.watchers) {
218
- p.first->OnError(GRPC_ERROR_REF(watcher_error));
219
- }
251
+ Notifier::ScheduleNotifyWatchersOnErrorInWorkSerializer(
252
+ ads_calld_->xds_client(), state.watchers,
253
+ GRPC_ERROR_REF(watcher_error), DEBUG_LOCATION);
220
254
  } else if (type_url_ == XdsApi::kRdsTypeUrl) {
221
- RouteConfigState& state =
222
- authority_state.route_config_map[resource_.id];
255
+ RouteConfigState& state = authority_state.route_config_map[name_.id];
223
256
  state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
224
- for (const auto& p : state.watchers) {
225
- p.first->OnError(GRPC_ERROR_REF(watcher_error));
226
- }
257
+ Notifier::ScheduleNotifyWatchersOnErrorInWorkSerializer(
258
+ ads_calld_->xds_client(), state.watchers,
259
+ GRPC_ERROR_REF(watcher_error), DEBUG_LOCATION);
227
260
  } else if (type_url_ == XdsApi::kCdsTypeUrl) {
228
- ClusterState& state = authority_state.cluster_map[resource_.id];
261
+ ClusterState& state = authority_state.cluster_map[name_.id];
229
262
  state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
230
- for (const auto& p : state.watchers) {
231
- p.first->OnError(GRPC_ERROR_REF(watcher_error));
232
- }
263
+ Notifier::ScheduleNotifyWatchersOnErrorInWorkSerializer(
264
+ ads_calld_->xds_client(), state.watchers,
265
+ GRPC_ERROR_REF(watcher_error), DEBUG_LOCATION);
233
266
  } else if (type_url_ == XdsApi::kEdsTypeUrl) {
234
- EndpointState& state = authority_state.endpoint_map[resource_.id];
267
+ EndpointState& state = authority_state.endpoint_map[name_.id];
235
268
  state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
236
- for (const auto& p : state.watchers) {
237
- p.first->OnError(GRPC_ERROR_REF(watcher_error));
238
- }
269
+ Notifier::ScheduleNotifyWatchersOnErrorInWorkSerializer(
270
+ ads_calld_->xds_client(), state.watchers,
271
+ GRPC_ERROR_REF(watcher_error), DEBUG_LOCATION);
239
272
  } else {
240
273
  GPR_UNREACHABLE_CODE(return );
241
274
  }
@@ -245,10 +278,10 @@ class XdsClient::ChannelState::AdsCallState
245
278
  }
246
279
 
247
280
  const std::string type_url_;
248
- const XdsApi::ResourceName resource_;
281
+ const XdsApi::ResourceName name_;
249
282
 
250
283
  RefCountedPtr<AdsCallState> ads_calld_;
251
- bool sent_initial_request_;
284
+ bool timer_started_ = false;
252
285
  bool timer_pending_ = false;
253
286
  grpc_timer timer_;
254
287
  grpc_closure timer_callback_;
@@ -464,18 +497,21 @@ class XdsClient::ChannelState::StateWatcher
464
497
  private:
465
498
  void OnConnectivityStateChange(grpc_connectivity_state new_state,
466
499
  const absl::Status& status) override {
467
- MutexLock lock(&parent_->xds_client_->mu_);
468
- if (!parent_->shutting_down_ &&
469
- new_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
470
- // In TRANSIENT_FAILURE. Notify all watchers of error.
471
- gpr_log(GPR_INFO,
472
- "[xds_client %p] xds channel in state:TRANSIENT_FAILURE "
473
- "status_message:(%s)",
474
- parent_->xds_client(), status.ToString().c_str());
475
- parent_->xds_client_->NotifyOnErrorLocked(
476
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
477
- "xds channel in TRANSIENT_FAILURE"));
500
+ {
501
+ MutexLock lock(&parent_->xds_client_->mu_);
502
+ if (!parent_->shutting_down_ &&
503
+ new_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
504
+ // In TRANSIENT_FAILURE. Notify all watchers of error.
505
+ gpr_log(GPR_INFO,
506
+ "[xds_client %p] xds channel in state:TRANSIENT_FAILURE "
507
+ "status_message:(%s)",
508
+ parent_->xds_client(), status.ToString().c_str());
509
+ parent_->xds_client_->NotifyOnErrorLocked(
510
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING(
511
+ "xds channel in TRANSIENT_FAILURE"));
512
+ }
478
513
  }
514
+ parent_->xds_client()->work_serializer_.DrainQueue();
479
515
  }
480
516
 
481
517
  WeakRefCountedPtr<ChannelState> parent_;
@@ -577,7 +613,7 @@ void XdsClient::ChannelState::CancelConnectivityWatchLocked() {
577
613
  }
578
614
 
579
615
  void XdsClient::ChannelState::SubscribeLocked(
580
- const std::string& type_url, const XdsApi::ResourceName& resource) {
616
+ const std::string& type_url, const XdsApi::ResourceName& name) {
581
617
  if (ads_calld_ == nullptr) {
582
618
  // Start the ADS call if this is the first request.
583
619
  ads_calld_.reset(new RetryableCall<AdsCallState>(
@@ -591,16 +627,16 @@ void XdsClient::ChannelState::SubscribeLocked(
591
627
  // because when the call is restarted it will resend all necessary requests.
592
628
  if (ads_calld() == nullptr) return;
593
629
  // Subscribe to this resource if the ADS call is active.
594
- ads_calld()->SubscribeLocked(type_url, resource);
630
+ ads_calld()->SubscribeLocked(type_url, name);
595
631
  }
596
632
 
597
633
  void XdsClient::ChannelState::UnsubscribeLocked(
598
- const std::string& type_url, const XdsApi::ResourceName& resource,
634
+ const std::string& type_url, const XdsApi::ResourceName& name,
599
635
  bool delay_unsubscription) {
600
636
  if (ads_calld_ != nullptr) {
601
637
  auto* calld = ads_calld_->calld();
602
638
  if (calld != nullptr) {
603
- calld->UnsubscribeLocked(type_url, resource, delay_unsubscription);
639
+ calld->UnsubscribeLocked(type_url, name, delay_unsubscription);
604
640
  if (!calld->HasSubscribedResources()) {
605
641
  ads_calld_.reset();
606
642
  }
@@ -901,25 +937,23 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
901
937
  }
902
938
 
903
939
  void XdsClient::ChannelState::AdsCallState::SubscribeLocked(
904
- const std::string& type_url, const XdsApi::ResourceName& resource) {
905
- auto& state = state_map_[type_url]
906
- .subscribed_resources[resource.authority][resource.id];
940
+ const std::string& type_url, const XdsApi::ResourceName& name) {
941
+ auto& state =
942
+ state_map_[type_url].subscribed_resources[name.authority][name.id];
907
943
  if (state == nullptr) {
908
- state = MakeOrphanable<ResourceState>(
909
- type_url, resource,
910
- !chand()->resource_type_version_map_[type_url].empty());
944
+ state = MakeOrphanable<ResourceState>(type_url, name);
911
945
  SendMessageLocked(type_url);
912
946
  }
913
947
  }
914
948
 
915
949
  void XdsClient::ChannelState::AdsCallState::UnsubscribeLocked(
916
- const std::string& type_url, const XdsApi::ResourceName& resource,
950
+ const std::string& type_url, const XdsApi::ResourceName& name,
917
951
  bool delay_unsubscription) {
918
952
  auto& type_state_map = state_map_[type_url];
919
- auto& authority_map = type_state_map.subscribed_resources[resource.authority];
920
- authority_map.erase(resource.id);
953
+ auto& authority_map = type_state_map.subscribed_resources[name.authority];
954
+ authority_map.erase(name.id);
921
955
  if (authority_map.empty()) {
922
- type_state_map.subscribed_resources.erase(resource.authority);
956
+ type_state_map.subscribed_resources.erase(name.authority);
923
957
  }
924
958
  if (!delay_unsubscription) SendMessageLocked(type_url);
925
959
  }
@@ -958,29 +992,26 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdateLocked(
958
992
  xds_client(), lds_update_map.size());
959
993
  }
960
994
  auto& lds_state = state_map_[XdsApi::kLdsTypeUrl];
961
- std::set<std::string> rds_resource_names_seen;
962
995
  for (auto& p : lds_update_map) {
963
- const XdsApi::ResourceName& resource = p.first;
996
+ const XdsApi::ResourceName& name = p.first;
964
997
  XdsApi::LdsUpdate& lds_update = p.second.resource;
965
- auto& state =
966
- lds_state.subscribed_resources[resource.authority][resource.id];
967
- if (state != nullptr) state->Finish();
998
+ auto it = lds_state.subscribed_resources.find(name.authority);
999
+ if (it != lds_state.subscribed_resources.end()) {
1000
+ auto res_it = it->second.find(name.id);
1001
+ if (res_it != it->second.end()) {
1002
+ res_it->second->MaybeCancelTimer();
1003
+ }
1004
+ }
968
1005
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
969
1006
  gpr_log(GPR_INFO, "[xds_client %p] LDS resource %s: %s", xds_client(),
970
- XdsApi::ConstructFullResourceName(
971
- resource.authority, XdsApi::kLdsTypeUrl, resource.id)
1007
+ XdsApi::ConstructFullResourceName(name.authority,
1008
+ XdsApi::kLdsTypeUrl, name.id)
972
1009
  .c_str(),
973
1010
  lds_update.ToString().c_str());
974
1011
  }
975
- // Record the RDS resource names seen.
976
- if (!lds_update.http_connection_manager.route_config_name.empty()) {
977
- rds_resource_names_seen.insert(
978
- lds_update.http_connection_manager.route_config_name);
979
- }
980
- ListenerState& listener_state =
981
- xds_client()
982
- ->authority_state_map_[resource.authority]
983
- .listener_map[resource.id];
1012
+ ListenerState& listener_state = xds_client()
1013
+ ->authority_state_map_[name.authority]
1014
+ .listener_map[name.id];
984
1015
  // Ignore identical update.
985
1016
  if (listener_state.update.has_value() &&
986
1017
  *listener_state.update == lds_update) {
@@ -989,8 +1020,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdateLocked(
989
1020
  "[xds_client %p] LDS update for %s identical to current, "
990
1021
  "ignoring.",
991
1022
  xds_client(),
992
- XdsApi::ConstructFullResourceName(
993
- resource.authority, XdsApi::kLdsTypeUrl, resource.id)
1023
+ XdsApi::ConstructFullResourceName(name.authority,
1024
+ XdsApi::kLdsTypeUrl, name.id)
994
1025
  .c_str());
995
1026
  }
996
1027
  continue;
@@ -1000,25 +1031,28 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdateLocked(
1000
1031
  listener_state.meta = CreateResourceMetadataAcked(
1001
1032
  std::move(p.second.serialized_proto), version, update_time);
1002
1033
  // Notify watchers.
1003
- for (const auto& p : listener_state.watchers) {
1004
- p.first->OnListenerChanged(*listener_state.update);
1005
- }
1034
+ auto& watchers_list = listener_state.watchers;
1035
+ auto& value = listener_state.update.value();
1036
+ xds_client()->work_serializer_.Schedule(
1037
+ [watchers_list, value]()
1038
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client()->work_serializer_) {
1039
+ for (const auto& p : watchers_list) {
1040
+ p.first->OnListenerChanged(value);
1041
+ }
1042
+ },
1043
+ DEBUG_LOCATION);
1006
1044
  }
1007
1045
  // For invalid resources in the update, if they are already in the
1008
1046
  // cache, pretend that they are present in the update, so that we
1009
1047
  // don't incorrectly consider them deleted below.
1010
- for (const auto& resource : resource_names_failed) {
1048
+ for (const auto& name : resource_names_failed) {
1011
1049
  auto& listener_map =
1012
- xds_client()->authority_state_map_[resource.authority].listener_map;
1013
- auto it = listener_map.find(resource.id);
1050
+ xds_client()->authority_state_map_[name.authority].listener_map;
1051
+ auto it = listener_map.find(name.id);
1014
1052
  if (it != listener_map.end()) {
1015
1053
  auto& update = it->second.update;
1016
1054
  if (!update.has_value()) continue;
1017
- lds_update_map[resource];
1018
- if (!update->http_connection_manager.route_config_name.empty()) {
1019
- rds_resource_names_seen.insert(
1020
- update->http_connection_manager.route_config_name);
1021
- }
1055
+ lds_update_map[name];
1022
1056
  }
1023
1057
  }
1024
1058
  // For any subscribed resource that is not present in the update,
@@ -1041,31 +1075,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdateLocked(
1041
1075
  // For that case, we rely on the request timeout instead.
1042
1076
  if (!listener_state.update.has_value()) continue;
1043
1077
  listener_state.update.reset();
1044
- for (const auto& p : listener_state.watchers) {
1045
- p.first->OnResourceDoesNotExist();
1046
- }
1047
- }
1048
- }
1049
- }
1050
- // For any RDS resource that is no longer referred to by any LDS
1051
- // resources, remove it from the cache and notify watchers that it
1052
- // does not exist.
1053
- auto& rds_state = state_map_[XdsApi::kRdsTypeUrl];
1054
- for (const auto& a : rds_state.subscribed_resources) {
1055
- const std::string& authority_name = a.first;
1056
- for (const auto& p : a.second) {
1057
- const std::string& listener_name = p.first;
1058
- if (rds_resource_names_seen.find(XdsApi::ConstructFullResourceName(
1059
- authority_name, XdsApi::kRdsTypeUrl, listener_name)) ==
1060
- rds_resource_names_seen.end()) {
1061
- RouteConfigState& route_config_state =
1062
- xds_client()
1063
- ->authority_state_map_[authority_name]
1064
- .route_config_map[listener_name];
1065
- route_config_state.update.reset();
1066
- for (const auto& p : route_config_state.watchers) {
1067
- p.first->OnResourceDoesNotExist();
1068
- }
1078
+ Notifier::ScheduleNotifyWatchersOnResourceDoesNotExistInWorkSerializer(
1079
+ xds_client(), listener_state.watchers, DEBUG_LOCATION);
1069
1080
  }
1070
1081
  }
1071
1082
  }
@@ -1082,19 +1093,23 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdateLocked(
1082
1093
  }
1083
1094
  auto& rds_state = state_map_[XdsApi::kRdsTypeUrl];
1084
1095
  for (auto& p : rds_update_map) {
1085
- const XdsApi::ResourceName& resource = p.first;
1096
+ const XdsApi::ResourceName& name = p.first;
1086
1097
  XdsApi::RdsUpdate& rds_update = p.second.resource;
1087
- auto& state =
1088
- rds_state.subscribed_resources[resource.authority][resource.id];
1089
- if (state != nullptr) state->Finish();
1098
+ auto it = rds_state.subscribed_resources.find(name.authority);
1099
+ if (it != rds_state.subscribed_resources.end()) {
1100
+ auto res_it = it->second.find(name.id);
1101
+ if (res_it != it->second.end()) {
1102
+ res_it->second->MaybeCancelTimer();
1103
+ }
1104
+ }
1090
1105
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1091
1106
  gpr_log(GPR_INFO, "[xds_client %p] RDS resource:\n%s", xds_client(),
1092
1107
  rds_update.ToString().c_str());
1093
1108
  }
1094
1109
  RouteConfigState& route_config_state =
1095
1110
  xds_client()
1096
- ->authority_state_map_[resource.authority]
1097
- .route_config_map[resource.id];
1111
+ ->authority_state_map_[name.authority]
1112
+ .route_config_map[name.id];
1098
1113
  // Ignore identical update.
1099
1114
  if (route_config_state.update.has_value() &&
1100
1115
  *route_config_state.update == rds_update) {
@@ -1110,9 +1125,16 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdateLocked(
1110
1125
  route_config_state.meta = CreateResourceMetadataAcked(
1111
1126
  std::move(p.second.serialized_proto), version, update_time);
1112
1127
  // Notify all watchers.
1113
- for (const auto& p : route_config_state.watchers) {
1114
- p.first->OnRouteConfigChanged(*route_config_state.update);
1115
- }
1128
+ auto& watchers_list = route_config_state.watchers;
1129
+ auto& value = route_config_state.update.value();
1130
+ xds_client()->work_serializer_.Schedule(
1131
+ [watchers_list, value]()
1132
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client()->work_serializer_) {
1133
+ for (const auto& p : watchers_list) {
1134
+ p.first->OnRouteConfigChanged(value);
1135
+ }
1136
+ },
1137
+ DEBUG_LOCATION);
1116
1138
  }
1117
1139
  }
1118
1140
 
@@ -1127,29 +1149,25 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdateLocked(
1127
1149
  xds_client(), cds_update_map.size());
1128
1150
  }
1129
1151
  auto& cds_state = state_map_[XdsApi::kCdsTypeUrl];
1130
- std::set<std::string> eds_resource_names_seen;
1131
1152
  for (auto& p : cds_update_map) {
1132
- const XdsApi::ResourceName& resource = p.first;
1153
+ const XdsApi::ResourceName& name = p.first;
1133
1154
  XdsApi::CdsUpdate& cds_update = p.second.resource;
1134
- auto& state =
1135
- cds_state.subscribed_resources[resource.authority][resource.id];
1136
- if (state != nullptr) state->Finish();
1155
+ auto it = cds_state.subscribed_resources.find(name.authority);
1156
+ if (it != cds_state.subscribed_resources.end()) {
1157
+ auto res_it = it->second.find(name.id);
1158
+ if (res_it != it->second.end()) {
1159
+ res_it->second->MaybeCancelTimer();
1160
+ }
1161
+ }
1137
1162
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1138
1163
  gpr_log(GPR_INFO, "[xds_client %p] cluster=%s: %s", xds_client(),
1139
- XdsApi::ConstructFullResourceName(
1140
- resource.authority, XdsApi::kCdsTypeUrl, resource.id)
1164
+ XdsApi::ConstructFullResourceName(name.authority,
1165
+ XdsApi::kCdsTypeUrl, name.id)
1141
1166
  .c_str(),
1142
1167
  cds_update.ToString().c_str());
1143
1168
  }
1144
- // Record the EDS resource names seen.
1145
- eds_resource_names_seen.insert(
1146
- cds_update.eds_service_name.empty()
1147
- ? XdsApi::ConstructFullResourceName(
1148
- resource.authority, XdsApi::kCdsTypeUrl, resource.id)
1149
- : cds_update.eds_service_name);
1150
- ClusterState& cluster_state = xds_client()
1151
- ->authority_state_map_[resource.authority]
1152
- .cluster_map[resource.id];
1169
+ ClusterState& cluster_state =
1170
+ xds_client()->authority_state_map_[name.authority].cluster_map[name.id];
1153
1171
  // Ignore identical update.
1154
1172
  if (cluster_state.update.has_value() &&
1155
1173
  *cluster_state.update == cds_update) {
@@ -1165,26 +1183,28 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdateLocked(
1165
1183
  cluster_state.meta = CreateResourceMetadataAcked(
1166
1184
  std::move(p.second.serialized_proto), version, update_time);
1167
1185
  // Notify all watchers.
1168
- for (const auto& p : cluster_state.watchers) {
1169
- p.first->OnClusterChanged(cluster_state.update.value());
1170
- }
1186
+ auto& watchers_list = cluster_state.watchers;
1187
+ auto& value = cluster_state.update.value();
1188
+ xds_client()->work_serializer_.Schedule(
1189
+ [watchers_list, value]()
1190
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client()->work_serializer_) {
1191
+ for (const auto& p : watchers_list) {
1192
+ p.first->OnClusterChanged(value);
1193
+ }
1194
+ },
1195
+ DEBUG_LOCATION);
1171
1196
  }
1172
1197
  // For invalid resources in the update, if they are already in the
1173
1198
  // cache, pretend that they are present in the update, so that we
1174
1199
  // don't incorrectly consider them deleted below.
1175
- for (const auto& resource : resource_names_failed) {
1200
+ for (const auto& name : resource_names_failed) {
1176
1201
  auto& cluster_map =
1177
- xds_client()->authority_state_map_[resource.authority].cluster_map;
1178
- auto it = cluster_map.find(resource.id);
1202
+ xds_client()->authority_state_map_[name.authority].cluster_map;
1203
+ auto it = cluster_map.find(name.id);
1179
1204
  if (it != cluster_map.end()) {
1180
1205
  auto& update = it->second.update;
1181
1206
  if (!update.has_value()) continue;
1182
- cds_update_map[resource];
1183
- eds_resource_names_seen.insert(
1184
- update->eds_service_name.empty()
1185
- ? XdsApi::ConstructFullResourceName(
1186
- resource.authority, XdsApi::kCdsTypeUrl, resource.id)
1187
- : update->eds_service_name);
1207
+ cds_update_map[name];
1188
1208
  }
1189
1209
  }
1190
1210
  // For any subscribed resource that is not present in the update,
@@ -1206,30 +1226,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdateLocked(
1206
1226
  // For that case, we rely on the request timeout instead.
1207
1227
  if (!cluster_state.update.has_value()) continue;
1208
1228
  cluster_state.update.reset();
1209
- for (const auto& p : cluster_state.watchers) {
1210
- p.first->OnResourceDoesNotExist();
1211
- }
1212
- }
1213
- }
1214
- }
1215
- // For any EDS resource that is no longer referred to by any CDS
1216
- // resources, remove it from the cache and notify watchers that it
1217
- // does not exist.
1218
- auto& eds_state = state_map_[XdsApi::kEdsTypeUrl];
1219
- for (const auto& a : eds_state.subscribed_resources) {
1220
- const std::string& authority = a.first;
1221
- for (const auto& p : a.second) {
1222
- const std::string& eds_resource_name = p.first;
1223
- if (eds_resource_names_seen.find(XdsApi::ConstructFullResourceName(
1224
- authority, XdsApi::kEdsTypeUrl, eds_resource_name)) ==
1225
- eds_resource_names_seen.end()) {
1226
- EndpointState& endpoint_state = xds_client()
1227
- ->authority_state_map_[authority]
1228
- .endpoint_map[eds_resource_name];
1229
- endpoint_state.update.reset();
1230
- for (const auto& p : endpoint_state.watchers) {
1231
- p.first->OnResourceDoesNotExist();
1232
- }
1229
+ Notifier::ScheduleNotifyWatchersOnResourceDoesNotExistInWorkSerializer(
1230
+ xds_client(), cluster_state.watchers, DEBUG_LOCATION);
1233
1231
  }
1234
1232
  }
1235
1233
  }
@@ -1246,22 +1244,25 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdateLocked(
1246
1244
  }
1247
1245
  auto& eds_state = state_map_[XdsApi::kEdsTypeUrl];
1248
1246
  for (auto& p : eds_update_map) {
1249
- const XdsApi::ResourceName& resource = p.first;
1247
+ const XdsApi::ResourceName& name = p.first;
1250
1248
  XdsApi::EdsUpdate& eds_update = p.second.resource;
1251
- auto& state =
1252
- eds_state.subscribed_resources[resource.authority][resource.id];
1253
- if (state != nullptr) state->Finish();
1249
+ auto it = eds_state.subscribed_resources.find(name.authority);
1250
+ if (it != eds_state.subscribed_resources.end()) {
1251
+ auto res_it = it->second.find(name.id);
1252
+ if (res_it != it->second.end()) {
1253
+ res_it->second->MaybeCancelTimer();
1254
+ }
1255
+ }
1254
1256
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
1255
1257
  gpr_log(GPR_INFO, "[xds_client %p] EDS resource %s: %s", xds_client(),
1256
- XdsApi::ConstructFullResourceName(
1257
- resource.authority, XdsApi::kCdsTypeUrl, resource.id)
1258
+ XdsApi::ConstructFullResourceName(name.authority,
1259
+ XdsApi::kCdsTypeUrl, name.id)
1258
1260
  .c_str(),
1259
1261
  eds_update.ToString().c_str());
1260
1262
  }
1261
- EndpointState& endpoint_state =
1262
- xds_client()
1263
- ->authority_state_map_[resource.authority]
1264
- .endpoint_map[resource.id];
1263
+ EndpointState& endpoint_state = xds_client()
1264
+ ->authority_state_map_[name.authority]
1265
+ .endpoint_map[name.id];
1265
1266
  // Ignore identical update.
1266
1267
  if (endpoint_state.update.has_value() &&
1267
1268
  *endpoint_state.update == eds_update) {
@@ -1277,9 +1278,16 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdateLocked(
1277
1278
  endpoint_state.meta = CreateResourceMetadataAcked(
1278
1279
  std::move(p.second.serialized_proto), version, update_time);
1279
1280
  // Notify all watchers.
1280
- for (const auto& p : endpoint_state.watchers) {
1281
- p.first->OnEndpointChanged(endpoint_state.update.value());
1282
- }
1281
+ auto& watchers_list = endpoint_state.watchers;
1282
+ auto& value = endpoint_state.update.value();
1283
+ xds_client()->work_serializer_.Schedule(
1284
+ [watchers_list, value]()
1285
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client()->work_serializer_) {
1286
+ for (const auto& p : watchers_list) {
1287
+ p.first->OnEndpointChanged(value);
1288
+ }
1289
+ },
1290
+ DEBUG_LOCATION);
1283
1291
  }
1284
1292
  }
1285
1293
 
@@ -1306,9 +1314,9 @@ void XdsClient::ChannelState::AdsCallState::RejectAdsUpdateHelperLocked(
1306
1314
  auto it = state_map->find(resource_name);
1307
1315
  if (it == state_map->end()) return;
1308
1316
  auto& state = it->second;
1309
- for (const auto& p : state.watchers) {
1310
- p.first->OnError(GRPC_ERROR_REF(result.parse_error));
1311
- }
1317
+ Notifier::ScheduleNotifyWatchersOnErrorInWorkSerializer(
1318
+ xds_client(), state.watchers, GRPC_ERROR_REF(result.parse_error),
1319
+ DEBUG_LOCATION);
1312
1320
  UpdateResourceMetadataNacked(result.version, error_details, update_time,
1313
1321
  &state.meta);
1314
1322
  }
@@ -1388,6 +1396,7 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceived(
1388
1396
  MutexLock lock(&ads_calld->xds_client()->mu_);
1389
1397
  done = ads_calld->OnResponseReceivedLocked();
1390
1398
  }
1399
+ ads_calld->xds_client()->work_serializer_.DrainQueue();
1391
1400
  if (done) ads_calld->Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked");
1392
1401
  }
1393
1402
 
@@ -1418,7 +1427,7 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1418
1427
  xds_client(), grpc_error_std_string(result.parse_error).c_str());
1419
1428
  GRPC_ERROR_UNREF(result.parse_error);
1420
1429
  } else {
1421
- grpc_millis update_time = grpc_core::ExecCtx::Get()->Now();
1430
+ grpc_millis update_time = ExecCtx::Get()->Now();
1422
1431
  // Update nonce.
1423
1432
  auto& state = state_map_[result.type_url];
1424
1433
  state.nonce = std::move(result.nonce);
@@ -1494,6 +1503,7 @@ void XdsClient::ChannelState::AdsCallState::OnStatusReceived(
1494
1503
  MutexLock lock(&ads_calld->xds_client()->mu_);
1495
1504
  ads_calld->OnStatusReceivedLocked(GRPC_ERROR_REF(error));
1496
1505
  }
1506
+ ads_calld->xds_client()->work_serializer_.DrainQueue();
1497
1507
  ads_calld->Unref(DEBUG_LOCATION, "ADS+OnStatusReceivedLocked");
1498
1508
  }
1499
1509
 
@@ -1538,7 +1548,7 @@ XdsClient::ChannelState::AdsCallState::ResourceNamesForRequest(
1538
1548
  for (auto& p : a.second) {
1539
1549
  resource_map[a.first].insert(p.first);
1540
1550
  OrphanablePtr<ResourceState>& state = p.second;
1541
- state->Start(Ref(DEBUG_LOCATION, "ResourceState"));
1551
+ state->MaybeStartTimer(Ref(DEBUG_LOCATION, "ResourceState"));
1542
1552
  }
1543
1553
  }
1544
1554
  }
@@ -2081,37 +2091,58 @@ RefCountedPtr<XdsClient::ChannelState> XdsClient::GetOrCreateChannelStateLocked(
2081
2091
 
2082
2092
  void XdsClient::WatchListenerData(
2083
2093
  absl::string_view listener_name,
2084
- std::unique_ptr<ListenerWatcherInterface> watcher) {
2094
+ RefCountedPtr<ListenerWatcherInterface> watcher) {
2085
2095
  std::string listener_name_str = std::string(listener_name);
2086
- MutexLock lock(&mu_);
2087
2096
  ListenerWatcherInterface* w = watcher.get();
2088
2097
  auto resource = XdsApi::ParseResourceName(listener_name, XdsApi::IsLds);
2089
2098
  if (!resource.ok()) {
2090
- invalid_listener_watchers_[w] = std::move(watcher);
2099
+ {
2100
+ MutexLock lock(&mu_);
2101
+ invalid_listener_watchers_[w] = watcher;
2102
+ }
2091
2103
  grpc_error_handle error = GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
2092
2104
  "Unable to parse resource name for listener %s", listener_name));
2093
- w->OnError(GRPC_ERROR_REF(error));
2105
+ work_serializer_.Run(
2106
+ // TODO(yashykt): When we move to C++14, capture watcher using
2107
+ // std::move()
2108
+ [watcher, error]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
2109
+ watcher->OnError(error);
2110
+ },
2111
+ DEBUG_LOCATION);
2094
2112
  return;
2095
2113
  }
2096
- AuthorityState& authority_state = authority_state_map_[resource->authority];
2097
- ListenerState& listener_state = authority_state.listener_map[resource->id];
2098
- listener_state.watchers[w] = std::move(watcher);
2099
- // If we've already received an LDS update, notify the new watcher
2100
- // immediately.
2101
- if (listener_state.update.has_value()) {
2102
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2103
- gpr_log(GPR_INFO, "[xds_client %p] returning cached listener data for %s",
2104
- this, listener_name_str.c_str());
2114
+ {
2115
+ MutexLock lock(&mu_);
2116
+ AuthorityState& authority_state = authority_state_map_[resource->authority];
2117
+ ListenerState& listener_state = authority_state.listener_map[resource->id];
2118
+ listener_state.watchers[w] = watcher;
2119
+ // If we've already received an LDS update, notify the new watcher
2120
+ // immediately.
2121
+ if (listener_state.update.has_value()) {
2122
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2123
+ gpr_log(GPR_INFO,
2124
+ "[xds_client %p] returning cached listener data for %s", this,
2125
+ listener_name_str.c_str());
2126
+ }
2127
+ auto& value = listener_state.update.value();
2128
+ work_serializer_.Schedule(
2129
+ // TODO(yashykt): When we move to C++14, capture watcher using
2130
+ // std::move()
2131
+ [watcher, value]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
2132
+ watcher->OnListenerChanged(value);
2133
+ },
2134
+ DEBUG_LOCATION);
2105
2135
  }
2106
- w->OnListenerChanged(*listener_state.update);
2107
- }
2108
- // If the authority doesn't yet have a channel, set it, creating it if needed.
2109
- if (authority_state.channel_state == nullptr) {
2110
- authority_state.channel_state =
2111
- GetOrCreateChannelStateLocked(bootstrap_->server());
2136
+ // If the authority doesn't yet have a channel, set it, creating it if
2137
+ // needed.
2138
+ if (authority_state.channel_state == nullptr) {
2139
+ authority_state.channel_state =
2140
+ GetOrCreateChannelStateLocked(bootstrap_->server());
2141
+ }
2142
+ authority_state.channel_state->SubscribeLocked(XdsApi::kLdsTypeUrl,
2143
+ *resource);
2112
2144
  }
2113
- authority_state.channel_state->SubscribeLocked(XdsApi::kLdsTypeUrl,
2114
- *resource);
2145
+ work_serializer_.DrainQueue();
2115
2146
  }
2116
2147
 
2117
2148
  void XdsClient::CancelListenerDataWatch(absl::string_view listener_name,
@@ -2140,40 +2171,58 @@ void XdsClient::CancelListenerDataWatch(absl::string_view listener_name,
2140
2171
 
2141
2172
  void XdsClient::WatchRouteConfigData(
2142
2173
  absl::string_view route_config_name,
2143
- std::unique_ptr<RouteConfigWatcherInterface> watcher) {
2174
+ RefCountedPtr<RouteConfigWatcherInterface> watcher) {
2144
2175
  std::string route_config_name_str = std::string(route_config_name);
2145
- MutexLock lock(&mu_);
2146
2176
  RouteConfigWatcherInterface* w = watcher.get();
2147
2177
  auto resource = XdsApi::ParseResourceName(route_config_name, XdsApi::IsRds);
2148
2178
  if (!resource.ok()) {
2149
- invalid_route_config_watchers_[w] = std::move(watcher);
2179
+ {
2180
+ MutexLock lock(&mu_);
2181
+ invalid_route_config_watchers_[w] = watcher;
2182
+ }
2150
2183
  grpc_error_handle error = GRPC_ERROR_CREATE_FROM_CPP_STRING(
2151
2184
  absl::StrFormat("Unable to parse resource name for route config %s",
2152
2185
  route_config_name));
2153
- w->OnError(GRPC_ERROR_REF(error));
2186
+ work_serializer_.Run(
2187
+ // TODO(yashykt): When we move to C++14, capture watcher using
2188
+ // std::move()
2189
+ [watcher, error]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
2190
+ watcher->OnError(error);
2191
+ },
2192
+ DEBUG_LOCATION);
2154
2193
  return;
2155
2194
  }
2156
- auto& authority_state = authority_state_map_[resource->authority];
2157
- RouteConfigState& route_config_state =
2158
- authority_state.route_config_map[resource->id];
2159
- route_config_state.watchers[w] = std::move(watcher);
2160
- // If we've already received an RDS update, notify the new watcher
2161
- // immediately.
2162
- if (route_config_state.update.has_value()) {
2163
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2164
- gpr_log(GPR_INFO,
2165
- "[xds_client %p] returning cached route config data for %s", this,
2166
- route_config_name_str.c_str());
2195
+ {
2196
+ MutexLock lock(&mu_);
2197
+ auto& authority_state = authority_state_map_[resource->authority];
2198
+ RouteConfigState& route_config_state =
2199
+ authority_state.route_config_map[resource->id];
2200
+ route_config_state.watchers[w] = watcher;
2201
+ // If we've already received an RDS update, notify the new watcher
2202
+ // immediately.
2203
+ if (route_config_state.update.has_value()) {
2204
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2205
+ gpr_log(GPR_INFO,
2206
+ "[xds_client %p] returning cached route config data for %s",
2207
+ this, route_config_name_str.c_str());
2208
+ }
2209
+ auto& value = route_config_state.update.value();
2210
+ work_serializer_.Schedule(
2211
+ [watcher, value]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
2212
+ watcher->OnRouteConfigChanged(value);
2213
+ },
2214
+ DEBUG_LOCATION);
2167
2215
  }
2168
- w->OnRouteConfigChanged(*route_config_state.update);
2169
- }
2170
- // If the authority doesn't yet have a channel, set it, creating it if needed.
2171
- if (authority_state.channel_state == nullptr) {
2172
- authority_state.channel_state =
2173
- GetOrCreateChannelStateLocked(bootstrap_->server());
2216
+ // If the authority doesn't yet have a channel, set it, creating it if
2217
+ // needed.
2218
+ if (authority_state.channel_state == nullptr) {
2219
+ authority_state.channel_state =
2220
+ GetOrCreateChannelStateLocked(bootstrap_->server());
2221
+ }
2222
+ authority_state.channel_state->SubscribeLocked(XdsApi::kRdsTypeUrl,
2223
+ *resource);
2174
2224
  }
2175
- authority_state.channel_state->SubscribeLocked(XdsApi::kRdsTypeUrl,
2176
- *resource);
2225
+ work_serializer_.DrainQueue();
2177
2226
  }
2178
2227
 
2179
2228
  void XdsClient::CancelRouteConfigDataWatch(absl::string_view route_config_name,
@@ -2203,37 +2252,54 @@ void XdsClient::CancelRouteConfigDataWatch(absl::string_view route_config_name,
2203
2252
 
2204
2253
  void XdsClient::WatchClusterData(
2205
2254
  absl::string_view cluster_name,
2206
- std::unique_ptr<ClusterWatcherInterface> watcher) {
2255
+ RefCountedPtr<ClusterWatcherInterface> watcher) {
2207
2256
  std::string cluster_name_str = std::string(cluster_name);
2208
- MutexLock lock(&mu_);
2209
2257
  ClusterWatcherInterface* w = watcher.get();
2210
2258
  auto resource = XdsApi::ParseResourceName(cluster_name, XdsApi::IsCds);
2211
2259
  if (!resource.ok()) {
2212
- invalid_cluster_watchers_[w] = std::move(watcher);
2260
+ {
2261
+ MutexLock lock(&mu_);
2262
+ invalid_cluster_watchers_[w] = watcher;
2263
+ }
2213
2264
  grpc_error_handle error = GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
2214
2265
  "Unable to parse resource name for cluster %s", cluster_name));
2215
- w->OnError(GRPC_ERROR_REF(error));
2266
+ work_serializer_.Run([watcher, error]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(
2267
+ work_serializer_) { watcher->OnError(error); },
2268
+ DEBUG_LOCATION);
2216
2269
  return;
2217
2270
  }
2218
- auto& authority_state = authority_state_map_[resource->authority];
2219
- ClusterState& cluster_state = authority_state.cluster_map[resource->id];
2220
- cluster_state.watchers[w] = std::move(watcher);
2221
- // If we've already received a CDS update, notify the new watcher
2222
- // immediately.
2223
- if (cluster_state.update.has_value()) {
2224
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2225
- gpr_log(GPR_INFO, "[xds_client %p] returning cached cluster data for %s",
2226
- this, cluster_name_str.c_str());
2271
+ {
2272
+ MutexLock lock(&mu_);
2273
+ auto& authority_state = authority_state_map_[resource->authority];
2274
+ ClusterState& cluster_state = authority_state.cluster_map[resource->id];
2275
+ cluster_state.watchers[w] = watcher;
2276
+ // If we've already received a CDS update, notify the new watcher
2277
+ // immediately.
2278
+ if (cluster_state.update.has_value()) {
2279
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2280
+ gpr_log(GPR_INFO,
2281
+ "[xds_client %p] returning cached cluster data for %s", this,
2282
+ cluster_name_str.c_str());
2283
+ }
2284
+ auto& value = cluster_state.update.value();
2285
+ work_serializer_.Schedule(
2286
+ // TODO(yashykt): When we move to C++14, capture watcher using
2287
+ // std::move()
2288
+ [watcher, value]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
2289
+ watcher->OnClusterChanged(value);
2290
+ },
2291
+ DEBUG_LOCATION);
2227
2292
  }
2228
- w->OnClusterChanged(cluster_state.update.value());
2229
- }
2230
- // If the authority doesn't yet have a channel, set it, creating it if needed.
2231
- if (authority_state.channel_state == nullptr) {
2232
- authority_state.channel_state =
2233
- GetOrCreateChannelStateLocked(bootstrap_->server());
2293
+ // If the authority doesn't yet have a channel, set it, creating it if
2294
+ // needed.
2295
+ if (authority_state.channel_state == nullptr) {
2296
+ authority_state.channel_state =
2297
+ GetOrCreateChannelStateLocked(bootstrap_->server());
2298
+ }
2299
+ authority_state.channel_state->SubscribeLocked(XdsApi::kCdsTypeUrl,
2300
+ *resource);
2234
2301
  }
2235
- authority_state.channel_state->SubscribeLocked(XdsApi::kCdsTypeUrl,
2236
- *resource);
2302
+ work_serializer_.DrainQueue();
2237
2303
  }
2238
2304
 
2239
2305
  void XdsClient::CancelClusterDataWatch(absl::string_view cluster_name,
@@ -2262,38 +2328,53 @@ void XdsClient::CancelClusterDataWatch(absl::string_view cluster_name,
2262
2328
 
2263
2329
  void XdsClient::WatchEndpointData(
2264
2330
  absl::string_view eds_service_name,
2265
- std::unique_ptr<EndpointWatcherInterface> watcher) {
2331
+ RefCountedPtr<EndpointWatcherInterface> watcher) {
2266
2332
  std::string eds_service_name_str = std::string(eds_service_name);
2267
- MutexLock lock(&mu_);
2268
2333
  EndpointWatcherInterface* w = watcher.get();
2269
2334
  auto resource = XdsApi::ParseResourceName(eds_service_name, XdsApi::IsEds);
2270
2335
  if (!resource.ok()) {
2271
- invalid_endpoint_watchers_[w] = std::move(watcher);
2336
+ {
2337
+ MutexLock lock(&mu_);
2338
+ invalid_endpoint_watchers_[w] = watcher;
2339
+ }
2272
2340
  grpc_error_handle error = GRPC_ERROR_CREATE_FROM_CPP_STRING(
2273
2341
  absl::StrFormat("Unable to parse resource name for endpoint service %s",
2274
2342
  eds_service_name));
2275
- w->OnError(GRPC_ERROR_REF(error));
2343
+ work_serializer_.Run([watcher, error]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(
2344
+ work_serializer_) { watcher->OnError(error); },
2345
+ DEBUG_LOCATION);
2276
2346
  return;
2277
2347
  }
2278
- auto& authority_state = authority_state_map_[resource->authority];
2279
- EndpointState& endpoint_state = authority_state.endpoint_map[resource->id];
2280
- endpoint_state.watchers[w] = std::move(watcher);
2281
- // If we've already received an EDS update, notify the new watcher
2282
- // immediately.
2283
- if (endpoint_state.update.has_value()) {
2284
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2285
- gpr_log(GPR_INFO, "[xds_client %p] returning cached endpoint data for %s",
2286
- this, eds_service_name_str.c_str());
2348
+ {
2349
+ MutexLock lock(&mu_);
2350
+ auto& authority_state = authority_state_map_[resource->authority];
2351
+ EndpointState& endpoint_state = authority_state.endpoint_map[resource->id];
2352
+ endpoint_state.watchers[w] = watcher;
2353
+ // If we've already received an EDS update, notify the new watcher
2354
+ // immediately.
2355
+ if (endpoint_state.update.has_value()) {
2356
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2357
+ gpr_log(GPR_INFO,
2358
+ "[xds_client %p] returning cached endpoint data for %s", this,
2359
+ eds_service_name_str.c_str());
2360
+ }
2361
+ auto& value = endpoint_state.update.value();
2362
+ work_serializer_.Schedule(
2363
+ [watcher, value]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
2364
+ watcher->OnEndpointChanged(value);
2365
+ },
2366
+ DEBUG_LOCATION);
2287
2367
  }
2288
- w->OnEndpointChanged(endpoint_state.update.value());
2289
- }
2290
- // If the authority doesn't yet have a channel, set it, creating it if needed.
2291
- if (authority_state.channel_state == nullptr) {
2292
- authority_state.channel_state =
2293
- GetOrCreateChannelStateLocked(bootstrap_->server());
2368
+ // If the authority doesn't yet have a channel, set it, creating it if
2369
+ // needed.
2370
+ if (authority_state.channel_state == nullptr) {
2371
+ authority_state.channel_state =
2372
+ GetOrCreateChannelStateLocked(bootstrap_->server());
2373
+ }
2374
+ authority_state.channel_state->SubscribeLocked(XdsApi::kEdsTypeUrl,
2375
+ *resource);
2294
2376
  }
2295
- authority_state.channel_state->SubscribeLocked(XdsApi::kEdsTypeUrl,
2296
- *resource);
2377
+ work_serializer_.DrainQueue();
2297
2378
  }
2298
2379
 
2299
2380
  void XdsClient::CancelEndpointDataWatch(absl::string_view eds_service_name,
@@ -2453,33 +2534,57 @@ void XdsClient::ResetBackoff() {
2453
2534
  }
2454
2535
 
2455
2536
  void XdsClient::NotifyOnErrorLocked(grpc_error_handle error) {
2537
+ std::set<RefCountedPtr<ListenerWatcherInterface>> listener_watchers;
2538
+ std::set<RefCountedPtr<RouteConfigWatcherInterface>> route_config_watchers;
2539
+ std::set<RefCountedPtr<ClusterWatcherInterface>> cluster_watchers;
2540
+ std::set<RefCountedPtr<EndpointWatcherInterface>> endpoint_watchers;
2456
2541
  for (const auto& a : authority_state_map_) {
2457
2542
  for (const auto& p : a.second.listener_map) {
2458
2543
  const ListenerState& listener_state = p.second;
2459
- for (const auto& p : listener_state.watchers) {
2460
- p.first->OnError(GRPC_ERROR_REF(error));
2544
+ for (const auto& q : listener_state.watchers) {
2545
+ listener_watchers.insert(q.second);
2461
2546
  }
2462
2547
  }
2463
2548
  for (const auto& p : a.second.route_config_map) {
2464
2549
  const RouteConfigState& route_config_state = p.second;
2465
- for (const auto& p : route_config_state.watchers) {
2466
- p.first->OnError(GRPC_ERROR_REF(error));
2550
+ for (const auto& q : route_config_state.watchers) {
2551
+ route_config_watchers.insert(q.second);
2467
2552
  }
2468
2553
  }
2469
2554
  for (const auto& p : a.second.cluster_map) {
2470
2555
  const ClusterState& cluster_state = p.second;
2471
- for (const auto& p : cluster_state.watchers) {
2472
- p.first->OnError(GRPC_ERROR_REF(error));
2556
+ for (const auto& q : cluster_state.watchers) {
2557
+ cluster_watchers.insert(q.second);
2473
2558
  }
2474
2559
  }
2475
2560
  for (const auto& p : a.second.endpoint_map) {
2476
2561
  const EndpointState& endpoint_state = p.second;
2477
- for (const auto& p : endpoint_state.watchers) {
2478
- p.first->OnError(GRPC_ERROR_REF(error));
2562
+ for (const auto& q : endpoint_state.watchers) {
2563
+ endpoint_watchers.insert(q.second);
2479
2564
  }
2480
2565
  }
2481
2566
  }
2482
- GRPC_ERROR_UNREF(error);
2567
+ work_serializer_.Schedule(
2568
+ // TODO(yashykt): When we move to C++14, capture *_watchers using
2569
+ // std::move()
2570
+ [listener_watchers, route_config_watchers, cluster_watchers,
2571
+ endpoint_watchers, error]()
2572
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
2573
+ for (const auto& watcher : listener_watchers) {
2574
+ watcher->OnError(GRPC_ERROR_REF(error));
2575
+ }
2576
+ for (const auto& watcher : route_config_watchers) {
2577
+ watcher->OnError(GRPC_ERROR_REF(error));
2578
+ }
2579
+ for (const auto& watcher : cluster_watchers) {
2580
+ watcher->OnError(GRPC_ERROR_REF(error));
2581
+ }
2582
+ for (const auto& watcher : endpoint_watchers) {
2583
+ watcher->OnError(GRPC_ERROR_REF(error));
2584
+ }
2585
+ GRPC_ERROR_UNREF(error);
2586
+ },
2587
+ DEBUG_LOCATION);
2483
2588
  }
2484
2589
 
2485
2590
  XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshotLocked(
@@ -2625,7 +2730,7 @@ namespace {
2625
2730
  std::string GetBootstrapContents(const char* fallback_config,
2626
2731
  grpc_error_handle* error) {
2627
2732
  // First, try GRPC_XDS_BOOTSTRAP env var.
2628
- grpc_core::UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
2733
+ UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
2629
2734
  if (path != nullptr) {
2630
2735
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2631
2736
  gpr_log(GPR_INFO,
@@ -2642,8 +2747,7 @@ std::string GetBootstrapContents(const char* fallback_config,
2642
2747
  return contents_str;
2643
2748
  }
2644
2749
  // Next, try GRPC_XDS_BOOTSTRAP_CONFIG env var.
2645
- grpc_core::UniquePtr<char> env_config(
2646
- gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG"));
2750
+ UniquePtr<char> env_config(gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG"));
2647
2751
  if (env_config != nullptr) {
2648
2752
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
2649
2753
  gpr_log(GPR_INFO,