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,151 @@
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 <memory>
18
+ #include <utility>
19
+
20
+ #include "absl/strings/str_cat.h"
21
+ #include "absl/strings/string_view.h"
22
+
23
+ #include <grpc/support/log.h> // IWYU pragma: keep
24
+
25
+ #include "src/core/lib/iomgr/port.h"
26
+
27
+ #ifdef GRPC_POSIX_WAKEUP_FD
28
+ #include <errno.h>
29
+ #include <fcntl.h>
30
+ #include <unistd.h>
31
+
32
+ #include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h"
33
+ #endif
34
+
35
+ #include "src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h"
36
+ #include "src/core/lib/gprpp/strerror.h"
37
+
38
+ namespace grpc_event_engine {
39
+ namespace posix_engine {
40
+
41
+ #ifdef GRPC_POSIX_WAKEUP_FD
42
+
43
+ namespace {
44
+
45
+ absl::Status SetSocketNonBlocking(int fd) {
46
+ int oldflags = fcntl(fd, F_GETFL, 0);
47
+ if (oldflags < 0) {
48
+ return absl::Status(absl::StatusCode::kInternal,
49
+ absl::StrCat("fcntl: ", grpc_core::StrError(errno)));
50
+ }
51
+
52
+ oldflags |= O_NONBLOCK;
53
+
54
+ if (fcntl(fd, F_SETFL, oldflags) != 0) {
55
+ return absl::Status(absl::StatusCode::kInternal,
56
+ absl::StrCat("fcntl: ", grpc_core::StrError(errno)));
57
+ }
58
+
59
+ return absl::OkStatus();
60
+ }
61
+ } // namespace
62
+
63
+ absl::Status PipeWakeupFd::Init() {
64
+ int pipefd[2];
65
+ int r = pipe(pipefd);
66
+ if (0 != r) {
67
+ return absl::Status(absl::StatusCode::kInternal,
68
+ absl::StrCat("pipe: ", grpc_core::StrError(errno)));
69
+ }
70
+ auto status = SetSocketNonBlocking(pipefd[0]);
71
+ if (!status.ok()) return status;
72
+ status = SetSocketNonBlocking(pipefd[1]);
73
+ if (!status.ok()) return status;
74
+ SetWakeupFds(pipefd[0], pipefd[1]);
75
+ return absl::OkStatus();
76
+ }
77
+
78
+ absl::Status PipeWakeupFd::ConsumeWakeup() {
79
+ char buf[128];
80
+ ssize_t r;
81
+
82
+ for (;;) {
83
+ r = read(ReadFd(), buf, sizeof(buf));
84
+ if (r > 0) continue;
85
+ if (r == 0) return absl::OkStatus();
86
+ switch (errno) {
87
+ case EAGAIN:
88
+ return absl::OkStatus();
89
+ case EINTR:
90
+ continue;
91
+ default:
92
+ return absl::Status(absl::StatusCode::kInternal,
93
+ absl::StrCat("read: ", grpc_core::StrError(errno)));
94
+ }
95
+ }
96
+ }
97
+
98
+ absl::Status PipeWakeupFd::Wakeup() {
99
+ char c = 0;
100
+ while (write(WriteFd(), &c, 1) != 1 && errno == EINTR) {
101
+ }
102
+ return absl::OkStatus();
103
+ }
104
+
105
+ PipeWakeupFd::~PipeWakeupFd() {
106
+ if (ReadFd() != 0) {
107
+ close(ReadFd());
108
+ }
109
+ if (WriteFd() != 0) {
110
+ close(WriteFd());
111
+ }
112
+ }
113
+
114
+ bool PipeWakeupFd::IsSupported() {
115
+ PipeWakeupFd pipe_wakeup_fd;
116
+ return pipe_wakeup_fd.Init().ok();
117
+ }
118
+
119
+ absl::StatusOr<std::unique_ptr<WakeupFd>> PipeWakeupFd::CreatePipeWakeupFd() {
120
+ static bool kIsPipeWakeupFdSupported = PipeWakeupFd::IsSupported();
121
+ if (kIsPipeWakeupFdSupported) {
122
+ auto pipe_wakeup_fd = std::make_unique<PipeWakeupFd>();
123
+ auto status = pipe_wakeup_fd->Init();
124
+ if (status.ok()) {
125
+ return std::unique_ptr<WakeupFd>(std::move(pipe_wakeup_fd));
126
+ }
127
+ return status;
128
+ }
129
+ return absl::NotFoundError("Pipe wakeup fd is not supported");
130
+ }
131
+
132
+ #else // GRPC_POSIX_WAKEUP_FD
133
+
134
+ absl::Status PipeWakeupFd::Init() { GPR_ASSERT(false && "unimplemented"); }
135
+
136
+ absl::Status PipeWakeupFd::ConsumeWakeup() {
137
+ GPR_ASSERT(false && "unimplemented");
138
+ }
139
+
140
+ absl::Status PipeWakeupFd::Wakeup() { GPR_ASSERT(false && "unimplemented"); }
141
+
142
+ bool PipeWakeupFd::IsSupported() { return false; }
143
+
144
+ absl::StatusOr<std::unique_ptr<WakeupFd>> PipeWakeupFd::CreatePipeWakeupFd() {
145
+ return absl::NotFoundError("Pipe wakeup fd is not supported");
146
+ }
147
+
148
+ #endif // GRPC_POSIX_WAKEUP_FD
149
+
150
+ } // namespace posix_engine
151
+ } // namespace grpc_event_engine
@@ -0,0 +1,45 @@
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
+ #ifndef GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_PIPE_H
15
+ #define GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_PIPE_H
16
+
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include <memory>
20
+
21
+ #include "absl/status/status.h"
22
+ #include "absl/status/statusor.h"
23
+
24
+ #include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h"
25
+
26
+ namespace grpc_event_engine {
27
+ namespace posix_engine {
28
+
29
+ class PipeWakeupFd : public WakeupFd {
30
+ public:
31
+ PipeWakeupFd() : WakeupFd() {}
32
+ ~PipeWakeupFd() override;
33
+ absl::Status ConsumeWakeup() override;
34
+ absl::Status Wakeup() override;
35
+ static absl::StatusOr<std::unique_ptr<WakeupFd>> CreatePipeWakeupFd();
36
+ static bool IsSupported();
37
+
38
+ private:
39
+ absl::Status Init();
40
+ };
41
+
42
+ } // namespace posix_engine
43
+ } // namespace grpc_event_engine
44
+
45
+ #endif // GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_PIPE_H
@@ -0,0 +1,76 @@
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
+ /*
16
+ * WakeupFd abstracts the concept of a file descriptor for the purpose of
17
+ * waking up a thread in select()/poll()/epoll_wait()/etc.
18
+
19
+ * The poll() family of system calls provide a way for a thread to block until
20
+ * there is activity on one (or more) of a set of file descriptors. An
21
+ * application may wish to wake up this thread to do non file related work. The
22
+ * typical way to do this is to add a pipe to the set of file descriptors, then
23
+ * write to the pipe to wake up the thread in poll().
24
+ *
25
+ * Linux has a lighter weight eventfd specifically designed for this purpose.
26
+ * WakeupFd abstracts the difference between the two.
27
+ *
28
+ * Setup:
29
+ * 1. Call CreateWakeupFd() to crete an initialized WakeupFd.
30
+ * 2. Add the result of WakeupFd::ReadFd() to the set of monitored file
31
+ * descriptors for the poll() style API you are using. Monitor the file
32
+ * descriptor for readability.
33
+ * 3. To tear down, call WakeupFd::Destroy(). This closes the underlying
34
+ * file descriptor.
35
+ *
36
+ * Usage:
37
+ * 1. To wake up a polling thread, call WakeupFd::Wakeup() on a wakeup_fd
38
+ * it is monitoring.
39
+ * 2. If the polling thread was awakened by a WakeupFd event, call
40
+ * WakeupFd::Consume() on it.
41
+ */
42
+ #ifndef GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_POSIX_H
43
+ #define GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_POSIX_H
44
+
45
+ #include <grpc/support/port_platform.h>
46
+
47
+ #include "absl/status/status.h"
48
+
49
+ namespace grpc_event_engine {
50
+ namespace posix_engine {
51
+
52
+ class WakeupFd {
53
+ public:
54
+ virtual absl::Status ConsumeWakeup() = 0;
55
+ virtual absl::Status Wakeup() = 0;
56
+ virtual ~WakeupFd() = default;
57
+
58
+ int ReadFd() { return read_fd_; }
59
+ int WriteFd() { return write_fd_; }
60
+
61
+ protected:
62
+ WakeupFd() : read_fd_(0), write_fd_(0) {}
63
+ void SetWakeupFds(int read_fd, int write_fd) {
64
+ read_fd_ = read_fd;
65
+ write_fd_ = write_fd;
66
+ }
67
+
68
+ private:
69
+ int read_fd_;
70
+ int write_fd_;
71
+ };
72
+
73
+ } // namespace posix_engine
74
+ } // namespace grpc_event_engine
75
+
76
+ #endif // GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_POSIX_H
@@ -0,0 +1,67 @@
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
+ #include <grpc/support/port_platform.h>
15
+
16
+ #include <memory>
17
+
18
+ #include "absl/status/status.h"
19
+ #include "absl/status/statusor.h"
20
+
21
+ #include "src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h"
22
+ #include "src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h"
23
+ #include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h"
24
+ #include "src/core/lib/iomgr/port.h"
25
+
26
+ namespace grpc_event_engine {
27
+ namespace posix_engine {
28
+
29
+ #ifdef GRPC_POSIX_WAKEUP_FD
30
+
31
+ absl::StatusOr<std::unique_ptr<WakeupFd>> NotSupported() {
32
+ return absl::NotFoundError("Wakeup-fd is not supported on this system");
33
+ }
34
+
35
+ namespace {
36
+ absl::StatusOr<std::unique_ptr<WakeupFd>> (*g_wakeup_fd_fn)() =
37
+ []() -> absl::StatusOr<std::unique_ptr<WakeupFd>> (*)() {
38
+ #ifndef GRPC_POSIX_NO_SPECIAL_WAKEUP_FD
39
+ if (EventFdWakeupFd::IsSupported()) {
40
+ return &EventFdWakeupFd::CreateEventFdWakeupFd;
41
+ }
42
+ #endif // GRPC_POSIX_NO_SPECIAL_WAKEUP_FD
43
+ if (PipeWakeupFd::IsSupported()) {
44
+ return &PipeWakeupFd::CreatePipeWakeupFd;
45
+ }
46
+ return NotSupported;
47
+ }();
48
+ } // namespace
49
+
50
+ bool SupportsWakeupFd() { return g_wakeup_fd_fn != NotSupported; }
51
+
52
+ absl::StatusOr<std::unique_ptr<WakeupFd>> CreateWakeupFd() {
53
+ return g_wakeup_fd_fn();
54
+ }
55
+
56
+ #else /* GRPC_POSIX_WAKEUP_FD */
57
+
58
+ bool SupportsWakeupFd() { return false; }
59
+
60
+ absl::StatusOr<std::unique_ptr<WakeupFd>> CreateWakeupFd() {
61
+ return absl::NotFoundError("Wakeup-fd is not supported on this system");
62
+ }
63
+
64
+ #endif /* GRPC_POSIX_WAKEUP_FD */
65
+
66
+ } // namespace posix_engine
67
+ } // namespace grpc_event_engine
@@ -0,0 +1,37 @@
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_WAKEUP_FD_POSIX_DEFAULT_H
16
+ #define GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_POSIX_DEFAULT_H
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include <memory>
20
+
21
+ #include "absl/status/statusor.h"
22
+
23
+ namespace grpc_event_engine {
24
+ namespace posix_engine {
25
+
26
+ class WakeupFd;
27
+
28
+ // Returns true if wakeup-fd is supported by the system.
29
+ bool SupportsWakeupFd();
30
+
31
+ // Create and return an initialized WakeupFd instance if supported.
32
+ absl::StatusOr<std::unique_ptr<WakeupFd>> CreateWakeupFd();
33
+
34
+ } // namespace posix_engine
35
+ } // namespace grpc_event_engine
36
+
37
+ #endif // GRPC_CORE_LIB_EVENT_ENGINE_POSIX_ENGINE_WAKEUP_FD_POSIX_DEFAULT_H
@@ -14,6 +14,8 @@
14
14
 
