grpc 1.56.0 → 1.57.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (398) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +31 -22
  3. data/include/grpc/event_engine/event_engine.h +22 -32
  4. data/include/grpc/grpc_security.h +19 -0
  5. data/include/grpc/impl/grpc_types.h +3 -0
  6. data/include/grpc/support/port_platform.h +29 -23
  7. data/src/core/ext/filters/client_channel/client_channel.cc +44 -8
  8. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  9. data/src/core/ext/filters/client_channel/http_proxy.cc +5 -0
  10. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +21 -52
  11. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +19 -7
  12. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +25 -35
  13. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +78 -132
  14. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +2 -1
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +4 -3
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -1
  17. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +38 -15
  18. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.h +3 -5
  19. data/src/core/ext/filters/client_channel/lb_policy/health_check_client_internal.h +22 -6
  20. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric_internal.h +2 -0
  21. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +98 -72
  22. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -16
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +56 -11
  24. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.h +25 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -32
  26. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +4 -6
  27. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +20 -79
  28. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
  29. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +31 -19
  30. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +11 -2
  31. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -41
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +3 -67
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +8 -0
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +31 -74
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +7 -51
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +16 -87
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +16 -50
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +12 -74
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +1 -4
  40. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +69 -59
  41. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +7 -2
  42. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +1 -0
  43. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +25 -13
  44. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +366 -311
  45. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +17 -1
  46. data/src/core/ext/filters/client_channel/retry_filter.cc +39 -2498
  47. data/src/core/ext/filters/client_channel/retry_filter.h +91 -1
  48. data/src/core/ext/filters/client_channel/retry_filter_legacy_call_data.cc +2052 -0
  49. data/src/core/ext/filters/client_channel/retry_filter_legacy_call_data.h +442 -0
  50. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +38 -58
  51. data/src/core/ext/filters/client_channel/subchannel.h +3 -3
  52. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +3 -0
  53. data/src/core/ext/filters/rbac/rbac_filter.cc +40 -111
  54. data/src/core/ext/filters/rbac/rbac_filter.h +12 -30
  55. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +162 -86
  56. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +0 -6
  57. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +7 -4
  58. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +131 -186
  59. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +6569 -174
  60. data/src/core/ext/transport/chttp2/transport/decode_huff.h +2278 -441
  61. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -3
  62. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +176 -0
  63. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +326 -0
  64. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +569 -544
  65. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +150 -9
  66. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +47 -33
  67. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +19 -5
  68. data/src/core/ext/transport/chttp2/transport/internal.h +8 -4
  69. data/src/core/ext/transport/chttp2/transport/parsing.cc +27 -15
  70. data/src/core/ext/transport/chttp2/transport/writing.cc +2 -3
  71. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +27 -6
  72. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +143 -0
  73. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +2 -9
  74. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +0 -39
  75. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +13 -8
  76. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +35 -6
  77. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +17 -13
  78. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +85 -20
  79. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +26 -7
  80. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +45 -3
  81. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +4 -3
  82. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +21 -0
  83. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +30 -6
  84. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +180 -0
  85. data/src/core/ext/upb-generated/envoy/data/accesslog/v3/accesslog.upb.c +558 -0
  86. data/src/core/ext/upb-generated/envoy/data/accesslog/v3/accesslog.upb.h +2710 -0
  87. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +30 -11
  88. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +53 -24
  89. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +30 -5
  90. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +110 -0
  91. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +41 -15
  92. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +150 -27
  93. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.c +1 -0
  94. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/pick_first/v3/pick_first.upb.c +47 -0
  95. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/pick_first/v3/pick_first.upb.h +93 -0
  96. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +88 -76
  97. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +5 -0
  98. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +11 -12
  99. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +0 -5
  100. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +162 -160
  101. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +129 -118
  102. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +141 -135
  103. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.c +19 -12
  104. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +38 -30
  105. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +5 -0
  106. data/src/core/ext/upbdefs-generated/envoy/data/accesslog/v3/accesslog.upbdefs.c +402 -0
  107. data/src/core/ext/upbdefs-generated/envoy/data/accesslog/v3/accesslog.upbdefs.h +111 -0
  108. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +80 -74
  109. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +63 -47
  110. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +5 -0
  111. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +315 -293
  112. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
  113. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +29 -29
  114. data/src/core/ext/xds/xds_bootstrap_grpc.cc +33 -30
  115. data/src/core/ext/xds/xds_bootstrap_grpc.h +5 -13
  116. data/src/core/ext/xds/xds_client_grpc.cc +11 -6
  117. data/src/core/ext/xds/xds_client_grpc.h +16 -2
  118. data/src/core/ext/xds/xds_client_stats.h +10 -0
  119. data/src/core/ext/xds/xds_cluster.cc +26 -16
  120. data/src/core/ext/xds/xds_endpoint.cc +4 -7
  121. data/src/core/ext/xds/xds_health_status.cc +0 -17
  122. data/src/core/ext/xds/xds_health_status.h +5 -25
  123. data/src/core/ext/xds/xds_lb_policy_registry.cc +39 -0
  124. data/src/core/ext/xds/xds_route_config.cc +4 -0
  125. data/src/core/ext/xds/xds_transport_grpc.cc +1 -3
  126. data/src/core/lib/address_utils/parse_address.cc +63 -1
  127. data/src/core/lib/address_utils/parse_address.h +8 -0
  128. data/src/core/lib/address_utils/sockaddr_utils.cc +46 -1
  129. data/src/core/lib/address_utils/sockaddr_utils.h +2 -2
  130. data/src/core/lib/backoff/random_early_detection.h +5 -0
  131. data/src/core/lib/channel/channel_args.cc +21 -10
  132. data/src/core/lib/channel/channel_args.h +3 -0
  133. data/src/core/lib/channel/connected_channel.cc +4 -1
  134. data/src/core/lib/channel/promise_based_filter.h +1 -0
  135. data/src/core/lib/debug/trace.cc +1 -4
  136. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +2 -1
  137. data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -1
  138. data/src/core/lib/event_engine/event_engine.cc +0 -12
  139. data/src/core/lib/event_engine/forkable.cc +47 -42
  140. data/src/core/lib/event_engine/handle_containers.h +0 -4
  141. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +4 -6
  142. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +4 -6
  143. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +25 -11
  144. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +3 -1
  145. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +2 -1
  146. data/src/core/lib/event_engine/posix_engine/posix_engine.h +9 -12
  147. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +66 -27
  148. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +5 -0
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +4 -2
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +42 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +6 -0
  152. data/src/core/lib/event_engine/posix_engine/timer.h +10 -37
  153. data/src/core/lib/event_engine/tcp_socket_utils.cc +67 -7
  154. data/src/core/lib/event_engine/tcp_socket_utils.h +3 -0
  155. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +90 -37
  156. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +32 -12
  157. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +12 -21
  158. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +8 -12
  159. data/src/core/lib/event_engine/windows/windows_endpoint.cc +55 -54
  160. data/src/core/lib/event_engine/windows/windows_endpoint.h +15 -12
  161. data/src/core/lib/event_engine/windows/windows_engine.cc +2 -1
  162. data/src/core/lib/event_engine/windows/windows_engine.h +8 -12
  163. data/src/core/lib/experiments/config.cc +60 -22
  164. data/src/core/lib/experiments/config.h +20 -8
  165. data/src/core/lib/experiments/experiments.cc +278 -0
  166. data/src/core/lib/experiments/experiments.h +59 -1
  167. data/src/core/lib/gprpp/dual_ref_counted.h +9 -9
  168. data/src/core/lib/gprpp/fork.cc +8 -9
  169. data/src/core/lib/gprpp/fork.h +6 -5
  170. data/src/core/lib/gprpp/if_list.h +4530 -0
  171. data/src/core/lib/gprpp/orphanable.h +3 -3
  172. data/src/core/lib/gprpp/ref_counted.h +6 -6
  173. data/src/core/lib/gprpp/sorted_pack.h +3 -12
  174. data/src/core/lib/gprpp/status_helper.h +16 -15
  175. data/src/core/lib/gprpp/time.h +12 -0
  176. data/src/core/lib/gprpp/type_list.h +32 -0
  177. data/src/core/lib/http/httpcli.h +6 -9
  178. data/src/core/lib/iomgr/error.cc +32 -2
  179. data/src/core/lib/iomgr/error.h +9 -10
  180. data/src/core/lib/iomgr/ev_epoll1_linux.cc +5 -7
  181. data/src/core/lib/iomgr/ev_poll_posix.cc +6 -5
  182. data/src/core/lib/iomgr/exec_ctx.h +11 -0
  183. data/src/core/lib/iomgr/pollset.h +4 -5
  184. data/src/core/lib/iomgr/port.h +10 -0
  185. data/src/core/lib/iomgr/resolve_address.cc +13 -1
  186. data/src/core/lib/iomgr/resolve_address.h +17 -3
  187. data/src/core/lib/iomgr/sockaddr_posix.h +7 -0
  188. data/src/core/lib/iomgr/socket_utils_common_posix.cc +29 -0
  189. data/src/core/lib/iomgr/socket_utils_posix.cc +2 -0
  190. data/src/core/lib/iomgr/socket_utils_posix.h +6 -0
  191. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -1
  192. data/src/core/lib/iomgr/tcp_posix.cc +21 -4
  193. data/src/core/lib/iomgr/tcp_server_posix.cc +37 -14
  194. data/src/core/lib/iomgr/tcp_server_utils_posix.h +12 -0
  195. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +26 -2
  196. data/src/core/lib/iomgr/tcp_windows.cc +1 -3
  197. data/src/core/lib/iomgr/vsock.cc +59 -0
  198. data/src/core/lib/iomgr/vsock.h +38 -0
  199. data/src/core/lib/iomgr/wakeup_fd_posix.h +3 -6
  200. data/src/core/lib/load_balancing/delegating_helper.h +115 -0
  201. data/src/core/lib/load_balancing/lb_policy.h +20 -0
  202. data/src/core/lib/load_balancing/subchannel_interface.h +6 -0
  203. data/src/core/lib/promise/party.h +1 -1
  204. data/src/core/lib/resolver/resolver_factory.h +3 -2
  205. data/src/core/lib/resolver/server_address.cc +9 -94
  206. data/src/core/lib/resolver/server_address.h +10 -64
  207. data/src/core/lib/resource_quota/memory_quota.h +1 -1
  208. data/src/core/lib/security/credentials/channel_creds_registry.h +51 -27
  209. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +169 -9
  210. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  211. data/src/core/lib/security/credentials/composite/composite_credentials.h +3 -1
  212. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -1
  213. data/src/core/lib/security/credentials/external/external_account_credentials.h +6 -0
  214. data/src/core/lib/security/credentials/fake/fake_credentials.cc +30 -38
  215. data/src/core/lib/security/credentials/fake/fake_credentials.h +28 -0
  216. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +8 -0
  217. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +5 -1
  218. data/src/core/lib/security/credentials/tls/tls_credentials.cc +1 -1
  219. data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -1
  220. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -1
  221. data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
  222. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -1
  223. data/src/core/lib/service_config/service_config_call_data.h +5 -0
  224. data/src/core/lib/slice/slice.h +16 -0
  225. data/src/core/lib/surface/call.cc +31 -29
  226. data/src/core/lib/surface/server.h +2 -2
  227. data/src/core/lib/surface/validate_metadata.cc +37 -22
  228. data/src/core/lib/surface/validate_metadata.h +13 -3
  229. data/src/core/lib/surface/version.cc +2 -2
  230. data/src/core/lib/transport/metadata_batch.cc +7 -7
  231. data/src/core/lib/transport/metadata_batch.h +86 -48
  232. data/src/core/lib/transport/parsed_metadata.h +34 -20
  233. data/src/core/lib/transport/simple_slice_based_metadata.h +9 -2
  234. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +4 -6
  235. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -2
  236. data/src/core/tsi/ssl_transport_security.cc +33 -9
  237. data/src/core/tsi/ssl_transport_security.h +13 -1
  238. data/src/ruby/bin/math_pb.rb +24 -18
  239. data/src/ruby/ext/grpc/extconf.rb +19 -18
  240. data/src/ruby/ext/grpc/rb_call.c +62 -39
  241. data/src/ruby/ext/grpc/rb_call_credentials.c +0 -1
  242. data/src/ruby/ext/grpc/rb_channel.c +126 -49
  243. data/src/ruby/ext/grpc/rb_channel.h +1 -0
  244. data/src/ruby/ext/grpc/rb_channel_args.c +16 -2
  245. data/src/ruby/ext/grpc/rb_channel_args.h +4 -0
  246. data/src/ruby/ext/grpc/rb_channel_credentials.c +0 -1
  247. data/src/ruby/ext/grpc/rb_compression_options.c +0 -1
  248. data/src/ruby/ext/grpc/rb_event_thread.c +22 -6
  249. data/src/ruby/ext/grpc/rb_event_thread.h +1 -0
  250. data/src/ruby/ext/grpc/rb_grpc.c +192 -30
  251. data/src/ruby/ext/grpc/rb_grpc.h +8 -2
  252. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  253. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  254. data/src/ruby/ext/grpc/rb_server.c +62 -45
  255. data/src/ruby/ext/grpc/rb_server_credentials.c +0 -1
  256. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +0 -1
  257. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +0 -1
  258. data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
  259. data/src/ruby/lib/grpc/version.rb +1 -1
  260. data/src/ruby/pb/grpc/health/v1/health_pb.rb +24 -13
  261. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +24 -3
  262. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +25 -111
  263. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +25 -2
  264. data/third_party/boringssl-with-bazel/err_data.c +552 -552
  265. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +5 -5
  266. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +34 -1
  267. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +4 -1
  268. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +3 -3
  269. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +7 -8
  270. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +2 -2
  271. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +2 -2
  272. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +8 -8
  273. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +2 -2
  274. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +2 -2
  275. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +19 -1
  276. data/third_party/boringssl-with-bazel/src/crypto/chacha/internal.h +8 -1
  277. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +28 -185
  278. data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +3 -7
  279. data/third_party/boringssl-with-bazel/src/crypto/conf/internal.h +8 -0
  280. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.c +3 -0
  281. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +49 -46
  282. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_64_adx.c +18 -0
  283. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h +2809 -7417
  284. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +27 -5
  285. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +20 -0
  286. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +110 -72
  287. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c +4 -3
  288. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +15 -14
  289. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +13 -10
  290. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +35 -12
  291. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c +2 -4
  292. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c +3 -7
  293. data/third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c +3 -3
  294. data/third_party/boringssl-with-bazel/src/crypto/evp/print.c +7 -6
  295. data/third_party/boringssl-with-bazel/src/crypto/ex_data.c +34 -72
  296. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -1
  297. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +12 -5
  298. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.c +5 -6
  299. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +12 -6
  300. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +17 -18
  301. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery_inv.c +51 -15
  302. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.c +7 -7
  303. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/delocate.h +5 -6
  304. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/internal.h +2 -0
  305. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/builtin_curves.h +277 -0
  306. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +180 -404
  307. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +3 -3
  308. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +24 -57
  309. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +17 -13
  310. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +33 -71
  311. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +18 -17
  312. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +5 -7
  313. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz.c +15 -18
  314. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +9 -11
  315. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +24 -24
  316. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +11 -27
  317. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +8 -8
  318. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +4 -4
  319. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +9 -3
  320. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/hkdf/hkdf.c +1 -1
  321. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +40 -26
  322. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +21 -7
  323. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +38 -19
  324. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +2 -29
  325. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +55 -0
  326. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +33 -52
  327. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +3 -8
  328. data/third_party/boringssl-with-bazel/src/crypto/internal.h +198 -79
  329. data/third_party/boringssl-with-bazel/src/crypto/kyber/kyber.c +5 -4
  330. data/third_party/boringssl-with-bazel/src/crypto/mem.c +7 -8
  331. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +19 -23
  332. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +3 -3
  333. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c +3 -3
  334. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +7 -7
  335. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +8 -5
  336. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +1 -0
  337. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +7 -6
  338. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c +6 -12
  339. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/getentropy.c +48 -0
  340. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{fuchsia.c → ios.c} +8 -8
  341. data/third_party/boringssl-with-bazel/src/crypto/{refcount_no_threads.c → rand_extra/trusty.c} +15 -19
  342. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +41 -19
  343. data/third_party/boringssl-with-bazel/src/crypto/{refcount_c11.c → refcount.c} +11 -17
  344. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +147 -72
  345. data/third_party/boringssl-with-bazel/src/crypto/thread_none.c +0 -8
  346. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +6 -35
  347. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +5 -26
  348. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +14 -18
  349. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +54 -143
  350. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +7 -13
  351. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +1 -1
  352. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +1 -1
  353. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +2 -4
  354. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +2 -2
  355. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +1 -1
  356. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +8 -12
  357. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +19 -20
  358. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +11 -15
  359. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -5
  360. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +1 -1
  361. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +7 -7
  362. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +2 -3
  363. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +4 -6
  364. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +4 -119
  365. data/third_party/boringssl-with-bazel/src/include/openssl/asm_base.h +207 -0
  366. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +5 -0
  367. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +2 -116
  368. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +0 -2
  369. data/third_party/boringssl-with-bazel/src/include/openssl/chacha.h +6 -0
  370. data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +5 -1
  371. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +0 -21
  372. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +21 -2
  373. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +19 -6
  374. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +11 -7
  375. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +13 -14
  376. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +0 -61
  377. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +127 -81
  378. data/third_party/boringssl-with-bazel/src/include/openssl/stack.h +224 -209
  379. data/third_party/boringssl-with-bazel/src/include/openssl/target.h +154 -0
  380. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +1 -29
  381. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +4 -4
  382. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +3 -2
  383. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +9 -65
  384. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +20 -20
  385. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +1 -1
  386. data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -11
  387. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +24 -18
  388. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +37 -30
  389. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +125 -26
  390. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +2 -3
  391. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64_adx.h +691 -0
  392. data/third_party/upb/upb/collections/map.c +3 -3
  393. metadata +30 -13
  394. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +0 -42
  395. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.h +0 -64
  396. data/src/core/ext/transport/chttp2/transport/stream_map.cc +0 -177
  397. data/src/core/ext/transport/chttp2/transport/stream_map.h +0 -68
  398. data/third_party/boringssl-with-bazel/src/crypto/refcount_win.c +0 -89
