grpc 1.83.0 → 1.84.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +21 -17
  3. data/include/grpc/credentials.h +10 -0
  4. data/include/grpc/grpc_security_constants.h +2 -0
  5. data/include/grpc/impl/channel_arg_names.h +9 -0
  6. data/src/core/call/call_filters.h +4 -2
  7. data/src/core/call/client_call.cc +20 -8
  8. data/src/core/call/client_call.h +4 -0
  9. data/src/core/call/interception_chain.cc +2 -0
  10. data/src/core/call/interception_chain.h +14 -1
  11. data/src/core/call/metadata.cc +1 -3
  12. data/src/core/call/metadata_batch.h +13 -5
  13. data/src/core/call/server_call.cc +31 -14
  14. data/src/core/call/server_call.h +4 -0
  15. data/src/core/channelz/text_encode.cc +9 -4
  16. data/src/core/channelz/v2tov1/convert.cc +2 -2
  17. data/src/core/client_channel/backup_poller.cc +1 -2
  18. data/src/core/client_channel/client_channel.cc +6 -33
  19. data/src/core/client_channel/client_channel_filter.cc +22 -55
  20. data/src/core/client_channel/client_channel_filter.h +2 -2
  21. data/src/core/client_channel/client_channel_service_config.cc +3 -19
  22. data/src/core/client_channel/direct_channel.cc +7 -1
  23. data/src/core/client_channel/direct_channel.h +2 -2
  24. data/src/core/client_channel/load_balanced_call_destination.cc +5 -3
  25. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -12
  26. data/src/core/client_channel/subchannel.cc +310 -1058
  27. data/src/core/client_channel/subchannel.h +44 -329
  28. data/src/core/client_channel/subchannel_metrics.cc +48 -0
  29. data/src/core/client_channel/subchannel_metrics.h +60 -0
  30. data/src/core/credentials/call/external/file_external_account_credentials.cc +1 -1
  31. data/src/core/credentials/call/external/url_external_account_credentials.cc +2 -3
  32. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +8 -24
  33. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h +3 -6
  34. data/src/core/credentials/call/gdch_service_account/gdch_service_account_credentials.cc +525 -0
  35. data/src/core/credentials/call/gdch_service_account/gdch_service_account_credentials.h +138 -0
  36. data/src/core/credentials/call/json_util.h +1 -0
  37. data/src/core/credentials/call/jwt/json_token.cc +10 -2
  38. data/src/core/credentials/call/jwt/jwt_verifier.cc +15 -1
  39. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +1 -1
  40. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +42 -79
  41. data/src/core/credentials/call/oauth2/oauth2_credentials.h +2 -5
  42. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +52 -31
  43. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.h +21 -8
  44. data/src/core/credentials/transport/google_default/google_default_credentials.cc +3 -4
  45. data/src/core/credentials/transport/ssl/ssl_credentials.cc +59 -72
  46. data/src/core/credentials/transport/ssl/ssl_credentials.h +9 -8
  47. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +12 -6
  48. data/src/core/credentials/transport/ssl/ssl_security_connector.h +4 -4
  49. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -18
  50. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +9 -6
  51. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +45 -56
  52. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +5 -4
  53. data/src/core/credentials/transport/tls/grpc_tls_certificate_selector.h +26 -0
  54. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +1 -1
  55. data/src/core/credentials/transport/tls/load_system_roots.h +2 -6
  56. data/src/core/credentials/transport/tls/load_system_roots_fallback.cc +2 -4
  57. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +13 -15
  58. data/src/core/credentials/transport/tls/load_system_roots_supported.h +3 -2
  59. data/src/core/credentials/transport/tls/load_system_roots_windows.cc +5 -8
  60. data/src/core/credentials/transport/tls/spiffe_utils.cc +1 -1
  61. data/src/core/credentials/transport/tls/ssl_utils.cc +39 -28
  62. data/src/core/credentials/transport/tls/ssl_utils.h +12 -49
  63. data/src/core/credentials/transport/tls/tls_security_connector.cc +48 -33
  64. data/src/core/credentials/transport/tls/tls_security_connector.h +31 -10
  65. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +15 -11
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +20 -9
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +25 -32
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +0 -1
  69. data/src/core/ext/filters/rbac/rbac_filter.cc +43 -21
  70. data/src/core/ext/filters/rbac/rbac_filter.h +21 -3
  71. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -2
  72. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -1
  73. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -20
  74. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +80 -70
  75. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -0
  76. data/src/core/ext/transport/chttp2/transport/flow_control.h +78 -4
  77. data/src/core/ext/transport/chttp2/transport/frame.h +2 -0
  78. data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -2
  79. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +55 -23
  80. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +1 -0
  81. data/src/core/ext/transport/chttp2/transport/goaway.h +7 -0
  82. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +5 -3
  83. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -1
  84. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +141 -130
  85. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +22 -22
  86. data/src/core/ext/transport/chttp2/transport/http2_server_transport.cc +402 -269
  87. data/src/core/ext/transport/chttp2/transport/http2_server_transport.h +80 -49
  88. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +1 -2
  89. data/src/core/ext/transport/chttp2/transport/http2_status.h +38 -37
  90. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +178 -5
  91. data/src/core/ext/transport/chttp2/transport/http2_transport.h +345 -5
  92. data/src/core/ext/transport/chttp2/transport/internal.h +6 -0
  93. data/src/core/ext/transport/chttp2/transport/parsing.cc +13 -5
  94. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +3 -2
  95. data/src/core/ext/transport/chttp2/transport/ping_promise.h +25 -5
  96. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +3 -4
  97. data/src/core/ext/transport/chttp2/transport/read_context.h +30 -3
  98. data/src/core/ext/transport/chttp2/transport/stream.h +65 -23
  99. data/src/core/ext/transport/chttp2/transport/writing.cc +0 -3
  100. data/src/core/ext/transport/inproc/inproc_transport.cc +1 -5
  101. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +4 -17
  102. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb.h +1912 -0
  103. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb_minitable.c +300 -0
  104. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb_minitable.h +37 -0
  105. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb.h +187 -0
  106. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb_minitable.c +64 -0
  107. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb_minitable.h +31 -0
  108. data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb.h +2362 -0
  109. data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb_minitable.c +556 -0
  110. data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb_minitable.h +47 -0
  111. data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb.h +5 -5
  112. data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb_minitable.c +3 -3
  113. data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb_minitable.h +5 -5
  114. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upbdefs.c +453 -0
  115. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upbdefs.h +67 -0
  116. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upbdefs.c +142 -0
  117. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upbdefs.h +37 -0
  118. data/src/core/ext/upbdefs-gen/grpc/channelz/v1/channelz.upbdefs.c +715 -0
  119. data/src/core/ext/upbdefs-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upbdefs.h +44 -44
  120. data/src/core/filter/auth/server_auth_filter.cc +2 -3
  121. data/src/core/filter/composite/composite_filter.cc +45 -33
  122. data/src/core/filter/composite/composite_filter.h +5 -4
  123. data/src/core/filter/ext_proc/ext_proc_filter.cc +224 -0
  124. data/src/core/filter/ext_proc/ext_proc_filter.h +155 -0
  125. data/src/core/filter/ext_proc/ext_proc_messages.cc +701 -0
  126. data/src/core/filter/ext_proc/ext_proc_messages.h +297 -0
  127. data/src/core/filter/filter_args.h +13 -2
  128. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +30 -3
  129. data/src/core/handshaker/security/security_handshaker.cc +9 -6
  130. data/src/core/lib/channel/channel_stack.cc +3 -0
  131. data/src/core/lib/channel/channel_stack.h +2 -0
  132. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -2
  133. data/src/core/lib/channel/promise_based_filter.cc +132 -20
  134. data/src/core/lib/channel/promise_based_filter.h +42 -12
  135. data/src/core/lib/compression/compression_internal.cc +4 -5
  136. data/src/core/lib/compression/message_compress.cc +132 -97
  137. data/src/core/lib/compression/message_compress.h +24 -0
  138. data/src/core/lib/debug/trace_flags.cc +8 -0
  139. data/src/core/lib/debug/trace_flags.h +3 -0
  140. data/src/core/lib/event_engine/ares_resolver.cc +54 -50
  141. data/src/core/lib/event_engine/ares_resolver.h +3 -2
  142. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +3 -3
  143. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +4 -10
  144. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +74 -33
  145. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +4 -4
  146. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +6 -2
  147. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -0
  148. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +3 -0
  149. data/src/core/lib/event_engine/windows/windows_endpoint.cc +1 -3
  150. data/src/core/lib/experiments/experiments.cc +81 -102
  151. data/src/core/lib/experiments/experiments.h +57 -56
  152. data/src/core/lib/iomgr/cfstream_handle.cc +2 -6
  153. data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -10
  154. data/src/core/lib/iomgr/error.cc +2 -6
  155. data/src/core/lib/iomgr/error_cfstream.cc +1 -1
  156. data/src/core/lib/iomgr/ev_poll_posix.cc +5 -9
  157. data/src/core/lib/iomgr/event_engine_shims/closure.cc +1 -1
  158. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +1 -2
  159. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +1 -2
  160. data/src/core/lib/iomgr/iomgr_posix.cc +0 -4
  161. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -4
  162. data/src/core/lib/iomgr/iomgr_windows.cc +0 -4
  163. data/src/core/lib/iomgr/socket_factory_posix.h +1 -1
  164. data/src/core/lib/iomgr/socket_utils_posix.cc +3 -0
  165. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  166. data/src/core/lib/iomgr/systemd_utils.cc +0 -1
  167. data/src/core/lib/iomgr/tcp_client.h +1 -1
  168. data/src/core/lib/iomgr/tcp_posix.cc +23 -15
  169. data/src/core/lib/iomgr/tcp_server.h +1 -1
  170. data/src/core/lib/iomgr/tcp_server_posix.cc +2 -3
  171. data/src/core/lib/iomgr/tcp_server_utils_posix.h +0 -1
  172. data/src/core/lib/iomgr/tcp_server_windows.cc +0 -1
  173. data/src/core/lib/iomgr/tcp_windows.cc +5 -10
  174. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
  175. data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
  176. data/src/core/lib/iomgr/vsock.h +3 -1
  177. data/src/core/lib/resource_quota/memory_quota.cc +1 -1
  178. data/src/core/lib/security/authorization/rbac_policy.cc +139 -56
  179. data/src/core/lib/security/authorization/rbac_policy.h +21 -3
  180. data/src/core/lib/surface/call.cc +3 -9
  181. data/src/core/lib/surface/call_utils.h +113 -0
  182. data/src/core/lib/surface/channel_create.cc +1 -1
  183. data/src/core/lib/surface/channel_create.h +0 -2
  184. data/src/core/lib/surface/channel_init.cc +77 -38
  185. data/src/core/lib/surface/channel_init.h +30 -16
  186. data/src/core/lib/surface/filter_stack_call.cc +5 -10
  187. data/src/core/lib/surface/init.cc +13 -27
  188. data/src/core/lib/surface/legacy_channel.cc +3 -1
  189. data/src/core/lib/surface/version.cc +1 -1
  190. data/src/core/lib/transport/error_utils.cc +0 -27
  191. data/src/core/lib/transport/error_utils.h +0 -16
  192. data/src/core/lib/transport/transport.h +7 -5
  193. data/src/core/load_balancing/pick_first/pick_first.cc +2 -0
  194. data/src/core/load_balancing/rls/rls.cc +28 -11
  195. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +33 -42
  196. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.h +0 -2
  197. data/src/core/load_balancing/xds/cds.cc +3 -1
  198. data/src/core/load_balancing/xds/xds_cluster_impl.cc +0 -1
  199. data/src/core/mitigation_engine/mitigation.h +14 -5
  200. data/src/core/mitigation_engine/mitigation_engine.h +7 -3
  201. data/src/core/mitigation_engine/mitigation_provider.h +2 -1
  202. data/src/core/plugin_registry/grpc_plugin_registry.cc +39 -8
  203. data/src/core/resolver/dns/{event_engine/event_engine_client_channel_resolver.cc → dns_resolver.cc} +42 -41
  204. data/src/core/resolver/dns/{event_engine/event_engine_client_channel_resolver.h → dns_resolver.h} +8 -5
  205. data/src/core/resolver/dns/{event_engine/service_config_helper.cc → service_config_helper.cc} +1 -1
  206. data/src/core/resolver/dns/{event_engine/service_config_helper.h → service_config_helper.h} +3 -3
  207. data/src/core/resolver/endpoint_addresses.h +3 -0
  208. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +2 -1
  209. data/src/core/resolver/xds/xds_resolver.cc +35 -9
  210. data/src/core/server/server.cc +2 -6
  211. data/src/core/server/server_config_selector.h +18 -3
  212. data/src/core/server/server_config_selector_filter.cc +178 -91
  213. data/src/core/server/server_config_selector_filter.h +58 -3
  214. data/src/core/server/xds_server_config_fetcher.cc +196 -129
  215. data/src/core/server/xds_server_config_fetcher.h +49 -0
  216. data/src/core/server/xds_server_config_fetcher_legacy.cc +41 -37
  217. data/src/core/telemetry/histogram.h +94 -14
  218. data/src/core/telemetry/instrument.cc +179 -74
  219. data/src/core/telemetry/instrument.h +78 -30
  220. data/src/core/telemetry/metrics.h +5 -0
  221. data/src/core/{resolver/dns/dns_resolver_plugin.h → telemetry/telemetry_label.h} +12 -8
  222. data/src/core/tsi/alts/crypt/aes_gcm.cc +10 -13
  223. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -2
  224. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +3 -1
  225. data/src/core/tsi/ssl_telemetry_utils.cc +216 -259
  226. data/src/core/tsi/ssl_telemetry_utils.h +12 -2
  227. data/src/core/tsi/ssl_transport_security.cc +238 -80
  228. data/src/core/tsi/ssl_transport_security.h +63 -33
  229. data/src/core/tsi/tls_telemetry.cc +31 -0
  230. data/src/core/tsi/tls_telemetry.h +47 -0
  231. data/src/core/tsi/transport_security.cc +2 -2
  232. data/src/core/tsi/transport_security.h +1 -1
  233. data/src/core/tsi/transport_security_interface.h +1 -1
  234. data/src/core/{resolver/dns/native/dns_resolver.h → util/address_sorting_init.cc} +21 -8
  235. data/src/core/{resolver/dns/c_ares/grpc_ares_wrapper_posix.cc → util/address_sorting_init.h} +7 -8
  236. data/src/core/util/http_client/httpcli.cc +16 -53
  237. data/src/core/util/http_client/httpcli.h +0 -7
  238. data/src/core/util/http_client/httpcli_security_connector.cc +13 -8
  239. data/src/core/util/linux/cpu.cc +1 -1
  240. data/src/core/util/load_file.cc +3 -9
  241. data/src/core/util/load_file.h +3 -4
  242. data/src/core/util/matchers.h +8 -0
  243. data/src/core/util/posix/cpu.cc +1 -1
  244. data/src/core/util/status_helper.cc +0 -20
  245. data/src/core/util/status_helper.h +3 -14
  246. data/src/core/xds/grpc/xds_audit_logger_registry.cc +51 -31
  247. data/src/core/xds/grpc/xds_audit_logger_registry.h +17 -3
  248. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -10
  249. data/src/core/xds/grpc/xds_bootstrap_grpc.h +8 -6
  250. data/src/core/xds/grpc/xds_bootstrap_grpc_builder.cc +488 -0
  251. data/src/core/xds/grpc/xds_bootstrap_grpc_builder.h +97 -0
  252. data/src/core/xds/grpc/xds_certificate_provider.cc +7 -7
  253. data/src/core/xds/grpc/xds_client_grpc.cc +4 -8
  254. data/src/core/xds/grpc/xds_client_grpc.h +0 -4
  255. data/src/core/xds/grpc/xds_cluster.h +1 -0
  256. data/src/core/xds/grpc/xds_cluster_parser.cc +1 -5
  257. data/src/core/xds/grpc/xds_cluster_parser.h +0 -2
  258. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +0 -2
  259. data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +0 -2
  260. data/src/core/xds/grpc/xds_common_types.cc +0 -91
  261. data/src/core/xds/grpc/xds_common_types.h +1 -47
  262. data/src/core/xds/grpc/xds_common_types_parser.cc +84 -378
  263. data/src/core/xds/grpc/xds_common_types_parser.h +9 -11
  264. data/src/core/xds/grpc/xds_endpoint_parser.cc +0 -2
  265. data/src/core/xds/grpc/xds_grpc_service_parser.cc +177 -0
  266. data/src/core/{resolver/dns/c_ares/dns_resolver_ares.h → xds/grpc/xds_grpc_service_parser.h} +14 -9
  267. data/src/core/xds/grpc/xds_http_composite_filter.cc +26 -21
  268. data/src/core/xds/grpc/xds_http_composite_filter.h +4 -3
  269. data/src/core/xds/grpc/xds_http_ext_proc_filter.cc +418 -0
  270. data/src/core/xds/grpc/xds_http_ext_proc_filter.h +89 -0
  271. data/src/core/xds/grpc/xds_http_fault_filter.cc +9 -12
  272. data/src/core/xds/grpc/xds_http_fault_filter.h +1 -4
  273. data/src/core/xds/grpc/xds_http_filter.cc +2 -1
  274. data/src/core/xds/grpc/xds_http_filter.h +6 -5
  275. data/src/core/xds/grpc/xds_http_filter_registry.cc +10 -127
  276. data/src/core/xds/grpc/xds_http_filter_registry.h +7 -59
  277. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +13 -14
  278. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -2
  279. data/src/core/xds/grpc/xds_http_rbac_filter.cc +403 -25
  280. data/src/core/xds/grpc/xds_http_rbac_filter.h +1 -3
  281. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +8 -13
  282. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +1 -4
  283. data/src/core/xds/grpc/xds_lb_policy_registry.cc +0 -292
  284. data/src/core/xds/grpc/xds_lb_policy_registry.h +7 -3
  285. data/src/core/xds/grpc/xds_listener.cc +2 -0
  286. data/src/core/xds/grpc/xds_listener.h +5 -0
  287. data/src/core/xds/grpc/xds_listener_parser.cc +16 -11
  288. data/src/core/xds/grpc/xds_matcher_parse.h +3 -1
  289. data/src/core/xds/grpc/xds_metadata_parser.cc +6 -1
  290. data/src/core/xds/grpc/xds_metadata_parser.h +2 -0
  291. data/src/core/xds/grpc/xds_route_config.cc +2 -0
  292. data/src/core/xds/grpc/xds_route_config.h +3 -1
  293. data/src/core/xds/grpc/xds_route_config_parser.cc +13 -79
  294. data/src/core/xds/grpc/xds_route_config_parser.h +0 -3
  295. data/src/core/xds/grpc/xds_routing.cc +116 -69
  296. data/src/core/xds/grpc/xds_routing.h +19 -8
  297. data/src/core/xds/grpc/xds_tls_context.cc +117 -0
  298. data/src/core/xds/grpc/xds_tls_context.h +76 -0
  299. data/src/core/xds/grpc/xds_tls_context_parser.cc +275 -0
  300. data/src/core/xds/grpc/xds_tls_context_parser.h +35 -0
  301. data/src/core/xds/grpc/xds_transport_grpc.cc +41 -38
  302. data/src/core/xds/grpc/xds_transport_grpc.h +4 -2
  303. data/src/ruby/ext/grpc/rb_call.c +26 -15
  304. data/src/ruby/ext/grpc/rb_completion_queue.c +6 -5
  305. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  306. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  307. data/src/ruby/lib/grpc/version.rb +1 -1
  308. data/src/ruby/pb/test/client.rb +5 -4
  309. data/src/ruby/spec/call_spec.rb +14 -0
  310. data/src/ruby/spec/generic/server_interceptors_spec.rb +3 -6
  311. metadata +50 -35
  312. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +0 -716
  313. data/src/core/lib/iomgr/resolve_address.cc +0 -59
  314. data/src/core/lib/iomgr/resolve_address.h +0 -125
  315. data/src/core/lib/iomgr/resolve_address_impl.h +0 -58
  316. data/src/core/lib/iomgr/resolve_address_posix.cc +0 -184
  317. data/src/core/lib/iomgr/resolve_address_posix.h +0 -78
  318. data/src/core/lib/iomgr/resolve_address_windows.cc +0 -169
  319. data/src/core/lib/iomgr/resolve_address_windows.h +0 -76
  320. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +0 -781
  321. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +0 -93
  322. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +0 -203
  323. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +0 -838
  324. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +0 -1237
  325. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +0 -130
  326. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +0 -35
  327. data/src/core/resolver/dns/dns_resolver_plugin.cc +0 -64
  328. data/src/core/resolver/dns/native/dns_resolver.cc +0 -173
  329. data/src/core/util/json/json_util.cc +0 -101
  330. data/src/core/util/json/json_util.h +0 -163
