grpc 1.41.0.pre2 → 1.42.0

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 (519) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +57 -44
  3. data/etc/roots.pem +335 -326
  4. data/include/grpc/event_engine/event_engine.h +82 -42
  5. data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
  6. data/include/grpc/event_engine/memory_allocator.h +210 -0
  7. data/include/grpc/grpc.h +4 -0
  8. data/include/grpc/grpc_security.h +18 -0
  9. data/include/grpc/grpc_security_constants.h +1 -0
  10. data/include/grpc/impl/codegen/port_platform.h +7 -0
  11. data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
  12. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
  13. data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
  14. data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
  15. data/src/core/ext/filters/client_channel/client_channel.h +74 -27
  16. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
  17. data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
  19. data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
  20. data/src/core/ext/filters/client_channel/config_selector.h +4 -5
  21. data/src/core/ext/filters/client_channel/connector.h +18 -18
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
  23. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
  37. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
  43. data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
  44. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
  45. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
  50. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
  51. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
  53. data/src/core/ext/filters/client_channel/resolver.h +1 -1
  54. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
  55. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
  56. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
  59. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  60. data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
  61. data/src/core/ext/filters/client_channel/server_address.h +1 -1
  62. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
  63. data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
  64. data/src/core/ext/filters/client_channel/subchannel.h +29 -49
  65. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
  66. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
  67. data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
  68. data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
  69. data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
  70. data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
  71. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
  72. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
  73. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  74. data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
  75. data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
  76. data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
  77. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
  78. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
  79. data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
  80. data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
  81. data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
  82. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  83. data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
  84. data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
  85. data/src/core/ext/service_config/service_config_call_data.h +72 -0
  86. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
  87. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
  88. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
  89. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
  90. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
  92. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
  93. data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
  94. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
  95. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
  96. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  97. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
  98. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
  99. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  100. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
  102. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
  103. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
  107. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
  108. data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
  109. data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
  110. data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
  111. data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
  112. data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
  113. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
  114. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
  115. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
  116. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
  117. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
  118. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
  119. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
  120. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
  121. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
  122. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
  123. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
  124. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
  125. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
  126. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
  127. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
  128. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
  129. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
  130. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
  131. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
  132. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
  133. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
  134. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
  135. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
  136. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
  137. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
  138. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
  139. data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
  140. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
  141. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
  142. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
  143. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
  144. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
  145. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
  146. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
  147. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
  148. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
  149. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
  150. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
  151. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
  152. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
  153. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
  154. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
  155. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
  156. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
  157. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
  158. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
  159. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
  160. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
  161. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
  162. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
  163. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
  164. data/src/core/ext/xds/xds_api.cc +325 -362
  165. data/src/core/ext/xds/xds_api.h +134 -82
  166. data/src/core/ext/xds/xds_bootstrap.h +10 -0
  167. data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
  168. data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
  169. data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
  170. data/src/core/ext/xds/xds_client.cc +527 -314
  171. data/src/core/ext/xds/xds_client.h +42 -37
  172. data/src/core/ext/xds/xds_client_stats.h +1 -1
  173. data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
  174. data/src/core/lib/address_utils/parse_address.cc +2 -0
  175. data/src/core/lib/avl/avl.cc +5 -5
  176. data/src/core/lib/backoff/backoff.cc +1 -1
  177. data/src/core/lib/channel/channel_args.cc +24 -6
  178. data/src/core/lib/channel/channel_args.h +9 -0
  179. data/src/core/lib/channel/channel_stack_builder.cc +3 -3
  180. data/src/core/lib/channel/channel_trace.cc +1 -1
  181. data/src/core/lib/channel/channel_trace.h +1 -1
  182. data/src/core/lib/channel/channelz.cc +3 -3
  183. data/src/core/lib/channel/channelz.h +2 -2
  184. data/src/core/lib/channel/channelz_registry.cc +1 -1
  185. data/src/core/lib/channel/channelz_registry.h +1 -1
  186. data/src/core/lib/channel/connected_channel.cc +1 -3
  187. data/src/core/lib/channel/connected_channel.h +1 -2
  188. data/src/core/lib/compression/compression.cc +2 -2
  189. data/src/core/lib/compression/compression_args.cc +6 -4
  190. data/src/core/lib/compression/compression_internal.cc +2 -2
  191. data/src/core/lib/compression/compression_internal.h +1 -1
  192. data/src/core/lib/config/core_configuration.cc +44 -2
  193. data/src/core/lib/config/core_configuration.h +39 -1
  194. data/src/core/lib/debug/stats.cc +1 -1
  195. data/src/core/lib/debug/stats_data.cc +13 -13
  196. data/src/core/lib/gpr/atm.cc +1 -1
  197. data/src/core/lib/gpr/cpu_posix.cc +1 -1
  198. data/src/core/lib/gpr/string.cc +2 -2
  199. data/src/core/lib/gpr/tls.h +1 -1
  200. data/src/core/lib/gpr/useful.h +79 -32
  201. data/src/core/lib/gprpp/arena.h +10 -0
  202. data/src/core/lib/gprpp/bitset.h +38 -16
  203. data/src/core/lib/gprpp/chunked_vector.h +211 -0
  204. data/src/core/lib/gprpp/construct_destruct.h +1 -1
  205. data/src/core/lib/gprpp/match.h +1 -1
  206. data/src/core/lib/gprpp/memory.h +6 -0
  207. data/src/core/lib/gprpp/overload.h +1 -1
  208. data/src/core/lib/gprpp/status_helper.cc +23 -3
  209. data/src/core/lib/gprpp/status_helper.h +12 -1
  210. data/src/core/lib/gprpp/table.h +411 -0
  211. data/src/core/lib/http/httpcli.cc +200 -182
  212. data/src/core/lib/http/parser.cc +2 -2
  213. data/src/core/lib/iomgr/call_combiner.cc +28 -10
  214. data/src/core/lib/iomgr/combiner.cc +6 -21
  215. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
  216. data/src/core/lib/iomgr/error.cc +113 -52
  217. data/src/core/lib/iomgr/error.h +50 -9
  218. data/src/core/lib/iomgr/error_cfstream.cc +5 -0
  219. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
  220. data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
  221. data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
  222. data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
  223. data/src/core/lib/iomgr/event_engine/closure.h +10 -1
  224. data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
  225. data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
  226. data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
  227. data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
  228. data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
  229. data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
  230. data/src/core/lib/iomgr/exec_ctx.cc +1 -9
  231. data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
  232. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
  233. data/src/core/lib/iomgr/executor.cc +6 -20
  234. data/src/core/lib/iomgr/iomgr.cc +3 -1
  235. data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
  236. data/src/core/lib/iomgr/iomgr_internal.h +3 -2
  237. data/src/core/lib/iomgr/load_file.cc +2 -2
  238. data/src/core/lib/iomgr/lockfree_event.cc +18 -0
  239. data/src/core/lib/iomgr/pollset_custom.cc +1 -1
  240. data/src/core/lib/iomgr/pollset_custom.h +1 -1
  241. data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
  242. data/src/core/lib/iomgr/resource_quota.cc +13 -11
  243. data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
  244. data/src/core/lib/iomgr/socket_mutator.cc +2 -2
  245. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
  246. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
  247. data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
  248. data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
  249. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  250. data/src/core/lib/iomgr/tcp_posix.cc +4 -5
  251. data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
  252. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
  253. data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
  254. data/src/core/lib/iomgr/tcp_windows.cc +2 -2
  255. data/src/core/lib/iomgr/timer_generic.cc +13 -13
  256. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  257. data/src/core/lib/json/json_util.cc +68 -0
  258. data/src/core/lib/json/json_util.h +57 -99
  259. data/src/core/lib/json/json_writer.cc +0 -3
  260. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  261. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  262. data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
  263. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
  264. data/src/core/lib/security/context/security_context.cc +4 -2
  265. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  266. data/src/core/lib/security/credentials/credentials.cc +4 -2
  267. data/src/core/lib/security/credentials/credentials.h +6 -1
  268. data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
  269. data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
  270. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
  271. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
  272. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
  273. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
  274. data/src/core/lib/security/security_connector/security_connector.cc +9 -4
  275. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  276. data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
  277. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
  278. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
  279. data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
  280. data/src/core/lib/security/transport/security_handshaker.cc +73 -43
  281. data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
  282. data/src/core/lib/security/transport/tsi_error.cc +3 -5
  283. data/src/core/lib/slice/slice.cc +0 -16
  284. data/src/core/lib/slice/slice_api.cc +39 -0
  285. data/src/core/lib/slice/slice_buffer.cc +5 -5
  286. data/src/core/lib/slice/slice_intern.cc +8 -13
  287. data/src/core/lib/slice/slice_internal.h +1 -244
  288. data/src/core/lib/slice/slice_refcount.cc +17 -0
  289. data/src/core/lib/slice/slice_refcount.h +121 -0
  290. data/src/core/lib/slice/slice_refcount_base.h +173 -0
  291. data/src/core/lib/slice/slice_split.cc +100 -0
  292. data/src/core/lib/slice/slice_split.h +40 -0
  293. data/src/core/lib/slice/slice_string_helpers.cc +0 -83
  294. data/src/core/lib/slice/slice_string_helpers.h +0 -11
  295. data/src/core/lib/slice/static_slice.cc +529 -0
  296. data/src/core/lib/slice/static_slice.h +331 -0
  297. data/src/core/lib/surface/builtins.cc +49 -0
  298. data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
  299. data/src/core/lib/surface/call.cc +103 -120
  300. data/src/core/lib/surface/call.h +0 -6
  301. data/src/core/lib/surface/channel.cc +19 -32
  302. data/src/core/lib/surface/channel.h +0 -9
  303. data/src/core/lib/surface/channel_init.cc +23 -76
  304. data/src/core/lib/surface/channel_init.h +52 -44
  305. data/src/core/lib/surface/completion_queue.cc +6 -5
  306. data/src/core/lib/surface/init.cc +0 -39
  307. data/src/core/lib/surface/init_secure.cc +17 -14
  308. data/src/core/lib/surface/lame_client.cc +18 -11
  309. data/src/core/lib/surface/lame_client.h +1 -1
  310. data/src/core/lib/surface/server.cc +25 -17
  311. data/src/core/lib/surface/server.h +17 -10
  312. data/src/core/lib/surface/validate_metadata.cc +5 -2
  313. data/src/core/lib/surface/version.cc +2 -2
  314. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  315. data/src/core/lib/transport/error_utils.cc +42 -17
  316. data/src/core/lib/transport/error_utils.h +1 -1
  317. data/src/core/lib/transport/metadata.cc +31 -10
  318. data/src/core/lib/transport/metadata.h +2 -1
  319. data/src/core/lib/transport/metadata_batch.cc +35 -371
  320. data/src/core/lib/transport/metadata_batch.h +905 -71
  321. data/src/core/lib/transport/parsed_metadata.h +263 -0
  322. data/src/core/lib/transport/pid_controller.cc +4 -4
  323. data/src/core/lib/transport/static_metadata.cc +714 -846
  324. data/src/core/lib/transport/static_metadata.h +115 -379
  325. data/src/core/lib/transport/status_metadata.cc +1 -0
  326. data/src/core/lib/transport/transport.cc +4 -5
  327. data/src/core/lib/transport/transport_op_string.cc +40 -20
  328. data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
  329. data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
  330. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
  331. data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
  332. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
  333. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  335. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
  336. data/src/core/tsi/fake_transport_security.cc +15 -7
  337. data/src/core/tsi/local_transport_security.cc +36 -73
  338. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
  339. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
  340. data/src/core/tsi/ssl_transport_security.cc +10 -2
  341. data/src/core/tsi/transport_security.cc +12 -0
  342. data/src/core/tsi/transport_security.h +16 -1
  343. data/src/core/tsi/transport_security_interface.h +26 -0
  344. data/src/ruby/ext/grpc/extconf.rb +12 -9
  345. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  346. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  347. data/src/ruby/lib/grpc/version.rb +1 -1
  348. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
  349. data/src/ruby/spec/client_server_spec.rb +1 -1
  350. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
  351. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
  352. data/third_party/address_sorting/address_sorting_posix.c +1 -0
  353. data/third_party/boringssl-with-bazel/err_data.c +278 -272
  354. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +21 -22
  355. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +0 -2
  356. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +5 -0
  357. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +15 -22
  358. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +13 -7
  359. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +19 -29
  360. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/a_strex.c +268 -271
  361. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +106 -153
  362. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  363. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +0 -39
  364. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +1 -1
  365. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/charmap.h +0 -0
  366. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +38 -0
  367. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +8 -8
  368. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +289 -198
  369. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +8 -8
  370. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +9 -13
  371. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +1 -0
  372. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +11 -8
  373. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +1 -7
  374. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -5
  375. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +0 -4
  376. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +1 -7
  377. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -6
  378. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -17
  379. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
  380. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +9 -0
  381. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +8 -0
  382. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
  383. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +45 -65
  384. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +1 -0
  385. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
  386. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +21 -3
  387. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +3 -2
  388. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +5 -2
  389. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
  390. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +10 -0
  391. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
  392. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
  393. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +4 -7
  394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
  395. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +1 -1
  396. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +1 -1
  397. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +24 -9
  398. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +4 -2
  399. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
  400. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
  402. data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
  403. data/third_party/boringssl-with-bazel/src/crypto/mem.c +12 -9
  404. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +0 -9
  405. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +0 -2
  406. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +0 -8
  407. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +0 -2
  408. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +0 -4
  409. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +16 -7
  410. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +9 -4
  411. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +151 -12
  412. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  413. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
  414. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +2 -0
  415. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +181 -1
  416. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +246 -0
  417. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +11 -2
  418. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +0 -2
  419. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +0 -179
  420. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +4 -2
  421. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -5
  422. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -0
  423. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +11 -50
  424. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +1 -1
  425. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +2 -4
  426. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +0 -16
  427. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +22 -18
  428. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +11 -8
  429. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +16 -0
  430. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -0
  431. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  432. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +1 -1
  433. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -0
  434. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +4 -3
  435. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +24 -5
  436. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +17 -8
  437. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -0
  438. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +6 -6
  439. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +4 -0
  440. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +5 -0
  441. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +112 -55
  442. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +2 -1
  443. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +0 -2
  444. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  445. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +71 -26
  446. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +366 -227
  447. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +2 -9
  448. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -4
  449. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +3 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +3 -3
  451. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +9 -0
  452. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +8 -2
  453. data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +4 -0
  454. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +9 -3
  455. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -20
  456. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -5
  457. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +5 -0
  458. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +37 -15
  459. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +28 -14
  460. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -32
  461. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +529 -91
  462. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -695
  463. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +48 -8
  464. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +266 -357
  465. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +90 -152
  466. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +15 -13
  467. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +75 -79
  468. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +96 -97
  469. data/third_party/boringssl-with-bazel/src/ssl/internal.h +63 -43
  470. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
  471. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -2
  472. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +6 -12
  473. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +14 -17
  474. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +14 -27
  475. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +203 -203
  476. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +30 -41
  477. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +47 -33
  478. data/third_party/re2/re2/compile.cc +91 -109
  479. data/third_party/re2/re2/dfa.cc +27 -39
  480. data/third_party/re2/re2/filtered_re2.cc +18 -2
  481. data/third_party/re2/re2/filtered_re2.h +10 -5
  482. data/third_party/re2/re2/nfa.cc +1 -1
  483. data/third_party/re2/re2/parse.cc +42 -23
  484. data/third_party/re2/re2/perl_groups.cc +34 -34
  485. data/third_party/re2/re2/prefilter.cc +3 -2
  486. data/third_party/re2/re2/prog.cc +182 -4
  487. data/third_party/re2/re2/prog.h +28 -9
  488. data/third_party/re2/re2/re2.cc +87 -118
  489. data/third_party/re2/re2/re2.h +156 -141
  490. data/third_party/re2/re2/regexp.cc +12 -5
  491. data/third_party/re2/re2/regexp.h +8 -2
  492. data/third_party/re2/re2/set.cc +31 -9
  493. data/third_party/re2/re2/set.h +9 -4
  494. data/third_party/re2/re2/simplify.cc +11 -3
  495. data/third_party/re2/re2/tostring.cc +1 -1
  496. data/third_party/re2/re2/walker-inl.h +1 -1
  497. data/third_party/re2/util/mutex.h +2 -2
  498. data/third_party/re2/util/pcre.h +3 -3
  499. metadata +81 -68
  500. data/include/grpc/event_engine/slice_allocator.h +0 -71
  501. data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
  502. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
  503. data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
  504. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
  505. data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
  506. data/src/core/ext/transport/chttp2/client/authority.h +0 -36
  507. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
  508. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
  509. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
  510. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
  511. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
  512. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
  513. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
  514. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
  515. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
  516. data/src/core/lib/iomgr/udp_server.cc +0 -747
  517. data/src/core/lib/iomgr/udp_server.h +0 -103
  518. data/src/core/lib/transport/authority_override.cc +0 -40
  519. data/src/core/lib/transport/authority_override.h +0 -37
