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
@@ -19,6 +19,7 @@
19
19
 
20
20
  #include <algorithm>
21
21
  #include <memory>
22
+ #include <optional>
22
23
  #include <string>
23
24
  #include <utility>
24
25
  #include <vector>
@@ -74,10 +75,8 @@ absl::Status StatusFromMetadata(const ServerMetadata& md) {
74
75
  return absl::OkStatus();
75
76
  }
76
77
  const auto* message = md.get_pointer(GrpcMessageMetadata());
77
- return grpc_error_set_int(
78
- absl::Status(static_cast<absl::StatusCode>(status_code),
79
- message == nullptr ? "" : message->as_string_view()),
80
- StatusIntProperty::kRpcStatus, status_code);
78
+ return absl::Status(static_cast<absl::StatusCode>(status_code),
79
+ message == nullptr ? "" : message->as_string_view());
81
80
  }
82
81
  } // namespace
83
82
 
@@ -831,7 +830,8 @@ void BaseCallData::ReceiveMessage::OnComplete(absl::Status status) {
831
830
  }
832
831
 
833
832
  void BaseCallData::ReceiveMessage::Done(const ServerMetadata& metadata,
834
- Flusher* flusher) {
833
+ Flusher* flusher,
834
+ bool discard_buffered_message) {
835
835
  GRPC_TRACE_LOG(channel, INFO)
836
836
  << base_->LogTag() << " ReceiveMessage.Done st=" << StateString(state_)
837
837
  << " md=" << metadata.DebugString();
@@ -849,16 +849,36 @@ void BaseCallData::ReceiveMessage::Done(const ServerMetadata& metadata,
849
849
  state_ = State::kCancelledWhilstForwardingNoPipe;
850
850
  break;
851
851
  case State::kCompletedWhileBatchCompleted:
852
- case State::kBatchCompleted:
853
- state_ = State::kCompletedWhileBatchCompleted;
854
- break;
852
+ case State::kBatchCompleted: {
853
+ if (IsRecvMessageFilterBypassFixEnabled() && discard_buffered_message) {
854
+ state_ = State::kBatchCompletedButCancelled;
855
+ // Store the cancellation status so that WakeInsideCombiner() can
856
+ // propagate it to the application's message ready callback instead of
857
+ // defaulting to OK.
858
+ completed_status_ = StatusFromMetadata(metadata);
859
+ // Drop the buffered message here so it cannot bypass the trailing
860
+ // metadata; WakeInsideCombiner() just fires the completion.
861
+ if (intercepted_slice_buffer_ != nullptr) {
862
+ *intercepted_slice_buffer_ = std::nullopt;
863
+ }
864
+ } else {
865
+ state_ = State::kCompletedWhileBatchCompleted;
866
+ }
867
+ } break;
855
868
  case State::kCompletedWhilePulledFromPipe:
856
869
  case State::kCompletedWhilePushedToPipe:
857
870
  case State::kPulledFromPipe:
858
871
  case State::kPushedToPipe: {
859
- auto status_code =
860
- metadata.get(GrpcStatusMetadata()).value_or(GRPC_STATUS_UNKNOWN);
861
- if (status_code == GRPC_STATUS_OK) {
872
+ // Discard the buffered message only when the call is being torn down
873
+ // (short-circuit / cancellation / server-initiated non-OK);
874
+ // With the feature disabled, fall back to keying the discard off a
875
+ // non-OK trailing status.
876
+ bool discard =
877
+ IsRecvMessageFilterBypassFixEnabled()
878
+ ? discard_buffered_message
879
+ : metadata.get(GrpcStatusMetadata())
880
+ .value_or(GRPC_STATUS_UNKNOWN) != GRPC_STATUS_OK;
881
+ if (!discard) {
862
882
  if (state_ == State::kCompletedWhilePulledFromPipe ||
863
883
  state_ == State::kPulledFromPipe) {
864
884
  state_ = State::kCompletedWhilePulledFromPipe;
@@ -868,12 +888,31 @@ void BaseCallData::ReceiveMessage::Done(const ServerMetadata& metadata,
868
888
  } else {
869
889
  push_.reset();
870
890
  next_.reset();
871
- flusher->AddClosure(intercepted_on_complete_,
872
- StatusFromMetadata(metadata), "recv_message_done");
891
+ if (IsRecvMessageFilterBypassFixEnabled()) {
892
+ completed_status_ = StatusFromMetadata(metadata);
893
+ if (intercepted_slice_buffer_ != nullptr) {
894
+ *intercepted_slice_buffer_ = std::nullopt;
895
+ }
896
+ } else {
897
+ completed_status_ = StatusFromMetadata(metadata);
898
+ }
899
+ flusher->AddClosure(intercepted_on_complete_, completed_status_,
900
+ "recv_message_done");
873
901
  state_ = State::kCancelled;
874
902
  }
875
903
  } break;
876
904
  case State::kBatchCompletedNoPipe:
905
+ if (IsRecvMessageFilterBypassFixEnabled() && discard_buffered_message) {
906
+ // Store the cancellation status so that WakeInsideCombiner() can
907
+ // propagate it to the application's message ready callback instead of
908
+ // defaulting to OK.
909
+ completed_status_ = StatusFromMetadata(metadata);
910
+ // Drop the buffered message here so it cannot bypass the trailing
911
+ // metadata; WakeInsideCombiner() just fires the completion.
912
+ if (intercepted_slice_buffer_ != nullptr) {
913
+ *intercepted_slice_buffer_ = std::nullopt;
914
+ }
915
+ }
877
916
  state_ = State::kBatchCompletedButCancelledNoPipe;
878
917
  break;
879
918
  case State::kBatchCompletedButCancelled:
@@ -887,6 +926,18 @@ void BaseCallData::ReceiveMessage::Done(const ServerMetadata& metadata,
887
926
  }
888
927
  }
889
928
 
929
+ bool BaseCallData::ReceiveMessage::IsIdle() const {
930
+ switch (state_) {
931
+ case State::kInitial:
932
+ case State::kIdle:
933
+ case State::kCancelled:
934
+ case State::kCancelledWhilstIdle:
935
+ return true;
936
+ default:
937
+ return false;
938
+ }
939
+ }
940
+
890
941
  void BaseCallData::ReceiveMessage::WakeInsideCombiner(Flusher* flusher,
891
942
  bool allow_push_to_pipe) {
892
943
  GRPC_TRACE_LOG(channel, INFO)
@@ -910,7 +961,6 @@ void BaseCallData::ReceiveMessage::WakeInsideCombiner(Flusher* flusher,
910
961
  state_ = State::kCancelled;
911
962
  break;
912
963
  case State::kBatchCompletedButCancelled:
913
- case State::kCompletedWhileBatchCompleted:
914
964
  interceptor()->Push()->Close();
915
965
  state_ = State::kCancelled;
916
966
  flusher->AddClosure(std::exchange(intercepted_on_complete_, nullptr),
@@ -921,6 +971,16 @@ void BaseCallData::ReceiveMessage::WakeInsideCombiner(Flusher* flusher,
921
971
  flusher->AddClosure(std::exchange(intercepted_on_complete_, nullptr),
922
972
  completed_status_, "recv_message");
923
973
  break;
974
+ case State::kCompletedWhileBatchCompleted:
975
+ if (!IsRecvMessageFilterBypassFixEnabled()) {
976
+ // existing behavior
977
+ interceptor()->Push()->Close();
978
+ state_ = State::kCancelled;
979
+ flusher->AddClosure(std::exchange(intercepted_on_complete_, nullptr),
980
+ completed_status_, "recv_message");
981
+ break;
982
+ }
983
+ [[fallthrough]];
924
984
  case State::kBatchCompleted:
925
985
  if (completed_status_.ok() && intercepted_slice_buffer_->has_value()) {
926
986
  if (!allow_push_to_pipe) break;
@@ -1122,6 +1182,14 @@ class ClientCallData::PollContext {
1122
1182
  flusher_, self_->recv_initial_metadata_ == nullptr
1123
1183
  ? true
1124
1184
  : self_->recv_initial_metadata_->AllowRecvMessage());
1185
+ if (self_->recv_trailing_state_ ==
1186
+ RecvTrailingState::kCompletedQueuedBehindReceiveMessage &&
1187
+ self_->receive_message()->IsIdle()) {
1188
+ // Now that the receive message pump is idle (finished processing all
1189
+ // in-flight messages), we can finally release the trailing metadata.
1190
+ self_->recv_trailing_state_ = RecvTrailingState::kComplete;
1191
+ repoll_ = true;
1192
+ }
1125
1193
  }
1126
1194
  if (self_->server_initial_metadata_pipe() != nullptr) {
1127
1195
  if (self_->recv_initial_metadata_->metadata_push_.has_value()) {
@@ -1208,7 +1276,34 @@ class ClientCallData::PollContext {
1208
1276
  self_->send_message()->Done(*md, flusher_);
1209
1277
  }
1210
1278
  if (self_->receive_message() != nullptr) {
1211
- self_->receive_message()->Done(*md, flusher_);
1279
+ if (IsRecvMessageFilterBypassFixEnabled()) {
1280
+ // The promise produced its own terminal metadata while a
1281
+ // message was still in flight: the call is being
1282
+ // short-circuited, so that message is discarded rather than
1283
+ // delivered.
1284
+ self_->receive_message()->Done(*md, flusher_,
1285
+ /*discard_buffered_message=*/true);
1286
+ // Done() defers the completion closure to WakeInsideCombiner,
1287
+ // which already ran this poll. If the pump isn't idle, repoll to
1288
+ // drain it, else the call stalls.
1289
+ if (!self_->receive_message()->IsIdle()) {
1290
+ repoll_ = true;
1291
+ }
1292
+ // The promise terminated with its own (error) metadata while the
1293
+ // transport's trailing metadata was queued behind the receive
1294
+ // message pump. The buffered message was discarded above; since
1295
+ // receive_message()->IsIdle() will not become true until the
1296
+ // pending message completion callbacks execute, immediately
1297
+ // promote the queued trailing metadata to kComplete so the
1298
+ // synchronous handling below picks it up within this polling
1299
+ // pass.
1300
+ if (self_->recv_trailing_state_ ==
1301
+ RecvTrailingState::kCompletedQueuedBehindReceiveMessage) {
1302
+ self_->recv_trailing_state_ = RecvTrailingState::kComplete;
1303
+ }
1304
+ } else {
1305
+ self_->receive_message()->Done(*md, flusher_);
1306
+ }
1212
1307
  }
1213
1308
  if (self_->recv_trailing_state_ == RecvTrailingState::kComplete) {
1214
1309
  if (self_->recv_trailing_metadata_ != md.get()) {
@@ -1438,6 +1533,8 @@ const char* ClientCallData::StateString(RecvTrailingState state) {
1438
1533
  return "INITIAL";
1439
1534
  case RecvTrailingState::kQueued:
1440
1535
  return "QUEUED";
1536
+ case RecvTrailingState::kCompletedQueuedBehindReceiveMessage:
1537
+ return "QUEUED_BEHIND_RECEIVE_MESSAGE";
1441
1538
  case RecvTrailingState::kComplete:
1442
1539
  return "COMPLETE";
1443
1540
  case RecvTrailingState::kForwarded:
@@ -1645,7 +1742,8 @@ void ClientCallData::Cancel(grpc_error_handle error, Flusher* flusher) {
1645
1742
  send_message()->Done(*ServerMetadataFromStatus(error), flusher);
1646
1743
  }
1647
1744
  if (receive_message() != nullptr) {
1648
- receive_message()->Done(*ServerMetadataFromStatus(error), flusher);
1745
+ receive_message()->Done(*ServerMetadataFromStatus(error), flusher,
1746
+ /*discard_buffered_message=*/true);
1649
1747
  }
1650
1748
  }
1651
1749
 
@@ -1838,6 +1936,7 @@ Poll<ServerMetadataHandle> ClientCallData::PollTrailingMetadata() {
1838
1936
  case RecvTrailingState::kInitial:
1839
1937
  case RecvTrailingState::kQueued:
1840
1938
  case RecvTrailingState::kForwarded:
1939
+ case RecvTrailingState::kCompletedQueuedBehindReceiveMessage:
1841
1940
  // No trailing metadata yet: we are pending.
1842
1941
  // We return that and expect the promise to be repolled later (if it's
1843
1942
  // not cancelled).
@@ -1892,9 +1991,19 @@ void ClientCallData::RecvTrailingMetadataReady(grpc_error_handle error) {
1892
1991
  }
1893
1992
  // Record that we've got the callback.
1894
1993
  GRPC_CHECK(recv_trailing_state_ == RecvTrailingState::kForwarded);
1895
- recv_trailing_state_ = RecvTrailingState::kComplete;
1994
+ if (IsRecvMessageFilterBypassFixEnabled() && receive_message() != nullptr &&
1995
+ !receive_message()->IsIdle()) {
1996
+ // If the receive message pump is still active processing a message,
1997
+ // queue the trailing metadata until the pump goes idle to avoid bypassing
1998
+ // the message interceptors of filters higher in the stack.
1999
+ recv_trailing_state_ =
2000
+ RecvTrailingState::kCompletedQueuedBehindReceiveMessage;
2001
+ } else {
2002
+ recv_trailing_state_ = RecvTrailingState::kComplete;
2003
+ }
1896
2004
  if (receive_message() != nullptr) {
1897
- receive_message()->Done(*recv_trailing_metadata_, &flusher);
2005
+ receive_message()->Done(*recv_trailing_metadata_, &flusher,
2006
+ /*discard_buffered_message=*/!error.ok());
1898
2007
  }
1899
2008
  if (send_message() != nullptr) {
1900
2009
  send_message()->Done(*recv_trailing_metadata_, &flusher);
@@ -2208,13 +2317,15 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) {
2208
2317
  switch (send_trailing_state_) {
2209
2318
  case SendTrailingState::kInitial:
2210
2319
  send_trailing_metadata_batch_ = batch;
2320
+ // Server ends the RPC non-OK, so the app is done reading: any buffered
2321
+ // inbound (client->server) message has no consumer. Drop it.
2211
2322
  if (receive_message() != nullptr &&
2212
2323
  batch->payload->send_trailing_metadata.send_trailing_metadata
2213
2324
  ->get(GrpcStatusMetadata())
2214
2325
  .value_or(GRPC_STATUS_UNKNOWN) != GRPC_STATUS_OK) {
2215
2326
  receive_message()->Done(
2216
2327
  *batch->payload->send_trailing_metadata.send_trailing_metadata,
2217
- &flusher);
2328
+ &flusher, /* discard_buffered_message */ true);
2218
2329
  }
2219
2330
  if (send_message() != nullptr && !send_message()->IsIdle()) {
2220
2331
  send_trailing_state_ = SendTrailingState::kQueuedBehindSendMessage;
@@ -2317,7 +2428,8 @@ void ServerCallData::Completed(grpc_error_handle error,
2317
2428
  send_message()->Done(*ServerMetadataFromStatus(error), flusher);
2318
2429
  }
2319
2430
  if (receive_message() != nullptr) {
2320
- receive_message()->Done(*ServerMetadataFromStatus(error), flusher);
2431
+ receive_message()->Done(*ServerMetadataFromStatus(error), flusher,
2432
+ /* discard_buffered_message */ true);
2321
2433
  }
2322
2434
  }
2323
2435
 
@@ -1175,7 +1175,8 @@ MakeFilterCall(Derived* derived) {
1175
1175
  // failure (in which case the call will be aborted).
1176
1176
  // useful for cases where the exact metadata returned needs to be customized.
1177
1177
  // It's also acceptable to return a promise that resolves to the
1178
- // relevant return type listed above.
1178
+ // relevant return type listed above (except for OnClientToServerHalfClose
1179
+ // and OnServerTrailingMetadata, which must be synchronous).
1179
1180
  // Finally, OnFinalize can be added to intercept call finalization.
1180
1181
  // It must have one of the signatures:
1181
1182
  // - static inline const NoInterceptor OnFinalize:
@@ -1239,10 +1240,18 @@ struct ArenaContextType<V3InterceptorToV2State> {
1239
1240
  // Note that this bridge does not support the full functionality of the
1240
1241
  // v3 interceptor API. In particular, it assumes that the interceptor
1241
1242
  // will create exactly one child call.
1243
+ //
1244
+ // When not running in a v3 stack, the interceptor's Init() method will
1245
+ // not be called, but the wrapped destination will be set before the
1246
+ // ctor runs, so implementations must perform any necessary initialization
1247
+ // in their ctor instead.
1242
1248
  template <typename Derived>
1243
1249
  class V3InterceptorToV2Bridge : public ChannelFilter, public Interceptor {
1244
1250
  public:
1245
- V3InterceptorToV2Bridge() {
1251
+ explicit V3InterceptorToV2Bridge(ChannelArgs args) {
1252
+ // If running in a v3 stack, disable the bridge. The interceptor
1253
+ // will be used normally.
1254
+ if (args.GetBool(GRPC_ARG_USE_V3_STACK).value_or(false)) return;
1246
1255
  // Insert CallDestinationToNextV2Filter as the wrapped destination in
1247
1256
  // Interceptor, so that we can route the server side of the
1248
1257
  // interceptor back into the v2 filter chain.
@@ -1486,12 +1495,28 @@ class V3InterceptorToV2Bridge : public ChannelFilter, public Interceptor {
1486
1495
  call_args.client_initial_metadata = std::move(metadata);
1487
1496
  return Seq(
1488
1497
  next_promise_factory(std::move(call_args)),
1489
- [handler](ServerMetadataHandle metadata) mutable
1490
- -> Poll<ServerMetadataHandle> {
1498
+ [handler](ServerMetadataHandle metadata) mutable {
1491
1499
  handler.SpawnPushServerTrailingMetadata(
1492
1500
  std::move(metadata));
1501
+ // We return a lambda (promise) here instead of
1502
+ // returning `Pending{}` directly to make this
1503
+ // step safe for subsequent polls. During V2 call
1504
+ // teardown, cancellation of active streams
1505
+ // propagates through the V2 filter stack, which
1506
+ // wakes up this activity and triggers re-polls of
1507
+ // the bridge promise. If we returned `Pending{}`
1508
+ // directly, this factory lambda would be
1509
+ // re-evaluated on every poll, causing duplicate
1510
+ // calls to `SpawnPushServerTrailingMetadata` and
1511
+ // attempting to move from the already-moved
1512
+ // `metadata` parameter (leading to
1513
+ // crashes/undefined behavior). Returning the
1514
+ // inner lambda ensures that the side-effects in
1515
+ // this factory run exactly once, and subsequent
1516
+ // polls only execute the trivial,
1517
+ // side-effect-free inner lambda.
1493
1518
  // We always lose the race.
1494
- return Pending{};
1519
+ return Never<ServerMetadataHandle>();
1495
1520
  });
1496
1521
  });
1497
1522
  })),
@@ -1512,11 +1537,6 @@ class V3InterceptorToV2Bridge : public ChannelFilter, public Interceptor {
1512
1537
  });
1513
1538
  }
1514
1539
 
1515
- protected:
1516
- RefCountedPtr<UnstartedCallDestination> wrapped_destination() const {
1517
- return wrapped_destination_; // From Interceptor class.
1518
- }
1519
-
1520
1540
  private:
1521
1541
  // A custom UnstartedCallDestination that starts the call and returns
1522
1542
  // the resulting handler via a latch obtained from call context.
@@ -1867,7 +1887,14 @@ class BaseCallData : public Activity,
1867
1887
  // work.
1868
1888
  void WakeInsideCombiner(Flusher* flusher, bool allow_push_to_pipe);
1869
1889
  // Call is completed, we have trailing metadata. Close things out.
1870
- void Done(const ServerMetadata& metadata, Flusher* flusher);
1890
+ // discard_buffered_message: the call is being torn down (the promise
1891
+ // produced its own terminal metadata, an out-of-band cancellation, or a
1892
+ // server-initiated non-OK termination) and the receiver has stopped
1893
+ // reading, so drop any message buffered here instead of delivering it up
1894
+ // the stack.
1895
+ void Done(const ServerMetadata& metadata, Flusher* flusher,
1896
+ bool discard_buffered_message = false);
1897
+ bool IsIdle() const;
1871
1898
 
1872
1899
  channelz::PropertyList ChannelzProperties() {
1873
1900
  return channelz::PropertyList().Set("state", StateString(state_));
@@ -2026,6 +2053,9 @@ class ClientCallData : public BaseCallData {
2026
2053
  kQueued,
2027
2054
  // We've forwarded the op to the next filter.
2028
2055
  kForwarded,
2056
+ // Trailing metadata is received, but we queue it until the in-progress
2057
+ // receive message operation finishes.
2058
+ kCompletedQueuedBehindReceiveMessage,
2029
2059
  // The op has completed from below, but we haven't yet forwarded it up
2030
2060
  // (the promise gets to interject and mutate it).
2031
2061
  kComplete,
@@ -2324,7 +2354,7 @@ struct ChannelFilterWithFlagsMethods {
2324
2354
  args->config));
2325
2355
  if (!status.ok()) {
2326
2356
  new (elem->channel_data) F*(nullptr);
2327
- return absl_status_to_grpc_error(status.status());
2357
+ return status.status();
2328
2358
  }
2329
2359
  new (elem->channel_data) F*(status->release());
2330
2360
  return absl::OkStatus();
@@ -250,15 +250,14 @@ grpc_compression_options CompressionOptionsFromChannelArgs(
250
250
  Clamp(*default_level, static_cast<int>(GRPC_COMPRESS_LEVEL_NONE),
251
251
  static_cast<int>(GRPC_COMPRESS_LEVEL_COUNT - 1)));
252
252
  }
253
- auto default_algorithm =
253
+ std::optional<int> default_algorithm =
254
254
  args.GetInt(GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM);
255
255
  if (default_algorithm.has_value()) {
256
256
  compression_options.default_algorithm.is_set = true;
257
257
  compression_options.default_algorithm.algorithm =
258
- Clamp(static_cast<grpc_compression_algorithm>(*default_algorithm),
259
- GRPC_COMPRESS_NONE,
260
- static_cast<grpc_compression_algorithm>(
261
- GRPC_COMPRESS_ALGORITHMS_COUNT - 1));
258
+ static_cast<grpc_compression_algorithm>(
259
+ Clamp(*default_algorithm, static_cast<int>(GRPC_COMPRESS_NONE),
260
+ static_cast<int>(GRPC_COMPRESS_ALGORITHMS_COUNT - 1)));
262
261
  }
263
262
  auto enabled_algorithms_bitset =
264
263
  args.GetInt(GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET);