grpc 1.41.0.pre2 → 1.42.0

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 (519) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +57 -44
  3. data/etc/roots.pem +335 -326
  4. data/include/grpc/event_engine/event_engine.h +82 -42
  5. data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
  6. data/include/grpc/event_engine/memory_allocator.h +210 -0
  7. data/include/grpc/grpc.h +4 -0
  8. data/include/grpc/grpc_security.h +18 -0
  9. data/include/grpc/grpc_security_constants.h +1 -0
  10. data/include/grpc/impl/codegen/port_platform.h +7 -0
  11. data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
  12. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
  13. data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
  14. data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
  15. data/src/core/ext/filters/client_channel/client_channel.h +74 -27
  16. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
  17. data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
  19. data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
  20. data/src/core/ext/filters/client_channel/config_selector.h +4 -5
  21. data/src/core/ext/filters/client_channel/connector.h +18 -18
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
  23. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
  37. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
  43. data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
  44. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
  45. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
  50. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
  51. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
  53. data/src/core/ext/filters/client_channel/resolver.h +1 -1
  54. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
  55. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
  56. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
  59. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  60. data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
  61. data/src/core/ext/filters/client_channel/server_address.h +1 -1
  62. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
  63. data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
  64. data/src/core/ext/filters/client_channel/subchannel.h +29 -49
  65. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
  66. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
  67. data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
  68. data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
  69. data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
  70. data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
  71. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
  72. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
  73. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  74. data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
  75. data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
  76. data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
  77. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
  78. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
  79. data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
  80. data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
  81. data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
  82. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  83. data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
  84. data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
  85. data/src/core/ext/service_config/service_config_call_data.h +72 -0
  86. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
  87. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
  88. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
  89. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
  90. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
  92. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
  93. data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
  94. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
  95. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
  96. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  97. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
  98. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
  99. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  100. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
  102. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
  103. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
  107. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
  108. data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
  109. data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
  110. data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
  111. data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
  112. data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
  113. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
  114. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
  115. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
  116. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
  117. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
  118. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
  119. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
  120. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
  121. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
  122. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
  123. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
  124. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
  125. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
  126. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
  127. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
  128. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
  129. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
  130. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
  131. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
  132. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
  133. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
  134. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
  135. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
  136. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
  137. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
  138. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
  139. data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
  140. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
  141. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
  142. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
  143. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
  144. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
  145. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
  146. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
  147. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
  148. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
  149. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
  150. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
  151. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
  152. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
  153. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
  154. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
  155. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
  156. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
  157. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
  158. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
  159. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
  160. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
  161. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
  162. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
  163. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
  164. data/src/core/ext/xds/xds_api.cc +325 -362
  165. data/src/core/ext/xds/xds_api.h +134 -82
  166. data/src/core/ext/xds/xds_bootstrap.h +10 -0
  167. data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
  168. data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
  169. data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
  170. data/src/core/ext/xds/xds_client.cc +527 -314
  171. data/src/core/ext/xds/xds_client.h +42 -37
  172. data/src/core/ext/xds/xds_client_stats.h +1 -1
  173. data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
  174. data/src/core/lib/address_utils/parse_address.cc +2 -0
  175. data/src/core/lib/avl/avl.cc +5 -5
  176. data/src/core/lib/backoff/backoff.cc +1 -1
  177. data/src/core/lib/channel/channel_args.cc +24 -6
  178. data/src/core/lib/channel/channel_args.h +9 -0
  179. data/src/core/lib/channel/channel_stack_builder.cc +3 -3
  180. data/src/core/lib/channel/channel_trace.cc +1 -1
  181. data/src/core/lib/channel/channel_trace.h +1 -1
  182. data/src/core/lib/channel/channelz.cc +3 -3
  183. data/src/core/lib/channel/channelz.h +2 -2
  184. data/src/core/lib/channel/channelz_registry.cc +1 -1
  185. data/src/core/lib/channel/channelz_registry.h +1 -1
  186. data/src/core/lib/channel/connected_channel.cc +1 -3
  187. data/src/core/lib/channel/connected_channel.h +1 -2
  188. data/src/core/lib/compression/compression.cc +2 -2
  189. data/src/core/lib/compression/compression_args.cc +6 -4
  190. data/src/core/lib/compression/compression_internal.cc +2 -2
  191. data/src/core/lib/compression/compression_internal.h +1 -1
  192. data/src/core/lib/config/core_configuration.cc +44 -2
  193. data/src/core/lib/config/core_configuration.h +39 -1
  194. data/src/core/lib/debug/stats.cc +1 -1
  195. data/src/core/lib/debug/stats_data.cc +13 -13
  196. data/src/core/lib/gpr/atm.cc +1 -1
  197. data/src/core/lib/gpr/cpu_posix.cc +1 -1
  198. data/src/core/lib/gpr/string.cc +2 -2
  199. data/src/core/lib/gpr/tls.h +1 -1
  200. data/src/core/lib/gpr/useful.h +79 -32
  201. data/src/core/lib/gprpp/arena.h +10 -0
  202. data/src/core/lib/gprpp/bitset.h +38 -16
  203. data/src/core/lib/gprpp/chunked_vector.h +211 -0
  204. data/src/core/lib/gprpp/construct_destruct.h +1 -1
  205. data/src/core/lib/gprpp/match.h +1 -1
  206. data/src/core/lib/gprpp/memory.h +6 -0
  207. data/src/core/lib/gprpp/overload.h +1 -1
  208. data/src/core/lib/gprpp/status_helper.cc +23 -3
  209. data/src/core/lib/gprpp/status_helper.h +12 -1
  210. data/src/core/lib/gprpp/table.h +411 -0
  211. data/src/core/lib/http/httpcli.cc +200 -182
  212. data/src/core/lib/http/parser.cc +2 -2
  213. data/src/core/lib/iomgr/call_combiner.cc +28 -10
  214. data/src/core/lib/iomgr/combiner.cc +6 -21
  215. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
  216. data/src/core/lib/iomgr/error.cc +113 -52
  217. data/src/core/lib/iomgr/error.h +50 -9
  218. data/src/core/lib/iomgr/error_cfstream.cc +5 -0
  219. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
  220. data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
  221. data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
  222. data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
  223. data/src/core/lib/iomgr/event_engine/closure.h +10 -1
  224. data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
  225. data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
  226. data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
  227. data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
  228. data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
  229. data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
  230. data/src/core/lib/iomgr/exec_ctx.cc +1 -9
  231. data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
  232. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
  233. data/src/core/lib/iomgr/executor.cc +6 -20
  234. data/src/core/lib/iomgr/iomgr.cc +3 -1
  235. data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
  236. data/src/core/lib/iomgr/iomgr_internal.h +3 -2
  237. data/src/core/lib/iomgr/load_file.cc +2 -2
  238. data/src/core/lib/iomgr/lockfree_event.cc +18 -0
  239. data/src/core/lib/iomgr/pollset_custom.cc +1 -1
  240. data/src/core/lib/iomgr/pollset_custom.h +1 -1
  241. data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
  242. data/src/core/lib/iomgr/resource_quota.cc +13 -11
  243. data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
  244. data/src/core/lib/iomgr/socket_mutator.cc +2 -2
  245. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
  246. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
  247. data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
  248. data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
  249. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  250. data/src/core/lib/iomgr/tcp_posix.cc +4 -5
  251. data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
  252. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
  253. data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
  254. data/src/core/lib/iomgr/tcp_windows.cc +2 -2
  255. data/src/core/lib/iomgr/timer_generic.cc +13 -13
  256. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  257. data/src/core/lib/json/json_util.cc +68 -0
  258. data/src/core/lib/json/json_util.h +57 -99
  259. data/src/core/lib/json/json_writer.cc +0 -3
  260. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  261. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  262. data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
  263. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
  264. data/src/core/lib/security/context/security_context.cc +4 -2
  265. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  266. data/src/core/lib/security/credentials/credentials.cc +4 -2
  267. data/src/core/lib/security/credentials/credentials.h +6 -1
  268. data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
  269. data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
  270. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
  271. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
  272. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
  273. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
  274. data/src/core/lib/security/security_connector/security_connector.cc +9 -4
  275. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  276. data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
  277. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
  278. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
  279. data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
  280. data/src/core/lib/security/transport/security_handshaker.cc +73 -43
  281. data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
  282. data/src/core/lib/security/transport/tsi_error.cc +3 -5
  283. data/src/core/lib/slice/slice.cc +0 -16
  284. data/src/core/lib/slice/slice_api.cc +39 -0
  285. data/src/core/lib/slice/slice_buffer.cc +5 -5
  286. data/src/core/lib/slice/slice_intern.cc +8 -13
  287. data/src/core/lib/slice/slice_internal.h +1 -244
  288. data/src/core/lib/slice/slice_refcount.cc +17 -0
  289. data/src/core/lib/slice/slice_refcount.h +121 -0
  290. data/src/core/lib/slice/slice_refcount_base.h +173 -0
  291. data/src/core/lib/slice/slice_split.cc +100 -0
  292. data/src/core/lib/slice/slice_split.h +40 -0
  293. data/src/core/lib/slice/slice_string_helpers.cc +0 -83
  294. data/src/core/lib/slice/slice_string_helpers.h +0 -11
  295. data/src/core/lib/slice/static_slice.cc +529 -0
  296. data/src/core/lib/slice/static_slice.h +331 -0
  297. data/src/core/lib/surface/builtins.cc +49 -0
  298. data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
  299. data/src/core/lib/surface/call.cc +103 -120
  300. data/src/core/lib/surface/call.h +0 -6
  301. data/src/core/lib/surface/channel.cc +19 -32
  302. data/src/core/lib/surface/channel.h +0 -9
  303. data/src/core/lib/surface/channel_init.cc +23 -76
  304. data/src/core/lib/surface/channel_init.h +52 -44
  305. data/src/core/lib/surface/completion_queue.cc +6 -5
  306. data/src/core/lib/surface/init.cc +0 -39
  307. data/src/core/lib/surface/init_secure.cc +17 -14
  308. data/src/core/lib/surface/lame_client.cc +18 -11
  309. data/src/core/lib/surface/lame_client.h +1 -1
  310. data/src/core/lib/surface/server.cc +25 -17
  311. data/src/core/lib/surface/server.h +17 -10
  312. data/src/core/lib/surface/validate_metadata.cc +5 -2
  313. data/src/core/lib/surface/version.cc +2 -2
  314. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  315. data/src/core/lib/transport/error_utils.cc +42 -17
  316. data/src/core/lib/transport/error_utils.h +1 -1
  317. data/src/core/lib/transport/metadata.cc +31 -10
  318. data/src/core/lib/transport/metadata.h +2 -1
  319. data/src/core/lib/transport/metadata_batch.cc +35 -371
  320. data/src/core/lib/transport/metadata_batch.h +905 -71
  321. data/src/core/lib/transport/parsed_metadata.h +263 -0
  322. data/src/core/lib/transport/pid_controller.cc +4 -4
  323. data/src/core/lib/transport/static_metadata.cc +714 -846
  324. data/src/core/lib/transport/static_metadata.h +115 -379
  325. data/src/core/lib/transport/status_metadata.cc +1 -0
  326. data/src/core/lib/transport/transport.cc +4 -5
  327. data/src/core/lib/transport/transport_op_string.cc +40 -20
  328. data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
  329. data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
  330. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
  331. data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
  332. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
  333. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  335. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
  336. data/src/core/tsi/fake_transport_security.cc +15 -7
  337. data/src/core/tsi/local_transport_security.cc +36 -73
  338. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
  339. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
  340. data/src/core/tsi/ssl_transport_security.cc +10 -2
  341. data/src/core/tsi/transport_security.cc +12 -0
  342. data/src/core/tsi/transport_security.h +16 -1
  343. data/src/core/tsi/transport_security_interface.h +26 -0
  344. data/src/ruby/ext/grpc/extconf.rb +12 -9
  345. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  346. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  347. data/src/ruby/lib/grpc/version.rb +1 -1
  348. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
  349. data/src/ruby/spec/client_server_spec.rb +1 -1
  350. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
  351. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
  352. data/third_party/address_sorting/address_sorting_posix.c +1 -0
  353. data/third_party/boringssl-with-bazel/err_data.c +278 -272
  354. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +21 -22
  355. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +0 -2
  356. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +5 -0
  357. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +15 -22
  358. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +13 -7
  359. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +19 -29
  360. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/a_strex.c +268 -271
  361. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +106 -153
  362. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  363. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +0 -39
  364. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +1 -1
  365. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/charmap.h +0 -0
  366. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +38 -0
  367. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +8 -8
  368. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +289 -198
  369. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +8 -8
  370. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +9 -13
  371. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +1 -0
  372. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +11 -8
  373. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +1 -7
  374. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -5
  375. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +0 -4
  376. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +1 -7
  377. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -6
  378. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -17
  379. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
  380. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +9 -0
  381. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +8 -0
  382. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
  383. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +45 -65
  384. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +1 -0
  385. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
  386. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +21 -3
  387. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +3 -2
  388. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +5 -2
  389. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
  390. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +10 -0
  391. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
  392. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
  393. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +4 -7
  394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
  395. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +1 -1
  396. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +1 -1
  397. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +24 -9
  398. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +4 -2
  399. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
  400. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
  402. data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
  403. data/third_party/boringssl-with-bazel/src/crypto/mem.c +12 -9
  404. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +0 -9
  405. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +0 -2
  406. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +0 -8
  407. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +0 -2
  408. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +0 -4
  409. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +16 -7
  410. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +9 -4
  411. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +151 -12
  412. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  413. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
  414. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +2 -0
  415. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +181 -1
  416. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +246 -0
  417. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +11 -2
  418. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +0 -2
  419. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +0 -179
  420. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +4 -2
  421. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -5
  422. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -0
  423. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +11 -50
  424. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +1 -1
  425. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +2 -4
  426. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +0 -16
  427. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +22 -18
  428. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +11 -8
  429. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +16 -0
  430. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -0
  431. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  432. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +1 -1
  433. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -0
  434. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +4 -3
  435. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +24 -5
  436. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +17 -8
  437. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -0
  438. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +6 -6
  439. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +4 -0
  440. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +5 -0
  441. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +112 -55
  442. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +2 -1
  443. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +0 -2
  444. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  445. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +71 -26
  446. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +366 -227
  447. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +2 -9
  448. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -4
  449. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +3 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +3 -3
  451. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +9 -0
  452. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +8 -2
  453. data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +4 -0
  454. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +9 -3
  455. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -20
  456. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -5
  457. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +5 -0
  458. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +37 -15
  459. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +28 -14
  460. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -32
  461. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +529 -91
  462. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -695
  463. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +48 -8
  464. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +266 -357
  465. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +90 -152
  466. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +15 -13
  467. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +75 -79
  468. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +96 -97
  469. data/third_party/boringssl-with-bazel/src/ssl/internal.h +63 -43
  470. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
  471. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -2
  472. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +6 -12
  473. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +14 -17
  474. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +14 -27
  475. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +203 -203
  476. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +30 -41
  477. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +47 -33
  478. data/third_party/re2/re2/compile.cc +91 -109
  479. data/third_party/re2/re2/dfa.cc +27 -39
  480. data/third_party/re2/re2/filtered_re2.cc +18 -2
  481. data/third_party/re2/re2/filtered_re2.h +10 -5
  482. data/third_party/re2/re2/nfa.cc +1 -1
  483. data/third_party/re2/re2/parse.cc +42 -23
  484. data/third_party/re2/re2/perl_groups.cc +34 -34
  485. data/third_party/re2/re2/prefilter.cc +3 -2
  486. data/third_party/re2/re2/prog.cc +182 -4
  487. data/third_party/re2/re2/prog.h +28 -9
  488. data/third_party/re2/re2/re2.cc +87 -118
  489. data/third_party/re2/re2/re2.h +156 -141
  490. data/third_party/re2/re2/regexp.cc +12 -5
  491. data/third_party/re2/re2/regexp.h +8 -2
  492. data/third_party/re2/re2/set.cc +31 -9
  493. data/third_party/re2/re2/set.h +9 -4
  494. data/third_party/re2/re2/simplify.cc +11 -3
  495. data/third_party/re2/re2/tostring.cc +1 -1
  496. data/third_party/re2/re2/walker-inl.h +1 -1
  497. data/third_party/re2/util/mutex.h +2 -2
  498. data/third_party/re2/util/pcre.h +3 -3
  499. metadata +81 -68
  500. data/include/grpc/event_engine/slice_allocator.h +0 -71
  501. data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
  502. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
  503. data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
  504. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
  505. data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
  506. data/src/core/ext/transport/chttp2/client/authority.h +0 -36
  507. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
  508. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
  509. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
  510. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
  511. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
  512. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
  513. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
  514. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
  515. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
  516. data/src/core/lib/iomgr/udp_server.cc +0 -747
  517. data/src/core/lib/iomgr/udp_server.h +0 -103
  518. data/src/core/lib/transport/authority_override.cc +0 -40
  519. data/src/core/lib/transport/authority_override.h +0 -37