@@ -1,20 +1,18 @@
1
- /*
2
- *
3
- * Copyright 2016 gRPC authors.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- *
17
- */
1
+ //
2
+ // Copyright 2016 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
18
16
 
19
17
  /// Implementation of the gRPC LB policy.
20
18
  ///
@@ -88,6 +86,8 @@
88
86
  #include "src/core/lib/backoff/backoff.h"
89
87
  #include "src/core/lib/channel/channel_args.h"
90
88
  #include "src/core/lib/channel/channel_stack.h"
89
+ #include "src/core/lib/channel/channel_stack_builder.h"
90
+ #include "src/core/lib/config/core_configuration.h"
91
91
  #include "src/core/lib/gpr/string.h"
92
92
  #include "src/core/lib/gprpp/manual_constructor.h"
93
93
  #include "src/core/lib/gprpp/memory.h"
@@ -100,7 +100,6 @@
100
100
  #include "src/core/lib/slice/slice_string_helpers.h"
101
101
  #include "src/core/lib/surface/call.h"
102
102
  #include "src/core/lib/surface/channel.h"
103
- #include "src/core/lib/surface/channel_init.h"
104
103
  #include "src/core/lib/transport/static_metadata.h"
105
104
 
106
105
  #define GRPC_GRPCLB_INITIAL_CONNECT_BACKOFF_SECONDS 1
