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,97 @@
1
+ // Copyright 2022 The 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_EV_POLL_POSIX_H
16
+ #define GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_EV_POLL_POSIX_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <atomic>
21
+ #include <memory>
22
+ #include <string>
23
+
24
+ #include "absl/base/thread_annotations.h"
25
+ #include "absl/functional/function_ref.h"
26
+ #include "absl/strings/string_view.h"
27
+
28
+ #include <grpc/event_engine/event_engine.h>
29
+
30
+ #include "src/core/lib/event_engine/poller.h"
31
+ #include "src/core/lib/event_engine/posix_engine/event_poller.h"
32
+ #include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h"
33
+ #include "src/core/lib/gprpp/sync.h"
34
+
35
+ namespace grpc_event_engine {
36
+ namespace posix_engine {
37
+
38
+ class PollEventHandle;
39
+
40
+ // Definition of poll based poller.
41
+ class PollPoller : public PosixEventPoller {
42
+ public:
43
+ explicit PollPoller(Scheduler* scheduler);
44
+ PollPoller(Scheduler* scheduler, bool use_phony_poll);
45
+ EventHandle* CreateHandle(int fd, absl::string_view name,
46
+ bool track_err) override;
47
+ Poller::WorkResult Work(
48
+ grpc_event_engine::experimental::EventEngine::Duration timeout,
49
+ absl::FunctionRef<void()> schedule_poll_again) override;
50
+ std::string Name() override { return "poll"; }
51
+ void Kick() override;
52
+ Scheduler* GetScheduler() { return scheduler_; }
53
+ void Shutdown() override;
54
+ bool CanTrackErrors() const override { return false; }
55
+ ~PollPoller() override;
56
+
57
+ private:
58
+ void Ref() { ref_count_.fetch_add(1, std::memory_order_relaxed); }
59
+ void Unref() {
60
+ if (ref_count_.fetch_sub(1, std::memory_order_acq_rel) == 1) {
61
+ delete this;
62
+ }
63
+ }
64
+ void KickExternal(bool ext);
65
+ void PollerHandlesListAddHandle(PollEventHandle* handle)
66
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
67
+ void PollerHandlesListRemoveHandle(PollEventHandle* handle)
68
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
69
+ friend class PollEventHandle;
70
+ class HandlesList {
71
+ public:
72
+ explicit HandlesList(PollEventHandle* handle) : handle(handle) {}
73
+ PollEventHandle* handle;
74
+ PollEventHandle* next = nullptr;
75
+ PollEventHandle* prev = nullptr;
76
+ };
77
+ grpc_core::Mutex mu_;
78
+ Scheduler* scheduler_;
79
+ std::atomic<int> ref_count_{1};
80
+ bool use_phony_poll_;
81
+ bool was_kicked_ ABSL_GUARDED_BY(mu_);
82
+ bool was_kicked_ext_ ABSL_GUARDED_BY(mu_);
83
+ int num_poll_handles_ ABSL_GUARDED_BY(mu_);
84
+ PollEventHandle* poll_handles_list_head_ ABSL_GUARDED_BY(mu_) = nullptr;
85
+ std::unique_ptr<WakeupFd> wakeup_fd_;
86
+ };
87
+
88
+ // Return an instance of a poll based poller tied to the specified scheduler.
89
+ // It use_phony_poll is true, it implies that the poller is declared
90
+ // non-polling and any attempt to schedule a blocking poll will result in a
91
+ // crash failure.
92
+ PollPoller* MakePollPoller(Scheduler* scheduler, bool use_phony_poll);
93
+
94
+ } // namespace posix_engine
95
+ } // namespace grpc_event_engine
96
+
97
+ #endif // GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_EV_POLL_POSIX_H
@@ -0,0 +1,111 @@
1
+ // Copyright 2022 The 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_EVENT_POLLER_H
16
+ #define GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_EVENT_POLLER_H
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include <string>
20
+
21
+ #include "absl/functional/any_invocable.h"
22
+ #include "absl/status/status.h"
23
+ #include "absl/strings/string_view.h"
24
+
25
+ #include <grpc/event_engine/event_engine.h>
26
+
27
+ #include "src/core/lib/event_engine/poller.h"
28
+ #include "src/core/lib/event_engine/posix_engine/posix_engine_closure.h"
29
+
30
+ namespace grpc_event_engine {
31
+ namespace posix_engine {
32
+
33
+ class Scheduler {
34
+ public:
35
+ virtual void Run(experimental::EventEngine::Closure* closure) = 0;
36
+ virtual void Run(absl::AnyInvocable<void()>) = 0;
37
+ virtual ~Scheduler() = default;
38
+ };
39
+
40
+ class PosixEventPoller;
41
+
42
+ class EventHandle {
43
+ public:
44
+ virtual int WrappedFd() = 0;
45
+ // Delete the handle and optionally close the underlying file descriptor if
46
+ // release_fd != nullptr. The on_done closure is scheduled to be invoked
47
+ // after the operation is complete. After this operation, NotifyXXX and SetXXX
48
+ // operations cannot be performed on the handle. In general, this method
49
+ // should only be called after ShutdownHandle and after all existing NotifyXXX
50
+ // closures have run and there is no waiting NotifyXXX closure.
51
+ virtual void OrphanHandle(PosixEngineClosure* on_done, int* release_fd,
52
+ absl::string_view reason) = 0;
53
+ // Shutdown a handle. If there is an attempt to call NotifyXXX operations
54
+ // after Shutdown handle, those closures will be run immediately with the
55
+ // absl::Status provided here being passed to the callbacks enclosed within
56
+ // the PosixEngineClosure object.
57
+ virtual void ShutdownHandle(absl::Status why) = 0;
58
+ // Schedule on_read to be invoked when the underlying file descriptor
59
+ // becomes readable. When the on_read closure is run, it may check
60
+ // if the handle is shutdown using the IsHandleShutdown method and take
61
+ // appropriate actions (for instance it should not try to invoke another
62
+ // recursive NotifyOnRead if the handle is shutdown).
63
+ virtual void NotifyOnRead(PosixEngineClosure* on_read) = 0;
64
+ // Schedule on_write to be invoked when the underlying file descriptor
65
+ // becomes writable. When the on_write closure is run, it may check
66
+ // if the handle is shutdown using the IsHandleShutdown method and take
67
+ // appropriate actions (for instance it should not try to invoke another
68
+ // recursive NotifyOnWrite if the handle is shutdown).
69
+ virtual void NotifyOnWrite(PosixEngineClosure* on_write) = 0;
70
+ // Schedule on_error to be invoked when the underlying file descriptor
71
+ // encounters errors. When the on_error closure is run, it may check
72
+ // if the handle is shutdown using the IsHandleShutdown method and take
73
+ // appropriate actions (for instance it should not try to invoke another
74
+ // recursive NotifyOnError if the handle is shutdown).
75
+ virtual void NotifyOnError(PosixEngineClosure* on_error) = 0;
76
+ // Force set a readable event on the underlying file descriptor.
77
+ virtual void SetReadable() = 0;
78
+ // Force set a writable event on the underlying file descriptor.
79
+ virtual void SetWritable() = 0;
80
+ // Force set a error event on the underlying file descriptor.
81
+ virtual void SetHasError() = 0;
82
+ // Returns true if the handle has been shutdown.
83
+ virtual bool IsHandleShutdown() = 0;
84
+ // Returns the poller which was used to create this handle.
85
+ virtual PosixEventPoller* Poller() = 0;
86
+ virtual ~EventHandle() = default;
87
+ };
88
+
89
+ class PosixEventPoller : public grpc_event_engine::experimental::Poller {
90
+ public:
91
+ // Return an opaque handle to perform actions on the provided file descriptor.
92
+ virtual EventHandle* CreateHandle(int fd, absl::string_view name,
93
+ bool track_err) = 0;
94
+ virtual bool CanTrackErrors() const = 0;
95
+ virtual std::string Name() = 0;
96
+ // Shuts down and deletes the poller. It is legal to call this function
97
+ // only when no other poller method is in progress. For instance, it is
98
+ // not safe to call this method, while a thread is blocked on Work(...).
99
+ // A graceful way to terminate the poller could be to:
100
+ // 1. First orphan all created handles.
101
+ // 2. Send a Kick() to the thread executing Work(...) and wait for the
102
+ // thread to return.
103
+ // 3. Call Shutdown() on the poller.
104
+ virtual void Shutdown() = 0;
105
+ ~PosixEventPoller() override = default;
106
+ };
107
+
108
+ } // namespace posix_engine
109
+ } // namespace grpc_event_engine
110
+
111
+ #endif // GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_EVENT_POLLER_H
@@ -0,0 +1,74 @@
1
+ // Copyright 2022 The 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
+ #include <grpc/support/port_platform.h>
16
+
17
+ #include "absl/strings/str_split.h"
18
+ #include "absl/strings/string_view.h"
19
+
20
+ #include "src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h"
21
+ #include "src/core/lib/event_engine/posix_engine/ev_poll_posix.h"
22
+ #include "src/core/lib/event_engine/posix_engine/event_poller.h"
23
+ #include "src/core/lib/gprpp/global_config.h"
24
+ #include "src/core/lib/gprpp/memory.h"
25
+ #include "src/core/lib/iomgr/port.h"
26
+
27
+ #ifdef GRPC_POSIX_SOCKET_TCP
28
+ GPR_GLOBAL_CONFIG_DECLARE_STRING(grpc_poll_strategy);
29
+ #endif
30
+
31
+ namespace grpc_event_engine {
32
+ namespace posix_engine {
33
+
34
+ #ifdef GRPC_POSIX_SOCKET_TCP
35
+ namespace {
36
+
37
+ bool PollStrategyMatches(absl::string_view strategy, absl::string_view want) {
38
+ return strategy == "all" || strategy == want;
39
+ }
40
+
41
+ } // namespace
42
+
43
+ PosixEventPoller* MakeDefaultPoller(Scheduler* scheduler) {
44
+ static const char* poll_strategy =
45
+ GPR_GLOBAL_CONFIG_GET(grpc_poll_strategy).release();
46
+ PosixEventPoller* poller = nullptr;
47
+ auto strings = absl::StrSplit(poll_strategy, ',');
48
+ for (auto it = strings.begin(); it != strings.end() && poller == nullptr;
49
+ it++) {
50
+ if (PollStrategyMatches(*it, "epoll1")) {
51
+ poller = MakeEpoll1Poller(scheduler);
52
+ }
53
+ if (poller == nullptr && PollStrategyMatches(*it, "poll")) {
54
+ // If epoll1 fails and if poll strategy matches "poll", use Poll poller
55
+ poller = MakePollPoller(scheduler, /*use_phony_poll=*/false);
56
+ } else if (poller == nullptr && PollStrategyMatches(*it, "none")) {
57
+ // If epoll1 fails and if poll strategy matches "none", use phony poll
58
+ // poller.
59
+ poller = MakePollPoller(scheduler, /*use_phony_poll=*/true);
60
+ }
61
+ }
62
+ return poller;
63
+ }
64
+
65
+ #else // GRPC_POSIX_SOCKET_TCP
66
+
67
+ PosixEventPoller* MakeDefaultPoller(Scheduler* /*scheduler*/) {
68
+ return nullptr;
69
+ }
70
+
71
+ #endif // GRPC_POSIX_SOCKET_TCP
72
+
73
+ } // namespace posix_engine
74
+ } // namespace grpc_event_engine
@@ -1,4 +1,4 @@
1
- // Copyright 2022 gRPC authors.
1
+ // Copyright 2022 The gRPC Authors
2
2
  //