15
15
  #include <grpc/support/port_platform.h>
16
16
 
17
+ #include "src/core/lib/slice/slice.h"
18
+
17
19
  #include <stdint.h>
18
20
 
19
21
  #include <string>
@@ -25,14 +27,13 @@
25
27
 
26
28
  #include "src/core/lib/slice/slice_internal.h"
27
29
  #include "src/core/lib/slice/slice_refcount.h"
28
- #include "src/core/lib/slice/slice_refcount_base.h"
29
30
 
30
31
  namespace grpc_event_engine {
31
32
  namespace experimental {
32
33
 
33
34
  namespace slice_detail {
34
35
 
35
- uint32_t BaseSlice::Hash() const { return grpc_slice_hash_internal(slice_); }
36
+ uint32_t BaseSlice::Hash() const { return grpc_slice_hash(slice_); }
36
37
 
37
38
  template <>
38
39
  MutableSlice CopyConstructors<MutableSlice>::FromCopiedString(std::string s) {
@@ -51,7 +52,7 @@ MutableSlice::MutableSlice(const grpc_slice& slice)
51
52
  GPR_DEBUG_ASSERT(slice.refcount == nullptr || slice.refcount->IsUnique());
52
53
  }
53
54
 
54
- MutableSlice::~MutableSlice() { grpc_slice_unref_internal(c_slice()); }
55
+ MutableSlice::~MutableSlice() { grpc_core::CSliceUnref(c_slice()); }
55
56
 
56
57
  Slice Slice::TakeOwned() {
57
58
  if (c_slice().refcount == nullptr) {
@@ -70,7 +71,7 @@ Slice Slice::AsOwned() const {
70
71
  if (c_slice().refcount == grpc_slice_refcount::NoopRefcount()) {
71
72
  return Slice(grpc_slice_copy(c_slice()));
72
73
  }
73
- return Slice(grpc_slice_ref_internal(c_slice()));
74
+ return Slice(grpc_core::CSliceRef(c_slice()));
74
75
  }
75
76
 
76
77
  MutableSlice Slice::TakeMutable() {
@@ -84,9 +85,9 @@ MutableSlice Slice::TakeMutable() {
84
85
  return MutableSlice(grpc_slice_copy(c_slice()));
85
86
  }
86
87
 
87
- Slice::~Slice() { grpc_slice_unref_internal(c_slice()); }
88
+ Slice::~Slice() { grpc_core::CSliceUnref(c_slice()); }
88
89
 
89
- Slice Slice::Ref() const { return Slice(grpc_slice_ref_internal(c_slice())); }
90
+ Slice Slice::Ref() const { return Slice(grpc_core::CSliceRef(c_slice())); }
90
91
 
91
92
  Slice Slice::FromRefcountAndBytes(grpc_slice_refcount* r, const uint8_t* begin,
92
93
  const uint8_t* end) {
@@ -21,7 +21,7 @@
21
21
  #include <grpc/slice.h>
22
22
  #include <grpc/slice_buffer.h>
23
23
 
24
- #include "src/core/lib/slice/slice_refcount.h"
24
+ #include "src/core/lib/slice/slice.h"
25
25
 
26
26
  namespace grpc_event_engine {
27
27
  namespace experimental {
@@ -43,7 +43,7 @@ void SliceBuffer::Prepend(Slice slice) {
43
43
  }
44
44
 
45
45
  Slice SliceBuffer::RefSlice(size_t index) {
46
- return Slice(grpc_slice_ref_internal(slice_buffer_.slices[index]));
46
+ return Slice(grpc_core::CSliceRef(slice_buffer_.slices[index]));
47
47
  }
48
48
 
49
49
  } // namespace experimental
@@ -20,16 +20,18 @@
20
20
 
21
21
  #include "src/core/lib/event_engine/thread_pool.h"
22
22
 
23
+ #include <atomic>
23
24
  #include <memory>
24
25
  #include <utility>
25
26
 
27
+ #include "absl/base/attributes.h"
26
28
  #include "absl/time/clock.h"
27
29
  #include "absl/time/time.h"
28
30
 
29
31
  #include <grpc/support/log.h>
30
32
 
31
- #include "src/core/lib/gpr/tls.h"
32
33
  #include "src/core/lib/gprpp/thd.h"
34
+ #include "src/core/lib/gprpp/time.h"
33
35
 
34
36
  namespace grpc_event_engine {
35
37
  namespace experimental {
@@ -37,27 +39,63 @@ namespace experimental {
37
39
  namespace {
38
40
  // TODO(drfloob): Remove this, and replace it with the WorkQueue* for the
39
41
  // current thread (with nullptr indicating not a threadpool thread).
40
- GPR_THREAD_LOCAL(bool) g_threadpool_thread;
42
+ thread_local bool g_threadpool_thread;
41
43
  } // namespace
42
44
 
43
- void ThreadPool::StartThread(StatePtr state, bool throttled) {
45
+ void ThreadPool::StartThread(StatePtr state, StartThreadReason reason) {
44
46
  state->thread_count.Add();
47
+ const auto now = grpc_core::Timestamp::Now();
48
+ switch (reason) {
49
+ case StartThreadReason::kNoWaitersWhenScheduling: {
50
+ auto time_since_last_start =
51
+ now - grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(
52
+ state->last_started_thread.load(std::memory_order_relaxed));
53
+ if (time_since_last_start < grpc_core::Duration::Seconds(1)) {
54
+ state->thread_count.Remove();
55
+ return;
56
+ }
57
+ }
58
+ ABSL_FALLTHROUGH_INTENDED;
59
+ case StartThreadReason::kNoWaitersWhenFinishedStarting:
60
+ if (state->currently_starting_one_thread.exchange(
61
+ true, std::memory_order_relaxed)) {
62
+ state->thread_count.Remove();
63
+ return;
64
+ }
65
+ state->last_started_thread.store(now.milliseconds_after_process_epoch(),
66
+ std::memory_order_relaxed);
67
+ break;
68
+ case StartThreadReason::kInitialPool:
69
+ break;
70
+ }
45
71
  struct ThreadArg {
46
72
  StatePtr state;
47
- bool throttled;
73
+ StartThreadReason reason;
48
74
  };
49
75
  grpc_core::Thread(
50
76
  "event_engine",
51
77
  [](void* arg) {
52
78
  std::unique_ptr<ThreadArg> a(static_cast<ThreadArg*>(arg));
53
79
  g_threadpool_thread = true;
54
- if (a->throttled) {
55
- GPR_ASSERT(a->state->currently_starting_one_thread.exchange(
56
- false, std::memory_order_relaxed));
80
+ switch (a->reason) {
81
+ case StartThreadReason::kInitialPool:
82
+ break;
83
+ case StartThreadReason::kNoWaitersWhenFinishedStarting:
84
+ a->state->queue.SleepIfRunning();
85
+ ABSL_FALLTHROUGH_INTENDED;
86
+ case StartThreadReason::kNoWaitersWhenScheduling:
87
+ // Release throttling variable
88
+ GPR_ASSERT(a->state->currently_starting_one_thread.exchange(
89
+ false, std::memory_order_relaxed));
90
+ if (a->state->queue.IsBacklogged()) {
91
+ StartThread(a->state,
92
+ StartThreadReason::kNoWaitersWhenFinishedStarting);
93
+ }
94
+ break;
57
95
  }
58
96
  ThreadFunc(a->state);
59
97
  },
60
- new ThreadArg{state, throttled}, nullptr,
98
+ new ThreadArg{state, reason}, nullptr,
61
99
  grpc_core::Thread::Options().set_tracked(false).set_joinable(false))
62
100
  .Start();
63
101
  }
@@ -74,10 +112,18 @@ bool ThreadPool::Queue::Step() {
74
112
  while (state_ == State::kRunning && callbacks_.empty()) {
75
113
  // If there are too many threads waiting, then quit this thread.
76
114
  // TODO(ctiller): wait some time in this case to be sure.
77
- if (threads_waiting_ >= reserve_threads_) return false;
78
- threads_waiting_++;
79
- cv_.Wait(&mu_);
80
- threads_waiting_--;
115
+ if (threads_waiting_ >= reserve_threads_) {
116
+ threads_waiting_++;
117
+ bool timeout = cv_.WaitWithTimeout(&mu_, absl::Seconds(30));
118
+ threads_waiting_--;
119
+ if (timeout && threads_waiting_ >= reserve_threads_) {
120
+ return false;
121
+ }
122
+ } else {
123
+ threads_waiting_++;
124
+ cv_.Wait(&mu_);
125
+ threads_waiting_--;
126
+ }
81
127
  }
82
128
  switch (state_) {
83
129
  case State::kRunning:
@@ -95,14 +141,13 @@ bool ThreadPool::Queue::Step() {
95
141
  return true;
96
142
  }
97
143
 
98
- ThreadPool::ThreadPool(int reserve_threads)
99
- : reserve_threads_(reserve_threads) {
100
- for (int i = 0; i < reserve_threads; i++) {
101
- StartThread(state_, /*throttled=*/false);
144
+ ThreadPool::ThreadPool() {
145
+ for (unsigned i = 0; i < reserve_threads_; i++) {
146
+ StartThread(state_, StartThreadReason::kInitialPool);
102
147
  }
103
148
  }
104
149
 
105
- ThreadPool::~ThreadPool() {
150
+ void ThreadPool::Quiesce() {
106
151
  state_->queue.SetShutdown();
107
152
  // Wait until all threads are exited.
108
153
  // Note that if this is a threadpool thread then we won't exit this thread
@@ -110,17 +155,24 @@ ThreadPool::~ThreadPool() {
110
155
  // thread running instead of zero.
111
156
  state_->thread_count.BlockUntilThreadCount(g_threadpool_thread ? 1 : 0,
112
157
  "shutting down");
158
+ quiesced_.store(true, std::memory_order_relaxed);
159
+ }
160
+
161
+ ThreadPool::~ThreadPool() {
162
+ GPR_ASSERT(quiesced_.load(std::memory_order_relaxed));
113
163
  }
114
164
 
115
- void ThreadPool::Add(absl::AnyInvocable<void()> callback) {
165
+ void ThreadPool::Run(absl::AnyInvocable<void()> callback) {
166
+ GPR_DEBUG_ASSERT(quiesced_.load(std::memory_order_relaxed) == false);
116
167
  if (state_->queue.Add(std::move(callback))) {
117
- if (!state_->currently_starting_one_thread.exchange(
118
- true, std::memory_order_relaxed)) {
119
- StartThread(state_, /*throttled=*/true);
120
- }
168
+ StartThread(state_, StartThreadReason::kNoWaitersWhenScheduling);
121
169
  }
122
170
  }
123
171
 
172
+ void ThreadPool::Run(EventEngine::Closure* closure) {
173
+ Run([closure]() { closure->Run(); });
174
+ }
175
+
124
176
  bool ThreadPool::Queue::Add(absl::AnyInvocable<void()> callback) {
125
177
  grpc_core::MutexLock lock(&mu_);
126
178
  // Add works to the callbacks list
@@ -129,13 +181,42 @@ bool ThreadPool::Queue::Add(absl::AnyInvocable<void()> callback) {
129
181
  switch (state_) {
130
182
  case State::kRunning:
131
183
  case State::kShutdown:
132
- return threads_waiting_ == 0;
184
+ return callbacks_.size() > threads_waiting_;
133
185
  case State::kForking:
134
186
  return false;
135
187
  }
136
188
  GPR_UNREACHABLE_CODE(return false);
137
189
  }
138
190
 
191
+ bool ThreadPool::Queue::IsBacklogged() {
192
+ grpc_core::MutexLock lock(&mu_);
193
+ switch (state_) {
194
+ case State::kRunning:
195
+ case State::kShutdown:
196
+ return callbacks_.size() > 1;
197
+ case State::kForking:
198
+ return false;
199
+ }
200
+ GPR_UNREACHABLE_CODE(return false);
201
+ }
202
+
203
+ void ThreadPool::Queue::SleepIfRunning() {
204
+ grpc_core::MutexLock lock(&mu_);
205
+ auto end = grpc_core::Duration::Seconds(1) + grpc_core::Timestamp::Now();
206
+ while (true) {
207
+ grpc_core::Timestamp now = grpc_core::Timestamp::Now();
208
+ if (now >= end) return;
209
+ switch (state_) {
210
+ case State::kRunning:
211
+ case State::kShutdown:
212
+ cv_.WaitWithTimeout(&mu_, absl::Milliseconds((end - now).millis()));
213
+ break;
214
+ case State::kForking:
215
+ return;
216
+ }
217
+ }
218
+ }
219
+
139
220
  void ThreadPool::Queue::SetState(State state) {
140
221
  grpc_core::MutexLock lock(&mu_);
141
222
  if (state == State::kRunning) {
@@ -186,8 +267,8 @@ void ThreadPool::PostforkChild() { Postfork(); }
186
267
 
187
268
  void ThreadPool::Postfork() {
188
269
  state_->queue.Reset();
189
- for (int i = 0; i < reserve_threads_; i++) {
190
- StartThread(state_, /*throttled=*/false);
270
+ for (unsigned i = 0; i < reserve_threads_; i++) {
271
+ StartThread(state_, StartThreadReason::kInitialPool);
191
272
  }
192
273
  }
193
274