grpc 1.31.0.pre1 → 1.33.0.pre1

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 (614) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +693 -16022
  3. data/include/grpc/grpc.h +0 -5
  4. data/include/grpc/grpc_security.h +47 -14
  5. data/include/grpc/impl/codegen/README.md +22 -0
  6. data/include/grpc/impl/codegen/grpc_types.h +0 -5
  7. data/include/grpc/impl/codegen/port_platform.h +6 -1
  8. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -2
  9. data/src/core/ext/filters/client_channel/client_channel.cc +264 -186
  10. data/src/core/ext/filters/client_channel/client_channel.h +1 -1
  11. data/src/core/ext/filters/client_channel/client_channel_channelz.h +0 -3
  12. data/src/core/ext/filters/client_channel/config_selector.cc +0 -4
  13. data/src/core/ext/filters/client_channel/config_selector.h +34 -5
  14. data/src/core/ext/filters/client_channel/health/health_check_client.cc +6 -1
  15. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -3
  16. data/src/core/ext/filters/client_channel/lb_policy.h +3 -1
  17. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +48 -35
  18. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +7 -5
  19. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +9 -6
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +126 -119
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -13
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +0 -3
  23. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -37
  24. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +21 -15
  25. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +32 -13
  26. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +8 -7
  27. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +9 -32
  28. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +26 -16
  29. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +207 -129
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +453 -255
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc +571 -0
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +727 -0
  33. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
  34. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +1 -1
  35. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +3 -3
  36. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  37. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  38. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -1
  39. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  40. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +602 -58
  41. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +28 -0
  42. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +8 -39
  43. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +4 -3
  44. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +49 -47
  45. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +5 -9
  46. data/src/core/ext/filters/client_channel/server_address.cc +120 -7
  47. data/src/core/ext/filters/client_channel/server_address.h +48 -21
  48. data/src/core/ext/filters/client_channel/service_config.cc +16 -13
  49. data/src/core/ext/filters/client_channel/service_config.h +7 -4
  50. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
  51. data/src/core/ext/filters/client_channel/service_config_parser.cc +8 -6
  52. data/src/core/ext/filters/client_channel/service_config_parser.h +8 -5
  53. data/src/core/ext/filters/client_channel/subchannel.cc +64 -23
  54. data/src/core/ext/filters/client_channel/subchannel.h +16 -4
  55. data/src/core/ext/filters/client_channel/subchannel_interface.h +44 -0
  56. data/src/core/ext/filters/max_age/max_age_filter.cc +2 -1
  57. data/src/core/ext/filters/message_size/message_size_filter.cc +2 -1
  58. data/src/core/ext/filters/message_size/message_size_filter.h +2 -1
  59. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +87 -31
  60. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +18 -1
  61. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +10 -35
  62. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +19 -25
  63. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -1
  64. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -2
  65. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +6 -6
  66. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -2
  67. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +256 -287
  68. data/src/core/ext/transport/chttp2/transport/flow_control.cc +11 -3
  69. data/src/core/ext/transport/chttp2/transport/flow_control.h +10 -0
  70. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  71. data/src/core/ext/transport/chttp2/transport/internal.h +10 -1
  72. data/src/core/ext/transport/chttp2/transport/parsing.cc +17 -30
  73. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -5
  74. data/src/core/ext/transport/inproc/inproc_transport.cc +12 -12
  75. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +244 -0
  76. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +766 -0
  77. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +74 -0
  78. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +226 -0
  79. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +458 -0
  80. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1635 -0
  81. data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/filter.upb.c +8 -8
  82. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +69 -0
  83. data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/outlier_detection.upb.c +8 -8
  84. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +323 -0
  85. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +124 -0
  86. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +379 -0
  87. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/backoff.upb.c +8 -8
  88. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +79 -0
  89. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +310 -0
  90. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +869 -0
  91. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +103 -0
  92. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +351 -0
  93. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +34 -0
  94. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +71 -0
  95. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +53 -0
  96. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +133 -0
  97. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +241 -0
  98. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +752 -0
  99. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +170 -0
  100. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +684 -0
  101. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/http_uri.upb.c +8 -8
  102. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +80 -0
  103. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +176 -0
  104. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +645 -0
  105. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +28 -0
  106. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +58 -0
  107. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/socket_option.upb.c +6 -6
  108. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +88 -0
  109. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +36 -0
  110. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +85 -0
  111. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +91 -0
  112. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +220 -0
  113. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +91 -0
  114. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +273 -0
  115. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +112 -0
  116. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +332 -0
  117. data/src/core/ext/upb-generated/envoy/config/listener/{v2 → v3}/api_listener.upb.c +8 -8
  118. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +65 -0
  119. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +128 -0
  120. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +467 -0
  121. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +155 -0
  122. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +539 -0
  123. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +41 -0
  124. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +94 -0
  125. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +178 -0
  126. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +616 -0
  127. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +63 -0
  128. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +204 -0
  129. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +900 -0
  130. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +3290 -0
  131. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +60 -0
  132. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +139 -0
  133. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +50 -0
  134. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +108 -0
  135. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +364 -0
  136. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1336 -0
  137. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +20 -0
  138. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +34 -0
  139. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +110 -0
  140. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +387 -0
  141. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +76 -0
  142. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +214 -0
  143. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +147 -0
  144. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +570 -0
  145. data/src/core/ext/upb-generated/envoy/{api/v2 → service/cluster/v3}/cds.upb.c +5 -6
  146. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +49 -0
  147. data/src/core/ext/upb-generated/envoy/service/discovery/{v2 → v3}/ads.upb.c +5 -4
  148. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +49 -0
  149. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +139 -0
  150. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +449 -0
  151. data/src/core/ext/upb-generated/envoy/{api/v2 → service/endpoint/v3}/eds.upb.c +5 -6
  152. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +49 -0
  153. data/src/core/ext/upb-generated/envoy/{api/v2 → service/listener/v3}/lds.upb.c +5 -6
  154. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +49 -0
  155. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +55 -0
  156. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +136 -0
  157. data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/rds.upb.c +5 -6
  158. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +49 -0
  159. data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/srds.upb.c +5 -6
  160. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +49 -0
  161. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +47 -0
  162. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +114 -0
  163. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +35 -0
  164. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +77 -0
  165. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +34 -0
  166. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +71 -0
  167. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +64 -0
  168. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +145 -0
  169. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +54 -0
  170. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +133 -0
  171. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +63 -0
  172. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +188 -0
  173. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +88 -0
  174. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +258 -0
  175. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +90 -0
  176. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +250 -0
  177. data/src/core/ext/upb-generated/envoy/type/{http.upb.c → v3/http.upb.c} +2 -2
  178. data/src/core/ext/upb-generated/envoy/type/{http.upb.h → v3/http.upb.h} +8 -8
  179. data/src/core/ext/upb-generated/envoy/type/{percent.upb.c → v3/percent.upb.c} +9 -8
  180. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +86 -0
  181. data/src/core/ext/upb-generated/envoy/type/{range.upb.c → v3/range.upb.c} +12 -11
  182. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +111 -0
  183. data/src/core/ext/upb-generated/envoy/type/{semantic_version.upb.c → v3/semantic_version.upb.c} +6 -5
  184. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +61 -0
  185. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +242 -0
  186. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +753 -0
  187. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +234 -0
  188. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +759 -0
  189. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +36 -36
  190. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +1 -1
  191. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +31 -0
  192. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +57 -0
  193. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +27 -0
  194. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +53 -0
  195. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.c +28 -0
  196. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +53 -0
  197. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +52 -0
  198. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +129 -0
  199. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +42 -0
  200. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +77 -0
  201. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.c +36 -0
  202. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +85 -0
  203. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +54 -0
  204. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +160 -0
  205. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +36 -0
  206. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +84 -0
  207. data/src/core/ext/upb-generated/validate/validate.upb.c +11 -11
  208. data/src/core/ext/upb-generated/validate/validate.upb.h +1 -1
  209. data/src/core/ext/xds/certificate_provider_factory.h +59 -0
  210. data/src/core/ext/xds/certificate_provider_registry.cc +103 -0
  211. data/src/core/ext/xds/certificate_provider_registry.h +57 -0
  212. data/src/core/ext/xds/certificate_provider_store.h +50 -0
  213. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc +377 -0
  214. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h +102 -0
  215. data/src/core/ext/xds/xds_api.cc +2596 -0
  216. data/src/core/ext/xds/xds_api.h +397 -0
  217. data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.cc +44 -2
  218. data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.h +8 -3
  219. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_args.h +9 -6
  220. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.cc +541 -785
  221. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.h +114 -93
  222. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.cc +20 -14
  223. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.h +36 -8
  224. data/src/core/lib/channel/channel_args.h +0 -1
  225. data/src/core/lib/channel/channelz.cc +24 -60
  226. data/src/core/lib/channel/channelz.h +12 -20
  227. data/src/core/lib/channel/channelz_registry.cc +15 -12
  228. data/src/core/lib/channel/channelz_registry.h +3 -0
  229. data/src/core/lib/gpr/sync_posix.cc +2 -8
  230. data/src/core/lib/gpr/time_precise.cc +2 -0
  231. data/src/core/lib/gpr/time_precise.h +6 -2
  232. data/src/core/lib/gprpp/dual_ref_counted.h +336 -0
  233. data/src/core/lib/gprpp/ref_counted.h +51 -22
  234. data/src/core/lib/gprpp/ref_counted_ptr.h +153 -0
  235. data/src/core/lib/iomgr/endpoint.cc +5 -1
  236. data/src/core/lib/iomgr/endpoint.h +7 -3
  237. data/src/core/lib/iomgr/endpoint_cfstream.cc +36 -11
  238. data/src/core/lib/iomgr/ev_posix.cc +0 -2
  239. data/src/core/lib/iomgr/exec_ctx.h +10 -8
  240. data/src/core/lib/iomgr/iomgr.cc +0 -10
  241. data/src/core/lib/iomgr/iomgr.h +0 -10
  242. data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.cc +1 -1
  243. data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.h +3 -3
  244. data/src/core/lib/iomgr/sockaddr_utils.cc +2 -1
  245. data/src/core/lib/iomgr/sockaddr_utils.h +2 -1
  246. data/src/core/lib/iomgr/tcp_custom.cc +32 -16
  247. data/src/core/lib/iomgr/tcp_posix.cc +31 -13
  248. data/src/core/lib/iomgr/tcp_windows.cc +26 -10
  249. data/src/core/lib/json/json_util.cc +58 -0
  250. data/src/core/lib/json/json_util.h +37 -0
  251. data/src/core/lib/security/authorization/authorization_engine.cc +177 -0
  252. data/src/core/lib/security/authorization/authorization_engine.h +84 -0
  253. data/src/core/lib/security/authorization/evaluate_args.cc +153 -0
  254. data/src/core/lib/security/authorization/evaluate_args.h +59 -0
  255. data/src/core/lib/security/authorization/mock_cel/activation.h +57 -0
  256. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +42 -0
  257. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +68 -0
  258. data/src/core/lib/security/authorization/mock_cel/cel_value.h +93 -0
  259. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +67 -0
  260. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +56 -0
  261. data/src/core/lib/security/authorization/mock_cel/statusor.h +50 -0
  262. data/src/core/lib/security/certificate_provider.h +60 -0
  263. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +56 -38
  264. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +321 -0
  265. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +214 -0
  266. data/src/core/lib/security/credentials/xds/xds_credentials.cc +45 -0
  267. data/src/core/lib/security/credentials/xds/xds_credentials.h +51 -0
  268. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +7 -12
  269. data/src/core/lib/security/security_connector/ssl_utils.h +5 -0
  270. data/src/core/lib/security/transport/secure_endpoint.cc +7 -1
  271. data/src/core/lib/surface/call.cc +12 -12
  272. data/src/core/lib/surface/call.h +2 -1
  273. data/src/core/lib/surface/channel.cc +37 -51
  274. data/src/core/lib/surface/channel.h +18 -3
  275. data/src/core/lib/surface/completion_queue.cc +10 -272
  276. data/src/core/lib/surface/completion_queue.h +0 -8
  277. data/src/core/lib/surface/init.cc +27 -12
  278. data/src/core/lib/surface/server.cc +1066 -1244
  279. data/src/core/lib/surface/server.h +363 -87
  280. data/src/core/lib/surface/version.cc +2 -2
  281. data/src/core/lib/transport/authority_override.cc +38 -0
  282. data/src/core/lib/transport/authority_override.h +32 -0
  283. data/src/core/lib/transport/bdp_estimator.h +2 -1
  284. data/src/core/lib/transport/connectivity_state.cc +18 -13
  285. data/src/core/lib/transport/connectivity_state.h +20 -8
  286. data/src/core/lib/transport/error_utils.cc +13 -0
  287. data/src/core/lib/transport/error_utils.h +6 -0
  288. data/src/core/lib/transport/metadata.cc +11 -1
  289. data/src/core/lib/transport/static_metadata.cc +295 -276
  290. data/src/core/lib/transport/static_metadata.h +80 -73
  291. data/src/core/lib/transport/transport.h +7 -0
  292. data/src/core/lib/uri/uri_parser.cc +23 -21
  293. data/src/core/lib/uri/uri_parser.h +3 -1
  294. data/src/core/plugin_registry/grpc_plugin_registry.cc +35 -20
  295. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +22 -0
  296. data/src/core/tsi/ssl_transport_security.cc +2 -2
  297. data/src/ruby/bin/math_services_pb.rb +4 -4
  298. data/src/ruby/ext/grpc/rb_channel_credentials.c +9 -0
  299. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -4
  300. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +7 -7
  301. data/src/ruby/lib/grpc/generic/client_stub.rb +1 -1
  302. data/src/ruby/lib/grpc/version.rb +1 -1
  303. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +2 -2
  304. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +5 -0
  305. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +28 -12
  306. data/src/ruby/spec/channel_credentials_spec.rb +10 -0
  307. data/src/ruby/spec/generic/active_call_spec.rb +19 -8
  308. data/src/ruby/spec/pb/codegen/grpc/testing/same_package_service_name.proto +27 -0
  309. data/src/ruby/spec/pb/codegen/grpc/testing/same_ruby_package_service_name.proto +29 -0
  310. data/src/ruby/spec/pb/codegen/package_option_spec.rb +20 -0
  311. data/src/ruby/spec/user_agent_spec.rb +74 -0
  312. data/third_party/abseil-cpp/absl/algorithm/container.h +1727 -0
  313. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +161 -0
  314. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.cc +93 -0
  315. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.h +130 -0
  316. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +620 -0
  317. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +126 -0
  318. data/third_party/abseil-cpp/absl/container/fixed_array.h +515 -0
  319. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +503 -0
  320. data/third_party/abseil-cpp/absl/container/internal/common.h +202 -0
  321. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +440 -0
  322. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +146 -0
  323. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +191 -0
  324. data/third_party/abseil-cpp/absl/container/internal/hashtable_debug_hooks.h +85 -0
  325. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +269 -0
  326. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +297 -0
  327. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +30 -0
  328. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +49 -0
  329. data/third_party/abseil-cpp/absl/container/internal/layout.h +741 -0
  330. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +48 -0
  331. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1882 -0
  332. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +138 -0
  333. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.h +32 -0
  334. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +1895 -0
  335. data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +71 -0
  336. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +382 -0
  337. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +134 -0
  338. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +192 -0
  339. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +125 -0
  340. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +70 -0
  341. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +99 -0
  342. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +248 -0
  343. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +24 -0
  344. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +85 -0
  345. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +346 -0
  346. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +128 -0
  347. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +194 -0
  348. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.h +158 -0
  349. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +140 -0
  350. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +231 -0
  351. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +25 -0
  352. data/third_party/abseil-cpp/absl/debugging/symbolize.h +99 -0
  353. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +1480 -0
  354. data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +40 -0
  355. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +81 -0
  356. data/third_party/abseil-cpp/absl/functional/function_ref.h +139 -0
  357. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +106 -0
  358. data/third_party/abseil-cpp/absl/hash/hash.h +324 -0
  359. data/third_party/abseil-cpp/absl/hash/internal/city.cc +346 -0
  360. data/third_party/abseil-cpp/absl/hash/internal/city.h +96 -0
  361. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +55 -0
  362. data/third_party/abseil-cpp/absl/hash/internal/hash.h +988 -0
  363. data/third_party/abseil-cpp/absl/status/status.cc +447 -0
  364. data/third_party/abseil-cpp/absl/status/status.h +428 -0
  365. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +43 -0
  366. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +51 -0
  367. data/third_party/abseil-cpp/absl/strings/cord.cc +2019 -0
  368. data/third_party/abseil-cpp/absl/strings/cord.h +1121 -0
  369. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +151 -0
  370. data/third_party/abseil-cpp/absl/synchronization/barrier.cc +52 -0
  371. data/third_party/abseil-cpp/absl/synchronization/barrier.h +79 -0
  372. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +57 -0
  373. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +99 -0
  374. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +140 -0
  375. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +60 -0
  376. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +697 -0
  377. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.h +141 -0
  378. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +155 -0
  379. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +261 -0
  380. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +106 -0
  381. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +115 -0
  382. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +484 -0
  383. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +159 -0
  384. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +2728 -0
  385. data/third_party/abseil-cpp/absl/synchronization/mutex.h +1056 -0
  386. data/third_party/abseil-cpp/absl/synchronization/notification.cc +78 -0
  387. data/third_party/abseil-cpp/absl/synchronization/notification.h +123 -0
  388. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +64 -0
  389. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +82 -0
  390. data/third_party/abseil-cpp/absl/types/internal/variant.h +1646 -0
  391. data/third_party/abseil-cpp/absl/types/variant.h +861 -0
  392. data/third_party/boringssl-with-bazel/err_data.c +475 -467
  393. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +0 -6
  394. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +9 -43
  395. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +55 -4
  396. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +34 -0
  397. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +4 -0
  398. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +16 -0
  399. data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +6 -2
  400. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +2 -0
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +4 -0
  402. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +30 -10
  403. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +10 -15
  404. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +543 -0
  405. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +237 -0
  406. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +44 -2
  407. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +221 -49
  408. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +64 -20
  409. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +3 -3
  410. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +0 -8
  411. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +3 -3
  412. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +1 -1
  413. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +7 -2
  414. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +21 -18
  415. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -1
  416. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +24 -3
  417. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +3 -3
  418. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +67 -67
  419. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +3 -3
  420. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +29 -35
  421. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +13 -2
  422. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +9 -8
  423. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +10 -10
  424. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +2 -2
  425. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +28 -40
  426. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +20 -0
  427. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +3 -1
  428. data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +1 -4
  429. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +7 -3
  430. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +2 -2
  431. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +1 -1
  432. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +55 -8
  433. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -1
  434. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +52 -0
  435. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +0 -1
  436. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +2 -2
  437. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +6 -0
  438. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +1 -1
  439. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +12 -0
  440. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +9 -0
  441. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +4 -1
  442. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +48 -9
  443. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +2 -3
  444. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +26 -6
  445. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +199 -78
  446. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +52 -43
  447. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +18 -18
  448. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +2 -3
  449. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +1 -1
  450. data/third_party/boringssl-with-bazel/src/ssl/internal.h +13 -9
  451. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +3 -6
  452. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +8 -9
  453. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +10 -0
  454. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +34 -9
  455. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -2
  456. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +4 -8
  457. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +7 -2
  458. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +5 -3
  459. data/third_party/re2/re2/bitmap256.h +117 -0
  460. data/third_party/re2/re2/bitstate.cc +385 -0
  461. data/third_party/re2/re2/compile.cc +1279 -0
  462. data/third_party/re2/re2/dfa.cc +2130 -0
  463. data/third_party/re2/re2/filtered_re2.cc +121 -0
  464. data/third_party/re2/re2/filtered_re2.h +109 -0
  465. data/third_party/re2/re2/mimics_pcre.cc +197 -0
  466. data/third_party/re2/re2/nfa.cc +713 -0
  467. data/third_party/re2/re2/onepass.cc +623 -0
  468. data/third_party/re2/re2/parse.cc +2464 -0
  469. data/third_party/re2/re2/perl_groups.cc +119 -0
  470. data/third_party/re2/re2/pod_array.h +55 -0
  471. data/third_party/re2/re2/prefilter.cc +710 -0
  472. data/third_party/re2/re2/prefilter.h +108 -0
  473. data/third_party/re2/re2/prefilter_tree.cc +407 -0
  474. data/third_party/re2/re2/prefilter_tree.h +139 -0
  475. data/third_party/re2/re2/prog.cc +988 -0
  476. data/third_party/re2/re2/prog.h +436 -0
  477. data/third_party/re2/re2/re2.cc +1362 -0
  478. data/third_party/re2/re2/re2.h +1002 -0
  479. data/third_party/re2/re2/regexp.cc +980 -0
  480. data/third_party/re2/re2/regexp.h +659 -0
  481. data/third_party/re2/re2/set.cc +154 -0
  482. data/third_party/re2/re2/set.h +80 -0
  483. data/third_party/re2/re2/simplify.cc +657 -0
  484. data/third_party/re2/re2/sparse_array.h +392 -0
  485. data/third_party/re2/re2/sparse_set.h +264 -0
  486. data/third_party/re2/re2/stringpiece.cc +65 -0
  487. data/third_party/re2/re2/stringpiece.h +210 -0
  488. data/third_party/re2/re2/tostring.cc +351 -0
  489. data/third_party/re2/re2/unicode_casefold.cc +582 -0
  490. data/third_party/re2/re2/unicode_casefold.h +78 -0
  491. data/third_party/re2/re2/unicode_groups.cc +6269 -0
  492. data/third_party/re2/re2/unicode_groups.h +67 -0
  493. data/third_party/re2/re2/walker-inl.h +246 -0
  494. data/third_party/re2/util/benchmark.h +156 -0
  495. data/third_party/re2/util/flags.h +26 -0
  496. data/third_party/re2/util/logging.h +109 -0
  497. data/third_party/re2/util/malloc_counter.h +19 -0
  498. data/third_party/re2/util/mix.h +41 -0
  499. data/third_party/re2/util/mutex.h +148 -0
  500. data/third_party/re2/util/pcre.cc +1025 -0
  501. data/third_party/re2/util/pcre.h +681 -0
  502. data/third_party/re2/util/rune.cc +260 -0
  503. data/third_party/re2/util/strutil.cc +149 -0
  504. data/third_party/re2/util/strutil.h +21 -0
  505. data/third_party/re2/util/test.h +50 -0
  506. data/third_party/re2/util/utf.h +44 -0
  507. data/third_party/re2/util/util.h +42 -0
  508. data/third_party/upb/upb/decode.c +64 -15
  509. data/third_party/upb/upb/encode.c +2 -2
  510. data/third_party/upb/upb/msg.h +2 -2
  511. data/third_party/upb/upb/port_def.inc +1 -1
  512. data/third_party/upb/upb/table.c +0 -11
  513. data/third_party/upb/upb/table.int.h +0 -9
  514. data/third_party/upb/upb/upb.c +16 -14
  515. data/third_party/upb/upb/upb.h +26 -0
  516. data/third_party/upb/upb/upb.hpp +2 -0
  517. metadata +340 -153
  518. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +0 -528
  519. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +0 -1142
  520. data/src/core/ext/filters/client_channel/xds/xds_api.cc +0 -2110
  521. data/src/core/ext/filters/client_channel/xds/xds_api.h +0 -345
  522. data/src/core/ext/filters/client_channel/xds/xds_channel.h +0 -46
  523. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +0 -106
  524. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +0 -21
  525. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +0 -34
  526. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +0 -114
  527. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +0 -429
  528. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +0 -72
  529. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +0 -198
  530. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +0 -105
  531. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +0 -388
  532. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +0 -52
  533. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +0 -403
  534. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +0 -1453
  535. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +0 -74
  536. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +0 -226
  537. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +0 -69
  538. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +0 -323
  539. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +0 -112
  540. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +0 -334
  541. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +0 -79
  542. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +0 -313
  543. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +0 -891
  544. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +0 -96
  545. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +0 -328
  546. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +0 -34
  547. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +0 -71
  548. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +0 -197
  549. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +0 -649
  550. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +0 -172
  551. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +0 -693
  552. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +0 -80
  553. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +0 -152
  554. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +0 -536
  555. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +0 -88
  556. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +0 -129
  557. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +0 -386
  558. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +0 -52
  559. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +0 -92
  560. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +0 -224
  561. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +0 -18
  562. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -32
  563. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +0 -91
  564. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +0 -273
  565. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +0 -112
  566. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +0 -332
  567. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +0 -52
  568. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +0 -109
  569. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +0 -415
  570. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +0 -18
  571. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -32
  572. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +0 -145
  573. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +0 -538
  574. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +0 -43
  575. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +0 -111
  576. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +0 -52
  577. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +0 -63
  578. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +0 -204
  579. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +0 -18
  580. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -32
  581. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +0 -815
  582. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +0 -2984
  583. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +0 -59
  584. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +0 -135
  585. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +0 -52
  586. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +0 -228
  587. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +0 -732
  588. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +0 -316
  589. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +0 -1167
  590. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +0 -65
  591. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +0 -51
  592. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +0 -125
  593. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +0 -49
  594. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +0 -54
  595. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +0 -136
  596. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +0 -63
  597. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +0 -145
  598. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +0 -53
  599. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +0 -133
  600. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +0 -88
  601. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +0 -258
  602. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +0 -86
  603. data/src/core/ext/upb-generated/envoy/type/range.upb.h +0 -111
  604. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +0 -61
  605. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +0 -89
  606. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +0 -250
  607. data/src/core/ext/upb-generated/gogoproto/gogo.upb.c +0 -17
  608. data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +0 -29
  609. data/src/core/lib/security/transport/target_authority_table.cc +0 -75
  610. data/src/core/lib/security/transport/target_authority_table.h +0 -40
  611. data/src/core/lib/slice/slice_hash_table.h +0 -199
  612. data/src/core/lib/slice/slice_weak_hash_table.h +0 -102
  613. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c +0 -110
  614. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c +0 -274
@@ -32,14 +32,16 @@
32
32
  #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
33
33
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
34
34
  #include "src/core/ext/filters/client_channel/server_address.h"
35
- #include "src/core/ext/filters/client_channel/xds/xds_channel_args.h"
36
- #include "src/core/ext/filters/client_channel/xds/xds_client.h"
37
- #include "src/core/ext/filters/client_channel/xds/xds_client_stats.h"
35
+ #include "src/core/ext/xds/xds_channel_args.h"
36
+ #include "src/core/ext/xds/xds_client.h"
37
+ #include "src/core/ext/xds/xds_client_stats.h"
38
38
  #include "src/core/lib/channel/channel_args.h"
39
+ #include "src/core/lib/gpr/string.h"
39
40
  #include "src/core/lib/gprpp/orphanable.h"
40
41
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
41
42
  #include "src/core/lib/iomgr/timer.h"
42
43
  #include "src/core/lib/iomgr/work_serializer.h"
44
+ #include "src/core/lib/transport/error_utils.h"
43
45
  #include "src/core/lib/uri/uri_parser.h"
44
46
 
45
47
  #define GRPC_EDS_DEFAULT_FALLBACK_TIMEOUT 10000
@@ -52,18 +54,22 @@ namespace {
52
54
 
53
55
  constexpr char kEds[] = "eds_experimental";
54
56
 
57
+ const char* kXdsLocalityNameAttributeKey = "xds_locality_name";
58
+
55
59
  // Config for EDS LB policy.
56
60
  class EdsLbConfig : public LoadBalancingPolicy::Config {
57
61
  public:
58
62
  EdsLbConfig(std::string cluster_name, std::string eds_service_name,
59
63
  absl::optional<std::string> lrs_load_reporting_server_name,
60
- Json locality_picking_policy, Json endpoint_picking_policy)
64
+ Json locality_picking_policy, Json endpoint_picking_policy,
65
+ uint32_t max_concurrent_requests)
61
66
  : cluster_name_(std::move(cluster_name)),
62
67
  eds_service_name_(std::move(eds_service_name)),
63
68
  lrs_load_reporting_server_name_(
64
69
  std::move(lrs_load_reporting_server_name)),
65
70
  locality_picking_policy_(std::move(locality_picking_policy)),
66
- endpoint_picking_policy_(std::move(endpoint_picking_policy)) {}
71
+ endpoint_picking_policy_(std::move(endpoint_picking_policy)),
72
+ max_concurrent_requests_(max_concurrent_requests) {}
67
73
 
68
74
  const char* name() const override { return kEds; }
69
75
 
@@ -78,6 +84,9 @@ class EdsLbConfig : public LoadBalancingPolicy::Config {
78
84
  const Json& endpoint_picking_policy() const {
79
85
  return endpoint_picking_policy_;
80
86
  }
87
+ const uint32_t max_concurrent_requests() const {
88
+ return max_concurrent_requests_;
89
+ }
81
90
 
82
91
  private:
83
92
  std::string cluster_name_;
@@ -85,12 +94,13 @@ class EdsLbConfig : public LoadBalancingPolicy::Config {
85
94
  absl::optional<std::string> lrs_load_reporting_server_name_;
86
95
  Json locality_picking_policy_;
87
96
  Json endpoint_picking_policy_;
97
+ uint32_t max_concurrent_requests_;
88
98
  };
89
99
 
90
100
  // EDS LB policy.
91
101
  class EdsLb : public LoadBalancingPolicy {
92
102
  public:
93
- explicit EdsLb(Args args);
103
+ EdsLb(RefCountedPtr<XdsClient> xds_client, Args args);
94
104
 
95
105
  const char* name() const override { return kEds; }
96
106
 
@@ -98,7 +108,80 @@ class EdsLb : public LoadBalancingPolicy {
98
108
  void ResetBackoffLocked() override;
99
109
 
100
110
  private:
101
- class EndpointWatcher;
111
+ class XdsLocalityAttribute : public ServerAddress::AttributeInterface {
112
+ public:
113
+ explicit XdsLocalityAttribute(RefCountedPtr<XdsLocalityName> locality_name)
114
+ : locality_name_(std::move(locality_name)) {}
115
+
116
+ RefCountedPtr<XdsLocalityName> locality_name() const {
117
+ return locality_name_;
118
+ }
119
+
120
+ std::unique_ptr<AttributeInterface> Copy() const override {
121
+ return absl::make_unique<XdsLocalityAttribute>(locality_name_->Ref());
122
+ }
123
+
124
+ int Cmp(const AttributeInterface* other) const override {
125
+ const auto* other_locality_attr =
126
+ static_cast<const XdsLocalityAttribute*>(other);
127
+ return locality_name_->Compare(*other_locality_attr->locality_name_);
128
+ }
129
+
130
+ std::string ToString() const override {
131
+ return locality_name_->AsHumanReadableString();
132
+ }
133
+
134
+ private:
135
+ RefCountedPtr<XdsLocalityName> locality_name_;
136
+ };
137
+
138
+ class StatsSubchannelWrapper : public DelegatingSubchannel {
139
+ public:
140
+ StatsSubchannelWrapper(
141
+ RefCountedPtr<SubchannelInterface> wrapped_subchannel,
142
+ RefCountedPtr<XdsClusterLocalityStats> locality_stats)
143
+ : DelegatingSubchannel(std::move(wrapped_subchannel)),
144
+ locality_stats_(std::move(locality_stats)) {}
145
+
146
+ XdsClusterLocalityStats* locality_stats() const {
147
+ return locality_stats_.get();
148
+ }
149
+
150
+ private:
151
+ RefCountedPtr<XdsClusterLocalityStats> locality_stats_;
152
+ };
153
+
154
+ class EndpointWatcher : public XdsClient::EndpointWatcherInterface {
155
+ public:
156
+ explicit EndpointWatcher(RefCountedPtr<EdsLb> parent)
157
+ : parent_(std::move(parent)) {}
158
+ void OnEndpointChanged(XdsApi::EdsUpdate update) override {
159
+ new Notifier(parent_, std::move(update));
160
+ }
161
+ void OnError(grpc_error* error) override { new Notifier(parent_, error); }
162
+ void OnResourceDoesNotExist() override { new Notifier(parent_); }
163
+
164
+ private:
165
+ class Notifier {
166
+ public:
167
+ Notifier(RefCountedPtr<EdsLb> parent, XdsApi::EdsUpdate update);
168
+ Notifier(RefCountedPtr<EdsLb> parent, grpc_error* error);
169
+ explicit Notifier(RefCountedPtr<EdsLb> parent);
170
+
171
+ private:
172
+ enum Type { kUpdate, kError, kDoesNotExist };
173
+
174
+ static void RunInExecCtx(void* arg, grpc_error* error);
175
+ void RunInWorkSerializer(grpc_error* error);
176
+
177
+ RefCountedPtr<EdsLb> parent_;
178
+ grpc_closure closure_;
179
+ XdsApi::EdsUpdate update_;
180
+ Type type_;
181
+ };
182
+
183
+ RefCountedPtr<EdsLb> parent_;
184
+ };
102
185
 
103
186
  // A simple wrapper for ref-counting a picker from the child policy.
104
187
  class ChildPickerWrapper : public RefCounted<ChildPickerWrapper> {
@@ -112,16 +195,18 @@ class EdsLb : public LoadBalancingPolicy {
112
195
  };
113
196
 
114
197
  // A picker that handles drops.
115
- class DropPicker : public SubchannelPicker {
198
+ class EdsPicker : public SubchannelPicker {
116
199
  public:
117
- explicit DropPicker(EdsLb* eds_policy);
200
+ explicit EdsPicker(RefCountedPtr<EdsLb> eds_policy);
118
201
 
119
202
  PickResult Pick(PickArgs args) override;
120
203
 
121
204
  private:
122
- RefCountedPtr<XdsApi::DropConfig> drop_config_;
205
+ RefCountedPtr<EdsLb> eds_policy_;
206
+ RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config_;
123
207
  RefCountedPtr<XdsClusterDropStats> drop_stats_;
124
208
  RefCountedPtr<ChildPickerWrapper> child_picker_;
209
+ uint32_t max_concurrent_requests_;
125
210
  };
126
211
 
127
212
  class Helper : public ChannelControlHelper {
@@ -132,8 +217,8 @@ class EdsLb : public LoadBalancingPolicy {
132
217
  ~Helper() { eds_policy_.reset(DEBUG_LOCATION, "Helper"); }
133
218
 
134
219
  RefCountedPtr<SubchannelInterface> CreateSubchannel(
135
- const grpc_channel_args& args) override;
136
- void UpdateState(grpc_connectivity_state state,
220
+ ServerAddress address, const grpc_channel_args& args) override;
221
+ void UpdateState(grpc_connectivity_state state, const absl::Status& status,
137
222
  std::unique_ptr<SubchannelPicker> picker) override;
138
223
  // This is a no-op, because we get the addresses from the xds
139
224
  // client, which is a watch-based API.
@@ -149,9 +234,13 @@ class EdsLb : public LoadBalancingPolicy {
149
234
 
150
235
  void ShutdownLocked() override;
151
236
 
237
+ void OnEndpointChanged(XdsApi::EdsUpdate update);
238
+ void OnError(grpc_error* error);
239
+ void OnResourceDoesNotExist();
240
+
152
241
  void MaybeDestroyChildPolicyLocked();
153
242
 
154
- void UpdatePriorityList(XdsApi::PriorityListUpdate priority_list_update);
243
+ void UpdatePriorityList(XdsApi::EdsUpdate::PriorityList priority_list);
155
244
  void UpdateChildPolicyLocked();
156
245
  OrphanablePtr<LoadBalancingPolicy> CreateChildPolicyLocked(
157
246
  const grpc_channel_args* args);
@@ -159,11 +248,11 @@ class EdsLb : public LoadBalancingPolicy {
159
248
  RefCountedPtr<Config> CreateChildPolicyConfigLocked();
160
249
  grpc_channel_args* CreateChildPolicyArgsLocked(
161
250
  const grpc_channel_args* args_in);
162
- void MaybeUpdateDropPickerLocked();
251
+ void MaybeUpdateEdsPickerLocked();
163
252
 
164
253
  // Caller must ensure that config_ is set before calling.
165
254
  const absl::string_view GetEdsResourceName() const {
166
- if (xds_client_from_channel_ == nullptr) return server_name_;
255
+ if (!is_xds_uri_) return server_name_;
167
256
  if (!config_->eds_service_name().empty()) {
168
257
  return config_->eds_service_name();
169
258
  }
@@ -174,17 +263,13 @@ class EdsLb : public LoadBalancingPolicy {
174
263
  // for LRS load reporting.
175
264
  // Caller must ensure that config_ is set before calling.
176
265
  std::pair<absl::string_view, absl::string_view> GetLrsClusterKey() const {
177
- if (xds_client_from_channel_ == nullptr) return {server_name_, nullptr};
266
+ if (!is_xds_uri_) return {server_name_, nullptr};
178
267
  return {config_->cluster_name(), config_->eds_service_name()};
179
268
  }
180
269
 
181
- XdsClient* xds_client() const {
182
- return xds_client_from_channel_ != nullptr ? xds_client_from_channel_.get()
183
- : xds_client_.get();
184
- }
185
-
186
270
  // Server name from target URI.
187
271
  std::string server_name_;
272
+ bool is_xds_uri_;
188
273
 
189
274
  // Current channel args and config from the resolver.
190
275
  const grpc_channel_args* args_ = nullptr;
@@ -194,53 +279,57 @@ class EdsLb : public LoadBalancingPolicy {
194
279
  bool shutting_down_ = false;
195
280
 
196
281
  // The xds client and endpoint watcher.
197
- // If we get the XdsClient from the channel, we store it in
198
- // xds_client_from_channel_; if we create it ourselves, we store it in
199
- // xds_client_.
200
- RefCountedPtr<XdsClient> xds_client_from_channel_;
201
- OrphanablePtr<XdsClient> xds_client_;
282
+ RefCountedPtr<XdsClient> xds_client_;
202
283
  // A pointer to the endpoint watcher, to be used when cancelling the watch.
203
284
  // Note that this is not owned, so this pointer must never be derefernced.
204
285
  EndpointWatcher* endpoint_watcher_ = nullptr;
205
286
  // The latest data from the endpoint watcher.
206
- XdsApi::PriorityListUpdate priority_list_update_;
287
+ XdsApi::EdsUpdate::PriorityList priority_list_;
207
288
  // State used to retain child policy names for priority policy.
208
289
  std::vector<size_t /*child_number*/> priority_child_numbers_;
209
290
 
210
- RefCountedPtr<XdsApi::DropConfig> drop_config_;
291
+ RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config_;
211
292
  RefCountedPtr<XdsClusterDropStats> drop_stats_;
293
+ // Current concurrent number of requests;
294
+ Atomic<uint32_t> concurrent_requests_{0};
212
295
 
213
296
  OrphanablePtr<LoadBalancingPolicy> child_policy_;
214
297
 
215
298
  // The latest state and picker returned from the child policy.
216
299
  grpc_connectivity_state child_state_;
300
+ absl::Status child_status_;
217
301
  RefCountedPtr<ChildPickerWrapper> child_picker_;
218
302
  };
219
303
 
220
304
  //
221
- // EdsLb::DropPicker
305
+ // EdsLb::EdsPicker
222
306
  //
223
307
 
224
- EdsLb::DropPicker::DropPicker(EdsLb* eds_policy)
225
- : drop_config_(eds_policy->drop_config_),
226
- drop_stats_(eds_policy->drop_stats_),
227
- child_picker_(eds_policy->child_picker_) {
308
+ EdsLb::EdsPicker::EdsPicker(RefCountedPtr<EdsLb> eds_policy)
309
+ : eds_policy_(std::move(eds_policy)),
310
+ drop_stats_(eds_policy_->drop_stats_),
311
+ child_picker_(eds_policy_->child_picker_),
312
+ max_concurrent_requests_(
313
+ eds_policy_->config_->max_concurrent_requests()) {
228
314
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
229
- gpr_log(GPR_INFO, "[edslb %p] constructed new drop picker %p", eds_policy,
230
- this);
315
+ gpr_log(GPR_INFO, "[edslb %p] constructed new drop picker %p",
316
+ eds_policy_.get(), this);
231
317
  }
232
318
  }
233
319
 
234
- EdsLb::PickResult EdsLb::DropPicker::Pick(PickArgs args) {
235
- // Handle drop.
236
- const std::string* drop_category;
237
- if (drop_config_->ShouldDrop(&drop_category)) {
238
- if (drop_stats_ != nullptr) drop_stats_->AddCallDropped(*drop_category);
320
+ EdsLb::PickResult EdsLb::EdsPicker::Pick(PickArgs args) {
321
+ // Check and see if we exceeded the max concurrent requests count.
322
+ uint32_t current = eds_policy_->concurrent_requests_.FetchAdd(1);
323
+ if (current >= max_concurrent_requests_) {
324
+ eds_policy_->concurrent_requests_.FetchSub(1);
325
+ if (drop_stats_ != nullptr) {
326
+ drop_stats_->AddUncategorizedDrops();
327
+ }
239
328
  PickResult result;
240
329
  result.type = PickResult::PICK_COMPLETE;
241
330
  return result;
242
331
  }
243
- // If we're not dropping all calls, we should always have a child picker.
332
+ // If we're not dropping the call, we should always have a child picker.
244
333
  if (child_picker_ == nullptr) { // Should never happen.
245
334
  PickResult result;
246
335
  result.type = PickResult::PICK_FAILED;
@@ -248,10 +337,56 @@ EdsLb::PickResult EdsLb::DropPicker::Pick(PickArgs args) {
248
337
  grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
249
338
  "eds drop picker not given any child picker"),
250
339
  GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
340
+ eds_policy_->concurrent_requests_.FetchSub(1);
251
341
  return result;
252
342
  }
253
343
  // Not dropping, so delegate to child's picker.
254
- return child_picker_->Pick(args);
344
+ PickResult result = child_picker_->Pick(args);
345
+ if (result.type == result.PICK_COMPLETE && result.subchannel != nullptr) {
346
+ XdsClusterLocalityStats* locality_stats = nullptr;
347
+ if (drop_stats_ != nullptr) { // If load reporting is enabled.
348
+ auto* subchannel_wrapper =
349
+ static_cast<StatsSubchannelWrapper*>(result.subchannel.get());
350
+ // Handle load reporting.
351
+ locality_stats = subchannel_wrapper->locality_stats()->Ref().release();
352
+ // Record a call started.
353
+ locality_stats->AddCallStarted();
354
+ // Unwrap subchannel to pass back up the stack.
355
+ result.subchannel = subchannel_wrapper->wrapped_subchannel();
356
+ }
357
+ // Intercept the recv_trailing_metadata op to record call completion.
358
+ EdsLb* eds_policy = static_cast<EdsLb*>(
359
+ eds_policy_->Ref(DEBUG_LOCATION, "DropPickPicker+call").release());
360
+ auto original_recv_trailing_metadata_ready =
361
+ result.recv_trailing_metadata_ready;
362
+ result.recv_trailing_metadata_ready =
363
+ // Note: This callback does not run in either the control plane
364
+ // work serializer or in the data plane mutex.
365
+ [locality_stats, original_recv_trailing_metadata_ready, eds_policy](
366
+ grpc_error* error, MetadataInterface* metadata,
367
+ CallState* call_state) {
368
+ // Record call completion for load reporting.
369
+ if (locality_stats != nullptr) {
370
+ const bool call_failed = error != GRPC_ERROR_NONE;
371
+ locality_stats->AddCallFinished(call_failed);
372
+ locality_stats->Unref(DEBUG_LOCATION, "LocalityStats+call");
373
+ }
374
+ // Decrement number of calls in flight.
375
+ eds_policy->concurrent_requests_.FetchSub(1);
376
+ eds_policy->Unref(DEBUG_LOCATION, "DropPickPicker+call");
377
+ // Invoke the original recv_trailing_metadata_ready callback, if any.
378
+ if (original_recv_trailing_metadata_ready != nullptr) {
379
+ original_recv_trailing_metadata_ready(error, metadata, call_state);
380
+ }
381
+ };
382
+ } else {
383
+ // TODO(roth): We should ideally also record call failures here in the case
384
+ // where a pick fails. This is challenging, because we don't know which
385
+ // picks are for wait_for_ready RPCs or how many times we'll return a
386
+ // failure for the same wait_for_ready RPC.
387
+ eds_policy_->concurrent_requests_.FetchSub(1);
388
+ }
389
+ return result;
255
390
  }
256
391
 
257
392
  //
@@ -259,26 +394,53 @@ EdsLb::PickResult EdsLb::DropPicker::Pick(PickArgs args) {
259
394
  //
260
395
 
261
396
  RefCountedPtr<SubchannelInterface> EdsLb::Helper::CreateSubchannel(
262
- const grpc_channel_args& args) {
397
+ ServerAddress address, const grpc_channel_args& args) {
263
398
  if (eds_policy_->shutting_down_) return nullptr;
264
- return eds_policy_->channel_control_helper()->CreateSubchannel(args);
399
+ // If load reporting is enabled, wrap the subchannel such that it
400
+ // includes the locality stats object, which will be used by the EdsPicker.
401
+ if (eds_policy_->config_->lrs_load_reporting_server_name().has_value()) {
402
+ RefCountedPtr<XdsLocalityName> locality_name;
403
+ auto* attribute = address.GetAttribute(kXdsLocalityNameAttributeKey);
404
+ if (attribute != nullptr) {
405
+ const auto* locality_attr =
406
+ static_cast<const XdsLocalityAttribute*>(attribute);
407
+ locality_name = locality_attr->locality_name();
408
+ }
409
+ RefCountedPtr<XdsClusterLocalityStats> locality_stats =
410
+ eds_policy_->xds_client_->AddClusterLocalityStats(
411
+ *eds_policy_->config_->lrs_load_reporting_server_name(),
412
+ eds_policy_->config_->cluster_name(),
413
+ eds_policy_->config_->eds_service_name(), std::move(locality_name));
414
+ return MakeRefCounted<StatsSubchannelWrapper>(
415
+ eds_policy_->channel_control_helper()->CreateSubchannel(
416
+ std::move(address), args),
417
+ std::move(locality_stats));
418
+ }
419
+ // Load reporting not enabled, so don't wrap the subchannel.
420
+ return eds_policy_->channel_control_helper()->CreateSubchannel(
421
+ std::move(address), args);
265
422
  }
266
423
 
267
424
  void EdsLb::Helper::UpdateState(grpc_connectivity_state state,
425
+ const absl::Status& status,
268
426
  std::unique_ptr<SubchannelPicker> picker) {
269
427
  if (eds_policy_->shutting_down_ || eds_policy_->child_policy_ == nullptr) {
270
428
  return;
271
429
  }
272
430
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
273
- gpr_log(GPR_INFO, "[edslb %p] child policy updated state=%s picker=%p",
274
- eds_policy_.get(), ConnectivityStateName(state), picker.get());
431
+ gpr_log(GPR_INFO,
432
+ "[edslb %p] child policy updated state=%s (%s) "
433
+ "picker=%p",
434
+ eds_policy_.get(), ConnectivityStateName(state),
435
+ status.ToString().c_str(), picker.get());
275
436
  }
276
437
  // Save the state and picker.
277
438
  eds_policy_->child_state_ = state;
439
+ eds_policy_->child_status_ = status;
278
440
  eds_policy_->child_picker_ =
279
441
  MakeRefCounted<ChildPickerWrapper>(std::move(picker));
280
- // Wrap the picker in a DropPicker and pass it up.
281
- eds_policy_->MaybeUpdateDropPickerLocked();
442
+ // Wrap the picker in a EdsPicker and pass it up.
443
+ eds_policy_->MaybeUpdateEdsPickerLocked();
282
444
  }
283
445
 
284
446
  void EdsLb::Helper::AddTraceEvent(TraceSeverity severity,
@@ -288,111 +450,94 @@ void EdsLb::Helper::AddTraceEvent(TraceSeverity severity,
288
450
  }
289
451
 
290
452
  //
291
- // EdsLb::EndpointWatcher
453
+ // EdsLb::EndpointWatcher::Notifier
292
454
  //
293
455
 
294
- class EdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface {
295
- public:
296
- explicit EndpointWatcher(RefCountedPtr<EdsLb> eds_policy)
297
- : eds_policy_(std::move(eds_policy)) {}
456
+ EdsLb::EndpointWatcher::Notifier::Notifier(RefCountedPtr<EdsLb> parent,
457
+ XdsApi::EdsUpdate update)
458
+ : parent_(std::move(parent)), update_(std::move(update)), type_(kUpdate) {
459
+ GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
460
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
461
+ }
298
462
 
299
- ~EndpointWatcher() { eds_policy_.reset(DEBUG_LOCATION, "EndpointWatcher"); }
463
+ EdsLb::EndpointWatcher::Notifier::Notifier(RefCountedPtr<EdsLb> parent,
464
+ grpc_error* error)
465
+ : parent_(std::move(parent)), type_(kError) {
466
+ GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
467
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, error);
468
+ }
300
469
 
301
- void OnEndpointChanged(XdsApi::EdsUpdate update) override {
302
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
303
- gpr_log(GPR_INFO, "[edslb %p] Received EDS update from xds client",
304
- eds_policy_.get());
305
- }
306
- // Update the drop config.
307
- const bool drop_config_changed =
308
- eds_policy_->drop_config_ == nullptr ||
309
- *eds_policy_->drop_config_ != *update.drop_config;
310
- if (drop_config_changed) {
311
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
312
- gpr_log(GPR_INFO, "[edslb %p] Updating drop config", eds_policy_.get());
313
- }
314
- eds_policy_->drop_config_ = std::move(update.drop_config);
315
- eds_policy_->MaybeUpdateDropPickerLocked();
316
- } else if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
317
- gpr_log(GPR_INFO, "[edslb %p] Drop config unchanged, ignoring",
318
- eds_policy_.get());
319
- }
320
- // Update priority and locality info.
321
- if (eds_policy_->child_policy_ == nullptr ||
322
- eds_policy_->priority_list_update_ != update.priority_list_update) {
323
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
324
- gpr_log(GPR_INFO, "[edslb %p] Updating priority list",
325
- eds_policy_.get());
326
- }
327
- eds_policy_->UpdatePriorityList(std::move(update.priority_list_update));
328
- } else if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
329
- gpr_log(GPR_INFO, "[edslb %p] Priority list unchanged, ignoring",
330
- eds_policy_.get());
331
- }
332
- }
333
-
334
- void OnError(grpc_error* error) override {
335
- gpr_log(GPR_ERROR, "[edslb %p] xds watcher reported error: %s",
336
- eds_policy_.get(), grpc_error_string(error));
337
- // Go into TRANSIENT_FAILURE if we have not yet created the child
338
- // policy (i.e., we have not yet received data from xds). Otherwise,
339
- // we keep running with the data we had previously.
340
- if (eds_policy_->child_policy_ == nullptr) {
341
- eds_policy_->channel_control_helper()->UpdateState(
342
- GRPC_CHANNEL_TRANSIENT_FAILURE,
343
- absl::make_unique<TransientFailurePicker>(error));
344
- } else {
345
- GRPC_ERROR_UNREF(error);
346
- }
347
- }
470
+ EdsLb::EndpointWatcher::Notifier::Notifier(RefCountedPtr<EdsLb> parent)
471
+ : parent_(std::move(parent)), type_(kDoesNotExist) {
472
+ GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
473
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
474
+ }
348
475
 
349
- void OnResourceDoesNotExist() override {
350
- gpr_log(
351
- GPR_ERROR,
352
- "[edslb %p] EDS resource does not exist -- reporting TRANSIENT_FAILURE",
353
- eds_policy_.get());
354
- eds_policy_->channel_control_helper()->UpdateState(
355
- GRPC_CHANNEL_TRANSIENT_FAILURE,
356
- absl::make_unique<TransientFailurePicker>(
357
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
358
- "EDS resource does not exist")));
359
- eds_policy_->MaybeDestroyChildPolicyLocked();
360
- }
476
+ void EdsLb::EndpointWatcher::Notifier::RunInExecCtx(void* arg,
477
+ grpc_error* error) {
478
+ Notifier* self = static_cast<Notifier*>(arg);
479
+ GRPC_ERROR_REF(error);
480
+ self->parent_->work_serializer()->Run(
481
+ [self, error]() { self->RunInWorkSerializer(error); }, DEBUG_LOCATION);
482
+ }
361
483
 
362
- private:
363
- RefCountedPtr<EdsLb> eds_policy_;
364
- };
484
+ void EdsLb::EndpointWatcher::Notifier::RunInWorkSerializer(grpc_error* error) {
485
+ switch (type_) {
486
+ case kUpdate:
487
+ parent_->OnEndpointChanged(std::move(update_));
488
+ break;
489
+ case kError:
490
+ parent_->OnError(error);
491
+ break;
492
+ case kDoesNotExist:
493
+ parent_->OnResourceDoesNotExist();
494
+ break;
495
+ };
496
+ delete this;
497
+ }
365
498
 
366
499
  //
367
500
  // EdsLb public methods
368
501
  //
369
502
 
370
- EdsLb::EdsLb(Args args)
371
- : LoadBalancingPolicy(std::move(args)),
372
- xds_client_from_channel_(XdsClient::GetFromChannelArgs(*args.args)) {
503
+ EdsLb::EdsLb(RefCountedPtr<XdsClient> xds_client, Args args)
504
+ : LoadBalancingPolicy(std::move(args)), xds_client_(std::move(xds_client)) {
373
505
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
374
- gpr_log(GPR_INFO, "[edslb %p] created -- xds client from channel: %p", this,
375
- xds_client_from_channel_.get());
506
+ gpr_log(GPR_INFO, "[edslb %p] created -- using xds client %p", this,
507
+ xds_client_.get());
376
508
  }
377
509
  // Record server name.
378
- const grpc_arg* arg = grpc_channel_args_find(args.args, GRPC_ARG_SERVER_URI);
379
- const char* server_uri = grpc_channel_arg_get_string(arg);
510
+ const char* server_uri =
511
+ grpc_channel_args_find_string(args.args, GRPC_ARG_SERVER_URI);
380
512
  GPR_ASSERT(server_uri != nullptr);
381
513
  grpc_uri* uri = grpc_uri_parse(server_uri, true);
382
514
  GPR_ASSERT(uri->path[0] != '\0');
383
515
  server_name_ = uri->path[0] == '/' ? uri->path + 1 : uri->path;
516
+ is_xds_uri_ = strcmp(uri->scheme, "xds") == 0;
384
517
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
385
- gpr_log(GPR_INFO, "[edslb %p] server name from channel: %s", this,
386
- server_name_.c_str());
518
+ gpr_log(GPR_INFO, "[edslb %p] server name from channel (is_xds_uri=%d): %s",
519
+ this, is_xds_uri_, server_name_.c_str());
387
520
  }
388
521
  grpc_uri_destroy(uri);
522
+ // EDS-only flow.
523
+ if (!is_xds_uri_) {
524
+ // Setup channelz linkage.
525
+ channelz::ChannelNode* parent_channelz_node =
526
+ grpc_channel_args_find_pointer<channelz::ChannelNode>(
527
+ args.args, GRPC_ARG_CHANNELZ_CHANNEL_NODE);
528
+ if (parent_channelz_node != nullptr) {
529
+ xds_client_->AddChannelzLinkage(parent_channelz_node);
530
+ }
531
+ // Couple polling.
532
+ grpc_pollset_set_add_pollset_set(xds_client_->interested_parties(),
533
+ interested_parties());
534
+ }
389
535
  }
390
536
 
391
537
  EdsLb::~EdsLb() {
392
538
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
393
- gpr_log(GPR_INFO, "[edslb %p] destroying xds LB policy", this);
539
+ gpr_log(GPR_INFO, "[edslb %p] destroying eds LB policy", this);
394
540
  }
395
- grpc_channel_args_destroy(args_);
396
541
  }
397
542
 
398
543
  void EdsLb::ShutdownLocked() {
@@ -405,22 +550,31 @@ void EdsLb::ShutdownLocked() {
405
550
  child_picker_.reset();
406
551
  MaybeDestroyChildPolicyLocked();
407
552
  drop_stats_.reset();
408
- // Cancel the endpoint watch here instead of in our dtor if we are using the
409
- // xds resolver, because the watcher holds a ref to us and we might not be
410
- // destroying the XdsClient, leading to a situation where this LB policy is
411
- // never destroyed.
412
- if (xds_client_from_channel_ != nullptr) {
413
- if (config_ != nullptr) {
414
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
415
- gpr_log(GPR_INFO, "[edslb %p] cancelling xds watch for %s", this,
416
- std::string(GetEdsResourceName()).c_str());
417
- }
418
- xds_client()->CancelEndpointDataWatch(GetEdsResourceName(),
419
- endpoint_watcher_);
553
+ // Cancel watcher.
554
+ if (endpoint_watcher_ != nullptr) {
555
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
556
+ gpr_log(GPR_INFO, "[edslb %p] cancelling xds watch for %s", this,
557
+ std::string(GetEdsResourceName()).c_str());
420
558
  }
421
- xds_client_from_channel_.reset();
559
+ xds_client_->CancelEndpointDataWatch(GetEdsResourceName(),
560
+ endpoint_watcher_);
422
561
  }
423
- xds_client_.reset();
562
+ if (!is_xds_uri_) {
563
+ // Remove channelz linkage.
564
+ channelz::ChannelNode* parent_channelz_node =
565
+ grpc_channel_args_find_pointer<channelz::ChannelNode>(
566
+ args_, GRPC_ARG_CHANNELZ_CHANNEL_NODE);
567
+ if (parent_channelz_node != nullptr) {
568
+ xds_client_->RemoveChannelzLinkage(parent_channelz_node);
569
+ }
570
+ // Decouple polling.
571
+ grpc_pollset_set_del_pollset_set(xds_client_->interested_parties(),
572
+ interested_parties());
573
+ }
574
+ xds_client_.reset(DEBUG_LOCATION, "EdsLb");
575
+ // Destroy channel args.
576
+ grpc_channel_args_destroy(args_);
577
+ args_ = nullptr;
424
578
  }
425
579
 
426
580
  void EdsLb::MaybeDestroyChildPolicyLocked() {
@@ -443,33 +597,24 @@ void EdsLb::UpdateLocked(UpdateArgs args) {
443
597
  grpc_channel_args_destroy(args_);
444
598
  args_ = args.args;
445
599
  args.args = nullptr;
446
- if (is_initial_update) {
447
- // Initialize XdsClient.
448
- if (xds_client_from_channel_ == nullptr) {
449
- grpc_error* error = GRPC_ERROR_NONE;
450
- xds_client_ = MakeOrphanable<XdsClient>(
451
- work_serializer(), interested_parties(), GetEdsResourceName(),
452
- nullptr /* service config watcher */, *args_, &error);
453
- // TODO(roth): If we decide that we care about EDS-only mode, add
454
- // proper error handling here.
455
- GPR_ASSERT(error == GRPC_ERROR_NONE);
456
- if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
457
- gpr_log(GPR_INFO, "[edslb %p] Created xds client %p", this,
458
- xds_client_.get());
459
- }
460
- }
461
- }
600
+ const bool lrs_server_changed =
601
+ is_initial_update || config_->lrs_load_reporting_server_name() !=
602
+ old_config->lrs_load_reporting_server_name();
603
+ const bool max_concurrent_requests_changed =
604
+ is_initial_update || config_->max_concurrent_requests() !=
605
+ old_config->max_concurrent_requests();
462
606
  // Update drop stats for load reporting if needed.
463
- if (is_initial_update || config_->lrs_load_reporting_server_name() !=
464
- old_config->lrs_load_reporting_server_name()) {
607
+ if (lrs_server_changed) {
465
608
  drop_stats_.reset();
466
609
  if (config_->lrs_load_reporting_server_name().has_value()) {
467
610
  const auto key = GetLrsClusterKey();
468
- drop_stats_ = xds_client()->AddClusterDropStats(
611
+ drop_stats_ = xds_client_->AddClusterDropStats(
469
612
  config_->lrs_load_reporting_server_name().value(),
470
613
  key.first /*cluster_name*/, key.second /*eds_service_name*/);
471
614
  }
472
- MaybeUpdateDropPickerLocked();
615
+ }
616
+ if (lrs_server_changed || max_concurrent_requests_changed) {
617
+ MaybeUpdateEdsPickerLocked();
473
618
  }
474
619
  // Update child policy if needed.
475
620
  // Note that this comes after updating drop_stats_, since we want that
@@ -484,53 +629,89 @@ void EdsLb::UpdateLocked(UpdateArgs args) {
484
629
  auto watcher = absl::make_unique<EndpointWatcher>(
485
630
  Ref(DEBUG_LOCATION, "EndpointWatcher"));
486
631
  endpoint_watcher_ = watcher.get();
487
- xds_client()->WatchEndpointData(GetEdsResourceName(), std::move(watcher));
632
+ xds_client_->WatchEndpointData(GetEdsResourceName(), std::move(watcher));
488
633
  }
489
634
  }
490
635
 
491
636
  void EdsLb::ResetBackoffLocked() {
492
637
  // When the XdsClient is instantiated in the resolver instead of in this
493
- // LB policy, this is done via the resolver, so we don't need to do it
494
- // for xds_client_from_channel_ here.
495
- if (xds_client_ != nullptr) xds_client_->ResetBackoff();
638
+ // LB policy, this is done via the resolver, so we don't need to do it here.
639
+ if (!is_xds_uri_ && xds_client_ != nullptr) xds_client_->ResetBackoff();
496
640
  if (child_policy_ != nullptr) {
497
641
  child_policy_->ResetBackoffLocked();
498
642
  }
499
643
  }
500
644
 
645
+ void EdsLb::OnEndpointChanged(XdsApi::EdsUpdate update) {
646
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
647
+ gpr_log(GPR_INFO, "[edslb %p] Received EDS update from xds client", this);
648
+ }
649
+ // Update the drop config.
650
+ drop_config_ = std::move(update.drop_config);
651
+ // If priority list is empty, add a single priority, just so that we
652
+ // have a child in which to create the eds_drop policy.
653
+ if (update.priorities.empty()) update.priorities.emplace_back();
654
+ // Update child policy.
655
+ UpdatePriorityList(std::move(update.priorities));
656
+ }
657
+
658
+ void EdsLb::OnError(grpc_error* error) {
659
+ gpr_log(GPR_ERROR, "[edslb %p] xds watcher reported error: %s", this,
660
+ grpc_error_string(error));
661
+ // Go into TRANSIENT_FAILURE if we have not yet created the child
662
+ // policy (i.e., we have not yet received data from xds). Otherwise,
663
+ // we keep running with the data we had previously.
664
+ if (child_policy_ == nullptr) {
665
+ channel_control_helper()->UpdateState(
666
+ GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
667
+ absl::make_unique<TransientFailurePicker>(error));
668
+ } else {
669
+ GRPC_ERROR_UNREF(error);
670
+ }
671
+ }
672
+
673
+ void EdsLb::OnResourceDoesNotExist() {
674
+ gpr_log(
675
+ GPR_ERROR,
676
+ "[edslb %p] EDS resource does not exist -- reporting TRANSIENT_FAILURE",
677
+ this);
678
+ grpc_error* error = grpc_error_set_int(
679
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("EDS resource does not exist"),
680
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
681
+ channel_control_helper()->UpdateState(
682
+ GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
683
+ absl::make_unique<TransientFailurePicker>(error));
684
+ MaybeDestroyChildPolicyLocked();
685
+ }
686
+
501
687
  //
502
688
  // child policy-related methods
503
689
  //
504
690
 
505
- void EdsLb::UpdatePriorityList(
506
- XdsApi::PriorityListUpdate priority_list_update) {
691
+ void EdsLb::UpdatePriorityList(XdsApi::EdsUpdate::PriorityList priority_list) {
507
692
  // Build some maps from locality to child number and the reverse from
508
- // the old data in priority_list_update_ and priority_child_numbers_.
693
+ // the old data in priority_list_ and priority_child_numbers_.
509
694
  std::map<XdsLocalityName*, size_t /*child_number*/, XdsLocalityName::Less>
510
695
  locality_child_map;
511
696
  std::map<size_t, std::set<XdsLocalityName*>> child_locality_map;
512
- for (uint32_t priority = 0; priority < priority_list_update_.size();
513
- ++priority) {
514
- auto* locality_map = priority_list_update_.Find(priority);
515
- GPR_ASSERT(locality_map != nullptr);
697
+ for (size_t priority = 0; priority < priority_list_.size(); ++priority) {
516
698
  size_t child_number = priority_child_numbers_[priority];
517
- for (const auto& p : locality_map->localities) {
518
- XdsLocalityName* locality_name = p.first.get();
699
+ const auto& localities = priority_list_[priority].localities;
700
+ for (const auto& p : localities) {
701
+ XdsLocalityName* locality_name = p.first;
519
702
  locality_child_map[locality_name] = child_number;
520
703
  child_locality_map[child_number].insert(locality_name);
521
704
  }
522
705
  }
523
706
  // Construct new list of children.
524
707
  std::vector<size_t> priority_child_numbers;
525
- for (uint32_t priority = 0; priority < priority_list_update.size();
526
- ++priority) {
527
- auto* locality_map = priority_list_update.Find(priority);
528
- GPR_ASSERT(locality_map != nullptr);
708
+ for (size_t priority = 0; priority < priority_list.size(); ++priority) {
709
+ const auto& localities = priority_list[priority].localities;
529
710
  absl::optional<size_t> child_number;
530
711
  // If one of the localities in this priority already existed, reuse its
531
712
  // child number.
532
- for (const auto& p : locality_map->localities) {
533
- XdsLocalityName* locality_name = p.first.get();
713
+ for (const auto& p : localities) {
714
+ XdsLocalityName* locality_name = p.first;
534
715
  if (!child_number.has_value()) {
535
716
  auto it = locality_child_map.find(locality_name);
536
717
  if (it != locality_child_map.end()) {
@@ -564,7 +745,7 @@ void EdsLb::UpdatePriorityList(
564
745
  priority_child_numbers.push_back(*child_number);
565
746
  }
566
747
  // Save update.
567
- priority_list_update_ = std::move(priority_list_update);
748
+ priority_list_ = std::move(priority_list);
568
749
  priority_child_numbers_ = std::move(priority_child_numbers);
569
750
  // Update child policy.
570
751
  UpdateChildPolicyLocked();
@@ -572,23 +753,23 @@ void EdsLb::UpdatePriorityList(
572
753
 
573
754
  ServerAddressList EdsLb::CreateChildPolicyAddressesLocked() {
574
755
  ServerAddressList addresses;
575
- for (uint32_t priority = 0; priority < priority_list_update_.size();
576
- ++priority) {
756
+ for (size_t priority = 0; priority < priority_list_.size(); ++priority) {
757
+ const auto& localities = priority_list_[priority].localities;
577
758
  std::string priority_child_name =
578
759
  absl::StrCat("child", priority_child_numbers_[priority]);
579
- const auto* locality_map = priority_list_update_.Find(priority);
580
- GPR_ASSERT(locality_map != nullptr);
581
- for (const auto& p : locality_map->localities) {
760
+ for (const auto& p : localities) {
582
761
  const auto& locality_name = p.first;
583
762
  const auto& locality = p.second;
584
763
  std::vector<std::string> hierarchical_path = {
585
764
  priority_child_name, locality_name->AsHumanReadableString()};
586
- for (size_t i = 0; i < locality.serverlist.size(); ++i) {
587
- const ServerAddress& address = locality.serverlist[i];
588
- grpc_arg new_arg = MakeHierarchicalPathArg(hierarchical_path);
589
- grpc_channel_args* args =
590
- grpc_channel_args_copy_and_add(address.args(), &new_arg, 1);
591
- addresses.emplace_back(address.address(), args);
765
+ for (const auto& endpoint : locality.endpoints) {
766
+ addresses.emplace_back(
767
+ endpoint
768
+ .WithAttribute(kHierarchicalPathAttributeKey,
769
+ MakeHierarchicalPathAttribute(hierarchical_path))
770
+ .WithAttribute(kXdsLocalityNameAttributeKey,
771
+ absl::make_unique<XdsLocalityAttribute>(
772
+ locality_name->Ref())));
592
773
  }
593
774
  }
594
775
  }
@@ -597,15 +778,14 @@ ServerAddressList EdsLb::CreateChildPolicyAddressesLocked() {
597
778
 
598
779
  RefCountedPtr<LoadBalancingPolicy::Config>
599
780
  EdsLb::CreateChildPolicyConfigLocked() {
781
+ const auto lrs_key = GetLrsClusterKey();
600
782
  Json::Object priority_children;
601
783
  Json::Array priority_priorities;
602
- for (uint32_t priority = 0; priority < priority_list_update_.size();
603
- ++priority) {
604
- const auto* locality_map = priority_list_update_.Find(priority);
605
- GPR_ASSERT(locality_map != nullptr);
784
+ for (size_t priority = 0; priority < priority_list_.size(); ++priority) {
785
+ const auto& localities = priority_list_[priority].localities;
606
786
  Json::Object weighted_targets;
607
- for (const auto& p : locality_map->localities) {
608
- XdsLocalityName* locality_name = p.first.get();
787
+ for (const auto& p : localities) {
788
+ XdsLocalityName* locality_name = p.first;
609
789
  const auto& locality = p.second;
610
790
  // Construct JSON object containing locality name.
611
791
  Json::Object locality_name_json;
@@ -618,45 +798,49 @@ EdsLb::CreateChildPolicyConfigLocked() {
618
798
  if (!locality_name->sub_zone().empty()) {
619
799
  locality_name_json["subzone"] = locality_name->sub_zone();
620
800
  }
621
- // Construct endpoint-picking policy.
622
- // Wrap it in the LRS policy if load reporting is enabled.
623
- Json endpoint_picking_policy;
624
- if (config_->lrs_load_reporting_server_name().has_value()) {
625
- const auto key = GetLrsClusterKey();
626
- Json::Object lrs_config = {
627
- {"clusterName", std::string(key.first)},
628
- {"locality", std::move(locality_name_json)},
629
- {"lrsLoadReportingServerName",
630
- config_->lrs_load_reporting_server_name().value()},
631
- {"childPolicy", config_->endpoint_picking_policy()},
632
- };
633
- if (!key.second.empty()) {
634
- lrs_config["edsServiceName"] = std::string(key.second);
635
- }
636
- endpoint_picking_policy = Json::Array{Json::Object{
637
- {"lrs_experimental", std::move(lrs_config)},
638
- }};
639
- } else {
640
- endpoint_picking_policy = config_->endpoint_picking_policy();
641
- }
642
801
  // Add weighted target entry.
643
802
  weighted_targets[locality_name->AsHumanReadableString()] = Json::Object{
644
803
  {"weight", locality.lb_weight},
645
- {"childPolicy", std::move(endpoint_picking_policy)},
804
+ {"childPolicy", config_->endpoint_picking_policy()},
646
805
  };
647
806
  }
648
- // Add priority entry.
649
- const size_t child_number = priority_child_numbers_[priority];
650
- std::string child_name = absl::StrCat("child", child_number);
651
- priority_priorities.emplace_back(child_name);
807
+ // Construct locality-picking policy.
808
+ // Start with field from our config and add the "targets" field.
652
809
  Json locality_picking_config = config_->locality_picking_policy();
653
810
  Json::Object& config =
654
811
  *(*locality_picking_config.mutable_array())[0].mutable_object();
655
812
  auto it = config.begin();
656
813
  GPR_ASSERT(it != config.end());
657
814
  (*it->second.mutable_object())["targets"] = std::move(weighted_targets);
815
+ // Wrap it in the drop policy.
816
+ Json::Array drop_categories;
817
+ for (const auto& category : drop_config_->drop_category_list()) {
818
+ drop_categories.push_back(Json::Object{
819
+ {"category", category.name},
820
+ {"requests_per_million", category.parts_per_million},
821
+ });
822
+ }
823
+ Json::Object eds_drop_config = {
824
+ {"clusterName", std::string(lrs_key.first)},
825
+ {"childPolicy", std::move(locality_picking_config)},
826
+ {"dropCategories", std::move(drop_categories)},
827
+ };
828
+ if (!lrs_key.second.empty()) {
829
+ eds_drop_config["edsServiceName"] = std::string(lrs_key.second);
830
+ }
831
+ if (config_->lrs_load_reporting_server_name().has_value()) {
832
+ eds_drop_config["lrsLoadReportingServerName"] =
833
+ config_->lrs_load_reporting_server_name().value();
834
+ }
835
+ Json locality_picking_policy = Json::Array{Json::Object{
836
+ {"eds_drop_experimental", std::move(eds_drop_config)},
837
+ }};
838
+ // Add priority entry.
839
+ const size_t child_number = priority_child_numbers_[priority];
840
+ std::string child_name = absl::StrCat("child", child_number);
841
+ priority_priorities.emplace_back(child_name);
658
842
  priority_children[child_name] = Json::Object{
659
- {"config", std::move(locality_picking_config)},
843
+ {"config", std::move(locality_picking_policy)},
660
844
  };
661
845
  }
662
846
  Json json = Json::Array{Json::Object{
@@ -688,7 +872,7 @@ EdsLb::CreateChildPolicyConfigLocked() {
688
872
  error),
689
873
  GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
690
874
  channel_control_helper()->UpdateState(
691
- GRPC_CHANNEL_TRANSIENT_FAILURE,
875
+ GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
692
876
  absl::make_unique<TransientFailurePicker>(error));
693
877
  return nullptr;
694
878
  }
@@ -714,9 +898,11 @@ void EdsLb::UpdateChildPolicyLocked() {
714
898
 
715
899
  grpc_channel_args* EdsLb::CreateChildPolicyArgsLocked(
716
900
  const grpc_channel_args* args) {
717
- absl::InlinedVector<grpc_arg, 3> args_to_add = {
901
+ grpc_arg args_to_add[] = {
718
902
  // A channel arg indicating if the target is a backend inferred from an
719
903
  // xds load balancer.
904
+ // TODO(roth): This isn't needed with the new fallback design.
905
+ // Remove as part of implementing the new fallback functionality.
720
906
  grpc_channel_arg_integer_create(
721
907
  const_cast<char*>(GRPC_ARG_ADDRESS_IS_BACKEND_FROM_XDS_LOAD_BALANCER),
722
908
  1),
@@ -725,18 +911,8 @@ grpc_channel_args* EdsLb::CreateChildPolicyArgsLocked(
725
911
  grpc_channel_arg_integer_create(
726
912
  const_cast<char*>(GRPC_ARG_INHIBIT_HEALTH_CHECKING), 1),
727
913
  };
728
- absl::InlinedVector<const char*, 1> args_to_remove;
729
- if (xds_client_from_channel_ == nullptr) {
730
- args_to_add.emplace_back(xds_client_->MakeChannelArg());
731
- } else if (!config_->lrs_load_reporting_server_name().has_value()) {
732
- // Remove XdsClient from channel args, so that its presence doesn't
733
- // prevent us from sharing subchannels between channels.
734
- // If load reporting is enabled, this happens in the LRS policy instead.
735
- args_to_remove.push_back(GRPC_ARG_XDS_CLIENT);
736
- }
737
- return grpc_channel_args_copy_and_add_and_remove(
738
- args, args_to_remove.data(), args_to_remove.size(), args_to_add.data(),
739
- args_to_add.size());
914
+ return grpc_channel_args_copy_and_add(args, args_to_add,
915
+ GPR_ARRAY_SIZE(args_to_add));
740
916
  }
741
917
 
742
918
  OrphanablePtr<LoadBalancingPolicy> EdsLb::CreateChildPolicyLocked(
@@ -765,18 +941,12 @@ OrphanablePtr<LoadBalancingPolicy> EdsLb::CreateChildPolicyLocked(
765
941
  return lb_policy;
766
942
  }
767
943
 
768
- void EdsLb::MaybeUpdateDropPickerLocked() {
769
- // If we're dropping all calls, report READY, regardless of what (or
770
- // whether) the child has reported.
771
- if (drop_config_ != nullptr && drop_config_->drop_all()) {
772
- channel_control_helper()->UpdateState(GRPC_CHANNEL_READY,
773
- absl::make_unique<DropPicker>(this));
774
- return;
775
- }
944
+ void EdsLb::MaybeUpdateEdsPickerLocked() {
776
945
  // Update only if we have a child picker.
777
946
  if (child_picker_ != nullptr) {
778
- channel_control_helper()->UpdateState(child_state_,
779
- absl::make_unique<DropPicker>(this));
947
+ channel_control_helper()->UpdateState(
948
+ child_state_, child_status_,
949
+ absl::make_unique<EdsPicker>(Ref(DEBUG_LOCATION, "EdsPicker")));
780
950
  }
781
951
  }
782
952
 
@@ -788,7 +958,17 @@ class EdsLbFactory : public LoadBalancingPolicyFactory {
788
958
  public:
789
959
  OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
790
960
  LoadBalancingPolicy::Args args) const override {
791
- return MakeOrphanable<EdsChildHandler>(std::move(args), &grpc_lb_eds_trace);
961
+ grpc_error* error = GRPC_ERROR_NONE;
962
+ RefCountedPtr<XdsClient> xds_client = XdsClient::GetOrCreate(&error);
963
+ if (error != GRPC_ERROR_NONE) {
964
+ gpr_log(GPR_ERROR,
965
+ "cannot get XdsClient to instantiate eds LB policy: %s",
966
+ grpc_error_string(error));
967
+ GRPC_ERROR_UNREF(error);
968
+ return nullptr;
969
+ }
970
+ return MakeOrphanable<EdsChildHandler>(std::move(xds_client),
971
+ std::move(args));
792
972
  }
793
973
 
794
974
  const char* name() const override { return kEds; }
@@ -882,13 +1062,25 @@ class EdsLbFactory : public LoadBalancingPolicyFactory {
882
1062
  "endpointPickingPolicy", &parse_error, 1));
883
1063
  GRPC_ERROR_UNREF(parse_error);
884
1064
  }
1065
+ // Max concurrent requests.
1066
+ uint32_t max_concurrent_requests = 1024;
1067
+ it = json.object_value().find("max_concurrent_requests");
1068
+ if (it != json.object_value().end()) {
1069
+ if (it->second.type() != Json::Type::NUMBER) {
1070
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1071
+ "field:max_concurrent_requests error:must be of type number"));
1072
+ } else {
1073
+ max_concurrent_requests =
1074
+ gpr_parse_nonnegative_int(it->second.string_value().c_str());
1075
+ }
1076
+ }
885
1077
  // Construct config.
886
1078
  if (error_list.empty()) {
887
1079
  return MakeRefCounted<EdsLbConfig>(
888
1080
  std::move(cluster_name), std::move(eds_service_name),
889
1081
  std::move(lrs_load_reporting_server_name),
890
1082
  std::move(locality_picking_policy),
891
- std::move(endpoint_picking_policy));
1083
+ std::move(endpoint_picking_policy), max_concurrent_requests);
892
1084
  } else {
893
1085
  *error = GRPC_ERROR_CREATE_FROM_VECTOR(
894
1086
  "eds_experimental LB policy config", &error_list);
@@ -899,8 +1091,9 @@ class EdsLbFactory : public LoadBalancingPolicyFactory {
899
1091
  private:
900
1092
  class EdsChildHandler : public ChildPolicyHandler {
901
1093
  public:
902
- EdsChildHandler(Args args, TraceFlag* tracer)
903
- : ChildPolicyHandler(std::move(args), tracer) {}
1094
+ EdsChildHandler(RefCountedPtr<XdsClient> xds_client, Args args)
1095
+ : ChildPolicyHandler(std::move(args), &grpc_lb_eds_trace),
1096
+ xds_client_(std::move(xds_client)) {}
904
1097
 
905
1098
  bool ConfigChangeRequiresNewPolicyInstance(
906
1099
  LoadBalancingPolicy::Config* old_config,
@@ -911,13 +1104,18 @@ class EdsLbFactory : public LoadBalancingPolicyFactory {
911
1104
  EdsLbConfig* new_eds_config = static_cast<EdsLbConfig*>(new_config);
912
1105
  return old_eds_config->cluster_name() != new_eds_config->cluster_name() ||
913
1106
  old_eds_config->eds_service_name() !=
914
- new_eds_config->eds_service_name();
1107
+ new_eds_config->eds_service_name() ||
1108
+ old_eds_config->lrs_load_reporting_server_name() !=
1109
+ new_eds_config->lrs_load_reporting_server_name();
915
1110
  }
916
1111
 
917
1112
  OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
918
1113
  const char* name, LoadBalancingPolicy::Args args) const override {
919
- return MakeOrphanable<EdsLb>(std::move(args));
1114
+ return MakeOrphanable<EdsLb>(xds_client_, std::move(args));
920
1115
  }
1116
+
1117
+ private:
1118
+ RefCountedPtr<XdsClient> xds_client_;
921
1119
  };
922
1120
  };
923
1121