grpc 1.46.3 → 1.47.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 (481) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +49 -97
  3. data/include/grpc/event_engine/event_engine.h +42 -7
  4. data/include/grpc/event_engine/memory_allocator.h +0 -15
  5. data/include/grpc/event_engine/port.h +1 -1
  6. data/include/grpc/event_engine/slice.h +286 -0
  7. data/include/grpc/event_engine/slice_buffer.h +112 -0
  8. data/include/grpc/grpc_security.h +11 -0
  9. data/include/grpc/impl/codegen/port_platform.h +100 -36
  10. data/include/grpc/impl/codegen/slice.h +1 -1
  11. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +18 -30
  12. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +4 -1
  13. data/src/core/ext/filters/client_channel/backend_metric.cc +17 -12
  14. data/src/core/ext/filters/client_channel/backend_metric.h +19 -9
  15. data/src/core/ext/filters/client_channel/backup_poller.cc +5 -5
  16. data/src/core/ext/filters/client_channel/backup_poller.h +2 -4
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +42 -20
  18. data/src/core/ext/filters/client_channel/client_channel.cc +60 -17
  19. data/src/core/ext/filters/client_channel/client_channel.h +26 -6
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -5
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +12 -2
  22. data/src/core/ext/filters/client_channel/client_channel_factory.cc +5 -0
  23. data/src/core/ext/filters/client_channel/client_channel_factory.h +8 -0
  24. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -13
  25. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  26. data/src/core/ext/filters/client_channel/config_selector.h +7 -5
  27. data/src/core/ext/filters/client_channel/connector.h +8 -2
  28. data/src/core/ext/filters/client_channel/dynamic_filters.cc +13 -2
  29. data/src/core/ext/filters/client_channel/dynamic_filters.h +11 -1
  30. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
  31. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -0
  32. data/src/core/ext/filters/client_channel/health/health_check_client.cc +14 -1
  33. data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -0
  34. data/src/core/ext/filters/client_channel/http_proxy.cc +10 -2
  35. data/src/core/ext/filters/client_channel/http_proxy.h +3 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +6 -2
  37. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +1 -0
  38. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
  39. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +12 -0
  40. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +5 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +9 -3
  42. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +59 -19
  43. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +4 -0
  44. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +6 -0
  45. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +10 -1
  46. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -3
  47. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +408 -0
  48. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
  49. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1038 -0
  50. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +54 -0
  51. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +60 -52
  52. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +102 -60
  53. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +157 -96
  54. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +2 -0
  55. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +45 -10
  56. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +182 -171
  57. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +39 -36
  58. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +30 -5
  59. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +99 -23
  60. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +6 -0
  61. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +30 -4
  62. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +23 -3
  63. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +75 -11
  64. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -2
  65. data/src/core/ext/filters/client_channel/lb_policy.h +18 -24
  66. data/src/core/ext/filters/client_channel/lb_policy_factory.h +2 -0
  67. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
  68. data/src/core/ext/filters/client_channel/lb_policy_registry.h +6 -1
  69. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
  70. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +1 -0
  71. data/src/core/ext/filters/client_channel/proxy_mapper.h +1 -1
  72. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +2 -0
  73. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +5 -0
  74. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +23 -5
  75. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +134 -43
  76. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -1
  77. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +10 -8
  78. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
  79. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +26 -9
  80. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +13 -4
  81. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -1
  82. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
  83. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +2 -1
  84. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +30 -7
  85. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +13 -14
  86. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +5 -2
  87. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +59 -13
  88. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +13 -1
  89. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -1
  90. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +15 -11
  91. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +89 -33
  92. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +5 -11
  93. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +11 -5
  94. data/src/core/ext/filters/client_channel/retry_filter.cc +42 -2
  95. data/src/core/ext/filters/client_channel/retry_service_config.cc +8 -9
  96. data/src/core/ext/filters/client_channel/retry_service_config.h +10 -1
  97. data/src/core/ext/filters/client_channel/retry_throttle.cc +1 -8
  98. data/src/core/ext/filters/client_channel/retry_throttle.h +7 -1
  99. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +22 -5
  100. data/src/core/ext/filters/client_channel/subchannel.cc +156 -160
  101. data/src/core/ext/filters/client_channel/subchannel.h +80 -20
  102. data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -23
  103. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
  104. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +12 -2
  105. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -3
  106. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +16 -2
  107. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +12 -0
  108. data/src/core/ext/filters/deadline/deadline_filter.cc +6 -2
  109. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -4
  110. data/src/core/ext/filters/http/client/http_client_filter.cc +14 -5
  111. data/src/core/ext/filters/http/client/http_client_filter.h +7 -1
  112. data/src/core/ext/filters/http/client_authority_filter.cc +5 -10
  113. data/src/core/ext/filters/http/http_filters_plugin.cc +7 -8
  114. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +1 -0
  115. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +3 -1
  116. data/src/core/ext/filters/http/server/http_server_filter.cc +80 -247
  117. data/src/core/ext/filters/http/server/http_server_filter.h +31 -2
  118. data/src/core/ext/filters/message_size/message_size_filter.cc +20 -26
  119. data/src/core/ext/filters/message_size/message_size_filter.h +2 -2
  120. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -0
  121. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +101 -135
  122. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +9 -7
  123. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -15
  124. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -0
  125. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -3
  126. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  127. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
  128. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +69 -20
  129. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +5 -0
  130. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -0
  131. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -1
  132. data/src/core/ext/transport/chttp2/transport/flow_control.cc +6 -2
  133. data/src/core/ext/transport/chttp2/transport/flow_control.h +6 -2
  134. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  135. data/src/core/ext/transport/chttp2/transport/frame_data.cc +7 -1
  136. data/src/core/ext/transport/chttp2/transport/frame_data.h +4 -1
  137. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +3 -0
  138. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -1
  139. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -0
  140. data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
  141. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +6 -2
  142. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -0
  143. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +12 -3
  144. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -0
  145. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -1
  146. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -0
  147. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +14 -12
  148. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +15 -2
  149. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +3 -0
  150. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +3 -0
  151. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -7
  152. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -1
  153. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +55 -37
  154. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +38 -21
  155. data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -1
  156. data/src/core/ext/transport/chttp2/transport/internal.h +24 -3
  157. data/src/core/ext/transport/chttp2/transport/parsing.cc +27 -6
  158. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +13 -9
  159. data/src/core/ext/transport/chttp2/transport/stream_map.cc +1 -1
  160. data/src/core/ext/transport/chttp2/transport/stream_map.h +1 -0
  161. data/src/core/ext/transport/chttp2/transport/varint.h +2 -0
  162. data/src/core/ext/transport/chttp2/transport/writing.cc +38 -2
  163. data/src/core/ext/transport/inproc/inproc_transport.cc +8 -5
  164. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +47 -0
  165. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +109 -0
  166. data/src/core/ext/xds/certificate_provider_store.cc +4 -2
  167. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  168. data/src/core/ext/xds/xds_certificate_provider.cc +4 -1
  169. data/src/core/ext/xds/xds_certificate_provider.h +1 -1
  170. data/src/core/ext/xds/xds_channel_stack_modifier.cc +5 -5
  171. data/src/core/ext/xds/xds_client.cc +46 -22
  172. data/src/core/ext/xds/xds_cluster.cc +106 -16
  173. data/src/core/ext/xds/xds_cluster.h +3 -0
  174. data/src/core/ext/xds/xds_http_fault_filter.cc +3 -3
  175. data/src/core/ext/xds/xds_listener.cc +19 -9
  176. data/src/core/ext/xds/xds_server_config_fetcher.cc +2 -1
  177. data/src/core/lib/address_utils/sockaddr_utils.cc +56 -23
  178. data/src/core/lib/address_utils/sockaddr_utils.h +7 -4
  179. data/src/core/lib/avl/avl.h +3 -1
  180. data/src/core/lib/channel/call_finalization.h +4 -0
  181. data/src/core/lib/channel/call_tracer.h +8 -2
  182. data/src/core/lib/channel/channel_args.cc +41 -22
  183. data/src/core/lib/channel/channel_args.h +33 -3
  184. data/src/core/lib/channel/channel_args_preconditioning.cc +3 -3
  185. data/src/core/lib/channel/channel_args_preconditioning.h +3 -2
  186. data/src/core/lib/channel/channel_stack.cc +41 -3
  187. data/src/core/lib/channel/channel_stack.h +49 -3
  188. data/src/core/lib/channel/channel_stack_builder.cc +9 -19
  189. data/src/core/lib/channel/channel_stack_builder.h +15 -27
  190. data/src/core/lib/channel/channel_stack_builder_impl.cc +36 -41
  191. data/src/core/lib/channel/channel_stack_builder_impl.h +3 -6
  192. data/src/core/lib/channel/channel_trace.cc +8 -13
  193. data/src/core/lib/channel/channel_trace.h +6 -3
  194. data/src/core/lib/channel/channelz.cc +8 -13
  195. data/src/core/lib/channel/channelz.h +13 -4
  196. data/src/core/lib/channel/channelz_registry.cc +7 -14
  197. data/src/core/lib/channel/channelz_registry.h +10 -9
  198. data/src/core/lib/channel/connected_channel.cc +21 -31
  199. data/src/core/lib/channel/connected_channel.h +1 -0
  200. data/src/core/lib/channel/promise_based_filter.cc +444 -189
  201. data/src/core/lib/channel/promise_based_filter.h +160 -27
  202. data/src/core/lib/channel/status_util.cc +2 -0
  203. data/src/core/lib/channel/status_util.h +0 -3
  204. data/src/core/lib/compression/compression_internal.cc +45 -10
  205. data/src/core/lib/compression/compression_internal.h +1 -1
  206. data/src/core/lib/config/core_configuration.cc +3 -0
  207. data/src/core/lib/config/core_configuration.h +2 -1
  208. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +4 -2
  209. data/src/core/lib/event_engine/channel_args_endpoint_config.h +3 -2
  210. data/src/core/lib/event_engine/default_event_engine_factory.cc +8 -2
  211. data/src/core/lib/event_engine/event_engine.cc +12 -2
  212. data/src/core/lib/event_engine/event_engine_factory.h +5 -0
  213. data/src/core/lib/event_engine/handle_containers.h +67 -0
  214. data/src/core/lib/event_engine/iomgr_engine.cc +206 -0
  215. data/src/core/lib/event_engine/iomgr_engine.h +118 -0
  216. data/src/core/lib/event_engine/memory_allocator.cc +12 -4
  217. data/src/core/lib/event_engine/resolved_address.cc +4 -2
  218. data/src/core/lib/event_engine/slice.cc +102 -0
  219. data/src/core/lib/event_engine/slice_buffer.cc +50 -0
  220. data/src/core/lib/{iomgr/event_engine/pollset.h → event_engine/trace.cc} +3 -10
  221. data/src/core/lib/{iomgr/endpoint_pair_event_engine.cc → event_engine/trace.h} +12 -14
  222. data/src/core/lib/gpr/log.cc +5 -0
  223. data/src/core/lib/gpr/tls.h +3 -5
  224. data/src/core/lib/gprpp/bitset.h +5 -1
  225. data/src/core/lib/gprpp/chunked_vector.h +4 -0
  226. data/src/core/lib/gprpp/construct_destruct.h +1 -0
  227. data/src/core/lib/gprpp/dual_ref_counted.h +1 -4
  228. data/src/core/lib/gprpp/examine_stack.h +0 -1
  229. data/src/core/lib/gprpp/fork.cc +3 -6
  230. data/src/core/lib/gprpp/global_config.h +2 -4
  231. data/src/core/lib/gprpp/global_config_env.cc +3 -2
  232. data/src/core/lib/gprpp/global_config_env.h +3 -1
  233. data/src/core/lib/gprpp/global_config_generic.h +0 -4
  234. data/src/core/lib/gprpp/host_port.cc +2 -0
  235. data/src/core/lib/gprpp/manual_constructor.h +0 -1
  236. data/src/core/lib/gprpp/match.h +2 -0
  237. data/src/core/lib/gprpp/memory.h +1 -5
  238. data/src/core/lib/gprpp/orphanable.h +1 -4
  239. data/src/core/lib/gprpp/ref_counted.h +1 -3
  240. data/src/core/lib/gprpp/ref_counted_ptr.h +1 -1
  241. data/src/core/lib/gprpp/stat.h +0 -2
  242. data/src/core/lib/gprpp/stat_posix.cc +7 -2
  243. data/src/core/lib/gprpp/status_helper.cc +8 -4
  244. data/src/core/lib/gprpp/status_helper.h +4 -0
  245. data/src/core/lib/gprpp/sync.h +3 -1
  246. data/src/core/lib/gprpp/table.h +10 -0
  247. data/src/core/lib/gprpp/thd.h +2 -5
  248. data/src/core/lib/gprpp/thd_posix.cc +4 -2
  249. data/src/core/lib/gprpp/thd_windows.cc +2 -0
  250. data/src/core/lib/gprpp/time.cc +8 -0
  251. data/src/core/lib/gprpp/time.h +6 -1
  252. data/src/core/lib/gprpp/time_util.cc +4 -0
  253. data/src/core/lib/gprpp/time_util.h +1 -1
  254. data/src/core/lib/gprpp/unique_type_name.h +104 -0
  255. data/src/core/lib/http/format_request.cc +29 -0
  256. data/src/core/lib/http/format_request.h +2 -0
  257. data/src/core/lib/http/httpcli.cc +88 -81
  258. data/src/core/lib/http/httpcli.h +39 -7
  259. data/src/core/lib/http/httpcli_security_connector.cc +3 -4
  260. data/src/core/lib/iomgr/endpoint.cc +4 -4
  261. data/src/core/lib/iomgr/endpoint.h +6 -4
  262. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -4
  263. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
  264. data/src/core/lib/iomgr/ev_posix.cc +1 -4
  265. data/src/core/lib/iomgr/exec_ctx.h +1 -2
  266. data/src/core/lib/iomgr/internal_errqueue.cc +38 -47
  267. data/src/core/lib/iomgr/internal_errqueue.h +1 -6
  268. data/src/core/lib/iomgr/iomgr.cc +0 -1
  269. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/iomgr/iomgr_fwd.h} +9 -12
  270. data/src/core/lib/iomgr/pollset_set.h +1 -2
  271. data/src/core/lib/iomgr/port.h +25 -6
  272. data/src/core/lib/iomgr/resolve_address.cc +8 -0
  273. data/src/core/lib/iomgr/resolve_address.h +21 -14
  274. data/src/core/lib/iomgr/resolve_address_impl.h +2 -3
  275. data/src/core/lib/iomgr/resolve_address_posix.cc +8 -14
  276. data/src/core/lib/iomgr/resolve_address_posix.h +5 -2
  277. data/src/core/lib/iomgr/resolve_address_windows.cc +7 -14
  278. data/src/core/lib/iomgr/resolve_address_windows.h +5 -2
  279. data/src/core/lib/iomgr/sockaddr.h +2 -3
  280. data/src/core/lib/iomgr/sockaddr_posix.h +2 -0
  281. data/src/core/lib/iomgr/sockaddr_windows.h +2 -0
  282. data/src/core/lib/iomgr/socket_utils_common_posix.cc +3 -2
  283. data/src/core/lib/iomgr/tcp_client_cfstream.cc +10 -2
  284. data/src/core/lib/iomgr/tcp_client_posix.cc +12 -5
  285. data/src/core/lib/iomgr/tcp_client_windows.cc +13 -6
  286. data/src/core/lib/iomgr/tcp_posix.cc +9 -27
  287. data/src/core/lib/iomgr/tcp_server_posix.cc +26 -12
  288. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +30 -27
  289. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +7 -4
  290. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -5
  291. data/src/core/lib/iomgr/tcp_windows.cc +7 -4
  292. data/src/core/lib/json/json.h +1 -2
  293. data/src/core/lib/json/json_reader.cc +9 -1
  294. data/src/core/lib/json/json_util.cc +7 -0
  295. data/src/core/lib/json/json_util.h +10 -1
  296. data/src/core/lib/json/json_writer.cc +6 -1
  297. data/src/core/lib/promise/activity.cc +1 -1
  298. data/src/core/lib/promise/activity.h +6 -6
  299. data/src/core/lib/promise/arena_promise.h +11 -1
  300. data/src/core/lib/promise/call_push_pull.h +4 -0
  301. data/src/core/lib/promise/context.h +1 -1
  302. data/src/core/lib/promise/detail/basic_seq.h +2 -2
  303. data/src/core/lib/promise/detail/promise_factory.h +0 -1
  304. data/src/core/lib/promise/latch.h +0 -1
  305. data/src/core/lib/promise/loop.h +1 -0
  306. data/src/core/lib/promise/race.h +0 -1
  307. data/src/core/lib/promise/seq.h +0 -2
  308. data/src/core/lib/promise/sleep.cc +2 -0
  309. data/src/core/lib/promise/sleep.h +10 -0
  310. data/src/core/lib/promise/try_seq.h +2 -2
  311. data/src/core/lib/resolver/resolver_factory.h +1 -2
  312. data/src/core/lib/resolver/server_address.cc +9 -3
  313. data/src/core/lib/resolver/server_address.h +4 -4
  314. data/src/core/lib/resource_quota/api.cc +14 -1
  315. data/src/core/lib/resource_quota/api.h +4 -1
  316. data/src/core/lib/resource_quota/arena.cc +0 -6
  317. data/src/core/lib/resource_quota/arena.h +1 -2
  318. data/src/core/lib/resource_quota/memory_quota.cc +47 -5
  319. data/src/core/lib/resource_quota/memory_quota.h +24 -5
  320. data/src/core/lib/resource_quota/resource_quota.h +8 -0
  321. data/src/core/lib/resource_quota/thread_quota.cc +2 -0
  322. data/src/core/lib/resource_quota/thread_quota.h +4 -0
  323. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -0
  324. data/src/core/lib/security/credentials/alts/alts_credentials.cc +8 -2
  325. data/src/core/lib/security/credentials/alts/alts_credentials.h +2 -2
  326. data/src/core/lib/security/credentials/call_creds_util.cc +2 -0
  327. data/src/core/lib/security/credentials/channel_creds_registry.h +1 -0
  328. data/src/core/lib/security/credentials/composite/composite_credentials.cc +7 -3
  329. data/src/core/lib/security/credentials/composite/composite_credentials.h +5 -4
  330. data/src/core/lib/security/credentials/credentials.h +17 -10
  331. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +81 -0
  332. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +8 -0
  333. data/src/core/lib/security/credentials/external/external_account_credentials.cc +3 -0
  334. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -0
  335. data/src/core/lib/security/credentials/fake/fake_credentials.cc +13 -3
  336. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  337. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +25 -15
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -2
  339. data/src/core/lib/security/credentials/iam/iam_credentials.cc +4 -1
  340. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  341. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +8 -2
  342. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +4 -4
  343. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -2
  344. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  345. data/src/core/lib/security/credentials/local/local_credentials.cc +8 -2
  346. data/src/core/lib/security/credentials/local/local_credentials.h +2 -2
  347. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -6
  348. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -4
  349. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +4 -1
  350. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +1 -1
  351. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +8 -2
  352. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +4 -4
  353. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +10 -0
  354. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +5 -7
  355. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +26 -1
  356. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +28 -4
  357. data/src/core/lib/security/credentials/tls/tls_credentials.cc +10 -0
  358. data/src/core/lib/security/credentials/tls/tls_credentials.h +2 -2
  359. data/src/core/lib/security/credentials/xds/xds_credentials.cc +12 -3
  360. data/src/core/lib/security/credentials/xds/xds_credentials.h +5 -5
  361. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -1
  362. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +1 -1
  363. data/src/core/lib/security/security_connector/security_connector.cc +1 -1
  364. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  365. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +1 -1
  366. data/src/core/lib/security/transport/client_auth_filter.cc +6 -8
  367. data/src/core/lib/security/transport/secure_endpoint.cc +23 -12
  368. data/src/core/lib/security/transport/security_handshaker.cc +5 -5
  369. data/src/core/lib/security/transport/security_handshaker.h +1 -1
  370. data/src/core/lib/security/transport/server_auth_filter.cc +3 -2
  371. data/src/core/lib/service_config/service_config.h +4 -8
  372. data/src/core/lib/service_config/service_config_call_data.h +4 -1
  373. data/src/core/lib/service_config/service_config_impl.cc +7 -0
  374. data/src/core/lib/service_config/service_config_impl.h +9 -2
  375. data/src/core/lib/service_config/service_config_parser.cc +8 -0
  376. data/src/core/lib/service_config/service_config_parser.h +7 -0
  377. data/src/core/lib/slice/b64.cc +1 -1
  378. data/src/core/lib/slice/b64.h +2 -0
  379. data/src/core/lib/slice/percent_encoding.cc +4 -1
  380. data/src/core/lib/slice/percent_encoding.h +0 -6
  381. data/src/core/lib/slice/slice.cc +2 -1
  382. data/src/core/lib/slice/slice.h +10 -5
  383. data/src/core/lib/slice/slice_api.cc +1 -1
  384. data/src/core/lib/slice/slice_buffer.cc +50 -23
  385. data/src/core/lib/slice/slice_buffer.h +106 -0
  386. data/src/core/lib/slice/slice_buffer_api.cc +35 -0
  387. data/src/core/lib/slice/slice_internal.h +4 -3
  388. data/src/core/lib/slice/slice_refcount.h +2 -3
  389. data/src/core/lib/slice/slice_refcount_base.h +2 -3
  390. data/src/core/lib/slice/slice_split.cc +3 -0
  391. data/src/core/lib/slice/slice_split.h +0 -4
  392. data/src/core/lib/slice/slice_string_helpers.cc +4 -0
  393. data/src/core/lib/slice/slice_string_helpers.h +1 -4
  394. data/src/core/lib/surface/builtins.cc +7 -2
  395. data/src/core/lib/surface/byte_buffer.cc +7 -1
  396. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  397. data/src/core/lib/surface/call.cc +41 -26
  398. data/src/core/lib/surface/call.h +16 -2
  399. data/src/core/lib/surface/call_details.cc +4 -4
  400. data/src/core/lib/surface/call_log_batch.cc +7 -1
  401. data/src/core/lib/surface/call_test_only.h +4 -1
  402. data/src/core/lib/surface/channel.cc +179 -242
  403. data/src/core/lib/surface/channel.h +94 -57
  404. data/src/core/lib/surface/channel_init.h +2 -0
  405. data/src/core/lib/surface/channel_ping.cc +8 -2
  406. data/src/core/lib/surface/channel_stack_type.cc +0 -2
  407. data/src/core/lib/surface/channel_stack_type.h +0 -2
  408. data/src/core/lib/surface/completion_queue.cc +14 -6
  409. data/src/core/lib/surface/completion_queue.h +5 -1
  410. data/src/core/lib/surface/completion_queue_factory.cc +1 -0
  411. data/src/core/lib/surface/completion_queue_factory.h +1 -3
  412. data/src/core/lib/surface/event_string.cc +1 -7
  413. data/src/core/lib/surface/event_string.h +1 -1
  414. data/src/core/lib/surface/init.cc +17 -45
  415. data/src/core/lib/surface/init.h +0 -8
  416. data/src/core/lib/surface/lame_client.cc +64 -110
  417. data/src/core/lib/surface/lame_client.h +40 -2
  418. data/src/core/lib/surface/metadata_array.cc +2 -0
  419. data/src/core/lib/surface/server.cc +69 -56
  420. data/src/core/lib/surface/server.h +39 -9
  421. data/src/core/lib/surface/validate_metadata.cc +2 -5
  422. data/src/core/lib/surface/validate_metadata.h +3 -0
  423. data/src/core/lib/surface/version.cc +2 -2
  424. data/src/core/lib/transport/bdp_estimator.cc +3 -1
  425. data/src/core/lib/transport/bdp_estimator.h +2 -3
  426. data/src/core/lib/transport/byte_stream.cc +4 -3
  427. data/src/core/lib/transport/byte_stream.h +5 -1
  428. data/src/core/lib/transport/connectivity_state.cc +6 -4
  429. data/src/core/lib/transport/connectivity_state.h +2 -3
  430. data/src/core/lib/transport/error_utils.cc +4 -2
  431. data/src/core/lib/transport/error_utils.h +5 -1
  432. data/src/core/lib/{channel → transport}/handshaker.cc +9 -4
  433. data/src/core/lib/{channel → transport}/handshaker.h +13 -6
  434. data/src/core/lib/{channel → transport}/handshaker_factory.h +9 -10
  435. data/src/core/lib/{channel → transport}/handshaker_registry.cc +5 -1
  436. data/src/core/lib/{channel → transport}/handshaker_registry.h +5 -4
  437. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +24 -10
  438. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.h +3 -3
  439. data/src/core/lib/transport/metadata_batch.cc +287 -0
  440. data/src/core/lib/transport/metadata_batch.h +133 -264
  441. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  442. data/src/core/lib/transport/parsed_metadata.h +10 -3
  443. data/src/core/lib/transport/status_conversion.cc +2 -0
  444. data/src/core/lib/transport/status_conversion.h +2 -2
  445. data/src/core/lib/transport/tcp_connect_handshaker.cc +253 -0
  446. data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
  447. data/src/core/lib/transport/timeout_encoding.cc +2 -6
  448. data/src/core/lib/transport/timeout_encoding.h +5 -1
  449. data/src/core/lib/transport/transport.cc +18 -17
  450. data/src/core/lib/transport/transport.h +28 -2
  451. data/src/core/lib/transport/transport_impl.h +10 -0
  452. data/src/core/lib/transport/transport_op_string.cc +9 -10
  453. data/src/core/lib/uri/uri_parser.cc +11 -3
  454. data/src/core/lib/uri/uri_parser.h +0 -2
  455. data/src/core/plugin_registry/grpc_plugin_registry.cc +11 -0
  456. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
  457. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +2 -0
  458. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -0
  459. data/src/ruby/ext/grpc/extconf.rb +2 -2
  460. data/src/ruby/lib/grpc/version.rb +1 -1
  461. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  462. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  463. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +504 -0
  464. metadata +36 -29
  465. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +0 -31
  466. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  467. data/src/core/lib/event_engine/sockaddr.h +0 -44
  468. data/src/core/lib/gprpp/capture.h +0 -76
  469. data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
  470. data/src/core/lib/iomgr/event_engine/closure.h +0 -42
  471. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
  472. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  473. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
  474. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
  475. data/src/core/lib/iomgr/event_engine/promise.h +0 -51
  476. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
  477. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +0 -37
  478. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
  479. data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
  480. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
  481. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
