grpc 1.45.0 → 1.46.2

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 (513) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +36 -29
  3. data/include/grpc/impl/codegen/grpc_types.h +7 -13
  4. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +309 -0
  5. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +122 -0
  6. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.cc +1 -1
  7. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.h +3 -3
  8. data/src/core/ext/filters/client_channel/client_channel.cc +163 -96
  9. data/src/core/ext/filters/client_channel/client_channel.h +2 -0
  10. data/src/core/ext/filters/client_channel/health/health_check_client.cc +124 -581
  11. data/src/core/ext/filters/client_channel/health/health_check_client.h +24 -160
  12. data/src/core/ext/filters/client_channel/http_proxy.cc +88 -110
  13. data/src/core/ext/filters/client_channel/http_proxy.h +17 -0
  14. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +182 -142
  15. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -6
  16. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +1 -10
  17. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +87 -58
  18. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +51 -48
  19. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +14 -7
  20. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +229 -284
  21. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +92 -257
  22. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +51 -221
  23. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +201 -0
  24. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +106 -0
  25. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +102 -55
  26. data/src/core/ext/filters/client_channel/retry_filter.cc +18 -3
  27. data/src/core/ext/filters/client_channel/subchannel.cc +5 -5
  28. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +544 -0
  29. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +214 -0
  30. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +127 -367
  31. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +24 -1
  32. data/src/core/ext/filters/http/client/http_client_filter.cc +78 -458
  33. data/src/core/ext/filters/http/client/http_client_filter.h +21 -4
  34. data/src/core/ext/filters/http/client_authority_filter.cc +17 -22
  35. data/src/core/ext/filters/http/client_authority_filter.h +6 -5
  36. data/src/core/ext/filters/http/http_filters_plugin.cc +9 -6
  37. data/src/core/ext/filters/http/server/http_server_filter.cc +2 -116
  38. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +2 -8
  39. data/src/core/ext/filters/server_config_selector/server_config_selector.h +2 -2
  40. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +73 -201
  41. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -1
  42. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +5 -4
  43. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +139 -28
  44. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -0
  45. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +2 -6
  46. data/src/core/ext/transport/chttp2/transport/internal.h +4 -2
  47. data/src/core/ext/transport/chttp2/transport/parsing.cc +8 -0
  48. data/src/core/ext/transport/chttp2/transport/writing.cc +24 -13
  49. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +27 -24
  50. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +143 -63
  51. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +37 -35
  52. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +177 -77
  53. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +115 -111
  54. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +547 -207
  55. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +5 -5
  56. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +26 -13
  57. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +5 -5
  58. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +23 -9
  59. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +7 -7
  60. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +18 -0
  61. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +4 -4
  62. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +13 -4
  63. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c +4 -4
  64. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +9 -0
  65. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c +49 -46
  66. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +217 -78
  67. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +3 -3
  68. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +10 -2
  69. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +12 -12
  70. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +40 -8
  71. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +5 -5
  72. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +20 -2
  73. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +55 -55
  74. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +289 -110
  75. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +133 -125
  76. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +656 -267
  77. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +24 -18
  78. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +96 -23
  79. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +185 -173
  80. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +860 -309
  81. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  82. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +10 -2
  83. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +44 -24
  84. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +165 -40
  85. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +72 -63
  86. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +433 -174
  87. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +33 -31
  88. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +154 -52
  89. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +5 -4
  90. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +14 -4
  91. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +89 -89
  92. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +460 -166
  93. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +76 -33
  94. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +379 -69
  95. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +2 -2
  96. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +14 -6
  97. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +5 -25
  98. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +10 -91
  99. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +5 -5
  100. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +26 -13
  101. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +70 -68
  102. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +369 -131
  103. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +94 -65
  104. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +447 -161
  105. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  106. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +27 -11
  107. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +104 -85
  108. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +378 -113
  109. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +2 -2
  110. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +3 -0
  111. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +6 -6
  112. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +30 -13
  113. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +7 -7
  114. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +43 -16
  115. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +8 -8
  116. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +58 -24
  117. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +4 -4
  118. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +14 -4
  119. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +18 -18
  120. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +100 -43
  121. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +31 -30
  122. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +171 -71
  123. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +32 -32
  124. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +196 -95
  125. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  126. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +7 -2
  127. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +53 -46
  128. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +284 -129
  129. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +56 -50
  130. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +337 -146
  131. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +13 -11
  132. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +49 -14
  133. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +4 -4
  134. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +14 -4
  135. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +5 -5
  136. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +20 -4
  137. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +33 -32
  138. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +205 -86
  139. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +34 -34
  140. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +175 -74
  141. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +56 -52
  142. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +370 -146
  143. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +27 -23
  144. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +173 -74
  145. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +362 -341
  146. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2056 -845
  147. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +11 -11
  148. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +49 -16
  149. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +56 -50
  150. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +293 -111
  151. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +3 -3
  152. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +6 -0
  153. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +3 -3
  154. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +10 -2
  155. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +5 -5
  156. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +26 -10
  157. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +5 -5
  158. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +27 -12
  159. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +17 -16
  160. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +83 -36
  161. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +2 -2
  162. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +7 -2
  163. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +8 -8
  164. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +46 -17
  165. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +9 -9
  166. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +38 -12
  167. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +7 -7
  168. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +30 -10
  169. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +2 -2
  170. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +10 -6
  171. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +15 -15
  172. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +71 -28
  173. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +25 -25
  174. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +149 -65
  175. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +8 -7
  176. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +30 -12
  177. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +9 -9
  178. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +42 -15
  179. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +173 -144
  180. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +898 -323
  181. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +51 -45
  182. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +261 -116
  183. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +13 -13
  184. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +70 -25
  185. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +80 -55
  186. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +410 -124
  187. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +5 -5
  188. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +23 -9
  189. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  190. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +44 -44
  191. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +261 -122
  192. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +8 -8
  193. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +47 -21
  194. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +32 -32
  195. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +175 -66
  196. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +4 -4
  197. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +17 -6
  198. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +8 -8
  199. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +38 -17
  200. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +8 -8
  201. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +12 -0
  202. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +7 -7
  203. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +43 -18
  204. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +3 -3
  205. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +20 -9
  206. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +3 -3
  207. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +24 -9
  208. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +2 -2
  209. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +14 -6
  210. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +8 -8
  211. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +40 -16
  212. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +9 -9
  213. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +70 -25
  214. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +5 -5
  215. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +37 -18
  216. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +12 -12
  217. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +81 -30
  218. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +16 -16
  219. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +76 -30
  220. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +20 -20
  221. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +90 -30
  222. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +7 -7
  223. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +28 -10
  224. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +2 -2
  225. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +3 -0
  226. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +5 -5
  227. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +13 -4
  228. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +9 -9
  229. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +18 -0
  230. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +4 -4
  231. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +9 -0
  232. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c +5 -5
  233. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +17 -4
  234. data/src/core/ext/upb-generated/google/api/annotations.upb.c +3 -3
  235. data/src/core/ext/upb-generated/google/api/annotations.upb.h +17 -2
  236. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +70 -66
  237. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +410 -162
  238. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +80 -74
  239. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +440 -158
  240. data/src/core/ext/upb-generated/google/api/http.upb.c +17 -17
  241. data/src/core/ext/upb-generated/google/api/http.upb.h +116 -43
  242. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +4 -4
  243. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +19 -7
  244. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +3 -3
  245. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +6 -0
  246. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +163 -162
  247. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +1157 -435
  248. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +3 -3
  249. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +10 -4
  250. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  251. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +15 -15
  252. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +108 -40
  253. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +3 -3
  254. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +10 -4
  255. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +18 -18
  256. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -0
  257. data/src/core/ext/upb-generated/google/rpc/status.upb.c +4 -4
  258. data/src/core/ext/upb-generated/google/rpc/status.upb.h +19 -7
  259. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +15 -15
  260. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +65 -22
  261. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +12 -12
  262. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +49 -12
  263. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +69 -65
  264. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +364 -149
  265. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +8 -7
  266. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +20 -4
  267. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +4 -4
  268. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -0
  269. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +31 -31
  270. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +150 -58
  271. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +11 -11
  272. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +51 -18
  273. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +175 -0
  274. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +764 -0
  275. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +22 -22
  276. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +97 -10
  277. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +6 -6
  278. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +23 -2
  279. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +3 -3
  280. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +10 -2
  281. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +6 -6
  282. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +27 -6
  283. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +5 -5
  284. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +20 -2
  285. data/src/core/ext/upb-generated/validate/validate.upb.c +261 -250
  286. data/src/core/ext/upb-generated/validate/validate.upb.h +1836 -663
  287. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +22 -22
  288. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +97 -10
  289. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +6 -6
  290. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +23 -2
  291. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c +3 -3
  292. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.h +10 -2
  293. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +18 -18
  294. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +70 -10
  295. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +5 -5
  296. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +20 -2
  297. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +2 -2
  298. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +3 -0
  299. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +8 -8
  300. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +38 -12
  301. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +5 -5
  302. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +27 -10
  303. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +3 -3
  304. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +10 -2
  305. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +5 -5
  306. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +21 -8
  307. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +10 -10
  308. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +71 -30
  309. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +5 -5
  310. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +16 -2
  311. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +12 -12
  312. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +69 -26
  313. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +43 -39
  314. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +255 -103
  315. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +4 -4
  316. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +19 -8
  317. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +9 -9
  318. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +70 -25
  319. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +3 -3
  320. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +10 -2
  321. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +50 -46
  322. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +195 -185
  323. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +16 -12
  324. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +129 -94
  325. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +10 -0
  326. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +18 -33
  327. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +0 -5
  328. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +163 -155
  329. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +5 -0
  330. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +141 -138
  331. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +26 -20
  332. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +738 -730
  333. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +271 -251
  334. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
  335. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +207 -193
  336. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +5 -0
  337. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +99 -0
  338. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +75 -0
  339. data/src/core/ext/xds/certificate_provider_store.cc +8 -0
  340. data/src/core/ext/xds/certificate_provider_store.h +9 -0
  341. data/src/core/ext/xds/xds_api.cc +20 -0
  342. data/src/core/ext/xds/xds_certificate_provider.cc +2 -0
  343. data/src/core/ext/xds/xds_certificate_provider.h +8 -0
  344. data/src/core/ext/xds/xds_client.cc +83 -93
  345. data/src/core/ext/xds/xds_client.h +11 -4
  346. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +142 -0
  347. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +79 -0
  348. data/src/core/ext/xds/xds_common_types.cc +9 -9
  349. data/src/core/ext/xds/xds_common_types.h +3 -3
  350. data/src/core/ext/xds/xds_endpoint.cc +12 -5
  351. data/src/core/ext/xds/xds_http_fault_filter.cc +1 -1
  352. data/src/core/ext/xds/xds_listener.cc +1 -1
  353. data/src/core/ext/xds/xds_route_config.cc +162 -25
  354. data/src/core/ext/xds/xds_route_config.h +13 -10
  355. data/src/core/ext/xds/xds_server_config_fetcher.cc +17 -22
  356. data/src/core/lib/avl/avl.h +68 -5
  357. data/src/core/lib/channel/call_tracer.h +4 -1
  358. data/src/core/lib/channel/channel_args.cc +138 -59
  359. data/src/core/lib/channel/channel_args.h +210 -9
  360. data/src/core/lib/channel/channel_args_preconditioning.cc +3 -9
  361. data/src/core/lib/channel/channel_args_preconditioning.h +1 -2
  362. data/src/core/lib/channel/channel_stack.h +2 -5
  363. data/src/core/lib/channel/channel_stack_builder.cc +0 -65
  364. data/src/core/lib/channel/channel_stack_builder.h +27 -6
  365. data/src/core/lib/channel/channel_stack_builder_impl.cc +102 -0
  366. data/src/core/lib/channel/channel_stack_builder_impl.h +48 -0
  367. data/src/core/lib/channel/connected_channel.h +1 -0
  368. data/src/core/lib/channel/promise_based_filter.cc +495 -162
  369. data/src/core/lib/channel/promise_based_filter.h +55 -41
  370. data/src/core/lib/compression/compression_internal.cc +1 -7
  371. data/src/core/lib/debug/stats_data.cc +2 -6
  372. data/src/core/lib/debug/stats_data.h +18 -21
  373. data/src/core/lib/gpr/tls.h +1 -0
  374. data/src/core/lib/gprpp/bitset.h +12 -0
  375. data/src/core/lib/gprpp/cpp_impl_of.h +4 -0
  376. data/src/core/lib/gprpp/match.h +73 -0
  377. data/src/core/lib/gprpp/overload.h +59 -0
  378. data/src/core/lib/gprpp/ref_counted.h +2 -0
  379. data/src/core/lib/gprpp/single_set_ptr.h +87 -0
  380. data/src/core/lib/gprpp/status_helper.cc +18 -2
  381. data/src/core/lib/gprpp/time.cc +12 -0
  382. data/src/core/lib/gprpp/time.h +1 -1
  383. data/src/core/lib/http/format_request.cc +1 -2
  384. data/src/core/lib/http/httpcli_security_connector.cc +5 -5
  385. data/src/core/lib/http/parser.cc +80 -9
  386. data/src/core/lib/http/parser.h +14 -1
  387. data/src/core/lib/iomgr/ev_posix.cc +6 -7
  388. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  389. data/src/core/lib/iomgr/port.h +0 -2
  390. data/src/core/lib/iomgr/tcp_client_posix.cc +2 -2
  391. data/src/core/lib/iomgr/tcp_posix.cc +93 -35
  392. data/src/core/lib/iomgr/tcp_server_posix.cc +26 -17
  393. data/src/core/lib/json/json_util.h +3 -3
  394. data/src/core/lib/promise/call_push_pull.h +144 -0
  395. data/src/core/lib/promise/detail/status.h +2 -1
  396. data/src/core/lib/promise/intra_activity_waiter.h +49 -0
  397. data/src/core/lib/promise/latch.h +104 -0
  398. data/src/core/lib/resource_quota/api.cc +5 -30
  399. data/src/core/lib/resource_quota/api.h +1 -1
  400. data/src/core/lib/resource_quota/resource_quota.h +8 -0
  401. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  402. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +9 -12
  403. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +5 -6
  404. data/src/core/lib/security/context/security_context.h +8 -1
  405. data/src/core/lib/security/credentials/alts/alts_credentials.cc +6 -5
  406. data/src/core/lib/security/credentials/alts/alts_credentials.h +4 -0
  407. data/src/core/lib/security/credentials/call_creds_util.cc +3 -3
  408. data/src/core/lib/security/credentials/call_creds_util.h +2 -2
  409. data/src/core/lib/security/credentials/composite/composite_credentials.cc +15 -10
  410. data/src/core/lib/security/credentials/composite/composite_credentials.h +9 -8
  411. data/src/core/lib/security/credentials/credentials.h +16 -33
  412. data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -12
  413. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -5
  414. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +4 -0
  415. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +3 -3
  416. data/src/core/lib/security/credentials/iam/iam_credentials.cc +5 -4
  417. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -2
  418. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +22 -29
  419. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +57 -0
  420. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -3
  421. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +6 -2
  422. data/src/core/lib/security/credentials/local/local_credentials.cc +6 -6
  423. data/src/core/lib/security/credentials/local/local_credentials.h +4 -0
  424. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +17 -9
  425. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +14 -6
  426. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -6
  427. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +8 -6
  428. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +6 -4
  429. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +8 -0
  430. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +49 -0
  431. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +8 -0
  432. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +42 -3
  433. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +66 -95
  434. data/src/core/lib/security/credentials/tls/tls_credentials.cc +9 -6
  435. data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -5
  436. data/src/core/lib/security/credentials/xds/xds_credentials.cc +48 -50
  437. data/src/core/lib/security/credentials/xds/xds_credentials.h +31 -5
  438. data/src/core/lib/security/security_connector/local/local_security_connector.cc +2 -2
  439. data/src/core/lib/security/security_connector/security_connector.h +9 -0
  440. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -2
  441. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -2
  442. data/src/core/lib/security/transport/auth_filters.h +7 -7
  443. data/src/core/lib/security/transport/client_auth_filter.cc +28 -20
  444. data/src/core/lib/security/transport/secure_endpoint.cc +198 -129
  445. data/src/core/lib/security/transport/secure_endpoint.h +1 -1
  446. data/src/core/lib/security/transport/security_handshaker.cc +6 -4
  447. data/src/core/lib/surface/call.cc +1023 -903
  448. data/src/core/lib/surface/call.h +0 -14
  449. data/src/core/lib/surface/channel.cc +4 -3
  450. data/src/core/lib/surface/channel_init.cc +2 -3
  451. data/src/core/lib/surface/channel_init.h +2 -6
  452. data/src/core/lib/surface/init.cc +1 -1
  453. data/src/core/lib/surface/server.cc +3 -14
  454. data/src/core/lib/surface/server.h +1 -2
  455. data/src/core/lib/surface/version.cc +2 -2
  456. data/src/core/lib/transport/byte_stream.cc +2 -0
  457. data/src/core/lib/transport/metadata_batch.h +12 -8
  458. data/src/core/lib/transport/transport.h +20 -5
  459. data/src/core/lib/transport/transport_impl.h +4 -3
  460. data/src/core/plugin_registry/grpc_plugin_registry.cc +2 -4
  461. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -2
  462. data/src/core/tsi/ssl_transport_security.cc +75 -38
  463. data/src/core/tsi/ssl_transport_security.h +8 -2
  464. data/src/core/tsi/transport_security_interface.h +2 -0
  465. data/src/ruby/ext/grpc/extconf.rb +1 -1
  466. data/src/ruby/lib/grpc/generic/active_call.rb +7 -1
  467. data/src/ruby/lib/grpc/grpc.rb +1 -1
  468. data/src/ruby/lib/grpc/version.rb +1 -1
  469. data/src/ruby/pb/generate_proto_ruby.sh +1 -0
  470. data/src/ruby/pb/test/client.rb +769 -0
  471. data/src/ruby/pb/test/server.rb +252 -0
  472. data/src/ruby/pb/test/xds_client.rb +415 -0
  473. data/third_party/upb/third_party/utf8_range/utf8_range.h +1 -1
  474. data/third_party/upb/upb/decode.c +32 -16
  475. data/third_party/upb/upb/def.c +118 -55
  476. data/third_party/upb/upb/def.h +12 -3
  477. data/third_party/upb/upb/encode.c +14 -8
  478. data/third_party/upb/upb/json_encode.c +776 -0
  479. data/third_party/upb/upb/json_encode.h +62 -0
  480. data/third_party/upb/upb/msg.c +5 -7
  481. data/third_party/upb/upb/msg.h +1 -2
  482. data/third_party/upb/upb/msg_internal.h +49 -36
  483. data/third_party/upb/upb/port_def.inc +8 -0
  484. data/third_party/upb/upb/port_undef.inc +1 -0
  485. data/third_party/upb/upb/table.c +10 -6
  486. data/third_party/upb/upb/table_internal.h +2 -0
  487. data/third_party/upb/upb/upb.h +41 -11
  488. data/third_party/zlib/crc32.c +966 -292
  489. data/third_party/zlib/crc32.h +9441 -436
  490. data/third_party/zlib/deflate.c +78 -30
  491. data/third_party/zlib/deflate.h +12 -15
  492. data/third_party/zlib/gzguts.h +3 -2
  493. data/third_party/zlib/gzlib.c +5 -3
  494. data/third_party/zlib/gzread.c +5 -7
  495. data/third_party/zlib/gzwrite.c +25 -13
  496. data/third_party/zlib/infback.c +2 -1
  497. data/third_party/zlib/inffast.c +14 -14
  498. data/third_party/zlib/inflate.c +39 -8
  499. data/third_party/zlib/inflate.h +3 -2
  500. data/third_party/zlib/inftrees.c +3 -3
  501. data/third_party/zlib/trees.c +27 -48
  502. data/third_party/zlib/zlib.h +123 -100
  503. data/third_party/zlib/zutil.c +2 -2
  504. data/third_party/zlib/zutil.h +12 -9
  505. metadata +66 -45
  506. data/src/core/ext/filters/client_idle/client_idle_filter.cc +0 -201
  507. data/src/core/ext/filters/max_age/max_age_filter.cc +0 -566
  508. data/src/core/ext/filters/max_age/max_age_filter.h +0 -26
  509. data/src/core/lib/iomgr/ev_epollex_linux.cc +0 -1657
  510. data/src/core/lib/iomgr/ev_epollex_linux.h +0 -30
  511. data/src/core/lib/iomgr/is_epollexclusive_available.cc +0 -119
  512. data/src/core/lib/iomgr/is_epollexclusive_available.h +0 -36
  513. data/src/core/lib/iomgr/sys_epoll_wrapper.h +0 -30