3
3
  // Licensed under the Apache License, Version 2.0 (the "License");
4
4
  // you may not use this file except in compliance with the License.
@@ -12,25 +12,22 @@
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
 
15
- #include <grpc/support/port_platform.h>
16
-
17
- #include "src/core/lib/event_engine/executor/threaded_executor.h"
15
+ #ifndef GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_EVENT_POLLER_POSIX_DEFAULT_H
16
+ #define GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_EVENT_POLLER_POSIX_DEFAULT_H
18
17
 
19
- #include <utility>
18
+ #include <grpc/support/port_platform.h>
20
19
 
21
20
  namespace grpc_event_engine {
22
- namespace experimental {
21
+ namespace posix_engine {
23
22
 
24
- ThreadedExecutor::ThreadedExecutor(int reserve_threads)
25
- : thread_pool_(reserve_threads){};
23
+ class PosixEventPoller;
24
+ class Scheduler;
26
25
 
27
- void ThreadedExecutor::Run(EventEngine::Closure* closure) {
28
- thread_pool_.Add([closure]() { closure->Run(); });
29
- }
26
+ // Return an instance of an event poller which is tied to the specified
27
+ // scheduler.
28
+ PosixEventPoller* MakeDefaultPoller(Scheduler* scheduler);
30
29
 
31
- void ThreadedExecutor::Run(absl::AnyInvocable<void()> closure) {
32
- thread_pool_.Add(std::move(closure));
33
- }
34
-
35
- } // namespace experimental
30
+ } // namespace posix_engine
36
31
  } // namespace grpc_event_engine