@@ -25,168 +25,203 @@
25
25
  #include <zconf.h>
26
26
  #include <zlib.h>
27
27
 
28
+ #include <algorithm>
29
+ #include <cstdint>
30
+ #include <optional>
31
+
28
32
  #include "src/core/lib/slice/slice.h"
29
33
  #include "src/core/util/grpc_check.h"
34
+ #include "src/core/util/status_helper.h"
30
35
  #include "absl/log/log.h"
36
+ #include "absl/status/status.h"
37
+ #include "absl/status/statusor.h"
31
38
 
32
39
  #define OUTPUT_BLOCK_SIZE 1024
33
40
 
34
- static int zlib_body(z_stream* zs, grpc_slice_buffer* input,
35
- grpc_slice_buffer* output,
36
- int (*flate)(z_stream* zs, int flush)) {
41
+ namespace grpc_core {
42
+ namespace {
43
+
44
+ absl::StatusOr<SliceBuffer> ZlibBody(z_stream* zs, const SliceBuffer& input,
45
+ int (*flate)(z_stream* zs, int flush),
46
+ std::optional<uint32_t> max_output_size) {
37
47
  int r = Z_STREAM_END; // Do not fail on an empty input.
38
48
  int flush;
39
49
  size_t i;
40
- grpc_slice outbuf = GRPC_SLICE_MALLOC(OUTPUT_BLOCK_SIZE);
50
+ uint32_t remaining_output_size = max_output_size.value_or(UINT32_MAX);
51
+ SliceBuffer output_sb;
41
52
  const uInt uint_max = ~uInt{0};
53
+ auto outbuf = MutableSlice::CreateUninitialized(
54
+ std::min<uint32_t>(remaining_output_size, OUTPUT_BLOCK_SIZE));
42
55
 
43
- GRPC_CHECK(GRPC_SLICE_LENGTH(outbuf) <= uint_max);
44
- zs->avail_out = static_cast<uInt> GRPC_SLICE_LENGTH(outbuf);
45
- zs->next_out = GRPC_SLICE_START_PTR(outbuf);
56
+ GRPC_CHECK(outbuf.length() <= uint_max);
57
+ zs->avail_out = static_cast<uInt>(outbuf.length());
58
+ zs->next_out = const_cast<uint8_t*>(outbuf.begin());
46
59
  flush = Z_NO_FLUSH;
47
- for (i = 0; i < input->count; i++) {
48
- if (i == input->count - 1) flush = Z_FINISH;
49
- GRPC_CHECK(GRPC_SLICE_LENGTH(input->slices[i]) <= uint_max);
50
- zs->avail_in = static_cast<uInt> GRPC_SLICE_LENGTH(input->slices[i]);
51
- zs->next_in = GRPC_SLICE_START_PTR(input->slices[i]);
60
+ for (i = 0; i < input.Count(); i++) {
61
+ if (i == input.Count() - 1) {
62
+ flush = Z_FINISH;
63
+ }
64
+ GRPC_CHECK(input[i].length() <= uint_max);
65
+ zs->avail_in = static_cast<uInt>(input[i].length());
66
+ zs->next_in = const_cast<uint8_t*>(input[i].begin());
52
67
  do {
53
68
  if (zs->avail_out == 0) {
54
- grpc_slice_buffer_add_indexed(output, outbuf);
55
- outbuf = GRPC_SLICE_MALLOC(OUTPUT_BLOCK_SIZE);
56
- GRPC_CHECK(GRPC_SLICE_LENGTH(outbuf) <= uint_max);
57
- zs->avail_out = static_cast<uInt> GRPC_SLICE_LENGTH(outbuf);
58
- zs->next_out = GRPC_SLICE_START_PTR(outbuf);
69
+ if (max_output_size.has_value() && remaining_output_size == 0) {
70
+ VLOG(2) << "zlib: max provided output size exceeded";
71
+ return absl::ResourceExhaustedError(
72
+ "Decompressed message larger than max");
73
+ }
74
+ output_sb.AppendIndexed(Slice(std::move(outbuf)));
75
+ outbuf = MutableSlice::CreateUninitialized(
76
+ std::min<uint32_t>(remaining_output_size, OUTPUT_BLOCK_SIZE));
77
+ // Update remaining output size to reflect the size of the slice we just
78
+ // filled with compressed / decompressed data.
79
+ if (max_output_size.has_value()) {
80
+ remaining_output_size -= outbuf.length();
81
+ }
82
+ GRPC_CHECK(outbuf.length() <= uint_max);
83
+ zs->avail_out = static_cast<uInt>(outbuf.length());
84
+ zs->next_out = const_cast<uint8_t*>(outbuf.begin());
59
85
  }
60
86
  r = flate(zs, flush);
61
87
  if (r < 0 && r != Z_BUF_ERROR /* not fatal */) {
62
88
  VLOG(2) << "zlib error (" << r << ")";
63
- goto error;
89
+ return absl::InternalError("Decompression failed due to zlib error");
64
90
  }
65
91
  } while (zs->avail_out == 0);
66
92
  if (zs->avail_in) {
67
93
  VLOG(2) << "zlib: not all input consumed";
68
- goto error;
94
+ return absl::InternalError(
95
+ "Decompression failed due to not all input "
96
+ "consumed");
69
97
  }
70
98
  }
71
99
  if (r != Z_STREAM_END) {
72
100
  VLOG(2) << "zlib: Data error";
73
- goto error;
101
+ return absl::InternalError("Decompression failed due to data error");
74
102
  }
75
103
 
76
- GRPC_CHECK(outbuf.refcount);
77
- outbuf.data.refcounted.length -= zs->avail_out;
78
- grpc_slice_buffer_add_indexed(output, outbuf);
79
-
80
- return 1;
81
-
82
- error:
83
- grpc_core::CSliceUnref(outbuf);
84
- return 0;
104
+ // TODO(vigneshbabu): Add a Truncate() method to the Slice type to avoid using
105
+ // the underlying C type here.
106
+ grpc_slice slice = outbuf.TakeCSlice();
107
+ if (slice.refcount) {
108
+ slice.data.refcounted.length -= zs->avail_out;
109
+ } else {
110
+ slice.data.inlined.length -= zs->avail_out;
111
+ }
112
+ output_sb.AppendIndexed(Slice(slice));
113
+ return output_sb;
85
114
  }
86
115
 
87
- static void* zalloc_gpr(void* /*opaque*/, unsigned int items,
88
- unsigned int size) {
116
+ void* ZallocGpr(void* /*opaque*/, unsigned int items, unsigned int size) {
89
117
  return gpr_malloc(items * size);
90
118
  }
91
119
 
92
- static void zfree_gpr(void* /*opaque*/, void* address) { gpr_free(address); }
120
+ void ZFreeGpr(void* /*opaque*/, void* address) { gpr_free(address); }
93
121
 
94
- static int zlib_compress(grpc_slice_buffer* input, grpc_slice_buffer* output,
95
- int gzip) {
122
+ std::optional<SliceBuffer> ZlibCompress(const SliceBuffer& input, int gzip) {
96
123
  z_stream zs;
97
- int r;
98
- size_t i;
99
- size_t count_before = output->count;
100
- size_t length_before = output->length;
124
+ absl::StatusOr<SliceBuffer> compression_result;
101
125
  memset(&zs, 0, sizeof(zs));
102
- zs.zalloc = zalloc_gpr;
103
- zs.zfree = zfree_gpr;
104
- r = deflateInit2(&zs, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 | (gzip ? 16 : 0),
105
- 8, Z_DEFAULT_STRATEGY);
126
+ zs.zalloc = ZallocGpr;
127
+ zs.zfree = ZFreeGpr;
128
+ bool r = deflateInit2(&zs, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
129
+ 15 | (gzip ? 16 : 0), 8, Z_DEFAULT_STRATEGY);
106
130
  GRPC_CHECK(r == Z_OK);
107
- r = zlib_body(&zs, input, output, deflate) && output->length < input->length;
108
- if (!r) {
109
- for (i = count_before; i < output->count; i++) {
110
- grpc_core::CSliceUnref(output->slices[i]);
111
- }
112
- output->count = count_before;
113
- output->length = length_before;
114
- }
131
+ compression_result = ZlibBody(&zs, input, deflate, input.Length());
115
132
  deflateEnd(&zs);
116
- return r;
133
+ if (compression_result.ok() &&
134
+ compression_result->Length() < input.Length()) {
135
+ return std::move(*compression_result);
136
+ }
137
+ return std::nullopt;
117
138
  }
118
139
 
119
- static int zlib_decompress(grpc_slice_buffer* input, grpc_slice_buffer* output,
120
- int gzip) {
140
+ absl::StatusOr<SliceBuffer> ZlibDecompress(
141
+ const SliceBuffer& input, int gzip,
142
+ std::optional<uint32_t> max_output_size) {
121
143
  z_stream zs;
122
- int r;
123
- size_t i;
124
- size_t count_before = output->count;
125
- size_t length_before = output->length;
144
+ absl::StatusOr<SliceBuffer> decompression_result;
126
145
  memset(&zs, 0, sizeof(zs));
127
- zs.zalloc = zalloc_gpr;
128
- zs.zfree = zfree_gpr;
129
- r = inflateInit2(&zs, 15 | (gzip ? 16 : 0));
146
+ zs.zalloc = ZallocGpr;
147
+ zs.zfree = ZFreeGpr;
148
+ bool r = inflateInit2(&zs, 15 | (gzip ? 16 : 0));
130
149
  GRPC_CHECK(r == Z_OK);
131
- r = zlib_body(&zs, input, output, inflate);
132
- if (!r) {
133
- for (i = count_before; i < output->count; i++) {
134
- grpc_core::CSliceUnref(output->slices[i]);
135
- }
136
- output->count = count_before;
137
- output->length = length_before;
138
- }
150
+ decompression_result = ZlibBody(&zs, input, inflate, max_output_size);
139
151
  inflateEnd(&zs);
140
- return r;
152
+ return decompression_result;
141
153
  }
142
154
 
143
- static int copy(grpc_slice_buffer* input, grpc_slice_buffer* output) {
144
- size_t i;
145
- for (i = 0; i < input->count; i++) {
146
- grpc_slice_buffer_add(output, grpc_core::CSliceRef(input->slices[i]));
147
- }
148
- return 1;
149
- }
155
+ } // namespace
150
156
 
151
- static int compress_inner(grpc_compression_algorithm algorithm,
152
- grpc_slice_buffer* input, grpc_slice_buffer* output) {
157
+ std::optional<SliceBuffer> MessageCompress(grpc_compression_algorithm algorithm,
158
+ const SliceBuffer& input) {
153
159
  switch (algorithm) {
154
160
  case GRPC_COMPRESS_NONE:
155
161
  // the fallback path always needs to be send uncompressed: we simply
156
162
  // rely on that here
157
- return 0;
163
+ return std::nullopt;
158
164
  case GRPC_COMPRESS_DEFLATE:
159
- return zlib_compress(input, output, 0);
165
+ return ZlibCompress(input, 0);
160
166
  case GRPC_COMPRESS_GZIP:
161
- return zlib_compress(input, output, 1);
167
+ return ZlibCompress(input, 1);
162
168
  case GRPC_COMPRESS_ALGORITHMS_COUNT:
163
169
  break;
164
170
  }
165
171
  LOG(ERROR) << "invalid compression algorithm " << algorithm;
166
- return 0;
172
+ return std::nullopt;
167
173
  }
168
174
 
175
+ absl::StatusOr<SliceBuffer> MessageDecompress(
176
+ grpc_compression_algorithm algorithm, const SliceBuffer& input,
177
+ std::optional<uint32_t> max_output_size) {
178
+ switch (algorithm) {
179
+ case GRPC_COMPRESS_NONE: {
180
+ SliceBuffer output;
181
+ output.Append(input);
182
+ return output;
183
+ }
184
+ case GRPC_COMPRESS_DEFLATE:
185
+ return ZlibDecompress(input, 0, max_output_size);
186
+ case GRPC_COMPRESS_GZIP:
187
+ return ZlibDecompress(input, 1, max_output_size);
188
+ case GRPC_COMPRESS_ALGORITHMS_COUNT:
189
+ break;
190
+ }
191
+ LOG(ERROR) << "invalid compression algorithm " << algorithm;
192
+ return absl::InternalError("Invalid compression algorithm");
193
+ }
194
+
195
+ } // namespace grpc_core
196
+
169
197
  int grpc_msg_compress(grpc_compression_algorithm algorithm,
170
198
  grpc_slice_buffer* input, grpc_slice_buffer* output) {
171
- if (!compress_inner(algorithm, input, output)) {
172
- copy(input, output);
173
- return 0;
199
+ int retval = 1;
200
+ grpc_core::SliceBuffer input_sb;
201
+ grpc_slice_buffer_swap(input, input_sb.c_slice_buffer());
202
+ std::optional<grpc_core::SliceBuffer> output_sb =
203
+ grpc_core::MessageCompress(algorithm, input_sb);
204
+ if (!output_sb.has_value()) {
205
+ output_sb.emplace();
206
+ output_sb->Append(input_sb);
207
+ retval = 0;
174
208
  }
175
- return 1;
209
+ grpc_slice_buffer_swap(input, input_sb.c_slice_buffer());
210
+ grpc_slice_buffer_swap(output, output_sb->c_slice_buffer());
211
+ return retval;
176
212
  }
177
213
 
178
214
  int grpc_msg_decompress(grpc_compression_algorithm algorithm,
179
215
  grpc_slice_buffer* input, grpc_slice_buffer* output) {
180
- switch (algorithm) {
181
- case GRPC_COMPRESS_NONE:
182
- return copy(input, output);
183
- case GRPC_COMPRESS_DEFLATE:
184
- return zlib_decompress(input, output, 0);
185
- case GRPC_COMPRESS_GZIP:
186
- return zlib_decompress(input, output, 1);
187
- case GRPC_COMPRESS_ALGORITHMS_COUNT:
188
- break;
216
+ grpc_core::SliceBuffer input_sb;
217
+ grpc_slice_buffer_swap(input, input_sb.c_slice_buffer());
218
+
219
+ absl::StatusOr<grpc_core::SliceBuffer> output_sb =
220
+ grpc_core::MessageDecompress(algorithm, input_sb, std::nullopt);
221
+ if (!output_sb.ok()) {
222
+ return 0;
189
223
  }
190
- LOG(ERROR) << "invalid compression algorithm " << algorithm;
191
- return 0;
224
+ grpc_slice_buffer_swap(input, input_sb.c_slice_buffer());
225
+ grpc_slice_buffer_swap(output, output_sb->c_slice_buffer());
226
+ return 1;
192
227
  }
@@ -23,6 +23,13 @@
23
23
  #include <grpc/slice.h>
24
24
  #include <grpc/support/port_platform.h>
25
25
 
26
+ #include <cstdint>
27
+ #include <optional>
28
+
29
+ #include "src/core/lib/slice/slice_buffer.h"
30
+ #include "absl/status/status.h"
31
+ #include "absl/status/statusor.h"
32
+
26
33
  // compress 'input' to 'output' using 'algorithm'.
27
34
  // On success, appends compressed slices to output and returns 1.
28
35
  // On failure, appends uncompressed slices to output and returns 0.
@@ -35,4 +42,21 @@ int grpc_msg_compress(grpc_compression_algorithm algorithm,
35
42
  int grpc_msg_decompress(grpc_compression_algorithm algorithm,
36
43
  grpc_slice_buffer* input, grpc_slice_buffer* output);
37
44
 
45
+ namespace grpc_core {
46
+
47
+ // Compresses 'input' using 'algorithm'.
48
+ // On success, returns a SliceBuffer containing the compressed data.
49
+ // On failure, returns nullopt.
50
+ std::optional<SliceBuffer> MessageCompress(grpc_compression_algorithm algorithm,
51
+ const SliceBuffer& input);
52
+ // Decompresses 'input'.
53
+ // On success, returns a SliceBuffer containing the decompressed data.
54
+ // On failure, returns a non-OK status.
55
+ // Fails if the decompressed data would be larger than max_output_size.
56
+ absl::StatusOr<SliceBuffer> MessageDecompress(
57
+ grpc_compression_algorithm algorithm, const SliceBuffer& input,
58
+ std::optional<uint32_t> max_output_size);
59
+
60
+ } // namespace grpc_core
61
+
38
62
  #endif // GRPC_SRC_CORE_LIB_COMPRESSION_MESSAGE_COMPRESS_H
@@ -68,6 +68,7 @@ TraceFlag client_channel_trace(false, "client_channel");
68
68
  TraceFlag client_channel_call_trace(false, "client_channel_call");
69
69
  TraceFlag client_channel_lb_call_trace(false, "client_channel_lb_call");
70
70
  TraceFlag client_idle_filter_trace(false, "client_idle_filter");
71
+ TraceFlag composite_filter_trace(false, "composite_filter");
71
72
  TraceFlag compression_trace(false, "compression");
72
73
  TraceFlag connectivity_state_trace(false, "connectivity_state");
73
74
  TraceFlag dns_resolver_trace(false, "dns_resolver");
@@ -79,6 +80,7 @@ TraceFlag event_engine_dns_trace(false, "event_engine_dns");
79
80
  TraceFlag event_engine_endpoint_trace(false, "event_engine_endpoint");
80
81
  TraceFlag event_engine_endpoint_data_trace(false, "event_engine_endpoint_data");
81
82
  TraceFlag event_engine_poller_trace(false, "event_engine_poller");
83
+ TraceFlag ext_proc_filter_trace(false, "ext_proc_filter");
82
84
  TraceFlag fault_injection_filter_trace(false, "fault_injection_filter");
83
85
  TraceFlag flowctl_trace(false, "flowctl");
84
86
  TraceFlag fork_trace(false, "fork");
@@ -109,6 +111,8 @@ TraceFlag rls_lb_trace(false, "rls_lb");
109
111
  TraceFlag round_robin_trace(false, "round_robin");
110
112
  TraceFlag secure_endpoint_trace(false, "secure_endpoint");
111
113
  TraceFlag server_channel_trace(false, "server_channel");
114
+ TraceFlag server_config_selector_interceptor_trace(
115
+ false, "server_config_selector_interceptor");
112
116
  TraceFlag stateful_session_filter_trace(false, "stateful_session_filter");
113
117
  TraceFlag subchannel_trace(false, "subchannel");
114
118
  TraceFlag subchannel_call_trace(false, "subchannel_call");
@@ -151,6 +155,7 @@ const absl::flat_hash_map<std::string, TraceFlag*>& GetAllTraceFlags() {
151
155
  {"client_channel_call", &client_channel_call_trace},
152
156
  {"client_channel_lb_call", &client_channel_lb_call_trace},
153
157
  {"client_idle_filter", &client_idle_filter_trace},
158
+ {"composite_filter", &composite_filter_trace},
154
159
  {"compression", &compression_trace},
155
160
  {"connectivity_state", &connectivity_state_trace},
156
161
  {"dns_resolver", &dns_resolver_trace},
@@ -162,6 +167,7 @@ const absl::flat_hash_map<std::string, TraceFlag*>& GetAllTraceFlags() {
162
167
  {"event_engine_endpoint", &event_engine_endpoint_trace},
163
168
  {"event_engine_endpoint_data", &event_engine_endpoint_data_trace},
164
169
  {"event_engine_poller", &event_engine_poller_trace},
170
+ {"ext_proc_filter", &ext_proc_filter_trace},
165
171
  {"fault_injection_filter", &fault_injection_filter_trace},
166
172
  {"flowctl", &flowctl_trace},
167
173
  {"fork", &fork_trace},
@@ -192,6 +198,8 @@ const absl::flat_hash_map<std::string, TraceFlag*>& GetAllTraceFlags() {
192
198
  {"round_robin", &round_robin_trace},
193
199
  {"secure_endpoint", &secure_endpoint_trace},
194
200
  {"server_channel", &server_channel_trace},
201
+ {"server_config_selector_interceptor",
202
+ &server_config_selector_interceptor_trace},
195
203
  {"stateful_session_filter", &stateful_session_filter_trace},
196
204
  {"subchannel", &subchannel_trace},
197
205
  {"subchannel_call", &subchannel_call_trace},
@@ -67,6 +67,7 @@ extern TraceFlag client_channel_trace;
67
67
  extern TraceFlag client_channel_call_trace;
68
68
  extern TraceFlag client_channel_lb_call_trace;
69
69
  extern TraceFlag client_idle_filter_trace;
70
+ extern TraceFlag composite_filter_trace;
70
71
  extern TraceFlag compression_trace;
71
72
  extern TraceFlag connectivity_state_trace;
72
73
  extern TraceFlag dns_resolver_trace;
@@ -77,6 +78,7 @@ extern TraceFlag event_engine_dns_trace;
77
78
  extern TraceFlag event_engine_endpoint_trace;
78
79
  extern TraceFlag event_engine_endpoint_data_trace;
79
80
  extern TraceFlag event_engine_poller_trace;
81
+ extern TraceFlag ext_proc_filter_trace;
80
82
  extern TraceFlag fault_injection_filter_trace;
81
83
  extern TraceFlag flowctl_trace;
82
84
  extern TraceFlag fork_trace;
@@ -107,6 +109,7 @@ extern TraceFlag rls_lb_trace;
107
109
  extern TraceFlag round_robin_trace;
108
110
  extern TraceFlag secure_endpoint_trace;
109
111
  extern TraceFlag server_channel_trace;
112
+ extern TraceFlag server_config_selector_interceptor_trace;
110
113
  extern TraceFlag stateful_session_filter_trace;
111
114
  extern TraceFlag subchannel_trace;
112
115
  extern TraceFlag subchannel_call_trace;
@@ -60,11 +60,13 @@
60
60
  #include "src/core/lib/event_engine/grpc_polled_fd.h"
61
61
  #include "src/core/lib/event_engine/time_util.h"
62
62
  #include "src/core/lib/iomgr/resolved_address.h"
63
+ #include "src/core/util/address_sorting_init.h"
63
64
  #include "src/core/util/debug_location.h"
64
65
  #include "src/core/util/grpc_check.h"
65
66
  #include "src/core/util/host_port.h"
66
67
  #include "src/core/util/orphanable.h"
67
68
  #include "src/core/util/ref_counted_ptr.h"
69
+ #include "absl/base/call_once.h"
68
70
  #include "absl/functional/any_invocable.h"
69
71
  #include "absl/log/log.h"
70
72
  #include "absl/strings/match.h"
@@ -79,8 +81,58 @@
79
81
 
80
82
  namespace grpc_event_engine::experimental {
81
83
 
84
+ std::vector<EventEngine::ResolvedAddress> SortAddresses(
85
+ const std::vector<EventEngine::ResolvedAddress>& addresses) {
86
+ address_sorting_sortable* sortables = static_cast<address_sorting_sortable*>(
87
+ gpr_zalloc(sizeof(address_sorting_sortable) * addresses.size()));
88
+ for (size_t i = 0; i < addresses.size(); i++) {
89
+ sortables[i].user_data =
90
+ const_cast<EventEngine::ResolvedAddress*>(&addresses[i]);
91
+ memcpy(&sortables[i].dest_addr.addr, addresses[i].address(),
92
+ addresses[i].size());
93
+ sortables[i].dest_addr.len = addresses[i].size();
94
+ }
95
+ address_sorting_rfc_6724_sort(sortables, addresses.size());
96
+ std::vector<EventEngine::ResolvedAddress> sorted_addresses;
97
+ sorted_addresses.reserve(addresses.size());
98
+ for (size_t i = 0; i < addresses.size(); ++i) {
99
+ sorted_addresses.emplace_back(
100
+ *static_cast<EventEngine::ResolvedAddress*>(sortables[i].user_data));
101
+ }
102
+ gpr_free(sortables);
103
+ return sorted_addresses;
104
+ }
105
+
82
106
  namespace {
83
107
 
108
+ absl::Status AresInit() {
109
+ if (ShouldUseAresDnsResolver()) {
110
+ // ares_library_init and ares_library_cleanup are currently no-op except
111
+ // under Windows. Calling them may cause race conditions when other parts of
112
+ // the binary calls these functions concurrently.
113
+ #ifdef GPR_WINDOWS
114
+ int status = ares_library_init(ARES_LIB_INIT_ALL);
115
+ if (status != ARES_SUCCESS) {
116
+ return GRPC_ERROR_CREATE(
117
+ absl::StrCat("ares_library_init failed: ", ares_strerror(status)));
118
+ }
119
+ #endif // GPR_WINDOWS
120
+ }
121
+ return absl::OkStatus();
122
+ }
123
+
124
+ absl::once_flag init_flag;
125
+
126
+ void AresOnceInit() {
127
+ grpc_core::AddressSortingInitOnce();
128
+ absl::call_once(init_flag, []() {
129
+ auto status = AresInit();
130
+ if (!status.ok()) {
131
+ VLOG(2) << "AresInit failed: " << status.message();
132
+ }
133
+ });
134
+ }
135
+
84
136
  // A hard limit on the number of records (A/AAAA or SRV) we may get from a
85
137
  // single response. This is to be defensive to prevent a bad DNS response from
86
138
  // OOMing the process.
@@ -151,28 +203,6 @@ absl::Status SetRequestDNSServer(absl::string_view dns_server,
151
203
  return absl::OkStatus();
152
204
  }
153
205
 
154
- std::vector<EventEngine::ResolvedAddress> SortAddresses(
155
- const std::vector<EventEngine::ResolvedAddress>& addresses) {
156
- address_sorting_sortable* sortables = static_cast<address_sorting_sortable*>(
157
- gpr_zalloc(sizeof(address_sorting_sortable) * addresses.size()));
158
- for (size_t i = 0; i < addresses.size(); i++) {
159
- sortables[i].user_data =
160
- const_cast<EventEngine::ResolvedAddress*>(&addresses[i]);
161
- memcpy(&sortables[i].dest_addr.addr, addresses[i].address(),
162
- addresses[i].size());
163
- sortables[i].dest_addr.len = addresses[i].size();
164
- }
165
- address_sorting_rfc_6724_sort(sortables, addresses.size());
166
- std::vector<EventEngine::ResolvedAddress> sorted_addresses;
167
- sorted_addresses.reserve(addresses.size());
168
- for (size_t i = 0; i < addresses.size(); ++i) {
169
- sorted_addresses.emplace_back(
170
- *static_cast<EventEngine::ResolvedAddress*>(sortables[i].user_data));
171
- }
172
- gpr_free(sortables);
173
- return sorted_addresses;
174
- }
175
-
176
206
  struct QueryArg {
177
207
  QueryArg(AresResolver* ar, int id, absl::string_view name)
178
208
  : ares_resolver(ar), callback_map_id(id), query_name(name) {}
@@ -253,6 +283,7 @@ AresResolver::CreateAresResolver(
253
283
  std::unique_ptr<GrpcPolledFdFactory> polled_fd_factory,
254
284
  std::shared_ptr<EventEngine> event_engine) {
255
285
  ares_channel channel;
286
+ AresOnceInit();
256
287
  absl::Status status =
257
288
  InitAresChannel(dns_server, *polled_fd_factory, &channel);
258
289
  if (!status.ok()) {
@@ -276,6 +307,7 @@ AresResolver::AresResolver(
276
307
  #endif // GRPC_ENABLE_FORK_SUPPORT
277
308
  event_engine_(std::move(event_engine)) {
278
309
  (void)dns_server; // Used whether or not compiled with fork support
310
+ AresOnceInit();
279
311
  polled_fd_factory_->Initialize(&mutex_, event_engine_.get());
280
312
  }
281
313
 
@@ -951,36 +983,8 @@ bool ShouldUseAresDnsResolver() {
951
983
  // defined(GRPC_WINDOWS_SOCKET_ARES_EV_DRIVER)
952
984
  }
953
985
 
954
- absl::Status AresInit() {
955
- if (ShouldUseAresDnsResolver()) {
956
- // ares_library_init and ares_library_cleanup are currently no-op except
957
- // under Windows. Calling them may cause race conditions when other parts of
958
- // the binary calls these functions concurrently.
959
- #ifdef GPR_WINDOWS
960
- int status = ares_library_init(ARES_LIB_INIT_ALL);
961
- if (status != ARES_SUCCESS) {
962
- return GRPC_ERROR_CREATE(
963
- absl::StrCat("ares_library_init failed: ", ares_strerror(status)));
964
- }
965
- #endif // GPR_WINDOWS
966
- }
967
- return absl::OkStatus();
968
- }
969
- void AresShutdown() {
970
- if (ShouldUseAresDnsResolver()) {
971
- // ares_library_init and ares_library_cleanup are currently no-op except
972
- // under Windows. Calling them may cause race conditions when other parts of
973
- // the binary calls these functions concurrently.
974
- #ifdef GPR_WINDOWS
975
- ares_library_cleanup();
976
- #endif // GPR_WINDOWS
977
- }
978
- }
979
-
980
986
  #else // GRPC_ARES == 1
981
987
 
982
988
  bool ShouldUseAresDnsResolver() { return false; }
983
- absl::Status AresInit() { return absl::OkStatus(); }
984
- void AresShutdown() {}
985
989
 
986
990
  #endif // GRPC_ARES == 1
@@ -41,6 +41,9 @@
41
41
 
42
42
  namespace grpc_event_engine::experimental {
43
43
 
44
+ std::vector<EventEngine::ResolvedAddress> SortAddresses(
45
+ const std::vector<EventEngine::ResolvedAddress>& addresses);
46
+
44
47
  class AresResolver : public RefCountedDNSResolverInterface {
45
48
  public:
46
49
  #ifdef GRPC_ENABLE_FORK_SUPPORT
@@ -182,7 +185,5 @@ extern bool g_event_engine_grpc_ares_test_only_force_tcp;
182
185
  #endif // GRPC_ARES == 1
183
186
 
184
187
  bool ShouldUseAresDnsResolver();
185
- absl::Status AresInit();
186
- void AresShutdown();
187
188
 
188
189
  #endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_ARES_RESOLVER_H
@@ -226,9 +226,9 @@ void Epoll1EventHandle::OrphanHandle(PosixEngineClosure* on_done,
226
226
  // shutdown() syscall on that fd)
227
227
  void Epoll1EventHandle::HandleShutdownInternal(absl::Status why,
228
228
  bool releasing_fd) {
229
- grpc_core::StatusSetInt(
230
- &why, grpc_core::StatusIntProperty::kRpcStatus,
231
- absl::IsCancelled(why) ? GRPC_STATUS_CANCELLED : GRPC_STATUS_UNAVAILABLE);
229
+ if (!absl::IsCancelled(why)) {
230
+ why = absl::UnavailableError(why.message());
231
+ }
232
232
  if (read_closure_.SetShutdown(why)) {
233
233
  if (releasing_fd) {
234
234
  auto result = poller_->posix_interface().EpollCtlDel(
@@ -263,11 +263,7 @@ void PollEventHandle::OrphanHandle(PosixEngineClosure* on_done,
263
263
  // Perform shutdown operations if not already done so.
264
264
  if (!is_shutdown_) {
265
265
  is_shutdown_ = true;
266
- shutdown_error_ =
267
- absl::Status(absl::StatusCode::kInternal, "FD Orphaned");
268
- grpc_core::StatusSetInt(&shutdown_error_,
269
- grpc_core::StatusIntProperty::kRpcStatus,
270
- GRPC_STATUS_UNAVAILABLE);
266
+ shutdown_error_ = absl::UnavailableError("FD Orphaned");
271
267
  SetReadyLocked(&read_closure_);
272
268
  SetReadyLocked(&write_closure_);
273
269
  }
@@ -341,11 +337,9 @@ void PollEventHandle::ShutdownHandle(absl::Status why) {
341
337
  // only shutdown once
342
338
  if (!is_shutdown_) {
343
339
  is_shutdown_ = true;
344
- shutdown_error_ = std::move(why);
345
- grpc_core::StatusSetInt(
346
- &shutdown_error_, grpc_core::StatusIntProperty::kRpcStatus,
347
- absl::IsCancelled(shutdown_error_) ? GRPC_STATUS_CANCELLED
348
- : GRPC_STATUS_UNAVAILABLE);
340
+ shutdown_error_ = absl::IsCancelled(why)
341
+ ? std::move(why)
342
+ : absl::UnavailableError(why.message());
349
343
  SetReadyLocked(&read_closure_);
350
344
  SetReadyLocked(&write_closure_);
351
345
  }