@@ -25,6 +25,7 @@
25
25
  #include "src/core/lib/channel/channel_args.h"
26
26
  #include "src/core/lib/debug/trace.h"
27
27
  #include "src/core/lib/gprpp/ref_counted.h"
28
+ #include "src/core/lib/iomgr/resolve_address.h"
28
29
 
29
30
  namespace grpc_core {
30
31
 
@@ -35,7 +36,8 @@ extern TraceFlag grpc_subchannel_pool_trace;
35
36
  // A key that can uniquely identify a subchannel.
36
37
  class SubchannelKey {
37
38
  public:
38
- explicit SubchannelKey(const grpc_channel_args* args);
39
+ SubchannelKey(const grpc_resolved_address& address,
40
+ const grpc_channel_args* args);
39
41
  ~SubchannelKey();
40
42
 
41
43
  // Copyable.
@@ -47,13 +49,20 @@ class SubchannelKey {
47
49
 
48
50
  bool operator<(const SubchannelKey& other) const;
49
51
 
52
+ const grpc_resolved_address& address() const { return address_; }
53
+ const grpc_channel_args* args() const { return args_; }
54
+
55
+ // Human-readable string suitable for logging.
56
+ std::string ToString() const;
57
+
50
58
  private:
51
59
  // Initializes the subchannel key with the given \a args and the function to
52
60
  // copy channel args.
53
61
  void Init(
54
- const grpc_channel_args* args,
62
+ const grpc_resolved_address& address, const grpc_channel_args* args,
55
63
  grpc_channel_args* (*copy_channel_args)(const grpc_channel_args* args));
56
64
 
65
+ grpc_resolved_address address_;
57
66
  const grpc_channel_args* args_;
58
67
  };
59
68
 
@@ -22,10 +22,11 @@
22
22
 
23
23
  #include <atomic>
24
24
 
25
+ #include "src/core/ext/filters/client_idle/idle_filter_state.h"
25
26
  #include "src/core/lib/channel/channel_args.h"
26
27
  #include "src/core/lib/channel/channel_stack_builder.h"
28
+ #include "src/core/lib/config/core_configuration.h"
27
29
  #include "src/core/lib/iomgr/timer.h"
28
- #include "src/core/lib/surface/channel_init.h"
29
30
  #include "src/core/lib/transport/http2_errors.h"
30
31
 
31
32
  // TODO(juanlishen): The idle filter is disabled in client channel by default
@@ -47,78 +48,8 @@ TraceFlag grpc_trace_client_idle_filter(false, "client_idle_filter");
47
48
 
48
49
  namespace {
49
50
 
50
- /*
51
- client_idle_filter maintains a state tracking if there are active calls in the
52
- channel and its internal idle_timer_. The states are specified as following:
53
-
54
- +--------------------------------------------+-------------+---------+
55
- | ChannelState | idle_timer_ | channel |
56
- +--------------------------------------------+-------------+---------+
57
- | IDLE | unset | idle |
58
- | CALLS_ACTIVE | unset | busy |
59
- | TIMER_PENDING | set-valid | idle |
60
- | TIMER_PENDING_CALLS_ACTIVE | set-invalid | busy |
61
- | TIMER_PENDING_CALLS_SEEN_SINCE_TIMER_START | set-invalid | idle |
62
- +--------------------------------------------+-------------+---------+
63
-
64
- IDLE: The initial state of the client_idle_filter, indicating the channel is
65
- in IDLE.
66
-
67
- CALLS_ACTIVE: The channel has 1 or 1+ active calls and the timer is not set.
68
-
69
- TIMER_PENDING: The state after the timer is set and no calls have arrived
70
- after the timer is set. The channel must have 0 active call in this state. If
71
- the timer is fired in this state, the channel will go into IDLE state.
72
-
73
- TIMER_PENDING_CALLS_ACTIVE: The state after the timer is set and at least one
74
- call has arrived after the timer is set. The channel must have 1 or 1+ active
75
- calls in this state. If the timer is fired in this state, we won't reschedule
76
- it.
77
-
78
- TIMER_PENDING_CALLS_SEEN_SINCE_TIMER_START: The state after the timer is set
79
- and at least one call has arrived after the timer is set, BUT the channel
80
- currently has 0 active call. If the timer is fired in this state, we will
81
- reschedule it according to the finish time of the latest call.
82
-
83
- PROCESSING: The state set to block other threads when the setting thread is
84
- doing some work to keep state consistency.
85
-
86
- idle_timer_ will not be cancelled (unless the channel is shutting down).
87
- If the timer callback is called when the idle_timer_ is valid (i.e. idle_state
88
- is TIMER_PENDING), the channel will enter IDLE, otherwise the channel won't be
89
- changed.
90
-
91
- State transitions:
92
- IDLE
93
- | ^
94
- --------------------------------- *
95
- | *
96
- v *
97
- CALLS_ACTIVE =================> TIMER_PENDING
98
- ^ | ^
99
- * ------------------------------ *
100
- * | *
101
- * v *
102
- TIMER_PENDING_CALLS_ACTIVE ===> TIMER_PENDING_CALLS_SEEN_SINCE_TIMER_START
103
- ^ |
104
- | |
105
- ---------------------------------
106
-
107
- ---> Triggered by IncreaseCallCount()
108
- ===> Triggered by DecreaseCallCount()
109
- ***> Triggered by IdleTimerCallback()
110
- */
111
- enum ChannelState {
112
- IDLE,
113
- CALLS_ACTIVE,
114
- TIMER_PENDING,
115
- TIMER_PENDING_CALLS_ACTIVE,
116
- TIMER_PENDING_CALLS_SEEN_SINCE_TIMER_START,
117
- PROCESSING
118
- };
119
-
120
51
  grpc_millis GetClientIdleTimeout(const grpc_channel_args* args) {
121
- return GPR_MAX(
52
+ return std::max(
122
53
  grpc_channel_arg_get_integer(
123
54
  grpc_channel_args_find(args, GRPC_ARG_CLIENT_IDLE_TIMEOUT_MS),
124
55
  {DEFAULT_IDLE_TIMEOUT_MS, 0, INT_MAX}),
@@ -159,9 +90,7 @@ class ChannelData {
159
90
  const grpc_millis client_idle_timeout_;
160
91
 
161
92
  // Member data used to track the state of channel.
162
- grpc_millis last_idle_time_;
163
- std::atomic<intptr_t> call_count_{0};
164
- std::atomic<ChannelState> state_{IDLE};
93
+ IdleFilterState idle_filter_state_{false};
165
94
 
166
95
  // Idle timer and its callback closure.
167
96
  grpc_timer idle_timer_;
@@ -202,86 +131,13 @@ void ChannelData::StartTransportOp(grpc_channel_element* elem,
202
131
  }
203
132
 
204
133
  void ChannelData::IncreaseCallCount() {
205
- const intptr_t previous_value =
206
- call_count_.fetch_add(1, std::memory_order_relaxed);
207
- GRPC_IDLE_FILTER_LOG("call counter has increased to %" PRIuPTR,
208
- previous_value + 1);
209
- if (previous_value == 0) {
210
- // This call is the one that makes the channel busy.
211
- // Loop here to make sure the previous decrease operation has finished.
212
- ChannelState state = state_.load(std::memory_order_relaxed);
213
- while (true) {
214
- switch (state) {
215
- // Timer has not been set. Switch to CALLS_ACTIVE.
216
- case IDLE:
217
- // In this case, no other threads will modify the state, so we can
218
- // just store the value.
219
- state_.store(CALLS_ACTIVE, std::memory_order_relaxed);
220
- return;
221
- // Timer has been set. Switch to TIMER_PENDING_CALLS_ACTIVE.
222
- case TIMER_PENDING:
223
- case TIMER_PENDING_CALLS_SEEN_SINCE_TIMER_START:
224
- // At this point, the state may have been switched to IDLE by the
225
- // idle timer callback. Therefore, use CAS operation to change the
226
- // state atomically.
227
- // Use std::memory_order_acquire on success to ensure last_idle_time_
228
- // has been properly set in DecreaseCallCount().
229
- if (state_.compare_exchange_weak(state, TIMER_PENDING_CALLS_ACTIVE,
230
- std::memory_order_acquire,
231
- std::memory_order_relaxed)) {
232
- return;
233
- }
234
- break;
235
- default:
236
- // The state has not been switched to desired value yet, try again.
237
- state = state_.load(std::memory_order_relaxed);
238
- break;
239
- }
240
- }
241
- }
134
+ idle_filter_state_.IncreaseCallCount();
242
135
  }
243
136
 
244
137
  void ChannelData::DecreaseCallCount() {
245
- const intptr_t previous_value =
246
- call_count_.fetch_sub(1, std::memory_order_relaxed);
247
- GRPC_IDLE_FILTER_LOG("call counter has decreased to %" PRIuPTR,
248
- previous_value - 1);
249
- if (previous_value == 1) {
250
- // This call is the one that makes the channel idle.
251
- // last_idle_time_ does not need to be std::atomic<> because busy-loops in
252
- // IncreaseCallCount(), DecreaseCallCount() and IdleTimerCallback() will
253
- // prevent multiple threads from simultaneously accessing this variable.
254
- last_idle_time_ = ExecCtx::Get()->Now();
255
- ChannelState state = state_.load(std::memory_order_relaxed);
256
- while (true) {
257
- switch (state) {
258
- // Timer has not been set. Set the timer and switch to TIMER_PENDING
259
- case CALLS_ACTIVE:
260
- // Release store here to make other threads see the updated value of
261
- // last_idle_time_.
262
- StartIdleTimer();
263
- state_.store(TIMER_PENDING, std::memory_order_release);
264
- return;
265
- // Timer has been set. Switch to
266
- // TIMER_PENDING_CALLS_SEEN_SINCE_TIMER_START
267
- case TIMER_PENDING_CALLS_ACTIVE:
268
- // At this point, the state may have been switched to CALLS_ACTIVE by
269
- // the idle timer callback. Therefore, use CAS operation to change the
270
- // state atomically.
271
- // Release store here to make the idle timer callback see the updated
272
- // value of last_idle_time_ to properly reset the idle timer.
273
- if (state_.compare_exchange_weak(
274
- state, TIMER_PENDING_CALLS_SEEN_SINCE_TIMER_START,
275
- std::memory_order_release, std::memory_order_relaxed)) {
276
- return;
277
- }
278
- break;
279
- default:
280
- // The state has not been switched to desired value yet, try again.
281
- state = state_.load(std::memory_order_relaxed);
282
- break;
283
- }
284
- }
138
+ if (idle_filter_state_.DecreaseCallCount()) {
139
+ // If there are no more calls in progress, start the idle timer.
140
+ StartIdleTimer();
285
141
  }
286
142
  }
287
143
 
@@ -315,44 +171,10 @@ void ChannelData::IdleTimerCallback(void* arg, grpc_error_handle error) {
315
171
  GRPC_CHANNEL_STACK_UNREF(chand->channel_stack_, "max idle timer callback");
316
172
  return;
317
173
  }
318
- bool finished = false;
319
- ChannelState state = chand->state_.load(std::memory_order_relaxed);
320
- while (!finished) {
321
- switch (state) {
322
- case TIMER_PENDING:
323
- // Change the state to PROCESSING to block IncreaseCallCout() until the
324
- // EnterIdle() operation finishes, preventing mistakenly entering IDLE
325
- // when active RPC exists.
326
- finished = chand->state_.compare_exchange_weak(
327
- state, PROCESSING, std::memory_order_acquire,
328
- std::memory_order_relaxed);
329
- if (finished) {
330
- chand->EnterIdle();
331
- chand->state_.store(IDLE, std::memory_order_relaxed);
332
- }
333
- break;
334
- case TIMER_PENDING_CALLS_ACTIVE:
335
- finished = chand->state_.compare_exchange_weak(
336
- state, CALLS_ACTIVE, std::memory_order_relaxed,
337
- std::memory_order_relaxed);
338
- break;
339
- case TIMER_PENDING_CALLS_SEEN_SINCE_TIMER_START:
340
- // Change the state to PROCESSING to block IncreaseCallCount() until the
341
- // StartIdleTimer() operation finishes, preventing mistakenly restarting
342
- // the timer after grpc_timer_cancel() when shutdown.
343
- finished = chand->state_.compare_exchange_weak(
344
- state, PROCESSING, std::memory_order_acquire,
345
- std::memory_order_relaxed);
346
- if (finished) {
347
- chand->StartIdleTimer();
348
- chand->state_.store(TIMER_PENDING, std::memory_order_relaxed);
349
- }
350
- break;
351
- default:
352
- // The state has not been switched to desired value yet, try again.
353
- state = chand->state_.load(std::memory_order_relaxed);
354
- break;
355
- }
174
+ if (chand->idle_filter_state_.CheckTimer()) {
175
+ chand->StartIdleTimer();
176
+ } else {
177
+ chand->EnterIdle();
356
178
  }
357
179
  GRPC_IDLE_FILTER_LOG("timer finishes");
358
180
  GRPC_CHANNEL_STACK_UNREF(chand->channel_stack_, "max idle timer callback");
@@ -368,7 +190,7 @@ void ChannelData::StartIdleTimer() {
368
190
  GRPC_IDLE_FILTER_LOG("timer has started");
369
191
  // Hold a ref to the channel stack for the timer callback.
370
192
  GRPC_CHANNEL_STACK_REF(channel_stack_, "max idle timer callback");
371
- grpc_timer_init(&idle_timer_, last_idle_time_ + client_idle_timeout_,
193
+ grpc_timer_init(&idle_timer_, ExecCtx::Get()->Now() + client_idle_timeout_,
372
194
  &idle_timer_callback_);
373
195
  }
374
196
 
@@ -422,26 +244,21 @@ const grpc_channel_filter grpc_client_idle_filter = {
422
244
  grpc_channel_next_get_info,
423
245
  "client_idle"};
424
246
 
425
- static bool MaybeAddClientIdleFilter(grpc_channel_stack_builder* builder,
426
- void* /*arg*/) {
427
- const grpc_channel_args* channel_args =
428
- grpc_channel_stack_builder_get_channel_arguments(builder);
429
- if (!grpc_channel_args_want_minimal_stack(channel_args) &&
430
- GetClientIdleTimeout(channel_args) != INT_MAX) {
431
- return grpc_channel_stack_builder_prepend_filter(
432
- builder, &grpc_client_idle_filter, nullptr, nullptr);
433
- } else {
434
- return true;
435
- }
436
- }
437
-
438
247
  } // namespace
439
- } // namespace grpc_core
440
248
 
441
- void grpc_client_idle_filter_init(void) {
442
- grpc_channel_init_register_stage(
249
+ void RegisterClientIdleFilter(CoreConfiguration::Builder* builder) {
250
+ builder->channel_init()->RegisterStage(
443
251
  GRPC_CLIENT_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
444
- grpc_core::MaybeAddClientIdleFilter, nullptr);
252
+ [](grpc_channel_stack_builder* builder) {
253
+ const grpc_channel_args* channel_args =
254
+ grpc_channel_stack_builder_get_channel_arguments(builder);
255
+ if (!grpc_channel_args_want_minimal_stack(channel_args) &&
256
+ GetClientIdleTimeout(channel_args) != INT_MAX) {
257
+ return grpc_channel_stack_builder_prepend_filter(
258
+ builder, &grpc_client_idle_filter, nullptr, nullptr);
259
+ } else {
260
+ return true;
261
+ }
262
+ });
445
263
  }
446
-
447
- void grpc_client_idle_filter_shutdown(void) {}
264
+ } // namespace grpc_core
@@ -0,0 +1,96 @@
1
+ // Copyright 2021 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include <grpc/support/port_platform.h>
16
+
17
+ #include "src/core/ext/filters/client_idle/idle_filter_state.h"
18
+
19
+ #include <assert.h>
20
+
21
+ namespace grpc_core {
22
+
23
+ IdleFilterState::IdleFilterState(bool start_timer)
24
+ : state_(start_timer ? kTimerStarted : 0) {}
25
+
26
+ void IdleFilterState::IncreaseCallCount() {
27
+ uintptr_t state = state_.load(std::memory_order_relaxed);
28
+ uintptr_t new_state;
29
+ do {
30
+ // Increment the counter, and flag that there's been activity.
31
+ new_state = state;
32
+ new_state |= kCallsStartedSinceLastTimerCheck;
33
+ new_state += kCallIncrement;
34
+ } while (!state_.compare_exchange_weak(
35
+ state, new_state, std::memory_order_acq_rel, std::memory_order_relaxed));
36
+ }
37
+
38
+ bool IdleFilterState::DecreaseCallCount() {
39
+ uintptr_t state = state_.load(std::memory_order_relaxed);
40
+ uintptr_t new_state;
41
+ bool start_timer;
42
+ do {
43
+ start_timer = false;
44
+ new_state = state;
45
+ // Decrement call count (and assert there's at least one call outstanding!)
46
+ assert(new_state >= kCallIncrement);
47
+ new_state -= kCallIncrement;
48
+ // If that decrement reaches a call count of zero and we have not started a
49
+ // timer
50
+ if ((new_state >> kCallsInProgressShift) == 0 &&
51
+ (new_state & kTimerStarted) == 0) {
52
+ // Flag that we will start a timer, and mark it started so nobody else
53
+ // does.
54
+ start_timer = true;
55
+ new_state |= kTimerStarted;
56
+ new_state &= ~kCallsInProgressShift;
57
+ }
58
+ } while (!state_.compare_exchange_weak(
59
+ state, new_state, std::memory_order_acq_rel, std::memory_order_relaxed));
60
+ return start_timer;
61
+ }
62
+
63
+ bool IdleFilterState::CheckTimer() {
64
+ uintptr_t state = state_.load(std::memory_order_relaxed);
65
+ uintptr_t new_state;
66
+ bool start_timer;
67
+ do {
68
+ if ((state >> kCallsInProgressShift) != 0) {
69
+ // Still calls in progress: nothing needs updating, just return
70
+ // and keep the timer going!
71
+ return true;
72
+ }
73
+ new_state = state;
74
+ bool is_active = false;
75
+ if (new_state & kCallsStartedSinceLastTimerCheck) {
76
+ // If any calls started since the last time we checked, then consider the
77
+ // channel still active and try again.
78
+ is_active = true;
79
+ new_state &= ~kCallsStartedSinceLastTimerCheck;
80
+ }
81
+ if (is_active) {
82
+ // If we are still active, we should signal that the timer should start
83
+ // again.
84
+ start_timer = true;
85
+ } else {
86
+ // Otherwise, we should not start the timer again, and we should signal
87
+ // that in the updated state.
88
+ start_timer = false;
89
+ new_state &= ~kTimerStarted;
90
+ }
91
+ } while (!state_.compare_exchange_weak(
92
+ state, new_state, std::memory_order_acq_rel, std::memory_order_relaxed));
93
+ return start_timer;
94
+ }
95
+
96
+ } // namespace grpc_core
@@ -0,0 +1,66 @@
1
+ // Copyright 2021 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_IDLE_IDLE_FILTER_STATE_H
16
+ #define GRPC_CORE_EXT_FILTERS_CLIENT_IDLE_IDLE_FILTER_STATE_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <atomic>
21
+
22
+ namespace grpc_core {
23
+
24
+ // State machine for the idle filter.
25
+ // Keeps track of how many calls are in progress, whether there is a timer
26
+ // started, and whether we've seen calls since the previous timer fired.
27
+ class IdleFilterState {
28
+ public:
29
+ explicit IdleFilterState(bool start_timer);
30
+ ~IdleFilterState() = default;
31
+
32
+ IdleFilterState(const IdleFilterState&);
33
+ IdleFilterState& operator=(const IdleFilterState&);
34
+
35
+ // Increment the number of calls in progress.
36
+ void IncreaseCallCount();
37
+
38
+ // Decrement the number of calls in progress.
39
+ // Return true if we reached idle with no timer started.
40
+ GRPC_MUST_USE_RESULT bool DecreaseCallCount();
41
+
42
+ // Check if there's been any activity since the last timer check.
43
+ // If there was, reset the activity flag and return true to indicated that
44
+ // a new timer should be started.
45
+ // If there was not, reset the timer flag and return false - in this case
46
+ // we know that the channel is idle and has been for one full cycle.
47
+ GRPC_MUST_USE_RESULT bool CheckTimer();
48
+
49
+ private:
50
+ // Bit in state_ indicating that the timer has been started.
51
+ static constexpr uintptr_t kTimerStarted = 1;
52
+ // Bit in state_ indicating that we've seen a call start or stop since the
53
+ // last timer.
54
+ static constexpr uintptr_t kCallsStartedSinceLastTimerCheck = 2;
55
+ // How much should we shift to get the number of calls in progress.
56
+ static constexpr uintptr_t kCallsInProgressShift = 2;
57
+ // How much to increment/decrement the state_ when a call is started/stopped.
58
+ // Ensures we don't clobber the preceding bits.
59
+ static constexpr uintptr_t kCallIncrement = uintptr_t(1)
60
+ << kCallsInProgressShift;
61
+ std::atomic<uintptr_t> state_;
62
+ };
63
+
64
+ } // namespace grpc_core
65
+
66
+ #endif // GRPC_CORE_EXT_FILTERS_CLIENT_IDLE_IDLE_FILTER_STATE_H
@@ -27,10 +27,10 @@
27
27
  #include <grpc/support/time.h>
28
28
 
29
29
  #include "src/core/lib/channel/channel_stack_builder.h"
30
+ #include "src/core/lib/config/core_configuration.h"
30
31
  #include "src/core/lib/gprpp/memory.h"
31
32
  #include "src/core/lib/iomgr/timer.h"
32
33
  #include "src/core/lib/slice/slice_internal.h"
33
- #include "src/core/lib/surface/channel_init.h"
34
34
 
35
35
  namespace grpc_core {
36
36
 
@@ -114,9 +114,7 @@ class TimerState {
114
114
  // synchronized.
115
115
  static void start_timer_if_needed(grpc_call_element* elem,
116
116
  grpc_millis deadline) {
117
- if (deadline == GRPC_MILLIS_INF_FUTURE) {
118
- return;
119
- }
117
+ if (deadline == GRPC_MILLIS_INF_FUTURE) return;
120
118
  grpc_deadline_state* deadline_state =
121
119
  static_cast<grpc_deadline_state*>(elem->call_data);
122
120
  GPR_ASSERT(deadline_state->timer_state == nullptr);
@@ -295,7 +293,9 @@ static void deadline_client_start_transport_stream_op_batch(
295
293
  static void recv_initial_metadata_ready(void* arg, grpc_error_handle error) {
296
294
  grpc_call_element* elem = static_cast<grpc_call_element*>(arg);
297
295
  server_call_data* calld = static_cast<server_call_data*>(elem->call_data);
298
- start_timer_if_needed(elem, calld->recv_initial_metadata->deadline);
296
+ start_timer_if_needed(
297
+ elem, calld->recv_initial_metadata->get(grpc_core::GrpcTimeoutMetadata())
298
+ .value_or(GRPC_MILLIS_INF_FUTURE));
299
299
  // Invoke the next callback.
300
300
  grpc_core::Closure::Run(DEBUG_LOCATION,
301
301
  calld->next_recv_initial_metadata_ready,
@@ -370,25 +370,22 @@ bool grpc_deadline_checking_enabled(const grpc_channel_args* channel_args) {
370
370
  !grpc_channel_args_want_minimal_stack(channel_args));
371
371
  }
372
372
 
373
- static bool maybe_add_deadline_filter(grpc_channel_stack_builder* builder,
374
- void* arg) {
375
- return grpc_deadline_checking_enabled(
376
- grpc_channel_stack_builder_get_channel_arguments(builder))
377
- ? grpc_channel_stack_builder_prepend_filter(
378
- builder, static_cast<const grpc_channel_filter*>(arg),
379
- nullptr, nullptr)
380
- : true;
381
- }
382
-
383
- void grpc_deadline_filter_init(void) {
384
- grpc_channel_init_register_stage(
385
- GRPC_CLIENT_DIRECT_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
386
- maybe_add_deadline_filter,
387
- const_cast<grpc_channel_filter*>(&grpc_client_deadline_filter));
388
- grpc_channel_init_register_stage(
389
- GRPC_SERVER_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
390
- maybe_add_deadline_filter,
391
- const_cast<grpc_channel_filter*>(&grpc_server_deadline_filter));
373
+ namespace grpc_core {
374
+ void RegisterDeadlineFilter(CoreConfiguration::Builder* builder) {
375
+ auto register_filter = [builder](grpc_channel_stack_type type,
376
+ const grpc_channel_filter* filter) {
377
+ builder->channel_init()->RegisterStage(
378
+ type, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY,
379
+ [filter](grpc_channel_stack_builder* builder) {
380
+ if (grpc_deadline_checking_enabled(
381
+ grpc_channel_stack_builder_get_channel_arguments(builder))) {
382
+ return grpc_channel_stack_builder_prepend_filter(builder, filter,
383
+ nullptr, nullptr);
384
+ }
385
+ return true;
386
+ });
387
+ };
388
+ register_filter(GRPC_CLIENT_DIRECT_CHANNEL, &grpc_client_deadline_filter);
389
+ register_filter(GRPC_SERVER_CHANNEL, &grpc_server_deadline_filter);
392
390
  }
393
-
394
- void grpc_deadline_filter_shutdown(void) {}
391
+ } // namespace grpc_core
@@ -25,9 +25,8 @@
25
25
  #include <grpc/support/alloc.h>
26
26
  #include <grpc/support/log.h>
27
27
 
28
- #include "src/core/ext/filters/client_channel/service_config.h"
29
- #include "src/core/ext/filters/client_channel/service_config_call_data.h"
30
28
  #include "src/core/ext/filters/fault_injection/service_config_parser.h"
29
+ #include "src/core/ext/service_config/service_config_call_data.h"
31
30
  #include "src/core/lib/channel/channel_stack.h"
32
31
  #include "src/core/lib/channel/status_util.h"
33
32
  #include "src/core/lib/gprpp/sync.h"
@@ -46,27 +45,27 @@ static_assert(
46
45
  std::is_trivially_destructible<std::atomic<uint32_t>>::value,
47
46
  "the active fault counter needs to have a trivially destructible type");
48
47
 
49
- inline int GetLinkedMetadatumValueInt(grpc_linked_mdelem* md) {
48
+ inline int GetMetadatumValueInt(grpc_mdelem md) {
50
49
  int res;
51
- if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md->md)), &res)) {
50
+ if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md)), &res)) {
52
51
  return res;
53
52
  } else {
54
53
  return -1;
55
54
  }
56
55
  }
57
56
 
58
- inline uint32_t GetLinkedMetadatumValueUnsignedInt(grpc_linked_mdelem* md) {
57
+ inline uint32_t GetMetadatumValueUnsignedInt(grpc_mdelem md) {
59
58
  uint32_t res;
60
- if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md->md)), &res)) {
59
+ if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md)), &res)) {
61
60
  return res;
62
61
  } else {
63
62
  return -1;
64
63
  }
65
64
  }
66
65
 
67
- inline int64_t GetLinkedMetadatumValueInt64(grpc_linked_mdelem* md) {
66
+ inline int64_t GetMetadatumValueInt64(grpc_mdelem md) {
68
67
  int64_t res;
69
- if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md->md)), &res)) {
68
+ if (absl::SimpleAtoi(StringViewFromSlice(GRPC_MDVALUE(md)), &res)) {
70
69
  return res;
71
70
  } else {
72
71
  return -1;
@@ -347,9 +346,8 @@ void CallData::DecideWhetherToInjectFaults(
347
346
  *fi_policy_);
348
347
  }
349
348
  };
350
- for (grpc_linked_mdelem* md = initial_metadata->list.head; md != nullptr;
351
- md = md->next) {
352
- absl::string_view key = StringViewFromSlice(GRPC_MDKEY(md->md));
349
+ initial_metadata->ForEach([&](grpc_mdelem md) {
350
+ absl::string_view key = StringViewFromSlice(GRPC_MDKEY(md));
353
351
  // Only perform string comparison if:
354
352
  // 1. Needs to check this header;
355
353
  // 2. The value is not been filled before.
@@ -358,31 +356,31 @@ void CallData::DecideWhetherToInjectFaults(
358
356
  copied_policy->abort_code == GRPC_STATUS_OK) &&
359
357
  key == fi_policy_->abort_code_header) {
360
358
  maybe_copy_policy_func();
361
- grpc_status_code_from_int(GetLinkedMetadatumValueInt(md),
359
+ grpc_status_code_from_int(GetMetadatumValueInt(md),
362
360
  &copied_policy->abort_code);
363
361
  }
364
362
  if (!fi_policy_->abort_percentage_header.empty() &&
365
363
  key == fi_policy_->abort_percentage_header) {
366
364
  maybe_copy_policy_func();
367
365
  copied_policy->abort_percentage_numerator =
368
- GPR_MIN(GetLinkedMetadatumValueUnsignedInt(md),
369
- fi_policy_->abort_percentage_numerator);
366
+ std::min(GetMetadatumValueUnsignedInt(md),
367
+ fi_policy_->abort_percentage_numerator);
370
368
  }
371
369
  if (!fi_policy_->delay_header.empty() &&
372
370
  (copied_policy == nullptr || copied_policy->delay == 0) &&
373
371
  key == fi_policy_->delay_header) {
374
372
  maybe_copy_policy_func();
375
373
  copied_policy->delay = static_cast<grpc_millis>(
376
- GPR_MAX(GetLinkedMetadatumValueInt64(md), 0));
374
+ std::max(GetMetadatumValueInt64(md), int64_t(0)));
377
375
  }
378
376
  if (!fi_policy_->delay_percentage_header.empty() &&
379
377
  key == fi_policy_->delay_percentage_header) {
380
378
  maybe_copy_policy_func();
381
379
  copied_policy->delay_percentage_numerator =
382
- GPR_MIN(GetLinkedMetadatumValueUnsignedInt(md),
383
- fi_policy_->delay_percentage_numerator);
380
+ std::min(GetMetadatumValueUnsignedInt(md),
381
+ fi_policy_->delay_percentage_numerator);
384
382
  }
385
- }
383
+ });
386
384
  if (copied_policy != nullptr) fi_policy_ = copied_policy;
387
385
  }
388
386
  // Roll the dice
@@ -456,8 +454,10 @@ void CallData::ResumeBatch(void* arg, grpc_error_handle error) {
456
454
  // Abort if needed.
457
455
  error = calld->MaybeAbort();
458
456
  if (error != GRPC_ERROR_NONE) {
457
+ calld->abort_error_ = error;
459
458
  grpc_transport_stream_op_batch_finish_with_failure(
460
- calld->delayed_batch_, error, calld->call_combiner_);
459
+ calld->delayed_batch_, GRPC_ERROR_REF(calld->abort_error_),
460
+ calld->call_combiner_);
461
461
  return;
462
462
  }
463
463
  // Chain to the next filter.