grpc 1.31.1 → 1.32.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 (431) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +595 -15723
  3. data/include/grpc/grpc_security.h +31 -14
  4. data/include/grpc/impl/codegen/README.md +22 -0
  5. data/include/grpc/impl/codegen/port_platform.h +6 -1
  6. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -2
  7. data/src/core/ext/filters/client_channel/client_channel.cc +64 -20
  8. data/src/core/ext/filters/client_channel/client_channel.h +1 -1
  9. data/src/core/ext/filters/client_channel/client_channel_channelz.h +0 -3
  10. data/src/core/ext/filters/client_channel/health/health_check_client.cc +6 -1
  11. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -3
  12. data/src/core/ext/filters/client_channel/lb_policy.h +2 -0
  13. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +6 -4
  14. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +20 -13
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -13
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +0 -3
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -37
  18. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +19 -13
  19. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +29 -10
  20. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -4
  21. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +20 -9
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +18 -12
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +22 -14
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +18 -9
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +54 -56
  26. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +3 -3
  27. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  29. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -1
  30. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  31. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +363 -14
  32. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +0 -1
  33. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +5 -4
  34. data/src/core/ext/filters/client_channel/server_address.cc +40 -7
  35. data/src/core/ext/filters/client_channel/server_address.h +42 -4
  36. data/src/core/ext/filters/client_channel/subchannel.cc +64 -23
  37. data/src/core/ext/filters/client_channel/subchannel.h +16 -4
  38. data/src/core/ext/filters/max_age/max_age_filter.cc +2 -1
  39. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +87 -31
  40. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +18 -1
  41. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +10 -35
  42. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +19 -25
  43. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -1
  44. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -2
  45. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +6 -6
  46. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -2
  47. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +239 -277
  48. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -1
  49. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  50. data/src/core/ext/transport/chttp2/transport/internal.h +5 -1
  51. data/src/core/ext/transport/chttp2/transport/parsing.cc +1 -28
  52. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -5
  53. data/src/core/ext/transport/inproc/inproc_transport.cc +12 -12
  54. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +224 -0
  55. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +700 -0
  56. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +74 -0
  57. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +226 -0
  58. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +380 -0
  59. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1378 -0
  60. data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/filter.upb.c +8 -8
  61. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +69 -0
  62. data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/outlier_detection.upb.c +8 -8
  63. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +323 -0
  64. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +112 -0
  65. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +334 -0
  66. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/backoff.upb.c +8 -8
  67. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +79 -0
  68. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +309 -0
  69. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +869 -0
  70. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +96 -0
  71. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +328 -0
  72. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +34 -0
  73. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +71 -0
  74. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +195 -0
  75. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +634 -0
  76. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +170 -0
  77. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +684 -0
  78. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/http_uri.upb.c +8 -8
  79. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +80 -0
  80. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +152 -0
  81. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +536 -0
  82. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +28 -0
  83. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +58 -0
  84. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/socket_option.upb.c +6 -6
  85. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +88 -0
  86. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +91 -0
  87. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +220 -0
  88. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +91 -0
  89. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +273 -0
  90. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +112 -0
  91. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +332 -0
  92. data/src/core/ext/upb-generated/envoy/config/listener/{v2 → v3}/api_listener.upb.c +8 -8
  93. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +65 -0
  94. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +108 -0
  95. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +401 -0
  96. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +138 -0
  97. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +490 -0
  98. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +41 -0
  99. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +94 -0
  100. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +174 -0
  101. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +599 -0
  102. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +63 -0
  103. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +204 -0
  104. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +773 -0
  105. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2855 -0
  106. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +59 -0
  107. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +135 -0
  108. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +50 -0
  109. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +108 -0
  110. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +312 -0
  111. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1125 -0
  112. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +20 -0
  113. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +34 -0
  114. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +111 -0
  115. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +401 -0
  116. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +72 -0
  117. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +198 -0
  118. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +105 -0
  119. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +388 -0
  120. data/src/core/ext/upb-generated/envoy/{api/v2 → service/cluster/v3}/cds.upb.c +5 -6
  121. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +49 -0
  122. data/src/core/ext/upb-generated/envoy/service/discovery/{v2 → v3}/ads.upb.c +5 -4
  123. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +49 -0
  124. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +129 -0
  125. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +386 -0
  126. data/src/core/ext/upb-generated/envoy/{api/v2 → service/endpoint/v3}/eds.upb.c +5 -6
  127. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +49 -0
  128. data/src/core/ext/upb-generated/envoy/{api/v2 → service/listener/v3}/lds.upb.c +5 -6
  129. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +49 -0
  130. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +55 -0
  131. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +136 -0
  132. data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/rds.upb.c +5 -6
  133. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +49 -0
  134. data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/srds.upb.c +5 -6
  135. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +49 -0
  136. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +47 -0
  137. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +114 -0
  138. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +35 -0
  139. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +77 -0
  140. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +34 -0
  141. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +71 -0
  142. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +64 -0
  143. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +145 -0
  144. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +53 -0
  145. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +127 -0
  146. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +63 -0
  147. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +188 -0
  148. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +88 -0
  149. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +258 -0
  150. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +90 -0
  151. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +250 -0
  152. data/src/core/ext/upb-generated/envoy/type/{http.upb.c → v3/http.upb.c} +2 -2
  153. data/src/core/ext/upb-generated/envoy/type/{http.upb.h → v3/http.upb.h} +8 -8
  154. data/src/core/ext/upb-generated/envoy/type/{percent.upb.c → v3/percent.upb.c} +9 -8
  155. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +86 -0
  156. data/src/core/ext/upb-generated/envoy/type/{range.upb.c → v3/range.upb.c} +12 -11
  157. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +111 -0
  158. data/src/core/ext/upb-generated/envoy/type/{semantic_version.upb.c → v3/semantic_version.upb.c} +6 -5
  159. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +61 -0
  160. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +234 -0
  161. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +759 -0
  162. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +36 -36
  163. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +1 -1
  164. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +27 -0
  165. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +53 -0
  166. data/src/core/ext/upb-generated/validate/validate.upb.c +11 -11
  167. data/src/core/ext/upb-generated/validate/validate.upb.h +1 -1
  168. data/src/core/ext/{filters/client_channel/xds → xds}/xds_api.cc +1045 -767
  169. data/src/core/ext/{filters/client_channel/xds → xds}/xds_api.h +114 -99
  170. data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.cc +44 -2
  171. data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.h +8 -3
  172. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel.h +4 -4
  173. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_args.h +3 -3
  174. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_secure.cc +2 -5
  175. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.cc +85 -417
  176. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.h +12 -45
  177. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.cc +2 -2
  178. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.h +3 -3
  179. data/src/core/lib/channel/channelz.cc +14 -15
  180. data/src/core/lib/channel/channelz.h +1 -1
  181. data/src/core/lib/channel/channelz_registry.cc +3 -1
  182. data/src/core/lib/gpr/sync_posix.cc +2 -8
  183. data/src/core/lib/iomgr/endpoint.cc +5 -1
  184. data/src/core/lib/iomgr/endpoint.h +7 -3
  185. data/src/core/lib/iomgr/endpoint_cfstream.cc +32 -11
  186. data/src/core/lib/iomgr/ev_posix.cc +0 -2
  187. data/src/core/lib/iomgr/iomgr.cc +0 -10
  188. data/src/core/lib/iomgr/iomgr.h +0 -10
  189. data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.cc +1 -1
  190. data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.h +3 -3
  191. data/src/core/lib/iomgr/sockaddr_utils.cc +2 -1
  192. data/src/core/lib/iomgr/sockaddr_utils.h +2 -1
  193. data/src/core/lib/iomgr/tcp_custom.cc +32 -16
  194. data/src/core/lib/iomgr/tcp_posix.cc +31 -13
  195. data/src/core/lib/iomgr/tcp_windows.cc +26 -10
  196. data/src/core/lib/security/authorization/authorization_engine.cc +177 -0
  197. data/src/core/lib/security/authorization/authorization_engine.h +84 -0
  198. data/src/core/lib/security/authorization/evaluate_args.cc +153 -0
  199. data/src/core/lib/security/authorization/evaluate_args.h +59 -0
  200. data/src/core/lib/security/authorization/mock_cel/activation.h +57 -0
  201. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +42 -0
  202. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +68 -0
  203. data/src/core/lib/security/authorization/mock_cel/cel_value.h +93 -0
  204. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +67 -0
  205. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +56 -0
  206. data/src/core/lib/security/authorization/mock_cel/statusor.h +50 -0
  207. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +56 -38
  208. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -2
  209. data/src/core/lib/security/transport/secure_endpoint.cc +7 -1
  210. data/src/core/lib/surface/call.cc +12 -12
  211. data/src/core/lib/surface/call.h +2 -1
  212. data/src/core/lib/surface/channel.cc +28 -20
  213. data/src/core/lib/surface/channel.h +12 -2
  214. data/src/core/lib/surface/completion_queue.cc +10 -272
  215. data/src/core/lib/surface/completion_queue.h +0 -8
  216. data/src/core/lib/surface/init.cc +1 -3
  217. data/src/core/lib/surface/server.cc +1066 -1244
  218. data/src/core/lib/surface/server.h +363 -87
  219. data/src/core/lib/surface/version.cc +2 -2
  220. data/src/core/lib/transport/authority_override.cc +38 -0
  221. data/src/core/lib/transport/authority_override.h +32 -0
  222. data/src/core/lib/transport/connectivity_state.cc +18 -13
  223. data/src/core/lib/transport/connectivity_state.h +18 -6
  224. data/src/core/lib/transport/error_utils.cc +13 -0
  225. data/src/core/lib/transport/error_utils.h +6 -0
  226. data/src/core/lib/transport/static_metadata.cc +295 -276
  227. data/src/core/lib/transport/static_metadata.h +80 -73
  228. data/src/core/lib/transport/transport.h +7 -0
  229. data/src/core/lib/uri/uri_parser.cc +23 -21
  230. data/src/core/lib/uri/uri_parser.h +3 -1
  231. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +22 -0
  232. data/src/core/tsi/ssl_transport_security.cc +3 -9
  233. data/src/ruby/ext/grpc/rb_channel_credentials.c +9 -0
  234. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -2
  235. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -4
  236. data/src/ruby/lib/grpc/version.rb +1 -1
  237. data/src/ruby/spec/channel_credentials_spec.rb +10 -0
  238. data/src/ruby/spec/generic/active_call_spec.rb +19 -8
  239. data/third_party/abseil-cpp/absl/algorithm/container.h +1727 -0
  240. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +161 -0
  241. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.cc +93 -0
  242. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.h +130 -0
  243. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +620 -0
  244. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +126 -0
  245. data/third_party/abseil-cpp/absl/container/fixed_array.h +515 -0
  246. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +503 -0
  247. data/third_party/abseil-cpp/absl/container/internal/common.h +202 -0
  248. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +440 -0
  249. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +146 -0
  250. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +191 -0
  251. data/third_party/abseil-cpp/absl/container/internal/hashtable_debug_hooks.h +85 -0
  252. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +269 -0
  253. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +297 -0
  254. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +30 -0
  255. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +49 -0
  256. data/third_party/abseil-cpp/absl/container/internal/layout.h +741 -0
  257. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +48 -0
  258. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1882 -0
  259. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +138 -0
  260. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.h +32 -0
  261. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +1895 -0
  262. data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +71 -0
  263. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +382 -0
  264. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +134 -0
  265. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +192 -0
  266. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +125 -0
  267. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +70 -0
  268. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +99 -0
  269. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +248 -0
  270. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +24 -0
  271. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +85 -0
  272. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +346 -0
  273. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +128 -0
  274. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +194 -0
  275. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.h +158 -0
  276. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +140 -0
  277. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +231 -0
  278. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +25 -0
  279. data/third_party/abseil-cpp/absl/debugging/symbolize.h +99 -0
  280. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +1480 -0
  281. data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +40 -0
  282. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +81 -0
  283. data/third_party/abseil-cpp/absl/functional/function_ref.h +139 -0
  284. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +106 -0
  285. data/third_party/abseil-cpp/absl/hash/hash.h +324 -0
  286. data/third_party/abseil-cpp/absl/hash/internal/city.cc +346 -0
  287. data/third_party/abseil-cpp/absl/hash/internal/city.h +96 -0
  288. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +55 -0
  289. data/third_party/abseil-cpp/absl/hash/internal/hash.h +988 -0
  290. data/third_party/abseil-cpp/absl/status/status.cc +447 -0
  291. data/third_party/abseil-cpp/absl/status/status.h +428 -0
  292. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +43 -0
  293. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +51 -0
  294. data/third_party/abseil-cpp/absl/strings/cord.cc +2019 -0
  295. data/third_party/abseil-cpp/absl/strings/cord.h +1121 -0
  296. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +151 -0
  297. data/third_party/abseil-cpp/absl/synchronization/barrier.cc +52 -0
  298. data/third_party/abseil-cpp/absl/synchronization/barrier.h +79 -0
  299. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +57 -0
  300. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +99 -0
  301. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +140 -0
  302. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +60 -0
  303. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +697 -0
  304. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.h +141 -0
  305. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +155 -0
  306. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +261 -0
  307. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +106 -0
  308. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +115 -0
  309. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +484 -0
  310. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +159 -0
  311. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +2728 -0
  312. data/third_party/abseil-cpp/absl/synchronization/mutex.h +1056 -0
  313. data/third_party/abseil-cpp/absl/synchronization/notification.cc +78 -0
  314. data/third_party/abseil-cpp/absl/synchronization/notification.h +123 -0
  315. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +64 -0
  316. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +82 -0
  317. data/third_party/abseil-cpp/absl/types/internal/variant.h +1646 -0
  318. data/third_party/abseil-cpp/absl/types/variant.h +861 -0
  319. data/third_party/boringssl-with-bazel/err_data.c +263 -257
  320. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +16 -0
  321. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +456 -0
  322. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +192 -0
  323. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +20 -0
  324. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +52 -0
  325. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +1 -1
  326. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +39 -7
  327. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +2 -3
  328. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +11 -0
  329. data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -0
  330. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +3 -6
  331. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +10 -0
  332. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +34 -9
  333. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +5 -0
  334. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +5 -3
  335. data/third_party/upb/upb/decode.c +64 -15
  336. data/third_party/upb/upb/encode.c +2 -2
  337. data/third_party/upb/upb/msg.h +2 -2
  338. data/third_party/upb/upb/port_def.inc +1 -1
  339. data/third_party/upb/upb/table.c +0 -11
  340. data/third_party/upb/upb/table.int.h +0 -9
  341. data/third_party/upb/upb/upb.c +16 -14
  342. data/third_party/upb/upb/upb.h +26 -0
  343. data/third_party/upb/upb/upb.hpp +2 -0
  344. metadata +257 -155
  345. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +0 -21
  346. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +0 -34
  347. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +0 -114
  348. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +0 -429
  349. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +0 -72
  350. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +0 -198
  351. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +0 -105
  352. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +0 -388
  353. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +0 -52
  354. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +0 -403
  355. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +0 -1453
  356. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +0 -74
  357. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +0 -226
  358. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +0 -69
  359. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +0 -323
  360. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +0 -112
  361. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +0 -334
  362. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +0 -79
  363. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +0 -313
  364. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +0 -891
  365. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +0 -96
  366. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +0 -328
  367. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +0 -34
  368. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +0 -71
  369. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +0 -197
  370. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +0 -649
  371. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +0 -172
  372. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +0 -693
  373. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +0 -80
  374. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +0 -152
  375. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +0 -536
  376. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +0 -88
  377. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +0 -129
  378. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +0 -386
  379. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +0 -52
  380. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +0 -92
  381. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +0 -224
  382. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +0 -18
  383. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -32
  384. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +0 -91
  385. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +0 -273
  386. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +0 -112
  387. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +0 -332
  388. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +0 -52
  389. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +0 -109
  390. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +0 -415
  391. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +0 -18
  392. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -32
  393. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +0 -145
  394. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +0 -538
  395. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +0 -43
  396. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +0 -111
  397. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +0 -52
  398. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +0 -63
  399. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +0 -204
  400. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +0 -18
  401. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -32
  402. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +0 -815
  403. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +0 -2984
  404. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +0 -59
  405. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +0 -135
  406. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +0 -52
  407. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +0 -228
  408. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +0 -732
  409. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +0 -316
  410. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +0 -1167
  411. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +0 -65
  412. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +0 -51
  413. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +0 -125
  414. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +0 -49
  415. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +0 -54
  416. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +0 -136
  417. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +0 -63
  418. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +0 -145
  419. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +0 -53
  420. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +0 -133
  421. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +0 -88
  422. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +0 -258
  423. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +0 -86
  424. data/src/core/ext/upb-generated/envoy/type/range.upb.h +0 -111
  425. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +0 -61
  426. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +0 -89
  427. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +0 -250
  428. data/src/core/lib/security/transport/target_authority_table.cc +0 -75
  429. data/src/core/lib/security/transport/target_authority_table.h +0 -40
  430. data/src/core/lib/slice/slice_hash_table.h +0 -199
  431. data/src/core/lib/slice/slice_weak_hash_table.h +0 -102
