grpc 1.73.0 → 1.74.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +38 -17
  3. data/include/grpc/create_channel_from_endpoint.h +54 -0
  4. data/include/grpc/credentials.h +11 -5
  5. data/include/grpc/event_engine/event_engine.h +74 -17
  6. data/include/grpc/grpc_posix.h +20 -1
  7. data/include/grpc/impl/channel_arg_names.h +2 -4
  8. data/include/grpc/module.modulemap +1 -0
  9. data/include/grpc/support/json.h +24 -0
  10. data/src/core/call/interception_chain.h +7 -11
  11. data/src/core/channelz/channel_trace.cc +213 -115
  12. data/src/core/channelz/channel_trace.h +380 -86
  13. data/src/core/channelz/channelz.cc +270 -181
  14. data/src/core/channelz/channelz.h +168 -55
  15. data/src/core/channelz/channelz_registry.cc +2 -1
  16. data/src/core/channelz/channelz_registry.h +24 -0
  17. data/src/core/channelz/property_list.cc +357 -0
  18. data/src/core/channelz/property_list.h +202 -0
  19. data/src/core/channelz/ztrace_collector.h +3 -2
  20. data/src/core/client_channel/backup_poller.cc +17 -2
  21. data/src/core/client_channel/client_channel.cc +17 -28
  22. data/src/core/client_channel/client_channel_filter.cc +19 -29
  23. data/src/core/client_channel/config_selector.h +8 -2
  24. data/src/core/client_channel/dynamic_filters.cc +5 -6
  25. data/src/core/client_channel/dynamic_filters.h +1 -1
  26. data/src/core/client_channel/global_subchannel_pool.cc +4 -1
  27. data/src/core/client_channel/retry_filter.cc +21 -27
  28. data/src/core/client_channel/retry_filter.h +10 -7
  29. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  30. data/src/core/client_channel/retry_filter_legacy_call_data.h +1 -1
  31. data/src/core/client_channel/retry_interceptor.cc +30 -44
  32. data/src/core/client_channel/retry_interceptor.h +18 -17
  33. data/src/core/client_channel/retry_throttle.cc +46 -61
  34. data/src/core/client_channel/retry_throttle.h +17 -39
  35. data/src/core/client_channel/subchannel.cc +43 -19
  36. data/src/core/client_channel/subchannel.h +8 -0
  37. data/src/core/config/config_vars.cc +2 -0
  38. data/src/core/config/core_configuration.cc +1 -0
  39. data/src/core/config/core_configuration.h +11 -0
  40. data/src/core/credentials/call/call_creds_registry.h +125 -0
  41. data/src/core/credentials/call/call_creds_registry_init.cc +91 -0
  42. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +6 -48
  43. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +86 -0
  44. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +74 -0
  45. data/src/core/credentials/call/jwt_util.cc +70 -0
  46. data/src/core/credentials/call/jwt_util.h +32 -0
  47. data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
  48. data/src/core/credentials/transport/google_default/google_default_credentials.cc +72 -4
  49. data/src/core/credentials/transport/ssl/ssl_credentials.cc +0 -1
  50. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -0
  51. data/src/core/credentials/transport/xds/xds_credentials.cc +0 -3
  52. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +8 -8
  53. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +16 -16
  54. data/src/core/ext/filters/http/client_authority_filter.cc +2 -4
  55. data/src/core/ext/filters/http/message_compress/compression_filter.h +25 -22
  56. data/src/core/ext/filters/http/server/http_server_filter.h +12 -11
  57. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +120 -35
  58. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -5
  59. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +162 -115
  60. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +0 -3
  61. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +1239 -3514
  62. data/src/core/ext/transport/chttp2/transport/decode_huff.h +1008 -1486
  63. data/src/core/ext/transport/chttp2/transport/flow_control.h +22 -17
  64. data/src/core/ext/transport/chttp2/transport/frame.cc +10 -0
  65. data/src/core/ext/transport/chttp2/transport/frame.h +2 -2
  66. data/src/core/ext/transport/chttp2/transport/frame_data.cc +1 -1
  67. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -8
  68. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -5
  69. data/src/core/ext/transport/chttp2/transport/header_assembler.h +299 -0
  70. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1 -1
  71. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +11 -5
  72. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +12 -1
  73. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1017 -0
  74. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +593 -0
  75. data/src/core/ext/transport/chttp2/transport/http2_settings.h +19 -22
  76. data/{third_party/abseil-cpp/absl/strings/cord_buffer.cc → src/core/ext/transport/chttp2/transport/http2_stats_collector.cc} +14 -14
  77. data/src/core/ext/transport/chttp2/transport/http2_stats_collector.h +33 -0
  78. data/src/core/ext/transport/chttp2/transport/http2_status.h +6 -1
  79. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +43 -0
  80. data/src/core/ext/transport/chttp2/transport/http2_transport.h +65 -0
  81. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +0 -29
  82. data/src/core/ext/transport/chttp2/transport/internal.h +18 -8
  83. data/src/core/ext/transport/chttp2/transport/keepalive.cc +105 -0
  84. data/src/core/ext/transport/chttp2/transport/keepalive.h +138 -0
  85. data/src/core/ext/transport/chttp2/transport/message_assembler.h +185 -0
  86. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -4
  87. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +19 -0
  88. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +151 -0
  89. data/src/core/ext/transport/chttp2/transport/ping_promise.h +180 -0
  90. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +5 -9
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +11 -0
  92. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +39 -1
  93. data/src/core/ext/transport/chttp2/transport/transport_common.cc +19 -0
  94. data/src/core/ext/transport/chttp2/transport/transport_common.h +27 -0
  95. data/src/core/ext/transport/chttp2/transport/writing.cc +37 -11
  96. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb.h +571 -0
  97. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.c +120 -0
  98. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.h +36 -0
  99. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +1272 -0
  100. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +312 -0
  101. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +50 -0
  102. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +984 -0
  103. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +226 -0
  104. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +44 -0
  105. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +175 -0
  106. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +82 -0
  107. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +135 -0
  108. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +67 -0
  109. data/src/core/filter/auth/auth_filters.h +0 -25
  110. data/src/core/filter/auth/client_auth_filter.cc +0 -118
  111. data/src/core/filter/filter_args.h +9 -23
  112. data/src/core/handshaker/handshaker.cc +23 -14
  113. data/src/core/handshaker/handshaker.h +3 -0
  114. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +3 -1
  115. data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -5
  116. data/src/core/handshaker/security/secure_endpoint.cc +70 -25
  117. data/src/core/handshaker/security/security_handshaker.cc +4 -1
  118. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +7 -1
  119. data/src/core/lib/channel/channel_args.cc +15 -0
  120. data/src/core/lib/channel/channel_args.h +3 -0
  121. data/src/core/lib/channel/channel_stack.cc +22 -23
  122. data/src/core/lib/channel/channel_stack.h +9 -7
  123. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  124. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -7
  125. data/src/core/lib/channel/promise_based_filter.h +5 -5
  126. data/src/core/lib/debug/trace_impl.h +0 -1
  127. data/src/core/lib/event_engine/ares_resolver.cc +165 -46
  128. data/src/core/lib/event_engine/ares_resolver.h +48 -2
  129. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -1
  130. data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -4
  131. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +2 -6
  132. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.cc +40 -0
  133. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.h +60 -0
  134. data/src/core/lib/event_engine/event_engine.cc +7 -0
  135. data/src/core/lib/event_engine/extensions/channelz.h +10 -6
  136. data/src/core/lib/event_engine/grpc_polled_fd.h +5 -0
  137. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +130 -162
  138. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +11 -15
  139. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +75 -117
  140. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -9
  141. data/src/core/lib/event_engine/posix_engine/event_poller.h +18 -15
  142. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +0 -18
  143. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +124 -0
  144. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +243 -0
  145. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +29 -19
  146. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +6 -2
  147. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +6 -1
  148. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +145 -92
  149. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -19
  150. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +333 -116
  151. data/src/core/lib/event_engine/posix_engine/posix_engine.h +61 -18
  152. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +45 -37
  153. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +6 -4
  154. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +32 -142
  155. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -5
  156. data/src/core/lib/event_engine/posix_engine/posix_interface.h +211 -0
  157. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +1083 -0
  158. data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +281 -0
  159. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.cc +154 -0
  160. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +174 -0
  161. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -719
  162. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +10 -170
  163. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +33 -22
  164. data/src/core/lib/event_engine/posix_engine/timer_manager.h +13 -11
  165. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +117 -151
  166. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +26 -94
  167. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +26 -25
  168. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +6 -2
  169. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +36 -62
  170. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +6 -2
  171. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +7 -6
  172. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +12 -6
  173. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -1
  174. data/src/core/lib/event_engine/shim.cc +9 -0
  175. data/src/core/lib/event_engine/shim.h +3 -0
  176. data/src/core/lib/event_engine/thread_pool/thread_pool.h +7 -3
  177. data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +0 -17
  178. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -2
  179. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -2
  180. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +4 -0
  181. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +4 -0
  182. data/src/core/lib/event_engine/windows/windows_endpoint.h +2 -6
  183. data/src/core/lib/event_engine/windows/windows_engine.cc +0 -1
  184. data/src/core/lib/event_engine/windows/windows_engine.h +1 -3
  185. data/src/core/lib/event_engine/windows/windows_listener.cc +14 -2
  186. data/src/core/lib/experiments/experiments.cc +45 -93
  187. data/src/core/lib/experiments/experiments.h +21 -51
  188. data/src/core/lib/iomgr/endpoint.cc +4 -3
  189. data/src/core/lib/iomgr/endpoint.h +7 -4
  190. data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -2
  191. data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -2
  192. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -2
  193. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +4 -6
  194. data/src/core/lib/iomgr/tcp_posix.cc +12 -6
  195. data/src/core/lib/iomgr/tcp_windows.cc +3 -2
  196. data/src/core/lib/promise/activity.h +1 -0
  197. data/src/core/lib/promise/arena_promise.h +23 -7
  198. data/src/core/lib/promise/detail/promise_factory.h +10 -0
  199. data/src/core/lib/promise/detail/promise_like.h +118 -11
  200. data/src/core/lib/promise/detail/promise_variant.h +50 -0
  201. data/src/core/lib/promise/detail/seq_state.h +687 -548
  202. data/src/core/lib/promise/if.h +20 -0
  203. data/src/core/lib/promise/inter_activity_latch.h +147 -0
  204. data/src/core/lib/promise/inter_activity_mutex.h +547 -0
  205. data/src/core/lib/promise/loop.h +65 -3
  206. data/src/core/lib/promise/map.h +24 -0
  207. data/src/core/lib/promise/match_promise.h +103 -0
  208. data/src/core/lib/promise/mpsc.cc +425 -0
  209. data/src/core/lib/promise/mpsc.h +490 -0
  210. data/src/core/lib/promise/party.cc +50 -1
  211. data/src/core/lib/promise/party.h +66 -1
  212. data/src/core/lib/promise/race.h +31 -0
  213. data/src/core/lib/promise/seq.h +4 -1
  214. data/src/core/lib/promise/status_flag.h +7 -0
  215. data/src/core/lib/promise/try_seq.h +4 -1
  216. data/src/core/lib/promise/wait_set.cc +28 -0
  217. data/src/core/lib/promise/wait_set.h +86 -0
  218. data/src/core/lib/resource_quota/arena.h +19 -0
  219. data/src/core/lib/slice/slice.h +5 -0
  220. data/src/core/lib/surface/channel_create.cc +88 -13
  221. data/src/core/lib/surface/channel_create.h +4 -0
  222. data/src/core/lib/surface/channel_init.cc +164 -47
  223. data/src/core/lib/surface/channel_init.h +64 -1
  224. data/src/core/lib/surface/filter_stack_call.cc +18 -9
  225. data/src/core/lib/surface/init.cc +6 -15
  226. data/src/core/lib/surface/legacy_channel.cc +3 -5
  227. data/src/core/lib/surface/legacy_channel.h +3 -1
  228. data/src/core/lib/surface/version.cc +2 -2
  229. data/src/core/lib/transport/promise_endpoint.cc +110 -0
  230. data/src/core/lib/transport/promise_endpoint.h +307 -0
  231. data/src/core/load_balancing/child_policy_handler.cc +2 -4
  232. data/src/core/load_balancing/delegating_helper.h +2 -3
  233. data/src/core/load_balancing/health_check_client.cc +1 -5
  234. data/src/core/load_balancing/lb_policy.h +1 -3
  235. data/src/core/load_balancing/oob_backend_metric.cc +1 -5
  236. data/src/core/load_balancing/pick_first/pick_first.cc +3 -0
  237. data/src/core/load_balancing/xds/cds.cc +10 -1
  238. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  239. data/src/core/resolver/xds/xds_config.cc +6 -3
  240. data/src/core/resolver/xds/xds_config.h +9 -4
  241. data/src/core/resolver/xds/xds_dependency_manager.cc +21 -6
  242. data/src/core/resolver/xds/xds_dependency_manager.h +2 -1
  243. data/src/core/resolver/xds/xds_resolver.cc +31 -11
  244. data/src/core/server/server.cc +83 -12
  245. data/src/core/server/server.h +21 -2
  246. data/src/core/server/xds_server_config_fetcher.cc +63 -25
  247. data/src/core/service_config/service_config.h +1 -1
  248. data/src/core/service_config/service_config_impl.h +1 -1
  249. data/src/core/telemetry/context_list_entry.cc +38 -0
  250. data/src/core/telemetry/context_list_entry.h +42 -12
  251. data/src/core/telemetry/stats_data.cc +233 -207
  252. data/src/core/telemetry/stats_data.h +250 -153
  253. data/src/core/telemetry/tcp_tracer.h +1 -1
  254. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +11 -3
  255. data/src/core/tsi/fake_transport_security.cc +17 -0
  256. data/src/core/tsi/ssl_transport_security.cc +2 -0
  257. data/src/core/tsi/transport_security_grpc.cc +8 -0
  258. data/src/core/tsi/transport_security_grpc.h +15 -0
  259. data/src/core/util/backoff.cc +1 -5
  260. data/src/core/util/backoff.h +1 -0
  261. data/src/core/util/down_cast.h +1 -1
  262. data/src/core/util/function_signature.h +15 -1
  263. data/src/core/util/http_client/httpcli.cc +12 -5
  264. data/src/core/util/http_client/httpcli.h +4 -1
  265. data/src/core/util/latent_see.h +8 -5
  266. data/src/core/util/log.cc +4 -0
  267. data/src/core/util/memory_usage.h +268 -0
  268. data/src/core/util/per_cpu.cc +2 -0
  269. data/src/core/util/per_cpu.h +7 -0
  270. data/src/core/util/shared_bit_gen.h +20 -0
  271. data/src/core/util/single_set_ptr.h +2 -2
  272. data/src/core/util/upb_utils.h +42 -0
  273. data/src/core/util/uri.cc +3 -2
  274. data/src/core/util/useful.h +53 -2
  275. data/src/core/util/wait_for_single_owner.cc +31 -0
  276. data/src/core/util/wait_for_single_owner.h +24 -0
  277. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -0
  278. data/src/core/xds/grpc/xds_bootstrap_grpc.h +5 -0
  279. data/src/core/xds/grpc/xds_client_grpc.cc +6 -2
  280. data/src/core/xds/grpc/xds_common_types_parser.cc +138 -50
  281. data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
  282. data/src/core/xds/grpc/xds_http_filter.h +7 -0
  283. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +22 -0
  284. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -0
  285. data/src/core/xds/grpc/xds_route_config_parser.cc +15 -38
  286. data/src/core/xds/grpc/xds_server_grpc.cc +63 -13
  287. data/src/core/xds/grpc/xds_server_grpc.h +10 -2
  288. data/src/core/xds/grpc/xds_server_grpc_interface.h +4 -0
  289. data/src/core/xds/grpc/xds_transport_grpc.cc +18 -0
  290. data/src/core/xds/xds_client/xds_bootstrap.h +2 -0
  291. data/src/core/xds/xds_client/xds_client.cc +26 -5
  292. data/src/ruby/ext/grpc/extconf.rb +2 -0
  293. data/src/ruby/ext/grpc/rb_call.c +1 -8
  294. data/src/ruby/ext/grpc/rb_channel.c +72 -568
  295. data/src/ruby/ext/grpc/rb_channel.h +0 -3
  296. data/src/ruby/ext/grpc/rb_completion_queue.c +26 -14
  297. data/src/ruby/ext/grpc/rb_completion_queue.h +1 -7
  298. data/src/ruby/ext/grpc/rb_grpc.c +9 -5
  299. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  300. data/src/ruby/ext/grpc/rb_loader.c +0 -4
  301. data/src/ruby/ext/grpc/rb_server.c +31 -50
  302. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -4
  303. data/src/ruby/lib/grpc/version.rb +1 -1
  304. data/src/ruby/spec/core_spec.rb +22 -0
  305. data/src/ruby/spec/generic/active_call_spec.rb +1 -1
  306. data/third_party/abseil-cpp/absl/algorithm/container.h +2 -19
  307. data/third_party/abseil-cpp/absl/base/attributes.h +76 -7
  308. data/third_party/abseil-cpp/absl/base/call_once.h +11 -12
  309. data/third_party/abseil-cpp/absl/base/config.h +20 -129
  310. data/third_party/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
  311. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
  312. data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
  313. data/third_party/abseil-cpp/absl/base/internal/endian.h +34 -38
  314. data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
  315. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -5
  316. data/third_party/abseil-cpp/absl/base/internal/{nullability_impl.h → nullability_deprecated.h} +45 -8
  317. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +0 -9
  318. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -13
  319. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
  320. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
  321. data/third_party/abseil-cpp/absl/base/no_destructor.h +11 -32
  322. data/third_party/abseil-cpp/absl/base/nullability.h +84 -72
  323. data/third_party/abseil-cpp/absl/base/options.h +3 -80
  324. data/third_party/abseil-cpp/absl/base/policy_checks.h +7 -7
  325. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +1 -3
  326. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
  327. data/third_party/abseil-cpp/absl/container/btree_map.h +4 -2
  328. data/third_party/abseil-cpp/absl/container/btree_set.h +4 -2
  329. data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -14
  330. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -0
  331. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -1
  332. data/third_party/abseil-cpp/absl/container/inlined_vector.h +8 -5
  333. data/third_party/abseil-cpp/absl/container/internal/btree.h +132 -29
  334. data/third_party/abseil-cpp/absl/container/internal/btree_container.h +175 -71
  335. data/third_party/abseil-cpp/absl/container/internal/common.h +43 -0
  336. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
  337. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +9 -10
  338. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +1 -8
  339. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +0 -4
  340. data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +527 -0
  341. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +20 -4
  342. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +31 -12
  343. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
  344. data/third_party/abseil-cpp/absl/container/internal/layout.h +26 -42
  345. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
  346. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +1354 -183
  347. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +881 -1424
  348. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +80 -0
  349. data/third_party/abseil-cpp/absl/crc/crc32c.cc +0 -4
  350. data/third_party/abseil-cpp/absl/crc/crc32c.h +7 -5
  351. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
  352. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +45 -74
  353. data/third_party/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  354. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
  355. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
  356. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
  357. data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
  358. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
  359. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
  360. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
  361. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
  362. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
  363. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
  364. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
  365. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
  366. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +19 -9
  367. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +144 -27
  368. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +73 -5
  369. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +19 -9
  370. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
  371. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
  372. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +2 -2
  373. data/third_party/abseil-cpp/absl/flags/flag.h +4 -3
  374. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
  375. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -1
  376. data/third_party/abseil-cpp/absl/flags/internal/flag.h +7 -6
  377. data/third_party/abseil-cpp/absl/flags/internal/registry.h +4 -3
  378. data/third_party/abseil-cpp/absl/flags/reflection.cc +2 -3
  379. data/third_party/abseil-cpp/absl/functional/any_invocable.h +8 -10
  380. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -9
  381. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +110 -226
  382. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
  383. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
  384. data/third_party/abseil-cpp/absl/hash/hash.h +18 -0
  385. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +1 -5
  386. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -61
  387. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +25 -68
  388. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +2 -6
  389. data/third_party/abseil-cpp/absl/hash/internal/weakly_mixed_integer.h +38 -0
  390. data/third_party/abseil-cpp/absl/log/check.h +2 -1
  391. data/third_party/abseil-cpp/absl/log/globals.h +4 -5
  392. data/third_party/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
  393. data/third_party/abseil-cpp/absl/log/internal/check_op.cc +22 -22
  394. data/third_party/abseil-cpp/absl/log/internal/check_op.h +65 -62
  395. data/third_party/abseil-cpp/absl/log/internal/conditions.cc +5 -3
  396. data/third_party/abseil-cpp/absl/log/internal/conditions.h +7 -2
  397. data/third_party/abseil-cpp/absl/log/internal/log_message.cc +85 -43
  398. data/third_party/abseil-cpp/absl/log/internal/log_message.h +84 -59
  399. data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -0
  400. data/third_party/abseil-cpp/absl/log/internal/proto.cc +3 -2
  401. data/third_party/abseil-cpp/absl/log/internal/proto.h +3 -3
  402. data/third_party/abseil-cpp/absl/log/internal/strip.h +4 -12
  403. data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
  404. data/third_party/abseil-cpp/absl/log/internal/voidify.h +10 -4
  405. data/third_party/abseil-cpp/absl/log/log.h +48 -35
  406. data/third_party/abseil-cpp/absl/log/log_sink_registry.h +2 -2
  407. data/third_party/abseil-cpp/absl/meta/type_traits.h +46 -175
  408. data/third_party/abseil-cpp/absl/numeric/bits.h +68 -2
  409. data/third_party/abseil-cpp/absl/numeric/int128.cc +0 -52
  410. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +7 -3
  411. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
  412. data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
  413. data/third_party/abseil-cpp/absl/random/distributions.h +6 -8
  414. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
  415. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
  416. data/third_party/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +22 -90
  417. data/third_party/abseil-cpp/absl/random/internal/entropy_pool.h +35 -0
  418. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
  419. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
  420. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
  421. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +5 -5
  422. data/third_party/abseil-cpp/absl/random/random.h +88 -53
  423. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +6 -2
  424. data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
  425. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +3 -4
  426. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -3
  427. data/third_party/abseil-cpp/absl/status/status.cc +4 -8
  428. data/third_party/abseil-cpp/absl/status/status.h +8 -8
  429. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +2 -2
  430. data/third_party/abseil-cpp/absl/status/statusor.cc +2 -2
  431. data/third_party/abseil-cpp/absl/status/statusor.h +6 -6
  432. data/third_party/abseil-cpp/absl/strings/ascii.cc +9 -9
  433. data/third_party/abseil-cpp/absl/strings/ascii.h +18 -18
  434. data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -22
  435. data/third_party/abseil-cpp/absl/strings/charconv.h +5 -5
  436. data/third_party/abseil-cpp/absl/strings/cord.cc +54 -58
  437. data/third_party/abseil-cpp/absl/strings/cord.h +94 -83
  438. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
  439. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +3 -3
  440. data/third_party/abseil-cpp/absl/strings/escaping.cc +130 -149
  441. data/third_party/abseil-cpp/absl/strings/escaping.h +9 -10
  442. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  443. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +6 -8
  444. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
  445. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +0 -4
  446. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
  447. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
  448. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
  449. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
  450. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  451. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
  452. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
  453. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
  454. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +15 -1
  455. data/third_party/abseil-cpp/absl/strings/numbers.cc +53 -32
  456. data/third_party/abseil-cpp/absl/strings/numbers.h +87 -58
  457. data/third_party/abseil-cpp/absl/strings/str_cat.cc +6 -7
  458. data/third_party/abseil-cpp/absl/strings/str_cat.h +32 -32
  459. data/third_party/abseil-cpp/absl/strings/str_format.h +18 -18
  460. data/third_party/abseil-cpp/absl/strings/str_replace.cc +3 -3
  461. data/third_party/abseil-cpp/absl/strings/str_replace.h +6 -6
  462. data/third_party/abseil-cpp/absl/strings/string_view.cc +4 -9
  463. data/third_party/abseil-cpp/absl/strings/string_view.h +27 -32
  464. data/third_party/abseil-cpp/absl/strings/strip.h +4 -4
  465. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -4
  466. data/third_party/abseil-cpp/absl/strings/substitute.h +66 -64
  467. data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
  468. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
  469. data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
  470. data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
  471. data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
  472. data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
  473. data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
  474. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +1 -1
  475. data/third_party/abseil-cpp/absl/synchronization/mutex.h +97 -69
  476. data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
  477. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -0
  478. data/third_party/abseil-cpp/absl/time/duration.cc +12 -7
  479. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
  480. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
  481. data/third_party/abseil-cpp/absl/time/time.h +20 -15
  482. data/third_party/abseil-cpp/absl/types/optional.h +7 -747
  483. data/third_party/abseil-cpp/absl/types/span.h +13 -11
  484. data/third_party/abseil-cpp/absl/types/variant.h +5 -784
  485. data/third_party/abseil-cpp/absl/utility/utility.h +10 -185
  486. metadata +72 -20
  487. data/src/core/lib/event_engine/forkable.cc +0 -105
  488. data/src/core/lib/event_engine/forkable.h +0 -67
  489. data/src/core/lib/iomgr/python_util.h +0 -46
  490. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
  491. data/third_party/abseil-cpp/absl/base/internal/invoke.h +0 -241
  492. data/third_party/abseil-cpp/absl/log/log_entry.cc +0 -41
  493. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
  494. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
  495. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +0 -78
  496. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
  497. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +0 -82
  498. data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -352
  499. data/third_party/abseil-cpp/absl/types/internal/variant.h +0 -1622
