grpc 1.45.0 → 1.46.3

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 (515) 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_bootstrap.cc +2 -2
  343. data/src/core/ext/xds/xds_bootstrap.h +2 -0
  344. data/src/core/ext/xds/xds_certificate_provider.cc +2 -0
  345. data/src/core/ext/xds/xds_certificate_provider.h +8 -0
  346. data/src/core/ext/xds/xds_client.cc +87 -95
  347. data/src/core/ext/xds/xds_client.h +13 -5
  348. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +142 -0
  349. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +79 -0
  350. data/src/core/ext/xds/xds_common_types.cc +9 -9
  351. data/src/core/ext/xds/xds_common_types.h +3 -3
  352. data/src/core/ext/xds/xds_endpoint.cc +12 -5
  353. data/src/core/ext/xds/xds_http_fault_filter.cc +1 -1
  354. data/src/core/ext/xds/xds_listener.cc +1 -1
  355. data/src/core/ext/xds/xds_route_config.cc +162 -25
  356. data/src/core/ext/xds/xds_route_config.h +13 -10
  357. data/src/core/ext/xds/xds_server_config_fetcher.cc +17 -22
  358. data/src/core/lib/avl/avl.h +68 -5
  359. data/src/core/lib/channel/call_tracer.h +4 -1
  360. data/src/core/lib/channel/channel_args.cc +138 -59
  361. data/src/core/lib/channel/channel_args.h +210 -9
  362. data/src/core/lib/channel/channel_args_preconditioning.cc +3 -9
  363. data/src/core/lib/channel/channel_args_preconditioning.h +1 -2
  364. data/src/core/lib/channel/channel_stack.h +2 -5
  365. data/src/core/lib/channel/channel_stack_builder.cc +0 -65
  366. data/src/core/lib/channel/channel_stack_builder.h +27 -6
  367. data/src/core/lib/channel/channel_stack_builder_impl.cc +102 -0
  368. data/src/core/lib/channel/channel_stack_builder_impl.h +48 -0
  369. data/src/core/lib/channel/connected_channel.h +1 -0
  370. data/src/core/lib/channel/promise_based_filter.cc +495 -162
  371. data/src/core/lib/channel/promise_based_filter.h +55 -41
  372. data/src/core/lib/compression/compression_internal.cc +1 -7
  373. data/src/core/lib/debug/stats_data.cc +2 -6
  374. data/src/core/lib/debug/stats_data.h +18 -21
  375. data/src/core/lib/gpr/tls.h +1 -0
  376. data/src/core/lib/gprpp/bitset.h +12 -0
  377. data/src/core/lib/gprpp/cpp_impl_of.h +4 -0
  378. data/src/core/lib/gprpp/match.h +73 -0
  379. data/src/core/lib/gprpp/overload.h +59 -0
  380. data/src/core/lib/gprpp/ref_counted.h +2 -0
  381. data/src/core/lib/gprpp/single_set_ptr.h +87 -0
  382. data/src/core/lib/gprpp/status_helper.cc +18 -2
  383. data/src/core/lib/gprpp/time.cc +12 -0
  384. data/src/core/lib/gprpp/time.h +1 -1
  385. data/src/core/lib/http/format_request.cc +1 -2
  386. data/src/core/lib/http/httpcli_security_connector.cc +5 -5
  387. data/src/core/lib/http/parser.cc +80 -9
  388. data/src/core/lib/http/parser.h +14 -1
  389. data/src/core/lib/iomgr/ev_posix.cc +6 -7
  390. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  391. data/src/core/lib/iomgr/port.h +0 -2
  392. data/src/core/lib/iomgr/tcp_client_posix.cc +2 -2
  393. data/src/core/lib/iomgr/tcp_posix.cc +93 -35
  394. data/src/core/lib/iomgr/tcp_server_posix.cc +26 -17
  395. data/src/core/lib/json/json_util.h +3 -3
  396. data/src/core/lib/promise/call_push_pull.h +144 -0
  397. data/src/core/lib/promise/detail/status.h +2 -1
  398. data/src/core/lib/promise/intra_activity_waiter.h +49 -0
  399. data/src/core/lib/promise/latch.h +104 -0
  400. data/src/core/lib/resource_quota/api.cc +5 -30
  401. data/src/core/lib/resource_quota/api.h +1 -1
  402. data/src/core/lib/resource_quota/resource_quota.h +8 -0
  403. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  404. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +9 -12
  405. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +5 -6
  406. data/src/core/lib/security/context/security_context.h +8 -1
  407. data/src/core/lib/security/credentials/alts/alts_credentials.cc +6 -5
  408. data/src/core/lib/security/credentials/alts/alts_credentials.h +4 -0
  409. data/src/core/lib/security/credentials/call_creds_util.cc +3 -3
  410. data/src/core/lib/security/credentials/call_creds_util.h +2 -2
  411. data/src/core/lib/security/credentials/composite/composite_credentials.cc +15 -10
  412. data/src/core/lib/security/credentials/composite/composite_credentials.h +9 -8
  413. data/src/core/lib/security/credentials/credentials.h +16 -33
  414. data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -12
  415. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -5
  416. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +4 -0
  417. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +3 -3
  418. data/src/core/lib/security/credentials/iam/iam_credentials.cc +5 -4
  419. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -2
  420. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +22 -29
  421. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +57 -0
  422. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -3
  423. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +6 -2
  424. data/src/core/lib/security/credentials/local/local_credentials.cc +6 -6
  425. data/src/core/lib/security/credentials/local/local_credentials.h +4 -0
  426. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +17 -9
  427. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +14 -6
  428. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -6
  429. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +8 -6
  430. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +6 -4
  431. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +8 -0
  432. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +49 -0
  433. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +8 -0
  434. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +42 -3
  435. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +66 -95
  436. data/src/core/lib/security/credentials/tls/tls_credentials.cc +9 -6
  437. data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -5
  438. data/src/core/lib/security/credentials/xds/xds_credentials.cc +48 -50
  439. data/src/core/lib/security/credentials/xds/xds_credentials.h +31 -5
  440. data/src/core/lib/security/security_connector/local/local_security_connector.cc +2 -2
  441. data/src/core/lib/security/security_connector/security_connector.h +9 -0
  442. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -2
  443. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -2
  444. data/src/core/lib/security/transport/auth_filters.h +7 -7
  445. data/src/core/lib/security/transport/client_auth_filter.cc +28 -20
  446. data/src/core/lib/security/transport/secure_endpoint.cc +198 -129
  447. data/src/core/lib/security/transport/secure_endpoint.h +1 -1
  448. data/src/core/lib/security/transport/security_handshaker.cc +6 -4
  449. data/src/core/lib/surface/call.cc +1023 -903
  450. data/src/core/lib/surface/call.h +0 -14
  451. data/src/core/lib/surface/channel.cc +4 -3
  452. data/src/core/lib/surface/channel_init.cc +2 -3
  453. data/src/core/lib/surface/channel_init.h +2 -6
  454. data/src/core/lib/surface/init.cc +1 -1
  455. data/src/core/lib/surface/server.cc +3 -14
  456. data/src/core/lib/surface/server.h +1 -2
  457. data/src/core/lib/surface/version.cc +2 -2
  458. data/src/core/lib/transport/byte_stream.cc +2 -0
  459. data/src/core/lib/transport/metadata_batch.h +12 -8
  460. data/src/core/lib/transport/transport.h +20 -5
  461. data/src/core/lib/transport/transport_impl.h +4 -3
  462. data/src/core/plugin_registry/grpc_plugin_registry.cc +2 -4
  463. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -2
  464. data/src/core/tsi/ssl_transport_security.cc +75 -38
  465. data/src/core/tsi/ssl_transport_security.h +8 -2
  466. data/src/core/tsi/transport_security_interface.h +2 -0
  467. data/src/ruby/ext/grpc/extconf.rb +1 -1
  468. data/src/ruby/lib/grpc/generic/active_call.rb +7 -1
  469. data/src/ruby/lib/grpc/grpc.rb +1 -1
  470. data/src/ruby/lib/grpc/version.rb +1 -1
  471. data/src/ruby/pb/generate_proto_ruby.sh +1 -0
  472. data/src/ruby/pb/test/client.rb +769 -0
  473. data/src/ruby/pb/test/server.rb +252 -0
  474. data/src/ruby/pb/test/xds_client.rb +415 -0
  475. data/third_party/upb/third_party/utf8_range/utf8_range.h +1 -1
  476. data/third_party/upb/upb/decode.c +32 -16
  477. data/third_party/upb/upb/def.c +118 -55
  478. data/third_party/upb/upb/def.h +12 -3
  479. data/third_party/upb/upb/encode.c +14 -8
  480. data/third_party/upb/upb/json_encode.c +776 -0
  481. data/third_party/upb/upb/json_encode.h +62 -0
  482. data/third_party/upb/upb/msg.c +5 -7
  483. data/third_party/upb/upb/msg.h +1 -2
  484. data/third_party/upb/upb/msg_internal.h +49 -36
  485. data/third_party/upb/upb/port_def.inc +8 -0
  486. data/third_party/upb/upb/port_undef.inc +1 -0
  487. data/third_party/upb/upb/table.c +10 -6
  488. data/third_party/upb/upb/table_internal.h +2 -0
  489. data/third_party/upb/upb/upb.h +41 -11
  490. data/third_party/zlib/crc32.c +966 -292
  491. data/third_party/zlib/crc32.h +9441 -436
  492. data/third_party/zlib/deflate.c +78 -30
  493. data/third_party/zlib/deflate.h +12 -15
  494. data/third_party/zlib/gzguts.h +3 -2
  495. data/third_party/zlib/gzlib.c +5 -3
  496. data/third_party/zlib/gzread.c +5 -7
  497. data/third_party/zlib/gzwrite.c +25 -13
  498. data/third_party/zlib/infback.c +2 -1
  499. data/third_party/zlib/inffast.c +14 -14
  500. data/third_party/zlib/inflate.c +39 -8
  501. data/third_party/zlib/inflate.h +3 -2
  502. data/third_party/zlib/inftrees.c +3 -3
  503. data/third_party/zlib/trees.c +27 -48
  504. data/third_party/zlib/zlib.h +123 -100
  505. data/third_party/zlib/zutil.c +2 -2
  506. data/third_party/zlib/zutil.h +12 -9
  507. metadata +66 -45
  508. data/src/core/ext/filters/client_idle/client_idle_filter.cc +0 -201
  509. data/src/core/ext/filters/max_age/max_age_filter.cc +0 -566
  510. data/src/core/ext/filters/max_age/max_age_filter.h +0 -26
  511. data/src/core/lib/iomgr/ev_epollex_linux.cc +0 -1657
  512. data/src/core/lib/iomgr/ev_epollex_linux.h +0 -30
  513. data/src/core/lib/iomgr/is_epollexclusive_available.cc +0 -119
  514. data/src/core/lib/iomgr/is_epollexclusive_available.h +0 -36
  515. 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>
