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,505 @@
1
+ // Copyright 2021 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_PROMISE_PIPE_H
16
+ #define GRPC_CORE_LIB_PROMISE_PIPE_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <stdint.h>
21
+
22
+ #include <string>
23
+ #include <utility>
24
+
25
+ #include "absl/strings/str_cat.h"
26
+ #include "absl/types/optional.h"
27
+ #include "absl/types/variant.h"
28
+
29
+ #include <grpc/support/log.h>
30
+
31
+ #include "src/core/lib/debug/trace.h"
32
+ #include "src/core/lib/promise/activity.h"
33
+ #include "src/core/lib/promise/context.h"
34
+ #include "src/core/lib/promise/intra_activity_waiter.h"
35
+ #include "src/core/lib/promise/poll.h"
36
+ #include "src/core/lib/resource_quota/arena.h"
37
+
38
+ extern grpc_core::DebugOnlyTraceFlag grpc_trace_promise_pipe;
39
+
40
+ namespace grpc_core {
41
+
42
+ namespace pipe_detail {
43
+ template <typename T>
44
+ class Center;
45
+ }
46
+
47
+ template <typename T>
48
+ struct Pipe;
49
+
50
+ // Result of Pipe::Next - represents a received value.
51
+ // If has_value() is false, the pipe was closed by the time we polled for the
52
+ // next value. No value was received, nor will there ever be.
53
+ // This type is movable but not copyable.
54
+ // Once the final move is destroyed the pipe will ack the read and unblock the
55
+ // send.
56
+ template <typename T>
57
+ class NextResult final {
58
+ public:
59
+ explicit NextResult(pipe_detail::Center<T>* center) : center_(center) {}
60
+ ~NextResult();
61
+ NextResult(const NextResult&) = delete;
62
+ NextResult& operator=(const NextResult&) = delete;
63
+ NextResult(NextResult&& other) noexcept
64
+ : center_(std::exchange(other.center_, nullptr)) {}
65
+ NextResult& operator=(NextResult&& other) noexcept {
66
+ center_ = std::exchange(other.center_, nullptr);
67
+ return *this;
68
+ }
69
+
70
+ using value_type = T;
71
+
72
+ void reset();
73
+ bool has_value() const;
74
+ const T& value() const {
75
+ GPR_ASSERT(has_value());
76
+ return **this;
77
+ }
78
+ T& value() {
79
+ GPR_ASSERT(has_value());
80
+ return **this;
81
+ }
82
+ const T& operator*() const;
83
+ T& operator*();
84
+
85
+ private:
86
+ pipe_detail::Center<T>* center_;
87
+ };
88
+
89
+ namespace pipe_detail {
90
+
91
+ template <typename T>
92
+ class Push;
93
+ template <typename T>
94
+ class Next;
95
+
96
+ // Center sits between a sender and a receiver to provide a one-deep buffer of
97
+ // Ts
98
+ template <typename T>
99
+ class Center {
100
+ public:
101
+ // Initialize with one send ref (held by PipeSender) and one recv ref (held by
102
+ // PipeReceiver)
103
+ Center() {
104
+ send_refs_ = 1;
105
+ recv_refs_ = 1;
106
+ value_state_ = ValueState::kEmpty;
107
+ }
108
+
109
+ // Add one ref to the send side of this object, and return this.
110
+ Center* RefSend() {
111
+ if (grpc_trace_promise_pipe.enabled()) {
112
+ gpr_log(GPR_INFO, "%s", DebugOpString("RefSend").c_str());
113
+ }
114
+ send_refs_++;
115
+ GPR_ASSERT(send_refs_ != 0);
116
+ return this;
117
+ }
118
+
119
+ // Add one ref to the recv side of this object, and return this.
120
+ Center* RefRecv() {
121
+ if (grpc_trace_promise_pipe.enabled()) {
122
+ gpr_log(GPR_INFO, "%s", DebugOpString("RefRecv").c_str());
123
+ }
124
+ recv_refs_++;
125
+ GPR_ASSERT(recv_refs_ != 0);
126
+ return this;
127
+ }
128
+
129
+ // Drop a send side ref
130
+ // If no send refs remain, wake due to send closure
131
+ // If no refs remain, destroy this object
132
+ void UnrefSend() {
133
+ if (grpc_trace_promise_pipe.enabled()) {
134
+ gpr_log(GPR_INFO, "%s", DebugOpString("UnrefSend").c_str());
135
+ }
136
+ GPR_DEBUG_ASSERT(send_refs_ > 0);
137
+ send_refs_--;
138
+ if (0 == send_refs_) {
139
+ on_full_.Wake();
140
+ on_empty_.Wake();
141
+ if (0 == recv_refs_) {
142
+ this->~Center();
143
+ }
144
+ }
145
+ }
146
+
147
+ // Drop a recv side ref
148
+ // If no recv refs remain, wake due to recv closure
149
+ // If no refs remain, destroy this object
150
+ void UnrefRecv() {
151
+ if (grpc_trace_promise_pipe.enabled()) {
152
+ gpr_log(GPR_INFO, "%s", DebugOpString("UnrefRecv").c_str());
153
+ }
154
+ GPR_DEBUG_ASSERT(recv_refs_ > 0);
155
+ recv_refs_--;
156
+ if (0 == recv_refs_) {
157
+ on_full_.Wake();
158
+ on_empty_.Wake();
159
+ if (0 == send_refs_) {
160
+ this->~Center();
161
+ } else if (value_state_ == ValueState::kReady) {
162
+ ResetValue();
163
+ }
164
+ }
165
+ }
166
+
167
+ // Try to push *value into the pipe.
168
+ // Return Pending if there is no space.
169
+ // Return true if the value was pushed.
170
+ // Return false if the recv end is closed.
171
+ Poll<bool> Push(T* value) {
172
+ if (grpc_trace_promise_pipe.enabled()) {
173
+ gpr_log(GPR_INFO, "%s", DebugOpString("Push").c_str());
174
+ }
175
+ GPR_DEBUG_ASSERT(send_refs_ != 0);
176
+ if (recv_refs_ == 0) return false;
177
+ if (value_state_ != ValueState::kEmpty) return on_empty_.pending();
178
+ value_state_ = ValueState::kReady;
179
+ value_ = std::move(*value);
180
+ on_full_.Wake();
181
+ return true;
182
+ }
183
+
184
+ Poll<bool> PollAck() {
185
+ if (grpc_trace_promise_pipe.enabled()) {
186
+ gpr_log(GPR_INFO, "%s", DebugOpString("PollAck").c_str());
187
+ }
188
+ GPR_DEBUG_ASSERT(send_refs_ != 0);
189
+ if (recv_refs_ == 0) return value_state_ == ValueState::kAcked;
190
+ if (value_state_ != ValueState::kAcked) return on_empty_.pending();
191
+ value_state_ = ValueState::kEmpty;
192
+ return true;
193
+ }
194
+
195
+ // Try to receive a value from the pipe.
196
+ // Return Pending if there is no value.
197
+ // Return the value if one was retrieved.
198
+ // Return nullopt if the send end is closed and no value had been pushed.
199
+ Poll<NextResult<T>> Next() {
200
+ if (grpc_trace_promise_pipe.enabled()) {
201
+ gpr_log(GPR_INFO, "%s", DebugOpString("Next").c_str());
202
+ }
203
+ GPR_DEBUG_ASSERT(recv_refs_ != 0);
204
+ if (value_state_ != ValueState::kReady) {
205
+ if (send_refs_ == 0) return NextResult<T>(nullptr);
206
+ return on_full_.pending();
207
+ }
208
+ return NextResult<T>(RefRecv());
209
+ }
210
+
211
+ void AckNext() {
212
+ if (grpc_trace_promise_pipe.enabled()) {
213
+ gpr_log(GPR_INFO, "%s", DebugOpString("AckNext").c_str());
214
+ }
215
+ GPR_DEBUG_ASSERT(value_state_ == ValueState::kReady);
216
+ value_state_ = ValueState::kAcked;
217
+ on_empty_.Wake();
218
+ UnrefRecv();
219
+ }
220
+
221
+ T& value() { return value_; }
222
+ const T& value() const { return value_; }
223
+
224
+ private:
225
+ std::string DebugTag() {
226
+ return absl::StrCat(Activity::current()->DebugTag(), "PIPE[0x",
227
+ reinterpret_cast<uintptr_t>(this), "]: ");
228
+ }
229
+ std::string DebugOpString(std::string op) {
230
+ return absl::StrCat(DebugTag(), op, " send_refs=", send_refs_,
231
+ " recv_refs=", recv_refs_,
232
+ " value_state=", ValueStateName(value_state_));
233
+ }
234
+ void ResetValue() {
235
+ // Fancy dance to move out of value in the off chance that we reclaim some
236
+ // memory earlier.
237
+ [](T) {}(std::move(value_));
238
+ value_state_ = ValueState::kEmpty;
239
+ }
240
+ // State of value_.
241
+ enum class ValueState : uint8_t {
242
+ // No value is set, it's possible to send.
243
+ kEmpty,
244
+ // Value has been pushed but not acked, it's possible to receive.
245
+ kReady,
246
+ // Value has been received and acked, we can unblock senders and transition
247
+ // to empty.
248
+ kAcked,
249
+ };
250
+ static const char* ValueStateName(ValueState state) {
251
+ switch (state) {
252
+ case ValueState::kEmpty:
253
+ return "kEmpty";
254
+ case ValueState::kReady:
255
+ return "kReady";
256
+ case ValueState::kAcked:
257
+ return "kAcked";
258
+ }
259
+ GPR_UNREACHABLE_CODE(return "unknown");
260
+ }
261
+ T value_;
262
+ // Number of sending objects.
263
+ // 0 => send is closed.
264
+ // 1 ref each for PipeSender and Push.
265
+ uint8_t send_refs_ : 2;
266
+ // Number of receiving objects.
267
+ // 0 => recv is closed.
268
+ // 1 ref each for PipeReceiver, Next, and NextResult.
269
+ uint8_t recv_refs_ : 2;
270
+ // Current state of the value.
271
+ ValueState value_state_ : 2;
272
+ IntraActivityWaiter on_empty_;
273
+ IntraActivityWaiter on_full_;
274
+ };
275
+
276
+ } // namespace pipe_detail
277
+
278
+ // Send end of a Pipe.
279
+ template <typename T>
280
+ class PipeSender {
281
+ public:
282
+ using PushType = pipe_detail::Push<T>;
283
+
284
+ PipeSender(const PipeSender&) = delete;
285
+ PipeSender& operator=(const PipeSender&) = delete;
286
+
287
+ PipeSender(PipeSender&& other) noexcept : center_(other.center_) {
288
+ other.center_ = nullptr;
289
+ }
290
+ PipeSender& operator=(PipeSender&& other) noexcept {
291
+ if (center_ != nullptr) center_->UnrefSend();
292
+ center_ = other.center_;
293
+ other.center_ = nullptr;
294
+ return *this;
295
+ }
296
+
297
+ ~PipeSender() {
298
+ if (center_ != nullptr) center_->UnrefSend();
299
+ }
300
+
301
+ void Close() {
302
+ if (auto* center = std::exchange(center_, nullptr)) center->UnrefSend();
303
+ }
304
+
305
+ void Swap(PipeSender<T>* other) { std::swap(center_, other->center_); }
306
+
307
+ // Send a single message along the pipe.
308
+ // Returns a promise that will resolve to a bool - true if the message was
309
+ // sent, false if it could never be sent. Blocks the promise until the
310
+ // receiver is either closed or able to receive another message.
311
+ PushType Push(T value);
312
+
313
+ private:
314
+ friend struct Pipe<T>;
315
+ explicit PipeSender(pipe_detail::Center<T>* center) : center_(center) {}
316
+ pipe_detail::Center<T>* center_;
317
+ };
318
+
319
+ // Receive end of a Pipe.
320
+ template <typename T>
321
+ class PipeReceiver {
322
+ public:
323
+ using NextType = pipe_detail::Next<T>;
324
+
325
+ PipeReceiver(const PipeReceiver&) = delete;
326
+ PipeReceiver& operator=(const PipeReceiver&) = delete;
327
+
328
+ PipeReceiver(PipeReceiver&& other) noexcept : center_(other.center_) {
329
+ other.center_ = nullptr;
330
+ }
331
+ PipeReceiver& operator=(PipeReceiver&& other) noexcept {
332
+ if (center_ != nullptr) center_->UnrefRecv();
333
+ center_ = other.center_;
334
+ other.center_ = nullptr;
335
+ return *this;
336
+ }
337
+ ~PipeReceiver() {
338
+ if (center_ != nullptr) center_->UnrefRecv();
339
+ }
340
+
341
+ void Swap(PipeReceiver<T>* other) { std::swap(center_, other->center_); }
342
+
343
+ // Receive a single message from the pipe.
344
+ // Returns a promise that will resolve to an optional<T> - with a value if a
345
+ // message was received, or no value if the other end of the pipe was closed.
346
+ // Blocks the promise until the receiver is either closed or a message is
347
+ // available.
348
+ NextType Next();
349
+
350
+ private:
351
+ friend struct Pipe<T>;
352
+ explicit PipeReceiver(pipe_detail::Center<T>* center) : center_(center) {}
353
+ pipe_detail::Center<T>* center_;
354
+ };
355
+
356
+ namespace pipe_detail {
357
+
358
+ // Implementation of PipeSender::Push promise.
359
+ template <typename T>
360
+ class Push {
361
+ public:
362
+ Push(const Push&) = delete;
363
+ Push& operator=(const Push&) = delete;
364
+ Push(Push&& other) noexcept
365
+ : center_(other.center_), push_(std::move(other.push_)) {
366
+ other.center_ = nullptr;
367
+ }
368
+ Push& operator=(Push&& other) noexcept {
369
+ if (center_ != nullptr) center_->UnrefSend();
370
+ center_ = other.center_;
371
+ other.center_ = nullptr;
372
+ push_ = std::move(other.push_);
373
+ return *this;
374
+ }
375
+
376
+ ~Push() {
377
+ if (center_ != nullptr) center_->UnrefSend();
378
+ }
379
+
380
+ Poll<bool> operator()() {
381
+ if (push_.has_value()) {
382
+ auto r = center_->Push(&*push_);
383
+ if (auto* ok = absl::get_if<bool>(&r)) {
384
+ push_.reset();
385
+ if (!*ok) return false;
386
+ } else {
387
+ return Pending{};
388
+ }
389
+ }
390
+ GPR_DEBUG_ASSERT(!push_.has_value());
391
+ return center_->PollAck();
392
+ }
393
+
394
+ private:
395
+ friend class PipeSender<T>;
396
+ explicit Push(pipe_detail::Center<T>* center, T push)
397
+ : center_(center), push_(std::move(push)) {}
398
+ Center<T>* center_;
399
+ absl::optional<T> push_;
400
+ };
401
+
402
+ // Implementation of PipeReceiver::Next promise.
403
+ template <typename T>
404
+ class Next {
405
+ public:
406
+ Next(const Next&) = delete;
407
+ Next& operator=(const Next&) = delete;
408
+ Next(Next&& other) noexcept : center_(other.center_) {
409
+ other.center_ = nullptr;
410
+ }
411
+ Next& operator=(Next&& other) noexcept {
412
+ if (center_ != nullptr) center_->UnrefRecv();
413
+ center_ = other.center_;
414
+ other.center_ = nullptr;
415
+ return *this;
416
+ }
417
+
418
+ ~Next() {
419
+ if (center_ != nullptr) center_->UnrefRecv();
420
+ }
421
+
422
+ Poll<NextResult<T>> operator()() {
423
+ auto r = center_->Next();
424
+ if (!absl::holds_alternative<Pending>(r)) {
425
+ std::exchange(center_, nullptr)->UnrefRecv();
426
+ }
427
+ return r;
428
+ }
429
+
430
+ private:
431
+ friend class PipeReceiver<T>;
432
+ explicit Next(pipe_detail::Center<T>* center) : center_(center) {}
433
+ Center<T>* center_;
434
+ };
435
+
436
+ } // namespace pipe_detail
437
+
438
+ template <typename T>
439
+ pipe_detail::Push<T> PipeSender<T>::Push(T value) {
440
+ return pipe_detail::Push<T>(center_->RefSend(), std::move(value));
441
+ }
442
+
443
+ template <typename T>
444
+ pipe_detail::Next<T> PipeReceiver<T>::Next() {
445
+ return pipe_detail::Next<T>(center_->RefRecv());
446
+ }
447
+
448
+ template <typename T>
449
+ bool NextResult<T>::has_value() const {
450
+ return center_ != nullptr;
451
+ }
452
+
453
+ template <typename T>
454
+ T& NextResult<T>::operator*() {
455
+ return center_->value();
456
+ }
457
+
458
+ template <typename T>
459
+ const T& NextResult<T>::operator*() const {
460
+ return center_->value();
461
+ }
462
+
463
+ template <typename T>
464
+ NextResult<T>::~NextResult() {
465
+ if (center_ != nullptr) center_->AckNext();
466
+ }
467
+
468
+ template <typename T>
469
+ void NextResult<T>::reset() {
470
+ if (auto* p = std::exchange(center_, nullptr)) p->AckNext();
471
+ }
472
+
473
+ // A Pipe is an intra-Activity communications channel that transmits T's from
474
+ // one end to the other.
475
+ // It is only safe to use a Pipe within the context of a single Activity.
476
+ // No synchronization is performed internally.
477
+ // The primary Pipe data structure is allocated from an arena, so the activity
478
+ // must have an arena as part of its context.
479
+ // By performing that allocation we can ensure stable pointer to shared data
480
+ // allowing PipeSender/PipeReceiver/Push/Next to be relatively simple in their
481
+ // implementation.
482
+ // This type has been optimized with the expectation that there are relatively
483
+ // few pipes per activity. If this assumption does not hold then a design
484
+ // allowing inline filtering of pipe contents (instead of connecting pipes with
485
+ // polling code) would likely be more appropriate.
486
+ template <typename T>
487
+ struct Pipe {
488
+ Pipe() : Pipe(GetContext<Arena>()) {}
489
+ explicit Pipe(Arena* arena) : Pipe(arena->New<pipe_detail::Center<T>>()) {}
490
+ Pipe(const Pipe&) = delete;
491
+ Pipe& operator=(const Pipe&) = delete;
492
+ Pipe(Pipe&&) noexcept = default;
493
+ Pipe& operator=(Pipe&&) noexcept = default;
494
+
495
+ PipeSender<T> sender;
496
+ PipeReceiver<T> receiver;
497
+
498
+ private:
499
+ explicit Pipe(pipe_detail::Center<T>* center)
500
+ : sender(center), receiver(center) {}
501
+ };
502
+
503
+ } // namespace grpc_core
504
+
505
+ #endif // GRPC_CORE_LIB_PROMISE_PIPE_H
@@ -19,6 +19,8 @@
19
19
 