@@ -38,6 +38,7 @@
38
38
  #include "src/core/ext/xds/xds_channel_args.h"
39
39
  #include "src/core/ext/xds/xds_client_stats.h"
40
40
  #include "src/core/ext/xds/xds_cluster.h"
41
+ #include "src/core/ext/xds/xds_cluster_specifier_plugin.h"
41
42
  #include "src/core/ext/xds/xds_endpoint.h"
42
43
  #include "src/core/ext/xds/xds_http_filters.h"
43
44
  #include "src/core/ext/xds/xds_listener.h"
@@ -83,43 +84,6 @@ char* g_fallback_bootstrap_config ABSL_GUARDED_BY(*g_mu) = nullptr;
83
84
 
84
85
  } // namespace
85
86
 
86
- class XdsClient::Notifier {
87
- public:
88
- // Helper template function to invoke `OnError()` on a list of watchers \a
89
- // watchers_list within \a work_serializer. Works with all 4 resource types.
90
- template <class T>
91
- static void ScheduleNotifyWatchersOnErrorInWorkSerializer(
92
- XdsClient* xds_client, const T& watchers_list, grpc_error_handle error,
93
- const DebugLocation& location) {
94
- xds_client->work_serializer_.Schedule(
95
- [watchers_list, error]()
96
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client->work_serializer_) {
97
- for (const auto& p : watchers_list) {
98
- p.first->OnError(GRPC_ERROR_REF(error));
99
- }
100
- GRPC_ERROR_UNREF(error);
101
- },
102
- location);
103
- }
104
-
105
- // Helper template function to invoke `OnResourceDoesNotExist()` on a list of
106
- // watchers \a watchers_list within \a work_serializer. Works with all 4
107
- // resource types.
108
- template <class T>
109
- static void ScheduleNotifyWatchersOnResourceDoesNotExistInWorkSerializer(
110
- XdsClient* xds_client, const T& watchers_list,
111
- const DebugLocation& location) {
112
- xds_client->work_serializer_.Schedule(
113
- [watchers_list]()
114
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(&xds_client->work_serializer_) {
115
- for (const auto& p : watchers_list) {
116
- p.first->OnResourceDoesNotExist();
117
- }
118
- },
119
- location);
120
- }
121
- };
122
-
123
87
  //
