grpc 1.55.3 → 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 (385) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +100 -70
  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 +82 -98
  11. data/src/core/ext/filters/client_channel/client_channel.h +4 -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/hpack_parser.cc +543 -567
  56. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +9 -150
  57. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +32 -46
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +5 -18
  59. data/src/core/ext/transport/chttp2/transport/internal.h +1 -15
  60. data/src/core/ext/transport/chttp2/transport/parsing.cc +12 -12
  61. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +11 -2
  62. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +15 -0
  63. data/src/core/ext/xds/certificate_provider_store.cc +4 -9
  64. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  65. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +30 -42
  66. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +14 -9
  67. data/src/core/ext/xds/xds_api.cc +9 -6
  68. data/src/core/ext/xds/xds_api.h +3 -2
  69. data/src/core/ext/xds/xds_audit_logger_registry.cc +122 -0
  70. data/src/core/ext/xds/xds_audit_logger_registry.h +68 -0
  71. data/src/core/ext/xds/xds_bootstrap_grpc.cc +21 -9
  72. data/src/core/ext/xds/xds_bootstrap_grpc.h +5 -0
  73. data/src/core/ext/xds/xds_client.cc +5 -4
  74. data/src/core/ext/xds/xds_client_stats.h +1 -1
  75. data/src/core/ext/xds/xds_cluster.cc +20 -19
  76. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +11 -8
  77. data/src/core/ext/xds/xds_common_types.cc +3 -1
  78. data/src/core/ext/xds/xds_http_fault_filter.cc +16 -13
  79. data/src/core/ext/xds/xds_http_fault_filter.h +2 -1
  80. data/src/core/ext/xds/xds_http_filters.h +4 -2
  81. data/src/core/ext/xds/xds_http_rbac_filter.cc +154 -67
  82. data/src/core/ext/xds/xds_http_rbac_filter.h +2 -1
  83. data/src/core/ext/xds/xds_http_stateful_session_filter.cc +15 -11
  84. data/src/core/ext/xds/xds_http_stateful_session_filter.h +2 -1
  85. data/src/core/ext/xds/xds_lb_policy_registry.cc +22 -16
  86. data/src/core/ext/xds/xds_listener.cc +1 -0
  87. data/src/core/ext/xds/xds_route_config.cc +40 -3
  88. data/src/core/ext/xds/xds_routing.cc +2 -2
  89. data/src/core/ext/xds/xds_transport_grpc.cc +3 -1
  90. data/src/core/lib/avl/avl.h +5 -0
  91. data/src/core/lib/backoff/random_early_detection.h +0 -5
  92. data/src/core/lib/channel/channel_args.cc +80 -22
  93. data/src/core/lib/channel/channel_args.h +34 -1
  94. data/src/core/lib/channel/channel_trace.cc +16 -12
  95. data/src/core/lib/channel/channelz.cc +159 -132
  96. data/src/core/lib/channel/channelz.h +42 -35
  97. data/src/core/lib/channel/channelz_registry.cc +23 -20
  98. data/src/core/lib/channel/connected_channel.cc +17 -6
  99. data/src/core/lib/channel/promise_based_filter.cc +0 -4
  100. data/src/core/lib/channel/promise_based_filter.h +2 -0
  101. data/src/core/lib/compression/compression_internal.cc +2 -5
  102. data/src/core/lib/config/config_vars.cc +20 -18
  103. data/src/core/lib/config/config_vars.h +4 -4
  104. data/src/core/lib/config/load_config.cc +13 -0
  105. data/src/core/lib/config/load_config.h +6 -0
  106. data/src/core/lib/debug/event_log.h +1 -1
  107. data/src/core/lib/debug/stats_data.h +1 -1
  108. data/src/core/lib/debug/trace.cc +24 -55
  109. data/src/core/lib/debug/trace.h +3 -1
  110. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +211 -0
  111. data/src/core/lib/event_engine/cf_engine/cf_engine.h +86 -0
  112. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +354 -0
  113. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +146 -0
  114. data/src/core/lib/event_engine/cf_engine/cftype_unique_ref.h +79 -0
  115. data/src/core/lib/event_engine/default_event_engine.cc +13 -1
  116. data/src/core/lib/event_engine/default_event_engine_factory.cc +14 -2
  117. data/src/core/lib/event_engine/poller.h +2 -2
  118. data/src/core/lib/event_engine/posix.h +4 -0
  119. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +1 -1
  120. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +7 -18
  121. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -0
  122. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +3 -2
  123. data/src/core/lib/event_engine/posix_engine/posix_engine.h +1 -2
  124. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -33
  125. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +7 -11
  126. data/src/core/lib/event_engine/posix_engine/timer_manager.h +1 -1
  127. data/src/core/lib/event_engine/shim.cc +7 -1
  128. data/src/core/lib/event_engine/{thread_pool.cc → thread_pool/original_thread_pool.cc} +28 -25
  129. data/src/core/lib/event_engine/{thread_pool.h → thread_pool/original_thread_pool.h} +11 -15
  130. data/src/core/lib/event_engine/thread_pool/thread_pool.h +50 -0
  131. data/src/core/lib/event_engine/{executor/executor.h → thread_pool/thread_pool_factory.cc} +17 -15
  132. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +489 -0
  133. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +249 -0
  134. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +166 -0
  135. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +108 -0
  136. data/src/core/lib/event_engine/windows/iocp.cc +4 -3
  137. data/src/core/lib/event_engine/windows/iocp.h +3 -3
  138. data/src/core/lib/event_engine/windows/win_socket.cc +6 -6
  139. data/src/core/lib/event_engine/windows/win_socket.h +4 -4
  140. data/src/core/lib/event_engine/windows/windows_endpoint.cc +11 -10
  141. data/src/core/lib/event_engine/windows/windows_endpoint.h +3 -2
  142. data/src/core/lib/event_engine/windows/windows_engine.cc +19 -17
  143. data/src/core/lib/event_engine/windows/windows_engine.h +6 -6
  144. data/src/core/lib/event_engine/windows/windows_listener.cc +3 -3
  145. data/src/core/lib/event_engine/windows/windows_listener.h +3 -2
  146. data/src/core/lib/event_engine/work_queue/basic_work_queue.cc +63 -0
  147. data/src/core/lib/event_engine/work_queue/basic_work_queue.h +71 -0
  148. data/src/core/lib/event_engine/work_queue/work_queue.h +62 -0
  149. data/src/core/lib/experiments/config.cc +38 -7
  150. data/src/core/lib/experiments/config.h +16 -0
  151. data/src/core/lib/experiments/experiments.cc +67 -20
  152. data/src/core/lib/experiments/experiments.h +27 -21
  153. data/src/core/lib/gpr/log_internal.h +55 -0
  154. data/src/core/lib/gprpp/crash.cc +10 -0
  155. data/src/core/lib/gprpp/crash.h +3 -0
  156. data/src/core/lib/gprpp/per_cpu.cc +33 -0
  157. data/src/core/lib/gprpp/per_cpu.h +29 -6
  158. data/src/core/lib/gprpp/time.cc +1 -0
  159. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  160. data/src/core/lib/iomgr/endpoint_cfstream.cc +10 -8
  161. data/src/core/lib/iomgr/ev_apple.cc +12 -12
  162. data/src/core/lib/iomgr/ev_epoll1_linux.cc +10 -3
  163. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +15 -1
  164. data/src/core/lib/iomgr/iocp_windows.cc +24 -3
  165. data/src/core/lib/iomgr/iocp_windows.h +11 -0
  166. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -1
  167. data/src/core/lib/iomgr/socket_utils_common_posix.cc +4 -2
  168. data/src/core/lib/iomgr/socket_windows.cc +61 -7
  169. data/src/core/lib/iomgr/socket_windows.h +9 -2
  170. data/src/core/lib/iomgr/tcp_client_cfstream.cc +14 -3
  171. data/src/core/lib/iomgr/tcp_server_posix.cc +156 -140
  172. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -13
  173. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +0 -21
  174. data/src/core/lib/iomgr/tcp_server_windows.cc +1 -1
  175. data/src/core/lib/json/json.h +2 -166
  176. data/src/core/lib/json/json_object_loader.cc +8 -9
  177. data/src/core/lib/json/json_object_loader.h +25 -18
  178. data/src/core/lib/json/json_reader.cc +13 -6
  179. data/src/core/lib/json/json_util.cc +6 -11
  180. data/src/core/lib/json/json_writer.cc +7 -8
  181. data/src/core/lib/load_balancing/lb_policy.h +13 -0
  182. data/src/core/lib/load_balancing/lb_policy_registry.cc +2 -1
  183. data/src/core/lib/matchers/matchers.cc +3 -4
  184. data/src/core/lib/matchers/matchers.h +2 -1
  185. data/src/core/lib/promise/activity.cc +5 -0
  186. data/src/core/lib/promise/activity.h +10 -0
  187. data/src/core/lib/promise/detail/promise_factory.h +1 -1
  188. data/src/core/lib/promise/party.cc +31 -13
  189. data/src/core/lib/promise/party.h +11 -2
  190. data/src/core/lib/promise/pipe.h +9 -2
  191. data/src/core/lib/promise/prioritized_race.h +95 -0
  192. data/src/core/lib/promise/sleep.cc +2 -1
  193. data/src/core/lib/resolver/server_address.cc +0 -8
  194. data/src/core/lib/resolver/server_address.h +0 -6
  195. data/src/core/lib/resource_quota/memory_quota.cc +7 -7
  196. data/src/core/lib/resource_quota/memory_quota.h +1 -2
  197. data/src/core/lib/security/authorization/audit_logging.cc +98 -0
  198. data/src/core/lib/security/authorization/audit_logging.h +73 -0
  199. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +47 -2
  200. data/src/core/lib/security/authorization/grpc_authorization_engine.h +18 -1
  201. data/src/core/lib/security/authorization/rbac_policy.cc +36 -4
  202. data/src/core/lib/security/authorization/rbac_policy.h +19 -2
  203. data/src/core/lib/security/authorization/stdout_logger.cc +75 -0
  204. data/src/core/lib/security/authorization/stdout_logger.h +61 -0
  205. data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +8 -4
  206. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +8 -18
  207. data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +14 -8
  208. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +19 -12
  209. data/src/core/lib/security/credentials/external/external_account_credentials.cc +4 -2
  210. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +1 -0
  211. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +1 -0
  212. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -0
  213. data/src/core/lib/security/credentials/jwt/json_token.cc +15 -14
  214. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +4 -2
  215. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +1 -0
  216. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +1 -0
  217. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -5
  218. data/src/core/lib/security/util/json_util.cc +1 -0
  219. data/src/core/lib/service_config/service_config_call_data.h +49 -20
  220. data/src/core/lib/service_config/service_config_impl.cc +2 -1
  221. data/src/core/lib/surface/call.cc +38 -23
  222. data/src/core/lib/surface/completion_queue.cc +6 -2
  223. data/src/core/lib/surface/validate_metadata.cc +22 -37
  224. data/src/core/lib/surface/validate_metadata.h +3 -13
  225. data/src/core/lib/surface/version.cc +2 -2
  226. data/src/core/lib/transport/batch_builder.cc +15 -12
  227. data/src/core/lib/transport/batch_builder.h +39 -35
  228. data/src/core/plugin_registry/grpc_plugin_registry.cc +0 -2
  229. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  230. data/src/ruby/ext/grpc/extconf.rb +8 -9
  231. data/src/ruby/lib/grpc/version.rb +1 -1
  232. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +9 -8
  233. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +1 -1
  234. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +3 -3
  235. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +10 -6
  236. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +7 -4
  237. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +6 -4
  238. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +2 -1
  239. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +5 -9
  240. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +4 -2
  241. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +31 -22
  242. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +29 -26
  243. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +8 -0
  244. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +189 -13
  245. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_openbsd.c +62 -0
  246. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_openbsd.c +31 -0
  247. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +6 -4
  248. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h +795 -795
  249. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +1 -5
  250. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +4 -0
  251. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +18 -6
  252. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +15 -7
  253. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +1 -1
  254. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c +1 -1
  255. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  256. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +3 -0
  257. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +24 -24
  258. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +1 -1
  259. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +7 -7
  260. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +74 -74
  261. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +1 -2
  262. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +11 -11
  263. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz.c +12 -12
  264. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +14 -15
  265. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +1 -1
  266. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +10 -10
  267. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +23 -23
  268. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +13 -13
  269. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +1 -1
  270. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +2 -2
  271. data/third_party/boringssl-with-bazel/src/crypto/{hkdf → fipsmodule/hkdf}/hkdf.c +1 -1
  272. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +2 -10
  273. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +1 -4
  274. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +115 -133
  275. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +12 -14
  276. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +57 -47
  277. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +1 -8
  278. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/polyval.c +27 -28
  279. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +11 -23
  280. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +21 -16
  281. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.c +5 -288
  282. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +143 -83
  283. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +95 -183
  284. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +71 -0
  285. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/internal.h +8 -0
  286. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/kdf.c +33 -0
  287. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +162 -6
  288. data/third_party/boringssl-with-bazel/src/crypto/internal.h +18 -0
  289. data/third_party/boringssl-with-bazel/src/crypto/kyber/kyber.c +18 -11
  290. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +6 -13
  291. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +18 -14
  292. data/third_party/boringssl-with-bazel/src/crypto/{refcount_lock.c → refcount_no_threads.c} +3 -13
  293. data/third_party/boringssl-with-bazel/src/crypto/refcount_win.c +89 -0
  294. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/internal.h +77 -0
  295. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_crypt.c +568 -0
  296. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +62 -0
  297. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +218 -44
  298. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +35 -0
  299. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +588 -39
  300. data/third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c +27 -18
  301. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +1 -1
  302. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +17 -39
  303. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +39 -48
  304. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +0 -140
  305. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +72 -23
  306. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +11 -14
  307. data/third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c +1 -1
  308. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  309. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +1 -1
  310. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +33 -46
  311. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +1 -0
  312. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +3 -5
  313. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +14 -46
  314. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +14 -26
  315. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +17 -10
  316. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +1 -1
  317. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +5 -7
  318. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +6 -4
  319. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +32 -1
  320. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +0 -4
  321. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +1 -4
  322. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +3 -3
  323. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +28 -0
  324. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +2 -11
  325. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -3
  326. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +91 -1
  327. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +5 -0
  328. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +149 -20
  329. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +4 -0
  330. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +4 -0
  331. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +8 -0
  332. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +774 -615
  333. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +42 -10
  334. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +11 -6
  335. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +2 -4
  336. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +24 -16
  337. data/third_party/boringssl-with-bazel/src/ssl/internal.h +65 -18
  338. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +37 -18
  339. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +187 -193
  340. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +13 -129
  341. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +85 -10
  342. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +17 -4
  343. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +27 -19
  344. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +1 -1
  345. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +5 -21
  346. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +5 -2
  347. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64_msvc.h +1281 -0
  348. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64_msvc.h +2002 -0
  349. data/third_party/cares/cares/include/ares.h +23 -1
  350. data/third_party/cares/cares/{src/lib → include}/ares_nameser.h +9 -7
  351. data/third_party/cares/cares/include/ares_rules.h +2 -2
  352. data/third_party/cares/cares/include/ares_version.h +3 -3
  353. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +266 -0
  354. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +240 -0
  355. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +49 -80
  356. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +37 -43
  357. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +12 -4
  358. data/third_party/cares/cares/src/lib/ares_data.c +16 -0
  359. data/third_party/cares/cares/src/lib/ares_data.h +7 -0
  360. data/third_party/cares/cares/src/lib/ares_destroy.c +8 -0
  361. data/third_party/cares/cares/src/lib/ares_expand_name.c +17 -6
  362. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +1 -0
  363. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +156 -78
  364. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +130 -326
  365. data/third_party/cares/cares/src/lib/ares_init.c +97 -485
  366. data/third_party/cares/cares/src/lib/ares_library_init.c +2 -89
  367. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +23 -142
  368. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +22 -142
  369. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +184 -0
  370. data/third_party/cares/cares/src/lib/ares_private.h +30 -16
  371. data/third_party/cares/cares/src/lib/ares_process.c +55 -16
  372. data/third_party/cares/cares/src/lib/ares_query.c +1 -35
  373. data/third_party/cares/cares/src/lib/ares_rand.c +279 -0
  374. data/third_party/cares/cares/src/lib/ares_send.c +5 -7
  375. data/third_party/cares/cares/src/lib/ares_strdup.c +12 -19
  376. data/third_party/cares/cares/src/lib/ares_strsplit.c +44 -128
  377. data/third_party/cares/cares/src/lib/ares_strsplit.h +9 -10
  378. data/third_party/cares/cares/src/lib/inet_net_pton.c +78 -116
  379. data/third_party/cares/cares/src/tools/ares_getopt.h +53 -0
  380. metadata +50 -16
  381. data/src/core/ext/filters/client_channel/health/health_check_client.cc +0 -175
  382. data/src/core/ext/filters/client_channel/health/health_check_client.h +0 -43
  383. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +0 -176
  384. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +0 -325
  385. data/third_party/cares/cares/src/lib/ares_library_init.h +0 -43