@@ -28,6 +28,7 @@
28
28
  #include "absl/base/thread_annotations.h"
29
29
  #include "absl/status/status.h"
30
30
  #include "absl/strings/string_view.h"
31
+ #include "absl/types/optional.h"
31
32
 
32
33
  #include <grpc/impl/connectivity_state.h>
33
34
 
@@ -68,9 +69,10 @@ class HealthProducer : public Subchannel::DataProducerInterface {
68
69
  UniqueTypeName type() const override { return Type(); }
69
70
 
70
71
  void AddWatcher(HealthWatcher* watcher,
71
- const std::string& health_check_service_name);
72
- void RemoveWatcher(HealthWatcher* watcher,
73
- const std::string& health_check_service_name);
72
+ const absl::optional<std::string>& health_check_service_name);
73
+ void RemoveWatcher(
74
+ HealthWatcher* watcher,
75
+ const absl::optional<std::string>& health_check_service_name);
74
76
 
75
77
  private:
76
78
  class ConnectivityWatcher;
@@ -148,6 +150,7 @@ class HealthProducer : public Subchannel::DataProducerInterface {
148
150
  std::map<std::string /*health_check_service_name*/,
149
151
  OrphanablePtr<HealthChecker>>
150
152
  health_checkers_ ABSL_GUARDED_BY(&mu_);
153
+ std::set<HealthWatcher*> non_health_watchers_ ABSL_GUARDED_BY(&mu_);
151
154
  };
152
155
 
153
156
  // A data watcher that handles health checking.
@@ -155,18 +158,31 @@ class HealthWatcher : public InternalSubchannelDataWatcherInterface {
155
158
  public:
156
159
  HealthWatcher(
157
160
  std::shared_ptr<WorkSerializer> work_serializer,
158
- absl::string_view health_check_service_name,
161
+ absl::optional<std::string> health_check_service_name,
159
162
  std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
160
163
  watcher)
161
164
  : work_serializer_(std::move(work_serializer)),
162
- health_check_service_name_(health_check_service_name),
165
+ health_check_service_name_(std::move(health_check_service_name)),
163
166
  watcher_(std::move(watcher)) {}
164
167
  ~HealthWatcher() override;
165
168
 
169
+ UniqueTypeName type() const override { return HealthProducer::Type(); }
170
+
166
171
  // When the client channel sees this wrapper, it will pass it the real
167
172
  // subchannel to use.
168
173
  void SetSubchannel(Subchannel* subchannel) override;
169
174
 
175
+ // For intercepting the watcher before it gets up to the real subchannel.
176
+ std::shared_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
177
+ TakeWatcher() {
178
+ return std::move(watcher_);
179
+ }
180
+ void SetWatcher(
181
+ std::shared_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
182
+ watcher) {
183
+ watcher_ = std::move(watcher);
184
+ }
185
+
170
186
  void Notify(grpc_connectivity_state state, absl::Status status);
171
187
 
172
188
  grpc_pollset_set* interested_parties() const {
@@ -175,7 +191,7 @@ class HealthWatcher : public InternalSubchannelDataWatcherInterface {
175
191
 
176
192
  private:
177
193
  std::shared_ptr<WorkSerializer> work_serializer_;
178
- std::string health_check_service_name_;
194
+ absl::optional<std::string> health_check_service_name_;
179
195
  std::shared_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
180
196
  watcher_;
181
197
  RefCountedPtr<HealthProducer> producer_;
@@ -102,6 +102,8 @@ class OrcaWatcher : public InternalSubchannelDataWatcherInterface {
102
102
  Duration report_interval() const { return report_interval_; }
103
103
  OobBackendMetricWatcher* watcher() const { return watcher_.get(); }
104
104
 
105
+ UniqueTypeName type() const override { return OrcaProducer::Type(); }
106
+
105
107
  // When the client channel sees this wrapper, it will pass it the real
106
108
  // subchannel to use.
107
109
  void SetSubchannel(Subchannel* subchannel) override;
@@ -43,20 +43,25 @@
43
43
  #include <grpc/support/log.h>
44
44
 
45
45
  #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
46
+ #include "src/core/ext/filters/client_channel/lb_policy/health_check_client_internal.h"
47
+ #include "src/core/ext/filters/client_channel/subchannel_interface_internal.h"
46
48
  #include "src/core/lib/address_utils/sockaddr_utils.h"
47
49
  #include "src/core/lib/channel/channel_args.h"
48
50
  #include "src/core/lib/config/core_configuration.h"
49
51
  #include "src/core/lib/debug/trace.h"
50
52
  #include "src/core/lib/gprpp/debug_location.h"
53
+ #include "src/core/lib/gprpp/match.h"
51
54
  #include "src/core/lib/gprpp/orphanable.h"
52
55
  #include "src/core/lib/gprpp/ref_counted.h"
53
56
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
57
+ #include "src/core/lib/gprpp/unique_type_name.h"
54
58
  #include "src/core/lib/gprpp/validation_errors.h"
55
59
  #include "src/core/lib/gprpp/work_serializer.h"
56
60
  #include "src/core/lib/iomgr/exec_ctx.h"
57
61
  #include "src/core/lib/iomgr/iomgr_fwd.h"
58
62
  #include "src/core/lib/iomgr/pollset_set.h"
59
63
  #include "src/core/lib/json/json.h"
64
+ #include "src/core/lib/load_balancing/delegating_helper.h"
60
65
  #include "src/core/lib/load_balancing/lb_policy.h"
61
66
  #include "src/core/lib/load_balancing/lb_policy_factory.h"
62
67
  #include "src/core/lib/load_balancing/lb_policy_registry.h"
@@ -68,9 +73,6 @@ namespace grpc_core {
68
73
 
69
74
  TraceFlag grpc_outlier_detection_lb_trace(false, "outlier_detection_lb");
70
75
 
71
- const char* DisableOutlierDetectionAttribute::kName =
72
- "disable_outlier_detection";
73
-
74
76
  namespace {
75
77
 
76
78
  using ::grpc_event_engine::experimental::EventEngine;
@@ -123,9 +125,12 @@ class OutlierDetectionLb : public LoadBalancingPolicy {
123
125
  class SubchannelWrapper : public DelegatingSubchannel {
124
126
  public:
125
127
  SubchannelWrapper(RefCountedPtr<SubchannelState> subchannel_state,
126
- RefCountedPtr<SubchannelInterface> subchannel)
128
+ RefCountedPtr<SubchannelInterface> subchannel,
129
+ bool disable_via_raw_connectivity_watch)
127
130
  : DelegatingSubchannel(std::move(subchannel)),
128
- subchannel_state_(std::move(subchannel_state)) {
131
+ subchannel_state_(std::move(subchannel_state)),
132
+ disable_via_raw_connectivity_watch_(
133
+ disable_via_raw_connectivity_watch) {
129
134
  if (subchannel_state_ != nullptr) {
130
135
  subchannel_state_->AddSubchannel(this);
131
136
  if (subchannel_state_->ejection_time().has_value()) {
@@ -150,14 +155,27 @@ class OutlierDetectionLb : public LoadBalancingPolicy {
150
155
  void CancelConnectivityStateWatch(
151
156
  ConnectivityStateWatcherInterface* watcher) override;
152
157
 
158
+ void AddDataWatcher(std::unique_ptr<DataWatcherInterface> watcher) override;
159
+
153
160
  RefCountedPtr<SubchannelState> subchannel_state() const {
154
161
  return subchannel_state_;
155
162
  }
156
163
 
157
164
  private:
165
+ // TODO(roth): As a temporary hack, this needs to handle watchers
166
+ // stored as both unique_ptr<> and shared_ptr<>, since the former is
167
+ // used for raw connectivity state watches and the latter is used
168
+ // for health watches. This hack will go away as part of implementing
169
+ // dualstack backend support.
158
170
  class WatcherWrapper
159
171
  : public SubchannelInterface::ConnectivityStateWatcherInterface {
160
172
  public:
173
+ WatcherWrapper(std::shared_ptr<
174
+ SubchannelInterface::ConnectivityStateWatcherInterface>
175
+ health_watcher,
176
+ bool ejected)
177
+ : watcher_(std::move(health_watcher)), ejected_(ejected) {}
178
+
161
179
  WatcherWrapper(std::unique_ptr<
162
180
  SubchannelInterface::ConnectivityStateWatcherInterface>
163
181
  watcher,
@@ -167,7 +185,7 @@ class OutlierDetectionLb : public LoadBalancingPolicy {
167
185
  void Eject() {
168
186
  ejected_ = true;
169
187
  if (last_seen_state_.has_value()) {
170
- watcher_->OnConnectivityStateChange(
188
+ watcher()->OnConnectivityStateChange(
171
189
  GRPC_CHANNEL_TRANSIENT_FAILURE,
172
190
  absl::UnavailableError(
173
191
  "subchannel ejected by outlier detection"));
@@ -177,8 +195,8 @@ class OutlierDetectionLb : public LoadBalancingPolicy {
177
195
  void Uneject() {
178
196
  ejected_ = false;
179
197
  if (last_seen_state_.has_value()) {
180
- watcher_->OnConnectivityStateChange(*last_seen_state_,
181
- last_seen_status_);
198
+ watcher()->OnConnectivityStateChange(*last_seen_state_,
199
+ last_seen_status_);
182
200
  }
183
201
  }
184
202
 
@@ -193,16 +211,30 @@ class OutlierDetectionLb : public LoadBalancingPolicy {
193
211
  status = absl::UnavailableError(
194
212
  "subchannel ejected by outlier detection");
195
213
  }
196
- watcher_->OnConnectivityStateChange(new_state, status);
214
+ watcher()->OnConnectivityStateChange(new_state, status);
197
215
  }
198
216
  }
199
217
 
200
218
  grpc_pollset_set* interested_parties() override {
201
- return watcher_->interested_parties();
219
+ return watcher()->interested_parties();
202
220
  }
203
221
 
204
222
  private:
205
- std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
223
+ SubchannelInterface::ConnectivityStateWatcherInterface* watcher() const {
224
+ return Match(
225
+ watcher_,
226
+ [](const std::shared_ptr<
227
+ SubchannelInterface::ConnectivityStateWatcherInterface>&
228
+ watcher) { return watcher.get(); },
229
+ [](const std::unique_ptr<
230
+ SubchannelInterface::ConnectivityStateWatcherInterface>&
231
+ watcher) { return watcher.get(); });
232
+ }
233
+
234
+ absl::variant<std::shared_ptr<
235
+ SubchannelInterface::ConnectivityStateWatcherInterface>,
236
+ std::unique_ptr<
237
+ SubchannelInterface::ConnectivityStateWatcherInterface>>
206
238
  watcher_;
207
239
  absl::optional<grpc_connectivity_state> last_seen_state_;
208
240
  absl::Status last_seen_status_;
@@ -210,10 +242,12 @@ class OutlierDetectionLb : public LoadBalancingPolicy {
210
242
  };
211
243
 
212
244
  RefCountedPtr<SubchannelState> subchannel_state_;
245
+ const bool disable_via_raw_connectivity_watch_;
213
246
  bool ejected_ = false;
214
247
  std::map<SubchannelInterface::ConnectivityStateWatcherInterface*,
215
248
  WatcherWrapper*>
216
249
  watchers_;
250
+ WatcherWrapper* watcher_wrapper_ = nullptr; // For health watching.
217
251
  };
218
252
 
219
253
  class SubchannelState : public RefCounted<SubchannelState> {
@@ -299,7 +333,7 @@ class OutlierDetectionLb : public LoadBalancingPolicy {
299
333
  }
300
334
 
301
335
  void DisableEjection() {
302
- Uneject();
336
+ if (ejection_time_.has_value()) Uneject();
303
337
  multiplier_ = 0;
304
338
  }
305
339
 
@@ -328,27 +362,17 @@ class OutlierDetectionLb : public LoadBalancingPolicy {
328
362
  bool counting_enabled_;
329
363
  };
330
364
 
331
- class Helper : public ChannelControlHelper {
365
+ class Helper
366
+ : public ParentOwningDelegatingChannelControlHelper<OutlierDetectionLb> {
332
367
  public:
333
368
  explicit Helper(RefCountedPtr<OutlierDetectionLb> outlier_detection_policy)
334
- : outlier_detection_policy_(std::move(outlier_detection_policy)) {}
335
-
336
- ~Helper() override {
337
- outlier_detection_policy_.reset(DEBUG_LOCATION, "Helper");
338
- }
369
+ : ParentOwningDelegatingChannelControlHelper(
370
+ std::move(outlier_detection_policy)) {}
339
371
 
340
372
  RefCountedPtr<SubchannelInterface> CreateSubchannel(
341
373
  ServerAddress address, const ChannelArgs& args) override;
342
374
  void UpdateState(grpc_connectivity_state state, const absl::Status& status,
343
375
  RefCountedPtr<SubchannelPicker> picker) override;
344
- void RequestReresolution() override;
345
- absl::string_view GetAuthority() override;
346
- grpc_event_engine::experimental::EventEngine* GetEventEngine() override;
347
- void AddTraceEvent(TraceSeverity severity,
348
- absl::string_view message) override;
349
-
350
- private:
351
- RefCountedPtr<OutlierDetectionLb> outlier_detection_policy_;
352
376
  };
353
377
 
354
378
  class EjectionTimer : public InternallyRefCounted<EjectionTimer> {
@@ -412,6 +436,7 @@ void OutlierDetectionLb::SubchannelWrapper::Eject() {
412
436
  ++it;
413
437
  watcher->Eject();
414
438
  }
439
+ if (watcher_wrapper_ != nullptr) watcher_wrapper_->Eject();
415
440
  }
416
441
 
417
442
  void OutlierDetectionLb::SubchannelWrapper::Uneject() {
@@ -419,10 +444,15 @@ void OutlierDetectionLb::SubchannelWrapper::Uneject() {
419
444
  for (auto& watcher : watchers_) {
420
445
  watcher.second->Uneject();
421
446
  }
447
+ if (watcher_wrapper_ != nullptr) watcher_wrapper_->Uneject();
422
448
  }
423
449
 
424
450
  void OutlierDetectionLb::SubchannelWrapper::WatchConnectivityState(
425
451
  std::unique_ptr<ConnectivityStateWatcherInterface> watcher) {
452
+ if (disable_via_raw_connectivity_watch_) {
453
+ wrapped_subchannel()->WatchConnectivityState(std::move(watcher));
454
+ return;
455
+ }
426
456
  ConnectivityStateWatcherInterface* watcher_ptr = watcher.get();
427
457
  auto watcher_wrapper =
428
458
  std::make_unique<WatcherWrapper>(std::move(watcher), ejected_);
@@ -432,12 +462,29 @@ void OutlierDetectionLb::SubchannelWrapper::WatchConnectivityState(
432
462
 
433
463
  void OutlierDetectionLb::SubchannelWrapper::CancelConnectivityStateWatch(
434
464
  ConnectivityStateWatcherInterface* watcher) {
465
+ if (disable_via_raw_connectivity_watch_) {
466
+ wrapped_subchannel()->CancelConnectivityStateWatch(watcher);
467
+ return;
468
+ }
435
469
  auto it = watchers_.find(watcher);
436
470
  if (it == watchers_.end()) return;
437
471
  wrapped_subchannel()->CancelConnectivityStateWatch(it->second);
438
472
  watchers_.erase(it);
439
473
  }
440
474
 
475
+ void OutlierDetectionLb::SubchannelWrapper::AddDataWatcher(
476
+ std::unique_ptr<DataWatcherInterface> watcher) {
477
+ auto* w = static_cast<InternalSubchannelDataWatcherInterface*>(watcher.get());
478
+ if (w->type() == HealthProducer::Type()) {
479
+ auto* health_watcher = static_cast<HealthWatcher*>(watcher.get());
480
+ auto watcher_wrapper = std::make_shared<WatcherWrapper>(
481
+ health_watcher->TakeWatcher(), ejected_);
482
+ watcher_wrapper_ = watcher_wrapper.get();
483
+ health_watcher->SetWatcher(std::move(watcher_wrapper));
484
+ }
485
+ DelegatingSubchannel::AddDataWatcher(std::move(watcher));
486
+ }
487
+
441
488
  //
442
489
  // OutlierDetectionLb::Picker::SubchannelCallTracker
443
490
  //
@@ -551,16 +598,6 @@ OutlierDetectionLb::~OutlierDetectionLb() {
551
598
 
552
599
  std::string OutlierDetectionLb::MakeKeyForAddress(
553
600
  const ServerAddress& address) {
554
- // If the address has the DisableOutlierDetectionAttribute attribute,
555
- // ignore it.
556
- // TODO(roth): This is a hack to prevent outlier_detection from
557
- // working with pick_first, as per discussion in
558
- // https://github.com/grpc/grpc/issues/32967. Remove this as part of
559
- // implementing dualstack backend support.
560
- if (address.GetAttribute(DisableOutlierDetectionAttribute::kName) !=
561
- nullptr) {
562
- return "";
563
- }
564
601
  // Use only the address, not the attributes.
565
602
  auto addr_str = grpc_sockaddr_to_string(&address.address(), false);
566
603
  // If address couldn't be stringified, ignore it.
@@ -739,25 +776,35 @@ OrphanablePtr<LoadBalancingPolicy> OutlierDetectionLb::CreateChildPolicyLocked(
739
776
 
740
777
  RefCountedPtr<SubchannelInterface> OutlierDetectionLb::Helper::CreateSubchannel(
741
778
  ServerAddress address, const ChannelArgs& args) {
742
- if (outlier_detection_policy_->shutting_down_) return nullptr;
779
+ if (parent()->shutting_down_) return nullptr;
780
+ // If the address has the DisableOutlierDetectionAttribute attribute,
781
+ // ignore it for raw connectivity state updates.
782
+ // TODO(roth): This is a hack to prevent outlier_detection from
783
+ // working with pick_first, as per discussion in
784
+ // https://github.com/grpc/grpc/issues/32967. Remove this as part of
785
+ // implementing dualstack backend support.
786
+ const bool disable_via_raw_connectivity_watch =
787
+ address.args().GetInt(GRPC_ARG_OUTLIER_DETECTION_DISABLE) == 1;
743
788
  RefCountedPtr<SubchannelState> subchannel_state;
744
789
  std::string key = MakeKeyForAddress(address);
745
790
  if (GRPC_TRACE_FLAG_ENABLED(grpc_outlier_detection_lb_trace)) {
746
791
  gpr_log(GPR_INFO,
747
- "[outlier_detection_lb %p] using key %s for subchannel address %s",
748
- outlier_detection_policy_.get(), key.c_str(),
749
- address.ToString().c_str());
792
+ "[outlier_detection_lb %p] using key %s for subchannel "
793
+ "address %s, disable_via_raw_connectivity_watch=%d",
794
+ parent(), key.c_str(), address.ToString().c_str(),
795
+ disable_via_raw_connectivity_watch);
750
796
  }
751
797
  if (!key.empty()) {
752
- auto it = outlier_detection_policy_->subchannel_state_map_.find(key);
753
- if (it != outlier_detection_policy_->subchannel_state_map_.end()) {
798
+ auto it = parent()->subchannel_state_map_.find(key);
799
+ if (it != parent()->subchannel_state_map_.end()) {
754
800
  subchannel_state = it->second->Ref();
755
801
  }
756
802
  }
757
803
  auto subchannel = MakeRefCounted<SubchannelWrapper>(
758
804
  subchannel_state,
759
- outlier_detection_policy_->channel_control_helper()->CreateSubchannel(
760
- std::move(address), args));
805
+ parent()->channel_control_helper()->CreateSubchannel(std::move(address),
806
+ args),
807
+ disable_via_raw_connectivity_watch);
761
808
  if (subchannel_state != nullptr) {
762
809
  subchannel_state->AddSubchannel(subchannel.get());
763
810
  }
@@ -767,41 +814,20 @@ RefCountedPtr<SubchannelInterface> OutlierDetectionLb::Helper::CreateSubchannel(
767
814
  void OutlierDetectionLb::Helper::UpdateState(
768
815
  grpc_connectivity_state state, const absl::Status& status,
769
816
  RefCountedPtr<SubchannelPicker> picker) {
770
- if (outlier_detection_policy_->shutting_down_) return;
817
+ if (parent()->shutting_down_) return;
771
818
  if (GRPC_TRACE_FLAG_ENABLED(grpc_outlier_detection_lb_trace)) {
772
819
  gpr_log(GPR_INFO,
773
820
  "[outlier_detection_lb %p] child connectivity state update: "
774
821
  "state=%s (%s) picker=%p",
775
- outlier_detection_policy_.get(), ConnectivityStateName(state),
776
- status.ToString().c_str(), picker.get());
822
+ parent(), ConnectivityStateName(state), status.ToString().c_str(),
823
+ picker.get());
777
824
  }
778
825
  // Save the state and picker.
779
- outlier_detection_policy_->state_ = state;
780
- outlier_detection_policy_->status_ = status;
781
- outlier_detection_policy_->picker_ = std::move(picker);
826
+ parent()->state_ = state;
827
+ parent()->status_ = status;
828
+ parent()->picker_ = std::move(picker);
782
829
  // Wrap the picker and return it to the channel.
783
- outlier_detection_policy_->MaybeUpdatePickerLocked();
784
- }
785
-
786
- void OutlierDetectionLb::Helper::RequestReresolution() {
787
- if (outlier_detection_policy_->shutting_down_) return;
788
- outlier_detection_policy_->channel_control_helper()->RequestReresolution();
789
- }
790
-
791
- absl::string_view OutlierDetectionLb::Helper::GetAuthority() {
792
- return outlier_detection_policy_->channel_control_helper()->GetAuthority();
793
- }
794
-
795
- grpc_event_engine::experimental::EventEngine*
796
- OutlierDetectionLb::Helper::GetEventEngine() {
797
- return outlier_detection_policy_->channel_control_helper()->GetEventEngine();
798
- }
799
-
800
- void OutlierDetectionLb::Helper::AddTraceEvent(TraceSeverity severity,
801
- absl::string_view message) {
802
- if (outlier_detection_policy_->shutting_down_) return;
803
- outlier_detection_policy_->channel_control_helper()->AddTraceEvent(severity,
804
- message);
830
+ parent()->MaybeUpdatePickerLocked();
805
831
  }
806
832
 
807
833
  //
@@ -21,9 +21,6 @@
21
21
 
22
22
  #include <stdint.h> // for uint32_t
23
23
 
24
- #include <memory>
25
- #include <string>
26
-
27
24
  #include "absl/types/optional.h"
28
25
 
29
26
  #include "src/core/lib/gprpp/time.h"
@@ -96,19 +93,8 @@ struct OutlierDetectionConfig {
96
93
  // TODO(roth): This is a horrible hack used to disable outlier detection
97
94
  // when used with the pick_first policy. Remove this as part of
98
95
  // implementing the dualstack backend design.
99
- class DisableOutlierDetectionAttribute
100
- : public ServerAddress::AttributeInterface {
101
- public:
102
- static const char* kName;
103
-
104
- std::unique_ptr<AttributeInterface> Copy() const override {
105
- return std::make_unique<DisableOutlierDetectionAttribute>();
106
- }
107
-
108
- int Cmp(const AttributeInterface*) const override { return true; }
109
-
110
- std::string ToString() const override { return "true"; }
111
- };
96
+ #define GRPC_ARG_OUTLIER_DETECTION_DISABLE \
97
+ GRPC_ARG_NO_SUBCHANNEL_PREFIX "outlier_detection_disable"
112
98
 
113
99
  } // namespace grpc_core
114
100
 
@@ -25,6 +25,8 @@
25
25
  #include <utility>
26
26
  #include <vector>
27
27
 
28
+ #include "absl/algorithm/container.h"
29
+ #include "absl/random/random.h"
28
30
  #include "absl/status/status.h"
29
31
  #include "absl/status/statusor.h"
30
32
  #include "absl/strings/str_cat.h"
@@ -40,11 +42,16 @@
40
42
  #include "src/core/lib/channel/channel_args.h"
41
43
  #include "src/core/lib/config/core_configuration.h"
42
44
  #include "src/core/lib/debug/trace.h"
45
+ #include "src/core/lib/gpr/string.h"
43
46
  #include "src/core/lib/gprpp/debug_location.h"
47
+ #include "src/core/lib/gprpp/env.h"
44
48
  #include "src/core/lib/gprpp/orphanable.h"
45
49
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
50
+ #include "src/core/lib/gprpp/validation_errors.h"
46
51
  #include "src/core/lib/gprpp/work_serializer.h"
47
52
  #include "src/core/lib/json/json.h"
53
+ #include "src/core/lib/json/json_args.h"
54
+ #include "src/core/lib/json/json_object_loader.h"
48
55
  #include "src/core/lib/load_balancing/lb_policy.h"
49
56
  #include "src/core/lib/load_balancing/lb_policy_factory.h"
50
57
  #include "src/core/lib/load_balancing/subchannel_interface.h"
@@ -55,6 +62,15 @@ namespace grpc_core {
55
62
 
56
63
  TraceFlag grpc_lb_pick_first_trace(false, "pick_first");
57
64
 
65
+ // TODO(eostroukhov): Remove once this feature is no longer experimental.
66
+ bool ShufflePickFirstEnabled() {
67
+ auto value = GetEnv("GRPC_EXPERIMENTAL_PICKFIRST_LB_CONFIG");
68
+ if (!value.has_value()) return false;
69
+ bool parsed_value;
70
+ bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value);
71
+ return parse_succeeded && parsed_value;
72
+ }
73
+
58
74
  namespace {
59
75
 
60
76
  //
@@ -63,6 +79,31 @@ namespace {
63
79
 
64
80
  constexpr absl::string_view kPickFirst = "pick_first";
65
81
 
82
+ class PickFirstConfig : public LoadBalancingPolicy::Config {
83
+ public:
84
+ absl::string_view name() const override { return kPickFirst; }
85
+ bool shuffle_addresses() const { return shuffle_addresses_; }
86
+
87
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&) {
88
+ static const auto kJsonLoader =
89
+ JsonObjectLoader<PickFirstConfig>()
90
+ .OptionalField("shuffleAddressList",
91
+ &PickFirstConfig::shuffle_addresses_)
92
+ .Finish();
93
+ return kJsonLoader;
94
+ }
95
+
96
+ void JsonPostLoad(const Json& /* json */, const JsonArgs& /* args */,
97
+ ValidationErrors* /* errors */) {
98
+ if (!ShufflePickFirstEnabled()) {
99
+ shuffle_addresses_ = false;
100
+ }
101
+ }
102
+
103
+ private:
104
+ bool shuffle_addresses_ = false;
105
+ };
106
+
66
107
  class PickFirst : public LoadBalancingPolicy {
67
108
  public:
68
109
  explicit PickFirst(Args args);
@@ -169,6 +210,8 @@ class PickFirst : public LoadBalancingPolicy {
169
210
  bool idle_ = false;
170
211
  // Are we shut down?
171
212
  bool shutdown_ = false;
213
+ // Random bit generator used for shuffling addresses if configured
214
+ absl::BitGen bit_gen_;
172
215
  };
173
216
 
174
217
  PickFirst::PickFirst(Args args) : LoadBalancingPolicy(std::move(args)) {
@@ -227,7 +270,8 @@ void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() {
227
270
  }
228
271
  latest_pending_subchannel_list_ = MakeRefCounted<PickFirstSubchannelList>(
229
272
  this, std::move(addresses), latest_update_args_.args);
230
- latest_pending_subchannel_list_->StartWatchingLocked();
273
+ latest_pending_subchannel_list_->StartWatchingLocked(
274
+ latest_update_args_.args);
231
275
  // Empty update or no valid subchannels. Put the channel in
232
276
  // TRANSIENT_FAILURE and request re-resolution.
233
277
  if (latest_pending_subchannel_list_->num_subchannels() == 0) {
@@ -274,6 +318,11 @@ absl::Status PickFirst::UpdateLocked(UpdateArgs args) {
274
318
  status = args.addresses.status();
275
319
  } else if (args.addresses->empty()) {
276
320
  status = absl::UnavailableError("address list must not be empty");
321
+ } else {
322
+ auto config = static_cast<PickFirstConfig*>(args.config.get());
323
+ if (config->shuffle_addresses()) {
324
+ absl::c_shuffle(*args.addresses, bit_gen_);
325
+ }
277
326
  }
278
327
  // TODO(roth): This is a hack to disable outlier_detection when used
279
328
  // with pick_first, for the reasons described in
@@ -282,9 +331,9 @@ absl::Status PickFirst::UpdateLocked(UpdateArgs args) {
282
331
  if (args.addresses.ok()) {
283
332
  ServerAddressList addresses;
284
333
  for (const auto& address : *args.addresses) {
285
- addresses.emplace_back(address.WithAttribute(
286
- DisableOutlierDetectionAttribute::kName,
287
- std::make_unique<DisableOutlierDetectionAttribute>()));
334
+ addresses.emplace_back(
335
+ address.address(),
336
+ address.args().Set(GRPC_ARG_OUTLIER_DETECTION_DISABLE, 1));
288
337
  }
289
338
  args.addresses = std::move(addresses);
290
339
  }
@@ -513,11 +562,6 @@ void PickFirst::PickFirstSubchannelData::ProcessUnselectedReadyLocked() {
513
562
  }
514
563
  }
515
564
 
516
- class PickFirstConfig : public LoadBalancingPolicy::Config {
517
- public:
518
- absl::string_view name() const override { return kPickFirst; }
519
- };
520
-
521
565
  //
522
566
  // factory
523
567
  //
@@ -532,8 +576,9 @@ class PickFirstFactory : public LoadBalancingPolicyFactory {
532
576
  absl::string_view name() const override { return kPickFirst; }
533
577
 
534
578
  absl::StatusOr<RefCountedPtr<LoadBalancingPolicy::Config>>
535
- ParseLoadBalancingConfig(const Json& /*json*/) const override {
536
- return MakeRefCounted<PickFirstConfig>();
579
+ ParseLoadBalancingConfig(const Json& json) const override {
580
+ return LoadFromJson<RefCountedPtr<PickFirstConfig>>(
581
+ json, JsonArgs(), "errors validating pick_first LB policy config");
537
582
  }
538
583
  };
539
584
 
@@ -0,0 +1,25 @@
1
+ //
2
+ // Copyright 2023 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #ifndef GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_PICK_FIRST_PICK_FIRST_H
18
+ #define GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_PICK_FIRST_PICK_FIRST_H
19
+
20
+ namespace grpc_core {
21
+ // TODO(eostroukhov): Remove once this feature is no longer experimental.
22
+ bool ShufflePickFirstEnabled();
23
+ } // namespace grpc_core
24
+
25
+ #endif // GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_PICK_FIRST_PICK_FIRST_H