124
88
  // Internal class declarations
125
89
  //
@@ -177,7 +141,8 @@ class XdsClient::ChannelState::AdsCallState
177
141
  XdsClient* xds_client() const { return chand()->xds_client(); }
178
142
  bool seen_response() const { return seen_response_; }
179
143
 
180
- void SubscribeLocked(const XdsResourceType* type, const XdsResourceName& name)
144
+ void SubscribeLocked(const XdsResourceType* type, const XdsResourceName& name,
145
+ bool delay_send)
181
146
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
182
147
  void UnsubscribeLocked(const XdsResourceType* type,
183
148
  const XdsResourceName& name, bool delay_unsubscription)
@@ -268,27 +233,23 @@ class XdsClient::ChannelState::AdsCallState
268
233
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_) {
269
234
  if (error == GRPC_ERROR_NONE && timer_pending_) {
270
235
  timer_pending_ = false;
271
- grpc_error_handle watcher_error =
272
- GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
273
- "timeout obtaining resource {type=%s name=%s} from xds server",
274
- type_->type_url(),
275
- XdsClient::ConstructFullXdsResourceName(
276
- name_.authority, type_->type_url(), name_.key)));
277
- watcher_error = grpc_error_set_int(
278
- watcher_error, GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
236
+ absl::Status watcher_error = absl::UnavailableError(absl::StrFormat(
237
+ "timeout obtaining resource {type=%s name=%s} from xds server",
238
+ type_->type_url(),
239
+ XdsClient::ConstructFullXdsResourceName(
240
+ name_.authority, type_->type_url(), name_.key)));
279
241
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
280
242
  gpr_log(GPR_INFO, "[xds_client %p] xds server %s: %s",
281
243
  ads_calld_->xds_client(),
282
244
  ads_calld_->chand()->server_.server_uri.c_str(),
283
- grpc_error_std_string(watcher_error).c_str());
245
+ watcher_error.ToString().c_str());
284
246
  }
