grpc 1.55.0 → 1.56.0.pre3

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 (374) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +100 -68
  3. data/include/grpc/event_engine/event_engine.h +4 -3
  4. data/include/grpc/grpc_audit_logging.h +96 -0
  5. data/include/grpc/module.modulemap +2 -0
  6. data/include/grpc/support/json.h +218 -0
  7. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +5 -0
  8. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -0
  9. data/src/core/ext/filters/client_channel/channel_connectivity.cc +4 -4
  10. data/src/core/ext/filters/client_channel/client_channel.cc +86 -104
  11. data/src/core/ext/filters/client_channel/client_channel.h +6 -0
  12. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +19 -18
  13. data/src/core/ext/filters/client_channel/client_channel_internal.h +16 -21
  14. data/src/core/ext/filters/client_channel/config_selector.h +9 -24
  15. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +3 -0
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +5 -4
  17. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +455 -0
  18. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.h +54 -0
  19. data/src/core/ext/filters/client_channel/lb_policy/health_check_client_internal.h +186 -0
  20. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +2 -7
  21. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +52 -20
  22. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +23 -2
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +19 -6
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +1 -9
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +16 -7
  26. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +18 -1
  27. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +12 -9
  28. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -4
  29. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +36 -13
  30. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.cc +76 -6
  31. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +32 -39
  32. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +4 -10
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +52 -47
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +1 -9
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +14 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -43
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +7 -12
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +12 -19
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +35 -33
  40. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +29 -4
  41. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/service_config_helper.cc +1 -1
  42. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +28 -27
  43. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +163 -46
  44. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +16 -1
  45. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -0
  46. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +10 -40
  47. data/src/core/ext/filters/client_channel/subchannel.cc +10 -196
  48. data/src/core/ext/filters/client_channel/subchannel.h +3 -43
  49. data/src/core/ext/filters/http/message_compress/compression_filter.cc +5 -5
  50. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +100 -6
  51. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -8
  52. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -3
  53. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +16 -1
  54. data/src/core/ext/transport/chttp2/transport/flow_control.cc +46 -95
  55. data/src/core/ext/transport/chttp2/transport/internal.h +1 -15
  56. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +11 -2
  57. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +15 -0
  58. data/src/core/ext/xds/certificate_provider_store.cc +4 -9
  59. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  60. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +30 -42
  61. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +14 -9
  62. data/src/core/ext/xds/xds_api.cc +9 -6
  63. data/src/core/ext/xds/xds_api.h +3 -2
  64. data/src/core/ext/xds/xds_audit_logger_registry.cc +122 -0
  65. data/src/core/ext/xds/xds_audit_logger_registry.h +68 -0
  66. data/src/core/ext/xds/xds_bootstrap_grpc.cc +21 -9
  67. data/src/core/ext/xds/xds_bootstrap_grpc.h +5 -0
  68. data/src/core/ext/xds/xds_client.cc +5 -4
  69. data/src/core/ext/xds/xds_client_stats.h +1 -1
  70. data/src/core/ext/xds/xds_cluster.cc +20 -19
  71. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +11 -8
  72. data/src/core/ext/xds/xds_common_types.cc +3 -1
  73. data/src/core/ext/xds/xds_http_fault_filter.cc +16 -13
  74. data/src/core/ext/xds/xds_http_fault_filter.h +2 -1
  75. data/src/core/ext/xds/xds_http_filters.h +4 -2
  76. data/src/core/ext/xds/xds_http_rbac_filter.cc +154 -67
  77. data/src/core/ext/xds/xds_http_rbac_filter.h +2 -1
  78. data/src/core/ext/xds/xds_http_stateful_session_filter.cc +15 -11
  79. data/src/core/ext/xds/xds_http_stateful_session_filter.h +2 -1
  80. data/src/core/ext/xds/xds_lb_policy_registry.cc +22 -16
  81. data/src/core/ext/xds/xds_listener.cc +1 -0
  82. data/src/core/ext/xds/xds_route_config.cc +40 -3
  83. data/src/core/ext/xds/xds_routing.cc +2 -2
  84. data/src/core/ext/xds/xds_transport_grpc.cc +3 -1
  85. data/src/core/lib/avl/avl.h +5 -0
  86. data/src/core/lib/channel/channel_args.cc +80 -22
  87. data/src/core/lib/channel/channel_args.h +34 -1
  88. data/src/core/lib/channel/channel_trace.cc +16 -12
  89. data/src/core/lib/channel/channelz.cc +159 -132
  90. data/src/core/lib/channel/channelz.h +42 -35
  91. data/src/core/lib/channel/channelz_registry.cc +23 -20
  92. data/src/core/lib/channel/connected_channel.cc +17 -6
  93. data/src/core/lib/channel/promise_based_filter.cc +0 -4
  94. data/src/core/lib/channel/promise_based_filter.h +2 -0
  95. data/src/core/lib/compression/compression_internal.cc +2 -5
  96. data/src/core/lib/config/config_vars.cc +20 -18
  97. data/src/core/lib/config/config_vars.h +4 -4
  98. data/src/core/lib/config/load_config.cc +13 -0
  99. data/src/core/lib/config/load_config.h +6 -0
  100. data/src/core/lib/debug/event_log.h +1 -1
  101. data/src/core/lib/debug/stats_data.h +1 -1
  102. data/src/core/lib/debug/trace.cc +24 -55
  103. data/src/core/lib/debug/trace.h +3 -1
  104. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +211 -0
  105. data/src/core/lib/event_engine/cf_engine/cf_engine.h +86 -0
  106. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +354 -0
  107. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +146 -0
  108. data/src/core/lib/event_engine/cf_engine/cftype_unique_ref.h +79 -0
  109. data/src/core/lib/event_engine/default_event_engine.cc +13 -1
  110. data/src/core/lib/event_engine/default_event_engine_factory.cc +14 -2
  111. data/src/core/lib/event_engine/poller.h +2 -2
  112. data/src/core/lib/event_engine/posix.h +4 -0
  113. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +1 -1
  114. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +7 -18
  115. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -0
  116. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +33 -19
  117. data/src/core/lib/event_engine/posix_engine/posix_engine.h +1 -1
  118. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -4
  119. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +7 -8
  120. data/src/core/lib/event_engine/posix_engine/timer_manager.h +1 -1
  121. data/src/core/lib/event_engine/shim.cc +7 -1
  122. data/src/core/lib/event_engine/{thread_pool.cc → thread_pool/original_thread_pool.cc} +28 -25
  123. data/src/core/lib/event_engine/{thread_pool.h → thread_pool/original_thread_pool.h} +11 -15
  124. data/src/core/lib/event_engine/thread_pool/thread_pool.h +50 -0
  125. data/src/core/lib/event_engine/{executor/executor.h → thread_pool/thread_pool_factory.cc} +17 -15
  126. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +489 -0
  127. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +249 -0
  128. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +166 -0
  129. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +108 -0
  130. data/src/core/lib/event_engine/windows/iocp.cc +4 -3
  131. data/src/core/lib/event_engine/windows/iocp.h +3 -3
  132. data/src/core/lib/event_engine/windows/win_socket.cc +6 -6
  133. data/src/core/lib/event_engine/windows/win_socket.h +4 -4
  134. data/src/core/lib/event_engine/windows/windows_endpoint.cc +11 -10
  135. data/src/core/lib/event_engine/windows/windows_endpoint.h +3 -2
  136. data/src/core/lib/event_engine/windows/windows_engine.cc +19 -17
  137. data/src/core/lib/event_engine/windows/windows_engine.h +6 -6
  138. data/src/core/lib/event_engine/windows/windows_listener.cc +3 -3
  139. data/src/core/lib/event_engine/windows/windows_listener.h +3 -2
  140. data/src/core/lib/event_engine/work_queue/basic_work_queue.cc +63 -0
  141. data/src/core/lib/event_engine/work_queue/basic_work_queue.h +71 -0
  142. data/src/core/lib/event_engine/work_queue/work_queue.h +62 -0
  143. data/src/core/lib/experiments/config.cc +38 -7
  144. data/src/core/lib/experiments/config.h +16 -0
  145. data/src/core/lib/experiments/experiments.cc +67 -20
  146. data/src/core/lib/experiments/experiments.h +27 -21
  147. data/src/core/lib/gpr/log_internal.h +55 -0
  148. data/src/core/lib/gprpp/crash.cc +10 -0
  149. data/src/core/lib/gprpp/crash.h +3 -0
  150. data/src/core/lib/gprpp/per_cpu.cc +33 -0
  151. data/src/core/lib/gprpp/per_cpu.h +29 -6
  152. data/src/core/lib/gprpp/time.cc +1 -0
  153. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  154. data/src/core/lib/iomgr/endpoint_cfstream.cc +10 -8
  155. data/src/core/lib/iomgr/ev_apple.cc +12 -12
  156. data/src/core/lib/iomgr/ev_epoll1_linux.cc +10 -3
  157. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +15 -1
  158. data/src/core/lib/iomgr/iocp_windows.cc +24 -3
  159. data/src/core/lib/iomgr/iocp_windows.h +11 -0
  160. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -1
  161. data/src/core/lib/iomgr/socket_utils_common_posix.cc +4 -2
  162. data/src/core/lib/iomgr/socket_windows.cc +61 -7
  163. data/src/core/lib/iomgr/socket_windows.h +9 -2
  164. data/src/core/lib/iomgr/tcp_client_cfstream.cc +14 -3
  165. data/src/core/lib/iomgr/tcp_server_posix.cc +148 -107
  166. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  167. data/src/core/lib/iomgr/tcp_server_windows.cc +1 -1
  168. data/src/core/lib/json/json.h +2 -166
  169. data/src/core/lib/json/json_object_loader.cc +8 -9
  170. data/src/core/lib/json/json_object_loader.h +25 -18
  171. data/src/core/lib/json/json_reader.cc +13 -6
  172. data/src/core/lib/json/json_util.cc +6 -11
  173. data/src/core/lib/json/json_writer.cc +7 -8
  174. data/src/core/lib/load_balancing/lb_policy.h +13 -0
  175. data/src/core/lib/load_balancing/lb_policy_registry.cc +2 -1
  176. data/src/core/lib/matchers/matchers.cc +3 -4
  177. data/src/core/lib/matchers/matchers.h +2 -1
  178. data/src/core/lib/promise/activity.cc +5 -0
  179. data/src/core/lib/promise/activity.h +10 -0
  180. data/src/core/lib/promise/detail/promise_factory.h +1 -1
  181. data/src/core/lib/promise/party.cc +31 -13
  182. data/src/core/lib/promise/party.h +11 -2
  183. data/src/core/lib/promise/pipe.h +9 -2
  184. data/src/core/lib/promise/prioritized_race.h +95 -0
  185. data/src/core/lib/promise/sleep.cc +2 -1
  186. data/src/core/lib/resolver/server_address.cc +0 -8
  187. data/src/core/lib/resolver/server_address.h +0 -6
  188. data/src/core/lib/resource_quota/memory_quota.cc +7 -7
  189. data/src/core/lib/resource_quota/memory_quota.h +1 -2
  190. data/src/core/lib/security/authorization/audit_logging.cc +98 -0
  191. data/src/core/lib/security/authorization/audit_logging.h +73 -0
  192. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +47 -2
  193. data/src/core/lib/security/authorization/grpc_authorization_engine.h +18 -1
  194. data/src/core/lib/security/authorization/rbac_policy.cc +36 -4
  195. data/src/core/lib/security/authorization/rbac_policy.h +19 -2
  196. data/src/core/lib/security/authorization/stdout_logger.cc +75 -0
  197. data/src/core/lib/security/authorization/stdout_logger.h +61 -0
  198. data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +8 -4
  199. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +8 -18
  200. data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +14 -8
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +19 -12
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +4 -2
  203. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +1 -0
  204. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +1 -0
  205. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -0
  206. data/src/core/lib/security/credentials/jwt/json_token.cc +15 -14
  207. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +4 -2
  208. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +1 -0
  209. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +1 -0
  210. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -5
  211. data/src/core/lib/security/util/json_util.cc +1 -0
  212. data/src/core/lib/service_config/service_config_call_data.h +49 -20
  213. data/src/core/lib/service_config/service_config_impl.cc +2 -1
  214. data/src/core/lib/surface/call.cc +38 -23
  215. data/src/core/lib/surface/completion_queue.cc +6 -2
  216. data/src/core/lib/surface/version.cc +2 -2
  217. data/src/core/lib/transport/batch_builder.cc +15 -12
  218. data/src/core/lib/transport/batch_builder.h +39 -35
  219. data/src/core/plugin_registry/grpc_plugin_registry.cc +0 -2
  220. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  221. data/src/ruby/ext/grpc/extconf.rb +8 -9
  222. data/src/ruby/lib/grpc/version.rb +1 -1
  223. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +9 -8
  224. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +1 -1
  225. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +3 -3
  226. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +10 -6
  227. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +7 -4
  228. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +6 -4
  229. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +2 -1
  230. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +5 -9
  231. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +4 -2
  232. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +31 -22
  233. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +29 -26
  234. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +8 -0
  235. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +189 -13
  236. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_openbsd.c +62 -0
  237. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_openbsd.c +31 -0
  238. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +6 -4
  239. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h +795 -795
  240. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +1 -5
  241. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +4 -0
  242. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +18 -6
  243. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +15 -7
  244. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +1 -1
  245. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c +1 -1
  246. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  247. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +3 -0
  248. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +24 -24
  249. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +1 -1
  250. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +7 -7
  251. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +74 -74
  252. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +1 -2
  253. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +11 -11
  254. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz.c +12 -12
  255. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +14 -15
  256. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +1 -1
  257. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +10 -10
  258. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +23 -23
  259. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +13 -13
  260. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +1 -1
  261. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +2 -2
  262. data/third_party/boringssl-with-bazel/src/crypto/{hkdf → fipsmodule/hkdf}/hkdf.c +1 -1
  263. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +2 -10
  264. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +1 -4
  265. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +115 -133
  266. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +12 -14
  267. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +57 -47
  268. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +1 -8
  269. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/polyval.c +27 -28
  270. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +11 -23
  271. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +21 -16
  272. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.c +5 -288
  273. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +143 -83
  274. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +95 -183
  275. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +71 -0
  276. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/internal.h +8 -0
  277. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/kdf.c +33 -0
  278. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +162 -6
  279. data/third_party/boringssl-with-bazel/src/crypto/internal.h +18 -0
  280. data/third_party/boringssl-with-bazel/src/crypto/kyber/kyber.c +18 -11
  281. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +6 -13
  282. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +18 -14
  283. data/third_party/boringssl-with-bazel/src/crypto/{refcount_lock.c → refcount_no_threads.c} +3 -13
  284. data/third_party/boringssl-with-bazel/src/crypto/refcount_win.c +89 -0
  285. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/internal.h +77 -0
  286. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_crypt.c +568 -0
  287. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +62 -0
  288. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +218 -44
  289. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +35 -0
  290. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +588 -39
  291. data/third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c +27 -18
  292. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +1 -1
  293. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +17 -39
  294. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +39 -48
  295. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +0 -140
  296. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +72 -23
  297. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +11 -14
  298. data/third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c +1 -1
  299. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  300. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +1 -1
  301. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +33 -46
  302. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +1 -0
  303. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +3 -5
  304. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +14 -46
  305. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +14 -26
  306. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +17 -10
  307. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +1 -1
  308. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +5 -7
  309. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +6 -4
  310. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +32 -1
  311. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +0 -4
  312. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +1 -4
  313. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +3 -3
  314. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +28 -0
  315. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +2 -11
  316. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -3
  317. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +91 -1
  318. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +5 -0
  319. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +149 -20
  320. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +4 -0
  321. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +4 -0
  322. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +8 -0
  323. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +774 -615
  324. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +42 -10
  325. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +11 -6
  326. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +2 -4
  327. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +24 -16
  328. data/third_party/boringssl-with-bazel/src/ssl/internal.h +65 -18
  329. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +37 -18
  330. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +187 -193
  331. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +13 -129
  332. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +85 -10
  333. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +17 -4
  334. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +27 -19
  335. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +1 -1
  336. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +5 -21
  337. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +5 -2
  338. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64_msvc.h +1281 -0
  339. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64_msvc.h +2002 -0
  340. data/third_party/cares/cares/include/ares.h +23 -1
  341. data/third_party/cares/cares/{src/lib → include}/ares_nameser.h +9 -7
  342. data/third_party/cares/cares/include/ares_rules.h +2 -2
  343. data/third_party/cares/cares/include/ares_version.h +3 -3
  344. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +266 -0
  345. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +240 -0
  346. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +49 -80
  347. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +37 -43
  348. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +12 -4
  349. data/third_party/cares/cares/src/lib/ares_data.c +16 -0
  350. data/third_party/cares/cares/src/lib/ares_data.h +7 -0
  351. data/third_party/cares/cares/src/lib/ares_destroy.c +8 -0
  352. data/third_party/cares/cares/src/lib/ares_expand_name.c +17 -6
  353. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +1 -0
  354. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +156 -78
  355. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +130 -326
  356. data/third_party/cares/cares/src/lib/ares_init.c +97 -485
  357. data/third_party/cares/cares/src/lib/ares_library_init.c +2 -89
  358. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +23 -142
  359. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +22 -142
  360. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +184 -0
  361. data/third_party/cares/cares/src/lib/ares_private.h +30 -16
  362. data/third_party/cares/cares/src/lib/ares_process.c +55 -16
  363. data/third_party/cares/cares/src/lib/ares_query.c +1 -35
  364. data/third_party/cares/cares/src/lib/ares_rand.c +279 -0
  365. data/third_party/cares/cares/src/lib/ares_send.c +5 -7
  366. data/third_party/cares/cares/src/lib/ares_strdup.c +12 -19
  367. data/third_party/cares/cares/src/lib/ares_strsplit.c +44 -128
  368. data/third_party/cares/cares/src/lib/ares_strsplit.h +9 -10
  369. data/third_party/cares/cares/src/lib/inet_net_pton.c +78 -116
  370. data/third_party/cares/cares/src/tools/ares_getopt.h +53 -0
  371. metadata +50 -14
  372. data/src/core/ext/filters/client_channel/health/health_check_client.cc +0 -175
  373. data/src/core/ext/filters/client_channel/health/health_check_client.h +0 -43
  374. data/third_party/cares/cares/src/lib/ares_library_init.h +0 -43
@@ -22,13 +22,11 @@
22
22
 
23
23
  #include <algorithm>
24
24
  #include <set>
25
- #include <string>
26
25
  #include <utility>
27
26
  #include <vector>
28
27
 
29
28
  #include "absl/status/status.h"
30
29
  #include "absl/strings/string_view.h"
31
- #include "absl/types/optional.h"
32
30
  #include "google/protobuf/duration.upb.h"
33
31
  #include "upb/upb.hpp"
34
32
  #include "xds/service/orca/v3/orca.upb.h"
@@ -217,9 +215,7 @@ void OrcaProducer::Start(RefCountedPtr<Subchannel> subchannel) {
217
215
  connected_subchannel_ = subchannel_->connected_subchannel();
218
216
  auto connectivity_watcher = MakeRefCounted<ConnectivityWatcher>(WeakRef());
219
217
  connectivity_watcher_ = connectivity_watcher.get();
220
- subchannel_->WatchConnectivityState(
221
- /*health_check_service_name=*/absl::nullopt,
222
- std::move(connectivity_watcher));
218
+ subchannel_->WatchConnectivityState(std::move(connectivity_watcher));
223
219
  }
224
220
 
225
221
  void OrcaProducer::Orphan() {
@@ -228,8 +224,7 @@ void OrcaProducer::Orphan() {
228
224
  stream_client_.reset();
229
225
  }
230
226
  GPR_ASSERT(subchannel_ != nullptr); // Should not be called before Start().
231
- subchannel_->CancelConnectivityStateWatch(
232
- /*health_check_service_name=*/absl::nullopt, connectivity_watcher_);
227
+ subchannel_->CancelConnectivityStateWatch(connectivity_watcher_);
233
228
  subchannel_->RemoveDataProducer(this);
234
229
  }
235
230
 
@@ -68,6 +68,9 @@ namespace grpc_core {
68
68
 
69
69
  TraceFlag grpc_outlier_detection_lb_trace(false, "outlier_detection_lb");
70
70
 
71
+ const char* DisableOutlierDetectionAttribute::kName =
72
+ "disable_outlier_detection";
73
+
71
74
  namespace {
72
75
 
73
76
  using ::grpc_event_engine::experimental::EventEngine;
@@ -257,7 +260,12 @@ class OutlierDetectionLb : public LoadBalancingPolicy {
257
260
  void Eject(const Timestamp& time) {
258
261
  ejection_time_ = time;
259
262
  ++multiplier_;
260
- for (auto& subchannel : subchannels_) {
263
+ // Ejecting the subchannel may cause the child policy to unref the
264
+ // subchannel, so we need to be prepared for the set to be modified
265
+ // while we are iterating.
266
+ for (auto it = subchannels_.begin(); it != subchannels_.end();) {
267
+ SubchannelWrapper* subchannel = *it;
268
+ ++it;
261
269
  subchannel->Eject();
262
270
  }
263
271
  }
@@ -363,6 +371,8 @@ class OutlierDetectionLb : public LoadBalancingPolicy {
363
371
 
364
372
  ~OutlierDetectionLb() override;
365
373
 
374
+ // Returns the address map key for an address, or the empty string if
375
+ // the address should be ignored.
366
376
  static std::string MakeKeyForAddress(const ServerAddress& address);
367
377
 
368
378
  void ShutdownLocked() override;
@@ -394,8 +404,13 @@ class OutlierDetectionLb : public LoadBalancingPolicy {
394
404
 
395
405
  void OutlierDetectionLb::SubchannelWrapper::Eject() {
396
406
  ejected_ = true;
397
- for (auto& watcher : watchers_) {
398
- watcher.second->Eject();
407
+ // Ejecting the subchannel may cause the child policy to cancel the watch,
408
+ // so we need to be prepared for the map to be modified while we are
409
+ // iterating.
410
+ for (auto it = watchers_.begin(); it != watchers_.end();) {
411
+ WatcherWrapper* watcher = it->second;
412
+ ++it;
413
+ watcher->Eject();
399
414
  }
400
415
  }
401
416
 
@@ -536,9 +551,21 @@ OutlierDetectionLb::~OutlierDetectionLb() {
536
551
 
537
552
  std::string OutlierDetectionLb::MakeKeyForAddress(
538
553
  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
+ }
539
564
  // Use only the address, not the attributes.
540
565
  auto addr_str = grpc_sockaddr_to_string(&address.address(), false);
541
- return addr_str.ok() ? addr_str.value() : addr_str.status().ToString();
566
+ // If address couldn't be stringified, ignore it.
567
+ if (!addr_str.ok()) return "";
568
+ return std::move(*addr_str);
542
569
  }
543
570
 
544
571
  void OutlierDetectionLb::ShutdownLocked() {
@@ -611,6 +638,7 @@ absl::Status OutlierDetectionLb::UpdateLocked(UpdateArgs args) {
611
638
  std::set<std::string> current_addresses;
612
639
  for (const ServerAddress& address : *args.addresses) {
613
640
  std::string address_key = MakeKeyForAddress(address);
641
+ if (address_key.empty()) continue;
614
642
  auto& subchannel_state = subchannel_state_map_[address_key];
615
643
  if (subchannel_state == nullptr) {
616
644
  subchannel_state = MakeRefCounted<SubchannelState>();
@@ -712,11 +740,19 @@ OrphanablePtr<LoadBalancingPolicy> OutlierDetectionLb::CreateChildPolicyLocked(
712
740
  RefCountedPtr<SubchannelInterface> OutlierDetectionLb::Helper::CreateSubchannel(
713
741
  ServerAddress address, const ChannelArgs& args) {
714
742
  if (outlier_detection_policy_->shutting_down_) return nullptr;
715
- std::string key = MakeKeyForAddress(address);
716
743
  RefCountedPtr<SubchannelState> subchannel_state;
717
- auto it = outlier_detection_policy_->subchannel_state_map_.find(key);
718
- if (it != outlier_detection_policy_->subchannel_state_map_.end()) {
719
- subchannel_state = it->second->Ref();
744
+ std::string key = MakeKeyForAddress(address);
745
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_outlier_detection_lb_trace)) {
746
+ 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());
750
+ }
751
+ if (!key.empty()) {
752
+ auto it = outlier_detection_policy_->subchannel_state_map_.find(key);
753
+ if (it != outlier_detection_policy_->subchannel_state_map_.end()) {
754
+ subchannel_state = it->second->Ref();
755
+ }
720
756
  }
721
757
  auto subchannel = MakeRefCounted<SubchannelWrapper>(
722
758
  subchannel_state,
@@ -858,8 +894,10 @@ void OutlierDetectionLb::EjectionTimer::OnTimerLocked() {
858
894
  config.success_rate_ejection->minimum_hosts) {
859
895
  if (GRPC_TRACE_FLAG_ENABLED(grpc_outlier_detection_lb_trace)) {
860
896
  gpr_log(GPR_INFO,
861
- "[outlier_detection_lb %p] running success rate algorithm",
862
- parent_.get());
897
+ "[outlier_detection_lb %p] running success rate algorithm: "
898
+ "stdev_factor=%d, enforcement_percentage=%d",
899
+ parent_.get(), config.success_rate_ejection->stdev_factor,
900
+ config.success_rate_ejection->enforcement_percentage);
863
901
  }
864
902
  // calculate ejection threshold: (mean - stdev *
865
903
  // (success_rate_ejection.stdev_factor / 1000))
@@ -917,8 +955,10 @@ void OutlierDetectionLb::EjectionTimer::OnTimerLocked() {
917
955
  config.failure_percentage_ejection->minimum_hosts) {
918
956
  if (GRPC_TRACE_FLAG_ENABLED(grpc_outlier_detection_lb_trace)) {
919
957
  gpr_log(GPR_INFO,
920
- "[outlier_detection_lb %p] running failure percentage algorithm",
921
- parent_.get());
958
+ "[outlier_detection_lb %p] running failure percentage algorithm: "
959
+ "threshold=%d, enforcement_percentage=%d",
960
+ parent_.get(), config.failure_percentage_ejection->threshold,
961
+ config.failure_percentage_ejection->enforcement_percentage);
922
962
  }
923
963
  for (auto& candidate : failure_percentage_ejection_candidates) {
924
964
  if (GRPC_TRACE_FLAG_ENABLED(grpc_outlier_detection_lb_trace)) {
@@ -992,14 +1032,6 @@ class OutlierDetectionLbFactory : public LoadBalancingPolicyFactory {
992
1032
 
993
1033
  absl::StatusOr<RefCountedPtr<LoadBalancingPolicy::Config>>
994
1034
  ParseLoadBalancingConfig(const Json& json) const override {
995
- if (json.type() == Json::Type::kNull) {
996
- // This policy was configured in the deprecated loadBalancingPolicy
997
- // field or in the client API.
998
- return absl::InvalidArgumentError(
999
- "field:loadBalancingPolicy error:outlier_detection policy requires "
1000
- "configuration. Please use loadBalancingConfig field of service "
1001
- "config instead.");
1002
- }
1003
1035
  ValidationErrors errors;
1004
1036
  OutlierDetectionConfig outlier_detection_config;
1005
1037
  RefCountedPtr<LoadBalancingPolicy::Config> child_policy;
@@ -21,6 +21,9 @@
21
21
 
22
22
  #include <stdint.h> // for uint32_t
23
23
 
24
+ #include <memory>
25
+ #include <string>
26
+
24
27
  #include "absl/types/optional.h"
25
28
 
26
29
  #include "src/core/lib/gprpp/time.h"
@@ -28,6 +31,7 @@
28
31
  #include "src/core/lib/json/json.h"
29
32
  #include "src/core/lib/json/json_args.h"
30
33
  #include "src/core/lib/json/json_object_loader.h"
34
+ #include "src/core/lib/resolver/server_address.h"
31
35
 
32
36
  namespace grpc_core {
33
37
 
@@ -38,7 +42,7 @@ struct OutlierDetectionConfig {
38
42
  uint32_t max_ejection_percent = 10;
39
43
  struct SuccessRateEjection {
40
44
  uint32_t stdev_factor = 1900;
41
- uint32_t enforcement_percentage = 0;
45
+ uint32_t enforcement_percentage = 100;
42
46
  uint32_t minimum_hosts = 5;
43
47
  uint32_t request_volume = 100;
44
48
 
@@ -56,7 +60,7 @@ struct OutlierDetectionConfig {
56
60
  };
57
61
  struct FailurePercentageEjection {
58
62
  uint32_t threshold = 85;
59
- uint32_t enforcement_percentage = 0;
63
+ uint32_t enforcement_percentage = 100;
60
64
  uint32_t minimum_hosts = 5;
61
65
  uint32_t request_volume = 50;
62
66
 
@@ -89,6 +93,23 @@ struct OutlierDetectionConfig {
89
93
  ValidationErrors* errors);
90
94
  };
91
95
 
96
+ // TODO(roth): This is a horrible hack used to disable outlier detection
97
+ // when used with the pick_first policy. Remove this as part of
98
+ // 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
+ };
112
+
92
113
  } // namespace grpc_core
93
114
 
94
115
  #endif // GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_OUTLIER_DETECTION_OUTLIER_DETECTION_H
@@ -35,6 +35,7 @@
35
35
  #include <grpc/impl/connectivity_state.h>
36
36
  #include <grpc/support/log.h>
37
37
 
38
+ #include "src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h"
38
39
  #include "src/core/ext/filters/client_channel/lb_policy/subchannel_list.h"
39
40
  #include "src/core/lib/channel/channel_args.h"
40
41
  #include "src/core/lib/config/core_configuration.h"
@@ -42,6 +43,7 @@
42
43
  #include "src/core/lib/gprpp/debug_location.h"
43
44
  #include "src/core/lib/gprpp/orphanable.h"
44
45
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
46
+ #include "src/core/lib/gprpp/work_serializer.h"
45
47
  #include "src/core/lib/json/json.h"
46
48
  #include "src/core/lib/load_balancing/lb_policy.h"
47
49
  #include "src/core/lib/load_balancing/lb_policy_factory.h"
@@ -130,6 +132,10 @@ class PickFirst : public LoadBalancingPolicy {
130
132
  void set_attempting_index(size_t index) { attempting_index_ = index; }
131
133
 
132
134
  private:
135
+ std::shared_ptr<WorkSerializer> work_serializer() const override {
136
+ return static_cast<PickFirst*>(policy())->work_serializer();
137
+ }
138
+
133
139
  bool in_transient_failure_ = false;
134
140
  size_t attempting_index_ = 0;
135
141
  };
@@ -235,12 +241,6 @@ void PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked() {
235
241
  MakeRefCounted<TransientFailurePicker>(status));
236
242
  channel_control_helper()->RequestReresolution();
237
243
  }
238
- // Otherwise, if this is the initial update, report CONNECTING.
239
- else if (subchannel_list_.get() == nullptr) {
240
- channel_control_helper()->UpdateState(
241
- GRPC_CHANNEL_CONNECTING, absl::Status(),
242
- MakeRefCounted<QueuePicker>(Ref(DEBUG_LOCATION, "QueuePicker")));
243
- }
244
244
  // If the new update is empty or we don't yet have a selected subchannel in
245
245
  // the current list, replace the current subchannel list immediately.
246
246
  if (latest_pending_subchannel_list_->num_subchannels() == 0 ||
@@ -275,6 +275,19 @@ absl::Status PickFirst::UpdateLocked(UpdateArgs args) {
275
275
  } else if (args.addresses->empty()) {
276
276
  status = absl::UnavailableError("address list must not be empty");
277
277
  }
278
+ // TODO(roth): This is a hack to disable outlier_detection when used
279
+ // with pick_first, for the reasons described in
280
+ // https://github.com/grpc/grpc/issues/32967. Remove this when
281
+ // implementing the dualstack design.
282
+ if (args.addresses.ok()) {
283
+ ServerAddressList addresses;
284
+ for (const auto& address : *args.addresses) {
285
+ addresses.emplace_back(address.WithAttribute(
286
+ DisableOutlierDetectionAttribute::kName,
287
+ std::make_unique<DisableOutlierDetectionAttribute>()));
288
+ }
289
+ args.addresses = std::move(addresses);
290
+ }
278
291
  // If the update contains a resolver error and we have a previous update
279
292
  // that was not a resolver error, keep using the previous addresses.
280
293
  if (!args.addresses.ok() && latest_update_args_.config != nullptr) {
@@ -903,15 +903,7 @@ class PriorityLbFactory : public LoadBalancingPolicyFactory {
903
903
 
904
904
  absl::StatusOr<RefCountedPtr<LoadBalancingPolicy::Config>>
905
905
  ParseLoadBalancingConfig(const Json& json) const override {
906
- if (json.type() == Json::Type::kNull) {
907
- // priority was mentioned as a policy in the deprecated
908
- // loadBalancingPolicy field or in the client API.
909
- return absl::InvalidArgumentError(
910
- "field:loadBalancingPolicy error:priority policy requires "
911
- "configuration. Please use loadBalancingConfig field of service "
912
- "config instead.");
913
- }
914
- return LoadRefCountedFromJson<PriorityLbConfig>(
906
+ return LoadFromJson<RefCountedPtr<PriorityLbConfig>>(
915
907
  json, JsonArgs(), "errors validating priority LB policy config");
916
908
  }
917
909
  };
@@ -70,7 +70,7 @@ namespace grpc_core {
70
70
 
71
71
  TraceFlag grpc_lb_ring_hash_trace(false, "ring_hash_lb");
72
72
 
73
- UniqueTypeName RequestHashAttributeName() {
73
+ UniqueTypeName RequestHashAttribute::TypeName() {
74
74
  static UniqueTypeName::Factory kFactory("request_hash");
75
75
  return kFactory.Create();
76
76
  }
@@ -232,6 +232,10 @@ class RingHash : public LoadBalancingPolicy {
232
232
  absl::Status status);
233
233
 
234
234
  private:
235
+ std::shared_ptr<WorkSerializer> work_serializer() const override {
236
+ return static_cast<RingHash*>(policy())->work_serializer();
237
+ }
238
+
235
239
  size_t num_idle_;
236
240
  size_t num_ready_ = 0;
237
241
  size_t num_connecting_ = 0;
@@ -341,7 +345,12 @@ class RingHash : public LoadBalancingPolicy {
341
345
 
342
346
  RingHash::PickResult RingHash::Picker::Pick(PickArgs args) {
343
347
  auto* call_state = static_cast<ClientChannelLbCallState*>(args.call_state);
344
- auto hash = call_state->GetCallAttribute(RequestHashAttributeName());
348
+ auto* hash_attribute = static_cast<RequestHashAttribute*>(
349
+ call_state->GetCallAttribute(RequestHashAttribute::TypeName()));
350
+ absl::string_view hash;
351
+ if (hash_attribute != nullptr) {
352
+ hash = hash_attribute->request_hash();
353
+ }
345
354
  uint64_t h;
346
355
  if (!absl::SimpleAtoi(hash, &h)) {
347
356
  return PickResult::Fail(
@@ -351,12 +360,12 @@ RingHash::PickResult RingHash::Picker::Pick(PickArgs args) {
351
360
  // Ported from https://github.com/RJ/ketama/blob/master/libketama/ketama.c
352
361
  // (ketama_get_server) NOTE: The algorithm depends on using signed integers
353
362
  // for lowp, highp, and first_index. Do not change them!
354
- size_t lowp = 0;
355
- size_t highp = ring.size();
356
- size_t first_index = 0;
363
+ int64_t lowp = 0;
364
+ int64_t highp = ring.size();
365
+ int64_t first_index = 0;
357
366
  while (true) {
358
367
  first_index = (lowp + highp) / 2;
359
- if (first_index == ring.size()) {
368
+ if (first_index == static_cast<int64_t>(ring.size())) {
360
369
  first_index = 0;
361
370
  break;
362
371
  }
@@ -500,7 +509,7 @@ RingHash::RingHashSubchannelList::Ring::Ring(
500
509
  std::ceil(min_normalized_weight * min_ring_size) / min_normalized_weight,
501
510
  static_cast<double>(max_ring_size));
502
511
  // Reserve memory for the entire ring up front.
503
- const size_t ring_size = std::ceil(scale);
512
+ const uint64_t ring_size = std::ceil(scale);
504
513
  ring_.reserve(ring_size);
505
514
  // Populate the hash ring by walking through the (host, weight) pairs in
506
515
  // normalized_host_weights, and generating (scale * weight) hashes for each
@@ -21,15 +21,32 @@
21
21
 
22
22
  #include <stdint.h>
23
23
 
24
+ #include "absl/strings/string_view.h"
25
+
24
26
  #include "src/core/lib/gprpp/unique_type_name.h"
25
27
  #include "src/core/lib/gprpp/validation_errors.h"
26
28
  #include "src/core/lib/json/json.h"
27
29
  #include "src/core/lib/json/json_args.h"
28
30
  #include "src/core/lib/json/json_object_loader.h"
31
+ #include "src/core/lib/service_config/service_config_call_data.h"
29
32
 
30
33
  namespace grpc_core {
31
34
 
32
- UniqueTypeName RequestHashAttributeName();
35
+ class RequestHashAttribute
36
+ : public ServiceConfigCallData::CallAttributeInterface {
37
+ public:
38
+ static UniqueTypeName TypeName();
39
+
40
+ explicit RequestHashAttribute(absl::string_view request_hash)
41
+ : request_hash_(request_hash) {}
42
+
43
+ absl::string_view request_hash() const { return request_hash_; }
44
+
45
+ private:
46
+ UniqueTypeName type() const override { return TypeName(); }
47
+
48
+ absl::string_view request_hash_;
49
+ };
33
50
 
34
51
  // Helper Parsing method to parse ring hash policy configs; for example, ring
35
52
  // hash size validity.
@@ -61,6 +61,7 @@
61
61
  #include <grpc/impl/propagation_bits.h>
62
62
  #include <grpc/slice.h>
63
63
  #include <grpc/status.h>
64
+ #include <grpc/support/json.h>
64
65
  #include <grpc/support/log.h>
65
66
 
66
67
  #include "src/core/ext/filters/client_channel/client_channel.h"
@@ -356,7 +357,7 @@ class RlsLb : public LoadBalancingPolicy {
356
357
  RefCountedPtr<LoadBalancingPolicy::Config> pending_config_;
357
358
 
358
359
  grpc_connectivity_state connectivity_state_ ABSL_GUARDED_BY(&RlsLb::mu_) =
359
- GRPC_CHANNEL_IDLE;
360
+ GRPC_CHANNEL_CONNECTING;
360
361
  RefCountedPtr<LoadBalancingPolicy::SubchannelPicker> picker_
361
362
  ABSL_GUARDED_BY(&RlsLb::mu_);
362
363
  };
@@ -731,9 +732,9 @@ RlsLb::ChildPolicyWrapper::ChildPolicyWrapper(RefCountedPtr<RlsLb> lb_policy,
731
732
  : DualRefCounted<ChildPolicyWrapper>(
732
733
  GRPC_TRACE_FLAG_ENABLED(grpc_lb_rls_trace) ? "ChildPolicyWrapper"
733
734
  : nullptr),
734
- lb_policy_(lb_policy),
735
+ lb_policy_(std::move(lb_policy)),
735
736
  target_(std::move(target)),
736
- picker_(MakeRefCounted<QueuePicker>(std::move(lb_policy))) {
737
+ picker_(MakeRefCounted<QueuePicker>(nullptr)) {
737
738
  lb_policy_->child_policy_map_.emplace(target_, this);
738
739
  }
739
740
 
@@ -780,15 +781,15 @@ absl::optional<Json> InsertOrUpdateChildPolicyField(const std::string& field,
780
781
  errors->AddError("child policy config is not an object");
781
782
  } else {
782
783
  Json::Object child_config = child_config_json.object();
783
- child_config[field] = Json(value);
784
- array.emplace_back(
785
- Json::Object{{child_name, std::move(child_config)}});
784
+ child_config[field] = Json::FromString(value);
785
+ array.emplace_back(Json::FromObject(
786
+ {{child_name, Json::FromObject(std::move(child_config))}}));
786
787
  }
787
788
  }
788
789
  }
789
790
  }
790
791
  if (errors->size() != original_num_errors) return absl::nullopt;
791
- return array;
792
+ return Json::FromArray(std::move(array));
792
793
  }
793
794
 
794
795
  void RlsLb::ChildPolicyWrapper::StartUpdate() {
@@ -894,6 +895,8 @@ void RlsLb::ChildPolicyWrapper::ChildPolicyHelper::UpdateState(
894
895
  {
895
896
  MutexLock lock(&wrapper_->lb_policy_->mu_);
896
897
  if (wrapper_->is_shutdown_) return;
898
+ // TODO(roth): It looks like this ignores subsequent TF updates that
899
+ // might change the status used to fail picks, which seems wrong.
897
900
  if (wrapper_->connectivity_state_ == GRPC_CHANNEL_TRANSIENT_FAILURE &&
898
901
  state != GRPC_CHANNEL_READY) {
899
902
  return;
@@ -2472,7 +2475,7 @@ void RlsLbConfig::JsonPostLoad(const Json& json, const JsonArgs&,
2472
2475
  // a child policy for a given target.
2473
2476
  for (const Json& config : child_policy_config_.array()) {
2474
2477
  if (config.object().begin()->first == (*parsed_config)->name()) {
2475
- child_policy_config_ = Json::Array{config};
2478
+ child_policy_config_ = Json::FromArray({config});
2476
2479
  break;
2477
2480
  }
2478
2481
  }
@@ -2497,7 +2500,7 @@ class RlsLbFactory : public LoadBalancingPolicyFactory {
2497
2500
 
2498
2501
  absl::StatusOr<RefCountedPtr<LoadBalancingPolicy::Config>>
2499
2502
  ParseLoadBalancingConfig(const Json& json) const override {
2500
- return LoadRefCountedFromJson<RlsLbConfig>(
2503
+ return LoadFromJson<RefCountedPtr<RlsLbConfig>>(
2501
2504
  json, JsonArgs(), "errors validing RLS LB policy config");
2502
2505
  }
2503
2506
  };
@@ -44,6 +44,7 @@
44
44
  #include "src/core/lib/gprpp/debug_location.h"
45
45
  #include "src/core/lib/gprpp/orphanable.h"
46
46
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
47
+ #include "src/core/lib/gprpp/work_serializer.h"
47
48
  #include "src/core/lib/json/json.h"
48
49
  #include "src/core/lib/load_balancing/lb_policy.h"
49
50
  #include "src/core/lib/load_balancing/lb_policy_factory.h"
@@ -153,6 +154,10 @@ class RoundRobin : public LoadBalancingPolicy {
153
154
  absl::Status status_for_tf);
154
155
 
155
156
  private:
157
+ std::shared_ptr<WorkSerializer> work_serializer() const override {
158
+ return static_cast<RoundRobin*>(policy())->work_serializer();
159
+ }
160
+
156
161
  std::string CountersString() const {
157
162
  return absl::StrCat("num_subchannels=", num_subchannels(),
158
163
  " num_ready=", num_ready_,
@@ -313,12 +318,9 @@ absl::Status RoundRobin::UpdateLocked(UpdateArgs args) {
313
318
  return status;
314
319
  }
315
320
  // Otherwise, if this is the initial update, immediately promote it to
316
- // subchannel_list_ and report CONNECTING.
321
+ // subchannel_list_.
317
322
  if (subchannel_list_.get() == nullptr) {
318
323
  subchannel_list_ = std::move(latest_pending_subchannel_list_);
319
- channel_control_helper()->UpdateState(
320
- GRPC_CHANNEL_CONNECTING, absl::Status(),
321
- MakeRefCounted<QueuePicker>(Ref(DEBUG_LOCATION, "QueuePicker")));
322
324
  }
323
325
  return absl::OkStatus();
324
326
  }
@@ -30,14 +30,18 @@
30
30
  #include "absl/status/status.h"
31
31
  #include "absl/types/optional.h"
32
32
 
33
+ #include <grpc/grpc.h>
33
34
  #include <grpc/impl/connectivity_state.h>
34
35
  #include <grpc/support/log.h>
35
36
 
37
+ #include "src/core/ext/filters/client_channel/client_channel_internal.h"
38
+ #include "src/core/ext/filters/client_channel/lb_policy/health_check_client.h"
36
39
  #include "src/core/lib/channel/channel_args.h"
37
40
  #include "src/core/lib/gprpp/debug_location.h"
38
41
  #include "src/core/lib/gprpp/dual_ref_counted.h"
39
42
  #include "src/core/lib/gprpp/manual_constructor.h"
40
43
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
44
+ #include "src/core/lib/gprpp/work_serializer.h"
41
45
  #include "src/core/lib/iomgr/iomgr_fwd.h"
42
46
  #include "src/core/lib/load_balancing/lb_policy.h"
43
47
  #include "src/core/lib/load_balancing/subchannel_interface.h"
@@ -218,11 +222,15 @@ class SubchannelList : public DualRefCounted<SubchannelListType> {
218
222
  // For accessing Ref() and Unref().
219
223
  friend class SubchannelData<SubchannelListType, SubchannelDataType>;
220
224
 
225
+ virtual std::shared_ptr<WorkSerializer> work_serializer() const = 0;
226
+
221
227
  // Backpointer to owning policy.
222
228
  LoadBalancingPolicy* policy_;
223
229
 
224
230
  const char* tracer_;
225
231
 
232
+ absl::optional<std::string> health_check_service_name_;
233
+
226
234
  // The list of subchannels.
227
235
  // We use ManualConstructor here to support SubchannelDataType classes
228
236
  // that are not copyable.
@@ -317,20 +325,27 @@ template <typename SubchannelListType, typename SubchannelDataType>
317
325
  void SubchannelData<SubchannelListType,
318
326
  SubchannelDataType>::StartConnectivityWatchLocked() {
319
327
  if (GPR_UNLIKELY(subchannel_list_->tracer() != nullptr)) {
320
- gpr_log(GPR_INFO,
321
- "[%s %p] subchannel list %p index %" PRIuPTR " of %" PRIuPTR
322
- " (subchannel %p): starting watch",
323
- subchannel_list_->tracer(), subchannel_list_->policy(),
324
- subchannel_list_, Index(), subchannel_list_->num_subchannels(),
325
- subchannel_.get());
328
+ gpr_log(
329
+ GPR_INFO,
330
+ "[%s %p] subchannel list %p index %" PRIuPTR " of %" PRIuPTR
331
+ " (subchannel %p): starting watch "
332
+ "(health_check_service_name=\"%s\")",
333
+ subchannel_list_->tracer(), subchannel_list_->policy(),
334
+ subchannel_list_, Index(), subchannel_list_->num_subchannels(),
335
+ subchannel_.get(),
336
+ subchannel_list()->health_check_service_name_.value_or("N/A").c_str());
326
337
  }
327
338
  GPR_ASSERT(pending_watcher_ == nullptr);
328
- pending_watcher_ =
329
- new Watcher(this, subchannel_list()->WeakRef(DEBUG_LOCATION, "Watcher"));
330
- subchannel_->WatchConnectivityState(
331
- // NOLINTNEXTLINE(google-readability-casting)
332
- std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>(
333
- pending_watcher_));
339
+ auto watcher = std::make_unique<Watcher>(
340
+ this, subchannel_list()->WeakRef(DEBUG_LOCATION, "Watcher"));
341
+ pending_watcher_ = watcher.get();
342
+ if (subchannel_list()->health_check_service_name_.has_value()) {
343
+ subchannel_->AddDataWatcher(MakeHealthCheckWatcher(
344
+ subchannel_list_->work_serializer(),
345
+ *subchannel_list()->health_check_service_name_, std::move(watcher)));
346
+ } else {
347
+ subchannel_->WatchConnectivityState(std::move(watcher));
348
+ }
334
349
  }
335
350
 
336
351
  template <typename SubchannelListType, typename SubchannelDataType>
@@ -345,7 +360,11 @@ void SubchannelData<SubchannelListType, SubchannelDataType>::
345
360
  subchannel_list_, Index(), subchannel_list_->num_subchannels(),
346
361
  subchannel_.get(), reason);
347
362
  }
348
- subchannel_->CancelConnectivityStateWatch(pending_watcher_);
363
+ // No need to cancel if using health checking, because the data
364
+ // watcher will be destroyed automatically when the subchannel is.
365
+ if (!subchannel_list()->health_check_service_name_.has_value()) {
366
+ subchannel_->CancelConnectivityStateWatch(pending_watcher_);
367
+ }
349
368
  pending_watcher_ = nullptr;
350
369
  }
351
370
  }
@@ -368,6 +387,10 @@ SubchannelList<SubchannelListType, SubchannelDataType>::SubchannelList(
368
387
  : DualRefCounted<SubchannelListType>(tracer),
369
388
  policy_(policy),
370
389
  tracer_(tracer) {
390
+ if (!args.GetBool(GRPC_ARG_INHIBIT_HEALTH_CHECKING).value_or(false)) {
391
+ health_check_service_name_ =
392
+ args.GetOwnedString(GRPC_ARG_HEALTH_CHECK_SERVICE_NAME);
393
+ }
371
394
  if (GPR_UNLIKELY(tracer_ != nullptr)) {
372
395
  gpr_log(GPR_INFO,
373
396
  "[%s %p] Creating subchannel list %p for %" PRIuPTR " subchannels",