@@ -25,7 +25,9 @@
25
25
 
26
26
  #include "absl/functional/any_invocable.h"
27
27
  #include "absl/log/log.h"
28
+ #include "src/core/lib/event_engine/posix_engine/posix_interface.h"
28
29
  #include "src/core/lib/iomgr/port.h"
30
+ #include "src/core/util/crash.h"
29
31
  #include "src/core/util/sync.h"
30
32
 
31
33
  #ifdef GRPC_LINUX_ERRQUEUE
@@ -36,25 +38,6 @@
36
38
  namespace grpc_event_engine::experimental {
37
39
 
38
40
  namespace {
39
- // Fills gpr_timespec gts based on values from timespec ts.
40
- void FillGprFromTimestamp(gpr_timespec* gts, const struct timespec* ts) {
41
- gts->tv_sec = ts->tv_sec;
42
- gts->tv_nsec = static_cast<int32_t>(ts->tv_nsec);
43
- gts->clock_type = GPR_CLOCK_REALTIME;
44
- }
45
-
46
- void DefaultTimestampsCallback(void* /*arg*/, Timestamps* /*ts*/,
47
- absl::Status /*shutdown_err*/) {
48
- VLOG(2) << "Timestamps callback has not been registered";
49
- }
50
-
51
- // The saved callback function that will be invoked when we get all the
52
- // timestamps that we are going to get for a TracedBuffer.
53
- absl::AnyInvocable<void(void*, Timestamps*, absl::Status)>
54
- g_timestamps_callback =
55
- []() -> absl::AnyInvocable<void(void*, Timestamps*, absl::Status)> {
56
- return DefaultTimestampsCallback;
57
- }();
58
41
 
59
42
  // Used to extract individual opt stats from cmsg, so as to avoid troubles with
60
43
  // unaligned reads.
@@ -66,260 +49,243 @@ T ReadUnaligned(const void* ptr) {
66
49
  }
67
50
 
68
51
  // Extracts opt stats from the tcp_info struct \a info to \a metrics
69
- void ExtractOptStatsFromTcpInfo(ConnectionMetrics* metrics,
70
- const tcp_info* info) {
52
+ PosixWriteEventSink::ConnectionMetrics ExtractOptStatsFromTcpInfo(
53
+ const tcp_info* info) {
54
+ PosixWriteEventSink::ConnectionMetrics metrics;
71
55
  if (info == nullptr) {
72
- return;
56
+ return metrics;
73
57
  }
74
58
  if (info->length > offsetof(tcp_info, tcpi_sndbuf_limited)) {
75
- metrics->recurring_retrans = info->tcpi_retransmits;
76
- metrics->is_delivery_rate_app_limited =
77
- info->tcpi_delivery_rate_app_limited;
78
- metrics->congestion_window = info->tcpi_snd_cwnd;
79
- metrics->reordering = info->tcpi_reordering;
80
- metrics->packet_retx = info->tcpi_total_retrans;
81
- metrics->pacing_rate = info->tcpi_pacing_rate;
82
- metrics->data_notsent = info->tcpi_notsent_bytes;
59
+ metrics.recurring_retrans = info->tcpi_retransmits;
60
+ metrics.is_delivery_rate_app_limited = info->tcpi_delivery_rate_app_limited;
61
+ metrics.congestion_window = info->tcpi_snd_cwnd;
62
+ metrics.reordering = info->tcpi_reordering;
63
+ metrics.packet_retx = info->tcpi_total_retrans;
64
+ metrics.pacing_rate = info->tcpi_pacing_rate;
65
+ metrics.data_notsent = info->tcpi_notsent_bytes;
83
66
  if (info->tcpi_min_rtt != UINT32_MAX) {
84
- metrics->min_rtt = info->tcpi_min_rtt;
67
+ metrics.min_rtt = info->tcpi_min_rtt;
85
68
  }
86
- metrics->packet_sent = info->tcpi_data_segs_out;
87
- metrics->delivery_rate = info->tcpi_delivery_rate;
88
- metrics->busy_usec = info->tcpi_busy_time;
89
- metrics->rwnd_limited_usec = info->tcpi_rwnd_limited;
90
- metrics->sndbuf_limited_usec = info->tcpi_sndbuf_limited;
69
+ metrics.packet_sent = info->tcpi_data_segs_out;
70
+ metrics.delivery_rate = info->tcpi_delivery_rate;
71
+ metrics.busy_usec = info->tcpi_busy_time;
72
+ metrics.rwnd_limited_usec = info->tcpi_rwnd_limited;
73
+ metrics.sndbuf_limited_usec = info->tcpi_sndbuf_limited;
91
74
  }
92
75
  if (info->length > offsetof(tcp_info, tcpi_dsack_dups)) {
93
- metrics->data_sent = info->tcpi_bytes_sent;
94
- metrics->data_retx = info->tcpi_bytes_retrans;
95
- metrics->packet_spurious_retx = info->tcpi_dsack_dups;
76
+ metrics.data_sent = info->tcpi_bytes_sent;
77
+ metrics.data_retx = info->tcpi_bytes_retrans;
78
+ metrics.packet_spurious_retx = info->tcpi_dsack_dups;
96
79
  }
80
+ return metrics;
97
81
  }
98
82
 
99
83
  // Extracts opt stats from the given control message \a opt_stats to the
100
84
  // connection metrics \a metrics.
101
- void ExtractOptStatsFromCmsg(ConnectionMetrics* metrics,
102
- const cmsghdr* opt_stats) {
85
+ PosixWriteEventSink::ConnectionMetrics ExtractOptStatsFromCmsg(
86
+ const cmsghdr* opt_stats) {
87
+ PosixWriteEventSink::ConnectionMetrics metrics;
103
88
  if (opt_stats == nullptr) {
104
- return;
89
+ return metrics;
105
90
  }
106
91
  const auto* data = CMSG_DATA(opt_stats);
107
92
  constexpr int64_t cmsg_hdr_len = CMSG_ALIGN(sizeof(struct cmsghdr));
108
93
  const int64_t len = opt_stats->cmsg_len - cmsg_hdr_len;
109
94
  int64_t offset = 0;
110
-
111
95
  while (offset < len) {
112
96
  const auto* attr = reinterpret_cast<const nlattr*>(data + offset);
113
97
  const void* val = data + offset + NLA_HDRLEN;
114
98
  switch (attr->nla_type) {
115
99
  case TCP_NLA_BUSY: {
116
- metrics->busy_usec = ReadUnaligned<uint64_t>(val);
100
+ metrics.busy_usec = ReadUnaligned<uint64_t>(val);
117
101
  break;
118
102
  }
119
103
  case TCP_NLA_RWND_LIMITED: {
120
- metrics->rwnd_limited_usec = ReadUnaligned<uint64_t>(val);
104
+ metrics.rwnd_limited_usec = ReadUnaligned<uint64_t>(val);
121
105
  break;
122
106
  }
123
107
  case TCP_NLA_SNDBUF_LIMITED: {
124
- metrics->sndbuf_limited_usec = ReadUnaligned<uint64_t>(val);
108
+ metrics.sndbuf_limited_usec = ReadUnaligned<uint64_t>(val);
125
109
  break;
126
110
  }
127
111
  case TCP_NLA_PACING_RATE: {
128
- metrics->pacing_rate = ReadUnaligned<uint64_t>(val);
112
+ metrics.pacing_rate = ReadUnaligned<uint64_t>(val);
129
113
  break;
130
114
  }
131
115
  case TCP_NLA_DELIVERY_RATE: {
132
- metrics->delivery_rate = ReadUnaligned<uint64_t>(val);
116
+ metrics.delivery_rate = ReadUnaligned<uint64_t>(val);
133
117
  break;
134
118
  }
135
119
  case TCP_NLA_DELIVERY_RATE_APP_LMT: {
136
- metrics->is_delivery_rate_app_limited = ReadUnaligned<uint8_t>(val);
120
+ metrics.is_delivery_rate_app_limited = ReadUnaligned<uint8_t>(val);
137
121
  break;
138
122
  }
139
123
  case TCP_NLA_SND_CWND: {
140
- metrics->congestion_window = ReadUnaligned<uint32_t>(val);
124
+ metrics.congestion_window = ReadUnaligned<uint32_t>(val);
141
125
  break;
142
126
  }
143
127
  case TCP_NLA_MIN_RTT: {
144
- metrics->min_rtt = ReadUnaligned<uint32_t>(val);
128
+ metrics.min_rtt = ReadUnaligned<uint32_t>(val);
145
129
  break;
146
130
  }
147
131
  case TCP_NLA_SRTT: {
148
- metrics->srtt = ReadUnaligned<uint32_t>(val);
132
+ metrics.srtt = ReadUnaligned<uint32_t>(val);
149
133
  break;
150
134
  }
151
135
  case TCP_NLA_RECUR_RETRANS: {
152
- metrics->recurring_retrans = ReadUnaligned<uint8_t>(val);
136
+ metrics.recurring_retrans = ReadUnaligned<uint8_t>(val);
153
137
  break;
154
138
  }
155
139
  case TCP_NLA_BYTES_SENT: {
156
- metrics->data_sent = ReadUnaligned<uint64_t>(val);
140
+ metrics.data_sent = ReadUnaligned<uint64_t>(val);
157
141
  break;
158
142
  }
159
143
  case TCP_NLA_DATA_SEGS_OUT: {
160
- metrics->packet_sent = ReadUnaligned<uint64_t>(val);
144
+ metrics.packet_sent = ReadUnaligned<uint64_t>(val);
161
145
  break;
162
146
  }
163
147
  case TCP_NLA_TOTAL_RETRANS: {
164
- metrics->packet_retx = ReadUnaligned<uint64_t>(val);
148
+ metrics.packet_retx = ReadUnaligned<uint64_t>(val);
165
149
  break;
166
150
  }
167
151
  case TCP_NLA_DELIVERED: {
168
- metrics->packet_delivered = ReadUnaligned<uint32_t>(val);
152
+ metrics.packet_delivered = ReadUnaligned<uint32_t>(val);
169
153
  break;
170
154
  }
171
155
  case TCP_NLA_DELIVERED_CE: {
172
- metrics->packet_delivered_ce = ReadUnaligned<uint32_t>(val);
156
+ metrics.packet_delivered_ce = ReadUnaligned<uint32_t>(val);
173
157
  break;
174
158
  }
175
159
  case TCP_NLA_BYTES_RETRANS: {
176
- metrics->data_retx = ReadUnaligned<uint64_t>(val);
160
+ metrics.data_retx = ReadUnaligned<uint64_t>(val);
177
161
  break;
178
162
  }
179
163
  case TCP_NLA_DSACK_DUPS: {
180
- metrics->packet_spurious_retx = ReadUnaligned<uint32_t>(val);
164
+ metrics.packet_spurious_retx = ReadUnaligned<uint32_t>(val);
181
165
  break;
182
166
  }
183
167
  case TCP_NLA_REORDERING: {
184
- metrics->reordering = ReadUnaligned<uint32_t>(val);
168
+ metrics.reordering = ReadUnaligned<uint32_t>(val);
185
169
  break;
186
170
  }
187
171
  case TCP_NLA_SND_SSTHRESH: {
188
- metrics->snd_ssthresh = ReadUnaligned<uint32_t>(val);
172
+ metrics.snd_ssthresh = ReadUnaligned<uint32_t>(val);
173
+ break;
174
+ }
175
+ case TCP_NLA_BYTES_NOTSENT: {
176
+ metrics.data_notsent = ReadUnaligned<uint16_t>(val);
189
177
  break;
190
178
  }
191
179
  }
192
180
  offset += NLA_ALIGN(attr->nla_len);
193
181
  }
182
+ return metrics;
194
183
  }
184
+
185
+ grpc_core::Duration g_max_pending_ack_time = grpc_core::Duration::Seconds(10);
186
+
195
187
  } // namespace.
196
188
 
197
- bool TracedBufferList::TracedBuffer::Finished(gpr_timespec ts) {
198
- constexpr int kGrpcMaxPendingAckTimeMillis = 10000;
199
- return gpr_time_to_millis(gpr_time_sub(ts, last_timestamp_)) >
200
- kGrpcMaxPendingAckTimeMillis;
189
+ bool TracedBufferList::TracedBuffer::TimedOut(grpc_core::Timestamp now) {
190
+ return last_timestamp_ + g_max_pending_ack_time < now;
201
191
  }
202
192
 
203
- void TracedBufferList::AddNewEntry(int32_t seq_no, int fd, void* arg) {
204
- TracedBuffer* new_elem = new TracedBuffer(seq_no, arg);
193
+ void TracedBufferList::AddNewEntry(int32_t seq_no,
194
+ EventEnginePosixInterface* posix_interface,
195
+ const FileDescriptor& fd,
196
+ EventEngine::Endpoint::WriteEventSink sink) {
197
+ TracedBuffer new_elem(seq_no, std::move(sink));
205
198
  // Store the current time as the sendmsg time.
206
- new_elem->ts_.sendmsg_time.time = gpr_now(GPR_CLOCK_REALTIME);
207
- new_elem->ts_.scheduled_time.time = gpr_inf_past(GPR_CLOCK_REALTIME);
208
- new_elem->ts_.sent_time.time = gpr_inf_past(GPR_CLOCK_REALTIME);
209
- new_elem->ts_.acked_time.time = gpr_inf_past(GPR_CLOCK_REALTIME);
210
- if (GetSocketTcpInfo(&(new_elem->ts_.info), fd) == 0) {
211
- ExtractOptStatsFromTcpInfo(&(new_elem->ts_.sendmsg_time.metrics),
212
- &(new_elem->ts_.info));
213
- }
214
- new_elem->last_timestamp_ = new_elem->ts_.sendmsg_time.time;
215
- grpc_core::MutexLock lock(&mu_);
216
- if (!head_) {
217
- head_ = tail_ = new_elem;
199
+ // new_elem.ts_.sendmsg_time.time = gpr_now(GPR_CLOCK_REALTIME);
200
+ auto curr_time = absl::Now();
201
+ struct tcp_info info;
202
+ if (posix_interface != nullptr &&
203
+ GetSocketTcpInfo(&info, posix_interface, fd).ok()) {
204
+ new_elem.sink_.RecordEvent(EventEngine::Endpoint::WriteEvent::kSendMsg,
205
+ curr_time, ExtractOptStatsFromTcpInfo(&info));
218
206
  } else {
219
- tail_->next_ = new_elem;
220
- tail_ = new_elem;
207
+ new_elem.sink_.RecordEvent(EventEngine::Endpoint::WriteEvent::kSendMsg,
208
+ curr_time,
209
+ PosixWriteEventSink::ConnectionMetrics());
221
210
  }
211
+ new_elem.last_timestamp_ = grpc_core::Timestamp::Now();
212
+ // new_elem.last_timestamp_ = new_elem.ts_.sendmsg_time.time;
213
+ grpc_core::MutexLock lock(&mu_);
214
+ list_.push_back(std::move(new_elem));
222
215
  }
223
216
 
224
217
  void TracedBufferList::ProcessTimestamp(struct sock_extended_err* serr,
225
218
  struct cmsghdr* opt_stats,
226
219
  struct scm_timestamping* tss) {
220
+ absl::Time timestamp = absl::TimeFromTimespec(tss->ts[0]);
221
+ grpc_core::Timestamp core_timestamp = grpc_core::Timestamp::Now();
222
+ auto metrics = ExtractOptStatsFromCmsg(opt_stats);
227
223
  grpc_core::MutexLock lock(&mu_);
228
- TracedBuffer* elem = head_;
229
- TracedBuffer* prev = nullptr;
230
- while (elem != nullptr) {
224
+ auto it = list_.begin();
225
+ while (it != list_.end()) {
231
226
  // The byte number refers to the sequence number of the last byte which this
232
227
  // timestamp relates to.
233
- if (serr->ee_data >= elem->seq_no_) {
228
+ if (serr->ee_data >= it->seq_no_) {
234
229
  switch (serr->ee_info) {
235
230
  case SCM_TSTAMP_SCHED:
236
- FillGprFromTimestamp(&(elem->ts_.scheduled_time.time), &(tss->ts[0]));
237
- ExtractOptStatsFromCmsg(&(elem->ts_.scheduled_time.metrics),
238
- opt_stats);
239
- elem->last_timestamp_ = elem->ts_.scheduled_time.time;
240
- elem = elem->next_;
231
+ it->sink_.RecordEvent(EventEngine::Endpoint::WriteEvent::kScheduled,
232
+ timestamp, metrics);
233
+ it->last_timestamp_ = core_timestamp;
234
+ ++it;
241
235
  break;
242
236
  case SCM_TSTAMP_SND:
243
- FillGprFromTimestamp(&(elem->ts_.sent_time.time), &(tss->ts[0]));
244
- ExtractOptStatsFromCmsg(&(elem->ts_.sent_time.metrics), opt_stats);
245
- elem->last_timestamp_ = elem->ts_.sent_time.time;
246
- elem = elem->next_;
237
+ it->sink_.RecordEvent(EventEngine::Endpoint::WriteEvent::kSent,
238
+ timestamp, metrics);
239
+ it->last_timestamp_ = core_timestamp;
240
+ ++it;
247
241
  break;
248
242
  case SCM_TSTAMP_ACK:
249
- FillGprFromTimestamp(&(elem->ts_.acked_time.time), &(tss->ts[0]));
250
- ExtractOptStatsFromCmsg(&(elem->ts_.acked_time.metrics), opt_stats);
251
- // Got all timestamps. Do the callback and free this TracedBuffer. The
252
- // thing below can be passed by value if we don't want the restriction
253
- // on the lifetime.
254
- g_timestamps_callback(elem->arg_, &(elem->ts_), absl::OkStatus());
255
- // Safe to update head_ to elem->next_ because the list is ordered by
256
- // seq_no. Thus if elem is to be deleted, it has to be the first
257
- // element in the list.
258
- head_ = elem->next_;
259
- delete elem;
260
- elem = head_;
243
+ it->sink_.RecordEvent(EventEngine::Endpoint::WriteEvent::kAcked,
244
+ timestamp, metrics);
245
+ it = list_.erase(it);
261
246
  break;
262
247
  default:
263
- abort();
248
+ grpc_core::Crash(
249
+ absl::StrCat("Unknown timestamp type %d", serr->ee_info));
264
250
  }
265
251
  } else {
266
252
  break;
267
253
  }
268
254
  }
269
255
 
270
- elem = head_;
271
- gpr_timespec now = gpr_now(GPR_CLOCK_REALTIME);
272
- while (elem != nullptr) {
273
- if (!elem->Finished(now)) {
274
- prev = elem;
275
- elem = elem->next_;
256
+ it = list_.begin();
257
+ while (it != list_.end()) {
258
+ if (!it->TimedOut(core_timestamp)) {
259
+ ++it;
276
260
  continue;
277
- }
278
- g_timestamps_callback(elem->arg_, &(elem->ts_),
279
- absl::DeadlineExceededError("Ack timed out"));
280
- if (prev != nullptr) {
281
- prev->next_ = elem->next_;
282
- delete elem;
283
- elem = prev->next_;
284
261
  } else {
285
- head_ = elem->next_;
286
- delete elem;
287
- elem = head_;
262
+ LOG(ERROR) << "No timestamp received for TracedBuffer in "
263
+ << g_max_pending_ack_time << ". Removing.";
264
+ it = list_.erase(it);
288
265
  }
289
266
  }
290
- tail_ = (head_ == nullptr) ? head_ : prev;
291
267
  }
292
268
 
293
- void TracedBufferList::Shutdown(void* remaining, absl::Status shutdown_err) {
294
- grpc_core::MutexLock lock(&mu_);
295
- while (head_) {
296
- TracedBuffer* elem = head_;
297
- g_timestamps_callback(elem->arg_, &(elem->ts_), shutdown_err);
298
- head_ = head_->next_;
299
- delete elem;
269
+ void TracedBufferList::Shutdown(
270
+ std::optional<EventEngine::Endpoint::WriteEventSink> remaining) {
271
+ if (remaining.has_value()) {
272
+ PosixWriteEventSink sink(std::move(remaining).value());
273
+ sink.RecordEvent(EventEngine::Endpoint::WriteEvent::kClosed, absl::Now(),
274
+ PosixWriteEventSink::ConnectionMetrics());
300
275
  }
301
- if (remaining != nullptr) {
302
- g_timestamps_callback(remaining, nullptr, shutdown_err);
276
+ grpc_core::MutexLock lock(&mu_);
277
+ if (list_.empty()) return;
278
+ auto curr_time = absl::Now();
279
+ for (auto it = list_.begin(); it != list_.end(); ++it) {
280
+ it->sink_.RecordEvent(EventEngine::Endpoint::WriteEvent::kClosed, curr_time,
281
+ PosixWriteEventSink::ConnectionMetrics());
303
282
  }
304
- tail_ = head_;
283
+ list_.clear();
305
284
  }
306
285
 
307
- void TcpSetWriteTimestampsCallback(
308
- absl::AnyInvocable<void(void*, Timestamps*, absl::Status)> fn) {
309
- g_timestamps_callback = std::move(fn);
310
- }
311
-
312
- } // namespace grpc_event_engine::experimental
313
-
314
- #else // GRPC_LINUX_ERRQUEUE
315
-
316
- #include "src/core/util/crash.h"
317
-
318
- namespace grpc_event_engine::experimental {
319
-
320
- void TcpSetWriteTimestampsCallback(
321
- absl::AnyInvocable<void(void*, Timestamps*, absl::Status)> /*fn*/) {
322
- grpc_core::Crash("Timestamps callback is not enabled for this platform");
286
+ void TracedBufferList::TestOnlySetMaxPendingAckTime(
287
+ grpc_core::Duration duration) {
288
+ g_max_pending_ack_time = duration;
323
289
  }
324
290
 
325
291
  } // namespace grpc_event_engine::experimental
@@ -15,6 +15,7 @@
15
15
  #ifndef GRPC_SRC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_TRACED_BUFFER_LIST_H
16
16
  #define GRPC_SRC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_TRACED_BUFFER_LIST_H
17
17
 
18
+ #include <grpc/event_engine/event_engine.h>
18
19
  #include <grpc/support/port_platform.h>
19
20
  #include <grpc/support/time.h>
20
21
  #include <stdint.h>
@@ -24,78 +25,13 @@
24
25
  #include "absl/functional/any_invocable.h"
25
26
  #include "absl/status/status.h"
26
27
  #include "src/core/lib/event_engine/posix_engine/internal_errqueue.h"
28
+ #include "src/core/lib/event_engine/posix_engine/posix_interface.h"
29
+ #include "src/core/lib/event_engine/posix_engine/posix_write_event_sink.h"
27
30
  #include "src/core/lib/iomgr/port.h"
28
31
  #include "src/core/util/sync.h"
29
32
 
30
33
  namespace grpc_event_engine::experimental {
31
34
 
32
- struct ConnectionMetrics { // Delivery rate in Bytes/s.
33
- std::optional<uint64_t> delivery_rate;
34
- // If the delivery rate is limited by the application, this is set to true.
35
- std::optional<bool> is_delivery_rate_app_limited;
36
- // Total packets retransmitted.
37
- std::optional<uint32_t> packet_retx;
38
- // Total packets retransmitted spuriously. This metric is smaller than or
39
- // equal to packet_retx.
40
- std::optional<uint32_t> packet_spurious_retx;
41
- // Total packets sent.
42
- std::optional<uint32_t> packet_sent;
43
- // Total packets delivered.
44
- std::optional<uint32_t> packet_delivered;
45
- // Total packets delivered with ECE marked. This metric is smaller than or
46
- // equal to packet_delivered.
47
- std::optional<uint32_t> packet_delivered_ce;
48
- // Total bytes lost so far.
49
- std::optional<uint64_t> data_retx;
50
- // Total bytes sent so far.
51
- std::optional<uint64_t> data_sent;
52
- // Total bytes in write queue but not sent.
53
- std::optional<uint64_t> data_notsent;
54
- // Pacing rate of the connection in Bps
55
- std::optional<uint64_t> pacing_rate;
56
- // Minimum RTT observed in usec.
57
- std::optional<uint32_t> min_rtt;
58
- // Smoothed RTT in usec
59
- std::optional<uint32_t> srtt;
60
- // Send congestion window.
61
- std::optional<uint32_t> congestion_window;
62
- // Slow start threshold in packets.
63
- std::optional<uint32_t> snd_ssthresh;
64
- // Maximum degree of reordering (i.e., maximum number of packets reodered)
65
- // on the connection.
66
- std::optional<uint32_t> reordering;
67
- // Represents the number of recurring retransmissions of the first sequence
68
- // that is not acknowledged yet.
69
- std::optional<uint8_t> recurring_retrans;
70
- // The cumulative time (in usec) that the transport protocol was busy
71
- // sending data.
72
- std::optional<uint64_t> busy_usec;
73
- // The cumulative time (in usec) that the transport protocol was limited by
74
- // the receive window size.
75
- std::optional<uint64_t> rwnd_limited_usec;
76
- // The cumulative time (in usec) that the transport protocol was limited by
77
- // the send buffer size.
78
- std::optional<uint64_t> sndbuf_limited_usec;
79
- };
80
-
81
- struct BufferTimestamp {
82
- gpr_timespec time;
83
- ConnectionMetrics metrics; // Metrics collected with this timestamp
84
- };
85
-
86
- struct Timestamps {
87
- BufferTimestamp sendmsg_time;
88
- BufferTimestamp scheduled_time;
89
- BufferTimestamp sent_time;
90
- BufferTimestamp acked_time;
91
-
92
- uint32_t byte_offset; // byte offset relative to the start of the RPC
93
-
94
- #ifdef GRPC_LINUX_ERRQUEUE
95
- tcp_info info; // tcp_info collected on sendmsg
96
- #endif // GRPC_LINUX_ERRQUEUE
97
- };
98
-
99
35
  // TracedBuffer is a class to keep track of timestamps for a specific buffer in
100
36
  // the TCP layer. We are only tracking timestamps for Linux kernels and hence
101
37
  // this class would only be used by Linux platforms. For all other platforms,
@@ -108,10 +44,13 @@ struct Timestamps {
108
44
  class TracedBufferList {
109
45
  public:
110
46
  TracedBufferList() = default;
111
- ~TracedBufferList() = default;
47
+ ~TracedBufferList() { Shutdown(std::nullopt); }
48
+
112
49
  // Add a new entry in the TracedBuffer list pointed to by head. Also saves
113
50
  // sendmsg_time with the current timestamp.
114
- void AddNewEntry(int32_t seq_no, int fd, void* arg);
51
+ void AddNewEntry(int32_t seq_no, EventEnginePosixInterface* posix_interface,
52
+ const FileDescriptor& fd,
53
+ EventEngine::Endpoint::WriteEventSink sink);
115
54
  // Processes a received timestamp based on sock_extended_err and
116
55
  // scm_timestamping structures. It will invoke the timestamps callback if the
117
56
  // timestamp type is SCM_TSTAMP_ACK.
@@ -121,41 +60,37 @@ class TracedBufferList {
121
60
  // The Size() operation is slow and is used only in tests.
122
61
  int Size() {
123
62
  grpc_core::MutexLock lock(&mu_);
124
- int size = 0;
125
- TracedBuffer* curr = head_;
126
- while (curr) {
127
- ++size;
128
- curr = curr->next_;
129
- }
130
- return size;
63
+ return list_.size();
131
64
  }
132
65
  // Cleans the list by calling the callback for each traced buffer in the list
133
66
  // with timestamps that it has.
134
- void Shutdown(void* /*remaining*/, absl::Status /*shutdown_err*/);
67
+ void Shutdown(std::optional<EventEngine::Endpoint::WriteEventSink> remaining);
68
+
69
+ // Sets the maximum time we wait for a traced buffer to be Acked. Counted from
70
+ // the previous received event for the traced buffer.
71
+ static void TestOnlySetMaxPendingAckTime(grpc_core::Duration duration);
135
72
 
136
73
  private:
74
+ class Metrics {};
75
+
137
76
  class TracedBuffer {
138
77
  public:
139
- TracedBuffer(uint32_t seq_no, void* arg) : seq_no_(seq_no), arg_(arg) {}
78
+ TracedBuffer(uint32_t seq_no, EventEngine::Endpoint::WriteEventSink sink)
79
+ : seq_no_(seq_no), sink_(std::move(sink)) {}
140
80
  // Returns true if the TracedBuffer is considered stale at the given
141
81
  // timestamp.
142
- bool Finished(gpr_timespec ts);
82
+ bool TimedOut(grpc_core::Timestamp now);
143
83
 
144
84
  private:
145
85
  friend class TracedBufferList;
146
- gpr_timespec last_timestamp_;
147
- TracedBuffer* next_ = nullptr;
86
+ grpc_core::Timestamp last_timestamp_;
148
87
  uint32_t seq_no_; // The sequence number for the last byte in the buffer
149
- void* arg_; // The arg to pass to timestamps_callback
150
- Timestamps ts_; // The timestamps corresponding to this buffer
88
+ PosixWriteEventSink sink_;
151
89
  };
152
90
  grpc_core::Mutex mu_;
153
91
  // TracedBuffers are ordered by sequence number and would need to be processed
154
- // in a FIFO order starting with the smallest sequence number. To enable this,
155
- // they are stored in a singly linked with head and tail pointers which allows
156
- // easy appends and forward iteration operations.
157
- TracedBuffer* head_ = nullptr;
158
- TracedBuffer* tail_ = nullptr;
92
+ // in a FIFO order starting with the smallest sequence number.
93
+ std::list<TracedBuffer> list_ ABSL_GUARDED_BY(mu_);
159
94
  };
160
95
 
161
96
  #else // GRPC_LINUX_ERRQUEUE
@@ -167,15 +102,12 @@ class TracedBufferList {
167
102
  struct cmsghdr* /*opt_stats*/,
168
103
  struct scm_timestamping* /*tss*/) {}
169
104
  int Size() { return 0; }
170
- void Shutdown(void* /*remaining*/, absl::Status /*shutdown_err*/) {}
105
+ void Shutdown(
106
+ std::optional<EventEngine::Endpoint::WriteEventSink> /*remaining*/) {}
107
+ static void TestOnlySetMaxPendingAckTime(grpc_core::Duration /*duration*/);
171
108
  };
172
109
  #endif // GRPC_LINUX_ERRQUEUE
173
110
 
174
- // Sets the callback function to call when timestamps for a write are collected.
175
- // This is expected to be called atmost once.
176
- void TcpSetWriteTimestampsCallback(
177
- absl::AnyInvocable<void(void*, Timestamps*, absl::Status)>);
178
-
179
111
  } // namespace grpc_event_engine::experimental
180
112
 
181
113
  #endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_TRACED_BUFFER_LIST_H