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
@@ -13,60 +13,59 @@
13
13
  // limitations under the License.
14
14
  #include <grpc/support/port_platform.h>
15
15
 
16
- #include "src/core/lib/event_engine/iomgr_engine.h"
16
+ #include "src/core/lib/event_engine/iomgr_engine/iomgr_engine.h"
17
17
 
18
+ #include <algorithm>
18
19
  #include <string>
19
- #include <type_traits>
20
20
  #include <utility>
21
21
 
22
- #include "absl/cleanup/cleanup.h"
23
22
  #include "absl/container/flat_hash_set.h"
24
23
  #include "absl/strings/str_cat.h"
25
- #include "absl/time/clock.h"
26
24
 
27
25
  #include <grpc/event_engine/event_engine.h>
28
26
  #include <grpc/support/log.h>
29
27
 
30
28
  #include "src/core/lib/debug/trace.h"
29
+ #include "src/core/lib/event_engine/iomgr_engine/timer.h"
31
30
  #include "src/core/lib/event_engine/trace.h"
32
- #include "src/core/lib/gprpp/match.h"
33
31
  #include "src/core/lib/gprpp/time.h"
34
- #include "src/core/lib/iomgr/closure.h"
35
- #include "src/core/lib/iomgr/error.h"
36
- #include "src/core/lib/iomgr/exec_ctx.h"
37
- #include "src/core/lib/iomgr/executor.h"
38
- #include "src/core/lib/iomgr/timer.h"
39
32
 
