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
@@ -0,0 +1,455 @@
1
+ //
2
+ // Copyright 2022 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
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include <stdint.h>
20
+ #include <string.h>
21
+
22
+ #include <map>
23
+ #include <memory>
24
+ #include <set>
25
+ #include <string>
26
+ #include <type_traits>
27
+ #include <utility>
28
+
29
+ #include "absl/status/status.h"
30
+ #include "absl/status/statusor.h"
31
+ #include "absl/strings/string_view.h"
32
+ #include "upb/base/string_view.h"
33
+ #include "upb/upb.hpp"
34
+
35
+ #include <grpc/impl/connectivity_state.h>
36
+ #include <grpc/slice.h>
37
+ #include <grpc/status.h>
38
+ #include <grpc/support/log.h>
39
+
40
+ #include "src/core/ext/filters/client_channel/client_channel_channelz.h"
41
+ #include "src/core/ext/filters/client_channel/lb_policy/health_check_client_internal.h"
42
+ #include "src/core/ext/filters/client_channel/subchannel.h"
43
+ #include "src/core/ext/filters/client_channel/subchannel_stream_client.h"
44
+ #include "src/core/lib/channel/channel_trace.h"
45
+ #include "src/core/lib/debug/trace.h"
46
+ #include "src/core/lib/gprpp/debug_location.h"
47
+ #include "src/core/lib/gprpp/orphanable.h"
48
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
49
+ #include "src/core/lib/gprpp/sync.h"
50
+ #include "src/core/lib/gprpp/work_serializer.h"
51
+ #include "src/core/lib/iomgr/closure.h"
52
+ #include "src/core/lib/iomgr/error.h"
53
+ #include "src/core/lib/iomgr/exec_ctx.h"
54
+ #include "src/core/lib/iomgr/iomgr_fwd.h"
55
+ #include "src/core/lib/iomgr/pollset_set.h"
56
+ #include "src/core/lib/load_balancing/subchannel_interface.h"
57
+ #include "src/core/lib/slice/slice.h"
58
+ #include "src/core/lib/transport/connectivity_state.h"
59
+ #include "src/proto/grpc/health/v1/health.upb.h"
60
+
61
+ namespace grpc_core {
62
+
63
+ TraceFlag grpc_health_check_client_trace(false, "health_check_client");
64
+
65
+ namespace {
66
+
67
+ // A fire-and-forget class to asynchronously drain a WorkSerializer queue.
68
+ class AsyncWorkSerializerDrainer {
69
+ public:
70
+ explicit AsyncWorkSerializerDrainer(
71
+ std::shared_ptr<WorkSerializer> work_serializer)
72
+ : work_serializer_(std::move(work_serializer)) {
73
+ GRPC_CLOSURE_INIT(&closure_, RunInExecCtx, this, nullptr);
74
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, absl::OkStatus());
75
+ }
76
+
77
+ private:
78
+ static void RunInExecCtx(void* arg, grpc_error_handle) {
79
+ auto* self = static_cast<AsyncWorkSerializerDrainer*>(arg);
80
+ self->work_serializer_->DrainQueue();
81
+ delete self;
82
+ }
83
+
84
+ std::shared_ptr<WorkSerializer> work_serializer_;
85
+ grpc_closure closure_;
86
+ };
87
+
88
+ } // namespace
89
+
90
+ //
91
+ // HealthProducer::HealthChecker
92
+ //
93
+
94
+ HealthProducer::HealthChecker::HealthChecker(
95
+ WeakRefCountedPtr<HealthProducer> producer,
96
+ absl::string_view health_check_service_name)
97
+ : producer_(std::move(producer)),
98
+ health_check_service_name_(health_check_service_name),
99
+ state_(producer_->state_ == GRPC_CHANNEL_READY ? GRPC_CHANNEL_CONNECTING
100
+ : producer_->state_),
101
+ status_(producer_->status_) {
102
+ // If the subchannel is already connected, start health checking.
103
+ if (producer_->state_ == GRPC_CHANNEL_READY) StartHealthStreamLocked();
104
+ }
105
+
106
+ void HealthProducer::HealthChecker::Orphan() {
107
+ stream_client_.reset();
108
+ Unref();
109
+ }
110
+
111
+ void HealthProducer::HealthChecker::AddWatcherLocked(HealthWatcher* watcher) {
112
+ watchers_.insert(watcher);
113
+ watcher->Notify(state_, status_);
114
+ }
115
+
116
+ bool HealthProducer::HealthChecker::RemoveWatcherLocked(
117
+ HealthWatcher* watcher) {
118
+ watchers_.erase(watcher);
119
+ return watchers_.empty();
120
+ }
121
+
122
+ void HealthProducer::HealthChecker::OnConnectivityStateChangeLocked(
123
+ grpc_connectivity_state state, const absl::Status& status) {
124
+ if (state == GRPC_CHANNEL_READY) {
125
+ // We should already be in CONNECTING, and we don't want to change
126
+ // that until we see the initial response on the stream.
127
+ GPR_ASSERT(state_ == GRPC_CHANNEL_CONNECTING);
128
+ // Start the health watch stream.
129
+ StartHealthStreamLocked();
130
+ } else {
131
+ state_ = state;
132
+ status_ = status;
133
+ NotifyWatchersLocked(state_, status_);
134
+ // We're not connected, so stop health checking.
135
+ stream_client_.reset();
136
+ }
137
+ }
138
+
139
+ void HealthProducer::HealthChecker::StartHealthStreamLocked() {
140
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
141
+ gpr_log(GPR_INFO,
142
+ "HealthProducer %p HealthChecker %p: "
143
+ "creating HealthClient for \"%s\"",
144
+ producer_.get(), this,
145
+ std::string(health_check_service_name_).c_str());
146
+ }
147
+ stream_client_ = MakeOrphanable<SubchannelStreamClient>(
148
+ producer_->connected_subchannel_, producer_->subchannel_->pollset_set(),
149
+ std::make_unique<HealthStreamEventHandler>(Ref()),
150
+ GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace) ? "HealthClient"
151
+ : nullptr);
152
+ }
153
+
154
+ void HealthProducer::HealthChecker::NotifyWatchersLocked(
155
+ grpc_connectivity_state state, absl::Status status) {
156
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
157
+ gpr_log(
158
+ GPR_INFO,
159
+ "HealthProducer %p HealthChecker %p: reporting state %s to watchers",
160
+ producer_.get(), this, ConnectivityStateName(state));
161
+ }
162
+ work_serializer_->Schedule(
163
+ [self = Ref(), state, status = std::move(status)]() {
164
+ MutexLock lock(&self->producer_->mu_);
165
+ for (HealthWatcher* watcher : self->watchers_) {
166
+ watcher->Notify(state, status);
167
+ }
168
+ },
169
+ DEBUG_LOCATION);
170
+ new AsyncWorkSerializerDrainer(work_serializer_);
171
+ }
172
+
173
+ void HealthProducer::HealthChecker::OnHealthWatchStatusChange(
174
+ grpc_connectivity_state state, const absl::Status& status) {
175
+ if (state == GRPC_CHANNEL_SHUTDOWN) return;
176
+ work_serializer_->Schedule(
177
+ [self = Ref(), state, status]() {
178
+ MutexLock lock(&self->producer_->mu_);
179
+ if (self->stream_client_ != nullptr) {
180
+ self->state_ = state;
181
+ self->status_ = status;
182
+ for (HealthWatcher* watcher : self->watchers_) {
183
+ watcher->Notify(state, self->status_);
184
+ }
185
+ }
186
+ },
187
+ DEBUG_LOCATION);
188
+ new AsyncWorkSerializerDrainer(work_serializer_);
189
+ }
190
+
191
+ //
192
+ // HealthProducer::HealthChecker::HealthStreamEventHandler
193
+ //
194
+
195
+ class HealthProducer::HealthChecker::HealthStreamEventHandler
196
+ : public SubchannelStreamClient::CallEventHandler {
197
+ public:
198
+ explicit HealthStreamEventHandler(RefCountedPtr<HealthChecker> health_checker)
199
+ : health_checker_(std::move(health_checker)) {}
200
+
201
+ Slice GetPathLocked() override {
202
+ return Slice::FromStaticString("/grpc.health.v1.Health/Watch");
203
+ }
204
+
205
+ void OnCallStartLocked(SubchannelStreamClient* client) override {
206
+ SetHealthStatusLocked(client, GRPC_CHANNEL_CONNECTING,
207
+ "starting health watch");
208
+ }
209
+
210
+ void OnRetryTimerStartLocked(SubchannelStreamClient* client) override {
211
+ SetHealthStatusLocked(client, GRPC_CHANNEL_TRANSIENT_FAILURE,
212
+ "health check call failed; will retry after backoff");
213
+ }
214
+
215
+ grpc_slice EncodeSendMessageLocked() override {
216
+ upb::Arena arena;
217
+ grpc_health_v1_HealthCheckRequest* request_struct =
218
+ grpc_health_v1_HealthCheckRequest_new(arena.ptr());
219
+ grpc_health_v1_HealthCheckRequest_set_service(
220
+ request_struct,
221
+ upb_StringView_FromDataAndSize(
222
+ health_checker_->health_check_service_name_.data(),
223
+ health_checker_->health_check_service_name_.size()));
224
+ size_t buf_length;
225
+ char* buf = grpc_health_v1_HealthCheckRequest_serialize(
226
+ request_struct, arena.ptr(), &buf_length);
227
+ grpc_slice request_slice = GRPC_SLICE_MALLOC(buf_length);
228
+ memcpy(GRPC_SLICE_START_PTR(request_slice), buf, buf_length);
229
+ return request_slice;
230
+ }
231
+
232
+ absl::Status RecvMessageReadyLocked(
233
+ SubchannelStreamClient* client,
234
+ absl::string_view serialized_message) override {
235
+ auto healthy = DecodeResponse(serialized_message);
236
+ if (!healthy.ok()) {
237
+ SetHealthStatusLocked(client, GRPC_CHANNEL_TRANSIENT_FAILURE,
238
+ healthy.status().ToString().c_str());
239
+ return healthy.status();
240
+ }
241
+ if (!*healthy) {
242
+ SetHealthStatusLocked(client, GRPC_CHANNEL_TRANSIENT_FAILURE,
243
+ "backend unhealthy");
244
+ } else {
245
+ SetHealthStatusLocked(client, GRPC_CHANNEL_READY, "OK");
246
+ }
247
+ return absl::OkStatus();
248
+ }
249
+
250
+ void RecvTrailingMetadataReadyLocked(SubchannelStreamClient* client,
251
+ grpc_status_code status) override {
252
+ if (status == GRPC_STATUS_UNIMPLEMENTED) {
253
+ static const char kErrorMessage[] =
254
+ "health checking Watch method returned UNIMPLEMENTED; "
255
+ "disabling health checks but assuming server is healthy";
256
+ gpr_log(GPR_ERROR, kErrorMessage);
257
+ auto* channelz_node =
258
+ health_checker_->producer_->subchannel_->channelz_node();
259
+ if (channelz_node != nullptr) {
260
+ channelz_node->AddTraceEvent(
261
+ channelz::ChannelTrace::Error,
262
+ grpc_slice_from_static_string(kErrorMessage));
263
+ }
264
+ SetHealthStatusLocked(client, GRPC_CHANNEL_READY, kErrorMessage);
265
+ }
266
+ }
267
+
268
+ private:
269
+ // Returns true if healthy.
270
+ static absl::StatusOr<bool> DecodeResponse(
271
+ absl::string_view serialized_message) {
272
+ // Deserialize message.
273
+ upb::Arena arena;
274
+ auto* response = grpc_health_v1_HealthCheckResponse_parse(
275
+ serialized_message.data(), serialized_message.size(), arena.ptr());
276
+ if (response == nullptr) {
277
+ // Can't parse message; assume unhealthy.
278
+ return absl::InvalidArgumentError("cannot parse health check response");
279
+ }
280
+ int32_t status = grpc_health_v1_HealthCheckResponse_status(response);
281
+ return status == grpc_health_v1_HealthCheckResponse_SERVING;
282
+ }
283
+
284
+ void SetHealthStatusLocked(SubchannelStreamClient* client,
285
+ grpc_connectivity_state state,
286
+ const char* reason) {
287
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
288
+ gpr_log(GPR_INFO, "HealthCheckClient %p: setting state=%s reason=%s",
289
+ client, ConnectivityStateName(state), reason);
290
+ }
291
+ health_checker_->OnHealthWatchStatusChange(
292
+ state, state == GRPC_CHANNEL_TRANSIENT_FAILURE
293
+ ? absl::UnavailableError(reason)
294
+ : absl::OkStatus());
295
+ }
296
+
297
+ RefCountedPtr<HealthChecker> health_checker_;
298
+ };
299
+
300
+ //
301
+ // HealthProducer::ConnectivityWatcher
302
+ //
303
+
304
+ class HealthProducer::ConnectivityWatcher
305
+ : public Subchannel::ConnectivityStateWatcherInterface {
306
+ public:
307
+ explicit ConnectivityWatcher(WeakRefCountedPtr<HealthProducer> producer)
308
+ : producer_(std::move(producer)) {}
309
+
310
+ void OnConnectivityStateChange(grpc_connectivity_state state,
311
+ const absl::Status& status) override {
312
+ producer_->OnConnectivityStateChange(state, status);
313
+ }
314
+
315
+ grpc_pollset_set* interested_parties() override {
316
+ return producer_->interested_parties_;
317
+ }
318
+
319
+ private:
320
+ WeakRefCountedPtr<HealthProducer> producer_;
321
+ };
322
+
323
+ //
324
+ // HealthProducer
325
+ //
326
+
327
+ void HealthProducer::Start(RefCountedPtr<Subchannel> subchannel) {
328
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
329
+ gpr_log(GPR_INFO, "HealthProducer %p: starting with subchannel %p", this,
330
+ subchannel.get());
331
+ }
332
+ subchannel_ = std::move(subchannel);
333
+ {
334
+ MutexLock lock(&mu_);
335
+ connected_subchannel_ = subchannel_->connected_subchannel();
336
+ }
337
+ auto connectivity_watcher = MakeRefCounted<ConnectivityWatcher>(WeakRef());
338
+ connectivity_watcher_ = connectivity_watcher.get();
339
+ subchannel_->WatchConnectivityState(std::move(connectivity_watcher));
340
+ }
341
+
342
+ void HealthProducer::Orphan() {
343
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
344
+ gpr_log(GPR_INFO, "HealthProducer %p: shutting down", this);
345
+ }
346
+ {
347
+ MutexLock lock(&mu_);
348
+ health_checkers_.clear();
349
+ }
350
+ subchannel_->CancelConnectivityStateWatch(connectivity_watcher_);
351
+ subchannel_->RemoveDataProducer(this);
352
+ }
353
+
354
+ void HealthProducer::AddWatcher(HealthWatcher* watcher,
355
+ const std::string& health_check_service_name) {
356
+ MutexLock lock(&mu_);
357
+ grpc_pollset_set_add_pollset_set(interested_parties_,
358
+ watcher->interested_parties());
359
+ auto it = health_checkers_.emplace(health_check_service_name, nullptr).first;
360
+ auto& health_checker = it->second;
361
+ if (health_checker == nullptr) {
362
+ health_checker = MakeOrphanable<HealthChecker>(WeakRef(), it->first);
363
+ }
364
+ health_checker->AddWatcherLocked(watcher);
365
+ }
366
+
367
+ void HealthProducer::RemoveWatcher(
368
+ HealthWatcher* watcher, const std::string& health_check_service_name) {
369
+ MutexLock lock(&mu_);
370
+ grpc_pollset_set_del_pollset_set(interested_parties_,
371
+ watcher->interested_parties());
372
+ auto it = health_checkers_.find(health_check_service_name);
373
+ if (it == health_checkers_.end()) return;
374
+ const bool empty = it->second->RemoveWatcherLocked(watcher);
375
+ if (empty) health_checkers_.erase(it);
376
+ }
377
+
378
+ void HealthProducer::OnConnectivityStateChange(grpc_connectivity_state state,
379
+ const absl::Status& status) {
380
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
381
+ gpr_log(GPR_INFO,
382
+ "HealthProducer %p: subchannel state update: state=%s status=%s",
383
+ this, ConnectivityStateName(state), status.ToString().c_str());
384
+ }
385
+ MutexLock lock(&mu_);
386
+ state_ = state;
387
+ status_ = status;
388
+ if (state == GRPC_CHANNEL_READY) {
389
+ connected_subchannel_ = subchannel_->connected_subchannel();
390
+ } else {
391
+ connected_subchannel_.reset();
392
+ }
393
+ for (const auto& p : health_checkers_) {
394
+ p.second->OnConnectivityStateChangeLocked(state, status);
395
+ }
396
+ }
397
+
398
+ //
399
+ // HealthWatcher
400
+ //
401
+
402
+ HealthWatcher::~HealthWatcher() {
403
+ if (producer_ != nullptr) {
404
+ producer_->RemoveWatcher(this, health_check_service_name_);
405
+ }
406
+ }
407
+
408
+ void HealthWatcher::SetSubchannel(Subchannel* subchannel) {
409
+ bool created = false;
410
+ // Check if our producer is already registered with the subchannel.
411
+ // If not, create a new one.
412
+ subchannel->GetOrAddDataProducer(
413
+ HealthProducer::Type(),
414
+ [&](Subchannel::DataProducerInterface** producer) {
415
+ if (*producer != nullptr) producer_ = (*producer)->RefIfNonZero();
416
+ if (producer_ == nullptr) {
417
+ producer_ = MakeRefCounted<HealthProducer>();
418
+ *producer = producer_.get();
419
+ created = true;
420
+ }
421
+ });
422
+ // If we just created the producer, start it.
423
+ // This needs to be done outside of the lambda passed to
424
+ // GetOrAddDataProducer() to avoid deadlocking by re-acquiring the
425
+ // subchannel lock while already holding it.
426
+ if (created) producer_->Start(subchannel->Ref());
427
+ // Register ourself with the producer.
428
+ producer_->AddWatcher(this, health_check_service_name_);
429
+ }
430
+
431
+ void HealthWatcher::Notify(grpc_connectivity_state state, absl::Status status) {
432
+ work_serializer_->Schedule(
433
+ [watcher = watcher_, state, status = std::move(status)]() mutable {
434
+ watcher->OnConnectivityStateChange(state, std::move(status));
435
+ },
436
+ DEBUG_LOCATION);
437
+ new AsyncWorkSerializerDrainer(work_serializer_);
438
+ }
439
+
440
+ //
441
+ // External API
442
+ //
443
+
444
+ std::unique_ptr<SubchannelInterface::DataWatcherInterface>
445
+ MakeHealthCheckWatcher(
446
+ std::shared_ptr<WorkSerializer> work_serializer,
447
+ absl::string_view health_check_service_name,
448
+ std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
449
+ watcher) {
450
+ return std::make_unique<HealthWatcher>(std::move(work_serializer),
451
+ health_check_service_name,
452
+ std::move(watcher));
453
+ }
454
+
455
+ } // namespace grpc_core
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright 2022 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_HEALTH_CHECK_CLIENT_H
18
+ #define GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_HEALTH_CHECK_CLIENT_H
19
+
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include <memory>
23
+
24
+ #include "absl/strings/string_view.h"
25
+
26
+ #include "src/core/lib/gprpp/work_serializer.h"
27
+ #include "src/core/lib/load_balancing/subchannel_interface.h"
28
+
29
+ namespace grpc_core {
30
+
31
+ // Interface for LB policies to access health check data from a subchannel.
32
+ // The data is reported from via a Health.Watch stream established on the
33
+ // subchannel whenever an LB policy registers a watcher.
34
+ //
35
+ // To use this, an LB policy will implement its own subclass of
36
+ // SubchannelInterface::ConnectivityStateWatcherInterface, which will
37
+ // receive connectivity state updates with health check status taken
38
+ // into account. It will then register that watcher with the subchannel
39
+ // like this:
40
+ // subchannel->AddDataWatcher(
41
+ // MakeHealthCheckWatcher(
42
+ // work_serializer(), health_check_service_name,
43
+ // std::make_unique<MyConnectivityStateWatcherSubclass>(...)));
44
+
45
+ std::unique_ptr<SubchannelInterface::DataWatcherInterface>
46
+ MakeHealthCheckWatcher(
47
+ std::shared_ptr<WorkSerializer> work_serializer,
48
+ absl::string_view health_check_service_name,
49
+ std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
50
+ watcher);
51
+
52
+ } // namespace grpc_core
53
+
54
+ #endif // GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_HEALTH_CHECK_CLIENT_H
@@ -0,0 +1,186 @@
1
+ //
2
+ // Copyright 2022 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_HEALTH_CHECK_CLIENT_INTERNAL_H
18
+ #define GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_HEALTH_CHECK_CLIENT_INTERNAL_H
19
+
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include <map>
23
+ #include <memory>
24
+ #include <set>
25
+ #include <string>
26
+ #include <utility>
27
+
28
+ #include "absl/base/thread_annotations.h"
29
+ #include "absl/status/status.h"
30
+ #include "absl/strings/string_view.h"
31
+
32
+ #include <grpc/impl/connectivity_state.h>
33
+
34
+ #include "src/core/ext/filters/client_channel/subchannel.h"
35
+ #include "src/core/ext/filters/client_channel/subchannel_interface_internal.h"
36
+ #include "src/core/ext/filters/client_channel/subchannel_stream_client.h"
37
+ #include "src/core/lib/gprpp/orphanable.h"
38
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
39
+ #include "src/core/lib/gprpp/sync.h"
40
+ #include "src/core/lib/gprpp/unique_type_name.h"
41
+ #include "src/core/lib/gprpp/work_serializer.h"
42
+ #include "src/core/lib/iomgr/iomgr_fwd.h"
43
+ #include "src/core/lib/iomgr/pollset_set.h"
44
+ #include "src/core/lib/load_balancing/subchannel_interface.h"
45
+
46
+ namespace grpc_core {
47
+
48
+ class HealthWatcher;
49
+
50
+ // This producer is registered with a subchannel. It creates a streaming
51
+ // health watch call for each health check service name that is being
52
+ // watched and reports the resulting connectivity state to all
53
+ // registered watchers.
54
+ class HealthProducer : public Subchannel::DataProducerInterface {
55
+ public:
56
+ HealthProducer() : interested_parties_(grpc_pollset_set_create()) {}
57
+ ~HealthProducer() override { grpc_pollset_set_destroy(interested_parties_); }
58
+
59
+ void Start(RefCountedPtr<Subchannel> subchannel);
60
+
61
+ void Orphan() override;
62
+
63
+ static UniqueTypeName Type() {
64
+ static UniqueTypeName::Factory kFactory("health_check");
65
+ return kFactory.Create();
66
+ }
67
+
68
+ UniqueTypeName type() const override { return Type(); }
69
+
70
+ 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);
74
+
75
+ private:
76
+ class ConnectivityWatcher;
77
+
78
+ // Health checker for a given health check service name. Contains the
79
+ // health check client and the list of watchers.
80
+ class HealthChecker : public InternallyRefCounted<HealthChecker> {
81
+ public:
82
+ HealthChecker(WeakRefCountedPtr<HealthProducer> producer,
83
+ absl::string_view health_check_service_name);
84
+
85
+ // Disable thread-safety analysis because this method is called via
86
+ // OrphanablePtr<>, but there's no way to pass the lock annotation
87
+ // through there.
88
+ void Orphan() override ABSL_NO_THREAD_SAFETY_ANALYSIS;
89
+
90
+ void AddWatcherLocked(HealthWatcher* watcher)
91
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&HealthProducer::mu_);
92
+
93
+ // Returns true if this was the last watcher.
94
+ bool RemoveWatcherLocked(HealthWatcher* watcher)
95
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&HealthProducer::mu_);
96
+
97
+ // Called when the subchannel's connectivity state changes.
98
+ void OnConnectivityStateChangeLocked(grpc_connectivity_state state,
99
+ const absl::Status& status)
100
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&HealthProducer::mu_);
101
+
102
+ private:
103
+ class HealthStreamEventHandler;
104
+
105
+ // Starts a new stream if we have a connected subchannel.
106
+ // Called whenever the subchannel transitions to state READY or when a
107
+ // watcher is added.
108
+ void StartHealthStreamLocked()
109
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&HealthProducer::mu_);
110
+
111
+ // Notifies watchers of a new state.
112
+ // Called while holding the SubchannelStreamClient lock and possibly
113
+ // the producer lock, so must notify asynchronously, but in guaranteed
114
+ // order (hence the use of WorkSerializer).
115
+ void NotifyWatchersLocked(grpc_connectivity_state state,
116
+ absl::Status status)
117
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&HealthProducer::mu_);
118
+
119
+ // Called by the health check client when receiving an update.
120
+ void OnHealthWatchStatusChange(grpc_connectivity_state state,
121
+ const absl::Status& status);
122
+
123
+ WeakRefCountedPtr<HealthProducer> producer_;
124
+ absl::string_view health_check_service_name_;
125
+ std::shared_ptr<WorkSerializer> work_serializer_ =
126
+ std::make_shared<WorkSerializer>();
127
+
128
+ grpc_connectivity_state state_ ABSL_GUARDED_BY(&HealthProducer::mu_);
129
+ absl::Status status_ ABSL_GUARDED_BY(&HealthProducer::mu_);
130
+ OrphanablePtr<SubchannelStreamClient> stream_client_
131
+ ABSL_GUARDED_BY(&HealthProducer::mu_);
132
+ std::set<HealthWatcher*> watchers_ ABSL_GUARDED_BY(&HealthProducer::mu_);
133
+ };
134
+
135
+ // Handles a connectivity state change on the subchannel.
136
+ void OnConnectivityStateChange(grpc_connectivity_state state,
137
+ const absl::Status& status);
138
+
139
+ RefCountedPtr<Subchannel> subchannel_;
140
+ ConnectivityWatcher* connectivity_watcher_;
141
+ grpc_pollset_set* interested_parties_;
142
+
143
+ Mutex mu_;
144
+ grpc_connectivity_state state_ ABSL_GUARDED_BY(&mu_);
145
+ absl::Status status_ ABSL_GUARDED_BY(&mu_);
146
+ RefCountedPtr<ConnectedSubchannel> connected_subchannel_
147
+ ABSL_GUARDED_BY(&mu_);
148
+ std::map<std::string /*health_check_service_name*/,
149
+ OrphanablePtr<HealthChecker>>
150
+ health_checkers_ ABSL_GUARDED_BY(&mu_);
151
+ };
152
+
153
+ // A data watcher that handles health checking.
154
+ class HealthWatcher : public InternalSubchannelDataWatcherInterface {
155
+ public:
156
+ HealthWatcher(
157
+ std::shared_ptr<WorkSerializer> work_serializer,
158
+ absl::string_view health_check_service_name,
159
+ std::unique_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
160
+ watcher)
161
+ : work_serializer_(std::move(work_serializer)),
162
+ health_check_service_name_(health_check_service_name),
163
+ watcher_(std::move(watcher)) {}
164
+ ~HealthWatcher() override;
165
+
166
+ // When the client channel sees this wrapper, it will pass it the real
167
+ // subchannel to use.
168
+ void SetSubchannel(Subchannel* subchannel) override;
169
+
170
+ void Notify(grpc_connectivity_state state, absl::Status status);
171
+
172
+ grpc_pollset_set* interested_parties() const {
173
+ return watcher_->interested_parties();
174
+ }
175
+
176
+ private:
177
+ std::shared_ptr<WorkSerializer> work_serializer_;
178
+ std::string health_check_service_name_;
179
+ std::shared_ptr<SubchannelInterface::ConnectivityStateWatcherInterface>
180
+ watcher_;
181
+ RefCountedPtr<HealthProducer> producer_;
182
+ };
183
+
184
+ } // namespace grpc_core
185
+
186
+ #endif // GRPC_SRC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_HEALTH_CHECK_CLIENT_INTERNAL_H