grpc 1.47.0 → 1.48.0.pre1

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 (574) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +105 -47
  3. data/include/grpc/compression.h +1 -1
  4. data/include/grpc/event_engine/event_engine.h +20 -11
  5. data/include/grpc/event_engine/slice_buffer.h +8 -2
  6. data/include/grpc/grpc.h +3 -3
  7. data/include/grpc/impl/codegen/compression_types.h +2 -1
  8. data/include/grpc/impl/codegen/connectivity_state.h +2 -1
  9. data/include/grpc/impl/codegen/gpr_types.h +2 -1
  10. data/include/grpc/impl/codegen/grpc_types.h +2 -1
  11. data/include/grpc/impl/codegen/port_platform.h +6 -3
  12. data/src/core/ext/filters/census/grpc_context.cc +3 -0
  13. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +17 -5
  14. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +16 -0
  15. data/src/core/ext/filters/channel_idle/idle_filter_state.h +2 -0
  16. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -1
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +2 -2
  18. data/src/core/ext/filters/client_channel/client_channel.cc +51 -65
  19. data/src/core/ext/filters/client_channel/client_channel.h +19 -4
  20. data/src/core/ext/filters/client_channel/config_selector.h +1 -1
  21. data/src/core/ext/filters/client_channel/connector.h +1 -1
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +6 -4
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +1 -1
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +2 -2
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +73 -43
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  29. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +0 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +33 -35
  31. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +106 -112
  32. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +91 -42
  33. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +177 -138
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +4 -1
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +47 -44
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +118 -103
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +83 -78
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +57 -67
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +2 -2
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -7
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +13 -17
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +3 -3
  43. data/src/core/ext/filters/client_channel/lb_policy.h +0 -7
  44. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +3 -5
  45. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -1
  46. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +6 -6
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +5 -5
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -5
  50. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +12 -3
  51. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +5 -5
  52. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +3 -4
  53. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +1 -1
  54. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -0
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +24 -15
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -7
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +35 -36
  59. data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
  60. data/src/core/ext/filters/client_channel/retry_service_config.cc +4 -4
  61. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -1
  62. data/src/core/ext/filters/client_channel/subchannel.cc +53 -50
  63. data/src/core/ext/filters/client_channel/subchannel.h +6 -22
  64. data/src/core/ext/filters/client_channel/subchannel_interface.h +10 -18
  65. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +12 -97
  66. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +5 -9
  67. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -7
  68. data/src/core/ext/filters/deadline/deadline_filter.h +8 -1
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +21 -2
  70. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +8 -3
  71. data/src/core/ext/filters/fault_injection/service_config_parser.cc +7 -4
  72. data/src/core/ext/filters/fault_injection/service_config_parser.h +17 -3
  73. data/src/core/ext/filters/http/client/http_client_filter.cc +16 -5
  74. data/src/core/ext/filters/http/client/http_client_filter.h +8 -1
  75. data/src/core/ext/filters/http/client_authority_filter.cc +11 -10
  76. data/src/core/ext/filters/http/client_authority_filter.h +5 -2
  77. data/src/core/ext/filters/http/http_filters_plugin.cc +9 -1
  78. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +64 -187
  79. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
  80. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +42 -106
  81. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
  82. data/src/core/ext/filters/http/server/http_server_filter.cc +16 -9
  83. data/src/core/ext/filters/http/server/http_server_filter.h +6 -1
  84. data/src/core/ext/filters/message_size/message_size_filter.cc +25 -15
  85. data/src/core/ext/filters/message_size/message_size_filter.h +13 -0
  86. data/src/core/ext/filters/rbac/rbac_filter.cc +14 -3
  87. data/src/core/ext/filters/rbac/rbac_filter.h +8 -0
  88. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +13 -2
  89. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +14 -2
  90. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +1 -0
  91. data/src/core/ext/filters/server_config_selector/server_config_selector.h +9 -0
  92. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +22 -2
  93. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +1 -0
  94. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -4
  95. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +15 -15
  96. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +196 -476
  97. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -1
  98. data/src/core/ext/transport/chttp2/transport/flow_control.cc +141 -261
  99. data/src/core/ext/transport/chttp2/transport/flow_control.h +176 -289
  100. data/src/core/ext/transport/chttp2/transport/frame_data.cc +57 -215
  101. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -36
  102. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +0 -41
  103. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -12
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -6
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +0 -2
  106. data/src/core/ext/transport/chttp2/transport/internal.h +9 -111
  107. data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -38
  108. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +0 -4
  109. data/src/core/ext/transport/chttp2/transport/writing.cc +18 -21
  110. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -1
  111. data/src/core/ext/transport/inproc/inproc_transport.cc +85 -81
  112. data/src/core/ext/transport/inproc/inproc_transport.h +3 -1
  113. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
  114. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +164 -0
  115. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  116. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +94 -0
  117. data/src/core/ext/xds/certificate_provider_factory.h +6 -1
  118. data/src/core/ext/xds/certificate_provider_registry.cc +8 -8
  119. data/src/core/ext/xds/certificate_provider_registry.h +3 -1
  120. data/src/core/ext/xds/certificate_provider_store.cc +2 -0
  121. data/src/core/ext/xds/certificate_provider_store.h +9 -0
  122. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +9 -0
  123. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +8 -0
  124. data/src/core/ext/xds/upb_utils.h +1 -2
  125. data/src/core/ext/xds/xds_api.cc +16 -18
  126. data/src/core/ext/xds/xds_api.h +12 -5
  127. data/src/core/ext/xds/xds_bootstrap.cc +37 -24
  128. data/src/core/ext/xds/xds_bootstrap.h +9 -11
  129. data/src/core/ext/xds/xds_certificate_provider.cc +12 -3
  130. data/src/core/ext/xds/xds_certificate_provider.h +16 -1
  131. data/src/core/ext/xds/xds_channel_stack_modifier.cc +9 -0
  132. data/src/core/ext/xds/xds_channel_stack_modifier.h +5 -1
  133. data/src/core/ext/xds/xds_client.cc +71 -22
  134. data/src/core/ext/xds/xds_client.h +17 -3
  135. data/src/core/ext/xds/xds_client_stats.cc +3 -4
  136. data/src/core/ext/xds/xds_client_stats.h +4 -3
  137. data/src/core/ext/xds/xds_cluster.cc +21 -10
  138. data/src/core/ext/xds/xds_cluster.h +9 -1
  139. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +16 -7
  140. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -8
  141. data/src/core/ext/xds/xds_common_types.cc +36 -22
  142. data/src/core/ext/xds/xds_common_types.h +12 -4
  143. data/src/core/ext/xds/xds_endpoint.cc +25 -15
  144. data/src/core/ext/xds/xds_endpoint.h +13 -5
  145. data/src/core/ext/xds/xds_http_fault_filter.cc +7 -5
  146. data/src/core/ext/xds/xds_http_fault_filter.h +3 -1
  147. data/src/core/ext/xds/xds_http_filters.cc +7 -0
  148. data/src/core/ext/xds/xds_http_filters.h +3 -3
  149. data/src/core/ext/xds/xds_http_rbac_filter.cc +16 -0
  150. data/src/core/ext/xds/xds_http_rbac_filter.h +7 -0
  151. data/src/core/ext/xds/xds_lb_policy_registry.cc +291 -0
  152. data/src/core/ext/xds/xds_lb_policy_registry.h +72 -0
  153. data/src/core/ext/xds/xds_listener.cc +51 -33
  154. data/src/core/ext/xds/xds_listener.h +10 -1
  155. data/src/core/ext/xds/xds_resource_type.h +3 -3
  156. data/src/core/ext/xds/xds_resource_type_impl.h +7 -3
  157. data/src/core/ext/xds/xds_route_config.cc +56 -28
  158. data/src/core/ext/xds/xds_route_config.h +11 -2
  159. data/src/core/ext/xds/xds_routing.cc +16 -0
  160. data/src/core/ext/xds/xds_routing.h +7 -2
  161. data/src/core/ext/xds/xds_server_config_fetcher.cc +54 -6
  162. data/src/core/lib/address_utils/parse_address.cc +5 -8
  163. data/src/core/lib/address_utils/parse_address.h +3 -2
  164. data/src/core/lib/address_utils/sockaddr_utils.cc +8 -7
  165. data/src/core/lib/address_utils/sockaddr_utils.h +2 -0
  166. data/src/core/lib/avl/avl.h +3 -3
  167. data/src/core/lib/backoff/backoff.cc +1 -1
  168. data/src/core/lib/backoff/backoff.h +1 -1
  169. data/src/core/lib/channel/call_tracer.h +3 -3
  170. data/src/core/lib/channel/channel_args.h +1 -0
  171. data/src/core/lib/channel/channel_args_preconditioning.cc +1 -0
  172. data/src/core/lib/channel/channel_fwd.h +26 -0
  173. data/src/core/lib/channel/channel_stack.cc +4 -4
  174. data/src/core/lib/channel/channel_stack.h +1 -11
  175. data/src/core/lib/channel/channel_stack_builder.h +2 -5
  176. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  177. data/src/core/lib/channel/channel_stack_builder_impl.h +1 -0
  178. data/src/core/lib/channel/channelz.cc +2 -1
  179. data/src/core/lib/channel/channelz.h +2 -3
  180. data/src/core/lib/channel/channelz_registry.cc +4 -5
  181. data/src/core/lib/channel/connected_channel.cc +1 -0
  182. data/src/core/lib/channel/connected_channel.h +1 -0
  183. data/src/core/lib/channel/promise_based_filter.cc +11 -5
  184. data/src/core/lib/channel/promise_based_filter.h +2 -0
  185. data/src/core/lib/compression/compression.cc +6 -1
  186. data/src/core/lib/compression/compression_internal.cc +3 -6
  187. data/src/core/lib/compression/compression_internal.h +3 -2
  188. data/src/core/lib/compression/message_compress.cc +3 -1
  189. data/src/core/lib/compression/message_compress.h +2 -3
  190. data/src/core/lib/debug/stats.cc +9 -9
  191. data/src/core/lib/debug/stats.h +2 -1
  192. data/src/core/lib/debug/stats_data.cc +2 -1
  193. data/src/core/lib/debug/stats_data.h +0 -4
  194. data/src/core/lib/debug/trace.h +13 -12
  195. data/src/core/lib/event_engine/default_event_engine_factory.cc +1 -1
  196. data/src/core/lib/event_engine/event_engine.cc +24 -19
  197. data/src/core/lib/event_engine/event_engine_factory.h +2 -2
  198. data/src/core/lib/event_engine/{iomgr_engine.cc → iomgr_engine/iomgr_engine.cc} +44 -91
  199. data/src/core/lib/event_engine/{iomgr_engine.h → iomgr_engine/iomgr_engine.h} +20 -16
  200. data/src/core/lib/event_engine/iomgr_engine/thread_pool.cc +123 -0
  201. data/src/core/lib/event_engine/iomgr_engine/thread_pool.h +70 -0
  202. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc +62 -0
  203. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h +81 -0
  204. data/src/core/lib/event_engine/iomgr_engine/timer.cc +312 -0
  205. data/src/core/lib/event_engine/iomgr_engine/timer.h +193 -0
  206. data/src/core/lib/event_engine/iomgr_engine/timer_heap.cc +107 -0
  207. data/src/core/lib/event_engine/iomgr_engine/timer_heap.h +56 -0
  208. data/src/core/lib/event_engine/iomgr_engine/timer_manager.cc +254 -0
  209. data/src/core/lib/event_engine/iomgr_engine/timer_manager.h +111 -0
  210. data/src/core/lib/event_engine/promise.h +69 -0
  211. data/src/core/lib/gpr/time_posix.cc +6 -9
  212. data/src/core/lib/gpr/time_windows.cc +10 -7
  213. data/src/core/lib/gprpp/manual_constructor.h +0 -67
  214. data/src/core/lib/gprpp/status_helper.cc +44 -30
  215. data/src/core/lib/gprpp/time.cc +8 -0
  216. data/src/core/lib/gprpp/time.h +4 -0
  217. data/src/core/lib/http/format_request.cc +5 -4
  218. data/src/core/lib/http/format_request.h +1 -1
  219. data/src/core/lib/http/httpcli.cc +18 -12
  220. data/src/core/lib/http/httpcli.h +19 -3
  221. data/src/core/lib/http/httpcli_security_connector.cc +16 -4
  222. data/src/core/lib/http/httpcli_ssl_credentials.h +3 -1
  223. data/src/core/lib/http/parser.cc +6 -7
  224. data/src/core/lib/http/parser.h +3 -0
  225. data/src/core/lib/iomgr/call_combiner.cc +2 -2
  226. data/src/core/lib/iomgr/endpoint.h +1 -1
  227. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -2
  228. data/src/core/lib/iomgr/error.cc +11 -9
  229. data/src/core/lib/iomgr/error.h +9 -5
  230. data/src/core/lib/iomgr/ev_epoll1_linux.cc +57 -18
  231. data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
  232. data/src/core/lib/iomgr/ev_poll_posix.cc +77 -52
  233. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  234. data/src/core/lib/iomgr/ev_posix.cc +54 -92
  235. data/src/core/lib/iomgr/ev_posix.h +5 -3
  236. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  237. data/src/core/lib/iomgr/iomgr.cc +7 -0
  238. data/src/core/lib/iomgr/iomgr_posix.cc +1 -0
  239. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -0
  240. data/src/core/lib/iomgr/load_file.cc +1 -1
  241. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -1
  242. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  243. data/src/core/lib/iomgr/tcp_client.cc +12 -7
  244. data/src/core/lib/iomgr/tcp_client.h +24 -13
  245. data/src/core/lib/iomgr/tcp_client_cfstream.cc +15 -9
  246. data/src/core/lib/iomgr/tcp_client_posix.cc +143 -25
  247. data/src/core/lib/iomgr/tcp_client_posix.h +1 -1
  248. data/src/core/lib/iomgr/tcp_client_windows.cc +14 -10
  249. data/src/core/lib/iomgr/tcp_posix.cc +91 -29
  250. data/src/core/lib/iomgr/tcp_server_posix.cc +7 -7
  251. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +12 -12
  252. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  253. data/src/core/lib/iomgr/tcp_server_windows.cc +7 -7
  254. data/src/core/lib/iomgr/tcp_windows.cc +5 -5
  255. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  256. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  257. data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
  258. data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
  259. data/src/core/lib/iomgr/work_serializer.h +2 -3
  260. data/src/core/lib/matchers/matchers.cc +6 -3
  261. data/src/core/lib/matchers/matchers.h +2 -0
  262. data/src/core/lib/promise/activity.cc +0 -1
  263. data/src/core/lib/promise/activity.h +7 -13
  264. data/src/core/lib/promise/loop.h +1 -0
  265. data/src/core/lib/promise/promise.h +1 -0
  266. data/src/core/lib/promise/sleep.cc +36 -31
  267. data/src/core/lib/promise/sleep.h +25 -25
  268. data/src/core/lib/resolver/resolver.cc +5 -0
  269. data/src/core/lib/resolver/resolver.h +3 -0
  270. data/src/core/lib/resolver/resolver_factory.h +5 -2
  271. data/src/core/lib/resolver/resolver_registry.cc +2 -9
  272. data/src/core/lib/resolver/resolver_registry.h +12 -1
  273. data/src/core/lib/resolver/server_address.cc +8 -0
  274. data/src/core/lib/resolver/server_address.h +9 -2
  275. data/src/core/lib/resource_quota/memory_quota.cc +18 -60
  276. data/src/core/lib/resource_quota/memory_quota.h +11 -25
  277. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  278. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
  279. data/src/core/lib/security/authorization/evaluate_args.cc +9 -3
  280. data/src/core/lib/security/authorization/evaluate_args.h +6 -3
  281. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +6 -0
  282. data/src/core/lib/security/authorization/grpc_authorization_engine.h +7 -0
  283. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +12 -0
  284. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +12 -1
  285. data/src/core/lib/security/authorization/matchers.cc +9 -1
  286. data/src/core/lib/security/authorization/matchers.h +7 -0
  287. data/src/core/lib/security/authorization/rbac_policy.cc +5 -0
  288. data/src/core/lib/security/authorization/rbac_policy.h +7 -0
  289. data/src/core/lib/security/context/security_context.cc +5 -2
  290. data/src/core/lib/security/context/security_context.h +14 -2
  291. data/src/core/lib/security/credentials/alts/alts_credentials.cc +4 -2
  292. data/src/core/lib/security/credentials/alts/alts_credentials.h +6 -1
  293. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
  294. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
  295. data/src/core/lib/security/credentials/call_creds_util.cc +8 -0
  296. data/src/core/lib/security/credentials/call_creds_util.h +1 -0
  297. data/src/core/lib/security/credentials/channel_creds_registry.h +6 -1
  298. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +10 -0
  299. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  300. data/src/core/lib/security/credentials/composite/composite_credentials.h +16 -2
  301. data/src/core/lib/security/credentials/credentials.cc +4 -8
  302. data/src/core/lib/security/credentials/credentials.h +10 -8
  303. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +28 -10
  304. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +10 -0
  305. data/src/core/lib/security/credentials/external/aws_request_signer.cc +9 -0
  306. data/src/core/lib/security/credentials/external/external_account_credentials.cc +24 -9
  307. data/src/core/lib/security/credentials/external/external_account_credentials.h +11 -0
  308. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +12 -4
  309. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
  310. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -4
  311. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +10 -0
  312. data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -6
  313. data/src/core/lib/security/credentials/fake/fake_credentials.h +13 -1
  314. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -0
  315. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -10
  316. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +10 -1
  317. data/src/core/lib/security/credentials/iam/iam_credentials.cc +9 -3
  318. data/src/core/lib/security/credentials/iam/iam_credentials.h +10 -0
  319. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +4 -0
  320. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +5 -0
  321. data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
  322. data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
  323. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +11 -5
  324. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +14 -0
  325. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +28 -3
  326. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -2
  327. data/src/core/lib/security/credentials/local/local_credentials.cc +4 -3
  328. data/src/core/lib/security/credentials/local/local_credentials.h +7 -0
  329. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +26 -13
  330. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +20 -0
  331. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -7
  332. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +24 -0
  333. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -0
  334. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +13 -0
  335. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +6 -6
  336. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -3
  337. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -10
  338. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +9 -4
  339. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +9 -2
  340. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +6 -7
  341. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -5
  342. data/src/core/lib/security/credentials/tls/tls_credentials.cc +7 -2
  343. data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -1
  344. data/src/core/lib/security/credentials/tls/tls_utils.cc +2 -0
  345. data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
  346. data/src/core/lib/security/credentials/xds/xds_credentials.cc +8 -1
  347. data/src/core/lib/security/credentials/xds/xds_credentials.h +14 -0
  348. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +22 -2
  349. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +6 -3
  350. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +17 -1
  351. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
  352. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +9 -0
  353. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +17 -2
  354. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
  355. data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +27 -19
  356. data/src/core/lib/security/security_connector/{load_system_roots_linux.h → load_system_roots_supported.h} +5 -5
  357. data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -3
  358. data/src/core/lib/security/security_connector/local/local_security_connector.h +6 -2
  359. data/src/core/lib/security/security_connector/security_connector.cc +20 -18
  360. data/src/core/lib/security/security_connector/security_connector.h +18 -6
  361. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -6
  362. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
  363. data/src/core/lib/security/security_connector/ssl_utils.cc +12 -2
  364. data/src/core/lib/security/security_connector/ssl_utils.h +10 -7
  365. data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
  366. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -13
  367. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +23 -3
  368. data/src/core/lib/security/transport/auth_filters.h +7 -0
  369. data/src/core/lib/security/transport/client_auth_filter.cc +18 -9
  370. data/src/core/lib/security/transport/secure_endpoint.cc +63 -13
  371. data/src/core/lib/security/transport/secure_endpoint.h +4 -3
  372. data/src/core/lib/security/transport/security_handshaker.cc +44 -11
  373. data/src/core/lib/security/transport/security_handshaker.h +4 -0
  374. data/src/core/lib/security/transport/server_auth_filter.cc +26 -4
  375. data/src/core/lib/security/util/json_util.cc +3 -2
  376. data/src/core/lib/security/util/json_util.h +0 -2
  377. data/src/core/lib/service_config/service_config_call_data.h +2 -1
  378. data/src/core/lib/service_config/service_config_impl.cc +6 -6
  379. data/src/core/lib/service_config/service_config_impl.h +1 -3
  380. data/src/core/lib/service_config/service_config_parser.cc +2 -4
  381. data/src/core/lib/slice/slice_buffer.cc +30 -1
  382. data/src/core/lib/slice/slice_buffer.h +37 -6
  383. data/src/core/lib/slice/slice_string_helpers.cc +0 -20
  384. data/src/core/lib/slice/slice_string_helpers.h +0 -4
  385. data/src/core/lib/surface/call.cc +53 -115
  386. data/src/core/lib/surface/call.h +5 -1
  387. data/src/core/lib/surface/channel.h +2 -0
  388. data/src/core/lib/surface/channel_ping.cc +1 -1
  389. data/src/core/lib/surface/completion_queue.cc +15 -14
  390. data/src/core/lib/surface/completion_queue.h +2 -1
  391. data/src/core/lib/surface/init.cc +0 -1
  392. data/src/core/lib/surface/lame_client.cc +1 -1
  393. data/src/core/lib/surface/lame_client.h +1 -1
  394. data/src/core/lib/surface/server.cc +14 -8
  395. data/src/core/lib/surface/server.h +4 -1
  396. data/src/core/lib/surface/validate_metadata.cc +1 -1
  397. data/src/core/lib/surface/version.cc +2 -2
  398. data/src/core/lib/transport/error_utils.cc +13 -7
  399. data/src/core/lib/transport/handshaker.cc +3 -3
  400. data/src/core/lib/transport/http_connect_handshaker.cc +4 -4
  401. data/src/core/lib/transport/tcp_connect_handshaker.cc +2 -2
  402. data/src/core/lib/transport/transport.cc +0 -3
  403. data/src/core/lib/transport/transport.h +20 -14
  404. data/src/core/lib/transport/transport_fwd.h +20 -0
  405. data/src/core/lib/transport/transport_impl.h +1 -0
  406. data/src/core/lib/transport/transport_op_string.cc +9 -9
  407. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  408. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +9 -1
  409. data/src/core/tsi/fake_transport_security.cc +13 -1
  410. data/src/core/tsi/fake_transport_security.h +6 -0
  411. data/src/core/tsi/ssl_transport_security.cc +1 -1
  412. data/src/core/tsi/transport_security_grpc.cc +3 -2
  413. data/src/core/tsi/transport_security_grpc.h +5 -2
  414. data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
  415. data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
  416. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  417. data/src/ruby/ext/grpc/ext-export.gcc +1 -0
  418. data/src/ruby/ext/grpc/extconf.rb +49 -18
  419. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  420. data/src/ruby/lib/grpc/errors.rb +1 -1
  421. data/src/ruby/lib/grpc/version.rb +1 -1
  422. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  423. data/third_party/abseil-cpp/absl/algorithm/container.h +1 -1
  424. data/third_party/abseil-cpp/absl/base/attributes.h +49 -22
  425. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  426. data/third_party/abseil-cpp/absl/base/config.h +182 -41
  427. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  428. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
  429. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
  430. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  431. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
  432. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  433. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  434. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
  435. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
  436. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
  437. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +8 -0
  438. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  439. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  440. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  441. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +0 -1
  442. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  443. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
  444. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -3
  445. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  446. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  447. data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
  448. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  449. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  450. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -0
  451. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  452. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +15 -9
  453. data/third_party/abseil-cpp/absl/container/inlined_vector.h +20 -9
  454. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
  455. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
  456. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +68 -20
  457. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +29 -11
  458. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +59 -38
  459. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +4 -0
  460. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +515 -184
  461. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  462. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +4 -0
  463. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
  464. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
  465. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  466. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
  467. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  468. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +20 -18
  469. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
  470. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +15 -2
  471. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
  472. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +46 -7
  473. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  474. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
  475. data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
  476. data/third_party/abseil-cpp/absl/hash/internal/hash.h +218 -23
  477. data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
  478. data/third_party/abseil-cpp/absl/numeric/int128.cc +4 -2
  479. data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
  480. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +21 -6
  481. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
  482. data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
  483. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
  484. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +2 -1
  485. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
  486. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
  487. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +1 -1
  488. data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
  489. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
  490. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
  491. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
  492. data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
  493. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
  494. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
  495. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
  496. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
  497. data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
  498. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
  499. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  500. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
  501. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +17 -0
  502. data/third_party/abseil-cpp/absl/status/status.cc +174 -2
  503. data/third_party/abseil-cpp/absl/status/status.h +22 -12
  504. data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
  505. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  506. data/third_party/abseil-cpp/absl/strings/cord.cc +194 -913
  507. data/third_party/abseil-cpp/absl/strings/cord.h +202 -81
  508. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  509. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  510. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  511. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
  512. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  513. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
  514. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +123 -88
  515. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +149 -49
  516. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +44 -59
  517. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +3 -1
  518. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
  519. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
  520. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
  521. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
  522. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
  523. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
  524. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
  525. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
  526. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +11 -38
  527. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +1 -0
  528. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
  529. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
  530. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
  531. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
  532. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -1
  533. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +38 -7
  534. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
  535. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +4 -5
  536. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +5 -2
  537. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  538. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  539. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  540. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  541. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  542. data/third_party/abseil-cpp/absl/strings/numbers.cc +8 -8
  543. data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
  544. data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
  545. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  546. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  547. data/third_party/abseil-cpp/absl/strings/string_view.cc +2 -13
  548. data/third_party/abseil-cpp/absl/strings/string_view.h +3 -2
  549. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  550. data/third_party/abseil-cpp/absl/strings/substitute.h +10 -2
  551. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  552. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  553. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  554. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  555. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
  556. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  557. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
  558. data/third_party/abseil-cpp/absl/synchronization/mutex.h +17 -9
  559. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
  560. data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
  561. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  562. data/third_party/abseil-cpp/absl/time/time.h +16 -12
  563. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  564. data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
  565. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  566. data/third_party/abseil-cpp/absl/types/span.h +2 -1
  567. metadata +39 -15
  568. data/src/core/lib/slice/slice_split.cc +0 -103
  569. data/src/core/lib/slice/slice_split.h +0 -36
  570. data/src/core/lib/transport/byte_stream.cc +0 -165
  571. data/src/core/lib/transport/byte_stream.h +0 -170
  572. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +0 -140
  573. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +0 -100
  574. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -54,7 +54,7 @@ namespace {
54
54
 
55
55
  absl::optional<std::string> ParseHealthCheckConfig(const Json& field,
56
56
  grpc_error_handle* error) {
57
- GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
57
+ GPR_DEBUG_ASSERT(error != nullptr && GRPC_ERROR_IS_NONE(*error));
58
58
  if (field.type() != Json::Type::OBJECT) {
59
59
  *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
60
60
  "field:healthCheckConfig error:should be of type object");
@@ -82,7 +82,7 @@ std::unique_ptr<ServiceConfigParser::ParsedConfig>
82
82
  ClientChannelServiceConfigParser::ParseGlobalParams(
83
83
  const grpc_channel_args* /*args*/, const Json& json,
84
84
  grpc_error_handle* error) {
85
- GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
85
+ GPR_DEBUG_ASSERT(error != nullptr && GRPC_ERROR_IS_NONE(*error));
86
86
  std::vector<grpc_error_handle> error_list;
87
87
  // Parse LB config.
88
88
  RefCountedPtr<LoadBalancingPolicy::Config> parsed_lb_config;
@@ -91,7 +91,7 @@ ClientChannelServiceConfigParser::ParseGlobalParams(
91
91
  grpc_error_handle parse_error = GRPC_ERROR_NONE;
92
92
  parsed_lb_config = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
93
93
  it->second, &parse_error);
94
- if (parse_error != GRPC_ERROR_NONE) {
94
+ if (!GRPC_ERROR_IS_NONE(parse_error)) {
95
95
  std::vector<grpc_error_handle> lb_errors;
96
96
  lb_errors.push_back(parse_error);
97
97
  error_list.push_back(GRPC_ERROR_CREATE_FROM_VECTOR(
@@ -130,13 +130,13 @@ ClientChannelServiceConfigParser::ParseGlobalParams(
130
130
  grpc_error_handle parsing_error = GRPC_ERROR_NONE;
131
131
  health_check_service_name =
132
132
  ParseHealthCheckConfig(it->second, &parsing_error);
133
- if (parsing_error != GRPC_ERROR_NONE) {
133
+ if (!GRPC_ERROR_IS_NONE(parsing_error)) {
134
134
  error_list.push_back(parsing_error);
135
135
  }
136
136
  }
137
137
  *error = GRPC_ERROR_CREATE_FROM_VECTOR("Client channel global parser",
138
138
  &error_list);
139
- if (*error == GRPC_ERROR_NONE) {
139
+ if (GRPC_ERROR_IS_NONE(*error)) {
140
140
  return absl::make_unique<ClientChannelGlobalParsedConfig>(
141
141
  std::move(parsed_lb_config), std::move(lb_policy_name),
142
142
  std::move(health_check_service_name));
@@ -148,7 +148,7 @@ std::unique_ptr<ServiceConfigParser::ParsedConfig>
148
148
  ClientChannelServiceConfigParser::ParsePerMethodParams(
149
149
  const grpc_channel_args* /*args*/, const Json& json,
150
150
  grpc_error_handle* error) {
151
- GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
151
+ GPR_DEBUG_ASSERT(error != nullptr && GRPC_ERROR_IS_NONE(*error));
152
152
  std::vector<grpc_error_handle> error_list;
153
153
  // Parse waitForReady.
154
154
  absl::optional<bool> wait_for_ready;
@@ -169,7 +169,7 @@ ClientChannelServiceConfigParser::ParsePerMethodParams(
169
169
  &error_list, false);
170
170
  // Return result.
171
171
  *error = GRPC_ERROR_CREATE_FROM_VECTOR("Client channel parser", &error_list);
172
- if (*error == GRPC_ERROR_NONE) {
172
+ if (GRPC_ERROR_IS_NONE(*error)) {
173
173
  return absl::make_unique<ClientChannelMethodParsedConfig>(timeout,
174
174
  wait_for_ready);
175
175
  }
@@ -33,6 +33,7 @@
33
33
  #include "absl/strings/string_view.h"
34
34
  #include "absl/strings/strip.h"
35
35
  #include "absl/types/optional.h"
36
+ #include "absl/utility/utility.h"
36
37
 
37
38
  #include <grpc/impl/codegen/grpc_types.h>
38
39
  #include <grpc/slice.h>
@@ -47,13 +48,12 @@
47
48
  #include "src/core/lib/backoff/backoff.h"
48
49
  #include "src/core/lib/channel/channel_args.h"
49
50
  #include "src/core/lib/channel/channel_stack.h"
50
- #include "src/core/lib/channel/channel_stack_builder.h"
51
51
  #include "src/core/lib/channel/context.h"
52
52
  #include "src/core/lib/channel/status_util.h"
53
53
  #include "src/core/lib/debug/trace.h"
54
54
  #include "src/core/lib/gpr/useful.h"
55
+ #include "src/core/lib/gprpp/construct_destruct.h"
55
56
  #include "src/core/lib/gprpp/debug_location.h"
56
- #include "src/core/lib/gprpp/manual_constructor.h"
57
57
  #include "src/core/lib/gprpp/orphanable.h"
58
58
  #include "src/core/lib/gprpp/ref_counted.h"
59
59
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
@@ -67,8 +67,8 @@
67
67
  #include "src/core/lib/resource_quota/arena.h"
68
68
  #include "src/core/lib/service_config/service_config.h"
69
69
  #include "src/core/lib/service_config/service_config_call_data.h"
70
+ #include "src/core/lib/slice/slice_buffer.h"
70
71
  #include "src/core/lib/slice/slice_refcount.h"
71
- #include "src/core/lib/transport/byte_stream.h"
72
72
  #include "src/core/lib/transport/error_utils.h"
73
73
  #include "src/core/lib/transport/metadata_batch.h"
74
74
  #include "src/core/lib/transport/transport.h"
@@ -457,9 +457,6 @@ class RetryFilter::CallData {
457
457
  grpc_transport_stream_op_batch_payload batch_payload_;
458
458
  // For send_initial_metadata.
459
459
  grpc_metadata_batch send_initial_metadata_{calld_->arena_};
460
- // For send_message.
461
- // TODO(roth): Restructure this to eliminate use of ManualConstructor.
462
- ManualConstructor<ByteStreamCache::CachingByteStream> send_message_;
463
460
  // For send_trailing_metadata.
464
461
  grpc_metadata_batch send_trailing_metadata_{calld_->arena_};
465
462
  // For intercepting recv_initial_metadata.
@@ -468,7 +465,8 @@ class RetryFilter::CallData {
468
465
  bool trailing_metadata_available_ = false;
469
466
  // For intercepting recv_message.
470
467
  grpc_closure recv_message_ready_;
471
- OrphanablePtr<ByteStream> recv_message_;
468
+ absl::optional<SliceBuffer> recv_message_;
469
+ uint32_t recv_message_flags_;
472
470
  // For intercepting recv_trailing_metadata.
473
471
  grpc_metadata_batch recv_trailing_metadata_{calld_->arena_};
474
472
  grpc_transport_stream_stats collect_stats_;
@@ -629,11 +627,11 @@ class RetryFilter::CallData {
629
627
  // Note: We inline the cache for the first 3 send_message ops and use
630
628
  // dynamic allocation after that. This number was essentially picked
631
629
  // at random; it could be changed in the future to tune performance.
632
- // TODO(roth): As part of implementing hedging, we may need some
633
- // synchronization here, since ByteStreamCache does not provide any
634
- // synchronization, so it's not safe to have multiple
635
- // CachingByteStreams read from the same ByteStreamCache concurrently.
636
- absl::InlinedVector<ByteStreamCache*, 3> send_messages_;
630
+ struct CachedSendMessage {
631
+ SliceBuffer* slices;
632
+ uint32_t flags;
633
+ };
634
+ absl::InlinedVector<CachedSendMessage, 3> send_messages_;
637
635
  // send_trailing_metadata
638
636
  bool seen_send_trailing_metadata_ = false;
639
637
  grpc_metadata_batch send_trailing_metadata_{arena_};
@@ -1282,7 +1280,7 @@ void RetryFilter::CallData::CallAttempt::OnPerAttemptRecvTimerLocked(
1282
1280
  call_attempt->per_attempt_recv_timer_pending_);
1283
1281
  }
1284
1282
  CallCombinerClosureList closures;
1285
- if (error == GRPC_ERROR_NONE &&
1283
+ if (GRPC_ERROR_IS_NONE(error) &&
1286
1284
  call_attempt->per_attempt_recv_timer_pending_) {
1287
1285
  call_attempt->per_attempt_recv_timer_pending_ = false;
1288
1286
  // Cancel this attempt.
@@ -1454,7 +1452,7 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvInitialMetadataReady(
1454
1452
  // callback back to the surface. We can evaluate whether to retry when
1455
1453
  // recv_trailing_metadata comes back.
1456
1454
  if (GPR_UNLIKELY((call_attempt->trailing_metadata_available_ ||
1457
- error != GRPC_ERROR_NONE) &&
1455
+ !GRPC_ERROR_IS_NONE(error)) &&
1458
1456
  !call_attempt->completed_recv_trailing_metadata_)) {
1459
1457
  if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
1460
1458
  gpr_log(GPR_INFO,
@@ -1466,7 +1464,7 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvInitialMetadataReady(
1466
1464
  std::move(batch_data);
1467
1465
  call_attempt->recv_initial_metadata_error_ = GRPC_ERROR_REF(error);
1468
1466
  CallCombinerClosureList closures;
1469
- if (error != GRPC_ERROR_NONE) {
1467
+ if (!GRPC_ERROR_IS_NONE(error)) {
1470
1468
  call_attempt->MaybeAddBatchForCancelOp(GRPC_ERROR_REF(error),
1471
1469
  &closures);
1472
1470
  }
@@ -1512,6 +1510,8 @@ void RetryFilter::CallData::CallAttempt::BatchData::
1512
1510
  // Return payload.
1513
1511
  *pending->batch->payload->recv_message.recv_message =
1514
1512
  std::move(call_attempt_->recv_message_);
1513
+ *pending->batch->payload->recv_message.flags =
1514
+ call_attempt_->recv_message_flags_;
1515
1515
  // Update bookkeeping.
1516
1516
  // Note: Need to do this before invoking the callback, since invoking
1517
1517
  // the callback will result in yielding the call combiner.
@@ -1556,8 +1556,8 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvMessageReady(
1556
1556
  // the recv_trailing_metadata_ready callback, then defer propagating this
1557
1557
  // callback back to the surface. We can evaluate whether to retry when
1558
1558
  // recv_trailing_metadata comes back.
1559
- if (GPR_UNLIKELY((call_attempt->recv_message_ == nullptr ||
1560
- error != GRPC_ERROR_NONE) &&
1559
+ if (GPR_UNLIKELY((!call_attempt->recv_message_.has_value() ||
1560
+ !GRPC_ERROR_IS_NONE(error)) &&
1561
1561
  !call_attempt->completed_recv_trailing_metadata_)) {
1562
1562
  if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
1563
1563
  gpr_log(GPR_INFO,
@@ -1568,7 +1568,7 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvMessageReady(
1568
1568
  call_attempt->recv_message_ready_deferred_batch_ = std::move(batch_data);
1569
1569
  call_attempt->recv_message_error_ = GRPC_ERROR_REF(error);
1570
1570
  CallCombinerClosureList closures;
1571
- if (error != GRPC_ERROR_NONE) {
1571
+ if (!GRPC_ERROR_IS_NONE(error)) {
1572
1572
  call_attempt->MaybeAddBatchForCancelOp(GRPC_ERROR_REF(error),
1573
1573
  &closures);
1574
1574
  }
@@ -1606,7 +1606,7 @@ void GetCallStatus(
1606
1606
  grpc_status_code* status, absl::optional<Duration>* server_pushback,
1607
1607
  bool* is_lb_drop,
1608
1608
  absl::optional<GrpcStreamNetworkState::ValueType>* stream_network_state) {
1609
- if (error != GRPC_ERROR_NONE) {
1609
+ if (!GRPC_ERROR_IS_NONE(error)) {
1610
1610
  grpc_error_get_status(error, deadline, status, nullptr, nullptr, nullptr);
1611
1611
  intptr_t value = 0;
1612
1612
  if (grpc_error_get_int(error, GRPC_ERROR_INT_LB_POLICY_DROP, &value) &&
@@ -1801,7 +1801,7 @@ void RetryFilter::CallData::CallAttempt::BatchData::RecvTrailingMetadataReady(
1801
1801
  CallCombinerClosureList closures;
1802
1802
  // Cancel call attempt.
1803
1803
  call_attempt->MaybeAddBatchForCancelOp(
1804
- error == GRPC_ERROR_NONE
1804
+ GRPC_ERROR_IS_NONE(error)
1805
1805
  ? grpc_error_set_int(
1806
1806
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("call attempt failed"),
1807
1807
  GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_CANCELLED)
@@ -1919,7 +1919,7 @@ void RetryFilter::CallData::CallAttempt::BatchData::OnComplete(
1919
1919
  // recv_trailing_metadata_ready callback, then defer propagating this
1920
1920
  // callback back to the surface. We can evaluate whether to retry when
1921
1921
  // recv_trailing_metadata comes back.
1922
- if (GPR_UNLIKELY(!calld->retry_committed_ && error != GRPC_ERROR_NONE &&
1922
+ if (GPR_UNLIKELY(!calld->retry_committed_ && !GRPC_ERROR_IS_NONE(error) &&
1923
1923
  !call_attempt->completed_recv_trailing_metadata_)) {
1924
1924
  if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
1925
1925
  gpr_log(GPR_INFO, "chand=%p calld=%p attempt=%p: deferring on_complete",
@@ -2030,13 +2030,12 @@ void RetryFilter::CallData::CallAttempt::BatchData::
2030
2030
  calld->chand_, calld, call_attempt_.get(),
2031
2031
  call_attempt_->started_send_message_count_);
2032
2032
  }
2033
- ByteStreamCache* cache =
2033
+ CachedSendMessage cache =
2034
2034
  calld->send_messages_[call_attempt_->started_send_message_count_];
2035
2035
  ++call_attempt_->started_send_message_count_;
2036
- call_attempt_->send_message_.Init(cache);
2037
2036
  batch_.send_message = true;
2038
- batch_.payload->send_message.send_message.reset(
2039
- call_attempt_->send_message_.get());
2037
+ batch_.payload->send_message.send_message = cache.slices;
2038
+ batch_.payload->send_message.flags = cache.flags;
2040
2039
  }
2041
2040
 
2042
2041
  void RetryFilter::CallData::CallAttempt::BatchData::
@@ -2073,6 +2072,7 @@ void RetryFilter::CallData::CallAttempt::BatchData::
2073
2072
  ++call_attempt_->started_recv_message_count_;
2074
2073
  batch_.recv_message = true;
2075
2074
  batch_.payload->recv_message.recv_message = &call_attempt_->recv_message_;
2075
+ batch_.payload->recv_message.flags = &call_attempt_->recv_message_flags_;
2076
2076
  batch_.payload->recv_message.call_failed_before_recv_message = nullptr;
2077
2077
  GRPC_CLOSURE_INIT(&call_attempt_->recv_message_ready_, RecvMessageReady, this,
2078
2078
  grpc_schedule_on_exec_ctx);
@@ -2219,7 +2219,7 @@ void RetryFilter::CallData::StartTransportStreamOpBatch(
2219
2219
  }
2220
2220
  // If we were previously cancelled from the surface, fail this
2221
2221
  // batch immediately.
2222
- if (cancelled_from_surface_ != GRPC_ERROR_NONE) {
2222
+ if (!GRPC_ERROR_IS_NONE(cancelled_from_surface_)) {
2223
2223
  // Note: This will release the call combiner.
2224
2224
  grpc_transport_stream_op_batch_finish_with_failure(
2225
2225
  batch, GRPC_ERROR_REF(cancelled_from_surface_), call_combiner_);
@@ -2373,9 +2373,9 @@ void RetryFilter::CallData::MaybeCacheSendOpsForBatch(PendingBatch* pending) {
2373
2373
  }
2374
2374
  // Set up cache for send_message ops.
2375
2375
  if (batch->send_message) {
2376
- ByteStreamCache* cache = arena_->New<ByteStreamCache>(
2377
- std::move(batch->payload->send_message.send_message));
2378
- send_messages_.push_back(cache);
2376
+ SliceBuffer* cache = arena_->New<SliceBuffer>(std::move(
2377
+ *absl::exchange(batch->payload->send_message.send_message, nullptr)));
2378
+ send_messages_.push_back({cache, batch->payload->send_message.flags});
2379
2379
  }
2380
2380
  // Save metadata batch for send_trailing_metadata ops.
2381
2381
  if (batch->send_trailing_metadata) {
@@ -2395,14 +2395,13 @@ void RetryFilter::CallData::FreeCachedSendInitialMetadata() {
2395
2395
  }
2396
2396
 
2397
2397
  void RetryFilter::CallData::FreeCachedSendMessage(size_t idx) {
2398
- if (send_messages_[idx] != nullptr) {
2398
+ if (send_messages_[idx].slices != nullptr) {
2399
2399
  if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
2400
2400
  gpr_log(GPR_INFO,
2401
2401
  "chand=%p calld=%p: destroying send_messages[%" PRIuPTR "]",
2402
2402
  chand_, this, idx);
2403
2403
  }
2404
- send_messages_[idx]->Destroy();
2405
- send_messages_[idx] = nullptr;
2404
+ Destruct(absl::exchange(send_messages_[idx].slices, nullptr));
2406
2405
  }
2407
2406
  }
2408
2407
 
@@ -2466,7 +2465,7 @@ RetryFilter::CallData::PendingBatch* RetryFilter::CallData::PendingBatchesAdd(
2466
2465
  if (batch->send_message) {
2467
2466
  pending_send_message_ = true;
2468
2467
  bytes_buffered_for_retry_ +=
2469
- batch->payload->send_message.send_message->length();
2468
+ batch->payload->send_message.send_message->Length();
2470
2469
  }
2471
2470
  if (batch->send_trailing_metadata) {
2472
2471
  pending_send_trailing_metadata_ = true;
@@ -2533,7 +2532,7 @@ void RetryFilter::CallData::FailPendingBatchInCallCombiner(
2533
2532
 
2534
2533
  // This is called via the call combiner, so access to calld is synchronized.
2535
2534
  void RetryFilter::CallData::PendingBatchesFail(grpc_error_handle error) {
2536
- GPR_ASSERT(error != GRPC_ERROR_NONE);
2535
+ GPR_ASSERT(!GRPC_ERROR_IS_NONE(error));
2537
2536
  if (GRPC_TRACE_FLAG_ENABLED(grpc_retry_trace)) {
2538
2537
  size_t num_batches = 0;
2539
2538
  for (size_t i = 0; i < GPR_ARRAY_SIZE(pending_batches_); ++i) {
@@ -2642,7 +2641,7 @@ void RetryFilter::CallData::OnRetryTimer(void* arg, grpc_error_handle error) {
2642
2641
  void RetryFilter::CallData::OnRetryTimerLocked(void* arg,
2643
2642
  grpc_error_handle error) {
2644
2643
  auto* calld = static_cast<CallData*>(arg);
2645
- if (error == GRPC_ERROR_NONE && calld->retry_timer_pending_) {
2644
+ if (GRPC_ERROR_IS_NONE(error) && calld->retry_timer_pending_) {
2646
2645
  calld->retry_timer_pending_ = false;
2647
2646
  calld->CreateCallAttempt(/*is_transparent_retry=*/false);
2648
2647
  } else {
@@ -2665,7 +2664,7 @@ void RetryFilter::CallData::AddClosureToStartTransparentRetry(
2665
2664
  void RetryFilter::CallData::StartTransparentRetry(void* arg,
2666
2665
  grpc_error_handle /*error*/) {
2667
2666
  auto* calld = static_cast<CallData*>(arg);
2668
- if (calld->cancelled_from_surface_ == GRPC_ERROR_NONE) {
2667
+ if (GRPC_ERROR_IS_NONE(calld->cancelled_from_surface_)) {
2669
2668
  calld->CreateCallAttempt(/*is_transparent_retry=*/true);
2670
2669
  } else {
2671
2670
  GRPC_CALL_COMBINER_STOP(calld->call_combiner_,
@@ -19,6 +19,7 @@
19
19
 
20
20
  #include <grpc/support/port_platform.h>
21
21
 
22
+ #include "src/core/lib/channel/channel_fwd.h"
22
23
  #include "src/core/lib/channel/channel_stack.h"
23
24
 
24
25
  namespace grpc_core {
@@ -141,14 +141,14 @@ std::unique_ptr<ServiceConfigParser::ParsedConfig>
141
141
  RetryServiceConfigParser::ParseGlobalParams(const grpc_channel_args* /*args*/,
142
142
  const Json& json,
143
143
  grpc_error_handle* error) {
144
- GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
144
+ GPR_DEBUG_ASSERT(error != nullptr && GRPC_ERROR_IS_NONE(*error));
145
145
  auto it = json.object_value().find("retryThrottling");
146
146
  if (it == json.object_value().end()) return nullptr;
147
147
  intptr_t max_milli_tokens = 0;
148
148
  intptr_t milli_token_ratio = 0;
149
149
  *error =
150
150
  ParseRetryThrottling(it->second, &max_milli_tokens, &milli_token_ratio);
151
- if (*error != GRPC_ERROR_NONE) return nullptr;
151
+ if (!GRPC_ERROR_IS_NONE(*error)) return nullptr;
152
152
  return absl::make_unique<RetryGlobalConfig>(max_milli_tokens,
153
153
  milli_token_ratio);
154
154
  }
@@ -290,7 +290,7 @@ std::unique_ptr<ServiceConfigParser::ParsedConfig>
290
290
  RetryServiceConfigParser::ParsePerMethodParams(const grpc_channel_args* args,
291
291
  const Json& json,
292
292
  grpc_error_handle* error) {
293
- GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE);
293
+ GPR_DEBUG_ASSERT(error != nullptr && GRPC_ERROR_IS_NONE(*error));
294
294
  // Parse retry policy.
295
295
  auto it = json.object_value().find("retryPolicy");
296
296
  if (it == json.object_value().end()) return nullptr;
@@ -303,7 +303,7 @@ RetryServiceConfigParser::ParsePerMethodParams(const grpc_channel_args* args,
303
303
  *error = ParseRetryPolicy(args, it->second, &max_attempts, &initial_backoff,
304
304
  &max_backoff, &backoff_multiplier,
305
305
  &retryable_status_codes, &per_attempt_recv_timeout);
306
- if (*error != GRPC_ERROR_NONE) return nullptr;
306
+ if (!GRPC_ERROR_IS_NONE(*error)) return nullptr;
307
307
  return absl::make_unique<RetryMethodConfig>(
308
308
  max_attempts, initial_backoff, max_backoff, backoff_multiplier,
309
309
  retryable_status_codes, per_attempt_recv_timeout);
@@ -29,6 +29,7 @@
29
29
  #include <grpc/support/log.h>
30
30
 
31
31
  #include "src/core/lib/channel/channel_args.h"
32
+ #include "src/core/lib/channel/channel_fwd.h"
32
33
  #include "src/core/lib/channel/channel_stack.h"
33
34
  #include "src/core/lib/channel/channel_stack_builder.h"
34
35
  #include "src/core/lib/channel/context.h"
@@ -57,7 +58,7 @@ class ServiceConfigChannelArgChannelData {
57
58
  grpc_error_handle service_config_error = GRPC_ERROR_NONE;
58
59
  auto service_config = ServiceConfigImpl::Create(
59
60
  args->channel_args, service_config_str, &service_config_error);
60
- if (service_config_error == GRPC_ERROR_NONE) {
61
+ if (GRPC_ERROR_IS_NONE(service_config_error)) {
61
62
  service_config_ = std::move(service_config);
62
63
  } else {
63
64
  gpr_log(GPR_ERROR, "%s",
@@ -30,6 +30,7 @@
30
30
 
31
31
  #include "absl/status/statusor.h"
32
32
 
33
+ #include <grpc/grpc.h>
33
34
  #include <grpc/slice.h>
34
35
  #include <grpc/status.h>
35
36
  #include <grpc/support/alloc.h>
@@ -42,6 +43,7 @@
42
43
  #include "src/core/lib/address_utils/sockaddr_utils.h"
43
44
  #include "src/core/lib/backoff/backoff.h"
44
45
  #include "src/core/lib/channel/channel_args.h"
46
+ #include "src/core/lib/channel/channel_stack.h"
45
47
  #include "src/core/lib/channel/channel_stack_builder.h"
46
48
  #include "src/core/lib/channel/channel_stack_builder_impl.h"
47
49
  #include "src/core/lib/channel/channel_trace.h"
@@ -49,6 +51,7 @@
49
51
  #include "src/core/lib/config/core_configuration.h"
50
52
  #include "src/core/lib/debug/stats.h"
51
53
  #include "src/core/lib/debug/trace.h"
54
+ #include "src/core/lib/event_engine/event_engine_factory.h"
52
55
  #include "src/core/lib/gpr/alloc.h"
53
56
  #include "src/core/lib/gprpp/debug_location.h"
54
57
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
@@ -81,6 +84,7 @@
81
84
  GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(SubchannelCall)))
82
85
 
83
86
  namespace grpc_core {
87
+ using ::grpc_event_engine::experimental::GetDefaultEventEngine;
84
88
 
85
89
  TraceFlag grpc_trace_subchannel(false, "subchannel");
86
90
  DebugOnlyTraceFlag grpc_trace_subchannel_refcount(false, "subchannel_refcount");
@@ -160,7 +164,7 @@ SubchannelCall::SubchannelCall(Args args, grpc_error_handle* error)
160
164
  };
161
165
  *error = grpc_call_stack_init(connected_subchannel_->channel_stack(), 1,
162
166
  SubchannelCall::Destroy, this, &call_args);
163
- if (GPR_UNLIKELY(*error != GRPC_ERROR_NONE)) {
167
+ if (GPR_UNLIKELY(!GRPC_ERROR_IS_NONE(*error))) {
164
168
  gpr_log(GPR_ERROR, "error: %s", grpc_error_std_string(*error).c_str());
165
169
  return;
166
170
  }
@@ -257,7 +261,7 @@ namespace {
257
261
  // Sets *status based on the rest of the parameters.
258
262
  void GetCallStatus(grpc_status_code* status, Timestamp deadline,
259
263
  grpc_metadata_batch* md_batch, grpc_error_handle error) {
260
- if (error != GRPC_ERROR_NONE) {
264
+ if (!GRPC_ERROR_IS_NONE(error)) {
261
265
  grpc_error_get_status(error, deadline, status, nullptr, nullptr, nullptr);
262
266
  } else {
263
267
  *status = md_batch->get(GrpcStatusMetadata()).value_or(GRPC_STATUS_UNKNOWN);
@@ -427,11 +431,8 @@ class Subchannel::HealthWatcherMap::HealthWatcher
427
431
  grpc_connectivity_state state() const { return state_; }
428
432
 
429
433
  void AddWatcherLocked(
430
- grpc_connectivity_state initial_state,
431
434
  RefCountedPtr<Subchannel::ConnectivityStateWatcherInterface> watcher) {
432
- if (state_ != initial_state) {
433
- new AsyncWatcherNotifierLocked(watcher, state_, status_);
434
- }
435
+ new AsyncWatcherNotifierLocked(watcher, state_, status_);
435
436
  watcher_list_.AddWatcherLocked(std::move(watcher));
436
437
  }
437
438
 
@@ -504,7 +505,6 @@ class Subchannel::HealthWatcherMap::HealthWatcher
504
505
 
505
506
  void Subchannel::HealthWatcherMap::AddWatcherLocked(
506
507
  WeakRefCountedPtr<Subchannel> subchannel,
507
- grpc_connectivity_state initial_state,
508
508
  const std::string& health_check_service_name,
509
509
  RefCountedPtr<ConnectivityStateWatcherInterface> watcher) {
510
510
  // If the health check service name is not already present in the map,
@@ -520,7 +520,7 @@ void Subchannel::HealthWatcherMap::AddWatcherLocked(
520
520
  health_watcher = it->second.get();
521
521
  }
522
522
  // Add the watcher to the entry.
523
- health_watcher->AddWatcherLocked(initial_state, std::move(watcher));
523
+ health_watcher->AddWatcherLocked(std::move(watcher));
524
524
  }
525
525
 
526
526
  void Subchannel::HealthWatcherMap::RemoveWatcherLocked(
@@ -648,10 +648,18 @@ Subchannel::Subchannel(SubchannelKey key,
648
648
  pollset_set_(grpc_pollset_set_create()),
649
649
  connector_(std::move(connector)),
650
650
  backoff_(ParseArgsForBackoffValues(args, &min_connect_timeout_)) {
651
+ // A grpc_init is added here to ensure that grpc_shutdown does not happen
652
+ // until the subchannel is destroyed. Subchannels can persist longer than
653
+ // channels because they maybe reused/shared among multiple channels. As a
654
+ // result the subchannel destruction happens asynchronously to channel
655
+ // destruction. If the last channel destruction triggers a grpc_shutdown
656
+ // before the last subchannel destruction, then there maybe race conditions
657
+ // triggering segmentation faults. To prevent this issue, we call a grpc_init
658
+ // here and a grpc_shutdown in the subchannel destructor.
659
+ grpc_init();
651
660
  GRPC_STATS_INC_CLIENT_SUBCHANNELS_CREATED();
652
661
  GRPC_CLOSURE_INIT(&on_connecting_finished_, OnConnectingFinished, this,
653
662
  grpc_schedule_on_exec_ctx);
654
- GRPC_CLOSURE_INIT(&on_retry_timer_, OnRetryTimer, this, nullptr);
655
663
  // Check proxy mapper to determine address to connect to and channel
656
664
  // args to use.
657
665
  address_for_connect_ = key_.address();
@@ -697,6 +705,8 @@ Subchannel::~Subchannel() {
697
705
  grpc_channel_args_destroy(args_);
698
706
  connector_.reset();
699
707
  grpc_pollset_set_destroy(pollset_set_);
708
+ // grpc_shutdown is called here because grpc_init is called in the ctor.
709
+ grpc_shutdown();
700
710
  }
701
711
 
702
712
  RefCountedPtr<Subchannel> Subchannel::Create(
@@ -744,18 +754,7 @@ channelz::SubchannelNode* Subchannel::channelz_node() {
744
754
  return channelz_node_.get();
745
755
  }
746
756
 
747
- grpc_connectivity_state Subchannel::CheckConnectivityState(
748
- const absl::optional<std::string>& health_check_service_name) {
749
- MutexLock lock(&mu_);
750
- if (health_check_service_name.has_value()) {
751
- return health_watcher_map_.CheckConnectivityStateLocked(
752
- this, *health_check_service_name);
753
- }
754
- return state_;
755
- }
756
-
757
757
  void Subchannel::WatchConnectivityState(
758
- grpc_connectivity_state initial_state,
759
758
  const absl::optional<std::string>& health_check_service_name,
760
759
  RefCountedPtr<ConnectivityStateWatcherInterface> watcher) {
761
760
  MutexLock lock(&mu_);
@@ -764,14 +763,12 @@ void Subchannel::WatchConnectivityState(
764
763
  grpc_pollset_set_add_pollset_set(pollset_set_, interested_parties);
765
764
  }
766
765
  if (!health_check_service_name.has_value()) {
767
- if (state_ != initial_state) {
768
- new AsyncWatcherNotifierLocked(watcher, state_, status_);
769
- }
766
+ new AsyncWatcherNotifierLocked(watcher, state_, status_);
770
767
  watcher_list_.AddWatcherLocked(std::move(watcher));
771
768
  } else {
772
769
  health_watcher_map_.AddWatcherLocked(
773
- WeakRef(DEBUG_LOCATION, "health_watcher"), initial_state,
774
- *health_check_service_name, std::move(watcher));
770
+ WeakRef(DEBUG_LOCATION, "health_watcher"), *health_check_service_name,
771
+ std::move(watcher));
775
772
  }
776
773
  }
777
774
 
@@ -795,16 +792,21 @@ void Subchannel::RequestConnection() {
795
792
  MutexLock lock(&mu_);
796
793
  if (state_ == GRPC_CHANNEL_IDLE) {
797
794
  StartConnectingLocked();
798
- } else if (state_ == GRPC_CHANNEL_TRANSIENT_FAILURE) {
799
- connection_requested_ = true;
800
795
  }
801
796
  }
802
797
 
803
798
  void Subchannel::ResetBackoff() {
799
+ // Hold a ref to ensure cancellation and subsequent deletion of the closure
800
+ // does not eliminate the last ref and destroy the Subchannel before the
801
+ // method returns.
802
+ auto self = WeakRef(DEBUG_LOCATION, "ResetBackoff");
804
803
  MutexLock lock(&mu_);
805
804
  backoff_.Reset();
806
- if (state_ == GRPC_CHANNEL_TRANSIENT_FAILURE) {
807
- grpc_timer_cancel(&retry_timer_);
805
+ if (state_ == GRPC_CHANNEL_TRANSIENT_FAILURE &&
806
+ GetDefaultEventEngine()->Cancel(retry_timer_handle_)) {
807
+ OnRetryTimerLocked();
808
+ } else if (state_ == GRPC_CHANNEL_CONNECTING) {
809
+ next_attempt_time_ = ExecCtx::Get()->Now();
808
810
  }
809
811
  }
810
812
 
@@ -887,29 +889,16 @@ void Subchannel::SetConnectivityStateLocked(grpc_connectivity_state state,
887
889
  health_watcher_map_.NotifyLocked(state, status);
888
890
  }
889
891
 
890
- void Subchannel::OnRetryTimer(void* arg, grpc_error_handle /*error*/) {
891
- WeakRefCountedPtr<Subchannel> c(static_cast<Subchannel*>(arg));
892
- {
893
- MutexLock lock(&c->mu_);
894
- c->OnRetryTimerLocked();
895
- }
896
- c.reset(DEBUG_LOCATION, "RetryTimer");
892
+ void Subchannel::OnRetryTimer() {
893
+ MutexLock lock(&mu_);
894
+ OnRetryTimerLocked();
897
895
  }
898
896
 
899
897
  void Subchannel::OnRetryTimerLocked() {
900
898
  if (shutdown_) return;
901
- if (connection_requested_) {
902
- gpr_log(GPR_INFO,
903
- "subchannel %p %s: connection attempt requested while backoff "
904
- "timer was pending, retrying now",
905
- this, key_.ToString().c_str());
906
- connection_requested_ = false;
907
- StartConnectingLocked();
908
- } else {
909
- gpr_log(GPR_INFO, "subchannel %p %s: backoff delay elapsed, reporting IDLE",
910
- this, key_.ToString().c_str());
911
- SetConnectivityStateLocked(GRPC_CHANNEL_IDLE, absl::OkStatus());
912
- }
899
+ gpr_log(GPR_INFO, "subchannel %p %s: backoff delay elapsed, reporting IDLE",
900
+ this, key_.ToString().c_str());
901
+ SetConnectivityStateLocked(GRPC_CHANNEL_IDLE, absl::OkStatus());
913
902
  }
914
903
 
915
904
  void Subchannel::StartConnectingLocked() {
@@ -960,8 +949,22 @@ void Subchannel::OnConnectingFinishedLocked(grpc_error_handle error) {
960
949
  time_until_next_attempt.millis());
961
950
  SetConnectivityStateLocked(GRPC_CHANNEL_TRANSIENT_FAILURE,
962
951
  grpc_error_to_absl_status(error));
963
- WeakRef(DEBUG_LOCATION, "RetryTimer").release(); // Ref held by callback.
964
- grpc_timer_init(&retry_timer_, next_attempt_time_, &on_retry_timer_);
952
+ retry_timer_handle_ = GetDefaultEventEngine()->RunAfter(
953
+ time_until_next_attempt,
954
+ [self = WeakRef(DEBUG_LOCATION, "RetryTimer")]() mutable {
955
+ {
956
+ ApplicationCallbackExecCtx callback_exec_ctx;
957
+ ExecCtx exec_ctx;
958
+ self->OnRetryTimer();
959
+ // Subchannel deletion might require an active ExecCtx. So if
960
+ // self.reset() is not called here, the WeakRefCountedPtr destructor
961
+ // may run after the ExecCtx declared in the callback is destroyed.
962
+ // Since subchannel may get destroyed when the WeakRefCountedPtr
963
+ // destructor runs, it may not have an active ExecCtx - thus leading
964
+ // to crashes.
965
+ self.reset();
966
+ }
967
+ });
965
968
  }
966
969
  (void)GRPC_ERROR_UNREF(error);
967
970
  }