285
247
  auto& authority_state =
286
248
  ads_calld_->xds_client()->authority_state_map_[name_.authority];
287
249
  ResourceState& state = authority_state.resource_map[type_][name_.key];
288
250
  state.meta.client_status = XdsApi::ResourceMetadata::DOES_NOT_EXIST;
289
- Notifier::ScheduleNotifyWatchersOnErrorInWorkSerializer(
290
- ads_calld_->xds_client(), state.watchers, watcher_error,
291
- DEBUG_LOCATION);
251
+ ads_calld_->xds_client()->NotifyWatchersOnErrorLocked(state.watchers,
252
+ watcher_error);
292
253
  }
293
254
  GRPC_ERROR_UNREF(error);
294
255
  }
@@ -495,7 +456,7 @@ class XdsClient::ChannelState::StateWatcher
495
456
  parent_->xds_client(), parent_->server_.server_uri.c_str(),
496
457
  status.ToString().c_str());
497
458
  parent_->xds_client_->NotifyOnErrorLocked(
498
- GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
459
+ absl::UnavailableError(absl::StrCat(
499
460
  "xds channel in TRANSIENT_FAILURE, connectivity error: ",
500
461
  status.ToString())));
501
462
  }
@@ -602,7 +563,7 @@ bool IsLameChannel(grpc_channel* channel) {
602
563
  void XdsClient::ChannelState::StartConnectivityWatchLocked() {
603
564
  if (IsLameChannel(channel_)) {
604
565
  xds_client()->NotifyOnErrorLocked(
605
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("xds client has a lame channel"));
566
+ absl::UnavailableError("xds client has a lame channel"));
606
567
  return;
607
568
  }
608
569
  ClientChannel* client_channel = ClientChannel::GetFromChannel(channel_);
@@ -637,7 +598,7 @@ void XdsClient::ChannelState::SubscribeLocked(const XdsResourceType* type,
637
598
  // because when the call is restarted it will resend all necessary requests.
638
599
  if (ads_calld() == nullptr) return;
639
600
  // Subscribe to this resource if the ADS call is active.
640
- ads_calld()->SubscribeLocked(type, name);
601
+ ads_calld()->SubscribeLocked(type, name, /*delay_send=*/false);
641
602
  }
642
603
 
643
604
  void XdsClient::ChannelState::UnsubscribeLocked(const XdsResourceType* type,
@@ -685,17 +646,11 @@ void XdsClient::ChannelState::RetryableCall<T>::Orphan() {
685
646
 
686
647
  template <typename T>
687
648
  void XdsClient::ChannelState::RetryableCall<T>::OnCallFinishedLocked() {
688
- const bool seen_response = calld_->seen_response();
649
+ // If we saw a response on the current stream, reset backoff.
650
+ if (calld_->seen_response()) backoff_.Reset();
689
651
  calld_.reset();
690
- if (seen_response) {
691
- // If we lost connection to the xds server, reset backoff and restart the
692
- // call immediately.
693
- backoff_.Reset();
694
- StartNewCallLocked();
695
- } else {
696
- // If we failed to connect to the xds server, retry later.
697
- StartRetryTimerLocked();
698
- }
652
+ // Start retry timer.
653
+ StartRetryTimerLocked();
699
654
  }
700
655
 
701
656
  template <typename T>
@@ -880,13 +835,10 @@ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
880
835
  result_.errors.emplace_back(absl::StrCat(
881
836
  "resource index ", idx, ": ", result->name,
882
837
  ": validation error: ", result->resource.status().ToString()));
883
- Notifier::ScheduleNotifyWatchersOnErrorInWorkSerializer(
884
- xds_client(), resource_state.watchers,
885
- grpc_error_set_int(
886
- GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
887
- "invalid resource: ", result->resource.status().ToString())),
888
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE),
889
- DEBUG_LOCATION);
838
+ xds_client()->NotifyWatchersOnErrorLocked(
839
+ resource_state.watchers,
840
+ absl::UnavailableError(absl::StrCat(
841
+ "invalid resource: ", result->resource.status().ToString())));
890
842
  UpdateResourceMetadataNacked(result_.version,
891
843
  result->resource.status().ToString(),
892
844
  update_time_, &resource_state.meta);
@@ -988,10 +940,13 @@ XdsClient::ChannelState::AdsCallState::AdsCallState(
988
940
  const XdsResourceType* type = t.first;
989
941
  for (const auto& r : t.second) {
990
942
  const XdsResourceKey& resource_key = r.first;
991
- SubscribeLocked(type, {authority, resource_key});
943
+ SubscribeLocked(type, {authority, resource_key}, /*delay_send=*/true);
992
944
  }
993
945
  }
994
946
  }
