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,341 @@
1
+ // Copyright 2022 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_CORE_LIB_PROMISE_TRY_CONCURRENTLY_H
16
+ #define GRPC_CORE_LIB_PROMISE_TRY_CONCURRENTLY_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <stddef.h>
21
+
22
+ #include <cstdint>
23
+ #include <utility>
24
+
25
+ #include "absl/types/variant.h"
26
+
27
+ #include <grpc/support/log.h>
28
+
29
+ #include "src/core/lib/gprpp/construct_destruct.h"
30
+ #include "src/core/lib/promise/detail/promise_like.h"
31
+ #include "src/core/lib/promise/detail/status.h"
32
+ #include "src/core/lib/promise/poll.h"
33
+
34
+ namespace grpc_core {
35
+
36
+ namespace promise_detail {
37
+
38
+ template <typename Promise>
39
+ struct Necessary {
40
+ PromiseLike<Promise> promise;
41
+ static constexpr bool must_complete() { return true; }
42
+ };
43
+
44
+ template <typename Promise>
45
+ struct Helper {
46
+ PromiseLike<Promise> promise;
47
+ static constexpr bool must_complete() { return false; }
48
+ };
49
+
50
+ // A set of promises that can be polled concurrently.
51
+ // Fuses them when completed (that is, destroys the promise and records it
52
+ // completed).
53
+ // Relies on an external bit field to handle the recording: this saves a bunch
54
+ // of space, but means the implementation of this type is weird: it's really
55
+ // super tied to TryConcurrently and no attempt should be made to use this
56
+ // independently.
57
+ template <typename... Ts>
58
+ class FusedSet;
59
+
60
+ template <typename T, typename... Ts>
61
+ class FusedSet<T, Ts...> : public FusedSet<Ts...> {
62
+ public:
63
+ explicit FusedSet(T&& x, Ts&&... xs)
64
+ : FusedSet<Ts...>(std::forward<T>(xs)...) {
65
+ Construct(&wrapper_, std::forward<T>(x));
66
+ }
67
+ explicit FusedSet(T&& x, FusedSet<Ts...>&& xs)
68
+ : FusedSet<Ts...>(std::forward<FusedSet<Ts...>>(xs)) {
69
+ Construct(&wrapper_, std::forward<T>(x));
70
+ }
71
+ // Empty destructor: consumers must call Destroy() to ensure cleanup occurs
72
+ ~FusedSet() {}
73
+
74
+ FusedSet(const FusedSet&) = delete;
75
+ FusedSet& operator=(const FusedSet&) = delete;
76
+
77
+ // Assumes all 'done_bits' for other are 0 and will be set to 1
78
+ FusedSet(FusedSet&& other) noexcept : FusedSet<Ts...>(std::move(other)) {
79
+ Construct(&wrapper_, std::move(other.wrapper_));
80
+ Destruct(&other.wrapper_);
81
+ }
82
+
83
+ static constexpr size_t Size() { return 1 + sizeof...(Ts); }
84
+
85
+ static constexpr uint8_t NecessaryBits() {
86
+ return (T::must_complete() ? 1 : 0) |
87
+ (FusedSet<Ts...>::NecessaryBits() << 1);
88
+ }
89
+
90
+ template <int kDoneBit>
91
+ void Destroy(uint8_t done_bits) {
92
+ if ((done_bits & (1 << kDoneBit)) == 0) {
93
+ Destruct(&wrapper_);
94
+ }
95
+ FusedSet<Ts...>::template Destroy<kDoneBit + 1>(done_bits);
96
+ }
97
+
98
+ template <typename Result, int kDoneBit>
99
+ Poll<Result> Run(uint8_t& done_bits) {
100
+ if ((done_bits & (1 << kDoneBit)) == 0) {
101
+ auto p = wrapper_.promise();
102
+ if (auto* status = absl::get_if<kPollReadyIdx>(&p)) {
103
+ done_bits |= (1 << kDoneBit);
104
+ Destruct(&wrapper_);
105
+ if (!IsStatusOk(*status)) {
106
+ return StatusCast<Result>(std::move(*status));
107
+ }
108
+ }
109
+ }
110
+ return FusedSet<Ts...>::template Run<Result, kDoneBit + 1>(done_bits);
111
+ }
112
+
113
+ template <typename P>
114
+ FusedSet<P, T, Ts...> With(P x) {
115
+ return FusedSet<P, T, Ts...>(std::move(x), std::move(*this));
116
+ }
117
+
118
+ private:
119
+ union {
120
+ T wrapper_;
121
+ };
122
+ };
123
+
124
+ template <>
125
+ class FusedSet<> {
126
+ public:
127
+ static constexpr size_t Size() { return 0; }
128
+ static constexpr uint8_t NecessaryBits() { return 0; }
129
+
130
+ template <typename Result, int kDoneBit>
131
+ Poll<Result> Run(uint8_t) {
132
+ return Pending{};
133
+ }
134
+ template <int kDoneBit>
135
+ void Destroy(uint8_t) {}
136
+
137
+ template <typename P>
138
+ FusedSet<P> With(P x) {
139
+ return FusedSet<P>(std::move(x));
140
+ }
141
+ };
142
+
143
+ template <typename Main, typename PreMain, typename PostMain>
144
+ class TryConcurrently {
145
+ public:
146
+ TryConcurrently(Main main, PreMain pre_main, PostMain post_main)
147
+ : done_bits_(0),
148
+ pre_main_(std::move(pre_main)),
149
+ post_main_(std::move(post_main)) {
150
+ Construct(&main_, std::move(main));
151
+ }
152
+
153
+ TryConcurrently(const TryConcurrently&) = delete;
154
+ TryConcurrently& operator=(const TryConcurrently&) = delete;
155
+ TryConcurrently(TryConcurrently&& other) noexcept
156
+ : done_bits_(0),
157
+ pre_main_(std::move(other.pre_main_)),
158
+ post_main_(std::move(other.post_main_)) {
159
+ GPR_DEBUG_ASSERT(other.done_bits_ == 0);
160
+ other.done_bits_ = HelperBits();
161
+ Construct(&main_, std::move(other.main_));
162
+ }
163
+ TryConcurrently& operator=(TryConcurrently&& other) noexcept {
164
+ GPR_DEBUG_ASSERT(other.done_bits_ == 0);
165
+ done_bits_ = 0;
166
+ other.done_bits_ = HelperBits();
167
+ pre_main_ = std::move(other.pre_main_);
168
+ post_main_ = std::move(other.post_main_);
169
+ Construct(&main_, std::move(other.main_));
170
+ return *this;
171
+ }
172
+
173
+ ~TryConcurrently() {
174
+ if (done_bits_ & 1) {
175
+ Destruct(&result_);
176
+ } else {
177
+ Destruct(&main_);
178
+ }
179
+ pre_main_.template Destroy<1>(done_bits_);
180
+ post_main_.template Destroy<1 + PreMain::Size()>(done_bits_);
181
+ }
182
+
183
+ using Result =
184
+ typename PollTraits<decltype(std::declval<PromiseLike<Main>>()())>::Type;
185
+
186
+ Poll<Result> operator()() {
187
+ auto r = pre_main_.template Run<Result, 1>(done_bits_);
188
+ if (auto* status = absl::get_if<Result>(&r)) {
189
+ GPR_DEBUG_ASSERT(!IsStatusOk(*status));
190
+ return std::move(*status);
191
+ }
192
+ if ((done_bits_ & 1) == 0) {
193
+ auto p = main_();
194
+ if (auto* status = absl::get_if<kPollReadyIdx>(&p)) {
195
+ done_bits_ |= 1;
196
+ Destruct(&main_);
197
+ Construct(&result_, std::move(*status));
198
+ }
199
+ }
200
+ r = post_main_.template Run<Result, 1 + PreMain::Size()>(done_bits_);
201
+ if (auto* status = absl::get_if<Result>(&r)) {
202
+ GPR_DEBUG_ASSERT(!IsStatusOk(*status));
203
+ return std::move(*status);
204
+ }
205
+ if ((done_bits_ & NecessaryBits()) == NecessaryBits()) {
206
+ return std::move(result_);
207
+ }
208
+ return Pending{};
209
+ }
210
+
211
+ template <typename P>
212
+ auto NecessaryPush(P p);
213
+ template <typename P>
214
+ auto NecessaryPull(P p);
215
+ template <typename P>
216
+ auto Push(P p);
217
+ template <typename P>
218
+ auto Pull(P p);
219
+
220
+ private:
221
+ // Bitmask for done_bits_ specifying which promises must be completed prior to
222
+ // returning ok.
223
+ constexpr uint8_t NecessaryBits() {
224
+ return 1 | (PreMain::NecessaryBits() << 1) |
225
+ (PostMain::NecessaryBits() << (1 + PreMain::Size()));
226
+ }
227
+ // Bitmask for done_bits_ specifying what all of the promises being complete
228
+ // would look like.
229
+ constexpr uint8_t AllBits() {
230
+ return (1 << (1 + PreMain::Size() + PostMain::Size())) - 1;
231
+ }
232
+ // Bitmask of done_bits_ specifying which bits correspond to helper promises -
233
+ // that is all promises that are not the main one.
234
+ constexpr uint8_t HelperBits() { return AllBits() ^ 1; }
235
+
236
+ // done_bits signifies which operations have completed.
237
+ // Bit 0 is set if main_ has completed.
238
+ // The next higher bits correspond one per pre-main promise.
239
+ // The next higher bits correspond one per post-main promise.
240
+ // So, going from most significant bit to least significant:
241
+ // +--------------+-------------+--------+
242
+ // |post_main bits|pre_main bits|main bit|
243
+ // +--------------+-------------+--------+
244
+ uint8_t done_bits_;
245
+ PreMain pre_main_;
246
+ union {
247
+ PromiseLike<Main> main_;
248
+ Result result_;
249
+ };
250
+ PostMain post_main_;
251
+ };
252
+
253
+ template <typename Main, typename PreMain, typename PostMain>
254
+ auto MakeTryConcurrently(Main&& main, PreMain&& pre_main,
255
+ PostMain&& post_main) {
256
+ return TryConcurrently<Main, PreMain, PostMain>(
257
+ std::forward<Main>(main), std::forward<PreMain>(pre_main),
258
+ std::forward<PostMain>(post_main));
259
+ }
260
+
261
+ template <typename Main, typename PreMain, typename PostMain>
262
+ template <typename P>
263
+ auto TryConcurrently<Main, PreMain, PostMain>::NecessaryPush(P p) {
264
+ GPR_DEBUG_ASSERT(done_bits_ == 0);
265
+ done_bits_ = HelperBits();
266
+ return MakeTryConcurrently(std::move(main_),
267
+ pre_main_.With(Necessary<P>{std::move(p)}),
268
+ std::move(post_main_));
269
+ }
270
+
271
+ template <typename Main, typename PreMain, typename PostMain>
272
+ template <typename P>
273
+ auto TryConcurrently<Main, PreMain, PostMain>::NecessaryPull(P p) {
274
+ GPR_DEBUG_ASSERT(done_bits_ == 0);
275
+ done_bits_ = HelperBits();
276
+ return MakeTryConcurrently(std::move(main_), std::move(pre_main_),
277
+ post_main_.With(Necessary<P>{std::move(p)}));
278
+ }
279
+
280
+ template <typename Main, typename PreMain, typename PostMain>
281
+ template <typename P>
282
+ auto TryConcurrently<Main, PreMain, PostMain>::Push(P p) {
283
+ GPR_DEBUG_ASSERT(done_bits_ == 0);
284
+ done_bits_ = HelperBits();
285
+ return MakeTryConcurrently(std::move(main_),
286
+ pre_main_.With(Helper<P>{std::move(p)}),
287
+ std::move(post_main_));
288
+ }
289
+
290
+ template <typename Main, typename PreMain, typename PostMain>
291
+ template <typename P>
292
+ auto TryConcurrently<Main, PreMain, PostMain>::Pull(P p) {
293
+ GPR_DEBUG_ASSERT(done_bits_ == 0);
294
+ done_bits_ = HelperBits();
295
+ return MakeTryConcurrently(std::move(main_), std::move(pre_main_),
296
+ post_main_.With(Helper<P>{std::move(p)}));
297
+ }
298
+
299
+ } // namespace promise_detail
300
+
301
+ // TryConcurrently runs a set of promises concurrently.
302
+ // There is a structure to the promises:
303
+ // - A 'main' promise dominates the others - it must complete before the
304
+ // overall promise successfully completes. Its result is chosen in the event
305
+ // of successful completion.
306
+ // - A set of (optional) push and pull promises to aid main. Push promises are
307
+ // polled before main, pull promises are polled after. In this way we can
308
+ // avoid overall wakeup churn - sending a message will tend to push things
309
+ // down the promise tree as its polled, so that send should be in a push
310
+ // promise - then as the main promise is polled and it calls into things
311
+ // lower in the stack they'll already see things there (this reasoning holds
312
+ // for receiving things and the pull promises too!).
313
+ // - Each push and pull promise is either necessary or optional.
314
+ // Necessary promises must complete successfully before the overall promise
315
+ // completes. Optional promises will just be cancelled once the main promise
316
+ // completes and any necessary helpers.
317
+ // - If any of the promises fail, the overall promise fails immediately.
318
+ // API:
319
+ // This function, TryConcurrently, is used to create a TryConcurrently promise.
320
+ // It takes a single argument, being the main promise. That promise also has
321
+ // a set of methods for attaching push and pull promises. The act of attachment
322
+ // returns a new TryConcurrently promise with previous contained promises moved
323
+ // out.
324
+ // The methods exposed:
325
+ // - Push, NecessaryPush: attach a push promise (with the first variant being
326
+ // optional, the second necessary).
327
+ // - Pull, NecessaryPull: attach a pull promise, with variants as above.
328
+ // Example:
329
+ // TryConcurrently(call_next_filter(std::move(call_args)))
330
+ // .Push(send_messages_promise)
331
+ // .Pull(recv_messages_promise)
332
+ template <typename Main>
333
+ auto TryConcurrently(Main main) {
334
+ return promise_detail::MakeTryConcurrently(std::move(main),
335
+ promise_detail::FusedSet<>(),
336
+ promise_detail::FusedSet<>());
337
+ }
338
+
339
+ } // namespace grpc_core
340
+
341
+ #endif // GRPC_CORE_LIB_PROMISE_TRY_CONCURRENTLY_H
@@ -37,9 +37,8 @@ struct TrySeqTraitsWithSfinae {
37
37
  using UnwrappedType = T;
38
38
  using WrappedType = absl::StatusOr<T>;
39
39
  template <typename Next>
40
- static auto CallFactory(Next* next, T&& value)
41
- -> decltype(next->Once(std::forward<T>(value))) {
42
- return next->Once(std::forward<T>(value));
40
+ static auto CallFactory(Next* next, T&& value) {
41
+ return next->Make(std::forward<T>(value));
43
42
  }
44
43
  template <typename F, typename Elem>
45
44
  static auto CallSeqFactory(F& f, Elem&& elem, T&& value)
@@ -57,9 +56,8 @@ struct TrySeqTraitsWithSfinae<absl::StatusOr<T>> {
57
56
  using UnwrappedType = T;
58
57
  using WrappedType = absl::StatusOr<T>;
59
58
  template <typename Next>
60
- static auto CallFactory(Next* next, absl::StatusOr<T>&& status)
61
- -> decltype(next->Once(std::move(*status))) {
62
- return next->Once(std::move(*status));
59
+ static auto CallFactory(Next* next, absl::StatusOr<T>&& status) {
60
+ return next->Make(std::move(*status));
63
61
  }
64
62
  template <typename F, typename Elem>
65
63
  static auto CallSeqFactory(F& f, Elem&& elem, absl::StatusOr<T> value)
@@ -69,7 +67,7 @@ struct TrySeqTraitsWithSfinae<absl::StatusOr<T>> {
69
67
  template <typename Result, typename RunNext>
70
68
  static Poll<Result> CheckResultAndRunNext(absl::StatusOr<T> prior,
71
69
  RunNext run_next) {
72
- if (!prior.ok()) return Result(prior.status());
70
+ if (!prior.ok()) return StatusCast<Result>(prior.status());
73
71
  return run_next(std::move(prior));
74
72
  }
75
73
  };
@@ -84,8 +82,8 @@ struct TrySeqTraitsWithSfinae<
84
82
  using UnwrappedType = void;
85
83
  using WrappedType = T;
86
84
  template <typename Next>
87
- static auto CallFactory(Next* next, T&&) -> decltype(next->Once()) {
88
- return next->Once();
85
+ static auto CallFactory(Next* next, T&&) {
86
+ return next->Make();
89
87
  }
90
88
  template <typename Result, typename RunNext>
91
89
  static Poll<Result> CheckResultAndRunNext(T prior, RunNext run_next) {
@@ -98,14 +96,13 @@ struct TrySeqTraitsWithSfinae<absl::Status> {
98
96
  using UnwrappedType = void;
99
97
  using WrappedType = absl::Status;
100
98
  template <typename Next>
101
- static auto CallFactory(Next* next, absl::Status&&)
102
- -> decltype(next->Once()) {
103
- return next->Once();
99
+ static auto CallFactory(Next* next, absl::Status&&) {
100
+ return next->Make();
104
101
  }
105
102
  template <typename Result, typename RunNext>
106
103
  static Poll<Result> CheckResultAndRunNext(absl::Status prior,
107
104
  RunNext run_next) {
108
- if (!prior.ok()) return Result(std::move(prior));
105
+ if (!prior.ok()) return StatusCast<Result>(std::move(prior));
109
106
  return run_next(std::move(prior));
110
107
  }
111
108
  };
@@ -164,6 +164,7 @@ std::string ServerAddress::ToString() const {
164
164
  }
165
165
  if (!attributes_.empty()) {
166
166
  std::vector<std::string> attrs;
167
+ attrs.reserve(attributes_.size());
167
168
  for (const auto& p : attributes_) {
168
169
  attrs.emplace_back(absl::StrCat(p.first, "=", p.second->ToString()));
169
170
  }
@@ -29,8 +29,6 @@
29
29
  #include <string>
30
30
  #include <vector>
31
31
 
32
- #include "absl/memory/memory.h"
33
-
34
32
  #include "src/core/lib/channel/channel_args.h"
35
33
  #include "src/core/lib/gpr/useful.h"
36
34
  #include "src/core/lib/iomgr/resolved_address.h"
@@ -127,7 +125,7 @@ class ServerAddressWeightAttribute : public ServerAddress::AttributeInterface {
127
125
  uint32_t weight() const { return weight_; }
128
126
 
129
127
  std::unique_ptr<AttributeInterface> Copy() const override {
130
- return absl::make_unique<ServerAddressWeightAttribute>(weight_);
128
+ return std::make_unique<ServerAddressWeightAttribute>(weight_);
131
129
  }
132
130
 
133
131
  int Cmp(const AttributeInterface* other) const override {
@@ -28,7 +28,6 @@
28
28
  #include <grpc/grpc.h>
29
29
 
30
30
  #include "src/core/lib/channel/channel_args.h"
31
- #include "src/core/lib/channel/channel_args_preconditioning.h"
32
31
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
33
32
  #include "src/core/lib/iomgr/exec_ctx.h"
34
33
  #include "src/core/lib/resource_quota/memory_quota.h"
@@ -116,4 +116,23 @@ void Arena::ManagedNewObject::Link(std::atomic<ManagedNewObject*>* head) {
116
116
  }
117
117
  }
118
118
 
119
+ void* Arena::AllocPooled(size_t alloc_size, std::atomic<FreePoolNode*>* head) {
120
+ FreePoolNode* p = head->load(std::memory_order_acquire);
121
+ while (p != nullptr) {
122
+ if (head->compare_exchange_weak(p, p->next, std::memory_order_acq_rel,
123
+ std::memory_order_relaxed)) {
124
+ return p;
125
+ }
126
+ }
127
+ return Alloc(alloc_size);
128
+ }
129
+
130
+ void Arena::FreePooled(void* p, std::atomic<FreePoolNode*>* head) {
131
+ FreePoolNode* node = static_cast<FreePoolNode*>(p);
132
+ node->next = head->load(std::memory_order_acquire);
133
+ while (!head->compare_exchange_weak(
134
+ node->next, node, std::memory_order_acq_rel, std::memory_order_relaxed)) {
135
+ }
136
+ }
137
+
119
138
  } // namespace grpc_core
@@ -31,8 +31,12 @@
31
31
 
32
32
  #include <atomic>
33
33
  #include <memory>
34
+ #include <new>
34
35
  #include <utility>
35
36
 
37
+ #include "absl/meta/type_traits.h"
38
+ #include "absl/utility/utility.h"
39
+
36
40
  #include <grpc/event_engine/memory_allocator.h>
37
41
 
38
42
  #include "src/core/lib/gpr/alloc.h"
@@ -42,7 +46,46 @@
42
46
 
43
47
  namespace grpc_core {
44
48
 
49
+ namespace arena_detail {
50
+
51
+ template <typename Void, size_t kIndex, size_t kObjectSize,
52
+ size_t... kBucketSize>
53
+ struct PoolIndexForSize;
54
+
55
+ template <size_t kObjectSize, size_t kIndex, size_t kSmallestRemainingBucket,
56
+ size_t... kBucketSizes>
57
+ struct PoolIndexForSize<
58
+ absl::enable_if_t<kObjectSize <= kSmallestRemainingBucket>, kIndex,
59
+ kObjectSize, kSmallestRemainingBucket, kBucketSizes...> {
60
+ static constexpr size_t kPool = kIndex;
61
+ static constexpr size_t kSize = kSmallestRemainingBucket;
62
+ };
63
+
64
+ template <size_t kObjectSize, size_t kIndex, size_t kSmallestRemainingBucket,
65
+ size_t... kBucketSizes>
66
+ struct PoolIndexForSize<
67
+ absl::enable_if_t<(kObjectSize > kSmallestRemainingBucket)>, kIndex,
68
+ kObjectSize, kSmallestRemainingBucket, kBucketSizes...>
69
+ : public PoolIndexForSize<void, kIndex + 1, kObjectSize, kBucketSizes...> {
70
+ };
71
+
72
+ template <size_t kObjectSize, size_t... kBucketSizes>
73
+ constexpr size_t PoolFromObjectSize(
74
+ absl::integer_sequence<size_t, kBucketSizes...>) {
75
+ return PoolIndexForSize<void, 0, kObjectSize, kBucketSizes...>::kPool;
76
+ }
77
+
78
+ template <size_t kObjectSize, size_t... kBucketSizes>
79
+ constexpr size_t AllocationSizeFromObjectSize(
80
+ absl::integer_sequence<size_t, kBucketSizes...>) {
81
+ return PoolIndexForSize<void, 0, kObjectSize, kBucketSizes...>::kSize;
82
+ }
83
+
84
+ } // namespace arena_detail
85
+
45
86
  class Arena {
87
+ using PoolSizes = absl::integer_sequence<size_t, 256, 512, 768>;
88
+
46
89
  public:
47
90
  // Create an arena, with \a initial_size bytes in the first allocated buffer.
48
91
  static Arena* Create(size_t initial_size, MemoryAllocator* memory_allocator);
@@ -88,6 +131,37 @@ class Arena {
88
131
  return &p->t;
89
132
  }
90
133
 
134
+ class PooledDeleter {
135
+ public:
136
+ explicit PooledDeleter(Arena* arena) : arena_(arena) {}
137
+ PooledDeleter() = default;
138
+ template <typename T>
139
+ void operator()(T* p) {
140
+ // TODO(ctiller): promise based filter hijacks ownership of some pointers
141
+ // to make them appear as PoolPtr without really transferring ownership,
142
+ // by setting the arena to nullptr.
143
+ // This is a transitional hack and should be removed once promise based
144
+ // filter is removed.
145
+ if (arena_ != nullptr) arena_->DeletePooled(p);
146
+ }
147
+
148
+ private:
149
+ Arena* arena_;
150
+ };
151
+
152
+ template <typename T>
153
+ using PoolPtr = std::unique_ptr<T, PooledDeleter>;
154
+
155
+ template <typename T, typename... Args>
156
+ PoolPtr<T> MakePooled(Args&&... args) {
157
+ return PoolPtr<T>(
158
+ new (AllocPooled(
159
+ arena_detail::AllocationSizeFromObjectSize<sizeof(T)>(PoolSizes()),
160
+ &pools_[arena_detail::PoolFromObjectSize<sizeof(T)>(PoolSizes())]))
161
+ T(std::forward<Args>(args)...),
162
+ PooledDeleter(this));
163
+ }
164
+
91
165
  private:
92
166
  struct Zone {
93
167
  Zone* prev;
@@ -128,6 +202,20 @@ class Arena {
128
202
 
129
203
  void* AllocZone(size_t size);
130
204
 
205
+ template <typename T>
206
+ void DeletePooled(T* p) {
207
+ p->~T();
208
+ FreePooled(
209
+ p, &pools_[arena_detail::PoolFromObjectSize<sizeof(T)>(PoolSizes())]);
210
+ }
211
+
212
+ struct FreePoolNode {
213
+ FreePoolNode* next;
214
+ };
215
+
216
+ void* AllocPooled(size_t alloc_size, std::atomic<FreePoolNode*>* head);
217
+ static void FreePooled(void* p, std::atomic<FreePoolNode*>* head);
218
+
131
219
  // Keep track of the total used size. We use this in our call sizing
132
220
  // hysteresis.
133
221
  std::atomic<size_t> total_used_{0};
@@ -140,6 +228,7 @@ class Arena {
140
228
  // last zone; the zone list is reverse-walked during arena destruction only.
141
229
  std::atomic<Zone*> last_zone_{nullptr};
142
230
  std::atomic<ManagedNewObject*> managed_new_head_{nullptr};
231
+ std::atomic<FreePoolNode*> pools_[PoolSizes::size()]{};
143
232
  // The backing memory quota
144
233
  MemoryAllocator* const memory_allocator_;
145
234
  };
@@ -28,6 +28,7 @@
28
28
  #include "src/core/lib/debug/trace.h"
29
29
  #include "src/core/lib/gpr/useful.h"
30
30
  #include "src/core/lib/gprpp/mpscq.h"
31
+ #include "src/core/lib/promise/detail/basic_seq.h"
31
32
  #include "src/core/lib/promise/exec_ctx_wakeup_scheduler.h"
32
33
  #include "src/core/lib/promise/loop.h"
33
34
  #include "src/core/lib/promise/map.h"
@@ -20,8 +20,6 @@
20
20
  #include <map>
21
21
  #include <utility>
22
22
 
23
- #include "absl/memory/memory.h"
24
-
25
23
  namespace grpc_core {
26
24
 
27
25
  GrpcAuthorizationEngine::GrpcAuthorizationEngine(Rbac policy)
@@ -29,7 +27,7 @@ GrpcAuthorizationEngine::GrpcAuthorizationEngine(Rbac policy)
29
27
  for (auto& sub_policy : policy.policies) {
30
28
  Policy policy;
31
29
  policy.name = sub_policy.first;
32
- policy.matcher = absl::make_unique<PolicyAuthorizationMatcher>(
30
+ policy.matcher = std::make_unique<PolicyAuthorizationMatcher>(
33
31
  std::move(sub_policy.second));
34
32
  policies_.push_back(std::move(policy));
35
33
  }
@@ -17,6 +17,7 @@
17
17
  #include "src/core/lib/security/authorization/grpc_server_authz_filter.h"
18
18
 
19
19
  #include <functional>
20
+ #include <memory>
20
21
  #include <string>
21
22
  #include <utility>
22
23
 
@@ -107,8 +108,9 @@ bool GrpcServerAuthzFilter::IsAuthorized(
107
108
  ArenaPromise<ServerMetadataHandle> GrpcServerAuthzFilter::MakeCallPromise(
108
109
  CallArgs call_args, NextPromiseFactory next_promise_factory) {
109
110
  if (!IsAuthorized(call_args.client_initial_metadata)) {
110
- return ArenaPromise<ServerMetadataHandle>(Immediate(ServerMetadataHandle(
111
- absl::PermissionDeniedError("Unauthorized RPC request rejected."))));
111
+ return ArenaPromise<ServerMetadataHandle>(
112
+ Immediate(ServerMetadataFromStatus(absl::PermissionDeniedError(
113
+ "Unauthorized RPC request rejected."))));
112
114
  }
113
115
  return next_promise_factory(std::move(call_args));
114
116
  }