@@ -833,7 +788,7 @@ void XdsClient::ChannelState::AdsCallState::AdsResponseParser::ParseResource(
833
788
  }
834
789
  // Check the resource name.
835
790
  auto resource_name =
836
- XdsClient::ParseXdsResourceName(result->name, result_.type);
791
+ xds_client()->ParseXdsResourceName(result->name, result_.type);
837
792
  if (!resource_name.ok()) {
838
793
  result_.errors.emplace_back(absl::StrCat(
839
794
  "resource index ", idx, ": Cannot parse xDS resource name \"",
@@ -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
  }
@@ -1836,6 +1788,7 @@ XdsClient::XdsClient(std::unique_ptr<XdsBootstrap> bootstrap,
1836
1788
  bootstrap_(std::move(bootstrap)),
1837
1789
  args_(ModifyChannelArgs(args)),
1838
1790
  request_timeout_(GetRequestTimeout(args)),
1791
+ xds_federation_enabled_(XdsFederationEnabled()),
1839
1792
  interested_parties_(grpc_pollset_set_create()),
1840
1793
  certificate_provider_store_(MakeOrphanable<CertificateProviderStore>(
1841
1794
  bootstrap_->certificate_providers())),
@@ -1895,7 +1848,7 @@ void XdsClient::WatchResource(const XdsResourceType* type,
1895
1848
  RefCountedPtr<ResourceWatcherInterface> watcher) {
1896
1849
  ResourceWatcherInterface* w = watcher.get();
1897
1850
  // Lambda for handling failure cases.
1898
- auto fail = [&](grpc_error_handle error) mutable {
1851
+ auto fail = [&](absl::Status status) mutable {
1899
1852
  {
1900
1853
  MutexLock lock(&mu_);
1901
1854
  MaybeRegisterResourceTypeLocked(type);
@@ -1904,14 +1857,14 @@ void XdsClient::WatchResource(const XdsResourceType* type,
1904
1857
  work_serializer_.Run(
1905
1858
  // TODO(yashykt): When we move to C++14, capture watcher using
1906
1859
  // std::move()
1907
- [watcher, error]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1908
- watcher->OnError(error);
1860
+ [watcher, status]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
1861
+ watcher->OnError(status);
1909
1862
  },
1910
1863
  DEBUG_LOCATION);
1911
1864
  };
1912
1865
  auto resource_name = ParseXdsResourceName(name, type);
1913
1866
  if (!resource_name.ok()) {
1914
- fail(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
1867
+ fail(absl::UnavailableError(absl::StrFormat(
1915
1868
  "Unable to parse resource name for listener %s", name)));
1916
1869
  return;
1917
1870
  }
@@ -1921,7 +1874,7 @@ void XdsClient::WatchResource(const XdsResourceType* type,
1921
1874
  if (absl::ConsumePrefix(&authority_name, "xdstp:")) {
1922
1875
  auto* authority = bootstrap_->LookupAuthority(std::string(authority_name));
1923
1876
  if (authority == nullptr) {
1924
- fail(GRPC_ERROR_CREATE_FROM_CPP_STRING(
1877
+ fail(absl::UnavailableError(
1925
1878
  absl::StrCat("authority \"", authority_name,
1926
1879
  "\" not present in bootstrap config")));
1927
1880
  return;
@@ -1978,6 +1931,7 @@ void XdsClient::CancelResourceWatch(const XdsResourceType* type,
1978
1931
  }
1979
1932
  if (shutting_down_) return;
1980
1933
  // Find authority.
1934
+ if (!resource_name.ok()) return;
1981
1935
  auto authority_it = authority_state_map_.find(resource_name->authority);
1982
1936
  if (authority_it == authority_state_map_.end()) return;
1983
1937
  AuthorityState& authority_state = authority_it->second;
@@ -2030,7 +1984,7 @@ absl::StatusOr<XdsClient::XdsResourceName> XdsClient::ParseXdsResourceName(
2030
1984
  absl::string_view name, const XdsResourceType* type) {
2031
1985
  // Old-style names use the empty string for authority.
2032
1986
  // authority is prefixed with "old:" to indicate that it's an old-style name.
2033
- if (!absl::StartsWith(name, "xdstp:")) {
1987
+ if (!xds_federation_enabled_ || !absl::StartsWith(name, "xdstp:")) {
2034
1988
  return XdsResourceName{"old:", {std::string(name), {}}};
2035
1989
  }
2036
1990
  // New style name. Parse URI.
@@ -2202,7 +2156,13 @@ void XdsClient::ResetBackoff() {
2202
2156
  }
2203
2157
  }
2204
2158
 
2205
- void XdsClient::NotifyOnErrorLocked(grpc_error_handle error) {
2159
+ void XdsClient::NotifyOnErrorLocked(absl::Status status) {
2160
+ const auto* node = bootstrap_->node();
2161
+ if (node != nullptr) {
2162
+ status = absl::Status(
2163
+ status.code(), absl::StrCat(status.message(),
2164
+ " (node ID:", bootstrap_->node()->id, ")"));
2165
+ }
2206
2166
  std::set<RefCountedPtr<ResourceWatcherInterface>> watchers;
2207
2167
  for (const auto& a : authority_state_map_) { // authority
2208
2168
  for (const auto& t : a.second.resource_map) { // type
@@ -2216,11 +2176,41 @@ void XdsClient::NotifyOnErrorLocked(grpc_error_handle error) {
2216
2176
  work_serializer_.Schedule(
2217
2177
  // TODO(yashykt): When we move to C++14, capture watchers using
2218
2178
  // std::move()
2219
- [watchers, error]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
2179
+ [watchers, status]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(work_serializer_) {
2220
2180
  for (const auto& watcher : watchers) {
2221
- watcher->OnError(GRPC_ERROR_REF(error));
2181
+ watcher->OnError(status);
2182
+ }
2183
+ },
2184
+ DEBUG_LOCATION);
2185
+ }
2186
+
2187
+ void XdsClient::NotifyWatchersOnErrorLocked(
2188
+ const std::map<ResourceWatcherInterface*,
2189
+ RefCountedPtr<ResourceWatcherInterface>>& watchers,
2190
+ absl::Status status) {
2191
+ const auto* node = bootstrap_->node();
2192
+ if (node != nullptr) {
2193
+ status = absl::Status(
2194
+ status.code(), absl::StrCat(status.message(),
2195
+ " (node ID:", bootstrap_->node()->id, ")"));
2196
+ }
2197
+ work_serializer_.Schedule(
2198
+ [watchers, status]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
2199
+ for (const auto& p : watchers) {
2200
+ p.first->OnError(status);
2201
+ }
2202
+ },
2203
+ DEBUG_LOCATION);
2204
+ }
2205
+
2206
+ void XdsClient::NotifyWatchersOnResourceDoesNotExist(
2207
+ const std::map<ResourceWatcherInterface*,
2208
+ RefCountedPtr<ResourceWatcherInterface>>& watchers) {
2209
+ work_serializer_.Schedule(
2210
+ [watchers]() ABSL_EXCLUSIVE_LOCKS_REQUIRED(&work_serializer_) {
2211
+ for (const auto& p : watchers) {
2212
+ p.first->OnResourceDoesNotExist();
2222
2213
  }
2223
- GRPC_ERROR_UNREF(error);
2224
2214
  },
2225
2215
  DEBUG_LOCATION);
2226
2216
  }
@@ -2338,6 +2328,7 @@ std::string XdsClient::DumpClientConfigBinary() {
2338
2328
  void XdsClientGlobalInit() {
2339
2329
  g_mu = new Mutex;
2340
2330
  XdsHttpFilterRegistry::Init();
2331
+ XdsClusterSpecifierPluginRegistry::Init();
2341
2332
  }
2342
2333
 
2343
2334
  // TODO(roth): Find a better way to clear the fallback config that does
@@ -2348,6 +2339,7 @@ void XdsClientGlobalShutdown() ABSL_NO_THREAD_SAFETY_ANALYSIS {
2348
2339
  delete g_mu;
2349
2340
  g_mu = nullptr;
2350
2341
  XdsHttpFilterRegistry::Shutdown();
2342
+ XdsClusterSpecifierPluginRegistry::Shutdown();
2351
2343
  }
2352
2344
 
2353
2345
  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_);
@@ -279,7 +286,7 @@ class XdsClient : public DualRefCounted<XdsClient> {
279
286
  const XdsResourceType* GetResourceTypeLocked(absl::string_view resource_type)
280
287
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
281
288
 
282
- static absl::StatusOr<XdsResourceName> ParseXdsResourceName(
289
+ absl::StatusOr<XdsResourceName> ParseXdsResourceName(
283
290
  absl::string_view name, const XdsResourceType* type);
284
291
  static std::string ConstructFullXdsResourceName(
285
292
  absl::string_view authority, absl::string_view resource_type,
@@ -295,6 +302,7 @@ class XdsClient : public DualRefCounted<XdsClient> {
295
302
  std::unique_ptr<XdsBootstrap> bootstrap_;
296
303
  grpc_channel_args* args_;
297
304
  const Duration request_timeout_;
305
+ const bool xds_federation_enabled_;
298
306
  grpc_pollset_set* interested_parties_;
299
307
  OrphanablePtr<CertificateProviderStore> certificate_provider_store_;
300
308
  XdsApi api_;
@@ -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