grpc 1.50.0 → 1.52.0.pre2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (1009) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +206 -49
  3. data/include/grpc/byte_buffer.h +76 -1
  4. data/include/grpc/byte_buffer_reader.h +19 -1
  5. data/include/grpc/compression.h +2 -2
  6. data/include/grpc/event_engine/event_engine.h +27 -6
  7. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -1
  8. data/include/grpc/event_engine/internal/slice_cast.h +67 -0
  9. data/include/grpc/event_engine/memory_allocator.h +1 -1
  10. data/include/grpc/event_engine/slice.h +24 -4
  11. data/include/grpc/event_engine/slice_buffer.h +31 -2
  12. data/include/grpc/fork.h +25 -1
  13. data/include/grpc/grpc.h +3 -13
  14. data/include/grpc/grpc_posix.h +1 -1
  15. data/include/grpc/impl/codegen/atm.h +3 -71
  16. data/include/grpc/impl/codegen/atm_gcc_atomic.h +3 -58
  17. data/include/grpc/impl/codegen/atm_gcc_sync.h +3 -59
  18. data/include/grpc/impl/codegen/atm_windows.h +3 -106
  19. data/include/grpc/impl/codegen/byte_buffer.h +4 -78
  20. data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -19
  21. data/include/grpc/impl/codegen/compression_types.h +3 -82
  22. data/include/grpc/impl/codegen/connectivity_state.h +3 -20
  23. data/include/grpc/impl/codegen/fork.h +4 -25
  24. data/include/grpc/impl/codegen/gpr_types.h +2 -34
  25. data/include/grpc/impl/codegen/grpc_types.h +3 -791
  26. data/include/grpc/impl/codegen/log.h +3 -86
  27. data/include/grpc/impl/codegen/port_platform.h +3 -758
  28. data/include/grpc/impl/codegen/propagation_bits.h +3 -28
  29. data/include/grpc/impl/codegen/slice.h +3 -106
  30. data/include/grpc/impl/codegen/status.h +4 -131
  31. data/include/grpc/impl/codegen/sync.h +3 -42
  32. data/include/grpc/impl/codegen/sync_abseil.h +3 -12
  33. data/include/grpc/impl/codegen/sync_custom.h +3 -14
  34. data/include/grpc/impl/codegen/sync_generic.h +3 -25
  35. data/include/grpc/impl/codegen/sync_posix.h +3 -28
  36. data/include/grpc/impl/codegen/sync_windows.h +3 -16
  37. data/include/grpc/impl/compression_types.h +109 -0
  38. data/include/grpc/impl/connectivity_state.h +47 -0
  39. data/include/grpc/impl/grpc_types.h +824 -0
  40. data/include/grpc/impl/propagation_bits.h +54 -0
  41. data/include/grpc/impl/slice_type.h +112 -0
  42. data/include/grpc/load_reporting.h +1 -1
  43. data/include/grpc/module.modulemap +5 -1
  44. data/include/grpc/slice.h +1 -1
  45. data/include/grpc/status.h +131 -1
  46. data/include/grpc/support/atm.h +70 -1
  47. data/include/grpc/support/atm_gcc_atomic.h +59 -1
  48. data/include/grpc/support/atm_gcc_sync.h +58 -1
  49. data/include/grpc/support/atm_windows.h +105 -1
  50. data/include/grpc/support/log.h +87 -1
  51. data/include/grpc/support/log_windows.h +1 -1
  52. data/include/grpc/support/port_platform.h +767 -1
  53. data/include/grpc/support/string_util.h +1 -1
  54. data/include/grpc/support/sync.h +35 -2
  55. data/include/grpc/support/sync_abseil.h +11 -1
  56. data/include/grpc/support/sync_custom.h +13 -1
  57. data/include/grpc/support/sync_generic.h +24 -1
  58. data/include/grpc/support/sync_posix.h +27 -1
  59. data/include/grpc/support/sync_windows.h +15 -1
  60. data/include/grpc/support/time.h +25 -2
  61. data/src/core/ext/filters/census/grpc_context.cc +17 -18
  62. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +28 -22
  63. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +2 -1
  64. data/src/core/ext/filters/channel_idle/idle_filter_state.h +1 -1
  65. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -0
  66. data/src/core/ext/filters/client_channel/backup_poller.cc +24 -24
  67. data/src/core/ext/filters/client_channel/backup_poller.h +21 -21
  68. data/src/core/ext/filters/client_channel/channel_connectivity.cc +51 -28
  69. data/src/core/ext/filters/client_channel/client_channel.cc +157 -168
  70. data/src/core/ext/filters/client_channel/client_channel.h +10 -10
  71. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +17 -19
  72. data/src/core/ext/filters/client_channel/client_channel_channelz.h +19 -19
  73. data/src/core/ext/filters/client_channel/client_channel_factory.cc +17 -17
  74. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +18 -18
  75. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  76. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
  77. data/src/core/ext/filters/client_channel/config_selector.h +16 -20
  78. data/src/core/ext/filters/client_channel/connector.h +1 -1
  79. data/src/core/ext/filters/client_channel/dynamic_filters.cc +28 -55
  80. data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
  81. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +18 -18
  82. data/src/core/ext/filters/client_channel/health/health_check_client.cc +4 -5
  83. data/src/core/ext/filters/client_channel/http_proxy.cc +39 -40
  84. data/src/core/ext/filters/client_channel/http_proxy.h +18 -18
  85. data/src/core/ext/filters/client_channel/lb_call_state_internal.h +39 -0
  86. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
  87. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +17 -17
  88. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +7 -2
  89. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -2
  90. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +59 -130
  91. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +37 -21
  92. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +131 -154
  93. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +24 -25
  94. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
  95. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +2 -4
  96. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +18 -20
  97. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +18 -19
  98. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +18 -19
  99. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +18 -19
  100. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +8 -9
  101. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
  102. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +212 -223
  103. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
  104. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +11 -22
  105. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +73 -101
  106. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +20 -21
  107. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +1 -1
  108. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +119 -106
  109. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +12 -12
  110. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +30 -16
  111. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +60 -56
  112. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +60 -64
  113. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  114. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
  115. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +22 -28
  116. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +62 -94
  117. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +70 -146
  118. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +651 -0
  119. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +60 -0
  120. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
  121. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +18 -18
  122. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -10
  123. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +26 -35
  124. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +40 -41
  125. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +22 -23
  126. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +82 -82
  127. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +117 -118
  128. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +51 -52
  129. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +18 -18
  130. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +18 -18
  131. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +18 -19
  132. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +3 -5
  133. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
  134. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
  135. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -27
  136. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +44 -34
  137. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -10
  138. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
  139. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +122 -119
  140. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +1 -1
  141. data/src/core/ext/filters/client_channel/retry_filter.cc +81 -103
  142. data/src/core/ext/filters/client_channel/retry_service_config.cc +193 -235
  143. data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
  144. data/src/core/ext/filters/client_channel/retry_throttle.cc +27 -29
  145. data/src/core/ext/filters/client_channel/retry_throttle.h +26 -25
  146. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +3 -3
  147. data/src/core/ext/filters/client_channel/subchannel.cc +158 -178
  148. data/src/core/ext/filters/client_channel/subchannel.h +17 -40
  149. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +18 -18
  150. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
  151. data/src/core/ext/filters/deadline/deadline_filter.cc +34 -17
  152. data/src/core/ext/filters/deadline/deadline_filter.h +1 -1
  153. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +3 -2
  154. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
  155. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  156. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
  157. data/src/core/ext/filters/http/client/http_client_filter.cc +36 -37
  158. data/src/core/ext/filters/http/client/http_client_filter.h +17 -17
  159. data/src/core/ext/filters/http/client_authority_filter.cc +19 -19
  160. data/src/core/ext/filters/http/client_authority_filter.h +18 -18
  161. data/src/core/ext/filters/http/http_filters_plugin.cc +35 -51
  162. data/src/core/ext/filters/http/message_compress/compression_filter.cc +315 -0
  163. data/src/core/ext/filters/http/message_compress/compression_filter.h +132 -0
  164. data/src/core/ext/filters/http/server/http_server_filter.cc +44 -43
  165. data/src/core/ext/filters/http/server/http_server_filter.h +18 -18
  166. data/src/core/ext/filters/message_size/message_size_filter.cc +92 -123
  167. data/src/core/ext/filters/message_size/message_size_filter.h +23 -16
  168. data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
  169. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
  170. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
  171. data/src/core/ext/filters/server_config_selector/server_config_selector.h +6 -8
  172. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +7 -9
  173. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +229 -0
  174. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +66 -0
  175. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +82 -0
  176. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +93 -0
  177. data/src/core/ext/transport/chttp2/alpn/alpn.cc +18 -18
  178. data/src/core/ext/transport/chttp2/alpn/alpn.h +22 -22
  179. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +69 -63
  180. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +28 -22
  181. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +81 -97
  182. data/src/core/ext/transport/chttp2/server/chttp2_server.h +18 -18
  183. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +22 -22
  184. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +30 -30
  185. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +29 -29
  186. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +27 -27
  187. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +273 -283
  188. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +18 -19
  189. data/src/core/ext/transport/chttp2/transport/context_list.cc +19 -19
  190. data/src/core/ext/transport/chttp2/transport/context_list.h +25 -25
  191. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +0 -36
  192. data/src/core/ext/transport/chttp2/transport/decode_huff.h +35 -82
  193. data/src/core/ext/transport/chttp2/transport/flow_control.cc +112 -44
  194. data/src/core/ext/transport/chttp2/transport/flow_control.h +60 -34
  195. data/src/core/ext/transport/chttp2/transport/frame.h +19 -19
  196. data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -32
  197. data/src/core/ext/transport/chttp2/transport/frame_data.h +23 -23
  198. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +36 -36
  199. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +18 -18
  200. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +25 -24
  201. data/src/core/ext/transport/chttp2/transport/frame_ping.h +19 -19
  202. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +28 -25
  203. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +18 -18
  204. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +34 -36
  205. data/src/core/ext/transport/chttp2/transport/frame_settings.h +20 -20
  206. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +22 -21
  207. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +18 -18
  208. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +133 -181
  209. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +40 -59
  210. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
  211. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +93 -143
  212. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +20 -20
  213. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +26 -26
  214. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +18 -18
  215. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +21 -19
  216. data/src/core/ext/transport/chttp2/transport/http2_settings.h +36 -34
  217. data/src/core/ext/transport/chttp2/transport/http_trace.cc +19 -0
  218. data/src/core/ext/transport/chttp2/transport/http_trace.h +24 -0
  219. data/src/core/ext/transport/chttp2/transport/huffsyms.cc +20 -20
  220. data/src/core/ext/transport/chttp2/transport/huffsyms.h +19 -19
  221. data/src/core/ext/transport/chttp2/transport/internal.h +193 -170
  222. data/src/core/ext/transport/chttp2/transport/parsing.cc +147 -80
  223. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +19 -19
  224. data/src/core/ext/transport/chttp2/transport/stream_map.cc +23 -23
  225. data/src/core/ext/transport/chttp2/transport/stream_map.h +31 -31
  226. data/src/core/ext/transport/chttp2/transport/varint.cc +19 -20
  227. data/src/core/ext/transport/chttp2/transport/varint.h +35 -32
  228. data/src/core/ext/transport/chttp2/transport/writing.cc +60 -56
  229. data/src/core/ext/transport/inproc/inproc_plugin.cc +17 -17
  230. data/src/core/ext/transport/inproc/inproc_transport.cc +122 -140
  231. data/src/core/ext/transport/inproc/inproc_transport.h +19 -19
  232. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c +62 -0
  233. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +179 -0
  234. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c +46 -0
  235. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h +98 -0
  236. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.c +47 -0
  237. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.h +107 -0
  238. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +3 -2
  239. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +9 -0
  240. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +0 -1
  241. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.c +46 -0
  242. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.h +98 -0
  243. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.c +62 -0
  244. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.h +174 -0
  245. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.c +36 -0
  246. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.h +74 -0
  247. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.c +65 -0
  248. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.h +191 -0
  249. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.c +127 -0
  250. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.h +474 -0
  251. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.c +67 -0
  252. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.h +214 -0
  253. data/src/core/ext/upb-generated/xds/type/v3/range.upb.c +64 -0
  254. data/src/core/ext/upb-generated/xds/type/v3/range.upb.h +208 -0
  255. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +0 -1
  256. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +60 -0
  257. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h +40 -0
  258. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c +50 -0
  259. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h +35 -0
  260. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.c +45 -0
  261. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.h +35 -0
  262. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.c +43 -0
  263. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.h +35 -0
  264. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.c +51 -0
  265. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.h +40 -0
  266. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.c +36 -0
  267. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.h +35 -0
  268. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.c +55 -0
  269. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.h +40 -0
  270. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +9 -9
  271. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.c +71 -0
  272. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.h +60 -0
  273. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.c +60 -0
  274. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.h +40 -0
  275. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.c +36 -0
  276. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.h +45 -0
  277. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +4 -7
  278. data/src/core/ext/xds/certificate_provider_store.cc +4 -4
  279. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
  280. data/src/core/ext/xds/xds_api.cc +20 -95
  281. data/src/core/ext/xds/xds_api.h +5 -8
  282. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  283. data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
  284. data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
  285. data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
  286. data/src/core/ext/xds/xds_certificate_provider.h +1 -1
  287. data/src/core/ext/xds/xds_channel_args.h +1 -1
  288. data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
  289. data/src/core/ext/xds/xds_channel_stack_modifier.h +2 -2
  290. data/src/core/ext/xds/xds_client.cc +134 -94
  291. data/src/core/ext/xds/xds_client.h +13 -5
  292. data/src/core/ext/xds/xds_client_grpc.cc +31 -24
  293. data/src/core/ext/xds/xds_client_grpc.h +1 -1
  294. data/src/core/ext/xds/xds_client_stats.cc +17 -17
  295. data/src/core/ext/xds/xds_client_stats.h +18 -18
  296. data/src/core/ext/xds/xds_cluster.cc +359 -203
  297. data/src/core/ext/xds/xds_cluster.h +52 -35
  298. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +54 -71
  299. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +45 -21
  300. data/src/core/ext/xds/xds_common_types.cc +209 -141
  301. data/src/core/ext/xds/xds_common_types.h +19 -13
  302. data/src/core/ext/xds/xds_endpoint.cc +221 -130
  303. data/src/core/ext/xds/xds_endpoint.h +4 -7
  304. data/src/core/ext/xds/xds_health_status.cc +80 -0
  305. data/src/core/ext/xds/xds_health_status.h +82 -0
  306. data/src/core/ext/xds/xds_http_fault_filter.cc +57 -43
  307. data/src/core/ext/xds/xds_http_fault_filter.h +14 -22
  308. data/src/core/ext/xds/xds_http_filters.cc +65 -73
  309. data/src/core/ext/xds/xds_http_filters.h +68 -20
  310. data/src/core/ext/xds/xds_http_rbac_filter.cc +153 -207
  311. data/src/core/ext/xds/xds_http_rbac_filter.h +13 -16
  312. data/src/core/ext/xds/xds_http_stateful_session_filter.cc +218 -0
  313. data/src/core/ext/xds/xds_http_stateful_session_filter.h +58 -0
  314. data/src/core/ext/xds/xds_lb_policy_registry.cc +120 -171
  315. data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
  316. data/src/core/ext/xds/xds_listener.cc +447 -419
  317. data/src/core/ext/xds/xds_listener.h +45 -47
  318. data/src/core/ext/xds/xds_resource_type.h +3 -11
  319. data/src/core/ext/xds/xds_resource_type_impl.h +10 -13
  320. data/src/core/ext/xds/xds_route_config.cc +514 -528
  321. data/src/core/ext/xds/xds_route_config.h +39 -28
  322. data/src/core/ext/xds/xds_routing.cc +2 -1
  323. data/src/core/ext/xds/xds_routing.h +2 -0
  324. data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -106
  325. data/src/core/ext/xds/xds_transport_grpc.cc +6 -7
  326. data/src/core/ext/xds/xds_transport_grpc.h +1 -1
  327. data/src/core/lib/address_utils/parse_address.cc +30 -29
  328. data/src/core/lib/address_utils/parse_address.h +32 -32
  329. data/src/core/lib/address_utils/sockaddr_utils.cc +29 -28
  330. data/src/core/lib/address_utils/sockaddr_utils.h +33 -33
  331. data/src/core/lib/avl/avl.h +4 -4
  332. data/src/core/lib/backoff/backoff.cc +17 -17
  333. data/src/core/lib/backoff/backoff.h +18 -18
  334. data/src/core/lib/channel/call_tracer.h +10 -1
  335. data/src/core/lib/channel/channel_args.cc +19 -20
  336. data/src/core/lib/channel/channel_args.h +59 -43
  337. data/src/core/lib/channel/channel_args_preconditioning.h +1 -1
  338. data/src/core/lib/channel/channel_stack.cc +62 -58
  339. data/src/core/lib/channel/channel_stack.h +144 -131
  340. data/src/core/lib/channel/channel_stack_builder.cc +21 -24
  341. data/src/core/lib/channel/channel_stack_builder.h +14 -6
  342. data/src/core/lib/channel/channel_stack_builder_impl.cc +43 -25
  343. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
  344. data/src/core/lib/channel/channel_trace.cc +21 -22
  345. data/src/core/lib/channel/channel_trace.h +19 -19
  346. data/src/core/lib/channel/channelz.cc +18 -19
  347. data/src/core/lib/channel/channelz.h +26 -26
  348. data/src/core/lib/channel/channelz_registry.cc +17 -17
  349. data/src/core/lib/channel/channelz_registry.h +18 -18
  350. data/src/core/lib/channel/connected_channel.cc +732 -63
  351. data/src/core/lib/channel/connected_channel.h +18 -22
  352. data/src/core/lib/channel/context.h +18 -18
  353. data/src/core/lib/channel/promise_based_filter.cc +1137 -150
  354. data/src/core/lib/channel/promise_based_filter.h +374 -88
  355. data/src/core/lib/channel/status_util.cc +35 -17
  356. data/src/core/lib/channel/status_util.h +26 -19
  357. data/src/core/lib/compression/compression.cc +19 -19
  358. data/src/core/lib/compression/compression_internal.cc +41 -48
  359. data/src/core/lib/compression/compression_internal.h +22 -22
  360. data/src/core/lib/compression/message_compress.cc +26 -26
  361. data/src/core/lib/compression/message_compress.h +25 -25
  362. data/src/core/lib/config/core_configuration.h +1 -1
  363. data/src/core/lib/debug/event_log.cc +88 -0
  364. data/src/core/lib/debug/event_log.h +81 -0
  365. data/src/core/lib/debug/histogram_view.cc +69 -0
  366. data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
  367. data/src/core/lib/debug/stats.cc +39 -136
  368. data/src/core/lib/debug/stats.h +46 -52
  369. data/src/core/lib/debug/stats_data.cc +224 -73
  370. data/src/core/lib/debug/stats_data.h +263 -122
  371. data/src/core/lib/debug/trace.cc +18 -18
  372. data/src/core/lib/debug/trace.h +19 -19
  373. data/src/core/lib/event_engine/common_closures.h +71 -0
  374. data/src/core/lib/event_engine/default_event_engine.cc +38 -15
  375. data/src/core/lib/event_engine/default_event_engine.h +15 -3
  376. data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
  377. data/src/core/lib/event_engine/executor/executor.h +1 -1
  378. data/src/core/lib/event_engine/forkable.h +1 -1
  379. data/src/core/lib/event_engine/memory_allocator.cc +1 -1
  380. data/src/core/lib/event_engine/poller.h +10 -4
  381. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +614 -0
  382. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
  383. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +900 -0
  384. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  385. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  386. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  387. data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +11 -14
  388. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  389. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  390. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +265 -0
  391. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  392. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1308 -0
  393. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +684 -0
  394. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +456 -28
  395. data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
  396. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  397. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +236 -0
  398. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +228 -0
  399. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +380 -0
  400. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +91 -0
  401. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +853 -0
  402. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +316 -0
  403. data/src/core/lib/event_engine/posix_engine/timer.cc +49 -49
  404. data/src/core/lib/event_engine/posix_engine/timer.h +87 -86
  405. data/src/core/lib/event_engine/posix_engine/timer_heap.cc +27 -27
  406. data/src/core/lib/event_engine/posix_engine/timer_heap.h +21 -21
  407. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +76 -214
  408. data/src/core/lib/event_engine/posix_engine/timer_manager.h +41 -69
  409. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +332 -0
  410. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +185 -0
  411. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +127 -0
  412. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  413. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +150 -0
  414. data/src/core/lib/event_engine/{executor/threaded_executor.h → posix_engine/wakeup_fd_pipe.h} +16 -15
  415. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  416. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  417. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  418. data/src/core/lib/event_engine/slice.cc +7 -6
  419. data/src/core/lib/event_engine/slice_buffer.cc +2 -2
  420. data/src/core/lib/event_engine/socket_notifier.h +1 -1
  421. data/src/core/lib/event_engine/tcp_socket_utils.cc +373 -0
  422. data/src/core/lib/event_engine/tcp_socket_utils.h +85 -0
  423. data/src/core/lib/event_engine/thread_pool.cc +125 -43
  424. data/src/core/lib/event_engine/thread_pool.h +49 -26
  425. data/src/core/lib/event_engine/time_util.h +1 -1
  426. data/src/core/lib/event_engine/windows/iocp.cc +13 -12
  427. data/src/core/lib/event_engine/windows/iocp.h +1 -1
  428. data/src/core/lib/event_engine/windows/win_socket.cc +9 -9
  429. data/src/core/lib/event_engine/windows/windows_engine.cc +26 -20
  430. data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
  431. data/src/core/lib/experiments/config.cc +1 -1
  432. data/src/core/lib/experiments/experiments.cc +13 -13
  433. data/src/core/lib/experiments/experiments.h +8 -6
  434. data/src/core/lib/gpr/alloc.cc +19 -17
  435. data/src/core/lib/gpr/alloc.h +18 -18
  436. data/src/core/lib/gpr/atm.cc +17 -17
  437. data/src/core/lib/gpr/cpu_iphone.cc +24 -24
  438. data/src/core/lib/gpr/cpu_linux.cc +28 -23
  439. data/src/core/lib/gpr/cpu_posix.cc +23 -22
  440. data/src/core/lib/gpr/cpu_windows.cc +20 -18
  441. data/src/core/lib/gpr/log.cc +27 -19
  442. data/src/core/lib/gpr/log_android.cc +22 -20
  443. data/src/core/lib/gpr/log_linux.cc +24 -24
  444. data/src/core/lib/gpr/log_posix.cc +20 -19
  445. data/src/core/lib/gpr/log_windows.cc +25 -24
  446. data/src/core/lib/gpr/spinlock.h +18 -18
  447. data/src/core/lib/gpr/string.cc +25 -24
  448. data/src/core/lib/gpr/string.h +58 -58
  449. data/src/core/lib/gpr/string_posix.cc +24 -24
  450. data/src/core/lib/gpr/string_util_windows.cc +22 -22
  451. data/src/core/lib/gpr/string_windows.cc +24 -24
  452. data/src/core/lib/gpr/sync.cc +25 -25
  453. data/src/core/lib/gpr/sync_abseil.cc +22 -20
  454. data/src/core/lib/gpr/sync_posix.cc +23 -21
  455. data/src/core/lib/gpr/sync_windows.cc +29 -27
  456. data/src/core/lib/gpr/time.cc +23 -21
  457. data/src/core/lib/gpr/time_posix.cc +35 -30
  458. data/src/core/lib/gpr/time_precise.cc +22 -22
  459. data/src/core/lib/gpr/time_precise.h +18 -19
  460. data/src/core/lib/gpr/time_windows.cc +25 -22
  461. data/src/core/lib/gpr/tmpfile.h +22 -22
  462. data/src/core/lib/gpr/tmpfile_msys.cc +21 -20
  463. data/src/core/lib/gpr/tmpfile_posix.cc +22 -20
  464. data/src/core/lib/gpr/tmpfile_windows.cc +23 -22
  465. data/src/core/lib/gpr/useful.h +40 -27
  466. data/src/core/lib/gpr/wrap_memcpy.cc +23 -23
  467. data/src/core/lib/gprpp/atomic_utils.h +18 -18
  468. data/src/core/lib/gprpp/bitset.h +24 -0
  469. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/crash.cc} +12 -12
  470. data/src/core/lib/gprpp/crash.h +34 -0
  471. data/src/core/lib/gprpp/debug_location.h +18 -18
  472. data/src/core/lib/gprpp/dual_ref_counted.h +1 -1
  473. data/src/core/lib/gprpp/env.h +20 -20
  474. data/src/core/lib/gprpp/env_linux.cc +21 -21
  475. data/src/core/lib/gprpp/env_posix.cc +18 -18
  476. data/src/core/lib/gprpp/env_windows.cc +18 -18
  477. data/src/core/lib/gprpp/examine_stack.cc +17 -17
  478. data/src/core/lib/gprpp/examine_stack.h +18 -18
  479. data/src/core/lib/gprpp/fork.cc +21 -22
  480. data/src/core/lib/gprpp/fork.h +22 -22
  481. data/src/core/lib/gprpp/global_config.h +18 -18
  482. data/src/core/lib/gprpp/global_config_custom.h +18 -18
  483. data/src/core/lib/gprpp/global_config_env.cc +17 -17
  484. data/src/core/lib/gprpp/global_config_env.h +23 -23
  485. data/src/core/lib/gprpp/global_config_generic.h +18 -18
  486. data/src/core/lib/gprpp/host_port.cc +26 -26
  487. data/src/core/lib/gprpp/host_port.h +29 -28
  488. data/src/core/lib/gprpp/load_file.cc +75 -0
  489. data/src/core/lib/gprpp/load_file.h +33 -0
  490. data/src/core/lib/gprpp/manual_constructor.h +18 -17
  491. data/src/core/lib/gprpp/memory.h +18 -18
  492. data/src/core/lib/gprpp/mpscq.cc +17 -17
  493. data/src/core/lib/gprpp/mpscq.h +18 -18
  494. data/src/core/lib/gprpp/no_destruct.h +1 -0
  495. data/src/core/lib/gprpp/orphanable.h +18 -18
  496. data/src/core/lib/gprpp/per_cpu.h +46 -0
  497. data/src/core/lib/gprpp/ref_counted.h +18 -18
  498. data/src/core/lib/gprpp/ref_counted_ptr.h +19 -18
  499. data/src/core/lib/gprpp/stat_posix.cc +5 -4
  500. data/src/core/lib/gprpp/stat_windows.cc +4 -2
  501. data/src/core/lib/gprpp/status_helper.cc +4 -3
  502. data/src/core/lib/gprpp/status_helper.h +1 -3
  503. data/src/core/lib/gprpp/strerror.cc +41 -0
  504. data/src/core/lib/gprpp/strerror.h +29 -0
  505. data/src/core/lib/gprpp/sync.h +20 -20
  506. data/src/core/lib/gprpp/table.h +1 -0
  507. data/src/core/lib/gprpp/thd.h +19 -19
  508. data/src/core/lib/gprpp/thd_posix.cc +30 -31
  509. data/src/core/lib/gprpp/thd_windows.cc +26 -26
  510. data/src/core/lib/gprpp/time.cc +16 -11
  511. data/src/core/lib/gprpp/time.h +13 -3
  512. data/src/core/lib/gprpp/time_averaged_stats.cc +20 -20
  513. data/src/core/lib/gprpp/time_averaged_stats.h +48 -48
  514. data/src/core/lib/gprpp/time_util.h +1 -1
  515. data/src/core/lib/gprpp/unique_type_name.h +18 -18
  516. data/src/core/lib/gprpp/validation_errors.h +18 -1
  517. data/src/core/lib/handshaker/proxy_mapper.h +18 -18
  518. data/src/core/lib/handshaker/proxy_mapper_registry.cc +17 -17
  519. data/src/core/lib/handshaker/proxy_mapper_registry.h +18 -18
  520. data/src/core/lib/http/format_request.cc +18 -18
  521. data/src/core/lib/http/format_request.h +18 -18
  522. data/src/core/lib/http/httpcli.cc +57 -61
  523. data/src/core/lib/http/httpcli.h +26 -26
  524. data/src/core/lib/http/httpcli_security_connector.cc +22 -25
  525. data/src/core/lib/http/parser.cc +76 -87
  526. data/src/core/lib/http/parser.h +32 -32
  527. data/src/core/lib/iomgr/block_annotate.h +21 -21
  528. data/src/core/lib/iomgr/buffer_list.cc +156 -136
  529. data/src/core/lib/iomgr/buffer_list.h +120 -98
  530. data/src/core/lib/iomgr/call_combiner.cc +29 -27
  531. data/src/core/lib/iomgr/call_combiner.h +21 -22
  532. data/src/core/lib/iomgr/cfstream_handle.cc +33 -36
  533. data/src/core/lib/iomgr/cfstream_handle.h +22 -22
  534. data/src/core/lib/iomgr/closure.h +90 -45
  535. data/src/core/lib/iomgr/combiner.cc +20 -19
  536. data/src/core/lib/iomgr/combiner.h +18 -18
  537. data/src/core/lib/iomgr/dualstack_socket_posix.cc +21 -21
  538. data/src/core/lib/iomgr/dynamic_annotations.h +20 -20
  539. data/src/core/lib/iomgr/endpoint.cc +17 -17
  540. data/src/core/lib/iomgr/endpoint.h +46 -46
  541. data/src/core/lib/iomgr/endpoint_cfstream.cc +44 -43
  542. data/src/core/lib/iomgr/endpoint_cfstream.h +27 -27
  543. data/src/core/lib/iomgr/endpoint_pair.h +18 -18
  544. data/src/core/lib/iomgr/endpoint_pair_posix.cc +20 -19
  545. data/src/core/lib/iomgr/endpoint_pair_windows.cc +18 -17
  546. data/src/core/lib/iomgr/error.cc +49 -61
  547. data/src/core/lib/iomgr/error.h +42 -173
  548. data/src/core/lib/iomgr/error_cfstream.cc +18 -18
  549. data/src/core/lib/iomgr/error_cfstream.h +19 -19
  550. data/src/core/lib/iomgr/ev_apple.cc +21 -21
  551. data/src/core/lib/iomgr/ev_apple.h +17 -17
  552. data/src/core/lib/iomgr/ev_epoll1_linux.cc +208 -195
  553. data/src/core/lib/iomgr/ev_epoll1_linux.h +18 -18
  554. data/src/core/lib/iomgr/ev_poll_posix.cc +212 -205
  555. data/src/core/lib/iomgr/ev_poll_posix.h +18 -18
  556. data/src/core/lib/iomgr/ev_posix.cc +36 -28
  557. data/src/core/lib/iomgr/ev_posix.h +85 -81
  558. data/src/core/lib/iomgr/ev_windows.cc +18 -18
  559. data/src/core/lib/iomgr/exec_ctx.cc +34 -34
  560. data/src/core/lib/iomgr/exec_ctx.h +141 -141
  561. data/src/core/lib/iomgr/executor.cc +21 -21
  562. data/src/core/lib/iomgr/executor.h +24 -24
  563. data/src/core/lib/iomgr/fork_posix.cc +24 -22
  564. data/src/core/lib/iomgr/fork_windows.cc +21 -21
  565. data/src/core/lib/iomgr/gethostname.h +18 -18
  566. data/src/core/lib/iomgr/gethostname_fallback.cc +17 -17
  567. data/src/core/lib/iomgr/gethostname_host_name_max.cc +17 -17
  568. data/src/core/lib/iomgr/gethostname_sysconf.cc +17 -17
  569. data/src/core/lib/iomgr/grpc_if_nametoindex.h +20 -20
  570. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +20 -19
  571. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +20 -19
  572. data/src/core/lib/iomgr/internal_errqueue.cc +4 -2
  573. data/src/core/lib/iomgr/internal_errqueue.h +80 -80
  574. data/src/core/lib/iomgr/iocp_windows.cc +22 -21
  575. data/src/core/lib/iomgr/iocp_windows.h +18 -18
  576. data/src/core/lib/iomgr/iomgr.cc +19 -18
  577. data/src/core/lib/iomgr/iomgr.h +32 -32
  578. data/src/core/lib/iomgr/iomgr_internal.cc +17 -17
  579. data/src/core/lib/iomgr/iomgr_internal.h +25 -25
  580. data/src/core/lib/iomgr/iomgr_posix.cc +20 -20
  581. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +20 -19
  582. data/src/core/lib/iomgr/iomgr_windows.cc +24 -22
  583. data/src/core/lib/iomgr/load_file.cc +24 -27
  584. data/src/core/lib/iomgr/load_file.h +20 -20
  585. data/src/core/lib/iomgr/lockfree_event.cc +114 -114
  586. data/src/core/lib/iomgr/lockfree_event.h +19 -19
  587. data/src/core/lib/iomgr/nameser.h +84 -84
  588. data/src/core/lib/iomgr/polling_entity.cc +25 -21
  589. data/src/core/lib/iomgr/polling_entity.h +27 -27
  590. data/src/core/lib/iomgr/pollset.cc +17 -17
  591. data/src/core/lib/iomgr/pollset.h +51 -51
  592. data/src/core/lib/iomgr/pollset_set.cc +17 -17
  593. data/src/core/lib/iomgr/pollset_set.h +22 -22
  594. data/src/core/lib/iomgr/pollset_set_windows.cc +18 -18
  595. data/src/core/lib/iomgr/pollset_set_windows.h +18 -18
  596. data/src/core/lib/iomgr/pollset_windows.cc +30 -29
  597. data/src/core/lib/iomgr/pollset_windows.h +22 -22
  598. data/src/core/lib/iomgr/port.h +29 -29
  599. data/src/core/lib/iomgr/python_util.h +20 -20
  600. data/src/core/lib/iomgr/resolve_address.cc +26 -20
  601. data/src/core/lib/iomgr/resolve_address.h +21 -22
  602. data/src/core/lib/iomgr/resolve_address_impl.h +2 -2
  603. data/src/core/lib/iomgr/resolve_address_posix.cc +35 -45
  604. data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
  605. data/src/core/lib/iomgr/resolve_address_windows.cc +18 -20
  606. data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
  607. data/src/core/lib/iomgr/resolved_address.h +1 -1
  608. data/src/core/lib/iomgr/sockaddr.h +21 -21
  609. data/src/core/lib/iomgr/sockaddr_posix.h +18 -18
  610. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +18 -17
  611. data/src/core/lib/iomgr/sockaddr_windows.h +18 -18
  612. data/src/core/lib/iomgr/socket_factory_posix.cc +18 -18
  613. data/src/core/lib/iomgr/socket_factory_posix.h +30 -30
  614. data/src/core/lib/iomgr/socket_mutator.cc +19 -18
  615. data/src/core/lib/iomgr/socket_mutator.h +37 -37
  616. data/src/core/lib/iomgr/socket_utils.h +24 -24
  617. data/src/core/lib/iomgr/socket_utils_common_posix.cc +68 -66
  618. data/src/core/lib/iomgr/socket_utils_linux.cc +18 -17
  619. data/src/core/lib/iomgr/socket_utils_posix.cc +22 -20
  620. data/src/core/lib/iomgr/socket_utils_posix.h +78 -78
  621. data/src/core/lib/iomgr/socket_utils_windows.cc +20 -19
  622. data/src/core/lib/iomgr/socket_windows.cc +37 -36
  623. data/src/core/lib/iomgr/socket_windows.h +56 -56
  624. data/src/core/lib/iomgr/systemd_utils.cc +116 -0
  625. data/src/core/lib/{slice/slice_buffer_api.cc → iomgr/systemd_utils.h} +12 -14
  626. data/src/core/lib/iomgr/tcp_client.cc +17 -17
  627. data/src/core/lib/iomgr/tcp_client.h +26 -26
  628. data/src/core/lib/iomgr/tcp_client_cfstream.cc +25 -28
  629. data/src/core/lib/iomgr/tcp_client_posix.cc +70 -73
  630. data/src/core/lib/iomgr/tcp_client_posix.h +43 -43
  631. data/src/core/lib/iomgr/tcp_client_windows.cc +36 -39
  632. data/src/core/lib/iomgr/tcp_posix.cc +223 -237
  633. data/src/core/lib/iomgr/tcp_posix.h +27 -27
  634. data/src/core/lib/iomgr/tcp_server.cc +30 -22
  635. data/src/core/lib/iomgr/tcp_server.h +68 -62
  636. data/src/core/lib/iomgr/tcp_server_posix.cc +124 -94
  637. data/src/core/lib/iomgr/tcp_server_utils_posix.h +54 -51
  638. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +90 -55
  639. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +40 -40
  640. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +19 -19
  641. data/src/core/lib/iomgr/tcp_server_windows.cc +97 -104
  642. data/src/core/lib/iomgr/tcp_windows.cc +109 -93
  643. data/src/core/lib/iomgr/tcp_windows.h +29 -29
  644. data/src/core/lib/iomgr/timer.cc +17 -17
  645. data/src/core/lib/iomgr/timer.h +65 -65
  646. data/src/core/lib/iomgr/timer_generic.cc +115 -122
  647. data/src/core/lib/iomgr/timer_generic.h +19 -19
  648. data/src/core/lib/iomgr/timer_heap.cc +25 -25
  649. data/src/core/lib/iomgr/timer_heap.h +19 -19
  650. data/src/core/lib/iomgr/timer_manager.cc +30 -29
  651. data/src/core/lib/iomgr/timer_manager.h +25 -25
  652. data/src/core/lib/iomgr/unix_sockets_posix.cc +20 -21
  653. data/src/core/lib/iomgr/unix_sockets_posix.h +18 -18
  654. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +19 -17
  655. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +23 -21
  656. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +23 -23
  657. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +29 -26
  658. data/src/core/lib/iomgr/wakeup_fd_pipe.h +18 -18
  659. data/src/core/lib/iomgr/wakeup_fd_posix.cc +18 -18
  660. data/src/core/lib/iomgr/wakeup_fd_posix.h +50 -50
  661. data/src/core/lib/json/json_channel_args.h +42 -0
  662. data/src/core/lib/json/json_object_loader.cc +17 -2
  663. data/src/core/lib/json/json_object_loader.h +37 -1
  664. data/src/core/lib/json/json_reader.cc +28 -28
  665. data/src/core/lib/json/json_util.cc +5 -5
  666. data/src/core/lib/json/json_util.h +4 -4
  667. data/src/core/lib/json/json_writer.cc +56 -56
  668. data/src/core/lib/load_balancing/lb_policy.cc +18 -18
  669. data/src/core/lib/load_balancing/lb_policy.h +7 -4
  670. data/src/core/lib/load_balancing/subchannel_interface.h +1 -8
  671. data/src/core/lib/matchers/matchers.cc +6 -5
  672. data/src/core/lib/matchers/matchers.h +1 -1
  673. data/src/core/lib/promise/activity.cc +16 -2
  674. data/src/core/lib/promise/activity.h +58 -27
  675. data/src/core/lib/promise/arena_promise.h +82 -52
  676. data/src/core/lib/promise/context.h +14 -6
  677. data/src/core/lib/promise/detail/basic_seq.h +9 -28
  678. data/src/core/lib/promise/detail/promise_factory.h +59 -10
  679. data/src/core/lib/promise/detail/status.h +28 -0
  680. data/src/core/lib/promise/detail/switch.h +1455 -0
  681. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +20 -12
  682. data/src/core/lib/promise/for_each.h +155 -0
  683. data/src/core/lib/promise/latch.h +13 -19
  684. data/src/core/lib/promise/loop.h +7 -5
  685. data/src/core/lib/promise/map.h +1 -0
  686. data/src/core/lib/promise/map_pipe.h +88 -0
  687. data/src/core/lib/promise/pipe.cc +19 -0
  688. data/src/core/lib/promise/pipe.h +505 -0
  689. data/src/core/lib/promise/poll.h +19 -0
  690. data/src/core/lib/promise/seq.h +4 -5
  691. data/src/core/lib/promise/sleep.cc +5 -4
  692. data/src/core/lib/promise/sleep.h +1 -2
  693. data/src/core/lib/promise/try_concurrently.h +342 -0
  694. data/src/core/lib/promise/try_seq.h +11 -13
  695. data/src/core/lib/resolver/resolver.cc +17 -17
  696. data/src/core/lib/resolver/server_address.cc +18 -17
  697. data/src/core/lib/resolver/server_address.h +19 -21
  698. data/src/core/lib/resource_quota/api.cc +0 -1
  699. data/src/core/lib/resource_quota/api.h +1 -1
  700. data/src/core/lib/resource_quota/arena.cc +36 -17
  701. data/src/core/lib/resource_quota/arena.h +107 -18
  702. data/src/core/lib/resource_quota/memory_quota.cc +140 -43
  703. data/src/core/lib/resource_quota/memory_quota.h +85 -23
  704. data/src/core/lib/resource_quota/resource_quota.h +1 -1
  705. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  706. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +0 -1
  707. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
  708. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
  709. data/src/core/lib/security/authorization/matchers.cc +25 -22
  710. data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
  711. data/src/core/lib/security/authorization/rbac_policy.h +1 -1
  712. data/src/core/lib/security/context/security_context.cc +22 -23
  713. data/src/core/lib/security/context/security_context.h +40 -30
  714. data/src/core/lib/security/credentials/alts/alts_credentials.cc +17 -17
  715. data/src/core/lib/security/credentials/alts/alts_credentials.h +50 -50
  716. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +19 -19
  717. data/src/core/lib/security/credentials/alts/check_gcp_environment.h +41 -41
  718. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +17 -17
  719. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +18 -17
  720. data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +18 -17
  721. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +19 -19
  722. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +18 -18
  723. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +36 -37
  724. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +18 -18
  725. data/src/core/lib/security/credentials/call_creds_util.h +1 -1
  726. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
  727. data/src/core/lib/security/credentials/composite/composite_credentials.cc +22 -22
  728. data/src/core/lib/security/credentials/composite/composite_credentials.h +20 -21
  729. data/src/core/lib/security/credentials/credentials.cc +19 -18
  730. data/src/core/lib/security/credentials/credentials.h +34 -33
  731. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
  732. data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
  733. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
  734. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
  735. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
  736. data/src/core/lib/security/credentials/fake/fake_credentials.cc +20 -19
  737. data/src/core/lib/security/credentials/fake/fake_credentials.h +34 -35
  738. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +17 -17
  739. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +75 -73
  740. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +18 -19
  741. data/src/core/lib/security/credentials/iam/iam_credentials.cc +18 -17
  742. data/src/core/lib/security/credentials/iam/iam_credentials.h +18 -18
  743. data/src/core/lib/security/credentials/jwt/json_token.cc +24 -25
  744. data/src/core/lib/security/credentials/jwt/json_token.h +32 -32
  745. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +18 -18
  746. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +18 -19
  747. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +75 -75
  748. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +43 -43
  749. data/src/core/lib/security/credentials/local/local_credentials.cc +17 -17
  750. data/src/core/lib/security/credentials/local/local_credentials.h +20 -20
  751. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +52 -59
  752. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +19 -19
  753. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +24 -23
  754. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +22 -22
  755. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +19 -20
  756. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +18 -18
  757. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +20 -28
  758. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
  759. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +30 -43
  760. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
  761. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +18 -18
  762. data/src/core/lib/security/credentials/tls/tls_credentials.cc +18 -19
  763. data/src/core/lib/security/credentials/tls/tls_credentials.h +18 -18
  764. data/src/core/lib/security/credentials/xds/xds_credentials.cc +1 -2
  765. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  766. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +32 -38
  767. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +41 -42
  768. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +32 -41
  769. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +20 -21
  770. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  771. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +3 -8
  772. data/src/core/lib/security/security_connector/load_system_roots.h +18 -18
  773. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +18 -18
  774. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +19 -22
  775. data/src/core/lib/security/security_connector/load_system_roots_supported.h +19 -20
  776. data/src/core/lib/security/security_connector/local/local_security_connector.cc +30 -34
  777. data/src/core/lib/security/security_connector/local/local_security_connector.h +40 -41
  778. data/src/core/lib/security/security_connector/security_connector.cc +17 -17
  779. data/src/core/lib/security/security_connector/security_connector.h +32 -33
  780. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +34 -39
  781. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +38 -39
  782. data/src/core/lib/security/security_connector/ssl_utils.cc +37 -39
  783. data/src/core/lib/security/security_connector/ssl_utils.h +31 -31
  784. data/src/core/lib/security/security_connector/ssl_utils_config.cc +22 -22
  785. data/src/core/lib/security/security_connector/ssl_utils_config.h +18 -19
  786. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +42 -48
  787. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +17 -17
  788. data/src/core/lib/security/transport/auth_filters.h +18 -18
  789. data/src/core/lib/security/transport/client_auth_filter.cc +21 -21
  790. data/src/core/lib/security/transport/secure_endpoint.cc +54 -56
  791. data/src/core/lib/security/transport/secure_endpoint.h +22 -22
  792. data/src/core/lib/security/transport/security_handshaker.cc +70 -70
  793. data/src/core/lib/security/transport/security_handshaker.h +19 -19
  794. data/src/core/lib/security/transport/server_auth_filter.cc +43 -44
  795. data/src/core/lib/security/transport/tsi_error.cc +23 -20
  796. data/src/core/lib/security/transport/tsi_error.h +18 -18
  797. data/src/core/lib/security/util/json_util.cc +21 -22
  798. data/src/core/lib/security/util/json_util.h +18 -18
  799. data/src/core/lib/service_config/service_config.h +2 -2
  800. data/src/core/lib/service_config/service_config_call_data.h +7 -1
  801. data/src/core/lib/service_config/service_config_impl.cc +111 -158
  802. data/src/core/lib/service_config/service_config_impl.h +14 -17
  803. data/src/core/lib/service_config/service_config_parser.cc +14 -31
  804. data/src/core/lib/service_config/service_config_parser.h +14 -10
  805. data/src/core/lib/slice/b64.cc +26 -26
  806. data/src/core/lib/slice/b64.h +29 -29
  807. data/src/core/lib/slice/percent_encoding.cc +17 -17
  808. data/src/core/lib/slice/percent_encoding.h +24 -24
  809. data/src/core/lib/slice/slice.cc +44 -38
  810. data/src/core/lib/slice/slice.h +57 -11
  811. data/src/core/lib/slice/slice_buffer.cc +63 -59
  812. data/src/core/lib/slice/slice_buffer.h +27 -2
  813. data/src/core/lib/slice/slice_internal.h +31 -39
  814. data/src/core/lib/slice/slice_refcount.h +34 -19
  815. data/src/core/lib/slice/slice_string_helpers.cc +17 -17
  816. data/src/core/lib/slice/slice_string_helpers.h +19 -19
  817. data/src/core/lib/surface/api_trace.cc +17 -17
  818. data/src/core/lib/surface/api_trace.h +22 -22
  819. data/src/core/lib/surface/byte_buffer.cc +22 -23
  820. data/src/core/lib/surface/byte_buffer_reader.cc +23 -23
  821. data/src/core/lib/surface/call.cc +1521 -335
  822. data/src/core/lib/surface/call.h +86 -39
  823. data/src/core/lib/surface/call_details.cc +20 -21
  824. data/src/core/lib/surface/call_log_batch.cc +18 -18
  825. data/src/core/lib/surface/call_test_only.h +30 -30
  826. data/src/core/lib/surface/call_trace.cc +113 -0
  827. data/src/core/{ext/filters/http/message_compress/message_decompress_filter.h → lib/surface/call_trace.h} +10 -12
  828. data/src/core/lib/surface/channel.cc +62 -67
  829. data/src/core/lib/surface/channel.h +40 -32
  830. data/src/core/lib/surface/channel_init.cc +17 -17
  831. data/src/core/lib/surface/channel_init.h +18 -18
  832. data/src/core/lib/surface/channel_ping.cc +19 -19
  833. data/src/core/lib/surface/channel_stack_type.cc +21 -17
  834. data/src/core/lib/surface/channel_stack_type.h +20 -18
  835. data/src/core/lib/surface/completion_queue.cc +173 -191
  836. data/src/core/lib/surface/completion_queue.h +32 -32
  837. data/src/core/lib/surface/completion_queue_factory.cc +28 -28
  838. data/src/core/lib/surface/completion_queue_factory.h +20 -20
  839. data/src/core/lib/surface/event_string.cc +17 -17
  840. data/src/core/lib/surface/event_string.h +20 -20
  841. data/src/core/lib/surface/init.cc +29 -58
  842. data/src/core/lib/surface/init.h +18 -18
  843. data/src/core/lib/surface/init_internally.cc +1 -0
  844. data/src/core/lib/surface/init_internally.h +9 -0
  845. data/src/core/lib/surface/lame_client.cc +28 -26
  846. data/src/core/lib/surface/lame_client.h +19 -19
  847. data/src/core/lib/surface/metadata_array.cc +17 -18
  848. data/src/core/lib/surface/server.cc +61 -83
  849. data/src/core/lib/surface/server.h +5 -7
  850. data/src/core/lib/surface/validate_metadata.cc +28 -29
  851. data/src/core/lib/surface/validate_metadata.h +18 -18
  852. data/src/core/lib/surface/version.cc +21 -21
  853. data/src/core/lib/transport/bdp_estimator.cc +17 -17
  854. data/src/core/lib/transport/bdp_estimator.h +18 -19
  855. data/src/core/lib/transport/connectivity_state.cc +19 -19
  856. data/src/core/lib/transport/connectivity_state.h +19 -19
  857. data/src/core/lib/transport/error_utils.cc +51 -45
  858. data/src/core/lib/transport/error_utils.h +21 -21
  859. data/src/core/lib/transport/handshaker.cc +49 -46
  860. data/src/core/lib/transport/handshaker.h +43 -38
  861. data/src/core/lib/transport/handshaker_factory.h +44 -18
  862. data/src/core/lib/transport/handshaker_registry.cc +25 -19
  863. data/src/core/lib/transport/handshaker_registry.h +21 -22
  864. data/src/core/lib/transport/http2_errors.h +20 -20
  865. data/src/core/lib/transport/http_connect_handshaker.cc +40 -41
  866. data/src/core/lib/transport/http_connect_handshaker.h +18 -18
  867. data/src/core/lib/transport/metadata_batch.cc +4 -1
  868. data/src/core/lib/transport/metadata_batch.h +46 -20
  869. data/src/core/lib/transport/parsed_metadata.cc +2 -6
  870. data/src/core/lib/transport/parsed_metadata.h +1 -0
  871. data/src/core/lib/transport/pid_controller.cc +20 -20
  872. data/src/core/lib/transport/pid_controller.h +24 -24
  873. data/src/core/lib/transport/status_conversion.cc +22 -22
  874. data/src/core/lib/transport/status_conversion.h +20 -20
  875. data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
  876. data/src/core/lib/transport/tcp_connect_handshaker.h +1 -1
  877. data/src/core/lib/transport/timeout_encoding.cc +22 -22
  878. data/src/core/lib/transport/timeout_encoding.h +18 -18
  879. data/src/core/lib/transport/transport.cc +88 -41
  880. data/src/core/lib/transport/transport.h +193 -195
  881. data/src/core/lib/transport/transport_impl.h +42 -42
  882. data/src/core/lib/transport/transport_op_string.cc +26 -25
  883. data/src/core/plugin_registry/grpc_plugin_registry.cc +25 -27
  884. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +7 -14
  885. data/src/core/tsi/alts/crypt/aes_gcm.cc +20 -20
  886. data/src/core/tsi/alts/crypt/gsec.cc +26 -26
  887. data/src/core/tsi/alts/crypt/gsec.h +334 -334
  888. data/src/core/tsi/alts/frame_protector/alts_counter.cc +23 -23
  889. data/src/core/tsi/alts/frame_protector/alts_counter.h +66 -66
  890. data/src/core/tsi/alts/frame_protector/alts_crypter.cc +19 -19
  891. data/src/core/tsi/alts/frame_protector/alts_crypter.h +206 -206
  892. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +72 -71
  893. data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +38 -38
  894. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc +18 -18
  895. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +80 -81
  896. data/src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc +22 -22
  897. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +22 -22
  898. data/src/core/tsi/alts/frame_protector/frame_handler.cc +26 -25
  899. data/src/core/tsi/alts/frame_protector/frame_handler.h +166 -166
  900. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +78 -77
  901. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +99 -99
  902. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +18 -17
  903. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +41 -42
  904. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +37 -36
  905. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +58 -58
  906. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +20 -20
  907. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +21 -20
  908. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +36 -36
  909. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +19 -19
  910. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +102 -101
  911. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +45 -44
  912. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +38 -39
  913. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +38 -36
  914. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +33 -34
  915. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +65 -66
  916. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +32 -31
  917. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +53 -54
  918. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +54 -53
  919. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +138 -139
  920. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +58 -57
  921. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +41 -42
  922. data/src/core/tsi/fake_transport_security.cc +80 -79
  923. data/src/core/tsi/fake_transport_security.h +30 -30
  924. data/src/core/tsi/local_transport_security.cc +34 -33
  925. data/src/core/tsi/local_transport_security.h +31 -31
  926. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +8 -3
  927. data/src/core/tsi/ssl/session_cache/ssl_session.h +18 -18
  928. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +19 -19
  929. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +18 -17
  930. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +19 -19
  931. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +25 -20
  932. data/src/core/tsi/ssl_transport_security.cc +139 -323
  933. data/src/core/tsi/ssl_transport_security.h +201 -200
  934. data/src/core/tsi/ssl_transport_security_utils.cc +250 -0
  935. data/src/core/tsi/ssl_transport_security_utils.h +147 -0
  936. data/src/core/tsi/ssl_types.h +25 -25
  937. data/src/core/tsi/transport_security.cc +26 -26
  938. data/src/core/tsi/transport_security.h +45 -45
  939. data/src/core/tsi/transport_security_grpc.cc +20 -20
  940. data/src/core/tsi/transport_security_grpc.h +39 -39
  941. data/src/core/tsi/transport_security_interface.h +330 -330
  942. data/src/ruby/ext/grpc/{ext-export-truffleruby.clang → ext-export-truffleruby-with-ruby-abi-version.clang} +0 -0
  943. data/src/ruby/ext/grpc/{ext-export-truffleruby.gcc → ext-export-truffleruby-with-ruby-abi-version.gcc} +0 -0
  944. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.clang +2 -0
  945. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.gcc +7 -0
  946. data/src/ruby/ext/grpc/ext-export.clang +0 -1
  947. data/src/ruby/ext/grpc/ext-export.gcc +1 -2
  948. data/src/ruby/ext/grpc/extconf.rb +47 -2
  949. data/src/ruby/ext/grpc/rb_call.c +1 -0
  950. data/src/ruby/ext/grpc/rb_channel.c +1 -0
  951. data/src/ruby/ext/grpc/rb_channel_args.c +1 -0
  952. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  953. data/src/ruby/ext/grpc/rb_grpc.c +1 -0
  954. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +38 -38
  955. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +59 -59
  956. data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
  957. data/src/ruby/lib/grpc/version.rb +1 -1
  958. data/src/ruby/spec/channel_spec.rb +0 -43
  959. data/src/ruby/spec/client_server_spec.rb +20 -8
  960. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  961. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  962. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  963. data/third_party/re2/re2/bitstate.cc +3 -3
  964. data/third_party/re2/re2/dfa.cc +13 -13
  965. data/third_party/re2/re2/nfa.cc +4 -4
  966. data/third_party/re2/re2/onepass.cc +2 -2
  967. data/third_party/re2/re2/prefilter_tree.cc +27 -59
  968. data/third_party/re2/re2/prefilter_tree.h +3 -2
  969. data/third_party/re2/re2/prog.cc +11 -2
  970. data/third_party/re2/re2/prog.h +17 -5
  971. data/third_party/re2/re2/re2.cc +6 -11
  972. data/third_party/re2/re2/re2.h +1 -1
  973. data/third_party/re2/re2/regexp.cc +1 -2
  974. data/third_party/re2/re2/stringpiece.h +10 -7
  975. data/third_party/re2/re2/unicode_casefold.cc +25 -11
  976. data/third_party/re2/re2/unicode_groups.cc +319 -151
  977. data/third_party/re2/re2/walker-inl.h +3 -2
  978. data/third_party/re2/util/mutex.h +4 -4
  979. data/third_party/zlib/compress.c +3 -3
  980. data/third_party/zlib/crc32.c +21 -12
  981. data/third_party/zlib/deflate.c +112 -106
  982. data/third_party/zlib/deflate.h +2 -2
  983. data/third_party/zlib/gzlib.c +1 -1
  984. data/third_party/zlib/gzread.c +3 -5
  985. data/third_party/zlib/gzwrite.c +1 -1
  986. data/third_party/zlib/infback.c +10 -7
  987. data/third_party/zlib/inflate.c +5 -2
  988. data/third_party/zlib/inftrees.c +2 -2
  989. data/third_party/zlib/inftrees.h +1 -1
  990. data/third_party/zlib/trees.c +61 -62
  991. data/third_party/zlib/uncompr.c +2 -2
  992. data/third_party/zlib/zconf.h +16 -3
  993. data/third_party/zlib/zlib.h +10 -10
  994. data/third_party/zlib/zutil.c +9 -7
  995. data/third_party/zlib/zutil.h +1 -0
  996. metadata +148 -42
  997. data/include/grpc/impl/codegen/gpr_slice.h +0 -71
  998. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
  999. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
  1000. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +0 -332
  1001. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +0 -52
  1002. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +0 -322
  1003. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +0 -62
  1004. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  1005. data/src/core/lib/gpr/murmur_hash.h +0 -29
  1006. data/src/core/lib/gpr/tls.h +0 -156
  1007. data/src/core/lib/promise/call_push_pull.h +0 -148
  1008. data/src/core/lib/slice/slice_api.cc +0 -39
  1009. data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -0,0 +1,1308 @@