40
33
  namespace grpc_event_engine {
41
34
  namespace experimental {
42
35
 
43
36
  namespace {
44
37
 
45
- struct ClosureData {
46
- grpc_timer timer;
47
- grpc_closure closure;
48
- absl::variant<std::function<void()>, EventEngine::Closure*> cb;
49
- IomgrEventEngine* engine;
50
- EventEngine::TaskHandle handle;
51
- };
52
-
53
- // Timer limits due to quirks in the iomgr implementation.
54
- // If deadline <= Now, the callback will be run inline, which can result in lock
55
- // issues. And absl::InfiniteFuture yields UB.
56
- absl::Time Clamp(absl::Time when) {
57
- absl::Time max = absl::Now() + absl::Hours(8766);
58
- absl::Time min = absl::Now() + absl::Milliseconds(2);
59
- if (when > max) return max;
60
- if (when < min) return min;
61
- return when;
62
- }
63
-
64
38
  std::string HandleToString(EventEngine::TaskHandle handle) {
65
39
  return absl::StrCat("{", handle.keys[0], ",", handle.keys[1], "}");
66
40
  }
67
41
 
68
42
  } // namespace
69
43
 
44
+ grpc_core::Timestamp IomgrEventEngine::ToTimestamp(EventEngine::Duration when) {
45
+ return timer_manager_.Now() +
46
+ std::max(grpc_core::Duration::Milliseconds(1),
47
+ grpc_core::Duration::NanosecondsRoundUp(when.count())) +
48
+ grpc_core::Duration::Milliseconds(1);
49
+ }
50
+
51
+ struct IomgrEventEngine::ClosureData final : public EventEngine::Closure {
52
+ std::function<void()> cb;
53
+ iomgr_engine::Timer timer;
54
+ IomgrEventEngine* engine;
55
+ EventEngine::TaskHandle handle;
56
+
57
+ void Run() override {
58
+ GRPC_EVENT_ENGINE_TRACE("IomgrEventEngine:%p executing callback:%s", engine,
59
+ HandleToString(handle).c_str());
60
+ {
61
+ grpc_core::MutexLock lock(&engine->mu_);
62
+ engine->known_handles_.erase(handle);
63
+ }
64
+ cb();
65
+ delete this;
66
+ }
67
+ };
68
+
70
69
  IomgrEventEngine::IomgrEventEngine() {}
71
70
 
72
71
  IomgrEventEngine::~IomgrEventEngine() {
@@ -83,66 +82,39 @@ IomgrEventEngine::~IomgrEventEngine() {
83
82
  }
84
83
 
85
84
  bool IomgrEventEngine::Cancel(EventEngine::TaskHandle handle) {
86
- grpc_core::ExecCtx ctx;
87
85
  grpc_core::MutexLock lock(&mu_);
88
86
  if (!known_handles_.contains(handle)) return false;
89
87
  auto* cd = reinterpret_cast<ClosureData*>(handle.keys[0]);
90
- grpc_timer_cancel(&cd->timer);
88
+ bool r = timer_manager_.TimerCancel(&cd->timer);
91
89
  known_handles_.erase(handle);
92
- return true;
90
+ if (r) delete cd;
91
+ return r;
93
92
  }
94
93
 
95
- EventEngine::TaskHandle IomgrEventEngine::RunAt(absl::Time when,
96
- std::function<void()> closure) {
97
- return RunAtInternal(when, std::move(closure));
94
+ EventEngine::TaskHandle IomgrEventEngine::RunAfter(
95
+ Duration when, std::function<void()> closure) {
96
+ return RunAfterInternal(when, std::move(closure));
98
97
  }
99
98
 
100
- EventEngine::TaskHandle IomgrEventEngine::RunAt(absl::Time when,
101
- EventEngine::Closure* closure) {
102
- return RunAtInternal(when, closure);
99
+ EventEngine::TaskHandle IomgrEventEngine::RunAfter(
100
+ Duration when, EventEngine::Closure* closure) {
101
+ return RunAfterInternal(when, [closure]() { closure->Run(); });
103
102
  }
104
103
 
105
104
  void IomgrEventEngine::Run(std::function<void()> closure) {
106
- RunInternal(closure);
105
+ thread_pool_.Add(closure);
107
106
  }
108
107
 
109
108
  void IomgrEventEngine::Run(EventEngine::Closure* closure) {
110
- RunInternal(closure);
109
+ thread_pool_.Add([closure]() { closure->Run(); });
111
110
  }
112
111
 
113
- EventEngine::TaskHandle IomgrEventEngine::RunAtInternal(
114
- absl::Time when,
115
- absl::variant<std::function<void()>, EventEngine::Closure*> cb) {
116
- when = Clamp(when);
117
- grpc_core::ExecCtx ctx;
112
+ EventEngine::TaskHandle IomgrEventEngine::RunAfterInternal(
113
+ Duration when, std::function<void()> cb) {
114
+ auto when_ts = ToTimestamp(when);
118
115
  auto* cd = new ClosureData;
119
116
  cd->cb = std::move(cb);
120
117
  cd->engine = this;
121
- GRPC_CLOSURE_INIT(
122
- &cd->closure,
123
- [](void* arg, grpc_error_handle error) {
124
- auto* cd = static_cast<ClosureData*>(arg);
125
- GRPC_EVENT_ENGINE_TRACE("IomgrEventEngine:%p executing callback:%s",
126
- cd->engine, HandleToString(cd->handle).c_str());
127
- {
128
- grpc_core::MutexLock lock(&cd->engine->mu_);
129
- cd->engine->known_handles_.erase(cd->handle);
130
- }
131
- auto cleaner = absl::MakeCleanup([cd] { delete cd; });
132
- if (error == GRPC_ERROR_CANCELLED) return;
133
- grpc_core::Match(
134
- cd->cb, [](EventEngine::Closure* cb) { cb->Run(); },
135
- [](std::function<void()> fn) { fn(); });
136
- },
137
- cd, nullptr);
138
- // kludge to deal with realtime/monotonic clock conversion
139
- absl::Time absl_now = absl::Now();
140
- grpc_core::Duration duration = grpc_core::Duration::Milliseconds(
141
- absl::ToInt64Milliseconds(when - absl_now) + 1);
142
- grpc_core::ExecCtx::Get()->InvalidateNow();
143
- grpc_core::Timestamp when_internal = grpc_core::ExecCtx::Get()->Now() +
144
- duration +
145
- grpc_core::Duration::Milliseconds(1);
146
118
  EventEngine::TaskHandle handle{reinterpret_cast<intptr_t>(cd),
147
119
  aba_token_.fetch_add(1)};
148
120
  grpc_core::MutexLock lock(&mu_);
@@ -150,29 +122,10 @@ EventEngine::TaskHandle IomgrEventEngine::RunAtInternal(
150
122
  cd->handle = handle;
151
123
  GRPC_EVENT_ENGINE_TRACE("IomgrEventEngine:%p scheduling callback:%s", this,
152
124
  HandleToString(handle).c_str());
153
- grpc_timer_init(&cd->timer, when_internal, &cd->closure);
125
+ timer_manager_.TimerInit(&cd->timer, when_ts, cd);
154
126
  return handle;
155
127
  }
156
128
 
157
- void IomgrEventEngine::RunInternal(
158
- absl::variant<std::function<void()>, EventEngine::Closure*> cb) {
159
- auto* cd = new ClosureData;
160
- cd->cb = std::move(cb);
161
- cd->engine = this;
162
- GRPC_CLOSURE_INIT(
163
- &cd->closure,
164
- [](void* arg, grpc_error_handle /*error*/) {
165
- auto* cd = static_cast<ClosureData*>(arg);
166
- auto cleaner = absl::MakeCleanup([cd] { delete cd; });
167
- grpc_core::Match(
168
- cd->cb, [](EventEngine::Closure* cb) { cb->Run(); },
169
- [](std::function<void()> fn) { fn(); });
170
- },
171
- cd, nullptr);
172
- // TODO(hork): have the EE spawn dedicated closure thread(s)
173
- grpc_core::Executor::Run(&cd->closure, GRPC_ERROR_NONE);
174
- }
175
-
176
129
  std::unique_ptr<EventEngine::DNSResolver> IomgrEventEngine::GetDNSResolver(
177
130
  EventEngine::DNSResolver::ResolverOptions const& /*options*/) {
178
131
  GPR_ASSERT(false && "unimplemented");
@@ -189,7 +142,7 @@ bool IomgrEventEngine::CancelConnect(EventEngine::ConnectionHandle /*handle*/) {
189
142
  EventEngine::ConnectionHandle IomgrEventEngine::Connect(
190
143
  OnConnectCallback /*on_connect*/, const ResolvedAddress& /*addr*/,
191
144
  const EndpointConfig& /*args*/, MemoryAllocator /*memory_allocator*/,
192
- absl::Time /*deadline*/) {
145
+ Duration /*deadline*/) {
193
146
  GPR_ASSERT(false && "unimplemented");
194
147
  }
195
148
 
@@ -11,8 +11,8 @@
11
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
- #ifndef GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_H
15
- #define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_H
14
+ #ifndef GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_IOMGR_ENGINE_H
15
+ #define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_IOMGR_ENGINE_H
16
16
  #include <grpc/support/port_platform.h>
17
17
 
18
18
  #include <stdint.h>
@@ -25,8 +25,6 @@
25
25
  #include "absl/status/status.h"
26
26
  #include "absl/status/statusor.h"
27
27
  #include "absl/strings/string_view.h"
28
- #include "absl/time/time.h"
29
- #include "absl/types/variant.h"
30
28
 
31
29
  #include <grpc/event_engine/endpoint_config.h>
32
30
  #include <grpc/event_engine/event_engine.h>
@@ -34,11 +32,16 @@
34
32
  #include <grpc/event_engine/slice_buffer.h>
35
33
 
36
34
  #include "src/core/lib/event_engine/handle_containers.h"
35
+ #include "src/core/lib/event_engine/iomgr_engine/thread_pool.h"
36
+ #include "src/core/lib/event_engine/iomgr_engine/timer_manager.h"
37
37
  #include "src/core/lib/gprpp/sync.h"
38
+ #include "src/core/lib/gprpp/time.h"
38
39
 
39
40
  namespace grpc_event_engine {
40
41
  namespace experimental {
41
42
 
43
+ // An iomgr-based EventEngine implementation.
44
+ // All methods require an ExecCtx to already exist on the thread's stack.
42
45
  class IomgrEventEngine final : public EventEngine {
43
46
  public:
44
47
  class IomgrEndpoint : public EventEngine::Endpoint {
@@ -63,13 +66,13 @@ class IomgrEventEngine final : public EventEngine {
63
66
  LookupTaskHandle LookupHostname(LookupHostnameCallback on_resolve,
64
67
  absl::string_view name,
65
68
  absl::string_view default_port,
66
- absl::Time deadline) override;
69
+ Duration timeout) override;
67
70
  LookupTaskHandle LookupSRV(LookupSRVCallback on_resolve,
68
71
  absl::string_view name,
69
- absl::Time deadline) override;
72
+ Duration timeout) override;
70
73
  LookupTaskHandle LookupTXT(LookupTXTCallback on_resolve,
71
74
  absl::string_view name,
72
- absl::Time deadline) override;
75
+ Duration timeout) override;
73
76
  bool CancelLookup(LookupTaskHandle handle) override;
74
77
  };
75
78
 
@@ -87,7 +90,7 @@ class IomgrEventEngine final : public EventEngine {
87
90
  const ResolvedAddress& addr,
88
91
  const EndpointConfig& args,
89
92
  MemoryAllocator memory_allocator,
90
- absl::Time deadline) override;
93
+ Duration timeout) override;
91
94
 
92
95
  bool CancelConnect(ConnectionHandle handle) override;
93
96
  bool IsWorkerThread() override;
@@ -95,17 +98,18 @@ class IomgrEventEngine final : public EventEngine {
95
98
  const DNSResolver::ResolverOptions& options) override;
96
99
  void Run(Closure* closure) override;
97
100
  void Run(std::function<void()> closure) override;
98
- TaskHandle RunAt(absl::Time when, Closure* closure) override;
99
- TaskHandle RunAt(absl::Time when, std::function<void()> closure) override;
101
+ TaskHandle RunAfter(Duration when, Closure* closure) override;
102
+ TaskHandle RunAfter(Duration when, std::function<void()> closure) override;
100
103
  bool Cancel(TaskHandle handle) override;
101
104
 
102
105
  private:
103
- EventEngine::TaskHandle RunAtInternal(
104
- absl::Time when,
105
- absl::variant<std::function<void()>, EventEngine::Closure*> cb);
106
+ struct ClosureData;
107
+ EventEngine::TaskHandle RunAfterInternal(Duration when,
108
+ std::function<void()> cb);
109
+ grpc_core::Timestamp ToTimestamp(EventEngine::Duration when);
106
110
 
107
- void RunInternal(
108
- absl::variant<std::function<void()>, EventEngine::Closure*> cb);
111
+ iomgr_engine::TimerManager timer_manager_;
112
+ iomgr_engine::ThreadPool thread_pool_{2};
109
113
 
110
114
  grpc_core::Mutex mu_;
111
115
  TaskHandleSet known_handles_ ABSL_GUARDED_BY(mu_);
@@ -115,4 +119,4 @@ class IomgrEventEngine final : public EventEngine {
115
119
  } // namespace experimental
116
120
  } // namespace grpc_event_engine
117
121
 
118
- #endif // GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_H
122
+ #endif // GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_IOMGR_ENGINE_H
@@ -0,0 +1,123 @@
1
+ /*
2
+ *
3
+ * Copyright 2015 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+
19
+ #include <grpc/support/port_platform.h>
20
+
21
+ #include "src/core/lib/event_engine/iomgr_engine/thread_pool.h"
22
+
23
+ #include "src/core/lib/gprpp/thd.h"
24
+
25
+ namespace grpc_event_engine {
26
+ namespace iomgr_engine {
27
+
28
+ ThreadPool::Thread::Thread(ThreadPool* pool)
29
+ : pool_(pool),
30
+ thd_(
31
+ "iomgr_eventengine_pool",
32
+ [](void* th) { static_cast<ThreadPool::Thread*>(th)->ThreadFunc(); },
33
+ this) {
34
+ thd_.Start();
35
+ }
36
+ ThreadPool::Thread::~Thread() { thd_.Join(); }
37
+
38
+ void ThreadPool::Thread::ThreadFunc() {
39
+ pool_->ThreadFunc();
40
+ // Now that we have killed ourselves, we should reduce the thread count
41
+ grpc_core::MutexLock lock(&pool_->mu_);
42
+ pool_->nthreads_--;
43
+ // Move ourselves to dead list
44
+ pool_->dead_threads_.push_back(this);
45
+
46
+ if ((pool_->shutdown_) && (pool_->nthreads_ == 0)) {
47
+ pool_->shutdown_cv_.Signal();
48
+ }
49
+ }
50
+
51
+ void ThreadPool::ThreadFunc() {
52
+ for (;;) {
53
+ // Wait until work is available or we are shutting down.
54
+ grpc_core::ReleasableMutexLock lock(&mu_);
55
+ if (!shutdown_ && callbacks_.empty()) {
56
+ // If there are too many threads waiting, then quit this thread
57
+ if (threads_waiting_ >= reserve_threads_) {
58
+ break;
59
+ }
60
+ threads_waiting_++;
61
+ cv_.Wait(&mu_);
62
+ threads_waiting_--;
63
+ }
64
+ // Drain callbacks before considering shutdown to ensure all work
65
+ // gets completed.
66
+ if (!callbacks_.empty()) {
67
+ auto cb = callbacks_.front();
68
+ callbacks_.pop();
69
+ lock.Release();
70
+ cb();
71
+ } else if (shutdown_) {
72
+ break;
73
+ }
74
+ }
75
+ }
76
+
77
+ ThreadPool::ThreadPool(int reserve_threads)
78
+ : shutdown_(false),
79
+ reserve_threads_(reserve_threads),
80
+ nthreads_(0),
81
+ threads_waiting_(0) {
82
+ for (int i = 0; i < reserve_threads_; i++) {
83
+ grpc_core::MutexLock lock(&mu_);
84
+ nthreads_++;
85
+ new Thread(this);
86
+ }
87
+ }
88
+
89
+ void ThreadPool::ReapThreads(std::vector<Thread*>* tlist) {
90
+ for (auto* t : *tlist) delete t;
91
+ tlist->clear();
92
+ }
93
+
94
+ ThreadPool::~ThreadPool() {
95
+ grpc_core::MutexLock lock(&mu_);
96
+ shutdown_ = true;
97
+ cv_.SignalAll();
98
+ while (nthreads_ != 0) {
99
+ shutdown_cv_.Wait(&mu_);
100
+ }
101
+ ReapThreads(&dead_threads_);
102
+ }
103
+
104
+ void ThreadPool::Add(const std::function<void()>& callback) {
105
+ grpc_core::MutexLock lock(&mu_);
106
+ // Add works to the callbacks list
107
+ callbacks_.push(callback);
108
+ // Increase pool size or notify as needed
109
+ if (threads_waiting_ == 0) {
110
+ // Kick off a new thread
111
+ nthreads_++;
112
+ new Thread(this);
113
+ } else {
114
+ cv_.Signal();
115
+ }
116
+ // Also use this chance to harvest dead threads
117
+ if (!dead_threads_.empty()) {
118
+ ReapThreads(&dead_threads_);
119
+ }
120
+ }
121
+
122
+ } // namespace iomgr_engine
123
+ } // namespace grpc_event_engine
@@ -0,0 +1,70 @@
1
+ /*
2
+ *
3
+ * Copyright 2015 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+
19
+ #ifndef GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_THREAD_POOL_H
20
+ #define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_THREAD_POOL_H
21
+
22
+ #include <grpc/support/port_platform.h>
23
+
24
+ #include <functional>
25
+ #include <queue>
26
+ #include <vector>
27
+
28
+ #include "src/core/lib/gprpp/sync.h"
29
+ #include "src/core/lib/gprpp/thd.h"
30
+
31
+ namespace grpc_event_engine {
32
+ namespace iomgr_engine {
33
+
34
+ class ThreadPool final {
35
+ public:
36
+ explicit ThreadPool(int reserve_threads);
37
+ ~ThreadPool();
38
+
39
+ void Add(const std::function<void()>& callback);
40
+
41
+ private:
42
+ class Thread {
43
+ public:
44
+ explicit Thread(ThreadPool* pool);
45
+ ~Thread();
46
+
47
+ private:
48
+ ThreadPool* pool_;
49
+ grpc_core::Thread thd_;
50
+ void ThreadFunc();
51
+ };
52
+
53
+ void ThreadFunc();
54
+ static void ReapThreads(std::vector<Thread*>* tlist);
55
+
56
+ grpc_core::Mutex mu_;
57
+ grpc_core::CondVar cv_;
58
+ grpc_core::CondVar shutdown_cv_;
59
+ bool shutdown_;
60
+ std::queue<std::function<void()>> callbacks_;
61
+ int reserve_threads_;
62
+ int nthreads_;
63
+ int threads_waiting_;
64
+ std::vector<Thread*> dead_threads_;
65
+ };
66
+
67
+ } // namespace iomgr_engine
68
+ } // namespace grpc_event_engine
69
+
70
+ #endif // GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_THREAD_POOL_H
@@ -0,0 +1,62 @@
1
+ /*
2
+ *
3
+ * Copyright 2015 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+
19
+ #include <grpc/support/port_platform.h>
20
+
21
+ #include "src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h"
22
+
23
+ namespace grpc_event_engine {
24
+ namespace iomgr_engine {
25
+
26
+ TimeAveragedStats::TimeAveragedStats(double init_avg, double regress_weight,
27
+ double persistence_factor)
28
+ : init_avg_(init_avg),
29
+ regress_weight_(regress_weight),
30
+ persistence_factor_(persistence_factor) {}
31
+
32
+ void TimeAveragedStats::AddSample(double value) {
33
+ batch_total_value_ += value;
34
+ ++batch_num_samples_;
35
+ }
36
+
37
+ double TimeAveragedStats::UpdateAverage() {
38
+ /* Start with the current batch: */
39
+ double weighted_sum = batch_total_value_;
40
+ double total_weight = batch_num_samples_;
41
+ if (regress_weight_ > 0) {
42
+ /* Add in the regression towards init_avg_: */
43
+ weighted_sum += regress_weight_ * init_avg_;
44
+ total_weight += regress_weight_;
45
+ }
46
+ if (persistence_factor_ > 0) {
47
+ /* Add in the persistence: */
48
+ const double prev_sample_weight =
49
+ persistence_factor_ * aggregate_total_weight_;
50
+ weighted_sum += prev_sample_weight * aggregate_weighted_avg_;
51
+ total_weight += prev_sample_weight;
52
+ }
53
+ aggregate_weighted_avg_ =
54
+ (total_weight > 0) ? (weighted_sum / total_weight) : init_avg_;
55
+ aggregate_total_weight_ = total_weight;
56
+ batch_num_samples_ = 0;
57
+ batch_total_value_ = 0;
58
+ return aggregate_weighted_avg_;
59
+ }
60
+
61
+ } // namespace iomgr_engine
62
+ } // namespace grpc_event_engine
@@ -0,0 +1,81 @@
1
+ /*
2
+ *
3
+ * Copyright 2015 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+
19
+ #ifndef GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIME_AVERAGED_STATS_H
20
+ #define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIME_AVERAGED_STATS_H
21
+
22
+ namespace grpc_event_engine {
23
+ namespace iomgr_engine {
24
+
25
+ /* This tracks a time-decaying weighted average. It works by collecting
26
+ batches of samples and then mixing their average into a time-decaying
27
+ weighted mean. It is designed for batch operations where we do many adds
28
+ before updating the average. */
29
+
30
+ class TimeAveragedStats {
31
+ public:
32
+ TimeAveragedStats(double init_avg, double regress_weight,
33
+ double persistence_factor);
34
+
35
+ /* Add a sample to the current batch. */
36
+ void AddSample(double value);
37
+ /* Complete a batch and compute the new estimate of the average sample
38
+ value. */
39
+ double UpdateAverage();
40
+
41
+ double aggregate_weighted_avg() const { return aggregate_weighted_avg_; }
42
+ double aggregate_total_weight() const { return aggregate_total_weight_; }
43
+
44
+ private:
45
+ /* The initial average value. This is the reported average until the first
46
+ grpc_time_averaged_stats_update_average call. If a positive regress_weight
47
+ is used, we also regress towards this value on each update. */
48
+ const double init_avg_;
49
+ /* The sample weight of "init_avg" that is mixed in with each call to
50
+ grpc_time_averaged_stats_update_average. If the calls to
51
+ grpc_time_averaged_stats_add_sample stop, this will cause the average to
52
+ regress back to the mean. This should be non-negative. Set it to 0 to
53
+ disable the bias. A value of 1 has the effect of adding in 1 bonus sample
54
+ with value init_avg to each sample period. */
55
+ const double regress_weight_;
56
+ /* This determines the rate of decay of the time-averaging from one period
57
+ to the next by scaling the aggregate_total_weight of samples from prior
58
+ periods when combining with the latest period. It should be in the range
59
+ [0,1]. A higher value adapts more slowly. With a value of 0.5, if the
60
+ batches each have k samples, the samples_in_avg_ will grow to 2 k, so the
61
+ weighting of the time average will eventually be 1/3 new batch and 2/3
62
+ old average. */
63
+ const double persistence_factor_;
64
+
65
+ /* The total value of samples since the last UpdateAverage(). */
66
+ double batch_total_value_ = 0;
67
+ /* The number of samples since the last UpdateAverage(). */
68
+ double batch_num_samples_ = 0;
69
+ /* The time-decayed sum of batch_num_samples_ over previous batches. This is
70
+ the "weight" of the old aggregate_weighted_avg_ when updating the
71
+ average. */
72
+ double aggregate_total_weight_ = 0;
73
+ /* A time-decayed average of the (batch_total_value_ / batch_num_samples_),
74
+ computed by decaying the samples_in_avg_ weight in the weighted average. */
75
+ double aggregate_weighted_avg_ = init_avg_;
76
+ };
77
+
78
+ } // namespace iomgr_engine
79
+ } // namespace grpc_event_engine
80
+
81
+ #endif /* GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIME_AVERAGED_STATS_H */