32
+
33
+ #endif // GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_EVENT_POLLER_POSIX_DEFAULT_H
@@ -0,0 +1,77 @@
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
+ #include <grpc/support/port_platform.h>
16
+
17
+ #include "src/core/lib/event_engine/posix_engine/internal_errqueue.h"
18
+
19
+ #include <string>
20
+
21
+ #include <grpc/support/log.h>
22
+
23
+ #include "src/core/lib/iomgr/port.h"
24
+
25
+ #ifdef GRPC_POSIX_SOCKET_TCP
26
+
27
+ #include <errno.h>
28
+ #include <netinet/in.h>
29
+ #include <stdlib.h>
30
+ #include <string.h>
31
+ #include <sys/utsname.h>
32
+
33
+ #include <cstddef>
34
+
35
+ #include "src/core/lib/gprpp/strerror.h"
36
+
37
+ namespace grpc_event_engine {
38
+ namespace posix_engine {
39
+
40
+ #ifdef GRPC_LINUX_ERRQUEUE
41
+ int GetSocketTcpInfo(struct tcp_info* info, int fd) {
42
+ memset(info, 0, sizeof(*info));
43
+ info->length = offsetof(tcp_info, length);
44
+ return getsockopt(fd, IPPROTO_TCP, TCP_INFO, info, &(info->length));
45
+ }
46
+ #endif
47
+
48
+ bool KernelSupportsErrqueue() {
49
+ static const bool errqueue_supported = []() {
50
+ #ifdef GRPC_LINUX_ERRQUEUE
51
+ // Both-compile time and run-time linux kernel versions should be at
52
+ // least 4.0.0
53
+ struct utsname buffer;
54
+ if (uname(&buffer) != 0) {
55
+ gpr_log(GPR_ERROR, "uname: %s", grpc_core::StrError(errno).c_str());
56
+ return false;
57
+ }
58
+ char* release = buffer.release;
59
+ if (release == nullptr) {
60
+ return false;
61
+ }
62
+
63
+ if (strtol(release, nullptr, 10) >= 4) {
64
+ return true;
65
+ } else {
66
+ gpr_log(GPR_DEBUG, "ERRQUEUE support not enabled");
67
+ }
68
+ #endif // GRPC_LINUX_ERRQUEUE
69
+ return false;
70
+ }();
71
+ return errqueue_supported;
72
+ }
73
+
74
+ } // namespace posix_engine
75
+ } // namespace grpc_event_engine
76
+
77
+ #endif // GRPC_POSIX_SOCKET_TCP
@@ -0,0 +1,179 @@
1
+ // Copyright 2022 The 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_INTERNAL_ERRQUEUE_H
16
+ #define GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_INTERNAL_ERRQUEUE_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <stdint.h>
21
+
22
+ #include "src/core/lib/iomgr/port.h"
23
+
24
+ #ifdef GRPC_POSIX_SOCKET_TCP
25
+
26
+ #include <time.h>
27
+
28
+ #ifdef GRPC_LINUX_ERRQUEUE
29
+ #include <linux/errqueue.h> // IWYU pragma: keep
30
+ #include <sys/socket.h>
31
+ #endif /* GRPC_LINUX_ERRQUEUE */
32
+
33
+ namespace grpc_event_engine {
34
+ namespace posix_engine {
35
+
36
+ #ifdef GRPC_LINUX_ERRQUEUE
37
+
38
+ // Redefining scm_timestamping in the same way that <linux/errqueue.h> defines
39
+ // it, so that code compiles on systems that don't have it.
40
+ struct scm_timestamping {
41
+ struct timespec ts[3];
42
+ };
43
+ // Also redefine timestamp types
44
+ // The timestamp type for when the driver passed skb to NIC, or HW.
45
+ constexpr int SCM_TSTAMP_SND = 0;
46
+ // The timestamp type for when data entered the packet scheduler.
47
+ constexpr int SCM_TSTAMP_SCHED = 1;
48
+ // The timestamp type for when data acknowledged by peer.
49
+ constexpr int SCM_TSTAMP_ACK = 2;
50
+
51
+ // Control message type containing OPT_STATS
52
+ #ifndef SCM_TIMESTAMPING_OPT_STATS
53
+ #define SCM_TIMESTAMPING_OPT_STATS 54
54
+ #endif
55
+
56
+ // Redefine required constants from <linux/net_tstamp.h>
57
+ constexpr uint32_t SOF_TIMESTAMPING_TX_SOFTWARE = 1u << 1;
58
+ constexpr uint32_t SOF_TIMESTAMPING_SOFTWARE = 1u << 4;
59
+ constexpr uint32_t SOF_TIMESTAMPING_OPT_ID = 1u << 7;
60
+ constexpr uint32_t SOF_TIMESTAMPING_TX_SCHED = 1u << 8;
61
+ constexpr uint32_t SOF_TIMESTAMPING_TX_ACK = 1u << 9;
62
+ constexpr uint32_t SOF_TIMESTAMPING_OPT_TSONLY = 1u << 11;
63
+ constexpr uint32_t SOF_TIMESTAMPING_OPT_STATS = 1u << 12;
64
+
65
+ constexpr uint32_t kTimestampingSocketOptions =
66
+ SOF_TIMESTAMPING_SOFTWARE | SOF_TIMESTAMPING_OPT_ID |
67
+ SOF_TIMESTAMPING_OPT_TSONLY | SOF_TIMESTAMPING_OPT_STATS;
68
+ constexpr uint32_t kTimestampingRecordingOptions =
69
+ SOF_TIMESTAMPING_TX_SCHED | SOF_TIMESTAMPING_TX_SOFTWARE |
70
+ SOF_TIMESTAMPING_TX_ACK;
71
+
72
+ // Netlink attribute types used for TCP opt stats.
73
+ enum TCPOptStats {
74
+ TCP_NLA_PAD,
75
+ TCP_NLA_BUSY, /* Time (usec) busy sending data. */
76
+ TCP_NLA_RWND_LIMITED, /* Time (usec) limited by receive window. */
77
+ TCP_NLA_SNDBUF_LIMITED, /* Time (usec) limited by send buffer. */
78
+ TCP_NLA_DATA_SEGS_OUT, /* Data pkts sent including retransmission. */
79
+ TCP_NLA_TOTAL_RETRANS, /* Data pkts retransmitted. */
80
+ TCP_NLA_PACING_RATE, /* Pacing rate in Bps. */
81
+ TCP_NLA_DELIVERY_RATE, /* Delivery rate in Bps. */
82
+ TCP_NLA_SND_CWND, /* Sending congestion window. */
83
+ TCP_NLA_REORDERING, /* Reordering metric. */
84
+ TCP_NLA_MIN_RTT, /* minimum RTT. */
85
+ TCP_NLA_RECUR_RETRANS, /* Recurring retransmits for the current pkt. */
86
+ TCP_NLA_DELIVERY_RATE_APP_LMT, /* Delivery rate application limited? */
87
+ TCP_NLA_SNDQ_SIZE, /* Data (bytes) pending in send queue */
88
+ TCP_NLA_CA_STATE, /* ca_state of socket */
89
+ TCP_NLA_SND_SSTHRESH, /* Slow start size threshold */
90
+ TCP_NLA_DELIVERED, /* Data pkts delivered incl. out-of-order */
91
+ TCP_NLA_DELIVERED_CE, /* Like above but only ones w/ CE marks */
92
+ TCP_NLA_BYTES_SENT, /* Data bytes sent including retransmission */
93
+ TCP_NLA_BYTES_RETRANS, /* Data bytes retransmitted */
94
+ TCP_NLA_DSACK_DUPS, /* DSACK blocks received */
95
+ TCP_NLA_REORD_SEEN, /* reordering events seen */
96
+ TCP_NLA_SRTT, /* smoothed RTT in usecs */
97
+ };
98
+
99
+ /* tcp_info from from linux/tcp.h */
100
+ struct tcp_info {
101
+ uint8_t tcpi_state;
102
+ uint8_t tcpi_ca_state;
103
+ uint8_t tcpi_retransmits;
104
+ uint8_t tcpi_probes;
105
+ uint8_t tcpi_backoff;
106
+ uint8_t tcpi_options;
107
+ uint8_t tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
108
+ uint8_t tcpi_delivery_rate_app_limited : 1;
109
+ uint32_t tcpi_rto;
110
+ uint32_t tcpi_ato;
111
+ uint32_t tcpi_snd_mss;
112
+ uint32_t tcpi_rcv_mss;
113
+ uint32_t tcpi_unacked;
114
+ uint32_t tcpi_sacked;
115
+ uint32_t tcpi_lost;
116
+ uint32_t tcpi_retrans;
117
+ uint32_t tcpi_fackets;
118
+ /* Times. */
119
+ uint32_t tcpi_last_data_sent;
120
+ uint32_t tcpi_last_ack_sent; /* Not remembered, sorry. */
121
+ uint32_t tcpi_last_data_recv;
122
+ uint32_t tcpi_last_ack_recv;
123
+ /* Metrics. */
124
+ uint32_t tcpi_pmtu;
125
+ uint32_t tcpi_rcv_ssthresh;
126
+ uint32_t tcpi_rtt;
127
+ uint32_t tcpi_rttvar;
128
+ uint32_t tcpi_snd_ssthresh;
129
+ uint32_t tcpi_snd_cwnd;
130
+ uint32_t tcpi_advmss;
131
+ uint32_t tcpi_reordering;
132
+ uint32_t tcpi_rcv_rtt;
133
+ uint32_t tcpi_rcv_space;
134
+ uint32_t tcpi_total_retrans;
135
+ uint64_t tcpi_pacing_rate;
136
+ uint64_t tcpi_max_pacing_rate;
137
+ uint64_t tcpi_bytes_acked; /* RFC4898 tcpEStatsAppHCThruOctetsAcked */
138
+ uint64_t tcpi_bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived */
139
+
140
+ uint32_t tcpi_segs_out; /* RFC4898 tcpEStatsPerfSegsOut */
141
+ uint32_t tcpi_segs_in; /* RFC4898 tcpEStatsPerfSegsIn */
142
+ uint32_t tcpi_notsent_bytes;
143
+ uint32_t tcpi_min_rtt;
144
+
145
+ uint32_t tcpi_data_segs_in; /* RFC4898 tcpEStatsDataSegsIn */
146
+ uint32_t tcpi_data_segs_out; /* RFC4898 tcpEStatsDataSegsOut */
147
+
148
+ uint64_t tcpi_delivery_rate;
149
+ uint64_t tcpi_busy_time; /* Time (usec) busy sending data */
150
+ uint64_t tcpi_rwnd_limited; /* Time (usec) limited by receive window */
151
+ uint64_t tcpi_sndbuf_limited; /* Time (usec) limited by send buffer */
152
+
153
+ uint32_t tcpi_delivered;
154
+ uint32_t tcpi_delivered_ce;
155
+ uint64_t tcpi_bytes_sent; /* RFC4898 tcpEStatsPerfHCDataOctetsOut */
156
+ uint64_t tcpi_bytes_retrans; /* RFC4898 tcpEStatsPerfOctetsRetrans */
157
+ uint32_t tcpi_dsack_dups; /* RFC4898 tcpEStatsStackDSACKDups */
158
+ uint32_t tcpi_reord_seen; /* reordering events seen */
159
+ socklen_t length; /* Length of struct returned by kernel */
160
+ };
161
+
162
+ #ifndef TCP_INFO
163
+ #define TCP_INFO 11
164
+ #endif
165
+
166
+ int GetSocketTcpInfo(tcp_info* info, int fd);
167
+
168
+ #endif /* GRPC_LINUX_ERRQUEUE */
169
+
170
+ // Returns true if kernel is capable of supporting errqueue and timestamping.
171
+ // Currently allowing only linux kernels above 4.0.0
172
+ bool KernelSupportsErrqueue();
173
+
174
+ } // namespace posix_engine
175
+ } // namespace grpc_event_engine
176
+
177
+ #endif /* GRPC_POSIX_SOCKET_TCP */
178
+
179
+ #endif /* GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_INTERNAL_ERRQUEUE_H */