@@ -22,6 +22,8 @@
22
22
  #include "absl/strings/str_cat.h"
23
23
  #include "absl/strings/strip.h"
24
24
 
25
+ #include <grpc/support/json.h>
26
+
25
27
  namespace grpc_core {
26
28
  namespace json_detail {
27
29
 
@@ -91,13 +93,11 @@ bool LoadNumber::IsNumber() const { return true; }
91
93
 
92
94
  void LoadBool::LoadInto(const Json& json, const JsonArgs&, void* dst,
93
95
  ValidationErrors* errors) const {
94
- if (json.type() == Json::Type::kTrue) {
95
- *static_cast<bool*>(dst) = true;
96
- } else if (json.type() == Json::Type::kFalse) {
97
- *static_cast<bool*>(dst) = false;
98
- } else {
96
+ if (json.type() != Json::Type::kBoolean) {
99
97
  errors->AddError("is not a boolean");
98
+ return;
100
99
  }
100
+ *static_cast<bool*>(dst) = json.boolean();
101
101
  }
102
102
 
103
103
  void LoadUnprocessedJsonObject::LoadInto(const Json& json, const JsonArgs&,
@@ -168,9 +168,8 @@ void LoadMap::LoadInto(const Json& json, const JsonArgs& args, void* dst,
168
168
  }
169
169
  }
170
170
 
171
- void LoadOptional::LoadInto(const Json& json, const JsonArgs& args, void* dst,
172
- ValidationErrors* errors) const {
173
- if (json.type() == Json::Type::kNull) return;
171
+ void LoadWrapped::LoadInto(const Json& json, const JsonArgs& args, void* dst,
172
+ ValidationErrors* errors) const {
174
173
  void* element = Emplace(dst);
175
174
  size_t starting_error_size = errors->size();
176
175
  ElementLoader()->LoadInto(json, args, element, errors);
@@ -191,7 +190,7 @@ bool LoadObject(const Json& json, const JsonArgs& args, const Element* elements,
191
190
  ValidationErrors::ScopedField field(errors,
192
191
  absl::StrCat(".", element.name));
193
192
  const auto& it = json.object().find(element.name);
194
- if (it == json.object().end()) {
193
+ if (it == json.object().end() || it->second.type() == Json::Type::kNull) {
195
194
  if (element.optional) continue;
196
195
  errors->AddError("field not present");
197
196
  continue;
@@ -253,14 +253,14 @@ class LoadMap : public LoaderInterface {
253
253
  virtual const LoaderInterface* ElementLoader() const = 0;
254
254
  };
255
255
 
256
- // Load an optional of some type.
257
- class LoadOptional : public LoaderInterface {
256
+ // Load a wrapped value of some type.
257
+ class LoadWrapped : public LoaderInterface {
258
258
  public:
259
259
  void LoadInto(const Json& json, const JsonArgs& args, void* dst,
260
260
  ValidationErrors* errors) const override;
261
261
 
262
262
  protected:
263
- ~LoadOptional() = default;
263
+ ~LoadWrapped() = default;
264
264
 
265
265
  private:
266
266
  virtual void* Emplace(void* dst) const = 0;
@@ -392,7 +392,7 @@ class AutoLoader<std::map<std::string, T>> final : public LoadMap {
392
392
 
393
393
  // Specializations of AutoLoader for absl::optional<>.
394
394
  template <typename T>
395
- class AutoLoader<absl::optional<T>> final : public LoadOptional {
395
+ class AutoLoader<absl::optional<T>> final : public LoadWrapped {
396
396
  public:
397
397
  void* Emplace(void* dst) const final {
398
398
  return &static_cast<absl::optional<T>*>(dst)->emplace();
@@ -410,7 +410,7 @@ class AutoLoader<absl::optional<T>> final : public LoadOptional {
410
410
 
411
411
  // Specializations of AutoLoader for std::unique_ptr<>.
412
412
  template <typename T>
413
- class AutoLoader<std::unique_ptr<T>> final : public LoadOptional {
413
+ class AutoLoader<std::unique_ptr<T>> final : public LoadWrapped {
414
414
  public:
415
415
  void* Emplace(void* dst) const final {
416
416
  auto& p = *static_cast<std::unique_ptr<T>*>(dst);
@@ -428,6 +428,26 @@ class AutoLoader<std::unique_ptr<T>> final : public LoadOptional {
428
428
  ~AutoLoader() = default;
429
429
  };
430
430
 
431
+ // Specializations of AutoLoader for RefCountedPtr<>.
432
+ template <typename T>
433
+ class AutoLoader<RefCountedPtr<T>> final : public LoadWrapped {
434
+ public:
435
+ void* Emplace(void* dst) const final {
436
+ auto& p = *static_cast<RefCountedPtr<T>*>(dst);
437
+ p = MakeRefCounted<T>();
438
+ return p.get();
439
+ }
440
+ void Reset(void* dst) const final {
441
+ static_cast<RefCountedPtr<T>*>(dst)->reset();
442
+ }
443
+ const LoaderInterface* ElementLoader() const final {
444
+ return LoaderForType<T>();
445
+ }
446
+
447
+ private:
448
+ ~AutoLoader() = default;
449
+ };
450
+
431
451
  // Implementation of aforementioned LoaderForType.
432
452
  // Simply keeps a static AutoLoader<T> and returns a pointer to that.
433
453
  template <typename T>
@@ -596,19 +616,6 @@ absl::StatusOr<T> LoadFromJson(
596
616
  return std::move(result);
597
617
  }
598
618
 
599
- template <typename T>
600
- absl::StatusOr<RefCountedPtr<T>> LoadRefCountedFromJson(
601
- const Json& json, const JsonArgs& args = JsonArgs(),
602
- absl::string_view error_prefix = "errors validating JSON") {
603
- ValidationErrors errors;
604
- auto result = MakeRefCounted<T>();
605
- json_detail::LoaderForType<T>()->LoadInto(json, args, result.get(), &errors);
606
- if (!errors.ok()) {
607
- return errors.status(absl::StatusCode::kInvalidArgument, error_prefix);
608
- }
609
- return std::move(result);
610
- }
611
-
612
619
  template <typename T>
613
620
  T LoadFromJson(const Json& json, const JsonArgs& args,
614
621
  ValidationErrors* errors) {
@@ -35,6 +35,7 @@
35
35
  #include "absl/strings/string_view.h"
36
36
  #include "absl/types/variant.h"
37
37
 
38
+ #include <grpc/support/json.h>
38
39
  #include <grpc/support/log.h>
39
40
 
40
41
  #include "src/core/lib/gprpp/match.h"
@@ -107,8 +108,13 @@ class JsonReader {
107
108
 
108
109
  Json TakeAsJson() {
109
110
  return MatchMutable(
110
- &data, [&](Json::Object* object) { return Json(std::move(*object)); },
111
- [&](Json::Array* array) { return Json(std::move(*array)); });
111
+ &data,
112
+ [&](Json::Object* object) {
113
+ return Json::FromObject(std::move(*object));
114
+ },
115
+ [&](Json::Array* array) {
116
+ return Json::FromArray(std::move(*array));
117
+ });
112
118
  }
113
119
  };
114
120
 
@@ -307,26 +313,26 @@ void JsonReader::SetKey() {
307
313
 
308
314
  void JsonReader::SetString() {
309
315
  Json* value = CreateAndLinkValue();
310
- *value = std::move(string_);
316
+ *value = Json::FromString(std::move(string_));
311
317
  string_.clear();
312
318
  }
313
319
 
314
320
  bool JsonReader::SetNumber() {
315
321
  Json* value = CreateAndLinkValue();
316
- *value = Json(string_, /*is_number=*/true);
322
+ *value = Json::FromNumber(std::move(string_));
317
323
  string_.clear();
318
324
  return true;
319
325
  }
320
326
 
321
327
  void JsonReader::SetTrue() {
322
328
  Json* value = CreateAndLinkValue();
323
- *value = true;
329
+ *value = Json::FromBool(true);
324
330
  string_.clear();
325
331
  }
326
332
 
327
333
  void JsonReader::SetFalse() {
328
334
  Json* value = CreateAndLinkValue();
329
- *value = false;
335
+ *value = Json::FromBool(false);
330
336
  string_.clear();
331
337
  }
332
338
 
@@ -470,6 +476,7 @@ JsonReader::Status JsonReader::Run() {
470
476
  return Status::GRPC_JSON_PARSE_ERROR;
471
477
  }
472
478
  state_ = State::GRPC_JSON_STATE_VALUE_END;
479
+ container_just_begun_ = false;
473
480
  EndContainer();
474
481
  if (stack_.empty()) {
475
482
  state_ = State::GRPC_JSON_STATE_END;
@@ -37,18 +37,13 @@ bool ParseDurationFromJson(const Json& field, Duration* duration) {
37
37
 
38
38
  bool ExtractJsonBool(const Json& json, absl::string_view field_name,
39
39
  bool* output, std::vector<grpc_error_handle>* error_list) {
40
- switch (json.type()) {
41
- case Json::Type::kTrue:
42
- *output = true;
43
- return true;
44
- case Json::Type::kFalse:
45
- *output = false;
46
- return true;
47
- default:
48
- error_list->push_back(GRPC_ERROR_CREATE(
49
- absl::StrCat("field:", field_name, " error:type should be BOOLEAN")));
50
- return false;
40
+ if (json.type() != Json::Type::kBoolean) {
41
+ error_list->push_back(GRPC_ERROR_CREATE(
42
+ absl::StrCat("field:", field_name, " error:type should be BOOLEAN")));
43
+ return false;
51
44
  }
45
+ *output = json.boolean();
46
+ return true;
52
47
  }
53
48
 
54
49
  bool ExtractJsonArray(const Json& json, absl::string_view field_name,
@@ -145,9 +145,7 @@ void JsonWriter::EscapeString(const std::string& string) {
145
145
  OutputChar('"');
146
146
  for (size_t idx = 0; idx < string.size(); ++idx) {
147
147
  uint8_t c = static_cast<uint8_t>(string[idx]);
148
- if (c == 0) {
149
- break;
150
- } else if (c >= 32 && c <= 126) {
148
+ if (c >= 32 && c <= 126) {
151
149
  if (c == '\\' || c == '"') OutputChar('\\');
152
150
  OutputChar(static_cast<char>(c));
153
151
  } else if (c < 32 || c == 127) {
@@ -311,11 +309,12 @@ void JsonWriter::DumpValue(const Json& value) {
311
309
  case Json::Type::kNumber:
312
310
  ValueRaw(value.string());
313
311
  break;
314
- case Json::Type::kTrue:
315
- ValueRaw(std::string("true", 4));
316
- break;
317
- case Json::Type::kFalse:
318
- ValueRaw(std::string("false", 5));
312
+ case Json::Type::kBoolean:
313
+ if (value.boolean()) {
314
+ ValueRaw(std::string("true", 4));
315
+ } else {
316
+ ValueRaw(std::string("false", 5));
317
+ }
319
318
  break;
320
319
  case Json::Type::kNull:
321
320
  ValueRaw(std::string("null", 4));
@@ -366,6 +366,19 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
366
366
  /// whether the LB policy accepted the update; if non-OK, informs
367
367
  /// polling-based resolvers that they should go into backoff delay and
368
368
  /// eventually reattempt the resolution.
369
+ ///
370
+ /// The first time that UpdateLocked() is called, the LB policy will
371
+ /// generally not be able to determine the appropriate connectivity
372
+ /// state by the time UpdateLocked() returns (e.g., it will need to
373
+ /// wait for connectivity state notifications from each subchannel,
374
+ /// which will be delivered asynchronously). In this case, the LB
375
+ /// policy should not call the helper's UpdateState() method until it
376
+ /// does have a clear picture of the connectivity state (e.g., it
377
+ /// should wait for all subchannels to report connectivity state
378
+ /// before calling the helper's UpdateState() method), although it is
379
+ /// expected to do so within some short period of time. The parent of
380
+ /// the LB policy will assume that the policy's initial state is
381
+ /// CONNECTING and that picks should be queued.
369
382
  virtual absl::Status UpdateLocked(UpdateArgs) = 0; // NOLINT
370
383
 
371
384
  /// Tries to enter a READY connectivity state.
@@ -31,6 +31,7 @@
31
31
  #include "absl/strings/str_join.h"
32
32
  #include "absl/strings/string_view.h"
33
33
 
34
+ #include <grpc/support/json.h>
34
35
  #include <grpc/support/log.h>
35
36
 
36
37
  #include "src/core/lib/load_balancing/lb_policy.h"
@@ -83,7 +84,7 @@ bool LoadBalancingPolicyRegistry::LoadBalancingPolicyExists(
83
84
  if (factory == nullptr) return false;
84
85
  // If requested, check if the load balancing policy allows an empty config.
85
86
  if (requires_config != nullptr) {
86
- auto config = factory->ParseLoadBalancingConfig(Json());
87
+ auto config = factory->ParseLoadBalancingConfig(Json::FromObject({}));
87
88
  *requires_config = !config.ok();
88
89
  }
89
90
  return true;
@@ -159,12 +159,11 @@ std::string StringMatcher::ToString() const {
159
159
  absl::StatusOr<HeaderMatcher> HeaderMatcher::Create(
160
160
  absl::string_view name, Type type, absl::string_view matcher,
161
161
  int64_t range_start, int64_t range_end, bool present_match,
162
- bool invert_match) {
162
+ bool invert_match, bool case_sensitive) {
163
163
  if (static_cast<int>(type) < 5) {
164
164
  // Only for EXACT, PREFIX, SUFFIX, SAFE_REGEX and CONTAINS.
165
- absl::StatusOr<StringMatcher> string_matcher =
166
- StringMatcher::Create(static_cast<StringMatcher::Type>(type), matcher,
167
- /*case_sensitive=*/true);
165
+ absl::StatusOr<StringMatcher> string_matcher = StringMatcher::Create(
166
+ static_cast<StringMatcher::Type>(type), matcher, case_sensitive);
168
167
  if (!string_matcher.ok()) {
169
168
  return string_matcher.status();
170
169
  }
@@ -113,7 +113,8 @@ class HeaderMatcher {
113
113
  int64_t range_start = 0,
114
114
  int64_t range_end = 0,
115
115
  bool present_match = false,
116
- bool invert_match = false);
116
+ bool invert_match = false,
117
+ bool case_sensitive = true);
117
118
 
118
119
  HeaderMatcher() = default;
119
120
  HeaderMatcher(const HeaderMatcher& other);
@@ -26,6 +26,7 @@
26
26
  #include "absl/strings/str_join.h"
27
27
 
28
28
  #include "src/core/lib/gprpp/atomic_utils.h"
29
+ #include "src/core/lib/gprpp/crash.h"
29
30
 
30
31
  namespace grpc_core {
31
32
 
@@ -83,6 +84,10 @@ class FreestandingActivity::Handle final : public Wakeable {
83
84
  Unref();
84
85
  }
85
86
 
87
+ void WakeupAsync(WakeupMask) override ABSL_LOCKS_EXCLUDED(mu_) {
88
+ Crash("not implemented");
89
+ }
90
+
86
91
  void Drop(WakeupMask) override { Unref(); }
87
92
 
88
93
  std::string ActivityDebugTag(WakeupMask) const override {
@@ -32,6 +32,7 @@
32
32
  #include <grpc/support/log.h>
33
33
 
34
34
  #include "src/core/lib/gprpp/construct_destruct.h"
35
+ #include "src/core/lib/gprpp/crash.h"
35
36
  #include "src/core/lib/gprpp/no_destruct.h"
36
37
  #include "src/core/lib/gprpp/orphanable.h"
37
38
  #include "src/core/lib/gprpp/sync.h"
@@ -56,6 +57,9 @@ class Wakeable {
56
57
  // WakeupMask comes from the activity that created this Wakeable and specifies
57
58
  // the set of promises that should be awoken.
58
59
  virtual void Wakeup(WakeupMask wakeup_mask) = 0;
60
+ // Per Wakeup, but guarantee that the activity will be woken up out-of-line.
61
+ // Useful if there may be mutexes or the like held by the current thread.
62
+ virtual void WakeupAsync(WakeupMask wakeup_mask) = 0;
59
63
  // Drop this wakeable without waking up the underlying activity.
60
64
  virtual void Drop(WakeupMask wakeup_mask) = 0;
61
65
 
@@ -69,6 +73,7 @@ class Wakeable {
69
73
  namespace promise_detail {
70
74
  struct Unwakeable final : public Wakeable {
71
75
  void Wakeup(WakeupMask) override {}
76
+ void WakeupAsync(WakeupMask) override {}
72
77
  void Drop(WakeupMask) override {}
73
78
  std::string ActivityDebugTag(WakeupMask) const override;
74
79
  };
@@ -96,6 +101,8 @@ class Waker {
96
101
  // Wake the underlying activity.
97
102
  void Wakeup() { Take().Wakeup(); }
98
103
 
104
+ void WakeupAsync() { Take().WakeupAsync(); }
105
+
99
106
  template <typename H>
100
107
  friend H AbslHashValue(H h, const Waker& w) {
101
108
  return H::combine(H::combine(std::move(h), w.wakeable_and_arg_.wakeable),
@@ -125,6 +132,7 @@ class Waker {
125
132
  WakeupMask wakeup_mask;
126
133
 
127
134
  void Wakeup() { wakeable->Wakeup(wakeup_mask); }
135
+ void WakeupAsync() { wakeable->WakeupAsync(wakeup_mask); }
128
136
  void Drop() { wakeable->Drop(wakeup_mask); }
129
137
  std::string ActivityDebugTag() const {
130
138
  return wakeable == nullptr ? "<unknown>"
@@ -512,6 +520,8 @@ class PromiseActivity final
512
520
  }
513
521
  }
514
522
 
523
+ void WakeupAsync(WakeupMask) final { Crash("not implemented"); }
524
+
515
525
  // Drop a wakeup
516
526
  void Drop(WakeupMask) final { this->WakeupComplete(); }
517
527
 
@@ -169,7 +169,7 @@ absl::enable_if_t<IsVoidCallable<ResultOf<F()>>::value,
169
169
  PromiseLike<decltype(std::declval<F>()())>>
170
170
  PromiseFactoryImpl(F&& f) {
171
171
  return f();
172
- };
172
+ }
173
173
 
174
174
  template <typename A, typename F>
175
175
  class OncePromiseFactory {
@@ -26,12 +26,11 @@
26
26
 
27
27
  #include "src/core/lib/debug/trace.h"
28
28
  #include "src/core/lib/gprpp/sync.h"
29
+ #include "src/core/lib/iomgr/exec_ctx.h"
29
30
  #include "src/core/lib/promise/activity.h"
30
31
  #include "src/core/lib/promise/trace.h"
31
32
 
32
- // #define GRPC_PARTY_MAXIMIZE_THREADS
33
-
34
- #ifdef GRPC_PARTY_MAXIMIZE_THREADS
33
+ #ifdef GRPC_MAXIMIZE_THREADYNESS
35
34
  #include "src/core/lib/gprpp/thd.h" // IWYU pragma: keep
36
35
  #include "src/core/lib/iomgr/exec_ctx.h" // IWYU pragma: keep
37
36
  #endif
@@ -100,9 +99,9 @@ class Party::Handle final : public Wakeable {
100
99
  Unref();
101
100
  }
102
101
 
103
- // Activity needs to wake up (if it still exists!) - wake it up, and drop the
104
- // ref that was kept for this handle.
105
- void Wakeup(WakeupMask wakeup_mask) override ABSL_LOCKS_EXCLUDED(mu_) {
102
+ void WakeupGeneric(WakeupMask wakeup_mask,
103
+ void (Party::*wakeup_method)(WakeupMask))
104
+ ABSL_LOCKS_EXCLUDED(mu_) {
106
105
  mu_.Lock();
107
106
  // Note that activity refcount can drop to zero, but we could win the lock
108
107
  // against DropActivity, so we need to only increase activities refcount if
@@ -112,7 +111,7 @@ class Party::Handle final : public Wakeable {
112
111
  mu_.Unlock();
113
112
  // Activity still exists and we have a reference: wake it up, which will
114
113
  // drop the ref.
115
- party->Wakeup(wakeup_mask);
114
+ (party->*wakeup_method)(wakeup_mask);
116
115
  } else {
117
116
  // Could not get the activity - it's either gone or going. No need to wake
118
117
  // it up!
@@ -122,6 +121,16 @@ class Party::Handle final : public Wakeable {
122
121
  Unref();
123
122
  }
124
123
 
124
+ // Activity needs to wake up (if it still exists!) - wake it up, and drop the
125
+ // ref that was kept for this handle.
126
+ void Wakeup(WakeupMask wakeup_mask) override ABSL_LOCKS_EXCLUDED(mu_) {
127
+ WakeupGeneric(wakeup_mask, &Party::Wakeup);
128
+ }
129
+
130
+ void WakeupAsync(WakeupMask wakeup_mask) override ABSL_LOCKS_EXCLUDED(mu_) {
131
+ WakeupGeneric(wakeup_mask, &Party::WakeupAsync);
132
+ }
133
+
125
134
  void Drop(WakeupMask) override { Unref(); }
126
135
 
127
136
  std::string ActivityDebugTag(WakeupMask) const override {
@@ -202,7 +211,7 @@ void Party::RunLocked() {
202
211
  PartyOver();
203
212
  }
204
213
  };
205
- #ifdef GRPC_PARTY_MAXIMIZE_THREADS
214
+ #ifdef GRPC_MAXIMIZE_THREADYNESS
206
215
  Thread thd(
207
216
  "RunParty",
208
217
  [body]() {
@@ -267,15 +276,24 @@ void Party::AddParticipants(Participant** participants, size_t count) {
267
276
  Unref();
268
277
  }
269
278
 
270
- void Party::ScheduleWakeup(WakeupMask mask) {
271
- if (sync_.ScheduleWakeup(mask)) RunLocked();
272
- }
273
-
274
279
  void Party::Wakeup(WakeupMask wakeup_mask) {
275
- ScheduleWakeup(wakeup_mask);
280
+ if (sync_.ScheduleWakeup(wakeup_mask)) RunLocked();
276
281
  Unref();
277
282
  }
278
283
 
284
+ void Party::WakeupAsync(WakeupMask wakeup_mask) {
285
+ if (sync_.ScheduleWakeup(wakeup_mask)) {
286
+ event_engine()->Run([this]() {
287
+ ApplicationCallbackExecCtx app_exec_ctx;
288
+ ExecCtx exec_ctx;
289
+ RunLocked();
290
+ Unref();
291
+ });
292
+ } else {
293
+ Unref();
294
+ }
295
+ }
296
+
279
297
  void Party::Drop(WakeupMask) { Unref(); }
280
298
 
281
299
  void Party::PartyIsOver() {
@@ -27,8 +27,10 @@
27
27
  #include "absl/base/thread_annotations.h"
28
28
  #include "absl/strings/string_view.h"
29
29
 
30
+ #include <grpc/event_engine/event_engine.h>
30
31
  #include <grpc/support/log.h>
31
32
 
33
+ #include "src/core/lib/debug/trace.h"
32
34
  #include "src/core/lib/gprpp/construct_destruct.h"
33
35
  #include "src/core/lib/gprpp/crash.h"
34
36
  #include "src/core/lib/gprpp/ref_counted.h"
@@ -37,6 +39,7 @@
37
39
  #include "src/core/lib/promise/activity.h"
38
40
  #include "src/core/lib/promise/context.h"
39
41
  #include "src/core/lib/promise/detail/promise_factory.h"
42
+ #include "src/core/lib/promise/trace.h"
40
43
  #include "src/core/lib/resource_quota/arena.h"
41
44
 
42
45
  // Two implementations of party synchronization are provided: one using a single
@@ -453,13 +456,15 @@ class Party : public Activity, private Wakeable {
453
456
 
454
457
  // Wakeable implementation
455
458
  void Wakeup(WakeupMask wakeup_mask) final;
459
+ void WakeupAsync(WakeupMask wakeup_mask) final;
456
460
  void Drop(WakeupMask wakeup_mask) final;
457
461
 
458
- // Organize to wake up some participants.
459
- void ScheduleWakeup(WakeupMask mask);
460
462
  // Add a participant (backs Spawn, after type erasure to ParticipantFactory).
461
463
  void AddParticipants(Participant** participant, size_t count);
462
464
 
465
+ virtual grpc_event_engine::experimental::EventEngine* event_engine()
466
+ const = 0;
467
+
463
468
  // Sentinal value for currently_polling_ when no participant is being polled.
464
469
  static constexpr uint8_t kNotPolling = 255;
465
470
 
@@ -482,6 +487,10 @@ class Party : public Activity, private Wakeable {
482
487
  template <typename Factory, typename OnComplete>
483
488
  void Party::BulkSpawner::Spawn(absl::string_view name, Factory promise_factory,
484
489
  OnComplete on_complete) {
490
+ if (grpc_trace_promise_primitives.enabled()) {
491
+ gpr_log(GPR_DEBUG, "%s[bulk_spawn] On %p queue %s",
492
+ party_->DebugTag().c_str(), this, std::string(name).c_str());
493
+ }
485
494
  participants_[num_participants_++] =
486
495
  party_->arena_->NewPooled<ParticipantImpl<Factory, OnComplete>>(
487
496
  name, std::move(promise_factory), std::move(on_complete));
@@ -377,8 +377,8 @@ class Center : public InterceptorList<T> {
377
377
 
378
378
  std::string DebugTag() {
379
379
  if (auto* activity = Activity::current()) {
380
- return absl::StrCat(activity->DebugTag(), " PIPE[0x",
381
- reinterpret_cast<uintptr_t>(this), "]: ");
380
+ return absl::StrCat(activity->DebugTag(), " PIPE[0x", absl::Hex(this),
381
+ "]: ");
382
382
  } else {
383
383
  return absl::StrCat("PIPE[0x", reinterpret_cast<uintptr_t>(this), "]: ");
384
384
  }
@@ -610,6 +610,13 @@ class PipeReceiver {
610
610
  return [center = center_]() { return center->PollEmpty(); };
611
611
  }
612
612
 
613
+ void CloseWithError() {
614
+ if (center_ != nullptr) {
615
+ center_->MarkCancelled();
616
+ center_.reset();
617
+ }
618
+ }
619
+
613
620
  // Interject PromiseFactory f into the pipeline.
614
621
  // f will be called with the current value traversing the pipe, and should
615
622
  // return a value to replace it with.
@@ -0,0 +1,95 @@
1
+ // Copyright 2023 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_SRC_CORE_LIB_PROMISE_PRIORITIZED_RACE_H
16
+ #define GRPC_SRC_CORE_LIB_PROMISE_PRIORITIZED_RACE_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <type_traits>
21
+ #include <utility>
22
+
23
+ namespace grpc_core {
24
+
25
+ namespace promise_detail {
26
+
27
+ template <typename A, typename B>
28
+ class TwoPartyPrioritizedRace {
29
+ public:
30
+ using Result = decltype(std::declval<A>()());
31
+
32
+ explicit TwoPartyPrioritizedRace(A a, B b)
33
+ : a_(std::move(a)), b_(std::move(b)) {}
34
+
35
+ Result operator()() {
36
+ // Check the priority promise.
37
+ auto p = a_();
38
+ if (p.ready()) return p;
39
+ // Check the other promise.
40
+ p = b_();
41
+ if (p.ready()) {
42
+ // re-poll a to see if it's also completed.
43
+ auto q = a_();
44
+ if (q.ready()) {
45
+ // both are ready, but a is prioritized
46
+ return q;
47
+ }
48
+ }
49
+ return p;
50
+ }
51
+
52
+ private:
53
+ A a_;
54
+ B b_;
55
+ };
56
+
57
+ template <typename... Promises>
58
+ class PrioritizedRace;
59
+
60
+ template <typename Promise, typename... Promises>
61
+ class PrioritizedRace<Promise, Promises...>
62
+ : public TwoPartyPrioritizedRace<Promise, PrioritizedRace<Promises...>> {
63
+ public:
64
+ using Result = decltype(std::declval<Promise>()());
65
+ explicit PrioritizedRace(Promise promise, Promises... promises)
66
+ : TwoPartyPrioritizedRace<Promise, PrioritizedRace<Promises...>>(
67
+ std::move(promise),
68
+ PrioritizedRace<Promises...>(std::move(promises)...)) {}
69
+ };
70
+
71
+ template <typename Promise>
72
+ class PrioritizedRace<Promise> {
73
+ public:
74
+ using Result = decltype(std::declval<Promise>()());
75
+ explicit PrioritizedRace(Promise promise) : promise_(std::move(promise)) {}
76
+ Result operator()() { return promise_(); }
77
+
78
+ private:
79
+ Promise promise_;
80
+ };
81
+
82
+ } // namespace promise_detail
83
+
84
+ /// Run all the promises until one is non-pending.
85
+ /// Once there's a non-pending promise, repoll all the promises before that.
86
+ /// Return the result from the lexically first non-pending promise.
87
+ template <typename... Promises>
88
+ promise_detail::PrioritizedRace<Promises...> PrioritizedRace(
89
+ Promises... promises) {
90
+ return promise_detail::PrioritizedRace<Promises...>(std::move(promises)...);
91
+ }
92
+
93
+ } // namespace grpc_core
94
+
95
+ #endif // GRPC_SRC_CORE_LIB_PROMISE_PRIORITIZED_RACE_H
@@ -41,8 +41,9 @@ Poll<absl::Status> Sleep::operator()() {
41
41
  // Invalidate now so that we see a fresh version of the time.
42
42
  // TODO(ctiller): the following can be safely removed when we remove ExecCtx.
43
43
  ExecCtx::Get()->InvalidateNow();
44
+ const auto now = Timestamp::Now();
44
45
  // If the deadline is earlier than now we can just return.
45
- if (deadline_ <= Timestamp::Now()) return absl::OkStatus();
46
+ if (deadline_ <= now) return absl::OkStatus();
46
47
  if (closure_ == nullptr) {
47
48
  // TODO(ctiller): it's likely we'll want a pool of closures - probably per
48
49
  // cpu? - to avoid allocating/deallocating on fast paths.