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
@@ -29,7 +29,6 @@
29
29
  #include <memory>
30
30
  #include <optional>
31
31
  #include <string>
32
- #include <type_traits>
33
32
 
34
33
  #include "absl/functional/any_invocable.h"
35
34
  #include "absl/log/check.h"
@@ -40,8 +39,7 @@
40
39
  #include "src/core/lib/debug/trace.h"
41
40
  #include "src/core/lib/event_engine/posix_engine/event_poller.h"
42
41
  #include "src/core/lib/event_engine/posix_engine/internal_errqueue.h"
43
- #include "src/core/lib/event_engine/posix_engine/tcp_socket_utils.h"
44
- #include "src/core/lib/event_engine/tcp_socket_utils.h"
42
+ #include "src/core/lib/event_engine/posix_engine/posix_interface.h"
45
43
  #include "src/core/lib/experiments/experiments.h"
46
44
  #include "src/core/lib/iomgr/exec_ctx.h"
47
45
  #include "src/core/lib/resource_quota/resource_quota.h"
@@ -53,7 +51,6 @@
53
51
  #include "src/core/util/status_helper.h"
54
52
  #include "src/core/util/strerror.h"
55
53
  #include "src/core/util/sync.h"
56
- #include "src/core/util/time.h"
57
54
 
58
55
  #ifdef GRPC_POSIX_SOCKET_TCP
59
56
  #ifdef GRPC_LINUX_ERRQUEUE
