grpc 1.50.0 → 1.51.0

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

Potentially problematic release.


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

Files changed (459) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +131 -42
  3. data/include/grpc/event_engine/event_engine.h +10 -3
  4. data/include/grpc/event_engine/slice_buffer.h +17 -0
  5. data/include/grpc/grpc.h +0 -10
  6. data/include/grpc/impl/codegen/grpc_types.h +1 -5
  7. data/include/grpc/impl/codegen/port_platform.h +0 -3
  8. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +19 -13
  9. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +1 -0
  10. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  11. data/src/core/ext/filters/client_channel/channel_connectivity.cc +7 -5
  12. data/src/core/ext/filters/client_channel/client_channel.cc +120 -140
  13. data/src/core/ext/filters/client_channel/client_channel.h +3 -4
  14. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +0 -2
  15. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  16. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  17. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
  18. data/src/core/ext/filters/client_channel/connector.h +1 -1
  19. data/src/core/ext/filters/client_channel/dynamic_filters.cc +20 -47
  20. data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
  21. data/src/core/ext/filters/client_channel/health/health_check_client.cc +3 -4
  22. data/src/core/ext/filters/client_channel/http_proxy.cc +0 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
  24. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +5 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +8 -7
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +35 -44
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -3
  29. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +3 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +41 -29
  32. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
  33. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +9 -11
  34. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -12
  35. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +8 -10
  36. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +26 -27
  37. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +7 -9
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +44 -26
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +17 -27
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +13 -7
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +48 -47
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -126
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
  46. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -9
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -32
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -2
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +22 -23
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +50 -52
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +2 -4
  53. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
  54. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -26
  55. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
  56. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
  57. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +63 -46
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +80 -102
  59. data/src/core/ext/filters/client_channel/retry_service_config.cc +192 -234
  60. data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
  61. data/src/core/ext/filters/client_channel/retry_throttle.cc +8 -8
  62. data/src/core/ext/filters/client_channel/retry_throttle.h +8 -7
  63. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
  64. data/src/core/ext/filters/client_channel/subchannel.cc +21 -25
  65. data/src/core/ext/filters/client_channel/subchannel.h +2 -2
  66. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
  67. data/src/core/ext/filters/deadline/deadline_filter.cc +13 -14
  68. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
  70. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  71. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
  72. data/src/core/ext/filters/http/client/http_client_filter.cc +16 -16
  73. data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
  74. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +13 -13
  75. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +34 -34
  76. data/src/core/ext/filters/http/server/http_server_filter.cc +26 -25
  77. data/src/core/ext/filters/message_size/message_size_filter.cc +86 -117
  78. data/src/core/ext/filters/message_size/message_size_filter.h +22 -15
  79. data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
  80. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
  81. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
  82. data/src/core/ext/filters/server_config_selector/server_config_selector.h +1 -1
  83. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -7
  84. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +17 -21
  85. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +57 -72
  86. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
  87. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -1
  88. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +212 -253
  89. data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -11
  90. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -3
  91. data/src/core/ext/transport/chttp2/transport/frame_data.cc +16 -15
  92. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  93. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +13 -13
  94. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -3
  95. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +10 -7
  96. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +15 -17
  97. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +5 -4
  98. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -6
  99. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +1 -1
  100. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +31 -39
  102. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +7 -6
  103. data/src/core/ext/transport/chttp2/transport/internal.h +24 -8
  104. data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -52
  105. data/src/core/ext/transport/chttp2/transport/varint.cc +2 -3
  106. data/src/core/ext/transport/chttp2/transport/varint.h +11 -8
  107. data/src/core/ext/transport/chttp2/transport/writing.cc +16 -16
  108. data/src/core/ext/transport/inproc/inproc_transport.cc +97 -115
  109. data/src/core/ext/xds/certificate_provider_store.cc +4 -4
  110. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
  111. data/src/core/ext/xds/xds_api.cc +15 -68
  112. data/src/core/ext/xds/xds_api.h +3 -7
  113. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  114. data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
  115. data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
  116. data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
  117. data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
  118. data/src/core/ext/xds/xds_client.cc +122 -90
  119. data/src/core/ext/xds/xds_client.h +7 -2
  120. data/src/core/ext/xds/xds_client_grpc.cc +5 -24
  121. data/src/core/ext/xds/xds_cluster.cc +291 -183
  122. data/src/core/ext/xds/xds_cluster.h +11 -15
  123. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +32 -29
  124. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +35 -16
  125. data/src/core/ext/xds/xds_common_types.cc +208 -141
  126. data/src/core/ext/xds/xds_common_types.h +19 -13
  127. data/src/core/ext/xds/xds_endpoint.cc +214 -129
  128. data/src/core/ext/xds/xds_endpoint.h +4 -7
  129. data/src/core/ext/xds/xds_http_fault_filter.cc +56 -43
  130. data/src/core/ext/xds/xds_http_fault_filter.h +13 -21
  131. data/src/core/ext/xds/xds_http_filters.cc +60 -73
  132. data/src/core/ext/xds/xds_http_filters.h +67 -19
  133. data/src/core/ext/xds/xds_http_rbac_filter.cc +152 -207
  134. data/src/core/ext/xds/xds_http_rbac_filter.h +12 -15
  135. data/src/core/ext/xds/xds_lb_policy_registry.cc +122 -169
  136. data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
  137. data/src/core/ext/xds/xds_listener.cc +459 -417
  138. data/src/core/ext/xds/xds_listener.h +43 -47
  139. data/src/core/ext/xds/xds_resource_type.h +3 -11
  140. data/src/core/ext/xds/xds_resource_type_impl.h +8 -13
  141. data/src/core/ext/xds/xds_route_config.cc +94 -80
  142. data/src/core/ext/xds/xds_route_config.h +10 -10
  143. data/src/core/ext/xds/xds_routing.cc +2 -1
  144. data/src/core/ext/xds/xds_routing.h +2 -0
  145. data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -94
  146. data/src/core/ext/xds/xds_transport_grpc.cc +4 -5
  147. data/src/core/lib/address_utils/parse_address.cc +11 -10
  148. data/src/core/lib/channel/channel_args.h +16 -1
  149. data/src/core/lib/channel/channel_stack.cc +23 -20
  150. data/src/core/lib/channel/channel_stack.h +17 -4
  151. data/src/core/lib/channel/channel_stack_builder.cc +4 -7
  152. data/src/core/lib/channel/channel_stack_builder.h +14 -6
  153. data/src/core/lib/channel/channel_stack_builder_impl.cc +25 -7
  154. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
  155. data/src/core/lib/channel/channel_trace.cc +4 -5
  156. data/src/core/lib/channel/channelz.cc +1 -1
  157. data/src/core/lib/channel/connected_channel.cc +695 -35
  158. data/src/core/lib/channel/connected_channel.h +0 -4
  159. data/src/core/lib/channel/promise_based_filter.cc +1004 -140
  160. data/src/core/lib/channel/promise_based_filter.h +364 -87
  161. data/src/core/lib/compression/message_compress.cc +5 -5
  162. data/src/core/lib/debug/event_log.cc +88 -0
  163. data/src/core/lib/debug/event_log.h +81 -0
  164. data/src/core/lib/debug/histogram_view.cc +69 -0
  165. data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
  166. data/src/core/lib/debug/stats.cc +22 -119
  167. data/src/core/lib/debug/stats.h +29 -35
  168. data/src/core/lib/debug/stats_data.cc +224 -73
  169. data/src/core/lib/debug/stats_data.h +263 -122
  170. data/src/core/lib/event_engine/common_closures.h +71 -0
  171. data/src/core/lib/event_engine/default_event_engine.cc +38 -15
  172. data/src/core/lib/event_engine/default_event_engine.h +15 -3
  173. data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
  174. data/src/core/lib/event_engine/memory_allocator.cc +1 -1
  175. data/src/core/lib/event_engine/poller.h +10 -4
  176. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +618 -0
  177. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
  178. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +901 -0
  179. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  180. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  181. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  182. data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +13 -16
  183. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  184. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  185. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +267 -0
  186. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  187. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1270 -0
  188. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +682 -0
  189. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +453 -18
  190. data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
  191. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  192. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1081 -0
  193. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +361 -0
  194. data/src/core/lib/event_engine/posix_engine/timer.h +9 -8
  195. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +57 -194
  196. data/src/core/lib/event_engine/posix_engine/timer_manager.h +21 -49
  197. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +301 -0
  198. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +179 -0
  199. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +126 -0
  200. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  201. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +151 -0
  202. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +45 -0
  203. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  204. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  205. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  206. data/src/core/lib/event_engine/slice.cc +7 -6
  207. data/src/core/lib/event_engine/slice_buffer.cc +2 -2
  208. data/src/core/lib/event_engine/thread_pool.cc +106 -25
  209. data/src/core/lib/event_engine/thread_pool.h +32 -9
  210. data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
  211. data/src/core/lib/event_engine/windows/windows_engine.cc +18 -12
  212. data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
  213. data/src/core/lib/experiments/config.cc +1 -1
  214. data/src/core/lib/experiments/experiments.cc +13 -2
  215. data/src/core/lib/experiments/experiments.h +8 -1
  216. data/src/core/lib/gpr/cpu_linux.cc +6 -2
  217. data/src/core/lib/gpr/log_linux.cc +3 -4
  218. data/src/core/lib/gpr/string.h +1 -1
  219. data/src/core/lib/gpr/tmpfile_posix.cc +3 -2
  220. data/src/core/lib/gprpp/load_file.cc +75 -0
  221. data/src/core/lib/gprpp/load_file.h +33 -0
  222. data/src/core/lib/gprpp/per_cpu.h +46 -0
  223. data/src/core/lib/gprpp/stat_posix.cc +5 -4
  224. data/src/core/lib/gprpp/stat_windows.cc +3 -2
  225. data/src/core/lib/gprpp/status_helper.h +1 -3
  226. data/src/core/lib/gprpp/strerror.cc +41 -0
  227. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/strerror.h} +9 -13
  228. data/src/core/lib/gprpp/thd_windows.cc +1 -2
  229. data/src/core/lib/gprpp/time.cc +3 -4
  230. data/src/core/lib/gprpp/time.h +13 -2
  231. data/src/core/lib/gprpp/validation_errors.h +18 -1
  232. data/src/core/lib/http/httpcli.cc +40 -44
  233. data/src/core/lib/http/httpcli.h +6 -5
  234. data/src/core/lib/http/httpcli_security_connector.cc +4 -6
  235. data/src/core/lib/http/parser.cc +54 -65
  236. data/src/core/lib/iomgr/buffer_list.cc +105 -116
  237. data/src/core/lib/iomgr/buffer_list.h +60 -44
  238. data/src/core/lib/iomgr/call_combiner.cc +11 -10
  239. data/src/core/lib/iomgr/call_combiner.h +3 -4
  240. data/src/core/lib/iomgr/cfstream_handle.cc +13 -16
  241. data/src/core/lib/iomgr/closure.h +49 -5
  242. data/src/core/lib/iomgr/combiner.cc +2 -2
  243. data/src/core/lib/iomgr/endpoint.h +1 -1
  244. data/src/core/lib/iomgr/endpoint_cfstream.cc +26 -25
  245. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
  246. data/src/core/lib/iomgr/error.cc +27 -42
  247. data/src/core/lib/iomgr/error.h +22 -152
  248. data/src/core/lib/iomgr/ev_apple.cc +4 -4
  249. data/src/core/lib/iomgr/ev_epoll1_linux.cc +26 -25
  250. data/src/core/lib/iomgr/ev_poll_posix.cc +27 -31
  251. data/src/core/lib/iomgr/exec_ctx.cc +3 -4
  252. data/src/core/lib/iomgr/exec_ctx.h +2 -3
  253. data/src/core/lib/iomgr/executor.cc +1 -2
  254. data/src/core/lib/iomgr/internal_errqueue.cc +3 -1
  255. data/src/core/lib/iomgr/iocp_windows.cc +1 -0
  256. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  257. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -1
  258. data/src/core/lib/iomgr/iomgr_windows.cc +2 -1
  259. data/src/core/lib/iomgr/load_file.cc +5 -9
  260. data/src/core/lib/iomgr/lockfree_event.cc +10 -10
  261. data/src/core/lib/iomgr/pollset_windows.cc +4 -4
  262. data/src/core/lib/iomgr/python_util.h +2 -2
  263. data/src/core/lib/iomgr/resolve_address.cc +8 -3
  264. data/src/core/lib/iomgr/resolve_address.h +3 -4
  265. data/src/core/lib/iomgr/resolve_address_impl.h +1 -1
  266. data/src/core/lib/iomgr/resolve_address_posix.cc +14 -25
  267. data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
  268. data/src/core/lib/iomgr/resolve_address_windows.cc +14 -17
  269. data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
  270. data/src/core/lib/iomgr/socket_utils_common_posix.cc +30 -29
  271. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -0
  272. data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
  273. data/src/core/lib/iomgr/socket_windows.cc +2 -2
  274. data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -10
  275. data/src/core/lib/iomgr/tcp_client_posix.cc +31 -35
  276. data/src/core/lib/iomgr/tcp_client_windows.cc +8 -12
  277. data/src/core/lib/iomgr/tcp_posix.cc +92 -108
  278. data/src/core/lib/iomgr/tcp_server_posix.cc +34 -34
  279. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  280. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +18 -21
  281. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +12 -13
  282. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +1 -1
  283. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -29
  284. data/src/core/lib/iomgr/tcp_windows.cc +27 -34
  285. data/src/core/lib/iomgr/timer.h +8 -8
  286. data/src/core/lib/iomgr/timer_generic.cc +9 -15
  287. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
  288. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +4 -3
  289. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +10 -8
  290. data/src/core/lib/json/json_channel_args.h +42 -0
  291. data/src/core/lib/json/json_object_loader.cc +7 -2
  292. data/src/core/lib/json/json_object_loader.h +22 -0
  293. data/src/core/lib/json/json_util.cc +5 -5
  294. data/src/core/lib/json/json_util.h +4 -4
  295. data/src/core/lib/load_balancing/lb_policy.cc +1 -1
  296. data/src/core/lib/load_balancing/lb_policy.h +4 -0
  297. data/src/core/lib/load_balancing/subchannel_interface.h +0 -7
  298. data/src/core/lib/matchers/matchers.cc +3 -4
  299. data/src/core/lib/promise/activity.cc +16 -2
  300. data/src/core/lib/promise/activity.h +38 -15
  301. data/src/core/lib/promise/arena_promise.h +80 -51
  302. data/src/core/lib/promise/context.h +13 -6
  303. data/src/core/lib/promise/detail/basic_seq.h +9 -28
  304. data/src/core/lib/promise/detail/promise_factory.h +58 -10
  305. data/src/core/lib/promise/detail/status.h +28 -0
  306. data/src/core/lib/promise/detail/switch.h +1455 -0
  307. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +3 -1
  308. data/src/core/lib/promise/for_each.h +129 -0
  309. data/src/core/lib/promise/loop.h +7 -5
  310. data/src/core/lib/promise/map_pipe.h +87 -0
  311. data/src/core/lib/promise/pipe.cc +19 -0
  312. data/src/core/lib/promise/pipe.h +505 -0
  313. data/src/core/lib/promise/poll.h +13 -0
  314. data/src/core/lib/promise/seq.h +3 -5
  315. data/src/core/lib/promise/sleep.cc +5 -4
  316. data/src/core/lib/promise/sleep.h +1 -2
  317. data/src/core/lib/promise/try_concurrently.h +341 -0
  318. data/src/core/lib/promise/try_seq.h +10 -13
  319. data/src/core/lib/resolver/server_address.cc +1 -0
  320. data/src/core/lib/resolver/server_address.h +1 -3
  321. data/src/core/lib/resource_quota/api.cc +0 -1
  322. data/src/core/lib/resource_quota/arena.cc +19 -0
  323. data/src/core/lib/resource_quota/arena.h +89 -0
  324. data/src/core/lib/resource_quota/memory_quota.cc +1 -0
  325. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
  326. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
  327. data/src/core/lib/security/authorization/matchers.cc +25 -22
  328. data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
  329. data/src/core/lib/security/context/security_context.h +10 -0
  330. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
  331. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  332. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
  333. data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
  334. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
  335. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
  336. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
  337. data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -0
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -24
  339. data/src/core/lib/security/credentials/iam/iam_credentials.cc +1 -0
  340. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -2
  341. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
  342. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -5
  343. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +24 -30
  344. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -5
  345. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +3 -3
  346. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +19 -27
  347. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
  348. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -41
  349. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
  350. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +6 -11
  351. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +8 -15
  352. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  353. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +2 -6
  354. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +1 -4
  355. data/src/core/lib/security/security_connector/local/local_security_connector.cc +7 -11
  356. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +9 -14
  357. data/src/core/lib/security/security_connector/ssl_utils.cc +5 -7
  358. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -27
  359. data/src/core/lib/security/transport/client_auth_filter.cc +1 -1
  360. data/src/core/lib/security/transport/secure_endpoint.cc +26 -28
  361. data/src/core/lib/security/transport/security_handshaker.cc +53 -53
  362. data/src/core/lib/security/transport/server_auth_filter.cc +21 -21
  363. data/src/core/lib/security/transport/tsi_error.cc +6 -3
  364. data/src/core/lib/security/util/json_util.cc +4 -5
  365. data/src/core/lib/service_config/service_config.h +1 -1
  366. data/src/core/lib/service_config/service_config_impl.cc +111 -158
  367. data/src/core/lib/service_config/service_config_impl.h +14 -17
  368. data/src/core/lib/service_config/service_config_parser.cc +14 -31
  369. data/src/core/lib/service_config/service_config_parser.h +14 -10
  370. data/src/core/lib/slice/b64.cc +2 -2
  371. data/src/core/lib/slice/slice.cc +7 -1
  372. data/src/core/lib/slice/slice.h +19 -6
  373. data/src/core/lib/slice/slice_buffer.cc +13 -14
  374. data/src/core/lib/slice/slice_internal.h +13 -21
  375. data/src/core/lib/slice/slice_refcount.h +34 -19
  376. data/src/core/lib/surface/byte_buffer.cc +3 -4
  377. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  378. data/src/core/lib/surface/call.cc +1366 -239
  379. data/src/core/lib/surface/call.h +44 -0
  380. data/src/core/lib/surface/call_details.cc +3 -3
  381. data/src/core/lib/surface/call_trace.cc +113 -0
  382. data/src/core/lib/surface/call_trace.h +30 -0
  383. data/src/core/lib/surface/channel.cc +44 -49
  384. data/src/core/lib/surface/channel.h +9 -1
  385. data/src/core/lib/surface/channel_ping.cc +1 -1
  386. data/src/core/lib/surface/channel_stack_type.cc +4 -0
  387. data/src/core/lib/surface/channel_stack_type.h +2 -0
  388. data/src/core/lib/surface/completion_queue.cc +38 -52
  389. data/src/core/lib/surface/init.cc +8 -39
  390. data/src/core/lib/surface/init_internally.h +8 -0
  391. data/src/core/lib/surface/lame_client.cc +10 -8
  392. data/src/core/lib/surface/server.cc +48 -70
  393. data/src/core/lib/surface/server.h +3 -4
  394. data/src/core/lib/surface/validate_metadata.cc +11 -12
  395. data/src/core/lib/surface/version.cc +2 -2
  396. data/src/core/lib/transport/connectivity_state.cc +2 -2
  397. data/src/core/lib/transport/error_utils.cc +34 -28
  398. data/src/core/lib/transport/error_utils.h +3 -3
  399. data/src/core/lib/transport/handshaker.cc +14 -14
  400. data/src/core/lib/transport/handshaker.h +1 -1
  401. data/src/core/lib/transport/handshaker_factory.h +26 -0
  402. data/src/core/lib/transport/handshaker_registry.cc +8 -2
  403. data/src/core/lib/transport/handshaker_registry.h +3 -4
  404. data/src/core/lib/transport/http_connect_handshaker.cc +23 -24
  405. data/src/core/lib/transport/metadata_batch.h +17 -1
  406. data/src/core/lib/transport/parsed_metadata.cc +2 -6
  407. data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
  408. data/src/core/lib/transport/transport.cc +63 -17
  409. data/src/core/lib/transport/transport.h +64 -68
  410. data/src/core/lib/transport/transport_impl.h +1 -1
  411. data/src/core/lib/transport/transport_op_string.cc +7 -6
  412. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -10
  413. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -14
  414. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +10 -10
  415. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +8 -8
  416. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
  417. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +7 -7
  418. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +7 -6
  419. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  420. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +5 -5
  421. data/src/core/tsi/fake_transport_security.cc +3 -3
  422. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +7 -3
  423. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  424. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +6 -2
  425. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +0 -2
  426. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +0 -3
  427. data/src/ruby/lib/grpc/version.rb +1 -1
  428. data/src/ruby/spec/channel_spec.rb +0 -43
  429. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  430. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  431. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  432. data/third_party/zlib/compress.c +3 -3
  433. data/third_party/zlib/crc32.c +21 -12
  434. data/third_party/zlib/deflate.c +112 -106
  435. data/third_party/zlib/deflate.h +2 -2
  436. data/third_party/zlib/gzlib.c +1 -1
  437. data/third_party/zlib/gzread.c +3 -5
  438. data/third_party/zlib/gzwrite.c +1 -1
  439. data/third_party/zlib/infback.c +10 -7
  440. data/third_party/zlib/inflate.c +5 -2
  441. data/third_party/zlib/inftrees.c +2 -2
  442. data/third_party/zlib/inftrees.h +1 -1
  443. data/third_party/zlib/trees.c +61 -62
  444. data/third_party/zlib/uncompr.c +2 -2
  445. data/third_party/zlib/zconf.h +16 -3
  446. data/third_party/zlib/zlib.h +10 -10
  447. data/third_party/zlib/zutil.c +9 -7
  448. data/third_party/zlib/zutil.h +1 -0
  449. metadata +55 -18
  450. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
  451. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
  452. data/src/core/lib/event_engine/executor/threaded_executor.h +0 -44
  453. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  454. data/src/core/lib/gpr/murmur_hash.h +0 -29
  455. data/src/core/lib/gpr/tls.h +0 -156
  456. data/src/core/lib/promise/call_push_pull.h +0 -148
  457. data/src/core/lib/slice/slice_api.cc +0 -39
  458. data/src/core/lib/slice/slice_buffer_api.cc +0 -35
  459. data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -0,0 +1,682 @@
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
+
15
+ #ifndef GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_POSIX_ENDPOINT_H
16
+ #define GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_POSIX_ENDPOINT_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ // IWYU pragma: no_include <bits/types/struct_iovec.h>
21
+
22
+ #include <atomic>
23
+ #include <cstdint>
24
+ #include <memory>
25
+ #include <new>
26
+ #include <utility>
27
+
28
+ #include "absl/base/thread_annotations.h"
29
+ #include "absl/container/flat_hash_map.h"
30
+ #include "absl/functional/any_invocable.h"
31
+ #include "absl/hash/hash.h"
32
+ #include "absl/meta/type_traits.h"
33
+ #include "absl/status/status.h"
34
+
35
+ #include <grpc/event_engine/event_engine.h>
36
+ #include <grpc/event_engine/memory_allocator.h>
37
+ #include <grpc/event_engine/slice_buffer.h>
38
+ #include <grpc/support/alloc.h>
39
+ #include <grpc/support/log.h>
40
+
41
+ #include "src/core/lib/event_engine/posix_engine/event_poller.h"
42
+ #include "src/core/lib/event_engine/posix_engine/posix_engine_closure.h"
43
+ #include "src/core/lib/event_engine/posix_engine/tcp_socket_utils.h"
44
+ #include "src/core/lib/event_engine/posix_engine/traced_buffer_list.h"
45
+ #include "src/core/lib/gprpp/ref_counted.h"
46
+ #include "src/core/lib/gprpp/sync.h"
47
+ #include "src/core/lib/iomgr/port.h"
48
+ #include "src/core/lib/resource_quota/memory_quota.h"
49
+
50
+ #ifdef GRPC_POSIX_SOCKET_TCP
51
+
52
+ #include <sys/socket.h> // IWYU pragma: keep
53
+ #include <sys/types.h> // IWYU pragma: keep
54
+
55
+ #ifdef GRPC_MSG_IOVLEN_TYPE
56
+ typedef GRPC_MSG_IOVLEN_TYPE msg_iovlen_type;
57
+ #else
58
+ typedef size_t msg_iovlen_type;
59
+ #endif
60
+
61
+ #endif // GRPC_POSIX_SOCKET_TCP
62
+
63
+ namespace grpc_event_engine {
64
+ namespace posix_engine {
65
+
66
+ #ifdef GRPC_POSIX_SOCKET_TCP
67
+
68
+ class TcpZerocopySendRecord {
69
+ public:
70
+ TcpZerocopySendRecord() { buf_.Clear(); };
71
+
72
+ ~TcpZerocopySendRecord() { DebugAssertEmpty(); }
73
+
74
+ // TcpZerocopySendRecord contains a slice buffer holding the slices to be
75
+ // sent. Given the slices that we wish to send, and the current offset into
76
+ // the slice buffer (indicating which have already been sent), populate an
77
+ // iovec array that will be used for a zerocopy enabled sendmsg().
78
+ // unwind_slice_idx - input/output parameter. It indicates the index of last
79
+ // slice whose contents were partially sent in the previous sendmsg. After
80
+ // this function returns, it gets updated to to a new offset
81
+ // depending on the number of bytes which are decided to be sent in the
82
+ // current sendmsg.
83
+ // unwind_byte_idx - input/output parameter. It indicates the byte offset
84
+ // within the last slice whose contents were partially sent in the previous
85
+ // sendmsg. After this function returns, it gets updated to a new offset
86
+ // depending on the number of bytes which are decided to be sent in the
87
+ // current sendmsg.
88
+ // sending_length - total number of bytes to be sent in the current sendmsg.
89
+ // iov - An iovec array containing the bytes to be sent in the current
90
+ // sendmsg.
91
+ // Returns: the number of entries in the iovec array.
92
+ //
93
+ msg_iovlen_type PopulateIovs(size_t* unwind_slice_idx,
94
+ size_t* unwind_byte_idx, size_t* sending_length,
95
+ iovec* iov);
96
+
97
+ // A sendmsg() may not be able to send the bytes that we requested at this
98
+ // time, returning EAGAIN (possibly due to backpressure). In this case,
99
+ // unwind the offset into the slice buffer so we retry sending these bytes.
100
+ void UnwindIfThrottled(size_t unwind_slice_idx, size_t unwind_byte_idx) {
101
+ out_offset_.byte_idx = unwind_byte_idx;
102
+ out_offset_.slice_idx = unwind_slice_idx;
103
+ }
104
+
105
+ // Update the offset into the slice buffer based on how much we wanted to sent
106
+ // vs. what sendmsg() actually sent (which may be lower, possibly due to
107
+ // backpressure).
108
+ void UpdateOffsetForBytesSent(size_t sending_length, size_t actually_sent);
109
+
110
+ // Indicates whether all underlying data has been sent or not.
111
+ bool AllSlicesSent() { return out_offset_.slice_idx == buf_.Count(); }
112
+
113
+ // Reset this structure for a new tcp_write() with zerocopy.
114
+ void PrepareForSends(
115
+ grpc_event_engine::experimental::SliceBuffer& slices_to_send) {
116
+ DebugAssertEmpty();
117
+ out_offset_.slice_idx = 0;
118
+ out_offset_.byte_idx = 0;
119
+ buf_.Swap(slices_to_send);
120
+ Ref();
121
+ }
122
+
123
+ // References: 1 reference per sendmsg(), and 1 for the tcp_write().
124
+ void Ref() { ref_.fetch_add(1, std::memory_order_relaxed); }
125
+
126
+ // Unref: called when we get an error queue notification for a sendmsg(), if a
127
+ // sendmsg() failed or when tcp_write() is done.
128
+ bool Unref() {
129
+ const intptr_t prior = ref_.fetch_sub(1, std::memory_order_acq_rel);
130
+ GPR_DEBUG_ASSERT(prior > 0);
131
+ if (prior == 1) {
132
+ AllSendsComplete();
133
+ return true;
134
+ }
135
+ return false;
136
+ }
137
+
138
+ private:
139
+ struct OutgoingOffset {
140
+ size_t slice_idx = 0;
141
+ size_t byte_idx = 0;
142
+ };
143
+
144
+ void DebugAssertEmpty() {
145
+ GPR_DEBUG_ASSERT(buf_.Count() == 0);
146
+ GPR_DEBUG_ASSERT(buf_.Length() == 0);
147
+ GPR_DEBUG_ASSERT(ref_.load(std::memory_order_relaxed) == 0);
148
+ }
149
+
150
+ // When all sendmsg() calls associated with this tcp_write() have been
151
+ // completed (ie. we have received the notifications for each sequence number
152
+ // for each sendmsg()) and all reference counts have been dropped, drop our
153
+ // reference to the underlying data since we no longer need it.
154
+ void AllSendsComplete() {
155
+ GPR_DEBUG_ASSERT(ref_.load(std::memory_order_relaxed) == 0);
156
+ buf_.Clear();
157
+ }
158
+
159
+ grpc_event_engine::experimental::SliceBuffer buf_;
160
+ std::atomic<intptr_t> ref_{0};
161
+ OutgoingOffset out_offset_;
162
+ };
163
+
164
+ class TcpZerocopySendCtx {
165
+ public:
166
+ static constexpr int kDefaultMaxSends = 4;
167
+ static constexpr size_t kDefaultSendBytesThreshold = 16 * 1024; // 16KB
168
+
169
+ explicit TcpZerocopySendCtx(
170
+ bool zerocopy_enabled, int max_sends = kDefaultMaxSends,
171
+ size_t send_bytes_threshold = kDefaultSendBytesThreshold)
172
+ : max_sends_(max_sends),
173
+ free_send_records_size_(max_sends),
174
+ threshold_bytes_(send_bytes_threshold) {
175
+ send_records_ = static_cast<TcpZerocopySendRecord*>(
176
+ gpr_malloc(max_sends * sizeof(*send_records_)));
177
+ free_send_records_ = static_cast<TcpZerocopySendRecord**>(
178
+ gpr_malloc(max_sends * sizeof(*free_send_records_)));
179
+ if (send_records_ == nullptr || free_send_records_ == nullptr) {
180
+ gpr_free(send_records_);
181
+ gpr_free(free_send_records_);
182
+ gpr_log(GPR_INFO, "Disabling TCP TX zerocopy due to memory pressure.\n");
183
+ memory_limited_ = true;
184
+ enabled_ = false;
185
+ } else {
186
+ for (int idx = 0; idx < max_sends_; ++idx) {
187
+ new (send_records_ + idx) TcpZerocopySendRecord();
188
+ free_send_records_[idx] = send_records_ + idx;
189
+ }
190
+ enabled_ = zerocopy_enabled;
191
+ }
192
+ }
193
+
194
+ ~TcpZerocopySendCtx() {
195
+ if (send_records_ != nullptr) {
196
+ for (int idx = 0; idx < max_sends_; ++idx) {
197
+ send_records_[idx].~TcpZerocopySendRecord();
198
+ }
199
+ }
200
+ gpr_free(send_records_);
201
+ gpr_free(free_send_records_);
202
+ }
203
+
204
+ // True if we were unable to allocate the various bookkeeping structures at
205
+ // transport initialization time. If memory limited, we do not zerocopy.
206
+ bool MemoryLimited() const { return memory_limited_; }
207
+
208
+ // TCP send zerocopy maintains an implicit sequence number for every
209
+ // successful sendmsg() with zerocopy enabled; the kernel later gives us an
210
+ // error queue notification with this sequence number indicating that the
211
+ // underlying data buffers that we sent can now be released. Once that
212
+ // notification is received, we can release the buffers associated with this
213
+ // zerocopy send record. Here, we associate the sequence number with the data
214
+ // buffers that were sent with the corresponding call to sendmsg().
215
+ void NoteSend(TcpZerocopySendRecord* record) {
216
+ record->Ref();
217
+ {
218
+ grpc_core::MutexLock lock(&mu_);
219
+ is_in_write_ = true;
220
+ AssociateSeqWithSendRecordLocked(last_send_, record);
221
+ }
222
+ ++last_send_;
223
+ }
224
+
225
+ // If sendmsg() actually failed, though, we need to revert the sequence number
226
+ // that we speculatively bumped before calling sendmsg(). Note that we bump
227
+ // this sequence number and perform relevant bookkeeping (see: NoteSend())
228
+ // *before* calling sendmsg() since, if we called it *after* sendmsg(), then
229
+ // there is a possible race with the release notification which could occur on
230
+ // another thread before we do the necessary bookkeeping. Hence, calling
231
+ // NoteSend() *before* sendmsg() and implementing an undo function is needed.
232
+ void UndoSend() {
233
+ --last_send_;
234
+ if (ReleaseSendRecord(last_send_)->Unref()) {
235
+ // We should still be holding the ref taken by tcp_write().
236
+ GPR_DEBUG_ASSERT(0);
237
+ }
238
+ }
239
+
240
+ // Simply associate this send record (and the underlying sent data buffers)
241
+ // with the implicit sequence number for this zerocopy sendmsg().
242
+ void AssociateSeqWithSendRecordLocked(uint32_t seq,
243
+ TcpZerocopySendRecord* record)
244
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
245
+ ctx_lookup_.emplace(seq, record);
246
+ }
247
+
248
+ // Get a send record for a send that we wish to do with zerocopy.
249
+ TcpZerocopySendRecord* GetSendRecord() {
250
+ grpc_core::MutexLock lock(&mu_);
251
+ return TryGetSendRecordLocked();
252
+ }
253
+
254
+ // A given send record corresponds to a single tcp_write() with zerocopy
255
+ // enabled. This can result in several sendmsg() calls to flush all of the
256
+ // data to wire. Each sendmsg() takes a reference on the
257
+ // TcpZerocopySendRecord, and corresponds to a single sequence number.
258
+ // ReleaseSendRecord releases a reference on TcpZerocopySendRecord for a
259
+ // single sequence number. This is called either when we receive the relevant
260
+ // error queue notification (saying that we can discard the underlying
261
+ // buffers for this sendmsg()) is received from the kernel - or, in case
262
+ // sendmsg() was unsuccessful to begin with.
263
+ TcpZerocopySendRecord* ReleaseSendRecord(uint32_t seq) {
264
+ grpc_core::MutexLock lock(&mu_);
265
+ return ReleaseSendRecordLocked(seq);
266
+ }
267
+
268
+ // After all the references to a TcpZerocopySendRecord are released, we can
269
+ // add it back to the pool (of size max_sends_). Note that we can only have
270
+ // max_sends_ tcp_write() instances with zerocopy enabled in flight at the
271
+ // same time.
272
+ void PutSendRecord(TcpZerocopySendRecord* record) {
273
+ grpc_core::MutexLock lock(&mu_);
274
+ GPR_DEBUG_ASSERT(record >= send_records_ &&
275
+ record < send_records_ + max_sends_);
276
+ PutSendRecordLocked(record);
277
+ }
278
+
279
+ // Indicate that we are disposing of this zerocopy context. This indicator
280
+ // will prevent new zerocopy writes from being issued.
281
+ void Shutdown() { shutdown_.store(true, std::memory_order_release); }
282
+
283
+ // Indicates that there are no inflight tcp_write() instances with zerocopy
284
+ // enabled.
285
+ bool AllSendRecordsEmpty() {
286
+ grpc_core::MutexLock lock(&mu_);
287
+ return free_send_records_size_ == max_sends_;
288
+ }
289
+
290
+ bool Enabled() const { return enabled_; }
291
+
292
+ // Only use zerocopy if we are sending at least this many bytes. The
293
+ // additional overhead of reading the error queue for notifications means that
294
+ // zerocopy is not useful for small transfers.
295
+ size_t ThresholdBytes() const { return threshold_bytes_; }
296
+
297
+ // Expected to be called by handler reading messages from the err queue.
298
+ // It is used to indicate that some optmem memory is now available. It returns
299
+ // true to tell the caller to mark the file descriptor as immediately
300
+ // writable.
301
+ //
302
+ // OptMem (controlled by the kernel option optmem_max) refers to the memory
303
+ // allocated to the cmsg list maintained by the kernel that contains "extra"
304
+ // packet information like SCM_RIGHTS or IP_TTL. Increasing this option allows
305
+ // the kernel to allocate more memory as needed for more control messages that
306
+ // need to be sent for each socket connected.
307
+ //
308
+ // If a write is currently in progress on the socket (ie. we have issued a
309
+ // sendmsg() and are about to check its return value) then we set omem state
310
+ // to CHECK to make the sending thread know that some tcp_omem was
311
+ // concurrently freed even if sendmsg() returns ENOBUFS. In this case, since
312
+ // there is already an active send thread, we do not need to mark the
313
+ // socket writeable, so we return false.
314
+ //
315
+ // If there was no write in progress on the socket, and the socket was not
316
+ // marked as FULL, then we need not mark the socket writeable now that some
317
+ // tcp_omem memory is freed since it was not considered as blocked on
318
+ // tcp_omem to begin with. So in this case, return false.
319
+ //
320
+ // But, if a write was not in progress and the omem state was FULL, then we
321
+ // need to mark the socket writeable since it is no longer blocked by
322
+ // tcp_omem. In this case, return true.
323
+ //
324
+ // Please refer to the STATE TRANSITION DIAGRAM below for more details.
325
+ //
326
+ bool UpdateZeroCopyOptMemStateAfterFree() {
327
+ grpc_core::MutexLock lock(&mu_);
328
+ if (is_in_write_) {
329
+ zcopy_enobuf_state_ = OptMemState::kCheck;
330
+ return false;
331
+ }
332
+ GPR_DEBUG_ASSERT(zcopy_enobuf_state_ != OptMemState::kCheck);
333
+ if (zcopy_enobuf_state_ == OptMemState::kFull) {
334
+ // A previous sendmsg attempt was blocked by ENOBUFS. Return true to
335
+ // mark the fd as writable so the next write attempt could be made.
336
+ zcopy_enobuf_state_ = OptMemState::kOpen;
337
+ return true;
338
+ } else if (zcopy_enobuf_state_ == OptMemState::kOpen) {
339
+ // No need to mark the fd as writable because the previous write
340
+ // attempt did not encounter ENOBUFS.
341
+ return false;
342
+ } else {
343
+ // This state should never be reached because it implies that the previous
344
+ // state was CHECK and is_in_write is false. This means that after the
345
+ // previous sendmsg returned and set is_in_write to false, it did
346
+ // not update the z-copy change from CHECK to OPEN.
347
+ GPR_ASSERT(false && "OMem state error!");
348
+ }
349
+ }
350
+
351
+ // Expected to be called by the thread calling sendmsg after the syscall
352
+ // invocation. is complete. If an ENOBUF is seen, it checks if the error
353
+ // handler (Tx0cp completions) has already run and free'ed up some OMem. It
354
+ // returns true indicating that the write can be attempted again immediately.
355
+ // If ENOBUFS was seen but no Tx0cp completions have been received between the
356
+ // sendmsg() and us taking this lock, then tcp_omem is still full from our
357
+ // point of view. Therefore, we do not signal that the socket is writeable
358
+ // with respect to the availability of tcp_omem. Therefore the function
359
+ // returns false. This indicates that another write should not be attempted
360
+ // immediately and the calling thread should wait until the socket is writable
361
+ // again. If ENOBUFS was not seen, then again return false because the next
362
+ // write should be attempted only when the socket is writable again.
363
+ //
364
+ // Please refer to the STATE TRANSITION DIAGRAM below for more details.
365
+ //
366
+ bool UpdateZeroCopyOptMemStateAfterSend(bool seen_enobuf, bool& constrained) {
367
+ grpc_core::MutexLock lock(&mu_);
368
+ is_in_write_ = false;
369
+ constrained = false;
370
+ if (seen_enobuf) {
371
+ if (ctx_lookup_.size() == 1) {
372
+ // There is no un-acked z-copy record. Set constrained to true to
373
+ // indicate that we are re-source constrained because we're seeing
374
+ // ENOBUFS even for the first record. This indicates that either
375
+ // the process does not have hard memlock ulimit or RLIMIT_MEMLOCK
376
+ // configured correctly.
377
+ constrained = true;
378
+ }
379
+ if (zcopy_enobuf_state_ == OptMemState::kCheck) {
380
+ zcopy_enobuf_state_ = OptMemState::kOpen;
381
+ return true;
382
+ } else {
383
+ zcopy_enobuf_state_ = OptMemState::kFull;
384
+ }
385
+ } else if (zcopy_enobuf_state_ != OptMemState::kOpen) {
386
+ zcopy_enobuf_state_ = OptMemState::kOpen;
387
+ }
388
+ return false;
389
+ }
390
+
391
+ private:
392
+ // STATE TRANSITION DIAGRAM
393
+ //
394
+ // sendmsg succeeds Tx-zero copy succeeds and there is no active sendmsg
395
+ // ----<<--+ +------<<-------------------------------------+
396
+ // | | | |
397
+ // | | v sendmsg returns ENOBUFS |
398
+ // +-----> OPEN ------------->>-------------------------> FULL
399
+ // ^ |
400
+ // | |
401
+ // | sendmsg completes |
402
+ // +----<<---------- CHECK <-------<<-------------+
403
+ // Tx-zero copy succeeds and there is
404
+ // an active sendmsg
405
+ //
406
+ // OptMem (controlled by the kernel option optmem_max) refers to the memory
407
+ // allocated to the cmsg list maintained by the kernel that contains "extra"
408
+ // packet information like SCM_RIGHTS or IP_TTL. Increasing this option allows
409
+ // the kernel to allocate more memory as needed for more control messages that
410
+ // need to be sent for each socket connected. Each tx zero copy sendmsg has
411
+ // a corresponding entry added into the Optmem queue. The entry is popped
412
+ // from the Optmem queue when the zero copy send is complete.
413
+ enum class OptMemState : int8_t {
414
+ kOpen, // Everything is clear and omem is not full.
415
+ kFull, // The last sendmsg() has returned with an errno of ENOBUFS.
416
+ kCheck, // Error queue is read while is_in_write_ was true, so we should
417
+ // check this state after the sendmsg.
418
+ };
419
+
420
+ TcpZerocopySendRecord* ReleaseSendRecordLocked(uint32_t seq)
421
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
422
+ auto iter = ctx_lookup_.find(seq);
423
+ GPR_DEBUG_ASSERT(iter != ctx_lookup_.end());
424
+ TcpZerocopySendRecord* record = iter->second;
425
+ ctx_lookup_.erase(iter);
426
+ return record;
427
+ }
428
+
429
+ TcpZerocopySendRecord* TryGetSendRecordLocked()
430
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
431
+ if (shutdown_.load(std::memory_order_acquire)) {
432
+ return nullptr;
433
+ }
434
+ if (free_send_records_size_ == 0) {
435
+ return nullptr;
436
+ }
437
+ free_send_records_size_--;
438
+ return free_send_records_[free_send_records_size_];
439
+ }
440
+
441
+ void PutSendRecordLocked(TcpZerocopySendRecord* record)
442
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
443
+ GPR_DEBUG_ASSERT(free_send_records_size_ < max_sends_);
444
+ free_send_records_[free_send_records_size_] = record;
445
+ free_send_records_size_++;
446
+ }
447
+
448
+ TcpZerocopySendRecord* send_records_ ABSL_GUARDED_BY(mu_);
449
+ TcpZerocopySendRecord** free_send_records_ ABSL_GUARDED_BY(mu_);
450
+ int max_sends_;
451
+ int free_send_records_size_ ABSL_GUARDED_BY(mu_);
452
+ grpc_core::Mutex mu_;
453
+ uint32_t last_send_ = 0;
454
+ std::atomic<bool> shutdown_{false};
455
+ bool enabled_ = false;
456
+ size_t threshold_bytes_ = kDefaultSendBytesThreshold;
457
+ absl::flat_hash_map<uint32_t, TcpZerocopySendRecord*> ctx_lookup_
458
+ ABSL_GUARDED_BY(mu_);
459
+ bool memory_limited_ = false;
460
+ bool is_in_write_ ABSL_GUARDED_BY(mu_) = false;
461
+ OptMemState zcopy_enobuf_state_ ABSL_GUARDED_BY(mu_) = OptMemState::kOpen;
462
+ };
463
+
464
+ class PosixEndpointImpl : public grpc_core::RefCounted<PosixEndpointImpl> {
465
+ public:
466
+ PosixEndpointImpl(
467
+ EventHandle* handle, PosixEngineClosure* on_done,
468
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine> engine,
469
+ grpc_event_engine::experimental::MemoryAllocator&& allocator,
470
+ const PosixTcpOptions& options);
471
+ ~PosixEndpointImpl() override;
472
+ void Read(
473
+ absl::AnyInvocable<void(absl::Status)> on_read,
474
+ grpc_event_engine::experimental::SliceBuffer* buffer,
475
+ const grpc_event_engine::experimental::EventEngine::Endpoint::ReadArgs*
476
+ args);
477
+ void Write(
478
+ absl::AnyInvocable<void(absl::Status)> on_writable,
479
+ grpc_event_engine::experimental::SliceBuffer* data,
480
+ const grpc_event_engine::experimental::EventEngine::Endpoint::WriteArgs*
481
+ args);
482
+ const grpc_event_engine::experimental::EventEngine::ResolvedAddress&
483
+ GetPeerAddress() const {
484
+ return peer_address_;
485
+ }
486
+ const grpc_event_engine::experimental::EventEngine::ResolvedAddress&
487
+ GetLocalAddress() const {
488
+ return local_address_;
489
+ }
490
+
491
+ void MaybeShutdown(absl::Status why);
492
+
493
+ private:
494
+ void UpdateRcvLowat() ABSL_EXCLUSIVE_LOCKS_REQUIRED(read_mu_);
495
+ void HandleWrite(absl::Status status);
496
+ void HandleError(absl::Status status);
497
+ void HandleRead(absl::Status status);
498
+ void MaybeMakeReadSlices() ABSL_EXCLUSIVE_LOCKS_REQUIRED(read_mu_);
499
+ bool TcpDoRead(absl::Status& status) ABSL_EXCLUSIVE_LOCKS_REQUIRED(read_mu_);
500
+ void FinishEstimate();
501
+ void AddToEstimate(size_t bytes);
502
+ void MaybePostReclaimer() ABSL_EXCLUSIVE_LOCKS_REQUIRED(read_mu_);
503
+ void PerformReclamation() ABSL_LOCKS_EXCLUDED(read_mu_);
504
+ // Zero copy related helper methods.
505
+ TcpZerocopySendRecord* TcpGetSendZerocopyRecord(
506
+ grpc_event_engine::experimental::SliceBuffer& buf);
507
+ bool DoFlushZerocopy(TcpZerocopySendRecord* record, absl::Status& status);
508
+ bool TcpFlushZerocopy(TcpZerocopySendRecord* record, absl::Status& status);
509
+ bool TcpFlush(absl::Status& status);
510
+ void TcpShutdownTracedBufferList();
511
+ void UnrefMaybePutZerocopySendRecord(TcpZerocopySendRecord* record);
512
+ void ZerocopyDisableAndWaitForRemaining();
513
+ bool WriteWithTimestamps(struct msghdr* msg, size_t sending_length,
514
+ ssize_t* sent_length, int* saved_errno,
515
+ int additional_flags);
516
+ #ifdef GRPC_LINUX_ERRQUEUE
517
+ bool ProcessErrors();
518
+ // Reads a cmsg to process zerocopy control messages.
519
+ void ProcessZerocopy(struct cmsghdr* cmsg);
520
+ // Reads a cmsg to derive timestamps from the control messages.
521
+ struct cmsghdr* ProcessTimestamp(msghdr* msg, struct cmsghdr* cmsg);
522
+ #endif // GRPC_LINUX_ERRQUEUE
523
+ grpc_core::Mutex read_mu_;
524
+ PosixSocketWrapper sock_;
525
+ int fd_;
526
+ bool is_first_read_ = true;
527
+ bool has_posted_reclaimer_ ABSL_GUARDED_BY(read_mu_) = false;
528
+ double target_length_;
529
+ int min_read_chunk_size_;
530
+ int max_read_chunk_size_;
531
+ int set_rcvlowat_ = 0;
532
+ double bytes_read_this_round_ = 0;
533
+ std::atomic<int> ref_count_{1};
534
+
535
+ // garbage after the last read.
536
+ grpc_event_engine::experimental::SliceBuffer last_read_buffer_;
537
+
538
+ grpc_event_engine::experimental::SliceBuffer* incoming_buffer_
539
+ ABSL_GUARDED_BY(read_mu_) = nullptr;
540
+ // bytes pending on the socket from the last read.
541
+ int inq_ = 1;
542
+ // cache whether kernel supports inq.
543
+ bool inq_capable_ = false;
544
+
545
+ grpc_event_engine::experimental::SliceBuffer* outgoing_buffer_ = nullptr;
546
+ // byte within outgoing_buffer's slices[0] to write next.
547
+ size_t outgoing_byte_idx_ = 0;
548
+
549
+ PosixEngineClosure* on_read_ = nullptr;
550
+ PosixEngineClosure* on_write_ = nullptr;
551
+ PosixEngineClosure* on_error_ = nullptr;
552
+ PosixEngineClosure* on_done_ = nullptr;
553
+ absl::AnyInvocable<void(absl::Status)> read_cb_ ABSL_GUARDED_BY(read_mu_);
554
+ absl::AnyInvocable<void(absl::Status)> write_cb_;
555
+
556
+ grpc_event_engine::experimental::EventEngine::ResolvedAddress peer_address_;
557
+ grpc_event_engine::experimental::EventEngine::ResolvedAddress local_address_;
558
+
559
+ grpc_core::MemoryOwner memory_owner_;
560
+ grpc_core::MemoryAllocator::Reservation self_reservation_;
561
+
562
+ void* outgoing_buffer_arg_ = nullptr;
563
+
564
+ // A counter which starts at 0. It is initialized the first time the socket
565
+ // options for collecting timestamps are set, and is incremented with each
566
+ // byte sent.
567
+ int bytes_counter_ = -1;
568
+ // True if timestamping options are set on the socket.
569
+ #ifdef GRPC_LINUX_ERRQUEUE
570
+ bool socket_ts_enabled_ = false;
571
+ #endif // GRPC_LINUX_ERRQUEUE
572
+ // Cache whether we can set timestamping options
573
+ bool ts_capable_ = true;
574
+ // Set to 1 if we do not want to be notified on errors anymore.
575
+ std::atomic<bool> stop_error_notification_{false};
576
+ std::unique_ptr<TcpZerocopySendCtx> tcp_zerocopy_send_ctx_;
577
+ TcpZerocopySendRecord* current_zerocopy_send_ = nullptr;
578
+ // A hint from upper layers specifying the minimum number of bytes that need
579
+ // to be read to make meaningful progress.
580
+ int min_progress_size_ = 1;
581
+ TracedBufferList traced_buffers_;
582
+ // The handle is owned by the PosixEndpointImpl object.
583
+ EventHandle* handle_;
584
+ PosixEventPoller* poller_;
585
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine> engine_;
586
+ };
587
+
588
+ class PosixEndpoint
589
+ : public grpc_event_engine::experimental::EventEngine::Endpoint {
590
+ public:
591
+ PosixEndpoint(
592
+ EventHandle* handle, PosixEngineClosure* on_shutdown,
593
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine> engine,
594
+ grpc_event_engine::experimental::MemoryAllocator&& allocator,
595
+ const PosixTcpOptions& options)
596
+ : impl_(new PosixEndpointImpl(handle, on_shutdown, std::move(engine),
597
+ std::move(allocator), options)) {}
598
+
599
+ void Read(
600
+ absl::AnyInvocable<void(absl::Status)> on_read,
601
+ grpc_event_engine::experimental::SliceBuffer* buffer,
602
+ const grpc_event_engine::experimental::EventEngine::Endpoint::ReadArgs*
603
+ args) override {
604
+ impl_->Read(std::move(on_read), buffer, args);
605
+ }
606
+
607
+ void Write(
608
+ absl::AnyInvocable<void(absl::Status)> on_writable,
609
+ grpc_event_engine::experimental::SliceBuffer* data,
610
+ const grpc_event_engine::experimental::EventEngine::Endpoint::WriteArgs*
611
+ args) override {
612
+ impl_->Write(std::move(on_writable), data, args);
613
+ }
614
+
615
+ const grpc_event_engine::experimental::EventEngine::ResolvedAddress&
616
+ GetPeerAddress() const override {
617
+ return impl_->GetPeerAddress();
618
+ }
619
+ const grpc_event_engine::experimental::EventEngine::ResolvedAddress&
620
+ GetLocalAddress() const override {
621
+ return impl_->GetLocalAddress();
622
+ }
623
+
624
+ ~PosixEndpoint() override {
625
+ impl_->MaybeShutdown(absl::InternalError("Endpoint closing"));
626
+ }
627
+
628
+ private:
629
+ PosixEndpointImpl* impl_;
630
+ };
631
+
632
+ #else // GRPC_POSIX_SOCKET_TCP
633
+
634
+ class PosixEndpoint
635
+ : public grpc_event_engine::experimental::EventEngine::Endpoint {
636
+ public:
637
+ PosixEndpoint() = default;
638
+
639
+ void Read(absl::AnyInvocable<void(absl::Status)> /*on_read*/,
640
+ grpc_event_engine::experimental::SliceBuffer* /*buffer*/,
641
+ const grpc_event_engine::experimental::EventEngine::Endpoint::
642
+ ReadArgs* /*args*/) override {
643
+ GPR_ASSERT(false && "PosixEndpoint::Read not supported on this platform");
644
+ }
645
+
646
+ void Write(absl::AnyInvocable<void(absl::Status)> /*on_writable*/,
647
+ grpc_event_engine::experimental::SliceBuffer* /*data*/,
648
+ const grpc_event_engine::experimental::EventEngine::Endpoint::
649
+ WriteArgs* /*args*/) override {
650
+ GPR_ASSERT(false && "PosixEndpoint::Write not supported on this platform");
651
+ }
652
+
653
+ const grpc_event_engine::experimental::EventEngine::ResolvedAddress&
654
+ GetPeerAddress() const override {
655
+ GPR_ASSERT(false &&
656
+ "PosixEndpoint::GetPeerAddress not supported on this platform");
657
+ }
658
+ const grpc_event_engine::experimental::EventEngine::ResolvedAddress&
659
+ GetLocalAddress() const override {
660
+ GPR_ASSERT(false &&
661
+ "PosixEndpoint::GetLocalAddress not supported on this platform");
662
+ }
663
+
664
+ ~PosixEndpoint() override = default;
665
+ };
666
+
667
+ #endif // GRPC_POSIX_SOCKET_TCP
668
+
669
+ // Create a PosixEndpoint.
670
+ // A shared_ptr of the EventEngine is passed to the endpoint to ensure that
671
+ // the event engine is alive for the lifetime of the endpoint. The ownership
672
+ // of the EventHandle is transferred to the endpoint.
673
+ std::unique_ptr<PosixEndpoint> CreatePosixEndpoint(
674
+ EventHandle* handle, PosixEngineClosure* on_shutdown,
675
+ std::shared_ptr<EventEngine> engine,
676
+ grpc_event_engine::experimental::MemoryAllocator&& allocator,
677
+ const PosixTcpOptions& options);
678
+
679
+ } // namespace posix_engine
680
+ } // namespace grpc_event_engine
681
+
682
+ #endif // GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_POSIX_ENDPOINT_H