947
+ for (const auto& p : state_map_) {
948
+ SendMessageLocked(p.first);
949
+ }
995
950
  // Op: recv initial metadata.
996
951
  op = ops;
997
952
  op->op = GRPC_OP_RECV_INITIAL_METADATA;
@@ -1106,11 +1061,11 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked(
1106
1061
  }
1107
1062
 
1108
1063
  void XdsClient::ChannelState::AdsCallState::SubscribeLocked(
1109
- const XdsResourceType* type, const XdsResourceName& name) {
1064
+ const XdsResourceType* type, const XdsResourceName& name, bool delay_send) {
1110
1065
  auto& state = state_map_[type].subscribed_resources[name.authority][name.key];
1111
1066
  if (state == nullptr) {
1112
1067
  state = MakeOrphanable<ResourceTimer>(type, name);
1113
- SendMessageLocked(type);
1068
+ if (!delay_send) SendMessageLocked(type);
1114
1069
  }
1115
1070
  }
1116
1071
 
@@ -1204,6 +1159,7 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1204
1159
  xds_client(), chand()->server_.server_uri.c_str(),
1205
1160
  status.ToString().c_str());
1206
1161
  } else {
1162
+ seen_response_ = true;
1207
1163
  AdsResponseParser::Result result = parser.TakeResult();
1208
1164
  // Update nonce.
1209
1165
  auto& state = state_map_[result.type];
@@ -1250,16 +1206,14 @@ bool XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() {
1250
1206
  // instead.
1251
1207
  if (resource_state.resource == nullptr) continue;
1252
1208
  resource_state.resource.reset();
1253
- Notifier::
1254
- ScheduleNotifyWatchersOnResourceDoesNotExistInWorkSerializer(
1255
- xds_client(), resource_state.watchers, DEBUG_LOCATION);
1209
+ xds_client()->NotifyWatchersOnResourceDoesNotExist(
1210
+ resource_state.watchers);
1256
1211
  }
1257
1212
  }
1258
1213
  }
1259
1214
  }
1260
1215
  // If we had valid resources, update the version.
1261
1216
  if (result.have_valid_resources) {
1262
- seen_response_ = true;
1263
1217
  chand()->resource_type_version_map_[result.type] =
1264
1218
  std::move(result.version);
1265
1219
  // Start load reporting if needed.
@@ -1317,13 +1271,11 @@ void XdsClient::ChannelState::AdsCallState::OnStatusReceivedLocked(
1317
1271
  // Try to restart the call.
1318
1272
  parent_->OnCallFinishedLocked();
1319
1273
  // Send error to all watchers.
1320
- xds_client()->NotifyOnErrorLocked(
1321
- GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
1322
- "xDS call failed: xDS server: %s, ADS call status code=%d, "
1323
- "details='%s', error='%s'",
1324
- chand()->server_.server_uri, status_code_,
1325
- StringViewFromSlice(status_details_),
1326
- grpc_error_std_string(error))));
1274
+ xds_client()->NotifyOnErrorLocked(absl::UnavailableError(absl::StrFormat(
1275
+ "xDS call failed: xDS server: %s, ADS call status code=%d, "
1276
+ "details='%s', error='%s'",
1277
+ chand()->server_.server_uri, status_code_,
1278
+ StringViewFromSlice(status_details_), grpc_error_std_string(error))));
1327
1279
  }