@@ -26,8 +26,10 @@
26
26
 
27
27
  #include <string>
28
28
 
29
+ #include "absl/status/status.h"
29
30
  #include "absl/strings/str_cat.h"
30
31
  #include "absl/strings/str_format.h"
32
+ #include "absl/strings/str_replace.h"
31
33
 
32
34
  #include <grpc/support/alloc.h>
33
35
  #include <grpc/support/log.h>
@@ -36,33 +38,41 @@
36
38
  #include "src/core/lib/gprpp/host_port.h"
37
39
  #include "src/core/lib/iomgr/sockaddr.h"
38
40
  #include "src/core/lib/iomgr/socket_utils.h"
41
+ #include "src/core/lib/uri/uri_parser.h"
39
42
 
40
43
  #ifdef GRPC_HAVE_UNIX_SOCKET
41
44
  #include <sys/un.h>
42
45
  #endif
43
46
 
44
47
  #ifdef GRPC_HAVE_UNIX_SOCKET
45
- static std::string grpc_sockaddr_to_uri_unix_if_possible(
48
+ static absl::StatusOr<std::string> grpc_sockaddr_to_uri_unix_if_possible(
46
49
  const grpc_resolved_address* resolved_addr) {
47
50
  const grpc_sockaddr* addr =
48
51
  reinterpret_cast<const grpc_sockaddr*>(resolved_addr->addr);
49
52
  if (addr->sa_family != AF_UNIX) {
50
- return "";
53
+ return absl::InvalidArgumentError(
54
+ absl::StrCat("Socket family is not AF_UNIX: ", addr->sa_family));
51
55
  }
52
56
  const auto* unix_addr = reinterpret_cast<const struct sockaddr_un*>(addr);
57
+ std::string scheme, path;
53
58
  if (unix_addr->sun_path[0] == '\0' && unix_addr->sun_path[1] != '\0') {
54
- return absl::StrCat(
55
- "unix-abstract:",
56
- absl::string_view(
57
- unix_addr->sun_path + 1,
58
- resolved_addr->len - sizeof(unix_addr->sun_family) - 1));
59
+ scheme = "unix-abstract";
60
+ path = std::string(unix_addr->sun_path + 1,
61
+ resolved_addr->len - sizeof(unix_addr->sun_family) - 1);
62
+ } else {
63
+ scheme = "unix";
64
+ path = unix_addr->sun_path;
59
65
  }
60
- return absl::StrCat("unix:", unix_addr->sun_path);
66
+ absl::StatusOr<grpc_core::URI> uri = grpc_core::URI::Create(
67
+ std::move(scheme), /*authority=*/"", std::move(path),
68
+ /*query_parameter_pairs=*/{}, /*fragment=*/"");
69
+ if (!uri.ok()) return uri.status();
70
+ return uri->ToString();
61
71
  }
62
72
  #else
63
- static std::string grpc_sockaddr_to_uri_unix_if_possible(
73
+ static absl::StatusOr<std::string> grpc_sockaddr_to_uri_unix_if_possible(
64
74
  const grpc_resolved_address* /* addr */) {
65
- return "";
75
+ return absl::InvalidArgumentError("Unix socket is not supported.");
66
76
  }
67
77
  #endif
68
78
 
@@ -182,8 +192,8 @@ void grpc_sockaddr_make_wildcard6(int port,
182
192
  resolved_wild_out->len = static_cast<socklen_t>(sizeof(grpc_sockaddr_in6));
183
193
  }
184
194
 
185
- std::string grpc_sockaddr_to_string(const grpc_resolved_address* resolved_addr,
186
- bool normalize) {
195
+ absl::StatusOr<std::string> grpc_sockaddr_to_string(
196
+ const grpc_resolved_address* resolved_addr, bool normalize) {
187
197
  const int save_errno = errno;
188
198
  grpc_resolved_address addr_normalized;
189
199
  if (normalize && grpc_sockaddr_is_v4mapped(resolved_addr, &addr_normalized)) {
@@ -191,6 +201,28 @@ std::string grpc_sockaddr_to_string(const grpc_resolved_address* resolved_addr,
191
201
  }
192
202
  const grpc_sockaddr* addr =
193
203
  reinterpret_cast<const grpc_sockaddr*>(resolved_addr->addr);
204
+ std::string out;
205
+ #ifdef GRPC_HAVE_UNIX_SOCKET
206
+ if (addr->sa_family == GRPC_AF_UNIX) {
207
+ const sockaddr_un* addr_un = reinterpret_cast<const sockaddr_un*>(addr);
208
+ bool abstract = addr_un->sun_path[0] == '\0';
209
+ if (abstract) {
210
+ int len = resolved_addr->len - sizeof(addr->sa_family);
211
+ if (len <= 0) {
212
+ return absl::InvalidArgumentError("empty UDS abstract path");
213
+ }
214
+ out = std::string(addr_un->sun_path, len);
215
+ } else {
216
+ size_t maxlen = sizeof(addr_un->sun_path);
217
+ if (strnlen(addr_un->sun_path, maxlen) == maxlen) {
218
+ return absl::InvalidArgumentError("UDS path is not null-terminated");
219
+ }
220
+ out = std::string(addr_un->sun_path);
221
+ }
222
+ return out;
223
+ }
224
+ #endif
225
+
194
226
  const void* ip = nullptr;
195
227
  int port = 0;
196
228
  uint32_t sin6_scope_id = 0;
@@ -207,7 +239,6 @@ std::string grpc_sockaddr_to_string(const grpc_resolved_address* resolved_addr,
207
239
  sin6_scope_id = addr6->sin6_scope_id;
208
240
  }
209
241
  char ntop_buf[GRPC_INET6_ADDRSTRLEN];
210
- std::string out;
211
242
  if (ip != nullptr && grpc_inet_ntop(addr->sa_family, ip, ntop_buf,
212
243
  sizeof(ntop_buf)) != nullptr) {
213
244
  if (sin6_scope_id != 0) {
@@ -219,15 +250,19 @@ std::string grpc_sockaddr_to_string(const grpc_resolved_address* resolved_addr,
219
250
  out = grpc_core::JoinHostPort(ntop_buf, port);
220
251
  }
221
252
  } else {
222
- out = absl::StrFormat("(sockaddr family=%d)", addr->sa_family);
253
+ return absl::InvalidArgumentError(
254
+ absl::StrCat("Unknown sockaddr family: ", addr->sa_family));
223
255
  }
224
256
  /* This is probably redundant, but we wouldn't want to log the wrong error. */
225
257
  errno = save_errno;
226
258
  return out;
227
259
  }
228
260
 
229
- std::string grpc_sockaddr_to_uri(const grpc_resolved_address* resolved_addr) {
230
- if (resolved_addr->len == 0) return "";
261
+ absl::StatusOr<std::string> grpc_sockaddr_to_uri(
262
+ const grpc_resolved_address* resolved_addr) {
263
+ if (resolved_addr->len == 0) {
264
+ return absl::InvalidArgumentError("Empty address");
265
+ }
231
266
  grpc_resolved_address addr_normalized;
232
267
  if (grpc_sockaddr_is_v4mapped(resolved_addr, &addr_normalized)) {
233
268
  resolved_addr = &addr_normalized;
@@ -236,13 +271,11 @@ std::string grpc_sockaddr_to_uri(const grpc_resolved_address* resolved_addr) {
236
271
  if (scheme == nullptr || strcmp("unix", scheme) == 0) {
237
272
  return grpc_sockaddr_to_uri_unix_if_possible(resolved_addr);
238
273
  }
239
- std::string path =
240
- grpc_sockaddr_to_string(resolved_addr, false /* normalize */);
241
- std::string uri_str;
242
- if (scheme != nullptr) {
243
- uri_str = absl::StrCat(scheme, ":", path);
244
- }
245
- return uri_str;
274
+ // TODO(anramach): Encode the string using URI::Create() and URI::ToString()
275
+ // before returning.
276
+ auto path = grpc_sockaddr_to_string(resolved_addr, false /* normalize */);
277
+ if (!path.ok()) return path;
278
+ return absl::StrCat(scheme, ":", path.value());
246
279
  }
247
280
 
248
281
  const char* grpc_sockaddr_get_uri_scheme(
@@ -23,6 +23,8 @@
23
23
 
24
24
  #include <string>
25
25
 
26
+ #include "absl/status/statusor.h"
27
+
26
28
  #include "src/core/lib/iomgr/resolved_address.h"
27
29
 
28
30
  /* Returns true if addr is an IPv4-mapped IPv6 address within the
@@ -60,14 +62,15 @@ int grpc_sockaddr_set_port(grpc_resolved_address* addr, int port);
60
62
 
61
63
  // Converts a sockaddr into a newly-allocated human-readable string.
62
64
  //
63
- // Currently, only the AF_INET and AF_INET6 families are recognized.
65
+ // Currently, only the AF_INET, AF_INET6, and AF_UNIX families are recognized.
64
66
  // If the normalize flag is enabled, ::ffff:0.0.0.0/96 IPv6 addresses are
65
67
  // displayed as plain IPv4.
66
- std::string grpc_sockaddr_to_string(const grpc_resolved_address* addr,
67
- bool normalize) GRPC_MUST_USE_RESULT;
68
+ absl::StatusOr<std::string> grpc_sockaddr_to_string(
69
+ const grpc_resolved_address* addr, bool normalize) GRPC_MUST_USE_RESULT;
68
70
 
69
71
  /* Returns the URI string corresponding to \a addr */
70
- std::string grpc_sockaddr_to_uri(const grpc_resolved_address* addr);
72
+ absl::StatusOr<std::string> grpc_sockaddr_to_uri(
73
+ const grpc_resolved_address* addr);
71
74
 
72
75
  /* Returns the URI scheme corresponding to \a addr */
73
76
  const char* grpc_sockaddr_get_uri_scheme(const grpc_resolved_address* addr);
@@ -19,8 +19,8 @@
19
19
 
20
20
  #include <stdlib.h>
21
21
 
22
- #include <algorithm>
23
22
  #include <memory>
23
+ #include <utility>
24
24
 
25
25
  #include "absl/container/inlined_vector.h"
26
26
 
@@ -89,6 +89,7 @@ class AVL {
89
89
 
90
90
  private:
91
91
  struct Node;
92
+
92
93
  typedef std::shared_ptr<Node> NodePtr;
93
94
  struct Node : public std::enable_shared_from_this<Node> {
94
95
  Node(K k, V v, NodePtr l, NodePtr r, long h)
@@ -309,6 +310,7 @@ class AVL<K, void> {
309
310
 
310
311
  private:
311
312
  struct Node;
313
+
312
314
  typedef std::shared_ptr<Node> NodePtr;
313
315
  struct Node : public std::enable_shared_from_this<Node> {
314
316
  Node(K k, NodePtr l, NodePtr r, long h)
@@ -17,6 +17,10 @@
17
17
 
18
18
  #include <grpc/support/port_platform.h>
19
19
 
20
+ #include <utility>
21
+
22
+ #include "absl/utility/utility.h"
23
+
20
24
  #include "src/core/lib/channel/channel_stack.h"
21
25
  #include "src/core/lib/promise/context.h"
22
26
  #include "src/core/lib/resource_quota/arena.h"
@@ -21,11 +21,17 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
- #include "absl/strings/string_view.h"
24
+ #include <stdint.h>
25
25
 
26
- #include "src/core/lib/channel/channel_stack.h"
26
+ #include "absl/status/status.h"
27
+
28
+ #include <grpc/impl/codegen/gpr_types.h>
29
+ #include <grpc/support/atm.h>
30
+
31
+ #include "src/core/lib/iomgr/error.h"
27
32
  #include "src/core/lib/transport/byte_stream.h"
28
33
  #include "src/core/lib/transport/metadata_batch.h"
34
+ #include "src/core/lib/transport/transport.h"
29
35
 
30
36
  namespace grpc_core {
31
37
 
@@ -21,12 +21,15 @@
21
21
  #include "src/core/lib/channel/channel_args.h"
22
22
 
23
23
  #include <limits.h>
24
+ #include <stdlib.h>
24
25
  #include <string.h>
25
26
 
27
+ #include <algorithm>
26
28
  #include <map>
27
29
  #include <vector>
28
30
 
29
31
  #include "absl/strings/match.h"
32
+ #include "absl/strings/str_cat.h"
30
33
  #include "absl/strings/str_format.h"
31
34
  #include "absl/strings/str_join.h"
32
35
 
@@ -35,7 +38,6 @@
35
38
  #include <grpc/support/log.h>
36
39
  #include <grpc/support/string_util.h>
37
40
 
38
- #include "src/core/lib/gpr/string.h"
39
41
  #include "src/core/lib/gpr/useful.h"
40
42
  #include "src/core/lib/gprpp/match.h"
41
43
 
@@ -160,6 +162,43 @@ void* ChannelArgs::GetVoidPointer(absl::string_view name) const {
160
162
  return absl::get<Pointer>(*v).c_pointer();
161
163
  }
162
164
 
165
+ absl::optional<bool> ChannelArgs::GetBool(absl::string_view name) const {
166
+ auto* v = Get(name);
167
+ if (v == nullptr) return absl::nullopt;
168
+ auto* i = absl::get_if<int>(v);
169
+ if (i == nullptr) {
170
+ gpr_log(GPR_ERROR, "%s ignored: it must be an integer",
171
+ std::string(name).c_str());
172
+ return absl::nullopt;
173
+ }
174
+ switch (*i) {
175
+ case 0:
176
+ return false;
177
+ case 1:
178
+ return true;
179
+ default:
180
+ gpr_log(GPR_ERROR, "%s treated as bool but set to %d (assuming true)",
181
+ std::string(name).c_str(), *i);
182
+ return true;
183
+ }
184
+ }
185
+
186
+ std::string ChannelArgs::ToString() const {
187
+ std::vector<std::string> arg_strings;
188
+ args_.ForEach([&arg_strings](const std::string& key, const Value& value) {
189
+ std::string value_str;
190
+ if (auto* i = absl::get_if<int>(&value)) {
191
+ value_str = std::to_string(*i);
192
+ } else if (auto* s = absl::get_if<std::string>(&value)) {
193
+ value_str = *s;
194
+ } else if (auto* p = absl::get_if<Pointer>(&value)) {
195
+ value_str = absl::StrFormat("%p", p->c_pointer());
196
+ }
197
+ arg_strings.push_back(absl::StrCat(key, "=", value_str));
198
+ });
199
+ return absl::StrCat("{", absl::StrJoin(arg_strings, ", "), "}");
200
+ }
201
+
163
202
  } // namespace grpc_core
164
203
 
165
204
  static grpc_arg copy_arg(const grpc_arg* src) {
@@ -461,27 +500,7 @@ grpc_arg grpc_channel_arg_pointer_create(
461
500
  }
462
501
 
463
502
  std::string grpc_channel_args_string(const grpc_channel_args* args) {
464
- if (args == nullptr) return "";
465
- std::vector<std::string> arg_strings;
466
- for (size_t i = 0; i < args->num_args; ++i) {
467
- const grpc_arg& arg = args->args[i];
468
- std::string arg_string;
469
- switch (arg.type) {
470
- case GRPC_ARG_INTEGER:
471
- arg_string = absl::StrFormat("%s=%d", arg.key, arg.value.integer);
472
- break;
473
- case GRPC_ARG_STRING:
474
- arg_string = absl::StrFormat("%s=%s", arg.key, arg.value.string);
475
- break;
476
- case GRPC_ARG_POINTER:
477
- arg_string = absl::StrFormat("%s=%p", arg.key, arg.value.pointer.p);
478
- break;
479
- default:
480
- arg_string = "arg with unknown type";
481
- }
482
- arg_strings.push_back(arg_string);
483
- }
484
- return absl::StrJoin(arg_strings, ", ");
503
+ return grpc_core::ChannelArgs::FromC(args).ToString();
485
504
  }
486
505
 
487
506
  namespace grpc_core {
@@ -21,12 +21,16 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <stddef.h>
25
+
24
26
  #include <string>
27
+ #include <type_traits>
28
+ #include <utility>
25
29
 
30
+ #include "absl/meta/type_traits.h"
26
31
  #include "absl/strings/string_view.h"
27
32
  #include "absl/types/optional.h"
28
33
  #include "absl/types/variant.h"
29
- #include "absl/utility/utility.h"
30
34
 
31
35
  #include <grpc/impl/codegen/grpc_types.h>
32
36
 
@@ -81,6 +85,11 @@ struct ChannelArgTypeTraits<
81
85
  };
82
86
  };
83
87
 
88
+ // If a type declares some member 'struct RawPointerChannelArgTag {}' then
89
+ // we automatically generate a vtable for it that does not do any ownership
90
+ // management and compares the type by pointer identity.
91
+ // This is intended to be relatively ugly because *most types should worry about
92
+ // ownership*.
84
93
  template <typename T>
85
94
  struct ChannelArgTypeTraits<T,
86
95
  absl::void_t<typename T::RawPointerChannelArgTag>> {
@@ -191,6 +200,11 @@ class ChannelArgs {
191
200
  ChannelArgTypeTraits<
192
201
  absl::remove_cvref_t<decltype(*store_value)>>::VTable()));
193
202
  }
203
+ template <typename T>
204
+ GRPC_MUST_USE_RESULT ChannelArgs SetIfUnset(absl::string_view name, T value) {
205
+ if (Contains(name)) return *this;
206
+ return Set(name, std::move(value));
207
+ }
194
208
  GRPC_MUST_USE_RESULT ChannelArgs Remove(absl::string_view name) const;
195
209
  bool Contains(absl::string_view name) const { return Get(name) != nullptr; }
196
210
 
@@ -203,6 +217,7 @@ class ChannelArgs {
203
217
  }
204
218
  absl::optional<Duration> GetDurationFromIntMillis(
205
219
  absl::string_view name) const;
220
+ absl::optional<bool> GetBool(absl::string_view name) const;
206
221
 
207
222
  // Object based get/set.
208
223
  // Deal with the common case that we set a pointer to an object under
@@ -221,12 +236,26 @@ class ChannelArgs {
221
236
  T* GetObject() {
222
237
  return GetPointer<T>(T::ChannelArgName());
223
238
  }
239
+ template <typename T>
240
+ RefCountedPtr<T> GetObjectRef() {
241
+ auto* p = GetObject<T>();
242
+ if (p == nullptr) return nullptr;
243
+ return p->Ref();
244
+ }
224
245
 
225
246
  bool operator<(const ChannelArgs& other) const { return args_ < other.args_; }
226
247
  bool operator==(const ChannelArgs& other) const {
227
248
  return args_ == other.args_;
228
249
  }
229
250
 
251
+ // Helpers for commonly accessed things
252
+
253
+ bool WantMinimalStack() const {
254
+ return GetBool(GRPC_ARG_MINIMAL_STACK).value_or(false);
255
+ }
256
+
257
+ std::string ToString() const;
258
+
230
259
  private:
231
260
  explicit ChannelArgs(AVL<std::string, Value> args) : args_(std::move(args)) {}
232
261
 
@@ -333,8 +362,9 @@ ChannelArgs ChannelArgsBuiltinPrecondition(const grpc_channel_args* src);
333
362
  } // namespace grpc_core
334
363
 
335
364
  // Takes ownership of the old_args
336
- typedef grpc_channel_args* (*grpc_channel_args_client_channel_creation_mutator)(
337
- const char* target, grpc_channel_args* old_args,
365
+ typedef grpc_core::ChannelArgs (
366
+ *grpc_channel_args_client_channel_creation_mutator)(
367
+ const char* target, grpc_core::ChannelArgs old_args,
338
368
  grpc_channel_stack_type type);
339
369
 
340
370
  // Should be called only once globaly before grpc is init'ed.
@@ -16,7 +16,7 @@
16
16
 
17
17
  #include "src/core/lib/channel/channel_args_preconditioning.h"
18
18
 
19
- #include <grpc/support/alloc.h>
19
+ #include <utility>
20
20
 
21
21
  namespace grpc_core {
22
22
 
@@ -30,13 +30,13 @@ ChannelArgsPreconditioning ChannelArgsPreconditioning::Builder::Build() {
30
30
  return preconditioning;
31
31
  }
32
32
 
33
- const grpc_channel_args* ChannelArgsPreconditioning::PreconditionChannelArgs(
33
+ ChannelArgs ChannelArgsPreconditioning::PreconditionChannelArgs(
34
34
  const grpc_channel_args* args) const {
35
35
  ChannelArgs channel_args = ChannelArgsBuiltinPrecondition(args);
36
36
  for (auto& stage : stages_) {
37
37
  channel_args = stage(std::move(channel_args));
38
38
  }
39
- return channel_args.ToC();
39
+ return channel_args;
40
40
  }
41
41
 
42
42
  } // namespace grpc_core
@@ -20,6 +20,8 @@
20
20
  #include <functional>
21
21
  #include <vector>
22
22
 
23
+ #include <grpc/impl/codegen/grpc_types.h>
24
+
23
25
  #include "src/core/lib/channel/channel_args.h"
24
26
 
25
27
  namespace grpc_core {
@@ -49,8 +51,7 @@ class ChannelArgsPreconditioning {
49
51
  // Take channel args and precondition them.
50
52
  // Does not take ownership of the channel args passed in.
51
53
  // Returns a new channel args object that is owned by the caller.
52
- const grpc_channel_args* PreconditionChannelArgs(
53
- const grpc_channel_args* args) const;
54
+ ChannelArgs PreconditionChannelArgs(const grpc_channel_args* args) const;
54
55
 
55
56
  private:
56
57
  std::vector<Stage> stages_;
@@ -20,13 +20,14 @@
20
20
 
21
21
  #include "src/core/lib/channel/channel_stack.h"
22
22
 
23
- #include <stdlib.h>
24
- #include <string.h>
23
+ #include <stdint.h>
24
+
25
+ #include <utility>
25
26
 
26
- #include <grpc/support/alloc.h>
27
27
  #include <grpc/support/log.h>
28
28
 
29
29
  #include "src/core/lib/gpr/alloc.h"
30
+ #include "src/core/lib/promise/poll.h"
30
31
 
31
32
  grpc_core::TraceFlag grpc_trace_channel(false, "channel");
32
33
  grpc_core::TraceFlag grpc_trace_channel_stack(false, "channel_stack");
@@ -113,6 +114,8 @@ grpc_error_handle grpc_channel_stack_init(
113
114
  }
114
115
  }
115
116
 
117
+ stack->on_destroy.Init([]() {});
118
+
116
119
  size_t call_size =
117
120
  GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(grpc_call_stack)) +
118
121
  GPR_ROUND_UP_TO_ALIGNMENT_SIZE(filter_count * sizeof(grpc_call_element));
@@ -169,6 +172,9 @@ void grpc_channel_stack_destroy(grpc_channel_stack* stack) {
169
172
  for (i = 0; i < count; i++) {
170
173
  channel_elems[i].filter->destroy_channel_elem(&channel_elems[i]);
171
174
  }
175
+
176
+ (*stack->on_destroy)();
177
+ stack->on_destroy.Destroy();
172
178
  }
173
179
 
174
180
  grpc_error_handle grpc_call_stack_init(
@@ -272,3 +278,35 @@ grpc_call_stack* grpc_call_stack_from_top_element(grpc_call_element* elem) {
272
278
  reinterpret_cast<char*>(elem) -
273
279
  GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(grpc_call_stack)));
274
280
  }
281
+
282
+ void grpc_channel_stack_no_post_init(grpc_channel_stack*,
283
+ grpc_channel_element*) {}
284
+
285
+ namespace {
286
+
287
+ grpc_core::NextPromiseFactory ClientNext(grpc_channel_element* elem) {
288
+ return [elem](grpc_core::CallArgs args) {
289
+ return elem->filter->make_call_promise(elem, std::move(args),
290
+ ClientNext(elem + 1));
291
+ };
292
+ }
293
+
294
+ grpc_core::NextPromiseFactory ServerNext(grpc_channel_element* elem) {
295
+ return [elem](grpc_core::CallArgs args) {
296
+ return elem->filter->make_call_promise(elem, std::move(args),
297
+ ServerNext(elem - 1));
298
+ };
299
+ }
300
+
301
+ } // namespace
302
+
303
+ grpc_core::ArenaPromise<grpc_core::ServerMetadataHandle>
304
+ grpc_channel_stack::MakeCallPromise(grpc_core::CallArgs call_args) {
305
+ if (is_client) {
306
+ return ClientNext(grpc_channel_stack_element(this, 0))(
307
+ std::move(call_args));
308
+ } else {
309
+ return ServerNext(grpc_channel_stack_element(this, this->count - 1))(
310
+ std::move(call_args));
311
+ }
312
+ }
@@ -50,19 +50,31 @@
50
50
 
51
51
  #include <functional>
52
52
 
53
- #include <grpc/grpc.h>
53
+ #include <grpc/impl/codegen/gpr_types.h>
54
+ #include <grpc/impl/codegen/grpc_types.h>
55
+ #include <grpc/slice.h>
56
+ #include <grpc/status.h>
54
57
  #include <grpc/support/log.h>
55
- #include <grpc/support/time.h>
56
58
 
59
+ #include "src/core/lib/channel/context.h"
57
60
  #include "src/core/lib/debug/trace.h"
58
61
  #include "src/core/lib/gpr/time_precise.h"
62
+ #include "src/core/lib/gprpp/manual_constructor.h"
59
63
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
64
+ #include "src/core/lib/gprpp/time.h"
60
65
  #include "src/core/lib/iomgr/call_combiner.h"
66
+ #include "src/core/lib/iomgr/closure.h"
67
+ #include "src/core/lib/iomgr/error.h"
61
68
  #include "src/core/lib/iomgr/polling_entity.h"
69
+ #include "src/core/lib/promise/arena_promise.h"
62
70
  #include "src/core/lib/resource_quota/arena.h"
63
- #include "src/core/lib/transport/metadata_batch.h"
64
71
  #include "src/core/lib/transport/transport.h"
65
72
 
73
+ struct grpc_call_element;
74
+ struct grpc_call_stack;
75
+ struct grpc_channel_element;
76
+ struct grpc_channel_stack;
77
+
66
78
  typedef struct grpc_channel_element grpc_channel_element;
67
79
  typedef struct grpc_call_element grpc_call_element;
68
80
 
@@ -164,6 +176,10 @@ struct grpc_channel_filter {
164
176
  Implementations may assume that elem->channel_data is all zeros. */
165
177
  grpc_error_handle (*init_channel_elem)(grpc_channel_element* elem,
166
178
  grpc_channel_element_args* args);
179
+ /* Post init per-channel data.
180
+ Called after all channel elements have been successfully created. */
181
+ void (*post_init_channel_elem)(grpc_channel_stack* stk,
182
+ grpc_channel_element* elem);
167
183
  /* Destroy per channel data.
168
184
  The filter does not need to do any chaining */
169
185
  void (*destroy_channel_elem)(grpc_channel_element* elem);
@@ -195,10 +211,16 @@ struct grpc_call_element {
195
211
  guarantees they live within a single malloc() allocation */
196
212
  struct grpc_channel_stack {
197
213
  grpc_stream_refcount refcount;
214
+ bool is_client;
198
215
  size_t count;
199
216
  /* Memory required for a call stack (computed at channel stack
200
217
  initialization) */
201
218
  size_t call_stack_size;
219
+ // TODO(ctiller): remove this mechanism... it's a hack to allow
220
+ // Channel to be separated from grpc_channel_stack's allocation. As the
221
+ // promise conversion continues, we'll reconsider what grpc_channel_stack
222
+ // should look like and this can go.
223
+ grpc_core::ManualConstructor<std::function<void()>> on_destroy;
202
224
 
203
225
  // Minimal infrastructure to act like a RefCounted thing without converting
204
226
  // everything.
@@ -211,6 +233,9 @@ struct grpc_channel_stack {
211
233
  IncrementRefCount();
212
234
  return grpc_core::RefCountedPtr<grpc_channel_stack>(this);
213
235
  }
236
+
237
+ grpc_core::ArenaPromise<grpc_core::ServerMetadataHandle> MakeCallPromise(
238
+ grpc_core::CallArgs call_args);
214
239
  };
215
240
 
216
241
  /* A call stack tracks a set of related filters for one call, and guarantees
@@ -222,6 +247,16 @@ struct grpc_call_stack {
222
247
  about the address of the call stack itself. */
223
248
  grpc_stream_refcount refcount;
224
249
  size_t count;
250
+
251
+ // Minimal infrastructure to act like a RefCounted thing without converting
252
+ // everything.
253
+ // grpc_call_stack will be eliminated once the promise conversion completes.
254
+ void IncrementRefCount();
255
+ void Unref();
256
+ grpc_core::RefCountedPtr<grpc_call_stack> Ref() {
257
+ IncrementRefCount();
258
+ return grpc_core::RefCountedPtr<grpc_call_stack>(this);
259
+ }
225
260
  };
226
261
 
227
262
  /* Get a channel element given a channel stack and its index */
@@ -304,6 +339,14 @@ inline void grpc_channel_stack::Unref() {
304
339
  GRPC_CHANNEL_STACK_UNREF(this, "smart_pointer");
305
340
  }
306
341
 
342
+ inline void grpc_call_stack::IncrementRefCount() {
343
+ GRPC_CALL_STACK_REF(this, "smart_pointer");
344
+ }
345
+
346
+ inline void grpc_call_stack::Unref() {
347
+ GRPC_CALL_STACK_UNREF(this, "smart_pointer");
348
+ }
349
+
307
350
  /* Destroy a call stack */
308
351
  void grpc_call_stack_destroy(grpc_call_stack* stack,
309
352
  const grpc_call_final_info* final_info,
@@ -333,6 +376,9 @@ void grpc_call_log_op(const char* file, int line, gpr_log_severity severity,
333
376
  grpc_call_element* elem,
334
377
  grpc_transport_stream_op_batch* op);
335
378
 
379
+ void grpc_channel_stack_no_post_init(grpc_channel_stack* stk,
380
+ grpc_channel_element* elem);
381
+
336
382
  extern grpc_core::TraceFlag grpc_trace_channel;
337
383
 
338
384
  #define GRPC_CALL_LOG_OP(sev, elem, op) \