1
+ // Copyright 2022 gRPC Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ #include <grpc/support/port_platform.h>
15
+
16
+ #include "src/core/lib/event_engine/posix_engine/posix_endpoint.h"
17
+
18
+ #include <errno.h>
19
+ #include <inttypes.h>
20
+ #include <limits.h>
21
+
22
+ #include <algorithm>
23
+ #include <cctype>
24
+ #include <cstdint>
25
+ #include <cstdlib>
26
+ #include <memory>
27
+ #include <string>
28
+ #include <type_traits>
29
+
30
+ #include "absl/functional/any_invocable.h"
31
+ #include "absl/status/status.h"
32
+ #include "absl/status/statusor.h"
33
+ #include "absl/strings/str_cat.h"
34
+ #include "absl/types/optional.h"
35
+
36
+ #include <grpc/event_engine/internal/slice_cast.h>
37
+ #include <grpc/event_engine/memory_request.h>
38
+ #include <grpc/event_engine/slice.h>
39
+ #include <grpc/event_engine/slice_buffer.h>
40
+ #include <grpc/status.h>
41
+ #include <grpc/support/log.h>
42
+
43
+ #include "src/core/lib/event_engine/posix_engine/event_poller.h"
44
+ #include "src/core/lib/event_engine/posix_engine/internal_errqueue.h"
45
+ #include "src/core/lib/event_engine/posix_engine/tcp_socket_utils.h"
46
+ #include "src/core/lib/event_engine/tcp_socket_utils.h"
47
+ #include "src/core/lib/experiments/experiments.h"
48
+ #include "src/core/lib/gpr/useful.h"
49
+ #include "src/core/lib/gprpp/load_file.h"
50
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
51
+ #include "src/core/lib/gprpp/status_helper.h"
52
+ #include "src/core/lib/gprpp/strerror.h"
53
+ #include "src/core/lib/gprpp/time.h"
54
+ #include "src/core/lib/resource_quota/resource_quota.h"
55
+ #include "src/core/lib/slice/slice.h"
56
+
57
+ #ifdef GRPC_POSIX_SOCKET_TCP
58
+ #ifdef GRPC_LINUX_ERRQUEUE
59
+ #include <dirent.h> // IWYU pragma: keep
60
+ #include <linux/capability.h> // IWYU pragma: keep
61
+ #include <linux/errqueue.h> // IWYU pragma: keep
62
+ #include <linux/netlink.h> // IWYU pragma: keep
63
+ #include <sys/prctl.h> // IWYU pragma: keep
64
+ #include <sys/resource.h> // IWYU pragma: keep
65
+ #endif
66
+ #include <netinet/in.h> // IWYU pragma: keep
67
+
68
+ #ifndef SOL_TCP
69
+ #define SOL_TCP IPPROTO_TCP
70
+ #endif
71
+
72
+ #ifndef TCP_INQ
73
+ #define TCP_INQ 36
74
+ #define TCP_CM_INQ TCP_INQ
75
+ #endif
76
+
77
+ #ifdef GRPC_HAVE_MSG_NOSIGNAL
78
+ #define SENDMSG_FLAGS MSG_NOSIGNAL
79
+ #else
80
+ #define SENDMSG_FLAGS 0
81
+ #endif
82
+
83
+ // TCP zero copy sendmsg flag.
84
+ // NB: We define this here as a fallback in case we're using an older set of
85
+ // library headers that has not defined MSG_ZEROCOPY. Since this constant is
86
+ // part of the kernel, we are guaranteed it will never change/disagree so
87
+ // defining it here is safe.
88
+ #ifndef MSG_ZEROCOPY
89
+ #define MSG_ZEROCOPY 0x4000000
90
+ #endif
91
+
92
+ #define MAX_READ_IOVEC 64
93
+
94
+ namespace grpc_event_engine {
95
+ namespace experimental {
96
+
97
+ namespace {
98
+
99
+ // A wrapper around sendmsg. It sends \a msg over \a fd and returns the number
100
+ // of bytes sent.
101
+ ssize_t TcpSend(int fd, const struct msghdr* msg, int* saved_errno,
102
+ int additional_flags = 0) {
103
+ ssize_t sent_length;
104
+ do {
105
+ sent_length = sendmsg(fd, msg, SENDMSG_FLAGS | additional_flags);
106
+ } while (sent_length < 0 && (*saved_errno = errno) == EINTR);
107
+ return sent_length;
108
+ }
109
+
110
+ #ifdef GRPC_LINUX_ERRQUEUE
111
+
112
+ #define CAP_IS_SUPPORTED(cap) (prctl(PR_CAPBSET_READ, (cap), 0) > 0)
113
+
114
+ // Remove spaces and newline characters from the end of a string.
115
+ void rtrim(std::string& s) {
116
+ s.erase(std::find_if(s.rbegin(), s.rend(),
117
+ [](unsigned char ch) { return !std::isspace(ch); })
118
+ .base(),
119
+ s.end());
120
+ }
121
+
122
+ uint64_t ParseUlimitMemLockFromFile(std::string file_name) {
123
+ static std::string kHardMemlockPrefix = "* hard memlock";
124
+ auto result = grpc_core::LoadFile(file_name, false);
125
+ if (!result.ok()) {
126
+ return 0;
127
+ }
128
+ std::string file_contents(reinterpret_cast<const char*>((*result).begin()),
129
+ (*result).length());
130
+ // Find start position containing prefix.
131
+ size_t start = file_contents.find(kHardMemlockPrefix);
132
+ if (start == std::string::npos) {
133
+ return 0;
134
+ }
135
+ // Find position of next newline after prefix.
136
+ size_t end = file_contents.find(start, '\n');
137
+ // Extract substring between prefix and next newline.
138
+ auto memlock_value_string = file_contents.substr(
139
+ start + kHardMemlockPrefix.length() + 1, end - start);
140
+ rtrim(memlock_value_string);
141
+ if (memlock_value_string == "unlimited" ||
142
+ memlock_value_string == "infinity") {
143
+ return UINT64_MAX;
144
+ } else {
145
+ return std::atoi(memlock_value_string.c_str());
146
+ }
147
+ }
148
+
149
+ // Ulimit hard memlock controls per socket limit for maximum locked memory in
150
+ // RAM. Parses all files under /etc/security/limits.d/ and
151
+ // /etc/security/limits.conf file for a line of the following format:
152
+ // * hard memlock <value>
153
+ // It extracts the first valid <value> and returns it. A value of UINT64_MAX
154
+ // represents unlimited or infinity. Hard memlock value should be set to
155
+ // allow zerocopy sendmsgs to succeed. It controls the maximum amount of
156
+ // memory that can be locked by a socket in RAM.
157
+ uint64_t GetUlimitHardMemLock() {
158
+ static const uint64_t kUlimitHardMemLock = []() -> uint64_t {
159
+ if (CAP_IS_SUPPORTED(CAP_SYS_RESOURCE)) {
160
+ // hard memlock ulimit is ignored for privileged user.
161
+ return UINT64_MAX;
162
+ }
163
+ if (auto dir = opendir("/etc/security/limits.d")) {
164
+ while (auto f = readdir(dir)) {
165
+ if (f->d_name[0] == '.') {
166
+ continue; // Skip everything that starts with a dot
167
+ }
168
+ uint64_t hard_memlock = ParseUlimitMemLockFromFile(
169
+ absl::StrCat("/etc/security/limits.d/", std::string(f->d_name)));
170
+ if (hard_memlock != 0) {
171
+ return hard_memlock;
172
+ }
173
+ }
174
+ closedir(dir);
175
+ }
176
+ return ParseUlimitMemLockFromFile("/etc/security/limits.conf");
177
+ }();
178
+ return kUlimitHardMemLock;
179
+ }
180
+
181
+ // RLIMIT_MEMLOCK controls per process limit for maximum locked memory in RAM.
182
+ uint64_t GetRLimitMemLockMax() {
183
+ static const uint64_t kRlimitMemLock = []() -> uint64_t {
184
+ if (CAP_IS_SUPPORTED(CAP_SYS_RESOURCE)) {
185
+ // RLIMIT_MEMLOCK is ignored for privileged user.
186
+ return UINT64_MAX;
187
+ }
188
+ struct rlimit limit;
189
+ if (getrlimit(RLIMIT_MEMLOCK, &limit) != 0) {
190
+ return 0;
191
+ }
192
+ return static_cast<uint64_t>(limit.rlim_max);
193
+ }();
194
+ return kRlimitMemLock;
195
+ }
196
+
197
+ // Whether the cmsg received from error queue is of the IPv4 or IPv6 levels.
198
+ bool CmsgIsIpLevel(const cmsghdr& cmsg) {
199
+ return (cmsg.cmsg_level == SOL_IPV6 && cmsg.cmsg_type == IPV6_RECVERR) ||
200
+ (cmsg.cmsg_level == SOL_IP && cmsg.cmsg_type == IP_RECVERR);
201
+ }
202
+
203
+ bool CmsgIsZeroCopy(const cmsghdr& cmsg) {
204
+ if (!CmsgIsIpLevel(cmsg)) {
205
+ return false;
206
+ }
207
+ auto serr = reinterpret_cast<const sock_extended_err*> CMSG_DATA(&cmsg);
208
+ return serr->ee_errno == 0 && serr->ee_origin == SO_EE_ORIGIN_ZEROCOPY;
209
+ }
210
+ #endif // GRPC_LINUX_ERRQUEUE
211
+
212
+ absl::Status PosixOSError(int error_no, const char* call_name) {
213
+ absl::Status s = absl::UnknownError(grpc_core::StrError(error_no));
214
+ grpc_core::StatusSetInt(&s, grpc_core::StatusIntProperty::kErrorNo, error_no);
215
+ grpc_core::StatusSetStr(&s, grpc_core::StatusStrProperty::kOsError,
216
+ grpc_core::StrError(error_no));
217
+ grpc_core::StatusSetStr(&s, grpc_core::StatusStrProperty::kSyscall,
218
+ call_name);
219
+ return s;
220
+ }
221
+
222
+ } // namespace
223
+
224
+ #if defined(IOV_MAX) && IOV_MAX < 260
225
+ #define MAX_WRITE_IOVEC IOV_MAX
226
+ #else
227
+ #define MAX_WRITE_IOVEC 260
228
+ #endif
229
+ msg_iovlen_type TcpZerocopySendRecord::PopulateIovs(size_t* unwind_slice_idx,
230
+ size_t* unwind_byte_idx,
231
+ size_t* sending_length,
232
+ iovec* iov) {
233
+ msg_iovlen_type iov_size;
234
+ *unwind_slice_idx = out_offset_.slice_idx;
235
+ *unwind_byte_idx = out_offset_.byte_idx;
236
+ for (iov_size = 0;
237
+ out_offset_.slice_idx != buf_.Count() && iov_size != MAX_WRITE_IOVEC;
238
+ iov_size++) {
239
+ MutableSlice& slice = internal::SliceCast<MutableSlice>(
240
+ buf_.MutableSliceAt(out_offset_.slice_idx));
241
+ iov[iov_size].iov_base = slice.begin();
242
+ iov[iov_size].iov_len = slice.length() - out_offset_.byte_idx;
243
+ *sending_length += iov[iov_size].iov_len;
244
+ ++(out_offset_.slice_idx);
245
+ out_offset_.byte_idx = 0;
246
+ }
247
+ GPR_DEBUG_ASSERT(iov_size > 0);
248
+ return iov_size;
249
+ }
250
+
251
+ void TcpZerocopySendRecord::UpdateOffsetForBytesSent(size_t sending_length,
252
+ size_t actually_sent) {
253
+ size_t trailing = sending_length - actually_sent;
254
+ while (trailing > 0) {
255
+ size_t slice_length;
256
+ out_offset_.slice_idx--;
257
+ slice_length = buf_.RefSlice(out_offset_.slice_idx).length();
258
+ if (slice_length > trailing) {
259
+ out_offset_.byte_idx = slice_length - trailing;
260
+ break;
261
+ } else {
262
+ trailing -= slice_length;
263
+ }
264
+ }
265
+ }
266
+
267
+ void PosixEndpointImpl::AddToEstimate(size_t bytes) {
268
+ bytes_read_this_round_ += static_cast<double>(bytes);
269
+ }
270
+
271
+ void PosixEndpointImpl::FinishEstimate() {
272
+ // If we read >80% of the target buffer in one read loop, increase the size of
273
+ // the target buffer to either the amount read, or twice its previous value.
274
+ if (bytes_read_this_round_ > target_length_ * 0.8) {
275
+ target_length_ = std::max(2 * target_length_, bytes_read_this_round_);
276
+ } else {
277
+ target_length_ = 0.99 * target_length_ + 0.01 * bytes_read_this_round_;
278
+ }
279
+ bytes_read_this_round_ = 0;
280
+ }
281
+
282
+ absl::Status PosixEndpointImpl::TcpAnnotateError(absl::Status src_error) {
283
+ auto peer_string = ResolvedAddressToNormalizedString(peer_address_);
284
+
285
+ grpc_core::StatusSetStr(&src_error,
286
+ grpc_core::StatusStrProperty::kTargetAddress,
287
+ peer_string.ok() ? *peer_string : "");
288
+ grpc_core::StatusSetInt(&src_error, grpc_core::StatusIntProperty::kFd,
289
+ handle_->WrappedFd());
290
+ grpc_core::StatusSetInt(&src_error, grpc_core::StatusIntProperty::kRpcStatus,
291
+ GRPC_STATUS_UNAVAILABLE);
292
+ return src_error;
293
+ }
294
+
295
+ // Returns true if data available to read or error other than EAGAIN.
296
+ bool PosixEndpointImpl::TcpDoRead(absl::Status& status) {
297
+ struct msghdr msg;
298
+ struct iovec iov[MAX_READ_IOVEC];
299
+ ssize_t read_bytes;
300
+ size_t total_read_bytes = 0;
301
+ size_t iov_len = std::min<size_t>(MAX_READ_IOVEC, incoming_buffer_->Count());
302
+ #ifdef GRPC_LINUX_ERRQUEUE
303
+ constexpr size_t cmsg_alloc_space =
304
+ CMSG_SPACE(sizeof(scm_timestamping)) + CMSG_SPACE(sizeof(int));
305
+ #else
306
+ constexpr size_t cmsg_alloc_space = 24; // CMSG_SPACE(sizeof(int))
307
+ #endif // GRPC_LINUX_ERRQUEUE
308
+ char cmsgbuf[cmsg_alloc_space];
309
+ for (size_t i = 0; i < iov_len; i++) {
310
+ MutableSlice& slice =
311
+ internal::SliceCast<MutableSlice>(incoming_buffer_->MutableSliceAt(i));
312
+ iov[i].iov_base = slice.begin();
313
+ iov[i].iov_len = slice.length();
314
+ }
315
+
316
+ GPR_ASSERT(incoming_buffer_->Length() != 0);
317
+ GPR_DEBUG_ASSERT(min_progress_size_ > 0);
318
+
319
+ do {
320
+ // Assume there is something on the queue. If we receive TCP_INQ from
321
+ // kernel, we will update this value, otherwise, we have to assume there is
322
+ // always something to read until we get EAGAIN.
323
+ inq_ = 1;
324
+
325
+ msg.msg_name = nullptr;
326
+ msg.msg_namelen = 0;
327
+ msg.msg_iov = iov;
328
+ msg.msg_iovlen = static_cast<msg_iovlen_type>(iov_len);
329
+ if (inq_capable_) {
330
+ msg.msg_control = cmsgbuf;
331
+ msg.msg_controllen = sizeof(cmsgbuf);
332
+ } else {
333
+ msg.msg_control = nullptr;
334
+ msg.msg_controllen = 0;
335
+ }
336
+ msg.msg_flags = 0;
337
+
338
+ do {
339
+ read_bytes = recvmsg(fd_, &msg, 0);
340
+ } while (read_bytes < 0 && errno == EINTR);
341
+
342
+ if (read_bytes < 0 && errno == EAGAIN) {
343
+ // NB: After calling call_read_cb a parallel call of the read handler may
344
+ // be running.
345
+ if (total_read_bytes > 0) {
346
+ break;
347
+ }
348
+ FinishEstimate();
349
+ inq_ = 0;
350
+ return false;
351
+ }
352
+
353
+ // We have read something in previous reads. We need to deliver those bytes
354
+ // to the upper layer.
355
+ if (read_bytes <= 0 && total_read_bytes >= 1) {
356
+ inq_ = 1;
357
+ break;
358
+ }
359
+
360
+ if (read_bytes <= 0) {
361
+ // 0 read size ==> end of stream
362
+ incoming_buffer_->Clear();
363
+ if (read_bytes == 0) {
364
+ status = TcpAnnotateError(absl::InternalError("Socket closed"));
365
+ } else {
366
+ status = TcpAnnotateError(absl::InternalError(
367
+ absl::StrCat("recvmsg:", grpc_core::StrError(errno))));
368
+ }
369
+ return true;
370
+ }
371
+
372
+ AddToEstimate(static_cast<size_t>(read_bytes));
373
+ GPR_DEBUG_ASSERT((size_t)read_bytes <=
374
+ incoming_buffer_->Length() - total_read_bytes);
375
+
376
+ #ifdef GRPC_HAVE_TCP_INQ
377
+ if (inq_capable_) {
378
+ GPR_DEBUG_ASSERT(!(msg.msg_flags & MSG_CTRUNC));
379
+ struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);
380
+ for (; cmsg != nullptr; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
381
+ if (cmsg->cmsg_level == SOL_TCP && cmsg->cmsg_type == TCP_CM_INQ &&
382
+ cmsg->cmsg_len == CMSG_LEN(sizeof(int))) {
383
+ inq_ = *reinterpret_cast<int*>(CMSG_DATA(cmsg));
384
+ break;
385
+ }
386
+ }
387
+ }
388
+ #endif // GRPC_HAVE_TCP_INQ
389
+
390
+ total_read_bytes += read_bytes;
391
+ if (inq_ == 0 || total_read_bytes == incoming_buffer_->Length()) {
392
+ break;
393
+ }
394
+
395
+ // We had a partial read, and still have space to read more data. So, adjust
396
+ // IOVs and try to read more.
397
+ size_t remaining = read_bytes;
398
+ size_t j = 0;
399
+ for (size_t i = 0; i < iov_len; i++) {
400
+ if (remaining >= iov[i].iov_len) {
401
+ remaining -= iov[i].iov_len;
402
+ continue;
403
+ }
404
+ if (remaining > 0) {
405
+ iov[j].iov_base = static_cast<char*>(iov[i].iov_base) + remaining;
406
+ iov[j].iov_len = iov[i].iov_len - remaining;
407
+ remaining = 0;
408
+ } else {
409
+ iov[j].iov_base = iov[i].iov_base;
410
+ iov[j].iov_len = iov[i].iov_len;
411
+ }
412
+ ++j;
413
+ }
414
+ iov_len = j;
415
+ } while (true);
416
+
417
+ if (inq_ == 0) {
418
+ FinishEstimate();
419
+ }
420
+
421
+ GPR_DEBUG_ASSERT(total_read_bytes > 0);
422
+ status = absl::OkStatus();
423
+ if (grpc_core::IsTcpFrameSizeTuningEnabled()) {
424
+ // Update min progress size based on the total number of bytes read in
425
+ // this round.
426
+ min_progress_size_ -= total_read_bytes;
427
+ if (min_progress_size_ > 0) {
428
+ // There is still some bytes left to be read before we can signal
429
+ // the read as complete. Append the bytes read so far into
430
+ // last_read_buffer which serves as a staging buffer. Return false
431
+ // to indicate tcp_handle_read needs to be scheduled again.
432
+ incoming_buffer_->MoveFirstNBytesIntoSliceBuffer(total_read_bytes,
433
+ last_read_buffer_);
434
+ return false;
435
+ } else {
436
+ // The required number of bytes have been read. Append the bytes
437
+ // read in this round into last_read_buffer. Then swap last_read_buffer
438
+ // and incoming_buffer. Now incoming buffer contains all the bytes
439
+ // read since the start of the last tcp_read operation. last_read_buffer
440
+ // would contain any spare space left in the incoming buffer. This
441
+ // space will be used in the next tcp_read operation.
442
+ min_progress_size_ = 1;
443
+ incoming_buffer_->MoveFirstNBytesIntoSliceBuffer(total_read_bytes,
444
+ last_read_buffer_);
445
+ incoming_buffer_->Swap(last_read_buffer_);
446
+ return true;
447
+ }
448
+ }
449
+ if (total_read_bytes < incoming_buffer_->Length()) {
450
+ incoming_buffer_->MoveLastNBytesIntoSliceBuffer(
451
+ incoming_buffer_->Length() - total_read_bytes, last_read_buffer_);
452
+ }
453
+ return true;
454
+ }
455
+
456
+ void PosixEndpointImpl::PerformReclamation() {
457
+ read_mu_.Lock();
458
+ if (incoming_buffer_ != nullptr) {
459
+ incoming_buffer_->Clear();
460
+ }
461
+ has_posted_reclaimer_ = false;
462
+ read_mu_.Unlock();
463
+ }
464
+
465
+ void PosixEndpointImpl::MaybePostReclaimer() {
466
+ if (!has_posted_reclaimer_) {
467
+ has_posted_reclaimer_ = true;
468
+ memory_owner_.PostReclaimer(
469
+ grpc_core::ReclamationPass::kBenign,
470
+ [this](absl::optional<grpc_core::ReclamationSweep> sweep) {
471
+ if (!sweep.has_value()) return;
472
+ PerformReclamation();
473
+ });
474
+ }
475
+ }
476
+
477
+ void PosixEndpointImpl::UpdateRcvLowat() {
478
+ if (!grpc_core::IsTcpRcvLowatEnabled()) return;
479
+
480
+ // TODO(ctiller): Check if supported by OS.
481
+ // TODO(ctiller): Allow some adjustments instead of hardcoding things.
482
+
483
+ static constexpr int kRcvLowatMax = 16 * 1024 * 1024;
484
+ static constexpr int kRcvLowatThreshold = 16 * 1024;
485
+
486
+ int remaining = std::min({static_cast<int>(incoming_buffer_->Length()),
487
+ kRcvLowatMax, min_progress_size_});
488
+
489
+ // Setting SO_RCVLOWAT for small quantities does not save on CPU.
490
+ if (remaining < kRcvLowatThreshold) {
491
+ remaining = 0;
492
+ }
493
+
494
+ // If zerocopy is off, wake shortly before the full RPC is here. More can
495
+ // show up partway through recvmsg() since it takes a while to copy data.
496
+ // So an early wakeup aids latency.
497
+ if (!tcp_zerocopy_send_ctx_->Enabled() && remaining > 0) {
498
+ remaining -= kRcvLowatThreshold;
499
+ }
500
+
501
+ // We still do not know the RPC size. Do not set SO_RCVLOWAT.
502
+ if (set_rcvlowat_ <= 1 && remaining <= 1) return;
503
+
504
+ // Previous value is still valid. No change needed in SO_RCVLOWAT.
505
+ if (set_rcvlowat_ == remaining) {
506
+ return;
507
+ }
508
+ auto result = sock_.SetSocketRcvLowat(remaining);
509
+ if (result.ok()) {
510
+ set_rcvlowat_ = *result;
511
+ } else {
512
+ gpr_log(GPR_ERROR, "%s",
513
+ absl::StrCat("ERROR in SO_RCVLOWAT: ", result.status().message())
514
+ .c_str());
515
+ }
516
+ }
517
+
518
+ void PosixEndpointImpl::MaybeMakeReadSlices() {
519
+ if (grpc_core::IsTcpReadChunksEnabled()) {
520
+ static const int kBigAlloc = 64 * 1024;
521
+ static const int kSmallAlloc = 8 * 1024;
522
+ if (incoming_buffer_->Length() < static_cast<size_t>(min_progress_size_)) {
523
+ size_t allocate_length = min_progress_size_;
524
+ const size_t target_length = static_cast<size_t>(target_length_);
525
+ // If memory pressure is low and we think there will be more than
526
+ // min_progress_size bytes to read, allocate a bit more.
527
+ const bool low_memory_pressure =
528
+ memory_owner_.GetPressureInfo().pressure_control_value < 0.8;
529
+ if (low_memory_pressure && target_length > allocate_length) {
530
+ allocate_length = target_length;
531
+ }
532
+ int extra_wanted =
533
+ allocate_length - static_cast<int>(incoming_buffer_->Length());
534
+ if (extra_wanted >=
535
+ (low_memory_pressure ? kSmallAlloc * 3 / 2 : kBigAlloc)) {
536
+ while (extra_wanted > 0) {
537
+ extra_wanted -= kBigAlloc;
538
+ incoming_buffer_->AppendIndexed(
539
+ Slice(memory_owner_.MakeSlice(kBigAlloc)));
540
+ }
541
+ } else {
542
+ while (extra_wanted > 0) {
543
+ extra_wanted -= kSmallAlloc;
544
+ incoming_buffer_->AppendIndexed(
545
+ Slice(memory_owner_.MakeSlice(kSmallAlloc)));
546
+ }
547
+ }
548
+ MaybePostReclaimer();
549
+ }
550
+ } else {
551
+ if (incoming_buffer_->Length() < static_cast<size_t>(min_progress_size_) &&
552
+ incoming_buffer_->Count() < MAX_READ_IOVEC) {
553
+ int target_length =
554
+ std::max(static_cast<int>(target_length_), min_progress_size_);
555
+ int extra_wanted =
556
+ target_length - static_cast<int>(incoming_buffer_->Length());
557
+ int min_read_chunk_size =
558
+ std::max(min_read_chunk_size_, min_progress_size_);
559
+ int max_read_chunk_size =
560
+ std::max(max_read_chunk_size_, min_progress_size_);
561
+ incoming_buffer_->AppendIndexed(
562
+ Slice(memory_owner_.MakeSlice(grpc_core::MemoryRequest(
563
+ min_read_chunk_size,
564
+ grpc_core::Clamp(extra_wanted, min_read_chunk_size,
565
+ max_read_chunk_size)))));
566
+ MaybePostReclaimer();
567
+ }
568
+ }
569
+ }
570
+
571
+ void PosixEndpointImpl::HandleRead(absl::Status status) {
572
+ read_mu_.Lock();
573
+ if (status.ok()) {
574
+ MaybeMakeReadSlices();
575
+ if (!TcpDoRead(status)) {
576
+ UpdateRcvLowat();
577
+ // We've consumed the edge, request a new one.
578
+ read_mu_.Unlock();
579
+ handle_->NotifyOnRead(on_read_);
580
+ return;
581
+ }
582
+ } else {
583
+ incoming_buffer_->Clear();
584
+ last_read_buffer_.Clear();
585
+ }
586
+ absl::AnyInvocable<void(absl::Status)> cb = std::move(read_cb_);
587
+ read_cb_ = nullptr;
588
+ incoming_buffer_ = nullptr;
589
+ read_mu_.Unlock();
590
+ cb(status);
591
+ Unref();
592
+ }
593
+
594
+ void PosixEndpointImpl::Read(absl::AnyInvocable<void(absl::Status)> on_read,
595
+ SliceBuffer* buffer,
596
+ const EventEngine::Endpoint::ReadArgs* args) {
597
+ grpc_core::ReleasableMutexLock lock(&read_mu_);
598
+ GPR_ASSERT(read_cb_ == nullptr);
599
+ read_cb_ = std::move(on_read);
600
+ incoming_buffer_ = buffer;
601
+ incoming_buffer_->Clear();
602
+ incoming_buffer_->Swap(last_read_buffer_);
603
+ if (args != nullptr && grpc_core::IsTcpFrameSizeTuningEnabled()) {
604
+ min_progress_size_ = std::max(static_cast<int>(args->read_hint_bytes), 1);
605
+ } else {
606
+ min_progress_size_ = 1;
607
+ }
608
+ Ref().release();
609
+ if (is_first_read_) {
610
+ UpdateRcvLowat();
611
+ // Endpoint read called for the very first time. Register read callback
612
+ // with the polling engine.
613
+ is_first_read_ = false;
614
+ lock.Release();
615
+ handle_->NotifyOnRead(on_read_);
616
+ } else if (inq_ == 0) {
617
+ UpdateRcvLowat();
618
+ lock.Release();
619
+ // Upper layer asked to read more but we know there is no pending data to
620
+ // read from previous reads. So, wait for POLLIN.
621
+ handle_->NotifyOnRead(on_read_);
622
+ } else {
623
+ lock.Release();
624
+ on_read_->SetStatus(absl::OkStatus());
625
+ engine_->Run(on_read_);
626
+ }
627
+ }
628
+
629
+ #ifdef GRPC_LINUX_ERRQUEUE
630
+ TcpZerocopySendRecord* PosixEndpointImpl::TcpGetSendZerocopyRecord(
631
+ SliceBuffer& buf) {
632
+ TcpZerocopySendRecord* zerocopy_send_record = nullptr;
633
+ const bool use_zerocopy =
634
+ tcp_zerocopy_send_ctx_->Enabled() &&
635
+ tcp_zerocopy_send_ctx_->ThresholdBytes() < buf.Length();
636
+ if (use_zerocopy) {
637
+ zerocopy_send_record = tcp_zerocopy_send_ctx_->GetSendRecord();
638
+ if (zerocopy_send_record == nullptr) {
639
+ ProcessErrors();
640
+ zerocopy_send_record = tcp_zerocopy_send_ctx_->GetSendRecord();
641
+ }
642
+ if (zerocopy_send_record != nullptr) {
643
+ zerocopy_send_record->PrepareForSends(buf);
644
+ GPR_DEBUG_ASSERT(buf.Count() == 0);
645
+ GPR_DEBUG_ASSERT(buf.Length() == 0);
646
+ outgoing_byte_idx_ = 0;
647
+ outgoing_buffer_ = nullptr;
648
+ }
649
+ }
650
+ return zerocopy_send_record;
651
+ }
652
+
653
+ // For linux platforms, reads the socket's error queue and processes error
654
+ // messages from the queue.
655
+ bool PosixEndpointImpl::ProcessErrors() {
656
+ bool processed_err = false;
657
+ struct iovec iov;
658
+ iov.iov_base = nullptr;
659
+ iov.iov_len = 0;
660
+ struct msghdr msg;
661
+ msg.msg_name = nullptr;
662
+ msg.msg_namelen = 0;
663
+ msg.msg_iov = &iov;
664
+ msg.msg_iovlen = 0;
665
+ msg.msg_flags = 0;
666
+ // Allocate enough space so we don't need to keep increasing this as size of
667
+ // OPT_STATS increase.
668
+ constexpr size_t cmsg_alloc_space =
669
+ CMSG_SPACE(sizeof(scm_timestamping)) +
670
+ CMSG_SPACE(sizeof(sock_extended_err) + sizeof(sockaddr_in)) +
671
+ CMSG_SPACE(32 * NLA_ALIGN(NLA_HDRLEN + sizeof(uint64_t)));
672
+ // Allocate aligned space for cmsgs received along with timestamps.
673
+ union {
674
+ char rbuf[cmsg_alloc_space];
675
+ struct cmsghdr align;
676
+ } aligned_buf;
677
+ msg.msg_control = aligned_buf.rbuf;
678
+ int r, saved_errno;
679
+ while (true) {
680
+ msg.msg_controllen = sizeof(aligned_buf.rbuf);
681
+ do {
682
+ r = recvmsg(fd_, &msg, MSG_ERRQUEUE);
683
+ saved_errno = errno;
684
+ } while (r < 0 && saved_errno == EINTR);
685
+
686
+ if (r < 0 && saved_errno == EAGAIN) {
687
+ return processed_err; // No more errors to process
688
+ } else if (r < 0) {
689
+ return processed_err;
690
+ }
691
+ if (GPR_UNLIKELY((msg.msg_flags & MSG_CTRUNC) != 0)) {
692
+ gpr_log(GPR_ERROR, "Error message was truncated.");
693
+ }
694
+
695
+ if (msg.msg_controllen == 0) {
696
+ // There was no control message found. It was probably spurious.
697
+ return processed_err;
698
+ }
699
+ bool seen = false;
700
+ for (auto cmsg = CMSG_FIRSTHDR(&msg); cmsg && cmsg->cmsg_len;
701
+ cmsg = CMSG_NXTHDR(&msg, cmsg)) {
702
+ if (CmsgIsZeroCopy(*cmsg)) {
703
+ ProcessZerocopy(cmsg);
704
+ seen = true;
705
+ processed_err = true;
706
+ } else if (cmsg->cmsg_level == SOL_SOCKET &&
707
+ cmsg->cmsg_type == SCM_TIMESTAMPING) {
708
+ cmsg = ProcessTimestamp(&msg, cmsg);
709
+ seen = true;
710
+ processed_err = true;
711
+ } else {
712
+ // Got a control message that is not a timestamp or zerocopy. Don't know
713
+ // how to handle this.
714
+ return processed_err;
715
+ }
716
+ }
717
+ if (!seen) {
718
+ return processed_err;
719
+ }
720
+ }
721
+ }
722
+
723
+ void PosixEndpointImpl::ZerocopyDisableAndWaitForRemaining() {
724
+ tcp_zerocopy_send_ctx_->Shutdown();
725
+ while (!tcp_zerocopy_send_ctx_->AllSendRecordsEmpty()) {
726
+ ProcessErrors();
727
+ }
728
+ }
729
+
730
+ // Reads \a cmsg to process zerocopy control messages.
731
+ void PosixEndpointImpl::ProcessZerocopy(struct cmsghdr* cmsg) {
732
+ GPR_DEBUG_ASSERT(cmsg);
733
+ auto serr = reinterpret_cast<struct sock_extended_err*>(CMSG_DATA(cmsg));
734
+ GPR_DEBUG_ASSERT(serr->ee_errno == 0);
735
+ GPR_DEBUG_ASSERT(serr->ee_origin == SO_EE_ORIGIN_ZEROCOPY);
736
+ const uint32_t lo = serr->ee_info;
737
+ const uint32_t hi = serr->ee_data;
738
+ for (uint32_t seq = lo; seq <= hi; ++seq) {
739
+ // TODO(arjunroy): It's likely that lo and hi refer to zerocopy sequence
740
+ // numbers that are generated by a single call to grpc_endpoint_write; ie.
741
+ // we can batch the unref operation. So, check if record is the same for
742
+ // both; if so, batch the unref/put.
743
+ TcpZerocopySendRecord* record =
744
+ tcp_zerocopy_send_ctx_->ReleaseSendRecord(seq);
745
+ GPR_DEBUG_ASSERT(record);
746
+ UnrefMaybePutZerocopySendRecord(record);
747
+ }
748
+ if (tcp_zerocopy_send_ctx_->UpdateZeroCopyOptMemStateAfterFree()) {
749
+ handle_->SetWritable();
750
+ }
751
+ }
752
+
753
+ // Reads \a cmsg to derive timestamps from the control messages. If a valid
754
+ // timestamp is found, the traced buffer list is updated with this timestamp.
755
+ // The caller of this function should be looping on the control messages found
756
+ // in \a msg. \a cmsg should point to the control message that the caller wants
757
+ // processed. On return, a pointer to a control message is returned. On the next
758
+ // iteration, CMSG_NXTHDR(msg, ret_val) should be passed as \a cmsg.
759
+ struct cmsghdr* PosixEndpointImpl::ProcessTimestamp(msghdr* msg,
760
+ struct cmsghdr* cmsg) {
761
+ auto next_cmsg = CMSG_NXTHDR(msg, cmsg);
762
+ cmsghdr* opt_stats = nullptr;
763
+ if (next_cmsg == nullptr) {
764
+ return cmsg;
765
+ }
766
+
767
+ // Check if next_cmsg is an OPT_STATS msg.
768
+ if (next_cmsg->cmsg_level == SOL_SOCKET &&
769
+ next_cmsg->cmsg_type == SCM_TIMESTAMPING_OPT_STATS) {
770
+ opt_stats = next_cmsg;
771
+ next_cmsg = CMSG_NXTHDR(msg, opt_stats);
772
+ if (next_cmsg == nullptr) {
773
+ return opt_stats;
774
+ }
775
+ }
776
+
777
+ if (!(next_cmsg->cmsg_level == SOL_IP || next_cmsg->cmsg_level == SOL_IPV6) ||
778
+ !(next_cmsg->cmsg_type == IP_RECVERR ||
779
+ next_cmsg->cmsg_type == IPV6_RECVERR)) {
780
+ return cmsg;
781
+ }
782
+
783
+ auto tss = reinterpret_cast<scm_timestamping*>(CMSG_DATA(cmsg));
784
+ auto serr = reinterpret_cast<struct sock_extended_err*>(CMSG_DATA(next_cmsg));
785
+ if (serr->ee_errno != ENOMSG ||
786
+ serr->ee_origin != SO_EE_ORIGIN_TIMESTAMPING) {
787
+ gpr_log(GPR_ERROR, "Unexpected control message");
788
+ return cmsg;
789
+ }
790
+ traced_buffers_.ProcessTimestamp(serr, opt_stats, tss);
791
+ return next_cmsg;
792
+ }
793
+
794
+ void PosixEndpointImpl::HandleError(absl::Status status) {
795
+ if (!status.ok() ||
796
+ stop_error_notification_.load(std::memory_order_relaxed)) {
797
+ // We aren't going to register to hear on error anymore, so it is safe to
798
+ // unref.
799
+ Unref();
800
+ return;
801
+ }
802
+ // We are still interested in collecting timestamps, so let's try reading
803
+ // them.
804
+ if (!ProcessErrors()) {
805
+ // This might not a timestamps error. Set the read and write closures to be
806
+ // ready.
807
+ handle_->SetReadable();
808
+ handle_->SetWritable();
809
+ }
810
+ handle_->NotifyOnError(on_error_);
811
+ }
812
+
813
+ bool PosixEndpointImpl::WriteWithTimestamps(struct msghdr* msg,
814
+ size_t sending_length,
815
+ ssize_t* sent_length,
816
+ int* saved_errno,
817
+ int additional_flags) {
818
+ if (!socket_ts_enabled_) {
819
+ uint32_t opt = kTimestampingSocketOptions;
820
+ if (setsockopt(fd_, SOL_SOCKET, SO_TIMESTAMPING, static_cast<void*>(&opt),
821
+ sizeof(opt)) != 0) {
822
+ return false;
823
+ }
824
+ bytes_counter_ = -1;
825
+ socket_ts_enabled_ = true;
826
+ }
827
+ // Set control message to indicate that you want timestamps.
828
+ union {
829
+ char cmsg_buf[CMSG_SPACE(sizeof(uint32_t))];
830
+ struct cmsghdr align;
831
+ } u;
832
+ cmsghdr* cmsg = reinterpret_cast<cmsghdr*>(u.cmsg_buf);
833
+ cmsg->cmsg_level = SOL_SOCKET;
834
+ cmsg->cmsg_type = SO_TIMESTAMPING;
835
+ cmsg->cmsg_len = CMSG_LEN(sizeof(uint32_t));
836
+ *reinterpret_cast<int*>(CMSG_DATA(cmsg)) = kTimestampingRecordingOptions;
837
+ msg->msg_control = u.cmsg_buf;
838
+ msg->msg_controllen = CMSG_SPACE(sizeof(uint32_t));
839
+
840
+ // If there was an error on sendmsg the logic in tcp_flush will handle it.
841
+ ssize_t length = TcpSend(fd_, msg, saved_errno, additional_flags);
842
+ *sent_length = length;
843
+ // Only save timestamps if all the bytes were taken by sendmsg.
844
+ if (sending_length == static_cast<size_t>(length)) {
845
+ traced_buffers_.AddNewEntry(static_cast<uint32_t>(bytes_counter_ + length),
846
+ fd_, outgoing_buffer_arg_);
847
+ outgoing_buffer_arg_ = nullptr;
848
+ }
849
+ return true;
850
+ }
851
+
852
+ #else // GRPC_LINUX_ERRQUEUE
853
+ TcpZerocopySendRecord* PosixEndpointImpl::TcpGetSendZerocopyRecord(
854
+ SliceBuffer& /*buf*/) {
855
+ return nullptr;
856
+ }
857
+
858
+ void PosixEndpointImpl::HandleError(absl::Status /*status*/) {
859
+ grpc_core::Crash("Error handling not supported on this platform");
860
+ }
861
+
862
+ void PosixEndpointImpl::ZerocopyDisableAndWaitForRemaining() {}
863
+
864
+ bool PosixEndpointImpl::WriteWithTimestamps(struct msghdr* /*msg*/,
865
+ size_t /*sending_length*/,
866
+ ssize_t* /*sent_length*/,
867
+ int* /*saved_errno*/,
868
+ int /*additional_flags*/) {
869
+ grpc_core::Crash("Write with timestamps not supported for this platform");
870
+ }
871
+ #endif // GRPC_LINUX_ERRQUEUE
872
+
873
+ void PosixEndpointImpl::UnrefMaybePutZerocopySendRecord(
874
+ TcpZerocopySendRecord* record) {
875
+ if (record->Unref()) {
876
+ tcp_zerocopy_send_ctx_->PutSendRecord(record);
877
+ }
878
+ }
879
+
880
+ // If outgoing_buffer_arg is filled, shuts down the list early, so that any
881
+ // release operations needed can be performed on the arg.
882
+ void PosixEndpointImpl::TcpShutdownTracedBufferList() {
883
+ if (outgoing_buffer_arg_ != nullptr) {
884
+ traced_buffers_.Shutdown(outgoing_buffer_arg_,
885
+ absl::InternalError("TracedBuffer list shutdown"));
886
+ outgoing_buffer_arg_ = nullptr;
887
+ }
888
+ }
889
+
890
+ // returns true if done, false if pending; if returning true, *error is set
891
+ bool PosixEndpointImpl::DoFlushZerocopy(TcpZerocopySendRecord* record,
892
+ absl::Status& status) {
893
+ msg_iovlen_type iov_size;
894
+ ssize_t sent_length = 0;
895
+ size_t sending_length;
896
+ size_t unwind_slice_idx;
897
+ size_t unwind_byte_idx;
898
+ bool tried_sending_message;
899
+ int saved_errno;
900
+ msghdr msg;
901
+ bool constrained;
902
+ status = absl::OkStatus();
903
+ // iov consumes a large space. Keep it as the last item on the stack to
904
+ // improve locality. After all, we expect only the first elements of it
905
+ // being populated in most cases.
906
+ iovec iov[MAX_WRITE_IOVEC];
907
+ while (true) {
908
+ sending_length = 0;
909
+ iov_size = record->PopulateIovs(&unwind_slice_idx, &unwind_byte_idx,
910
+ &sending_length, iov);
911
+ msg.msg_name = nullptr;
912
+ msg.msg_namelen = 0;
913
+ msg.msg_iov = iov;
914
+ msg.msg_iovlen = iov_size;
915
+ msg.msg_flags = 0;
916
+ tried_sending_message = false;
917
+ constrained = false;
918
+ // Before calling sendmsg (with or without timestamps): we
919
+ // take a single ref on the zerocopy send record.
920
+ tcp_zerocopy_send_ctx_->NoteSend(record);
921
+ saved_errno = 0;
922
+ if (outgoing_buffer_arg_ != nullptr) {
923
+ if (!ts_capable_ ||
924
+ !WriteWithTimestamps(&msg, sending_length, &sent_length, &saved_errno,
925
+ MSG_ZEROCOPY)) {
926
+ // We could not set socket options to collect Fathom timestamps.
927
+ // Fallback on writing without timestamps.
928
+ ts_capable_ = false;
929
+ TcpShutdownTracedBufferList();
930
+ } else {
931
+ tried_sending_message = true;
932
+ }
933
+ }
934
+ if (!tried_sending_message) {
935
+ msg.msg_control = nullptr;
936
+ msg.msg_controllen = 0;
937
+ sent_length = TcpSend(fd_, &msg, &saved_errno, MSG_ZEROCOPY);
938
+ }
939
+ if (tcp_zerocopy_send_ctx_->UpdateZeroCopyOptMemStateAfterSend(
940
+ saved_errno == ENOBUFS, constrained) ||
941
+ constrained) {
942
+ // If constrained, is true it implies that we received an ENOBUFS error
943
+ // but there are no un-acked z-copy records. This situation may arise
944
+ // because the per-process RLIMIT_MEMLOCK limit or the per-socket hard
945
+ // memlock ulimit on the machine may be very small. These limits control
946
+ // the max number of bytes a process/socket can respectively pin to RAM.
947
+ // Tx0cp respects these limits and if a sendmsg tries to send more than
948
+ // this limit, the kernel may return ENOBUFS error. Print a warning
949
+ // message here to allow help with debugging. Grpc should not attempt to
950
+ // raise the limit values.
951
+ if (!constrained) {
952
+ handle_->SetWritable();
953
+ } else {
954
+ #ifdef GRPC_LINUX_ERRQUEUE
955
+ GRPC_LOG_EVERY_N_SEC(
956
+ 1,
957
+ "Tx0cp encountered an ENOBUFS error possibly because one or "
958
+ "both of RLIMIT_MEMLOCK or hard memlock ulimit values are too "
959
+ "small for the intended user. Current system value of "
960
+ "RLIMIT_MEMLOCK is %" PRIu64 " and hard memlock ulimit is %" PRIu64
961
+ ".Consider increasing these values appropriately for the intended "
962
+ "user.",
963
+ GetRLimitMemLockMax(), GetUlimitHardMemLock());
964
+ #endif
965
+ }
966
+ }
967
+ if (sent_length < 0) {
968
+ // If this particular send failed, drop ref taken earlier in this method.
969
+ tcp_zerocopy_send_ctx_->UndoSend();
970
+ if (saved_errno == EAGAIN || saved_errno == ENOBUFS) {
971
+ record->UnwindIfThrottled(unwind_slice_idx, unwind_byte_idx);
972
+ return false;
973
+ } else {
974
+ status = TcpAnnotateError(PosixOSError(saved_errno, "sendmsg"));
975
+ TcpShutdownTracedBufferList();
976
+ return true;
977
+ }
978
+ }
979
+ bytes_counter_ += sent_length;
980
+ record->UpdateOffsetForBytesSent(sending_length,
981
+ static_cast<size_t>(sent_length));
982
+ if (record->AllSlicesSent()) {
983
+ return true;
984
+ }
985
+ }
986
+ }
987
+
988
+ bool PosixEndpointImpl::TcpFlushZerocopy(TcpZerocopySendRecord* record,
989
+ absl::Status& status) {
990
+ bool done = DoFlushZerocopy(record, status);
991
+ if (done) {
992
+ // Either we encountered an error, or we successfully sent all the bytes.
993
+ // In either case, we're done with this record.
994
+ UnrefMaybePutZerocopySendRecord(record);
995
+ }
996
+ return done;
997
+ }
998
+
999
+ bool PosixEndpointImpl::TcpFlush(absl::Status& status) {
1000
+ struct msghdr msg;
1001
+ struct iovec iov[MAX_WRITE_IOVEC];
1002
+ msg_iovlen_type iov_size;
1003
+ ssize_t sent_length = 0;
1004
+ size_t sending_length;
1005
+ size_t trailing;
1006
+ size_t unwind_slice_idx;
1007
+ size_t unwind_byte_idx;
1008
+ int saved_errno;
1009
+ status = absl::OkStatus();
1010
+
1011
+ // We always start at zero, because we eagerly unref and trim the slice
1012
+ // buffer as we write
1013
+ size_t outgoing_slice_idx = 0;
1014
+
1015
+ while (true) {
1016
+ sending_length = 0;
1017
+ unwind_slice_idx = outgoing_slice_idx;
1018
+ unwind_byte_idx = outgoing_byte_idx_;
1019
+ for (iov_size = 0; outgoing_slice_idx != outgoing_buffer_->Count() &&
1020
+ iov_size != MAX_WRITE_IOVEC;
1021
+ iov_size++) {
1022
+ MutableSlice& slice = internal::SliceCast<MutableSlice>(
1023
+ outgoing_buffer_->MutableSliceAt(outgoing_slice_idx));
1024
+ iov[iov_size].iov_base = slice.begin() + outgoing_byte_idx_;
1025
+ iov[iov_size].iov_len = slice.length() - outgoing_byte_idx_;
1026
+
1027
+ sending_length += iov[iov_size].iov_len;
1028
+ outgoing_slice_idx++;
1029
+ outgoing_byte_idx_ = 0;
1030
+ }
1031
+ GPR_ASSERT(iov_size > 0);
1032
+
1033
+ msg.msg_name = nullptr;
1034
+ msg.msg_namelen = 0;
1035
+ msg.msg_iov = iov;
1036
+ msg.msg_iovlen = iov_size;
1037
+ msg.msg_flags = 0;
1038
+ bool tried_sending_message = false;
1039
+ saved_errno = 0;
1040
+ if (outgoing_buffer_arg_ != nullptr) {
1041
+ if (!ts_capable_ || !WriteWithTimestamps(&msg, sending_length,
1042
+ &sent_length, &saved_errno, 0)) {
1043
+ // We could not set socket options to collect Fathom timestamps.
1044
+ // Fallback on writing without timestamps.
1045
+ ts_capable_ = false;
1046
+ TcpShutdownTracedBufferList();
1047
+ } else {
1048
+ tried_sending_message = true;
1049
+ }
1050
+ }
1051
+ if (!tried_sending_message) {
1052
+ msg.msg_control = nullptr;
1053
+ msg.msg_controllen = 0;
1054
+ sent_length = TcpSend(fd_, &msg, &saved_errno);
1055
+ }
1056
+
1057
+ if (sent_length < 0) {
1058
+ if (saved_errno == EAGAIN || saved_errno == ENOBUFS) {
1059
+ outgoing_byte_idx_ = unwind_byte_idx;
1060
+ // unref all and forget about all slices that have been written to this
1061
+ // point
1062
+ for (size_t idx = 0; idx < unwind_slice_idx; ++idx) {
1063
+ outgoing_buffer_->TakeFirst();
1064
+ }
1065
+ return false;
1066
+ } else {
1067
+ status = TcpAnnotateError(PosixOSError(saved_errno, "sendmsg"));
1068
+ outgoing_buffer_->Clear();
1069
+ TcpShutdownTracedBufferList();
1070
+ return true;
1071
+ }
1072
+ }
1073
+
1074
+ GPR_ASSERT(outgoing_byte_idx_ == 0);
1075
+ bytes_counter_ += sent_length;
1076
+ trailing = sending_length - static_cast<size_t>(sent_length);
1077
+ while (trailing > 0) {
1078
+ size_t slice_length;
1079
+ outgoing_slice_idx--;
1080
+ slice_length = outgoing_buffer_->RefSlice(outgoing_slice_idx).length();
1081
+ if (slice_length > trailing) {
1082
+ outgoing_byte_idx_ = slice_length - trailing;
1083
+ break;
1084
+ } else {
1085
+ trailing -= slice_length;
1086
+ }
1087
+ }
1088
+ if (outgoing_slice_idx == outgoing_buffer_->Count()) {
1089
+ outgoing_buffer_->Clear();
1090
+ return true;
1091
+ }
1092
+ }
1093
+ }
1094
+
1095
+ void PosixEndpointImpl::HandleWrite(absl::Status status) {
1096
+ if (!status.ok()) {
1097
+ absl::AnyInvocable<void(absl::Status)> cb_ = std::move(write_cb_);
1098
+ write_cb_ = nullptr;
1099
+ if (current_zerocopy_send_ != nullptr) {
1100
+ UnrefMaybePutZerocopySendRecord(current_zerocopy_send_);
1101
+ current_zerocopy_send_ = nullptr;
1102
+ }
1103
+ cb_(status);
1104
+ Unref();
1105
+ return;
1106
+ }
1107
+ bool flush_result = current_zerocopy_send_ != nullptr
1108
+ ? TcpFlushZerocopy(current_zerocopy_send_, status)
1109
+ : TcpFlush(status);
1110
+ if (!flush_result) {
1111
+ GPR_DEBUG_ASSERT(status.ok());
1112
+ handle_->NotifyOnWrite(on_write_);
1113
+ } else {
1114
+ absl::AnyInvocable<void(absl::Status)> cb_ = std::move(write_cb_);
1115
+ write_cb_ = nullptr;
1116
+ current_zerocopy_send_ = nullptr;
1117
+ cb_(status);
1118
+ Unref();
1119
+ }
1120
+ }
1121
+
1122
+ void PosixEndpointImpl::Write(
1123
+ absl::AnyInvocable<void(absl::Status)> on_writable, SliceBuffer* data,
1124
+ const EventEngine::Endpoint::WriteArgs* args) {
1125
+ absl::Status status = absl::OkStatus();
1126
+ TcpZerocopySendRecord* zerocopy_send_record = nullptr;
1127
+
1128
+ GPR_ASSERT(write_cb_ == nullptr);
1129
+ GPR_DEBUG_ASSERT(current_zerocopy_send_ == nullptr);
1130
+ GPR_DEBUG_ASSERT(data != nullptr);
1131
+
1132
+ if (data->Length() == 0) {
1133
+ on_writable(handle_->IsHandleShutdown()
1134
+ ? TcpAnnotateError(absl::InternalError("EOF"))
1135
+ : status);
1136
+ TcpShutdownTracedBufferList();
1137
+ return;
1138
+ }
1139
+
1140
+ zerocopy_send_record = TcpGetSendZerocopyRecord(*data);
1141
+ if (zerocopy_send_record == nullptr) {
1142
+ // Either not enough bytes, or couldn't allocate a zerocopy context.
1143
+ outgoing_buffer_ = data;
1144
+ outgoing_byte_idx_ = 0;
1145
+ }
1146
+ if (args != nullptr) {
1147
+ outgoing_buffer_arg_ = args->google_specific;
1148
+ }
1149
+ if (outgoing_buffer_arg_) {
1150
+ GPR_ASSERT(poller_->CanTrackErrors());
1151
+ }
1152
+
1153
+ bool flush_result = zerocopy_send_record != nullptr
1154
+ ? TcpFlushZerocopy(zerocopy_send_record, status)
1155
+ : TcpFlush(status);
1156
+ if (!flush_result) {
1157
+ Ref().release();
1158
+ write_cb_ = std::move(on_writable);
1159
+ current_zerocopy_send_ = zerocopy_send_record;
1160
+ handle_->NotifyOnWrite(on_write_);
1161
+ } else {
1162
+ // TODO(vigneshbabu): Consider eventually running this callback inline to
1163
+ // avoid a thread hop. At the time of submission, it causes deadlocks which
1164
+ // should be reolved after ExecCtx removal.
1165
+ engine_->Run([on_writable = std::move(on_writable), status]() mutable {
1166
+ on_writable(status);
1167
+ });
1168
+ }
1169
+ }
1170
+
1171
+ void PosixEndpointImpl::MaybeShutdown(absl::Status why) {
1172
+ if (poller_->CanTrackErrors()) {
1173
+ ZerocopyDisableAndWaitForRemaining();
1174
+ stop_error_notification_.store(true, std::memory_order_release);
1175
+ handle_->SetHasError();
1176
+ }
1177
+ grpc_core::StatusSetInt(&why, grpc_core::StatusIntProperty::kRpcStatus,
1178
+ GRPC_STATUS_UNAVAILABLE);
1179
+ handle_->ShutdownHandle(why);
1180
+ Unref();
1181
+ }
1182
+
1183
+ PosixEndpointImpl ::~PosixEndpointImpl() {
1184
+ handle_->OrphanHandle(on_done_, nullptr, "");
1185
+ delete on_read_;
1186
+ delete on_write_;
1187
+ delete on_error_;
1188
+ }
1189
+
1190
+ PosixEndpointImpl::PosixEndpointImpl(EventHandle* handle,
1191
+ PosixEngineClosure* on_done,
1192
+ std::shared_ptr<EventEngine> engine,
1193
+ MemoryAllocator&& /*allocator*/,
1194
+ const PosixTcpOptions& options)
1195
+ : sock_(PosixSocketWrapper(handle->WrappedFd())),
1196
+ on_done_(on_done),
1197
+ traced_buffers_(),
1198
+ handle_(handle),
1199
+ poller_(handle->Poller()),
1200
+ engine_(engine) {
1201
+ PosixSocketWrapper sock(handle->WrappedFd());
1202
+ fd_ = handle_->WrappedFd();
1203
+ GPR_ASSERT(options.resource_quota != nullptr);
1204
+ auto peer_addr_string = sock.PeerAddressString();
1205
+ memory_owner_ = options.resource_quota->memory_quota()->CreateMemoryOwner(
1206
+ peer_addr_string.ok() ? *peer_addr_string : "");
1207
+ self_reservation_ = memory_owner_.MakeReservation(sizeof(PosixEndpointImpl));
1208
+ auto local_address = sock.LocalAddress();
1209
+ if (local_address.ok()) {
1210
+ local_address_ = *local_address;
1211
+ }
1212
+ auto peer_address = sock.PeerAddress();
1213
+ if (peer_address.ok()) {
1214
+ peer_address_ = *peer_address;
1215
+ }
1216
+ target_length_ = static_cast<double>(options.tcp_read_chunk_size);
1217
+ bytes_read_this_round_ = 0;
1218
+ min_read_chunk_size_ = options.tcp_min_read_chunk_size;
1219
+ max_read_chunk_size_ = options.tcp_max_read_chunk_size;
1220
+ bool zerocopy_enabled =
1221
+ options.tcp_tx_zero_copy_enabled && poller_->CanTrackErrors();
1222
+ #ifdef GRPC_LINUX_ERRQUEUE
1223
+ if (zerocopy_enabled) {
1224
+ if (GetRLimitMemLockMax() == 0) {
1225
+ zerocopy_enabled = false;
1226
+ gpr_log(
1227
+ GPR_ERROR,
1228
+ "Tx zero-copy will not be used by gRPC since RLIMIT_MEMLOCK value is "
1229
+ "not set. Consider raising its value with setrlimit().");
1230
+ } else if (GetUlimitHardMemLock() == 0) {
1231
+ zerocopy_enabled = false;
1232
+ gpr_log(GPR_ERROR,
1233
+ "Tx zero-copy will not be used by gRPC since hard memlock ulimit "
1234
+ "value is not set. Use ulimit -l <value> to set its value.");
1235
+ } else {
1236
+ const int enable = 1;
1237
+ if (setsockopt(fd_, SOL_SOCKET, SO_ZEROCOPY, &enable, sizeof(enable)) !=
1238
+ 0) {
1239
+ zerocopy_enabled = false;
1240
+ gpr_log(GPR_ERROR, "Failed to set zerocopy options on the socket.");
1241
+ }
1242
+ }
1243
+
1244
+ if (zerocopy_enabled) {
1245
+ gpr_log(GPR_INFO,
1246
+ "Tx-zero copy enabled for gRPC sends. RLIMIT_MEMLOCK value = "
1247
+ "%" PRIu64 ",ulimit hard memlock value = %" PRIu64,
1248
+ GetRLimitMemLockMax(), GetUlimitHardMemLock());
1249
+ }
1250
+ }
1251
+ #endif // GRPC_LINUX_ERRQUEUE
1252
+ tcp_zerocopy_send_ctx_ = std::make_unique<TcpZerocopySendCtx>(
1253
+ zerocopy_enabled, options.tcp_tx_zerocopy_max_simultaneous_sends,
1254
+ options.tcp_tx_zerocopy_send_bytes_threshold);
1255
+ #ifdef GRPC_HAVE_TCP_INQ
1256
+ int one = 1;
1257
+ if (setsockopt(fd_, SOL_TCP, TCP_INQ, &one, sizeof(one)) == 0) {
1258
+ inq_capable_ = true;
1259
+ } else {
1260
+ gpr_log(GPR_DEBUG, "cannot set inq fd=%d errno=%d", fd_, errno);
1261
+ inq_capable_ = false;
1262
+ }
1263
+ #else
1264
+ inq_capable_ = false;
1265
+ #endif // GRPC_HAVE_TCP_INQ
1266
+
1267
+ on_read_ = PosixEngineClosure::ToPermanentClosure(
1268
+ [this](absl::Status status) { HandleRead(std::move(status)); });
1269
+ on_write_ = PosixEngineClosure::ToPermanentClosure(
1270
+ [this](absl::Status status) { HandleWrite(std::move(status)); });
1271
+ on_error_ = PosixEngineClosure::ToPermanentClosure(
1272
+ [this](absl::Status status) { HandleError(std::move(status)); });
1273
+
1274
+ // Start being notified on errors if poller can track errors.
1275
+ if (poller_->CanTrackErrors()) {
1276
+ Ref().release();
1277
+ handle_->NotifyOnError(on_error_);
1278
+ }
1279
+ }
1280
+
1281
+ std::unique_ptr<PosixEndpoint> CreatePosixEndpoint(
1282
+ EventHandle* handle, PosixEngineClosure* on_shutdown,
1283
+ std::shared_ptr<EventEngine> engine, MemoryAllocator&& allocator,
1284
+ const PosixTcpOptions& options) {
1285
+ GPR_DEBUG_ASSERT(handle != nullptr);
1286
+ return std::make_unique<PosixEndpoint>(handle, on_shutdown, std::move(engine),
1287
+ std::move(allocator), options);
1288
+ }
1289
+
1290
+ } // namespace experimental
1291
+ } // namespace grpc_event_engine
1292
+
1293
+ #else // GRPC_POSIX_SOCKET_TCP
1294
+
1295
+ namespace grpc_event_engine {
1296
+ namespace experimental {
1297
+
1298
+ std::unique_ptr<PosixEndpoint> CreatePosixEndpoint(
1299
+ EventHandle* /*handle*/, PosixEngineClosure* /*on_shutdown*/,
1300
+ std::shared_ptr<EventEngine> /*engine*/,
1301
+ const PosixTcpOptions& /*options*/) {
1302
+ grpc_core::Crash("Cannot create PosixEndpoint on this platform");
1303
+ }
1304
+
1305
+ } // namespace experimental
1306
+ } // namespace grpc_event_engine
1307
+
1308
+ #endif // GRPC_POSIX_SOCKET_TCP