20
20
  #include <stddef.h>
21
21
 
22
+ #include <string>
23
+
22
24
  #include "absl/types/variant.h"
23
25
 
24
26
  namespace grpc_core {
@@ -61,6 +63,17 @@ struct PollTraits<Poll<T>> {
61
63
  static constexpr bool is_poll() { return true; }
62
64
  };
63
65
 
66
+ // Convert a poll to a string
67
+ template <typename T, typename F>
68
+ std::string PollToString(
69
+ const Poll<T>& poll,
70
+ F t_to_string = [](const T& t) { return t.ToString(); }) {
71
+ if (absl::holds_alternative<Pending>(poll)) {
72
+ return "<<pending>>";
73
+ }
74
+ return t_to_string(absl::get<T>(poll));
75
+ }
76
+
64
77
  } // namespace grpc_core
65
78
 
66
79
  #endif // GRPC_CORE_LIB_PROMISE_POLL_H
@@ -32,13 +32,11 @@ struct SeqTraits {
32
32
  using UnwrappedType = T;
33
33
  using WrappedType = T;
34
34
  template <typename Next>
35
- static auto CallFactory(Next* next, T&& value)
36
- -> decltype(next->Once(std::forward<T>(value))) {
37
- return next->Once(std::forward<T>(value));
35
+ static auto CallFactory(Next* next, T&& value) {
36
+ return next->Make(std::forward<T>(value));
38
37
  }
39
38
  template <typename F, typename Elem>
40
- static auto CallSeqFactory(F& f, Elem&& elem, T&& value)
41
- -> decltype(f(std::forward<Elem>(elem), std::forward<T>(value))) {
39
+ static auto CallSeqFactory(F& f, Elem&& elem, T&& value) {
42
40
  return f(std::forward<Elem>(elem), std::forward<T>(value));
43
41
  }
44
42
  template <typename Result, typename PriorResult, typename RunNext>
@@ -20,15 +20,16 @@
20
20
 
21
21
  #include <grpc/event_engine/event_engine.h>
22
22
 
23
- #include "src/core/lib/event_engine/default_event_engine.h"
23
+ #include "src/core/lib/event_engine/default_event_engine.h" // IWYU pragma: keep
24
24
  #include "src/core/lib/gprpp/time.h"
25
25
  #include "src/core/lib/iomgr/exec_ctx.h"
26
26
  #include "src/core/lib/promise/activity.h"
27
+ #include "src/core/lib/promise/context.h"
27
28
  #include "src/core/lib/promise/poll.h"
28
29
 
29
30
  namespace grpc_core {
30
31
 
31
- using ::grpc_event_engine::experimental::GetDefaultEventEngine;
32
+ using ::grpc_event_engine::experimental::EventEngine;
32
33
 
33
34
  Sleep::Sleep(Timestamp deadline) : deadline_(deadline) {}
34
35
 
@@ -53,7 +54,7 @@ Poll<absl::Status> Sleep::operator()() {
53
54
 
54
55
  Sleep::ActiveClosure::ActiveClosure(Timestamp deadline)
55
56
  : waker_(Activity::current()->MakeOwningWaker()),
56
- timer_handle_(GetDefaultEventEngine()->RunAfter(
57
+ timer_handle_(GetContext<EventEngine>()->RunAfter(
57
58
  deadline - Timestamp::Now(), this)) {}
58
59
 
59
60
  void Sleep::ActiveClosure::Run() {
@@ -71,7 +72,7 @@ void Sleep::ActiveClosure::Cancel() {
71
72
  // If we cancel correctly then we must own both refs still and can simply
72
73
  // delete without unreffing twice, otherwise try unreffing since this may be
73
74
  // the last owned ref.
74
- if (GetDefaultEventEngine()->Cancel(timer_handle_) || Unref()) {
75
+ if (HasRun() || GetContext<EventEngine>()->Cancel(timer_handle_) || Unref()) {
75
76
  delete this;
76
77
  }
77
78
  }
@@ -72,8 +72,7 @@ class Sleep final {
72
72
  Waker waker_;
73
73
  // One ref dropped by Run(), the other by Cancel().
74
74
  std::atomic<int> refs_{2};
75
- const grpc_event_engine::experimental::EventEngine::TaskHandle
76
- timer_handle_;
75
+ grpc_event_engine::experimental::EventEngine::TaskHandle timer_handle_;
77
76
  };
78
77
 
79
78
  Timestamp deadline_;