@@ -98,15 +95,19 @@ namespace {
98
95
 
99
96
  // A wrapper around sendmsg. It sends \a msg over \a fd and returns the number
100
97
  // of bytes sent.
101
- ssize_t TcpSend(int fd, const struct msghdr* msg, int* saved_errno,
102
- int additional_flags = 0) {
98
+ PosixErrorOr<int64_t> TcpSend(EventEnginePosixInterface* posix_interface,
99
+ const FileDescriptor& fd,
100
+ const struct msghdr* msg, int* saved_errno,
101
+ int additional_flags = 0) {
103
102
  GRPC_LATENT_SEE_PARENT_SCOPE("TcpSend");
104
- ssize_t sent_length;
103
+ PosixErrorOr<int64_t> send_result;
105
104
  do {
106
105
  grpc_core::global_stats().IncrementSyscallWrite();
107
- sent_length = sendmsg(fd, msg, SENDMSG_FLAGS | additional_flags);
108
- } while (sent_length < 0 && (*saved_errno = errno) == EINTR);
109
- return sent_length;
106
+ send_result =
107
+ posix_interface->SendMsg(fd, msg, SENDMSG_FLAGS | additional_flags);
108
+ *saved_errno = send_result.errno_value().value_or(0);
109
+ } while (send_result.IsPosixError(EINTR));
110
+ return send_result;
110
111
  }
111
112
 
112
113
  #ifdef GRPC_LINUX_ERRQUEUE
@@ -211,9 +212,14 @@ bool CmsgIsZeroCopy(const cmsghdr& cmsg) {
211
212
  }
212
213
  #endif // GRPC_LINUX_ERRQUEUE
213
214
 
214
- absl::Status PosixOSError(int error_no, absl::string_view call_name) {
215
- return absl::UnknownError(absl::StrCat(
216
- call_name, ": ", grpc_core::StrError(error_no), " (", error_no, ")"));
215
+ absl::Status PosixOSError(const PosixErrorOr<int64_t>& error_no,
216
+ absl::string_view call_name) {
217
+ if (error_no.IsPosixError()) {
218
+ return absl::UnknownError(
219
+ absl::StrCat(call_name, ": ", error_no.StrError()));
220
+ }
221
+ return absl::UnknownError(
222
+ absl::StrCat(call_name, ": Wrong file descriptor generation"));
217
223
  }
218
224
 
219
225
  } // namespace
@@ -288,7 +294,6 @@ bool PosixEndpointImpl::TcpDoRead(absl::Status& status) {
288
294
 
289
295
  struct msghdr msg;
290
296
  struct iovec iov[MAX_READ_IOVEC];
291
- ssize_t read_bytes;
292
297
  size_t total_read_bytes = 0;
293
298
  size_t iov_len = std::min<size_t>(MAX_READ_IOVEC, incoming_buffer_->Count());
294
299
  #ifdef GRPC_LINUX_ERRQUEUE
@@ -330,12 +335,14 @@ bool PosixEndpointImpl::TcpDoRead(absl::Status& status) {
330
335
  grpc_core::global_stats().IncrementTcpReadOffer(incoming_buffer_->Length());
331
336
  grpc_core::global_stats().IncrementTcpReadOfferIovSize(
332
337
  incoming_buffer_->Count());
338
+ PosixErrorOr<int64_t> res;
339
+ EventEnginePosixInterface& posix_interface = poller_->posix_interface();
333
340
  do {
334
341
  grpc_core::global_stats().IncrementSyscallRead();
335
- read_bytes = recvmsg(fd_, &msg, 0);
336
- } while (read_bytes < 0 && errno == EINTR);
342
+ res = posix_interface.RecvMsg(handle_->WrappedFd(), &msg, 0);
343
+ } while (res.IsPosixError(EINTR));
337
344
 
338
- if (read_bytes < 0 && errno == EAGAIN) {
345
+ if (res.IsPosixError(EAGAIN)) {
339
346
  // NB: After calling call_read_cb a parallel call of the read handler may
340
347
  // be running.
341
348
  if (total_read_bytes > 0) {
@@ -345,7 +352,7 @@ bool PosixEndpointImpl::TcpDoRead(absl::Status& status) {
345
352
  inq_ = 0;
346
353
  return false;
347
354
  }
348
-
355
+ ssize_t read_bytes = res.value_or(-1);
349
356
  // We have read something in previous reads. We need to deliver those bytes
350
357
  // to the upper layer.
351
358
  if (read_bytes <= 0 && total_read_bytes >= 1) {
@@ -355,7 +362,12 @@ bool PosixEndpointImpl::TcpDoRead(absl::Status& status) {
355
362
  if (read_bytes <= 0) {
356
363
  // 0 read size ==> end of stream
357
364
  incoming_buffer_->Clear();
358
- if (read_bytes == 0) {
365
+ if (res.IsWrongGenerationError()) {
366
+ status = absl::CancelledError("Closed on fork");
367
+ grpc_core::StatusSetInt(&status,
368
+ grpc_core::StatusIntProperty::kRpcStatus,
369
+ GRPC_STATUS_CANCELLED);
370
+ } else if (read_bytes == 0) {
359
371
  status = TcpAnnotateError(absl::InternalError("Socket closed"));
360
372
  } else {
361
373
  status = TcpAnnotateError(absl::InternalError(
@@ -363,7 +375,6 @@ bool PosixEndpointImpl::TcpDoRead(absl::Status& status) {
363
375
  }
364
376
  return true;
365
377
  }
366
-
367
378
  grpc_core::global_stats().IncrementTcpReadSize(read_bytes);
368
379
  AddToEstimate(static_cast<size_t>(read_bytes));
369
380
  DCHECK((size_t)read_bytes <= incoming_buffer_->Length() - total_read_bytes);
@@ -508,11 +519,16 @@ void PosixEndpointImpl::UpdateRcvLowat() {
508
519
  if (set_rcvlowat_ == remaining) {
509
520
  return;
510
521
  }
511
- auto result = sock_.SetSocketRcvLowat(remaining);
522
+ // Instruct the kernel to wait for specified number of bytes to be received on
523
+ // the socket before generating an interrupt for packet receive. If the call
524
+ // succeeds, it returns the number of bytes (wait threshold) that was actually
525
+ // set.
526
+ auto result = poller_->posix_interface().SetSockOpt(
527
+ handle_->WrappedFd(), SOL_SOCKET, SO_RCVLOWAT, remaining);
512
528
  if (result.ok()) {
513
529
  set_rcvlowat_ = *result;
514
530
  } else {
515
- LOG(ERROR) << "ERROR in SO_RCVLOWAT: " << result.status().message();
531
+ LOG(ERROR) << "ERROR in SO_RCVLOWAT: " << result.StrError();
516
532
  }
517
533
  }
518
534
 
@@ -705,17 +721,17 @@ bool PosixEndpointImpl::ProcessErrors() {
705
721
  struct cmsghdr align;
706
722
  } aligned_buf;
707
723
  msg.msg_control = aligned_buf.rbuf;
708
- int r, saved_errno;
724
+ PosixErrorOr<int64_t> r;
725
+ EventEnginePosixInterface& posix_interface = poller_->posix_interface();
709
726
  while (true) {
710
727
  msg.msg_controllen = sizeof(aligned_buf.rbuf);
711
728
  do {
712
- r = recvmsg(fd_, &msg, MSG_ERRQUEUE);
713
- saved_errno = errno;
714
- } while (r < 0 && saved_errno == EINTR);
729
+ r = posix_interface.RecvMsg(handle_->WrappedFd(), &msg, MSG_ERRQUEUE);
730
+ } while (r.IsPosixError(EINTR));
715
731
 
716
- if (r < 0 && saved_errno == EAGAIN) {
732
+ if (r.IsPosixError(EAGAIN)) {
717
733
  return processed_err; // No more errors to process
718
- } else if (r < 0) {
734
+ } else if (!r.ok()) {
719
735
  return processed_err;
720
736
  }
721
737
  if (GPR_UNLIKELY((msg.msg_flags & MSG_CTRUNC) != 0)) {
@@ -842,13 +858,15 @@ void PosixEndpointImpl::HandleError(absl::Status status) {
842
858
 
843
859
  bool PosixEndpointImpl::WriteWithTimestamps(struct msghdr* msg,
844
860
  size_t sending_length,
845
- ssize_t* sent_length,
861
+ PosixErrorOr<int64_t>* sent_length,
846
862
  int* saved_errno,
847
863
  int additional_flags) {
864
+ auto& posix_interface = poller_->posix_interface();
848
865
  if (!socket_ts_enabled_) {
849
- uint32_t opt = kTimestampingSocketOptions;
850
- if (setsockopt(fd_, SOL_SOCKET, SO_TIMESTAMPING, static_cast<void*>(&opt),
851
- sizeof(opt)) != 0) {
866
+ if (!posix_interface
867
+ .SetSockOpt(handle_->WrappedFd(), SOL_SOCKET, SO_TIMESTAMPING,
868
+ kTimestampingSocketOptions)
869
+ .ok()) {
852
870
  return false;
853
871
  }
854
872
  bytes_counter_ = -1;
@@ -867,16 +885,23 @@ bool PosixEndpointImpl::WriteWithTimestamps(struct msghdr* msg,
867
885
  msg->msg_control = u.cmsg_buf;
868
886
  msg->msg_controllen = CMSG_SPACE(sizeof(uint32_t));
869
887
 
888
+ // Add traced buffer before we write to avoid race conditions with getting the
889
+ // timestamps from the error queue. If sending fails, we simply shutdown the
890
+ // traced buffer list.
891
+ traced_buffers_.AddNewEntry(
892
+ static_cast<uint32_t>(bytes_counter_ + sending_length),
893
+ &poller_->posix_interface(), handle_->WrappedFd(),
894
+ std::move(outgoing_buffer_write_event_sink_).value());
895
+ outgoing_buffer_write_event_sink_.reset();
896
+
870
897
  // If there was an error on sendmsg the logic in tcp_flush will handle it.
871
898
  grpc_core::global_stats().IncrementTcpWriteSize(sending_length);
872
- ssize_t length = TcpSend(fd_, msg, saved_errno, additional_flags);
873
- *sent_length = length;
874
- // Only save timestamps if all the bytes were taken by sendmsg.
875
- if (sending_length == static_cast<size_t>(length)) {
876
- traced_buffers_.AddNewEntry(static_cast<uint32_t>(bytes_counter_ + length),
877
- fd_, outgoing_buffer_arg_);
878
- outgoing_buffer_arg_ = nullptr;
899
+ PosixErrorOr<int64_t> length = TcpSend(&posix_interface, handle_->WrappedFd(),
900
+ msg, saved_errno, additional_flags);
901
+ if (!length.ok()) {
902
+ return false;
879
903
  }
904
+ *sent_length = length;
880
905
  return true;
881
906
  }
882
907
 
@@ -892,11 +917,10 @@ void PosixEndpointImpl::HandleError(absl::Status /*status*/) {
892
917
 
893
918
  void PosixEndpointImpl::ZerocopyDisableAndWaitForRemaining() {}
894
919
 
895
- bool PosixEndpointImpl::WriteWithTimestamps(struct msghdr* /*msg*/,
896
- size_t /*sending_length*/,
897
- ssize_t* /*sent_length*/,
898
- int* /*saved_errno*/,
899
- int /*additional_flags*/) {
920
+ bool PosixEndpointImpl::WriteWithTimestamps(
921
+ struct msghdr* /*msg*/, size_t /*sending_length*/,
922
+ PosixErrorOr<int64_t>* /*sent_length*/, int* /*saved_errno*/,
923
+ int /*additional_flags*/) {
900
924
  grpc_core::Crash("Write with timestamps not supported for this platform");
901
925
  }
902
926
  #endif // GRPC_LINUX_ERRQUEUE
@@ -909,12 +933,12 @@ void PosixEndpointImpl::UnrefMaybePutZerocopySendRecord(
909
933
  }
910
934
 
911
935
  // If outgoing_buffer_arg is filled, shuts down the list early, so that any
912
- // release operations needed can be performed on the arg.
936
+ // release operations needed can be performed on the arg. Should be used when we
937
+ // know that there are not gonna be any write timestamps returned on the error
938
+ // queue, for example, if the socket is not capable of reporting timestamps.
913
939
  void PosixEndpointImpl::TcpShutdownTracedBufferList() {
914
- if (outgoing_buffer_arg_ != nullptr) {
915
- traced_buffers_.Shutdown(outgoing_buffer_arg_,
916
- absl::InternalError("TracedBuffer list shutdown"));
917
- outgoing_buffer_arg_ = nullptr;
940
+ if (outgoing_buffer_write_event_sink_.has_value()) {
941
+ traced_buffers_.Shutdown(std::move(outgoing_buffer_write_event_sink_));
918
942
  }
919
943
  }
920
944
 
@@ -922,7 +946,6 @@ void PosixEndpointImpl::TcpShutdownTracedBufferList() {
922
946
  bool PosixEndpointImpl::DoFlushZerocopy(TcpZerocopySendRecord* record,
923
947
  absl::Status& status) {
924
948
  msg_iovlen_type iov_size;
925
- ssize_t sent_length = 0;
926
949
  size_t sending_length;
927
950
  size_t unwind_slice_idx;
928
951
  size_t unwind_byte_idx;
@@ -936,6 +959,7 @@ bool PosixEndpointImpl::DoFlushZerocopy(TcpZerocopySendRecord* record,
936
959
  // being populated in most cases.
937
960
  iovec iov[MAX_WRITE_IOVEC];
938
961
  while (true) {
962
+ PosixErrorOr<int64_t> send_status;
939
963
  sending_length = 0;
940
964
  iov_size = record->PopulateIovs(&unwind_slice_idx, &unwind_byte_idx,
941
965
  &sending_length, iov);
@@ -950,9 +974,9 @@ bool PosixEndpointImpl::DoFlushZerocopy(TcpZerocopySendRecord* record,
950
974
  // take a single ref on the zerocopy send record.
951
975
  tcp_zerocopy_send_ctx_->NoteSend(record);
952
976
  saved_errno = 0;
953
- if (outgoing_buffer_arg_ != nullptr) {
977
+ if (outgoing_buffer_write_event_sink_.has_value()) {
954
978
  if (!ts_capable_ ||
955
- !WriteWithTimestamps(&msg, sending_length, &sent_length, &saved_errno,
979
+ !WriteWithTimestamps(&msg, sending_length, &send_status, &saved_errno,
956
980
  MSG_ZEROCOPY)) {
957
981
  // We could not set socket options to collect Fathom timestamps.
958
982
  // Fallback on writing without timestamps.
@@ -967,7 +991,8 @@ bool PosixEndpointImpl::DoFlushZerocopy(TcpZerocopySendRecord* record,
967
991
  msg.msg_controllen = 0;
968
992
  grpc_core::global_stats().IncrementTcpWriteSize(sending_length);
969
993
  grpc_core::global_stats().IncrementTcpWriteIovSize(iov_size);
970
- sent_length = TcpSend(fd_, &msg, &saved_errno, MSG_ZEROCOPY);
994
+ send_status = TcpSend(&poller_->posix_interface(), handle_->WrappedFd(),
995
+ &msg, &saved_errno, MSG_ZEROCOPY);
971
996
  }
972
997
  if (tcp_zerocopy_send_ctx_->UpdateZeroCopyOptMemStateAfterSend(
973
998
  saved_errno == ENOBUFS, constrained) ||
@@ -997,21 +1022,21 @@ bool PosixEndpointImpl::DoFlushZerocopy(TcpZerocopySendRecord* record,
997
1022
  #endif
998
1023
  }
999
1024
  }
1000
- if (sent_length < 0) {
1025
+ if (!send_status.ok()) {
1001
1026
  // If this particular send failed, drop ref taken earlier in this method.
1002
1027
  tcp_zerocopy_send_ctx_->UndoSend();
1003
- if (saved_errno == EAGAIN || saved_errno == ENOBUFS) {
1028
+ if (send_status.IsPosixError(EAGAIN) ||
1029
+ send_status.IsPosixError(ENOBUFS)) {
1004
1030
  record->UnwindIfThrottled(unwind_slice_idx, unwind_byte_idx);
1005
1031
  return false;
1006
1032
  } else {
1007
- status = TcpAnnotateError(PosixOSError(saved_errno, "sendmsg"));
1008
- TcpShutdownTracedBufferList();
1033
+ status = TcpAnnotateError(PosixOSError(send_status, "sendmsg"));
1009
1034
  return true;
1010
1035
  }
1011
1036
  }
1012
- bytes_counter_ += sent_length;
1037
+ bytes_counter_ += *send_status;
1013
1038
  record->UpdateOffsetForBytesSent(sending_length,
1014
- static_cast<size_t>(sent_length));
1039
+ static_cast<size_t>(*send_status));
1015
1040
  if (record->AllSlicesSent()) {
1016
1041
  return true;
1017
1042
  }
@@ -1033,7 +1058,6 @@ bool PosixEndpointImpl::TcpFlush(absl::Status& status) {
1033
1058
  struct msghdr msg;
1034
1059
  struct iovec iov[MAX_WRITE_IOVEC];
1035
1060
  msg_iovlen_type iov_size;
1036
- ssize_t sent_length = 0;
1037
1061
  size_t sending_length;
1038
1062
  size_t trailing;
1039
1063
  size_t unwind_slice_idx;
@@ -1046,6 +1070,7 @@ bool PosixEndpointImpl::TcpFlush(absl::Status& status) {
1046
1070
  size_t outgoing_slice_idx = 0;
1047
1071
 
1048
1072
  while (true) {
1073
+ PosixErrorOr<int64_t> send_result;
1049
1074
  sending_length = 0;
1050
1075
  unwind_slice_idx = outgoing_slice_idx;
1051
1076
  unwind_byte_idx = outgoing_byte_idx_;
@@ -1070,9 +1095,9 @@ bool PosixEndpointImpl::TcpFlush(absl::Status& status) {
1070
1095
  msg.msg_flags = 0;
1071
1096
  bool tried_sending_message = false;
1072
1097
  saved_errno = 0;
1073
- if (outgoing_buffer_arg_ != nullptr) {
1098
+ if (outgoing_buffer_write_event_sink_.has_value()) {
1074
1099
  if (!ts_capable_ || !WriteWithTimestamps(&msg, sending_length,
1075
- &sent_length, &saved_errno, 0)) {
1100
+ &send_result, &saved_errno, 0)) {
1076
1101
  // We could not set socket options to collect Fathom timestamps.
1077
1102
  // Fallback on writing without timestamps.
1078
1103
  ts_capable_ = false;
@@ -1086,11 +1111,13 @@ bool PosixEndpointImpl::TcpFlush(absl::Status& status) {
1086
1111
  msg.msg_controllen = 0;
1087
1112
  grpc_core::global_stats().IncrementTcpWriteSize(sending_length);
1088
1113
  grpc_core::global_stats().IncrementTcpWriteIovSize(iov_size);
1089
- sent_length = TcpSend(fd_, &msg, &saved_errno);
1114
+ send_result = TcpSend(&poller_->posix_interface(), handle_->WrappedFd(),
1115
+ &msg, &saved_errno);
1090
1116
  }
1091
1117
 
1092
- if (sent_length < 0) {
1093
- if (saved_errno == EAGAIN || saved_errno == ENOBUFS) {
1118
+ if (!send_result.ok()) {
1119
+ if (send_result.IsPosixError(EAGAIN) ||
1120
+ send_result.IsPosixError(ENOBUFS)) {
1094
1121
  outgoing_byte_idx_ = unwind_byte_idx;
1095
1122
  // unref all and forget about all slices that have been written to this
1096
1123
  // point
@@ -1099,16 +1126,15 @@ bool PosixEndpointImpl::TcpFlush(absl::Status& status) {
1099
1126
  }
1100
1127
  return false;
1101
1128
  } else {
1102
- status = TcpAnnotateError(PosixOSError(saved_errno, "sendmsg"));
1129
+ status = TcpAnnotateError(PosixOSError(send_result, "sendmsg"));
1103
1130
  outgoing_buffer_->Clear();
1104
- TcpShutdownTracedBufferList();
1105
1131
  return true;
1106
1132
  }
1107
1133
  }
1108
1134
 
1109
1135
  CHECK_EQ(outgoing_byte_idx_, 0u);
1110
- bytes_counter_ += sent_length;
1111
- trailing = sending_length - static_cast<size_t>(sent_length);
1136
+ bytes_counter_ += *send_result;
1137
+ trailing = sending_length - static_cast<size_t>(*send_result);
1112
1138
  while (trailing > 0) {
1113
1139
  size_t slice_length;
1114
1140
  outgoing_slice_idx--;
@@ -1172,7 +1198,8 @@ bool PosixEndpointImpl::Write(
1172
1198
  << "Endpoint[" << this << "]: Write " << data->Length() << " bytes";
1173
1199
 
1174
1200
  if (data->Length() == 0) {
1175
- TcpShutdownTracedBufferList();
1201
+ GRPC_TRACE_LOG(event_engine_endpoint, INFO)
1202
+ << "Endpoint[" << this << "]: Write skipped";
1176
1203
  if (handle_->IsHandleShutdown()) {
1177
1204
  status = TcpAnnotateError(absl::InternalError("EOF"));
1178
1205
  engine_->Run(
@@ -1183,8 +1210,6 @@ bool PosixEndpointImpl::Write(
1183
1210
  });
1184
1211
  return false;
1185
1212
  }
1186
- GRPC_TRACE_LOG(event_engine_endpoint, INFO)
1187
- << "Endpoint[" << this << "]: Write skipped";
1188
1213
  return true;
1189
1214
  }
1190
1215
 
@@ -1194,10 +1219,8 @@ bool PosixEndpointImpl::Write(
1194
1219
  outgoing_buffer_ = data;
1195
1220
  outgoing_byte_idx_ = 0;
1196
1221
  }
1197
- outgoing_buffer_arg_ =
1198
- args.GetDeprecatedAndDiscouragedGoogleSpecificPointer();
1199
- if (outgoing_buffer_arg_) {
1200
- CHECK(poller_->CanTrackErrors());
1222
+ if (args.has_metrics_sink() && poller_->CanTrackErrors()) {
1223
+ outgoing_buffer_write_event_sink_ = args.TakeMetricsSink();
1201
1224
  }
1202
1225
 
1203
1226
  bool flush_result = zerocopy_send_record != nullptr
@@ -1247,12 +1270,12 @@ void PosixEndpointImpl::MaybeShutdown(
1247
1270
  }
1248
1271
 
1249
1272
  PosixEndpointImpl ::~PosixEndpointImpl() {
1250
- int release_fd = -1;
1273
+ FileDescriptor release_fd;
1251
1274
  handle_->OrphanHandle(on_done_,
1252
1275
  on_release_fd_ == nullptr ? nullptr : &release_fd, "");
1253
1276
  if (on_release_fd_ != nullptr) {
1254
1277
  engine_->Run([on_release_fd = std::move(on_release_fd_),
1255
- release_fd]() mutable { on_release_fd(release_fd); });
1278
+ release_fd]() mutable { on_release_fd(release_fd.fd()); });
1256
1279
  }
1257
1280
  delete on_read_;
1258
1281
  delete on_write_;
@@ -1264,24 +1287,23 @@ PosixEndpointImpl::PosixEndpointImpl(EventHandle* handle,
1264
1287
  std::shared_ptr<EventEngine> engine,
1265
1288
  MemoryAllocator&& /*allocator*/,
1266
1289
  const PosixTcpOptions& options)
1267
- : sock_(PosixSocketWrapper(handle->WrappedFd())),
1268
- on_done_(on_done),
1290
+ : on_done_(on_done),
1269
1291
  traced_buffers_(),
1270
1292
  handle_(handle),
1271
1293
  poller_(handle->Poller()),
1272
1294
  engine_(engine) {
1273
- PosixSocketWrapper sock(handle->WrappedFd());
1274
- fd_ = handle_->WrappedFd();
1295
+ FileDescriptor fd = handle_->WrappedFd();
1275
1296
  CHECK(options.resource_quota != nullptr);
1276
- auto peer_addr_string = sock.PeerAddressString();
1297
+ auto& posix_interface = poller_->posix_interface();
1298
+ auto peer_addr_string = posix_interface.PeerAddressString(fd);
1277
1299
  mem_quota_ = options.resource_quota->memory_quota();
1278
1300
  memory_owner_ = mem_quota_->CreateMemoryOwner();
1279
1301
  self_reservation_ = memory_owner_.MakeReservation(sizeof(PosixEndpointImpl));
1280
- auto local_address = sock.LocalAddress();
1302
+ auto local_address = posix_interface.LocalAddress(fd);
1281
1303
  if (local_address.ok()) {
1282
1304
  local_address_ = *local_address;
1283
1305
  }
1284
- auto peer_address = sock.PeerAddress();
1306
+ auto peer_address = posix_interface.PeerAddress(fd);
1285
1307
  if (peer_address.ok()) {
1286
1308
  peer_address_ = *peer_address;
1287
1309
  }
@@ -1304,14 +1326,11 @@ PosixEndpointImpl::PosixEndpointImpl(EventHandle* handle,
1304
1326
  << "ulimit value is not set. Use ulimit -l <value> to set its "
1305
1327
  << "value.";
1306
1328
  } else {
1307
- const int enable = 1;
1308
- if (setsockopt(fd_, SOL_SOCKET, SO_ZEROCOPY, &enable, sizeof(enable)) !=
1309
- 0) {
1329
+ if (posix_interface.SetSockOpt(fd, SOL_SOCKET, SO_ZEROCOPY, 1).ok()) {
1310
1330
  zerocopy_enabled = false;
1311
1331
  LOG(ERROR) << "Failed to set zerocopy options on the socket.";
1312
1332
  }
1313
1333
  }
1314
-
1315
1334
  if (zerocopy_enabled) {
1316
1335
  VLOG(2) << "Tx-zero copy enabled for gRPC sends. RLIMIT_MEMLOCK value "
1317
1336
  << "=" << GetRLimitMemLockMax()
@@ -1323,11 +1342,11 @@ PosixEndpointImpl::PosixEndpointImpl(EventHandle* handle,
1323
1342
  zerocopy_enabled, options.tcp_tx_zerocopy_max_simultaneous_sends,
1324
1343
  options.tcp_tx_zerocopy_send_bytes_threshold);
1325
1344
  #ifdef GRPC_HAVE_TCP_INQ
1326
- int one = 1;
1327
- if (setsockopt(fd_, SOL_TCP, TCP_INQ, &one, sizeof(one)) == 0) {
1345
+ auto result = posix_interface.SetSockOpt(fd, SOL_TCP, TCP_INQ, 1);
1346
+ if (result.ok()) {
1328
1347
  inq_capable_ = true;
1329
1348
  } else {
1330
- VLOG(2) << "cannot set inq fd=" << fd_ << " errno=" << errno;
1349
+ VLOG(2) << "cannot set inq fd=" << fd << " error=" << result.StrError();
1331
1350
  inq_capable_ = false;
1332
1351
  }
1333
1352
  #else
@@ -1348,6 +1367,40 @@ PosixEndpointImpl::PosixEndpointImpl(EventHandle* handle,
1348
1367
  }
1349
1368
  }
1350
1369
 
1370
+ namespace {
1371
+ class PosixEndpointTelemetryInfo : public EventEngine::Endpoint::TelemetryInfo {
1372
+ public:
1373
+ std::vector<size_t> AllWriteMetrics() const override {
1374
+ return PosixWriteEventSink::AllWriteMetrics();
1375
+ }
1376
+
1377
+ std::optional<absl::string_view> GetMetricName(size_t key) const override {
1378
+ return PosixWriteEventSink::GetMetricName(key);
1379
+ }
1380
+
1381
+ std::optional<size_t> GetMetricKey(absl::string_view name) const override {
1382
+ return PosixWriteEventSink::GetMetricKey(name);
1383
+ }
1384
+
1385
+ std::shared_ptr<EventEngine::Endpoint::MetricsSet> GetMetricsSet(
1386
+ absl::Span<const size_t> keys) const override {
1387
+ return PosixWriteEventSink::GetMetricsSet(keys);
1388
+ }
1389
+
1390
+ std::shared_ptr<EventEngine::Endpoint::MetricsSet> GetFullMetricsSet()
1391
+ const override {
1392
+ return PosixWriteEventSink::GetFullMetricsSet();
1393
+ }
1394
+ };
1395
+ } // namespace
1396
+
1397
+ std::shared_ptr<EventEngine::Endpoint::TelemetryInfo>
1398
+ PosixEndpoint::GetTelemetryInfo() const {
1399
+ static absl::NoDestructor<std::shared_ptr<PosixEndpointTelemetryInfo>>
1400
+ telemetry_info(std::make_shared<PosixEndpointTelemetryInfo>());
1401
+ return *telemetry_info;
1402
+ }
1403
+
1351
1404
  std::unique_ptr<PosixEndpoint> CreatePosixEndpoint(
1352
1405
  EventHandle* handle, PosixEngineClosure* on_shutdown,
1353
1406
  std::shared_ptr<EventEngine> engine, MemoryAllocator&& allocator,
@@ -27,19 +27,15 @@
27
27
  #include <atomic>
28
28
  #include <cstdint>
29
29
  #include <memory>
30
- #include <new>
31
- #include <optional>
32
30
  #include <utility>
33
31
 
34
32
  #include "absl/base/thread_annotations.h"
35
33
  #include "absl/container/flat_hash_map.h"
36
34
  #include "absl/functional/any_invocable.h"
37
- #include "absl/hash/hash.h"
38
35
  #include "absl/log/check.h"
39
36
  #include "absl/log/log.h"
40
37
  #include "absl/status/status.h"
41
38
  #include "absl/status/statusor.h"
42
- #include "src/core/lib/event_engine/extensions/supports_fd.h"
43
39
  #include "src/core/lib/event_engine/posix.h"
44
40
  #include "src/core/lib/event_engine/posix_engine/event_poller.h"
45
41
  #include "src/core/lib/event_engine/posix_engine/posix_engine_closure.h"
@@ -488,7 +484,7 @@ class PosixEndpointImpl : public grpc_core::RefCounted<PosixEndpointImpl> {
488
484
  return local_address_;
489
485
  }
490
486
 
491
- int GetWrappedFd() { return fd_; }
487
+ FileDescriptor GetWrappedFd() { return handle_->WrappedFd(); }
492
488
 
493
489
  bool CanTrackErrors() const { return poller_->CanTrackErrors(); }
494
490
 
@@ -519,7 +515,7 @@ class PosixEndpointImpl : public grpc_core::RefCounted<PosixEndpointImpl> {
519
515
  void UnrefMaybePutZerocopySendRecord(TcpZerocopySendRecord* record);
520
516
  void ZerocopyDisableAndWaitForRemaining();
521
517
  bool WriteWithTimestamps(struct msghdr* msg, size_t sending_length,
522
- ssize_t* sent_length, int* saved_errno,
518
+ PosixErrorOr<int64_t>* sent_length, int* saved_errno,
523
519
  int additional_flags);
524
520
  absl::Status TcpAnnotateError(absl::Status src_error) const;
525
521
  #ifdef GRPC_LINUX_ERRQUEUE
@@ -530,16 +526,13 @@ class PosixEndpointImpl : public grpc_core::RefCounted<PosixEndpointImpl> {
530
526
  struct cmsghdr* ProcessTimestamp(msghdr* msg, struct cmsghdr* cmsg);
531
527
  #endif // GRPC_LINUX_ERRQUEUE
532
528
  grpc_core::Mutex read_mu_;
533
- PosixSocketWrapper sock_;
534
- int fd_;
535
529
  bool is_first_read_ = true;
536
530
  bool has_posted_reclaimer_ ABSL_GUARDED_BY(read_mu_) = false;
537
531
  double target_length_;
538
532
  int min_read_chunk_size_;
539
533
  int max_read_chunk_size_;
540
- int set_rcvlowat_ = 0;
534
+ int64_t set_rcvlowat_ = 0;
541
535
  double bytes_read_this_round_ = 0;
542
- std::atomic<int> ref_count_{1};
543
536
 
544
537
  // garbage after the last read.
545
538
  grpc_event_engine::experimental::SliceBuffer last_read_buffer_;
@@ -571,7 +564,9 @@ class PosixEndpointImpl : public grpc_core::RefCounted<PosixEndpointImpl> {
571
564
  grpc_core::MemoryOwner memory_owner_;
572
565
  grpc_core::MemoryAllocator::Reservation self_reservation_;
573
566
 
574
- void* outgoing_buffer_arg_ = nullptr;
567
+ std::optional<
568
+ grpc_event_engine::experimental::EventEngine::Endpoint::WriteEventSink>
569
+ outgoing_buffer_write_event_sink_;
575
570
 
576
571
  absl::AnyInvocable<void(absl::StatusOr<int>)> on_release_fd_ = nullptr;
577
572
 
@@ -623,13 +618,8 @@ class PosixEndpoint : public PosixEndpointWithFdSupport {
623
618
  return impl_->Write(std::move(on_writable), data, std::move(args));
624
619
  }
625
620
 
626
- std::vector<size_t> AllWriteMetrics() override { return {}; }
627
- std::optional<absl::string_view> GetMetricName(size_t) override {
628
- return std::nullopt;
629
- }
630
- std::optional<size_t> GetMetricKey(absl::string_view) override {
631
- return std::nullopt;
632
- }
621
+ std::shared_ptr<EventEngine::Endpoint::TelemetryInfo> GetTelemetryInfo()
622
+ const override;
633
623
 
634
624
  const grpc_event_engine::experimental::EventEngine::ResolvedAddress&
635
625
  GetPeerAddress() const override {
@@ -640,7 +630,7 @@ class PosixEndpoint : public PosixEndpointWithFdSupport {
640
630
  return impl_->GetLocalAddress();
641
631
  }
642
632
 
643
- int GetWrappedFd() override { return impl_->GetWrappedFd(); }
633
+ int GetWrappedFd() override { return impl_->GetWrappedFd().fd(); }
644
634
 
645
635
  bool CanTrackErrors() override { return impl_->CanTrackErrors(); }
646
636