@@ -108,9 +107,7 @@
108
107
  #define GRPC_GRPCLB_RECONNECT_MAX_BACKOFF_SECONDS 120
109
108
  #define GRPC_GRPCLB_RECONNECT_JITTER 0.2
110
109
  #define GRPC_GRPCLB_DEFAULT_FALLBACK_TIMEOUT_MS 10000
111
-
112
- #define GRPC_ARG_GRPCLB_ADDRESS_LB_TOKEN "grpc.grpclb_address_lb_token"
113
- #define GRPC_ARG_GRPCLB_ADDRESS_CLIENT_STATS "grpc.grpclb_address_client_stats"
110
+ #define GRPC_GRPCLB_DEFAULT_SUBCHANNEL_DELETION_DELAY_MS 10000
114
111
 
115
112
  namespace grpc_core {
116
113
 
@@ -233,16 +230,24 @@ class GrpcLb : public LoadBalancingPolicy {
233
230
  class SubchannelWrapper : public DelegatingSubchannel {
234
231
  public:
235
232
  SubchannelWrapper(RefCountedPtr<SubchannelInterface> subchannel,
236
- std::string lb_token,
233
+ RefCountedPtr<GrpcLb> lb_policy, std::string lb_token,
237
234
  RefCountedPtr<GrpcLbClientStats> client_stats)
238
235
  : DelegatingSubchannel(std::move(subchannel)),
236
+ lb_policy_(std::move(lb_policy)),
239
237
  lb_token_(std::move(lb_token)),
240
238
  client_stats_(std::move(client_stats)) {}
241
239
 
240
+ ~SubchannelWrapper() override {
241
+ if (!lb_policy_->shutting_down_) {
242
+ lb_policy_->CacheDeletedSubchannelLocked(wrapped_subchannel());
243
+ }
244
+ }
245
+
242
246
  const std::string& lb_token() const { return lb_token_; }
243
247
  GrpcLbClientStats* client_stats() const { return client_stats_.get(); }
244
248
 
245
249
  private:
250
+ RefCountedPtr<GrpcLb> lb_policy_;
246
251
  std::string lb_token_;
247
252
  RefCountedPtr<GrpcLbClientStats> client_stats_;
248
253
  };
@@ -265,7 +270,7 @@ class GrpcLb : public LoadBalancingPolicy {
265
270
  static_cast<const TokenAndClientStatsAttribute*>(other_base);
266
271
  int r = lb_token_.compare(other->lb_token_);
267
272
  if (r != 0) return r;
268
- return GPR_ICMP(client_stats_.get(), other->client_stats_.get());
273
+ return QsortCompare(client_stats_.get(), other->client_stats_.get());
269
274
  }
270
275
 
271
276
  std::string ToString() const override {
@@ -351,6 +356,7 @@ class GrpcLb : public LoadBalancingPolicy {
351
356
  void UpdateState(grpc_connectivity_state state, const absl::Status& status,
352
357
  std::unique_ptr<SubchannelPicker> picker) override;
353
358
  void RequestReresolution() override;
359
+ absl::string_view GetAuthority() override;
354
360
  void AddTraceEvent(TraceSeverity severity,
355
361
  absl::string_view message) override;
356
362
 
@@ -420,6 +426,13 @@ class GrpcLb : public LoadBalancingPolicy {
420
426
  const grpc_channel_args* args);
421
427
  void CreateOrUpdateChildPolicyLocked();
422
428
 
429
+ // Subchannel caching.
430
+ void CacheDeletedSubchannelLocked(
431
+ RefCountedPtr<SubchannelInterface> subchannel);
432
+ void StartSubchannelCacheTimerLocked();
433
+ static void OnSubchannelCacheTimer(void* arg, grpc_error_handle error);
434
+ void OnSubchannelCacheTimerLocked(grpc_error_handle error);
435
+
423
436
  // Who the client is trying to communicate with.
424
437
  std::string server_name_;
425
438
  // Configurations for the policy.
@@ -446,7 +459,7 @@ class GrpcLb : public LoadBalancingPolicy {
446
459
  // contains a non-NULL lb_call_.
447
460
  OrphanablePtr<BalancerCallState> lb_calld_;
448
461
  // Timeout in milliseconds for the LB call. 0 means no deadline.
449
- int lb_call_timeout_ms_ = 0;
462
+ const int lb_call_timeout_ms_ = 0;
450
463
  // Balancer call retry state.
451
464
  BackOff lb_call_backoff_;
452
465
  bool retry_timer_callback_pending_ = false;
@@ -464,7 +477,7 @@ class GrpcLb : public LoadBalancingPolicy {
464
477
  // State for fallback-at-startup checks.
465
478
  // Timeout after startup after which we will go into fallback mode if
466
479
  // we have not received a serverlist from the balancer.
467
- int fallback_at_startup_timeout_ = 0;
480
+ const int fallback_at_startup_timeout_ = 0;
468
481
  bool fallback_at_startup_checks_pending_ = false;
469
482
  grpc_timer lb_fallback_timer_;
470
483
  grpc_closure lb_on_fallback_;
@@ -473,6 +486,15 @@ class GrpcLb : public LoadBalancingPolicy {
473
486
  OrphanablePtr<LoadBalancingPolicy> child_policy_;
474
487
  // Child policy in state READY.
475
488
  bool child_policy_ready_ = false;
489
+
490
+ // Deleted subchannel caching.
491
+ const grpc_millis subchannel_cache_interval_ms_;
492
+ std::map<grpc_millis /*deletion time*/,
493
+ std::vector<RefCountedPtr<SubchannelInterface>>>
494
+ cached_subchannels_;
495
+ grpc_timer subchannel_cache_timer_;
496
+ grpc_closure on_subchannel_cache_timer_;
497
+ bool subchannel_cache_timer_pending_ = false;
476
498
  };
477
499
 
478
500
  //
@@ -673,7 +695,8 @@ RefCountedPtr<SubchannelInterface> GrpcLb::Helper::CreateSubchannel(
673
695
  return MakeRefCounted<SubchannelWrapper>(
674
696
  parent_->channel_control_helper()->CreateSubchannel(std::move(address),
675
697
  args),
676
- std::move(lb_token), std::move(client_stats));
698
+ parent_->Ref(DEBUG_LOCATION, "SubchannelWrapper"), std::move(lb_token),
699
+ std::move(client_stats));
677
700
  }
678
701
 
679
702
  void GrpcLb::Helper::UpdateState(grpc_connectivity_state state,
@@ -729,6 +752,10 @@ void GrpcLb::Helper::RequestReresolution() {
729
752
  }
730
753
  }
731
754
 
755
+ absl::string_view GrpcLb::Helper::GetAuthority() {
756
+ return parent_->channel_control_helper()->GetAuthority();
757
+ }
758
+
732
759
  void GrpcLb::Helper::AddTraceEvent(TraceSeverity severity,
733
760
  absl::string_view message) {
734
761
  if (parent_->shutting_down_) return;
@@ -902,7 +929,7 @@ void GrpcLb::BalancerCallState::ScheduleNextClientLoadReportLocked() {
902
929
  void GrpcLb::BalancerCallState::MaybeSendClientLoadReport(
903
930
  void* arg, grpc_error_handle error) {
904
931
  BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
905
- GRPC_ERROR_REF(error); // ref owned by lambda
932
+ (void)GRPC_ERROR_REF(error); // ref owned by lambda
906
933
  lb_calld->grpclb_policy()->work_serializer()->Run(
907
934
  [lb_calld, error]() { lb_calld->MaybeSendClientLoadReportLocked(error); },
908
935
  DEBUG_LOCATION);
@@ -981,7 +1008,7 @@ void GrpcLb::BalancerCallState::SendClientLoadReportLocked() {
981
1008
  void GrpcLb::BalancerCallState::ClientLoadReportDone(void* arg,
982
1009
  grpc_error_handle error) {
983
1010
  BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
984
- GRPC_ERROR_REF(error); // ref owned by lambda
1011
+ (void)GRPC_ERROR_REF(error); // ref owned by lambda
985
1012
  lb_calld->grpclb_policy()->work_serializer()->Run(
986
1013
  [lb_calld, error]() { lb_calld->ClientLoadReportDoneLocked(error); },
987
1014
  DEBUG_LOCATION);
@@ -1054,8 +1081,8 @@ void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked() {
1054
1081
  switch (response.type) {
1055
1082
  case response.INITIAL: {
1056
1083
  if (response.client_stats_report_interval != 0) {
1057
- client_stats_report_interval_ =
1058
- GPR_MAX(GPR_MS_PER_SEC, response.client_stats_report_interval);
1084
+ client_stats_report_interval_ = std::max(
1085
+ int64_t(GPR_MS_PER_SEC), response.client_stats_report_interval);
1059
1086
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
1060
1087
  gpr_log(GPR_INFO,
1061
1088
  "[grpclb %p] lb_calld=%p: Received initial LB response "
@@ -1184,7 +1211,7 @@ void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked() {
1184
1211
  void GrpcLb::BalancerCallState::OnBalancerStatusReceived(
1185
1212
  void* arg, grpc_error_handle error) {
1186
1213
  BalancerCallState* lb_calld = static_cast<BalancerCallState*>(arg);
1187
- GRPC_ERROR_REF(error); // owned by lambda
1214
+ (void)GRPC_ERROR_REF(error); // owned by lambda
1188
1215
  lb_calld->grpclb_policy()->work_serializer()->Run(
1189
1216
  [lb_calld, error]() { lb_calld->OnBalancerStatusReceivedLocked(error); },
1190
1217
  DEBUG_LOCATION);
@@ -1316,9 +1343,21 @@ grpc_channel_args* BuildBalancerChannelArgs(
1316
1343
  // ctor and dtor
1317
1344
  //
1318
1345
 
1346
+ std::string GetServerNameFromChannelArgs(const grpc_channel_args* args) {
1347
+ const char* server_uri =
1348
+ grpc_channel_args_find_string(args, GRPC_ARG_SERVER_URI);
1349
+ GPR_ASSERT(server_uri != nullptr);
1350
+ absl::StatusOr<URI> uri = URI::Parse(server_uri);
1351
+ GPR_ASSERT(uri.ok() && !uri->path().empty());
1352
+ return std::string(absl::StripPrefix(uri->path(), "/"));
1353
+ }
1354
+
1319
1355
  GrpcLb::GrpcLb(Args args)
1320
1356
  : LoadBalancingPolicy(std::move(args)),
1357
+ server_name_(GetServerNameFromChannelArgs(args.args)),
1321
1358
  response_generator_(MakeRefCounted<FakeResolverResponseGenerator>()),
1359
+ lb_call_timeout_ms_(grpc_channel_args_find_integer(
1360
+ args.args, GRPC_ARG_GRPCLB_CALL_TIMEOUT_MS, {0, 0, INT_MAX})),
1322
1361
  lb_call_backoff_(
1323
1362
  BackOff::Options()
1324
1363
  .set_initial_backoff(GRPC_GRPCLB_INITIAL_CONNECT_BACKOFF_SECONDS *
@@ -1326,31 +1365,25 @@ GrpcLb::GrpcLb(Args args)
1326
1365
  .set_multiplier(GRPC_GRPCLB_RECONNECT_BACKOFF_MULTIPLIER)
1327
1366
  .set_jitter(GRPC_GRPCLB_RECONNECT_JITTER)
1328
1367
  .set_max_backoff(GRPC_GRPCLB_RECONNECT_MAX_BACKOFF_SECONDS *
1329
- 1000)) {
1330
- // Closure Initialization
1331
- GRPC_CLOSURE_INIT(&lb_on_fallback_, &GrpcLb::OnFallbackTimer, this,
1332
- grpc_schedule_on_exec_ctx);
1333
- GRPC_CLOSURE_INIT(&lb_on_call_retry_, &GrpcLb::OnBalancerCallRetryTimer, this,
1334
- grpc_schedule_on_exec_ctx);
1335
- // Record server name.
1336
- const grpc_arg* arg = grpc_channel_args_find(args.args, GRPC_ARG_SERVER_URI);
1337
- const char* server_uri = grpc_channel_arg_get_string(arg);
1338
- GPR_ASSERT(server_uri != nullptr);
1339
- absl::StatusOr<URI> uri = URI::Parse(server_uri);
1340
- GPR_ASSERT(uri.ok() && !uri->path().empty());
1341
- server_name_ = std::string(absl::StripPrefix(uri->path(), "/"));
1368
+ 1000)),
1369
+ fallback_at_startup_timeout_(grpc_channel_args_find_integer(
1370
+ args.args, GRPC_ARG_GRPCLB_FALLBACK_TIMEOUT_MS,
1371
+ {GRPC_GRPCLB_DEFAULT_FALLBACK_TIMEOUT_MS, 0, INT_MAX})),
1372
+ subchannel_cache_interval_ms_(grpc_channel_args_find_integer(
1373
+ args.args, GRPC_ARG_GRPCLB_SUBCHANNEL_CACHE_INTERVAL_MS,
1374
+ {GRPC_GRPCLB_DEFAULT_SUBCHANNEL_DELETION_DELAY_MS, 0, INT_MAX})) {
1342
1375
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
1343
1376
  gpr_log(GPR_INFO,
1344
1377
  "[grpclb %p] Will use '%s' as the server name for LB request.",
1345
1378
  this, server_name_.c_str());
1346
1379
  }
1347
- // Record LB call timeout.
1348
- arg = grpc_channel_args_find(args.args, GRPC_ARG_GRPCLB_CALL_TIMEOUT_MS);
1349
- lb_call_timeout_ms_ = grpc_channel_arg_get_integer(arg, {0, 0, INT_MAX});
1350
- // Record fallback-at-startup timeout.
1351
- arg = grpc_channel_args_find(args.args, GRPC_ARG_GRPCLB_FALLBACK_TIMEOUT_MS);
1352
- fallback_at_startup_timeout_ = grpc_channel_arg_get_integer(
1353
- arg, {GRPC_GRPCLB_DEFAULT_FALLBACK_TIMEOUT_MS, 0, INT_MAX});
1380
+ // Closure Initialization
1381
+ GRPC_CLOSURE_INIT(&lb_on_fallback_, &GrpcLb::OnFallbackTimer, this,
1382
+ grpc_schedule_on_exec_ctx);
1383
+ GRPC_CLOSURE_INIT(&lb_on_call_retry_, &GrpcLb::OnBalancerCallRetryTimer, this,
1384
+ grpc_schedule_on_exec_ctx);
1385
+ GRPC_CLOSURE_INIT(&on_subchannel_cache_timer_, &OnSubchannelCacheTimer, this,
1386
+ nullptr);
1354
1387
  }
1355
1388
 
1356
1389
  GrpcLb::~GrpcLb() { grpc_channel_args_destroy(args_); }
@@ -1358,6 +1391,11 @@ GrpcLb::~GrpcLb() { grpc_channel_args_destroy(args_); }
1358
1391
  void GrpcLb::ShutdownLocked() {
1359
1392
  shutting_down_ = true;
1360
1393
  lb_calld_.reset();
1394
+ if (subchannel_cache_timer_pending_) {
1395
+ subchannel_cache_timer_pending_ = false;
1396
+ grpc_timer_cancel(&subchannel_cache_timer_);
1397
+ }
1398
+ cached_subchannels_.clear();
1361
1399
  if (retry_timer_callback_pending_) {
1362
1400
  grpc_timer_cancel(&lb_call_retry_timer_);
1363
1401
  }
@@ -1534,7 +1572,7 @@ void GrpcLb::StartBalancerCallRetryTimerLocked() {
1534
1572
 
1535
1573
  void GrpcLb::OnBalancerCallRetryTimer(void* arg, grpc_error_handle error) {
1536
1574
  GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
1537
- GRPC_ERROR_REF(error); // ref owned by lambda
1575
+ (void)GRPC_ERROR_REF(error); // ref owned by lambda
1538
1576
  grpclb_policy->work_serializer()->Run(
1539
1577
  [grpclb_policy, error]() {
1540
1578
  grpclb_policy->OnBalancerCallRetryTimerLocked(error);
@@ -1578,7 +1616,7 @@ void GrpcLb::MaybeEnterFallbackModeAfterStartup() {
1578
1616
 
1579
1617
  void GrpcLb::OnFallbackTimer(void* arg, grpc_error_handle error) {
1580
1618
  GrpcLb* grpclb_policy = static_cast<GrpcLb*>(arg);
1581
- GRPC_ERROR_REF(error); // ref owned by lambda
1619
+ (void)GRPC_ERROR_REF(error); // ref owned by lambda
1582
1620
  grpclb_policy->work_serializer()->Run(
1583
1621
  [grpclb_policy, error]() { grpclb_policy->OnFallbackTimerLocked(error); },
1584
1622
  DEBUG_LOCATION);
@@ -1674,6 +1712,57 @@ void GrpcLb::CreateOrUpdateChildPolicyLocked() {
1674
1712
  child_policy_->UpdateLocked(std::move(update_args));
1675
1713
  }
1676
1714
 
1715
+ //
1716
+ // subchannel caching
1717
+ //
1718
+
1719
+ void GrpcLb::CacheDeletedSubchannelLocked(
1720
+ RefCountedPtr<SubchannelInterface> subchannel) {
1721
+ grpc_millis deletion_time =
1722
+ ExecCtx::Get()->Now() + subchannel_cache_interval_ms_;
1723
+ cached_subchannels_[deletion_time].push_back(std::move(subchannel));
1724
+ if (!subchannel_cache_timer_pending_) {
1725
+ Ref(DEBUG_LOCATION, "OnSubchannelCacheTimer").release();
1726
+ subchannel_cache_timer_pending_ = true;
1727
+ StartSubchannelCacheTimerLocked();
1728
+ }
1729
+ }
1730
+
1731
+ void GrpcLb::StartSubchannelCacheTimerLocked() {
1732
+ GPR_ASSERT(!cached_subchannels_.empty());
1733
+ grpc_timer_init(&subchannel_cache_timer_, cached_subchannels_.begin()->first,
1734
+ &on_subchannel_cache_timer_);
1735
+ }
1736
+
1737
+ void GrpcLb::OnSubchannelCacheTimer(void* arg, grpc_error_handle error) {
1738
+ auto* self = static_cast<GrpcLb*>(arg);
1739
+ (void)GRPC_ERROR_REF(error);
1740
+ self->work_serializer()->Run(
1741
+ [self, error]() { self->GrpcLb::OnSubchannelCacheTimerLocked(error); },
1742
+ DEBUG_LOCATION);
1743
+ }
1744
+
1745
+ void GrpcLb::OnSubchannelCacheTimerLocked(grpc_error_handle error) {
1746
+ if (subchannel_cache_timer_pending_ && error == GRPC_ERROR_NONE) {
1747
+ auto it = cached_subchannels_.begin();
1748
+ if (it != cached_subchannels_.end()) {
1749
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) {
1750
+ gpr_log(GPR_INFO,
1751
+ "[grpclb %p] removing %" PRIuPTR " subchannels from cache",
1752
+ this, it->second.size());
1753
+ }
1754
+ cached_subchannels_.erase(it);
1755
+ }
1756
+ if (!cached_subchannels_.empty()) {
1757
+ StartSubchannelCacheTimerLocked();
1758
+ return;
1759
+ }
1760
+ subchannel_cache_timer_pending_ = false;
1761
+ }
1762
+ Unref(DEBUG_LOCATION, "OnSubchannelCacheTimer");
1763
+ GRPC_ERROR_UNREF(error);
1764
+ }
1765
+
1677
1766
  //
1678
1767
  // factory
1679
1768
  //
@@ -1744,39 +1833,34 @@ class GrpcLbFactory : public LoadBalancingPolicyFactory {
1744
1833
  // Plugin registration
1745
1834
  //
1746
1835
 
1747
- namespace {
1748
-
1749
- // Only add client_load_reporting filter if the grpclb LB policy is used.
1750
- bool maybe_add_client_load_reporting_filter(grpc_channel_stack_builder* builder,
1751
- void* arg) {
1752
- const grpc_channel_args* args =
1753
- grpc_channel_stack_builder_get_channel_arguments(builder);
1754
- const grpc_arg* channel_arg =
1755
- grpc_channel_args_find(args, GRPC_ARG_LB_POLICY_NAME);
1756
- if (channel_arg != nullptr && channel_arg->type == GRPC_ARG_STRING &&
1757
- strcmp(channel_arg->value.string, "grpclb") == 0) {
1758
- // TODO(roth): When we get around to re-attempting
1759
- // https://github.com/grpc/grpc/pull/16214, we should try to keep
1760
- // this filter at the very top of the subchannel stack, since that
1761
- // will minimize the number of metadata elements that the filter
1762
- // needs to iterate through to find the ClientStats object.
1763
- return grpc_channel_stack_builder_prepend_filter(
1764
- builder, static_cast<const grpc_channel_filter*>(arg), nullptr,
1765
- nullptr);
1766
- }
1767
- return true;
1768
- }
1769
-
1770
- } // namespace
1771
-
1772
1836
  void grpc_lb_policy_grpclb_init() {
1773
1837
  grpc_core::LoadBalancingPolicyRegistry::Builder::
1774
1838
  RegisterLoadBalancingPolicyFactory(
1775
1839
  absl::make_unique<grpc_core::GrpcLbFactory>());
1776
- grpc_channel_init_register_stage(
1777
- GRPC_CLIENT_SUBCHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
1778
- maybe_add_client_load_reporting_filter,
1779
- const_cast<grpc_channel_filter*>(&grpc_client_load_reporting_filter));
1780
1840
  }
1781
1841
 
1782
1842
  void grpc_lb_policy_grpclb_shutdown() {}
1843
+
1844
+ namespace grpc_core {
1845
+ void RegisterGrpcLbLoadReportingFilter(CoreConfiguration::Builder* builder) {
1846
+ builder->channel_init()->RegisterStage(
1847
+ GRPC_CLIENT_SUBCHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
1848
+ [](grpc_channel_stack_builder* builder) {
1849
+ const grpc_channel_args* args =
1850
+ grpc_channel_stack_builder_get_channel_arguments(builder);
1851
+ const grpc_arg* channel_arg =
1852
+ grpc_channel_args_find(args, GRPC_ARG_LB_POLICY_NAME);
1853
+ if (channel_arg != nullptr && channel_arg->type == GRPC_ARG_STRING &&
1854
+ strcmp(channel_arg->value.string, "grpclb") == 0) {
1855
+ // TODO(roth): When we get around to re-attempting
1856
+ // https://github.com/grpc/grpc/pull/16214, we should try to keep
1857
+ // this filter at the very top of the subchannel stack, since that
1858
+ // will minimize the number of metadata elements that the filter
1859
+ // needs to iterate through to find the ClientStats object.
1860
+ return grpc_channel_stack_builder_prepend_filter(
1861
+ builder, &grpc_client_load_reporting_filter, nullptr, nullptr);
1862
+ }
1863
+ return true;
1864
+ });
1865
+ }
1866
+ } // namespace grpc_core
@@ -32,6 +32,10 @@
32
32
  #define GRPC_ARG_ADDRESS_IS_BACKEND_FROM_GRPCLB_LOAD_BALANCER \
33
33
  "grpc.address_is_backend_from_grpclb_load_balancer"
34
34
 
35
+ // For use in tests.
36
+ #define GRPC_ARG_GRPCLB_SUBCHANNEL_CACHE_INTERVAL_MS \
37
+ "grpc.internal.grpclb_subchannel_cache_interval_ms"
38
+
35
39
  namespace grpc_core {
36
40
 
37
41
  extern const char kGrpcLbClientStatsMetadataKey[];
@@ -42,7 +42,7 @@ int BalancerAddressesArgCmp(void* p, void* q) {
42
42
  ServerAddressList* address_list1 = static_cast<ServerAddressList*>(p);
43
43
  ServerAddressList* address_list2 = static_cast<ServerAddressList*>(q);
44
44
  if (address_list1 == nullptr || address_list2 == nullptr) {
45
- return GPR_ICMP(address_list1, address_list2);
45
+ return QsortCompare(address_list1, address_list2);
46
46
  }
47
47
  if (address_list1->size() > address_list2->size()) return 1;
48
48
  if (address_list1->size() < address_list2->size()) return -1;
@@ -25,8 +25,6 @@
25
25
 
26
26
  #include <grpc/support/alloc.h>
27
27
 
28
- #include "src/core/lib/gpr/useful.h"
29
-
30
28
  namespace grpc_core {
31
29
 
32
30
  bool GrpcLbServer::operator==(const GrpcLbServer& other) const {
@@ -56,8 +54,8 @@ grpc_slice GrpcLbRequestCreate(const char* lb_service_name, upb_arena* arena) {
56
54
  grpc_lb_v1_LoadBalanceRequest* req = grpc_lb_v1_LoadBalanceRequest_new(arena);
57
55
  grpc_lb_v1_InitialLoadBalanceRequest* initial_request =
58
56
  grpc_lb_v1_LoadBalanceRequest_mutable_initial_request(req, arena);
59
- size_t name_len =
60
- GPR_MIN(strlen(lb_service_name), GRPC_GRPCLB_SERVICE_NAME_MAX_LENGTH);
57
+ size_t name_len = std::min(strlen(lb_service_name),
58
+ size_t(GRPC_GRPCLB_SERVICE_NAME_MAX_LENGTH));
61
59
  grpc_lb_v1_InitialLoadBalanceRequest_set_name(
62
60
  initial_request, upb_strview_make(lb_service_name, name_len));
63
61
  return grpc_grpclb_request_encode(req, arena);
@@ -267,7 +267,7 @@ void PickFirst::UpdateLocked(UpdateArgs args) {
267
267
  const_cast<char*>(GRPC_ARG_INHIBIT_HEALTH_CHECKING), 1);
268
268
  const grpc_channel_args* new_args =
269
269
  grpc_channel_args_copy_and_add(args.args, &new_arg, 1);
270
- GPR_SWAP(const grpc_channel_args*, new_args, args.args);
270
+ std::swap(new_args, args.args);
271
271
  grpc_channel_args_destroy(new_args);
272
272
  latest_update_args_ = std::move(args);
273
273
  // If we are not in idle, start connection attempt immediately.
@@ -377,15 +377,31 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
377
377
  sd = subchannel_list()->subchannel(next_index);
378
378
  // If we're tried all subchannels, set state to TRANSIENT_FAILURE.
379
379
  if (sd->Index() == 0) {
380
- // Re-resolve if this is the most recent subchannel list.
381
- if (subchannel_list() == (p->latest_pending_subchannel_list_ != nullptr
382
- ? p->latest_pending_subchannel_list_.get()
383
- : p->subchannel_list_.get())) {
384
- p->channel_control_helper()->RequestReresolution();
380
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace)) {
381
+ gpr_log(GPR_INFO,
382
+ "Pick First %p subchannel list %p failed to connect to "
383
+ "all subchannels",
384
+ p, subchannel_list());
385
385
  }
386
386
  subchannel_list()->set_in_transient_failure(true);
387
- // Only report new state in case 1.
387
+ // In case 2, swap to the new subchannel list. This means reporting
388
+ // TRANSIENT_FAILURE and dropping the existing (working) connection,
389
+ // but we can't ignore what the control plane has told us.
390
+ if (subchannel_list() == p->latest_pending_subchannel_list_.get()) {
391
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_pick_first_trace)) {
392
+ gpr_log(GPR_INFO,
393
+ "Pick First %p promoting pending subchannel list %p to "
394
+ "replace %p",
395
+ p, p->latest_pending_subchannel_list_.get(),
396
+ p->subchannel_list_.get());
397
+ }
398
+ p->subchannel_list_ = std::move(p->latest_pending_subchannel_list_);
399
+ }
400
+ // If this is the current subchannel list (either because we were
401
+ // in case 1 or because we were in case 2 and just promoted it to
402
+ // be the current list), re-resolve and report new state.
388
403
  if (subchannel_list() == p->subchannel_list_.get()) {
404
+ p->channel_control_helper()->RequestReresolution();
389
405
  absl::Status status =
390
406
  absl::UnavailableError("failed to connect to all addresses");
391
407
  p->channel_control_helper()->UpdateState(
@@ -162,6 +162,7 @@ class PriorityLb : public LoadBalancingPolicy {
162
162
  const absl::Status& status,
163
163
  std::unique_ptr<SubchannelPicker> picker) override;
164
164
  void RequestReresolution() override;
165
+ absl::string_view GetAuthority() override;
165
166
  void AddTraceEvent(TraceSeverity severity,
166
167
  absl::string_view message) override;
167
168
 
@@ -656,7 +657,7 @@ void PriorityLb::ChildPriority::MaybeCancelFailoverTimerLocked() {
656
657
  void PriorityLb::ChildPriority::OnFailoverTimer(void* arg,
657
658
  grpc_error_handle error) {
658
659
  ChildPriority* self = static_cast<ChildPriority*>(arg);
659
- GRPC_ERROR_REF(error); // ref owned by lambda
660
+ (void)GRPC_ERROR_REF(error); // ref owned by lambda
660
661
  self->priority_policy_->work_serializer()->Run(
661
662
  [self, error]() { self->OnFailoverTimerLocked(error); }, DEBUG_LOCATION);
662
663
  }
@@ -713,7 +714,7 @@ void PriorityLb::ChildPriority::MaybeReactivateLocked() {
713
714
  void PriorityLb::ChildPriority::OnDeactivationTimer(void* arg,
714
715
  grpc_error_handle error) {
715
716
  ChildPriority* self = static_cast<ChildPriority*>(arg);
716
- GRPC_ERROR_REF(error); // ref owned by lambda
717
+ (void)GRPC_ERROR_REF(error); // ref owned by lambda
717
718
  self->priority_policy_->work_serializer()->Run(
718
719
  [self, error]() { self->OnDeactivationTimerLocked(error); },
719
720
  DEBUG_LOCATION);
@@ -740,14 +741,6 @@ void PriorityLb::ChildPriority::OnDeactivationTimerLocked(
740
741
  // PriorityLb::ChildPriority::Helper
741
742
  //
742
743
 
743
- void PriorityLb::ChildPriority::Helper::RequestReresolution() {
744
- if (priority_->priority_policy_->shutting_down_) return;
745
- if (priority_->ignore_reresolution_requests_) {
746
- return;
747
- }
748
- priority_->priority_policy_->channel_control_helper()->RequestReresolution();
749
- }
750
-
751
744
  RefCountedPtr<SubchannelInterface>
752
745
  PriorityLb::ChildPriority::Helper::CreateSubchannel(
753
746
  ServerAddress address, const grpc_channel_args& args) {
@@ -764,6 +757,18 @@ void PriorityLb::ChildPriority::Helper::UpdateState(
764
757
  priority_->OnConnectivityStateUpdateLocked(state, status, std::move(picker));
765
758
  }
766
759
 
760
+ void PriorityLb::ChildPriority::Helper::RequestReresolution() {
761
+ if (priority_->priority_policy_->shutting_down_) return;
762
+ if (priority_->ignore_reresolution_requests_) {
763
+ return;
764
+ }
765
+ priority_->priority_policy_->channel_control_helper()->RequestReresolution();
766
+ }
767
+
768
+ absl::string_view PriorityLb::ChildPriority::Helper::GetAuthority() {
769
+ return priority_->priority_policy_->channel_control_helper()->GetAuthority();
770
+ }
771
+
767
772
  void PriorityLb::ChildPriority::Helper::AddTraceEvent(
768
773
  TraceSeverity severity, absl::string_view message) {
769
774
  if (priority_->priority_policy_->shutting_down_) return;
@@ -33,7 +33,6 @@
33
33
  #include "src/core/lib/channel/channel_args.h"
34
34
  #include "src/core/lib/debug/trace.h"
35
35
  #include "src/core/lib/gpr/string.h"
36
- #include "src/core/lib/gpr/useful.h"
37
36
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
38
37
  #include "src/core/lib/gprpp/sync.h"
39
38
  #include "src/core/lib/transport/connectivity_state.h"
@@ -236,7 +235,7 @@ class RingHash : public LoadBalancingPolicy {
236
235
  }
237
236
 
238
237
  private:
239
- static void RunInExecCtx(void* arg, grpc_error* /*error*/) {
238
+ static void RunInExecCtx(void* arg, grpc_error_handle /*error*/) {
240
239
  auto* self = static_cast<SubchannelConnectionAttempter*>(arg);
241
240
  self->ring_hash_lb_->work_serializer()->Run(
242
241
  [self]() {
@@ -730,7 +729,7 @@ class RingHashFactory : public LoadBalancingPolicyFactory {
730
729
  const char* name() const override { return kRingHash; }
731
730
 
732
731
  RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
733
- const Json& json, grpc_error** error) const override {
732
+ const Json& json, grpc_error_handle* error) const override {
734
733
  size_t min_ring_size;
735
734
  size_t max_ring_size;
736
735
  std::vector<grpc_error_handle> error_list;