@@ -33,7 +33,6 @@
33
33
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
34
34
  #include "src/core/lib/iomgr/exec_ctx.h" // for grpc_millis
35
35
  #include "src/core/lib/json/json.h"
36
- #include "src/core/lib/slice/slice_hash_table.h"
37
36
 
38
37
  namespace grpc_core {
39
38
  namespace internal {
@@ -114,10 +114,11 @@ class ResolvingLoadBalancingPolicy::ResolvingControlHelper
114
114
  return parent_->channel_control_helper()->CreateSubchannel(args);
115
115
  }
116
116
 
117
- void UpdateState(grpc_connectivity_state state,
117
+ void UpdateState(grpc_connectivity_state state, const absl::Status& status,
118
118
  std::unique_ptr<SubchannelPicker> picker) override {
119
119
  if (parent_->resolver_ == nullptr) return; // Shutting down.
120
- parent_->channel_control_helper()->UpdateState(state, std::move(picker));
120
+ parent_->channel_control_helper()->UpdateState(state, status,
121
+ std::move(picker));
121
122
  }
122
123
 
123
124
  void RequestReresolution() override {
@@ -160,7 +161,7 @@ ResolvingLoadBalancingPolicy::ResolvingLoadBalancingPolicy(
160
161
  if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) {
161
162
  gpr_log(GPR_INFO, "resolving_lb=%p: starting name resolution", this);
162
163
  }
163
- channel_control_helper()->UpdateState(GRPC_CHANNEL_CONNECTING,
164
+ channel_control_helper()->UpdateState(GRPC_CHANNEL_CONNECTING, absl::Status(),
164
165
  absl::make_unique<QueuePicker>(Ref()));
165
166
  resolver_->StartLocked();
166
167
  }
@@ -214,7 +215,7 @@ void ResolvingLoadBalancingPolicy::OnResolverError(grpc_error* error) {
214
215
  "Resolver transient failure", &error, 1);
215
216
  helper_->ResolverTransientFailure(GRPC_ERROR_REF(state_error));
216
217
  channel_control_helper()->UpdateState(
217
- GRPC_CHANNEL_TRANSIENT_FAILURE,
218
+ GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(state_error),
218
219
  absl::make_unique<TransientFailurePicker>(state_error));
219
220
  }
220
221
  GRPC_ERROR_UNREF(error);
@@ -26,23 +26,56 @@ namespace grpc_core {
26
26
  // ServerAddress
27
27
  //
28
28
 
29
- ServerAddress::ServerAddress(const grpc_resolved_address& address,
30
- grpc_channel_args* args)
31
- : address_(address), args_(args) {}
29
+ ServerAddress::ServerAddress(
30
+ const grpc_resolved_address& address, grpc_channel_args* args,
31
+ std::map<const char*, std::unique_ptr<AttributeInterface>> attributes)
32
+ : address_(address), args_(args), attributes_(std::move(attributes)) {}
32
33
 
33
- ServerAddress::ServerAddress(const void* address, size_t address_len,
34
- grpc_channel_args* args)
35
- : args_(args) {
34
+ ServerAddress::ServerAddress(
35
+ const void* address, size_t address_len, grpc_channel_args* args,
36
+ std::map<const char*, std::unique_ptr<AttributeInterface>> attributes)
37
+ : args_(args), attributes_(std::move(attributes)) {
36
38
  memcpy(address_.addr, address, address_len);
37
39
  address_.len = static_cast<socklen_t>(address_len);
38
40
  }
39
41
 
42
+ namespace {
43
+
44
+ int CompareAttributes(
45
+ const std::map<const char*,
46
+ std::unique_ptr<ServerAddress::AttributeInterface>>&
47
+ attributes1,
48
+ const std::map<const char*,
49
+ std::unique_ptr<ServerAddress::AttributeInterface>>&
50
+ attributes2) {
51
+ auto it2 = attributes2.begin();
52
+ for (auto it1 = attributes1.begin(); it1 != attributes1.end(); ++it1) {
53
+ // attributes2 has fewer elements than attributes1
54
+ if (it2 == attributes2.end()) return -1;
55
+ // compare keys
56
+ int retval = strcmp(it1->first, it2->first);
57
+ if (retval != 0) return retval;
58
+ // compare values
59
+ retval = it1->second->Cmp(it2->second.get());
60
+ if (retval != 0) return retval;
61
+ ++it2;
62
+ }
63
+ // attributes1 has fewer elements than attributes2
64
+ if (it2 != attributes2.end()) return 1;
65
+ // equal
66
+ return 0;
67
+ }
68
+
69
+ } // namespace
70
+
40
71
  int ServerAddress::Cmp(const ServerAddress& other) const {
41
72
  if (address_.len > other.address_.len) return 1;
42
73
  if (address_.len < other.address_.len) return -1;
43
74
  int retval = memcmp(address_.addr, other.address_.addr, address_.len);
44
75
  if (retval != 0) return retval;
45
- return grpc_channel_args_compare(args_, other.args_);
76
+ retval = grpc_channel_args_compare(args_, other.args_);
77
+ if (retval != 0) return retval;
78
+ return CompareAttributes(attributes_, other.attributes_);
46
79
  }
47
80
 
48
81
  } // namespace grpc_core
@@ -21,6 +21,8 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <map>
25
+
24
26
  #include "absl/container/inlined_vector.h"
25
27
 
26
28
  #include "src/core/lib/channel/channel_args.h"
@@ -37,26 +39,54 @@ namespace grpc_core {
37
39
  // args when a subchannel is created for this address.
38
40
  class ServerAddress {
39
41
  public:
42
+ // Base class for resolver-supplied attributes.
43
+ // Unlike channel args, these attributes don't affect subchannel
44
+ // uniqueness or behavior. They are for use by LB policies only.
45
+ class AttributeInterface {
46
+ public:
47
+ virtual ~AttributeInterface();
48
+
49
+ // Creates a copy of the attribute.
50
+ virtual std::unique_ptr<AttributeInterface> Copy() const = 0;
51
+
52
+ // Compares this attribute with another.
53
+ virtual int Cmp(const AttributeInterface* other) const = 0;
54
+ };
55
+
40
56
  // Takes ownership of args.
41
- ServerAddress(const grpc_resolved_address& address, grpc_channel_args* args);
57
+ ServerAddress(const grpc_resolved_address& address, grpc_channel_args* args,
58
+ std::map<const char*, std::unique_ptr<AttributeInterface>>
59
+ attributes = {});
42
60
  ServerAddress(const void* address, size_t address_len,
43
- grpc_channel_args* args);
61
+ grpc_channel_args* args,
62
+ std::map<const char*, std::unique_ptr<AttributeInterface>>
63
+ attributes = {});
44
64
 
45
65
  ~ServerAddress() { grpc_channel_args_destroy(args_); }
46
66
 
47
67
  // Copyable.
48
68
  ServerAddress(const ServerAddress& other)
49
- : address_(other.address_), args_(grpc_channel_args_copy(other.args_)) {}
69
+ : address_(other.address_), args_(grpc_channel_args_copy(other.args_)) {
70
+ for (const auto& p : other.attributes_) {
71
+ attributes_[p.first] = p.second->Copy();
72
+ }
73
+ }
50
74
  ServerAddress& operator=(const ServerAddress& other) {
51
75
  address_ = other.address_;
52
76
  grpc_channel_args_destroy(args_);
53
77
  args_ = grpc_channel_args_copy(other.args_);
78
+ attributes_.clear();
79
+ for (const auto& p : other.attributes_) {
80
+ attributes_[p.first] = p.second->Copy();
81
+ }
54
82
  return *this;
55
83
  }
56
84
 
57
85
  // Movable.
58
86
  ServerAddress(ServerAddress&& other)
59
- : address_(other.address_), args_(other.args_) {
87
+ : address_(other.address_),
88
+ args_(other.args_),
89
+ attributes_(std::move(other.attributes_)) {
60
90
  other.args_ = nullptr;
61
91
  }
62
92
  ServerAddress& operator=(ServerAddress&& other) {
@@ -64,6 +94,7 @@ class ServerAddress {
64
94
  grpc_channel_args_destroy(args_);
65
95
  args_ = other.args_;
66
96
  other.args_ = nullptr;
97
+ attributes_ = std::move(other.attributes_);
67
98
  return *this;
68
99
  }
69
100
 
@@ -74,9 +105,16 @@ class ServerAddress {
74
105
  const grpc_resolved_address& address() const { return address_; }
75
106
  const grpc_channel_args* args() const { return args_; }
76
107
 
108
+ const AttributeInterface* GetAttribute(const char* key) const {
109
+ auto it = attributes_.find(key);
110
+ if (it == attributes_.end()) return nullptr;
111
+ return it->second.get();
112
+ }
113
+
77
114
  private:
78
115
  grpc_resolved_address address_;
79
116
  grpc_channel_args* args_;
117
+ std::map<const char*, std::unique_ptr<AttributeInterface>> attributes_;
80
118
  };
81
119
 
82
120
  //
@@ -26,12 +26,13 @@
26
26
  #include <algorithm>
27
27
  #include <cstring>
28
28
 
29
+ #include "absl/strings/str_format.h"
30
+
29
31
  #include <grpc/support/alloc.h>
30
32
  #include <grpc/support/string_util.h>
31
33
 
32
34
  #include "src/core/ext/filters/client_channel/client_channel.h"
33
35
  #include "src/core/ext/filters/client_channel/health/health_check_client.h"
34
- #include "src/core/ext/filters/client_channel/parse_address.h"
35
36
  #include "src/core/ext/filters/client_channel/proxy_mapper_registry.h"
36
37
  #include "src/core/ext/filters/client_channel/service_config.h"
37
38
  #include "src/core/ext/filters/client_channel/subchannel_pool_interface.h"
@@ -44,6 +45,7 @@
44
45
  #include "src/core/lib/gprpp/manual_constructor.h"
45
46
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
46
47
  #include "src/core/lib/gprpp/sync.h"
48
+ #include "src/core/lib/iomgr/parse_address.h"
47
49
  #include "src/core/lib/iomgr/sockaddr_utils.h"
48
50
  #include "src/core/lib/profiling/timers.h"
49
51
  #include "src/core/lib/slice/slice_internal.h"
@@ -325,7 +327,8 @@ class Subchannel::ConnectedSubchannelStateWatcher
325
327
  }
326
328
 
327
329
  private:
328
- void OnConnectivityStateChange(grpc_connectivity_state new_state) override {
330
+ void OnConnectivityStateChange(grpc_connectivity_state new_state,
331
+ const absl::Status& status) override {
329
332
  Subchannel* c = subchannel_;
330
333
  MutexLock lock(&c->mu_);
331
334
  switch (new_state) {
@@ -343,7 +346,15 @@ class Subchannel::ConnectedSubchannelStateWatcher
343
346
  if (c->channelz_node() != nullptr) {
344
347
  c->channelz_node()->SetChildSocket(nullptr);
345
348
  }
346
- c->SetConnectivityStateLocked(GRPC_CHANNEL_TRANSIENT_FAILURE);
349
+ // We need to construct our own status if the underlying state was
350
+ // shutdown since the accompanying status will be StatusCode::OK
351
+ // otherwise.
352
+ c->SetConnectivityStateLocked(
353
+ GRPC_CHANNEL_TRANSIENT_FAILURE,
354
+ new_state == GRPC_CHANNEL_SHUTDOWN
355
+ ? absl::Status(absl::StatusCode::kUnavailable,
356
+ "Subchannel has disconnected.")
357
+ : status);
347
358
  c->backoff_begun_ = false;
348
359
  c->backoff_.Reset();
349
360
  }
@@ -354,7 +365,7 @@ class Subchannel::ConnectedSubchannelStateWatcher
354
365
  // a callback for READY, because that was the state we started
355
366
  // this watch from. And a connected subchannel should never go
356
367
  // from READY to CONNECTING or IDLE.
357
- c->SetConnectivityStateLocked(new_state);
368
+ c->SetConnectivityStateLocked(new_state, status);
358
369
  }
359
370
  }
360
371
  }
@@ -368,14 +379,15 @@ class Subchannel::AsyncWatcherNotifierLocked {
368
379
  public:
369
380
  AsyncWatcherNotifierLocked(
370
381
  RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface> watcher,
371
- Subchannel* subchannel, grpc_connectivity_state state)
382
+ Subchannel* subchannel, grpc_connectivity_state state,
383
+ const absl::Status& status)
372
384
  : watcher_(std::move(watcher)) {
373
385
  RefCountedPtr<ConnectedSubchannel> connected_subchannel;
374
386
  if (state == GRPC_CHANNEL_READY) {
375
387
  connected_subchannel = subchannel->connected_subchannel_;
376
388
  }
377
389
  watcher_->PushConnectivityStateChange(
378
- {state, std::move(connected_subchannel)});
390
+ {state, status, std::move(connected_subchannel)});
379
391
  ExecCtx::Run(
380
392
  DEBUG_LOCATION,
381
393
  GRPC_CLOSURE_INIT(&closure_,
@@ -409,9 +421,10 @@ void Subchannel::ConnectivityStateWatcherList::RemoveWatcherLocked(
409
421
  }
410
422
 
411
423
  void Subchannel::ConnectivityStateWatcherList::NotifyLocked(
412
- Subchannel* subchannel, grpc_connectivity_state state) {
424
+ Subchannel* subchannel, grpc_connectivity_state state,
425
+ const absl::Status& status) {
413
426
  for (const auto& p : watchers_) {
414
- new AsyncWatcherNotifierLocked(p.second, subchannel, state);
427
+ new AsyncWatcherNotifierLocked(p.second, subchannel, state, status);
415
428
  }
416
429
  }
417
430
 
@@ -450,7 +463,7 @@ class Subchannel::HealthWatcherMap::HealthWatcher
450
463
  grpc_connectivity_state initial_state,
451
464
  RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface> watcher) {
452
465
  if (state_ != initial_state) {
453
- new AsyncWatcherNotifierLocked(watcher, subchannel_, state_);
466
+ new AsyncWatcherNotifierLocked(watcher, subchannel_, state_, status_);
454
467
  }
455
468
  watcher_list_.AddWatcherLocked(std::move(watcher));
456
469
  }
@@ -462,7 +475,7 @@ class Subchannel::HealthWatcherMap::HealthWatcher
462
475
 
463
476
  bool HasWatchers() const { return !watcher_list_.empty(); }
464
477
 
465
- void NotifyLocked(grpc_connectivity_state state) {
478
+ void NotifyLocked(grpc_connectivity_state state, const absl::Status& status) {
466
479
  if (state == GRPC_CHANNEL_READY) {
467
480
  // If we had not already notified for CONNECTING state, do so now.
468
481
  // (We may have missed this earlier, because if the transition
@@ -470,13 +483,15 @@ class Subchannel::HealthWatcherMap::HealthWatcher
470
483
  // subchannel may not have sent us a notification for CONNECTING.)
471
484
  if (state_ != GRPC_CHANNEL_CONNECTING) {
472
485
  state_ = GRPC_CHANNEL_CONNECTING;
473
- watcher_list_.NotifyLocked(subchannel_, state_);
486
+ status_ = status;
487
+ watcher_list_.NotifyLocked(subchannel_, state_, status);
474
488
  }
475
489
  // If we've become connected, start health checking.
476
490
  StartHealthCheckingLocked();
477
491
  } else {
478
492
  state_ = state;
479
- watcher_list_.NotifyLocked(subchannel_, state_);
493
+ status_ = status;
494
+ watcher_list_.NotifyLocked(subchannel_, state_, status);
480
495
  // We're not connected, so stop health checking.
481
496
  health_check_client_.reset();
482
497
  }
@@ -489,11 +504,13 @@ class Subchannel::HealthWatcherMap::HealthWatcher
489
504
  }
490
505
 
491
506
  private:
492
- void OnConnectivityStateChange(grpc_connectivity_state new_state) override {
507
+ void OnConnectivityStateChange(grpc_connectivity_state new_state,
508
+ const absl::Status& status) override {
493
509
  MutexLock lock(&subchannel_->mu_);
494
510
  if (new_state != GRPC_CHANNEL_SHUTDOWN && health_check_client_ != nullptr) {
495
511
  state_ = new_state;
496
- watcher_list_.NotifyLocked(subchannel_, new_state);
512
+ status_ = status;
513
+ watcher_list_.NotifyLocked(subchannel_, new_state, status);
497
514
  }
498
515
  }
499
516
 
@@ -508,6 +525,7 @@ class Subchannel::HealthWatcherMap::HealthWatcher
508
525
  grpc_core::UniquePtr<char> health_check_service_name_;
509
526
  OrphanablePtr<HealthCheckClient> health_check_client_;
510
527
  grpc_connectivity_state state_;
528
+ absl::Status status_;
511
529
  ConnectivityStateWatcherList watcher_list_;
512
530
  };
513
531
 
@@ -547,9 +565,10 @@ void Subchannel::HealthWatcherMap::RemoveWatcherLocked(
547
565
  if (!it->second->HasWatchers()) map_.erase(it);
548
566
  }
549
567
 
550
- void Subchannel::HealthWatcherMap::NotifyLocked(grpc_connectivity_state state) {
568
+ void Subchannel::HealthWatcherMap::NotifyLocked(grpc_connectivity_state state,
569
+ const absl::Status& status) {
551
570
  for (const auto& p : map_) {
552
- p.second->NotifyLocked(state);
571
+ p.second->NotifyLocked(state, status);
553
572
  }
554
573
  }
555
574
 
@@ -724,6 +743,25 @@ Subchannel* Subchannel::Create(OrphanablePtr<SubchannelConnector> connector,
724
743
  return registered;
725
744
  }
726
745
 
746
+ void Subchannel::ThrottleKeepaliveTime(int new_keepalive_time) {
747
+ MutexLock lock(&mu_);
748
+ // Only update the value if the new keepalive time is larger.
749
+ if (new_keepalive_time > keepalive_time_) {
750
+ keepalive_time_ = new_keepalive_time;
751
+ if (grpc_trace_subchannel.enabled()) {
752
+ gpr_log(GPR_INFO, "Subchannel=%p: Throttling keepalive time to %d", this,
753
+ new_keepalive_time);
754
+ }
755
+ const grpc_arg arg_to_add = grpc_channel_arg_integer_create(
756
+ const_cast<char*>(GRPC_ARG_KEEPALIVE_TIME_MS), new_keepalive_time);
757
+ const char* arg_to_remove = GRPC_ARG_KEEPALIVE_TIME_MS;
758
+ grpc_channel_args* new_args = grpc_channel_args_copy_and_add_and_remove(
759
+ args_, &arg_to_remove, 1, &arg_to_add, 1);
760
+ grpc_channel_args_destroy(args_);
761
+ args_ = new_args;
762
+ }
763
+ }
764
+
727
765
  Subchannel* Subchannel::Ref(GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
728
766
  gpr_atm old_refs;
729
767
  old_refs = RefMutate((1 << INTERNAL_REF_BITS),
@@ -826,7 +864,7 @@ void Subchannel::WatchConnectivityState(
826
864
  }
827
865
  if (health_check_service_name == nullptr) {
828
866
  if (state_ != initial_state) {
829
- new AsyncWatcherNotifierLocked(watcher, this, state_);
867
+ new AsyncWatcherNotifierLocked(watcher, this, state_, status_);
830
868
  }
831
869
  watcher_list_.AddWatcherLocked(std::move(watcher));
832
870
  } else {
@@ -928,8 +966,10 @@ const char* SubchannelConnectivityStateChangeString(
928
966
  } // namespace
929
967
 
930
968
  // Note: Must be called with a state that is different from the current state.
931
- void Subchannel::SetConnectivityStateLocked(grpc_connectivity_state state) {
969
+ void Subchannel::SetConnectivityStateLocked(grpc_connectivity_state state,
970
+ const absl::Status& status) {
932
971
  state_ = state;
972
+ status_ = status;
933
973
  if (channelz_node_ != nullptr) {
934
974
  channelz_node_->UpdateConnectivityState(state);
935
975
  channelz_node_->AddTraceEvent(
@@ -938,9 +978,9 @@ void Subchannel::SetConnectivityStateLocked(grpc_connectivity_state state) {
938
978
  SubchannelConnectivityStateChangeString(state)));
939
979
  }
940
980
  // Notify non-health watchers.
941
- watcher_list_.NotifyLocked(this, state);
981
+ watcher_list_.NotifyLocked(this, state, status);
942
982
  // Notify health watchers.
943
- health_watcher_map_.NotifyLocked(state);
983
+ health_watcher_map_.NotifyLocked(state, status);
944
984
  }
945
985
 
946
986
  void Subchannel::MaybeStartConnectingLocked() {
@@ -1012,7 +1052,7 @@ void Subchannel::ContinueConnectingLocked() {
1012
1052
  next_attempt_deadline_ = backoff_.NextAttemptTime();
1013
1053
  args.deadline = std::max(next_attempt_deadline_, min_deadline);
1014
1054
  args.channel_args = args_;
1015
- SetConnectivityStateLocked(GRPC_CHANNEL_CONNECTING);
1055
+ SetConnectivityStateLocked(GRPC_CHANNEL_CONNECTING, absl::Status());
1016
1056
  connector_->Connect(args, &connecting_result_, &on_connecting_finished_);
1017
1057
  }
1018
1058
 
@@ -1031,7 +1071,8 @@ void Subchannel::OnConnectingFinished(void* arg, grpc_error* error) {
1031
1071
  GRPC_SUBCHANNEL_WEAK_UNREF(c, "connecting");
1032
1072
  } else {
1033
1073
  gpr_log(GPR_INFO, "Connect failed: %s", grpc_error_string(error));
1034
- c->SetConnectivityStateLocked(GRPC_CHANNEL_TRANSIENT_FAILURE);
1074
+ c->SetConnectivityStateLocked(GRPC_CHANNEL_TRANSIENT_FAILURE,
1075
+ grpc_error_to_absl_status(error));
1035
1076
  GRPC_SUBCHANNEL_WEAK_UNREF(c, "connecting");
1036
1077
  }
1037
1078
  }
@@ -1091,7 +1132,7 @@ bool Subchannel::PublishTransportLocked() {
1091
1132
  connected_subchannel_->StartWatch(
1092
1133
  pollset_set_, MakeOrphanable<ConnectedSubchannelStateWatcher>(this));
1093
1134
  // Report initial state.
1094
- SetConnectivityStateLocked(GRPC_CHANNEL_READY);
1135
+ SetConnectivityStateLocked(GRPC_CHANNEL_READY, absl::Status());
1095
1136
  return true;
1096
1137
  }
1097
1138
 
@@ -39,7 +39,7 @@
39
39
  #include "src/core/lib/transport/connectivity_state.h"
40
40
  #include "src/core/lib/transport/metadata.h"
41
41
 
42
- // Channel arg containing a grpc_resolved_address to connect to.
42
+ // Channel arg containing a URI indicating the address to connect to.
43
43
  #define GRPC_ARG_SUBCHANNEL_ADDRESS "grpc.subchannel_address"
44
44
 
45
45
  // For debugging refcounting.
@@ -182,6 +182,7 @@ class Subchannel {
182
182
  public:
183
183
  struct ConnectivityStateChange {
184
184
  grpc_connectivity_state state;
185
+ absl::Status status;
185
186
  RefCountedPtr<ConnectedSubchannel> connected_subchannel;
186
187
  };
187
188
 
@@ -227,6 +228,11 @@ class Subchannel {
227
228
  static Subchannel* Create(OrphanablePtr<SubchannelConnector> connector,
228
229
  const grpc_channel_args* args);
229
230
 
231
+ // Throttles keepalive time to \a new_keepalive_time iff \a new_keepalive_time
232
+ // is larger than the subchannel's current keepalive time. The updated value
233
+ // will have an affect when the subchannel creates a new ConnectedSubchannel.
234
+ void ThrottleKeepaliveTime(int new_keepalive_time);
235
+
230
236
  // Strong and weak refcounting.
231
237
  Subchannel* Ref(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
232
238
  void Unref(GRPC_SUBCHANNEL_REF_EXTRA_ARGS);
@@ -306,7 +312,8 @@ class Subchannel {
306
312
  void RemoveWatcherLocked(ConnectivityStateWatcherInterface* watcher);
307
313
 
308
314
  // Notifies all watchers in the list about a change to state.
309
- void NotifyLocked(Subchannel* subchannel, grpc_connectivity_state state);
315
+ void NotifyLocked(Subchannel* subchannel, grpc_connectivity_state state,
316
+ const absl::Status& status);
310
317
 
311
318
  void Clear() { watchers_.clear(); }
312
319
 
@@ -339,7 +346,8 @@ class Subchannel {
339
346
  ConnectivityStateWatcherInterface* watcher);
340
347
 
341
348
  // Notifies the watcher when the subchannel's state changes.
342
- void NotifyLocked(grpc_connectivity_state state);
349
+ void NotifyLocked(grpc_connectivity_state state,
350
+ const absl::Status& status);
343
351
 
344
352
  grpc_connectivity_state CheckConnectivityStateLocked(
345
353
  Subchannel* subchannel, const char* health_check_service_name);
@@ -357,7 +365,8 @@ class Subchannel {
357
365
  class AsyncWatcherNotifierLocked;
358
366
 
359
367
  // Sets the subchannel's connectivity state to \a state.
360
- void SetConnectivityStateLocked(grpc_connectivity_state state);
368
+ void SetConnectivityStateLocked(grpc_connectivity_state state,
369
+ const absl::Status& status);
361
370
 
362
371
  // Methods for connection.
363
372
  void MaybeStartConnectingLocked();
@@ -400,6 +409,7 @@ class Subchannel {
400
409
 
401
410
  // Connectivity state tracking.
402
411
  grpc_connectivity_state state_ = GRPC_CHANNEL_IDLE;
412
+ absl::Status status_;
403
413
  // The list of watchers without a health check service name.
404
414
  ConnectivityStateWatcherList watcher_list_;
405
415
  // The map of watchers with health check service names.
@@ -417,6 +427,8 @@ class Subchannel {
417
427
  bool have_retry_alarm_ = false;
418
428
  // reset_backoff() was called while alarm was pending.
419
429
  bool retry_immediately_ = false;
430
+ // Keepalive time period (-1 for unset)
431
+ int keepalive_time_ = -1;
420
432
 
421
433
  // Channelz tracking.
422
434
  RefCountedPtr<channelz::SubchannelNode> channelz_node_;