1328
1280
  GRPC_ERROR_UNREF(error);
1329
1281
  }
@@ -1895,7 +1847,7 @@ void XdsClient::WatchResource(const XdsResourceType* type,
1895
1847
  RefCountedPtr<ResourceWatcherInterface> watcher) {
1896
1848
  ResourceWatcherInterface* w = watcher.get();
1897
1849
  // Lambda for handling failure cases.
1898
- auto fail = [&](grpc_error_handle error) mutable {
1850
+ auto fail = [&](absl::Status status) mutable {
1899
1851
  {
1900
1852
  MutexLock lock(&mu_);
1901
1853
  MaybeRegisterResourceTypeLocked(type);
@@ -1904,14 +1856,14 @@ void XdsClient::WatchResource(const XdsResourceType* type,
1904
1856
  work_serializer_.Run(
1905
1857
  // TODO(yashykt): When we move to C++14, capture watcher using
1906
1858
  // std::move()
1907
- [watcher, error]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1908
- watcher->OnError(error);
1859
+ [watcher, status]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1860
+ watcher->OnError(status);
1909
1861
  },
1910
1862
  DEBUG_LOCATION);
1911
1863
  };
1912
1864
  auto resource_name = ParseXdsResourceName(name, type);
1913
1865
  if (!resource_name.ok()) {
1914
- fail(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
1866
+ fail(absl::UnavailableError(absl::StrFormat(
1915
1867
  "Unable to parse resource name for listener %s", name)));
1916
1868
  return;
1917
1869
  }
@@ -1921,7 +1873,7 @@ void XdsClient::WatchResource(const XdsResourceType* type,
1921
1873
  if (absl::ConsumePrefix(&authority_name, "xdstp:")) {
1922
1874
  auto* authority = bootstrap_->LookupAuthority(std::string(authority_name));
1923
1875
  if (authority == nullptr) {
1924
- fail(GRPC_ERROR_CREATE_FROM_CPP_STRING(
1876
+ fail(absl::UnavailableError(
1925
1877
  absl::StrCat("authority \"", authority_name,
1926
1878
  "\" not present in bootstrap config")));
1927
1879
  return;
@@ -2202,7 +2154,13 @@ void XdsClient::ResetBackoff() {
2202
2154
  }
2203
2155
  }
2204
2156
 
2205
- void XdsClient::NotifyOnErrorLocked(grpc_error_handle error) {
2157
+ void XdsClient::NotifyOnErrorLocked(absl::Status status) {
2158
+ const auto* node = bootstrap_->node();
2159
+ if (node != nullptr) {
2160
+ status = absl::Status(
2161
+ status.code(), absl::StrCat(status.message(),
2162
+ " (node ID:", bootstrap_->node()->id, ")"));
2163
+ }
2206
2164
  std::set<RefCountedPtr<ResourceWatcherInterface>> watchers;
2207
2165
  for (const auto& a : authority_state_map_) { // authority
2208
2166
  for (const auto& t : a.second.resource_map) { // type
@@ -2216,11 +2174,41 @@ void XdsClient::NotifyOnErrorLocked(grpc_error_handle error) {
2216
2174
  work_serializer_.Schedule(
2217
2175
  // TODO(yashykt): When we move to C++14, capture watchers using
2218
2176
  // std::move()
2219
- [watchers, error]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
2177
+ [watchers, status]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
2220
2178
  for (const auto& watcher : watchers) {
2221
- watcher->OnError(GRPC_ERROR_REF(error));
2179
+ watcher->OnError(status);
2180
+ }
2181
+ },
2182
+ DEBUG_LOCATION);
2183
+ }
2184
+
2185
+ void XdsClient::NotifyWatchersOnErrorLocked(
2186
+ const std::map<ResourceWatcherInterface*,
2187
+ RefCountedPtr<ResourceWatcherInterface>>& watchers,
2188
+ absl::Status status) {
2189
+ const auto* node = bootstrap_->node();
2190
+ if (node != nullptr) {
2191
+ status = absl::Status(
2192
+ status.code(), absl::StrCat(status.message(),
2193
+ " (node ID:", bootstrap_->node()->id, ")"));
2194
+ }
2195
+ work_serializer_.Schedule(
2196
+ [watchers, status]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
2197
+ for (const auto& p : watchers) {
2198
+ p.first->OnError(status);
2199
+ }
2200
+ },
2201
+ DEBUG_LOCATION);
2202
+ }
2203
+
2204
+ void XdsClient::NotifyWatchersOnResourceDoesNotExist(
2205
+ const std::map<ResourceWatcherInterface*,
2206
+ RefCountedPtr<ResourceWatcherInterface>>& watchers) {
2207
+ work_serializer_.Schedule(
2208
+ [watchers]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
2209
+ for (const auto& p : watchers) {
2210
+ p.first->OnResourceDoesNotExist();
2222
2211
  }
2223
- GRPC_ERROR_UNREF(error);
2224
2212
  },
2225
2213
  DEBUG_LOCATION);
2226
2214
  }
@@ -2338,6 +2326,7 @@ std::string XdsClient::DumpClientConfigBinary() {
2338
2326
  void XdsClientGlobalInit() {
2339
2327
  g_mu = new Mutex;
2340
2328
  XdsHttpFilterRegistry::Init();
2329
+ XdsClusterSpecifierPluginRegistry::Init();
2341
2330
  }
2342
2331
 
2343
2332
  // TODO(roth): Find a better way to clear the fallback config that does
@@ -2348,6 +2337,7 @@ void XdsClientGlobalShutdown() ABSL_NO_THREAD_SAFETY_ANALYSIS {
2348
2337
  delete g_mu;
2349
2338
  g_mu = nullptr;
2350
2339
  XdsHttpFilterRegistry::Shutdown();
2340
+ XdsClusterSpecifierPluginRegistry::Shutdown();
2351
2341
  }
2352
2342
 
2353
2343
  namespace {
@@ -55,7 +55,7 @@ class XdsClient : public DualRefCounted<XdsClient> {
55
55
  virtual void OnGenericResourceChanged(
56
56
  const XdsResourceType::ResourceData* resource)
57
57
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
58
- virtual void OnError(grpc_error_handle error)
58
+ virtual void OnError(absl::Status status)
59
59
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
60
60
  virtual void OnResourceDoesNotExist()
61
61
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) = 0;
@@ -266,11 +266,18 @@ class XdsClient : public DualRefCounted<XdsClient> {
266
266
  LoadReportMap load_report_map;
267
267
  };
268
268
 
269
- class Notifier;
270
-
271
269
  // Sends an error notification to all watchers.
272
- void NotifyOnErrorLocked(grpc_error_handle error)
270
+ void NotifyOnErrorLocked(absl::Status status)
273
271
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
272
+ // Sends an error notification to a specific set of watchers.
273
+ void NotifyWatchersOnErrorLocked(
274
+ const std::map<ResourceWatcherInterface*,
275
+ RefCountedPtr<ResourceWatcherInterface>>& watchers,
276
+ absl::Status status);
277
+ // Sends a resource-does-not-exist notification to a specific set of watchers.
278
+ void NotifyWatchersOnResourceDoesNotExist(
279
+ const std::map<ResourceWatcherInterface*,
280
+ RefCountedPtr<ResourceWatcherInterface>>& watchers);
274
281
 
275
282
  void MaybeRegisterResourceTypeLocked(const XdsResourceType* resource_type)
276
283
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
@@ -0,0 +1,142 @@
1
+ //
2
+ // Copyright 2022 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include "src/core/ext/xds/xds_cluster_specifier_plugin.h"
20
+
21
+ #include "absl/strings/str_format.h"
22
+ #include "envoy/extensions/filters/http/router/v3/router.upb.h"
23
+ #include "envoy/extensions/filters/http/router/v3/router.upbdefs.h"
24
+ #include "google/protobuf/duration.upb.h"
25
+ #include "upb/json_encode.h"
26
+
27
+ #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
28
+ #include "src/core/ext/xds/upb_utils.h"
29
+ #include "src/proto/grpc/lookup/v1/rls_config.upb.h"
30
+ #include "src/proto/grpc/lookup/v1/rls_config.upbdefs.h"
31
+
32
+ namespace grpc_core {
33
+
34
+ const char* kXdsRouteLookupClusterSpecifierPluginConfigName =
35
+ "grpc.lookup.v1.RouteLookupClusterSpecifier";
36
+
37
+ void XdsRouteLookupClusterSpecifierPlugin::PopulateSymtab(
38
+ upb_DefPool* symtab) const {
39
+ grpc_lookup_v1_RouteLookupConfig_getmsgdef(symtab);
40
+ }
41
+
42
+ absl::StatusOr<std::string>
43
+ XdsRouteLookupClusterSpecifierPlugin::GenerateLoadBalancingPolicyConfig(
44
+ upb_StringView serialized_plugin_config, upb_Arena* arena,
45
+ upb_DefPool* symtab) const {
46
+ const auto* specifier = grpc_lookup_v1_RouteLookupClusterSpecifier_parse(
47
+ serialized_plugin_config.data, serialized_plugin_config.size, arena);
48
+ if (specifier == nullptr) {
49
+ return absl::InvalidArgumentError("Could not parse plugin config");
50
+ }
51
+ const auto* plugin_config =
52
+ grpc_lookup_v1_RouteLookupClusterSpecifier_route_lookup_config(specifier);
53
+ if (plugin_config == nullptr) {
54
+ return absl::InvalidArgumentError(
55
+ "Could not get route lookup config from route lookup cluster "
56
+ "specifier");
57
+ }
58
+ upb::Status status;
59
+ const upb_MessageDef* msg_type =
60
+ grpc_lookup_v1_RouteLookupConfig_getmsgdef(symtab);
61
+ size_t json_size = upb_JsonEncode(plugin_config, msg_type, symtab, 0, nullptr,
62
+ 0, status.ptr());
63
+ if (json_size == static_cast<size_t>(-1)) {
64
+ return absl::InvalidArgumentError(
65
+ absl::StrCat("failed to dump proto to JSON: ",
66
+ upb_Status_ErrorMessage(status.ptr())));
67
+ }
68
+ void* buf = upb_Arena_Malloc(arena, json_size + 1);
69
+ upb_JsonEncode(plugin_config, msg_type, symtab, 0,
70
+ reinterpret_cast<char*>(buf), json_size + 1, status.ptr());
71
+ Json::Object rls_policy;
72
+ grpc_error_handle error = GRPC_ERROR_NONE;
73
+ rls_policy["routeLookupConfig"] =
74
+ Json::Parse(reinterpret_cast<char*>(buf), &error);
75
+ GPR_ASSERT(error == GRPC_ERROR_NONE);
76
+ Json::Object cds_policy;
77
+ cds_policy["cds_experimental"] = Json::Object();
78
+ Json::Array child_policy;
79
+ child_policy.emplace_back(std::move(cds_policy));
80
+ rls_policy["childPolicy"] = std::move(child_policy);
81
+ rls_policy["childPolicyConfigTargetFieldName"] = "cluster";
82
+ Json::Object policy;
83
+ policy["rls_experimental"] = std::move(rls_policy);
84
+ Json::Array policies;
85
+ policies.emplace_back(std::move(policy));
86
+ Json lb_policy_config(std::move(policies));
87
+ grpc_error_handle parse_error = GRPC_ERROR_NONE;
88
+ // TODO(roth): If/when we ever add a second plugin, refactor this code
89
+ // somehow such that we automatically validate the resulting config against
90
+ // the gRPC LB policy registry instead of requiring each plugin to do that
91
+ // itself.
92
+ LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(lb_policy_config,
93
+ &parse_error);
94
+ if (parse_error != GRPC_ERROR_NONE) {
95
+ absl::Status status = absl::InvalidArgumentError(absl::StrCat(
96
+ kXdsRouteLookupClusterSpecifierPluginConfigName,
97
+ " ClusterSpecifierPlugin returned invalid LB policy config: ",
98
+ grpc_error_std_string(parse_error)));
99
+ GRPC_ERROR_UNREF(parse_error);
100
+ return status;
101
+ }
102
+ return lb_policy_config.Dump();
103
+ }
104
+
105
+ namespace {
106
+
107
+ using PluginRegistryMap =
108
+ std::map<absl::string_view, std::unique_ptr<XdsClusterSpecifierPluginImpl>>;
109
+
110
+ PluginRegistryMap* g_plugin_registry = nullptr;
111
+
112
+ } // namespace
113
+
114
+ const XdsClusterSpecifierPluginImpl*
115
+ XdsClusterSpecifierPluginRegistry::GetPluginForType(
116
+ absl::string_view config_proto_type_name) {
117
+ auto it = g_plugin_registry->find(config_proto_type_name);
118
+ if (it == g_plugin_registry->end()) return nullptr;
119
+ return it->second.get();
120
+ }
121
+
122
+ void XdsClusterSpecifierPluginRegistry::PopulateSymtab(upb_DefPool* symtab) {
123
+ for (const auto& p : *g_plugin_registry) {
124
+ p.second->PopulateSymtab(symtab);
125
+ }
126
+ }
127
+
128
+ void XdsClusterSpecifierPluginRegistry::RegisterPlugin(
129
+ std::unique_ptr<XdsClusterSpecifierPluginImpl> plugin,
130
+ absl::string_view config_proto_type_name) {
131
+ (*g_plugin_registry)[config_proto_type_name] = std::move(plugin);
132
+ }
133
+
134
+ void XdsClusterSpecifierPluginRegistry::Init() {
135
+ g_plugin_registry = new PluginRegistryMap;
136
+ RegisterPlugin(absl::make_unique<XdsRouteLookupClusterSpecifierPlugin>(),
137
+ kXdsRouteLookupClusterSpecifierPluginConfigName);
138
+ }
139
+
140
+ void XdsClusterSpecifierPluginRegistry::Shutdown() { delete g_plugin_registry; }
141
+
142
+ } // namespace grpc_core
@@ -0,0 +1,79 @@
1
+ //
2
+ // Copyright 2022 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #ifndef GRPC_CORE_EXT_XDS_XDS_CLUSTER_SPECIFIER_PLUGIN_H
18
+ #define GRPC_CORE_EXT_XDS_XDS_CLUSTER_SPECIFIER_PLUGIN_H
19
+
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include <memory>
23
+ #include <set>
24
+ #include <string>
25
+
26
+ #include "absl/status/statusor.h"
27
+ #include "absl/strings/str_cat.h"
28
+ #include "absl/strings/string_view.h"
29
+ #include "google/protobuf/any.upb.h"
30
+ #include "upb/def.h"
31
+
32
+ #include <grpc/grpc.h>
33
+
34
+ #include "src/core/lib/channel/channel_stack.h"
35
+ #include "src/core/lib/json/json.h"
36
+
37
+ namespace grpc_core {
38
+
39
+ class XdsClusterSpecifierPluginImpl {
40
+ public:
41
+ virtual ~XdsClusterSpecifierPluginImpl() = default;
42
+
43
+ // Loads the proto message into the upb symtab.
44
+ virtual void PopulateSymtab(upb_DefPool* symtab) const = 0;
45
+
46
+ // Returns the LB policy config in JSON form.
47
+ virtual absl::StatusOr<std::string> GenerateLoadBalancingPolicyConfig(
48
+ upb_StringView serialized_plugin_config, upb_Arena* arena,
49
+ upb_DefPool* symtab) const = 0;
50
+ };
51
+
52
+ class XdsRouteLookupClusterSpecifierPlugin
53
+ : public XdsClusterSpecifierPluginImpl {
54
+ void PopulateSymtab(upb_DefPool* symtab) const override;
55
+
56
+ absl::StatusOr<std::string> GenerateLoadBalancingPolicyConfig(
57
+ upb_StringView serialized_plugin_config, upb_Arena* arena,
58
+ upb_DefPool* symtab) const override;
59
+ };
60
+
61
+ class XdsClusterSpecifierPluginRegistry {
62
+ public:
63
+ static void RegisterPlugin(
64
+ std::unique_ptr<XdsClusterSpecifierPluginImpl> plugin,
65
+ absl::string_view config_proto_type_name);
66
+
67
+ static void PopulateSymtab(upb_DefPool* symtab);
68
+
69
+ static const XdsClusterSpecifierPluginImpl* GetPluginForType(
70
+ absl::string_view config_proto_type_name);
71
+
72
+ // Global init and shutdown.
73
+ static void Init();
74
+ static void Shutdown();
75
+ };
76
+
77
+ } // namespace grpc_core
78
+
79
+ #endif // GRPC_CORE_EXT_XDS_XDS_CLUSTER_SPECIFIER_PLUGIN_H
@@ -365,23 +365,23 @@ grpc_error_handle CommonTlsContext::Parse(
365
365
  &errors);
366
366
  }
367
367
 
368
- grpc_error_handle ExtractHttpFilterTypeName(const XdsEncodingContext& context,
369
- const google_protobuf_Any* any,
370
- absl::string_view* filter_type) {
371
- *filter_type = UpbStringToAbsl(google_protobuf_Any_type_url(any));
372
- if (*filter_type == "type.googleapis.com/xds.type.v3.TypedStruct" ||
373
- *filter_type == "type.googleapis.com/udpa.type.v1.TypedStruct") {
368
+ grpc_error_handle ExtractExtensionTypeName(const XdsEncodingContext& context,
369
+ const google_protobuf_Any* any,
370
+ absl::string_view* extension_type) {
371
+ *extension_type = UpbStringToAbsl(google_protobuf_Any_type_url(any));
372
+ if (*extension_type == "type.googleapis.com/xds.type.v3.TypedStruct" ||
373
+ *extension_type == "type.googleapis.com/udpa.type.v1.TypedStruct") {
374
374
  upb_StringView any_value = google_protobuf_Any_value(any);
375
375
  const auto* typed_struct = xds_type_v3_TypedStruct_parse(
376
376
  any_value.data, any_value.size, context.arena);
377
377
  if (typed_struct == nullptr) {
378
378
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
379
- "could not parse TypedStruct from filter config");
379
+ "could not parse TypedStruct from extension");
380
380
  }
381
- *filter_type =
381
+ *extension_type =
382
382
  UpbStringToAbsl(xds_type_v3_TypedStruct_type_url(typed_struct));
383
383
  }
384
- *filter_type = absl::StripPrefix(*filter_type, "type.googleapis.com/");
384
+ *extension_type = absl::StripPrefix(*extension_type, "type.googleapis.com/");
385
385
  return GRPC_ERROR_NONE;
386
386
  }
387
387
 
@@ -86,9 +86,9 @@ struct CommonTlsContext {
86
86
  CommonTlsContext* common_tls_context);
87
87
  };
88
88
 
89
- grpc_error_handle ExtractHttpFilterTypeName(const XdsEncodingContext& context,
90
- const google_protobuf_Any* any,
91
- absl::string_view* filter_type);
89
+ grpc_error_handle ExtractExtensionTypeName(const XdsEncodingContext& context,
90
+ const google_protobuf_Any* any,
91
+ absl::string_view* extension_type);
92
92
 
93
93
  } // namespace grpc_core
94
94