grpc 1.46.3-x86_64-linux → 1.47.0-x86_64-linux

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 (487) 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/2.5/grpc_c.so +0 -0
  461. data/src/ruby/lib/grpc/2.6/grpc_c.so +0 -0
  462. data/src/ruby/lib/grpc/2.7/grpc_c.so +0 -0
  463. data/src/ruby/lib/grpc/3.0/grpc_c.so +0 -0
  464. data/src/ruby/lib/grpc/3.1/grpc_c.so +0 -0
  465. data/src/ruby/lib/grpc/grpc_c.so +0 -0
  466. data/src/ruby/lib/grpc/version.rb +1 -1
  467. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  468. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  469. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +504 -0
  470. metadata +36 -29
  471. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +0 -31
  472. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  473. data/src/core/lib/event_engine/sockaddr.h +0 -44
  474. data/src/core/lib/gprpp/capture.h +0 -76
  475. data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
  476. data/src/core/lib/iomgr/event_engine/closure.h +0 -42
  477. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
  478. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  479. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
  480. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
  481. data/src/core/lib/iomgr/event_engine/promise.h +0 -51
  482. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
  483. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +0 -37
  484. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
  485. data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
  486. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
  487. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
@@ -21,233 +21,197 @@
21
21
  #include "src/core/lib/surface/channel.h"
22
22
 
23
23
  #include <inttypes.h>
24
- #include <limits.h>
25
- #include <stdlib.h>
26
24
  #include <string.h>
27
25
 
26
+ #include <algorithm>
27
+ #include <atomic>
28
+ #include <functional>
29
+ #include <memory>
30
+
31
+ #include "absl/status/status.h"
32
+
28
33
  #include <grpc/compression.h>
34
+ #include <grpc/grpc.h>
35
+ #include <grpc/impl/codegen/gpr_types.h>
29
36
  #include <grpc/support/alloc.h>
30
37
  #include <grpc/support/log.h>
31
- #include <grpc/support/string_util.h>
32
38
 
33
39
  #include "src/core/lib/channel/channel_args.h"
40
+ #include "src/core/lib/channel/channel_stack.h"
34
41
  #include "src/core/lib/channel/channel_stack_builder_impl.h"
35
42
  #include "src/core/lib/channel/channel_trace.h"
36
43
  #include "src/core/lib/channel/channelz.h"
37
- #include "src/core/lib/channel/channelz_registry.h"
38
44
  #include "src/core/lib/config/core_configuration.h"
39
45
  #include "src/core/lib/debug/stats.h"
40
- #include "src/core/lib/gpr/string.h"
46
+ #include "src/core/lib/debug/trace.h"
47
+ #include "src/core/lib/gpr/useful.h"
41
48
  #include "src/core/lib/gprpp/manual_constructor.h"
42
- #include "src/core/lib/gprpp/memory.h"
43
49
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
44
- #include "src/core/lib/iomgr/iomgr.h"
45
- #include "src/core/lib/resource_quota/api.h"
50
+ #include "src/core/lib/iomgr/error.h"
51
+ #include "src/core/lib/iomgr/exec_ctx.h"
46
52
  #include "src/core/lib/resource_quota/memory_quota.h"
47
- #include "src/core/lib/slice/slice_internal.h"
53
+ #include "src/core/lib/resource_quota/resource_quota.h"
54
+ #include "src/core/lib/slice/slice_refcount.h"
48
55
  #include "src/core/lib/surface/api_trace.h"
49
56
  #include "src/core/lib/surface/call.h"
57
+ #include "src/core/lib/surface/channel_init.h"
50
58
  #include "src/core/lib/surface/channel_stack_type.h"
59
+ #include "src/core/lib/transport/transport.h"
51
60
 
52
- /** Cache grpc-status: X mdelems for X = 0..NUM_CACHED_STATUS_ELEMS.
53
- * Avoids needing to take a metadata context lock for sending status
54
- * if the status code is <= NUM_CACHED_STATUS_ELEMS.
55
- * Sized to allow the most commonly used codes to fit in
56
- * (OK, Cancelled, Unknown). */
57
- #define NUM_CACHED_STATUS_ELEMS 3
61
+ // IWYU pragma: no_include <type_traits>
58
62
 
59
- static void destroy_channel(void* arg, grpc_error_handle error);
63
+ namespace grpc_core {
60
64
 
61
- grpc_channel* grpc_channel_create_with_builder(
62
- grpc_core::ChannelStackBuilder* builder,
63
- grpc_channel_stack_type channel_stack_type, grpc_error_handle* error) {
64
- std::string target(builder->target());
65
- grpc_channel_args* args = grpc_channel_args_copy(builder->channel_args());
66
- grpc_channel* channel;
67
- if (channel_stack_type == GRPC_SERVER_CHANNEL) {
65
+ Channel::Channel(bool is_client, std::string target, ChannelArgs channel_args,
66
+ grpc_compression_options compression_options,
67
+ RefCountedPtr<grpc_channel_stack> channel_stack)
68
+ : is_client_(is_client),
69
+ compression_options_(compression_options),
70
+ call_size_estimate_(channel_stack->call_stack_size +
71
+ grpc_call_get_initial_size_estimate()),
72
+ channelz_node_(channel_args.GetObjectRef<channelz::ChannelNode>()),
73
+ allocator_(channel_args.GetObject<ResourceQuota>()
74
+ ->memory_quota()
75
+ ->CreateMemoryOwner(target)),
76
+ target_(std::move(target)),
77
+ channel_stack_(std::move(channel_stack)) {
78
+ // We need to make sure that grpc_shutdown() does not shut things down
79
+ // until after the channel is destroyed. However, the channel may not
80
+ // actually be destroyed by the time grpc_channel_destroy() returns,
81
+ // since there may be other existing refs to the channel. If those
82
+ // refs are held by things that are visible to the wrapped language
83
+ // (such as outstanding calls on the channel), then the wrapped
84
+ // language can be responsible for making sure that grpc_shutdown()
85
+ // does not run until after those refs are released. However, the
86
+ // channel may also have refs to itself held internally for various
87
+ // things that need to be cleaned up at channel destruction (e.g.,
88
+ // LB policies, subchannels, etc), and because these refs are not
89
+ // visible to the wrapped language, it cannot be responsible for
90
+ // deferring grpc_shutdown() until after they are released. To
91
+ // accommodate that, we call grpc_init() here and then call
92
+ // grpc_shutdown() when the channel is actually destroyed, thus
93
+ // ensuring that shutdown is deferred until that point.
94
+ grpc_init();
95
+ auto channelz_node = channelz_node_;
96
+ *channel_stack_->on_destroy = [channelz_node]() {
97
+ if (channelz_node != nullptr) {
98
+ channelz_node->AddTraceEvent(
99
+ channelz::ChannelTrace::Severity::Info,
100
+ grpc_slice_from_static_string("Channel destroyed"));
101
+ }
102
+ grpc_shutdown();
103
+ };
104
+ }
105
+
106
+ absl::StatusOr<RefCountedPtr<Channel>> Channel::CreateWithBuilder(
107
+ ChannelStackBuilder* builder) {
108
+ auto channel_args = builder->channel_args();
109
+ if (builder->channel_stack_type() == GRPC_SERVER_CHANNEL) {
68
110
  GRPC_STATS_INC_SERVER_CHANNELS_CREATED();
69
111
  } else {
70
112
  GRPC_STATS_INC_CLIENT_CHANNELS_CREATED();
71
113
  }
72
- std::string name(builder->target());
73
- grpc_error_handle builder_error =
74
- builder->Build(sizeof(grpc_channel), 1, destroy_channel, nullptr,
75
- reinterpret_cast<void**>(&channel));
76
- if (builder_error != GRPC_ERROR_NONE) {
114
+ absl::StatusOr<RefCountedPtr<grpc_channel_stack>> r = builder->Build();
115
+ if (!r.ok()) {
116
+ auto status = r.status();
77
117
  gpr_log(GPR_ERROR, "channel stack builder failed: %s",
78
- grpc_error_std_string(builder_error).c_str());
79
- GPR_ASSERT(channel == nullptr);
80
- if (error != nullptr) {
81
- *error = builder_error;
82
- } else {
83
- GRPC_ERROR_UNREF(builder_error);
84
- }
85
- grpc_channel_args_destroy(args);
86
- return nullptr;
118
+ status.ToString().c_str());
119
+ return status;
87
120
  }
88
- channel->target.Init(std::move(target));
89
- channel->is_client = grpc_channel_stack_type_is_client(channel_stack_type);
90
- channel->registration_table.Init();
91
- channel->allocator.Init(grpc_core::ResourceQuotaFromChannelArgs(args)
92
- ->memory_quota()
93
- ->CreateMemoryOwner(name));
94
-
95
- gpr_atm_no_barrier_store(
96
- &channel->call_size_estimate,
97
- (gpr_atm)CHANNEL_STACK_FROM_CHANNEL(channel)->call_stack_size +
98
- grpc_call_get_initial_size_estimate());
99
-
100
- grpc_compression_options_init(&channel->compression_options);
101
- for (size_t i = 0; i < args->num_args; i++) {
102
- if (0 ==
103
- strcmp(args->args[i].key, GRPC_COMPRESSION_CHANNEL_DEFAULT_LEVEL)) {
104
- channel->compression_options.default_level.is_set = true;
105
- channel->compression_options.default_level.level =
106
- static_cast<grpc_compression_level>(grpc_channel_arg_get_integer(
107
- &args->args[i],
108
- {GRPC_COMPRESS_LEVEL_NONE, GRPC_COMPRESS_LEVEL_NONE,
109
- GRPC_COMPRESS_LEVEL_COUNT - 1}));
110
- } else if (0 == strcmp(args->args[i].key,
111
- GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM)) {
112
- channel->compression_options.default_algorithm.is_set = true;
113
- channel->compression_options.default_algorithm.algorithm =
114
- static_cast<grpc_compression_algorithm>(grpc_channel_arg_get_integer(
115
- &args->args[i], {GRPC_COMPRESS_NONE, GRPC_COMPRESS_NONE,
116
- GRPC_COMPRESS_ALGORITHMS_COUNT - 1}));
117
- } else if (0 ==
118
- strcmp(args->args[i].key,
119
- GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET)) {
120
- channel->compression_options.enabled_algorithms_bitset =
121
- static_cast<uint32_t>(args->args[i].value.integer) |
122
- 0x1; /* always support no compression */
123
- } else if (0 == strcmp(args->args[i].key, GRPC_ARG_CHANNELZ_CHANNEL_NODE)) {
124
- if (args->args[i].type == GRPC_ARG_POINTER) {
125
- GPR_ASSERT(args->args[i].value.pointer.p != nullptr);
126
- channel->channelz_node = static_cast<grpc_core::channelz::ChannelNode*>(
127
- args->args[i].value.pointer.p)
128
- ->Ref();
129
- } else {
130
- gpr_log(GPR_DEBUG,
131
- GRPC_ARG_CHANNELZ_CHANNEL_NODE " should be a pointer");
132
- }
133
- }
134
- }
135
-
136
- grpc_channel_args_destroy(args);
137
- return channel;
138
- }
139
121
 
140
- static grpc_core::UniquePtr<char> get_default_authority(
141
- const grpc_channel_args* input_args) {
142
- bool has_default_authority = false;
143
- char* ssl_override = nullptr;
144
- grpc_core::UniquePtr<char> default_authority;
145
- const size_t num_args = input_args != nullptr ? input_args->num_args : 0;
146
- for (size_t i = 0; i < num_args; ++i) {
147
- if (0 == strcmp(input_args->args[i].key, GRPC_ARG_DEFAULT_AUTHORITY)) {
148
- has_default_authority = true;
149
- } else if (0 == strcmp(input_args->args[i].key,
150
- GRPC_SSL_TARGET_NAME_OVERRIDE_ARG)) {
151
- ssl_override = grpc_channel_arg_get_string(&input_args->args[i]);
152
- }
122
+ grpc_compression_options compression_options;
123
+ grpc_compression_options_init(&compression_options);
124
+ auto default_level =
125
+ channel_args.GetInt(GRPC_COMPRESSION_CHANNEL_DEFAULT_LEVEL);
126
+ if (default_level.has_value()) {
127
+ compression_options.default_level.is_set = true;
128
+ compression_options.default_level.level = Clamp(
129
+ static_cast<grpc_compression_level>(*default_level),
130
+ GRPC_COMPRESS_LEVEL_NONE,
131
+ static_cast<grpc_compression_level>(GRPC_COMPRESS_LEVEL_COUNT - 1));
153
132
  }
154
- if (!has_default_authority && ssl_override != nullptr) {
155
- default_authority.reset(gpr_strdup(ssl_override));
133
+ auto default_algorithm =
134
+ channel_args.GetInt(GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM);
135
+ if (default_algorithm.has_value()) {
136
+ compression_options.default_algorithm.is_set = true;
137
+ compression_options.default_algorithm.algorithm =
138
+ Clamp(static_cast<grpc_compression_algorithm>(*default_algorithm),
139
+ GRPC_COMPRESS_NONE,
140
+ static_cast<grpc_compression_algorithm>(
141
+ GRPC_COMPRESS_ALGORITHMS_COUNT - 1));
156
142
  }
157
- return default_authority;
158
- }
159
-
160
- static grpc_channel_args* build_channel_args(
161
- const grpc_channel_args* input_args, char* default_authority) {
162
- grpc_arg new_args[1];
163
- size_t num_new_args = 0;
164
- if (default_authority != nullptr) {
165
- new_args[num_new_args++] = grpc_channel_arg_string_create(
166
- const_cast<char*>(GRPC_ARG_DEFAULT_AUTHORITY), default_authority);
143
+ auto enabled_algorithms_bitset =
144
+ channel_args.GetInt(GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET);
145
+ if (enabled_algorithms_bitset.has_value()) {
146
+ compression_options.enabled_algorithms_bitset =
147
+ *enabled_algorithms_bitset | 1 /* always support no compression */;
167
148
  }
168
- return grpc_channel_args_copy_and_add(input_args, new_args, num_new_args);
149
+
150
+ return RefCountedPtr<Channel>(new Channel(
151
+ grpc_channel_stack_type_is_client(builder->channel_stack_type()),
152
+ std::string(builder->target()), std::move(channel_args),
153
+ compression_options, std::move(*r)));
169
154
  }
170
155
 
171
156
  namespace {
172
157
 
173
158
  void* channelz_node_copy(void* p) {
174
- grpc_core::channelz::ChannelNode* node =
175
- static_cast<grpc_core::channelz::ChannelNode*>(p);
159
+ channelz::ChannelNode* node = static_cast<channelz::ChannelNode*>(p);
176
160
  node->Ref().release();
177
161
  return p;
178
162
  }
179
163
  void channelz_node_destroy(void* p) {
180
- grpc_core::channelz::ChannelNode* node =
181
- static_cast<grpc_core::channelz::ChannelNode*>(p);
164
+ channelz::ChannelNode* node = static_cast<channelz::ChannelNode*>(p);
182
165
  node->Unref();
183
166
  }
184
- int channelz_node_cmp(void* p1, void* p2) {
185
- return grpc_core::QsortCompare(p1, p2);
186
- }
167
+ int channelz_node_cmp(void* p1, void* p2) { return QsortCompare(p1, p2); }
187
168
  const grpc_arg_pointer_vtable channelz_node_arg_vtable = {
188
169
  channelz_node_copy, channelz_node_destroy, channelz_node_cmp};
189
170
 
190
- void CreateChannelzNode(grpc_core::ChannelStackBuilder* builder) {
191
- const grpc_channel_args* args = builder->channel_args();
171
+ void CreateChannelzNode(ChannelStackBuilder* builder) {
172
+ auto args = builder->channel_args();
192
173
  // Check whether channelz is enabled.
193
- const bool channelz_enabled = grpc_channel_args_find_bool(
194
- args, GRPC_ARG_ENABLE_CHANNELZ, GRPC_ENABLE_CHANNELZ_DEFAULT);
174
+ const bool channelz_enabled = args.GetBool(GRPC_ARG_ENABLE_CHANNELZ)
175
+ .value_or(GRPC_ENABLE_CHANNELZ_DEFAULT);
195
176
  if (!channelz_enabled) return;
196
177
  // Get parameters needed to create the channelz node.
197
- const size_t channel_tracer_max_memory = grpc_channel_args_find_integer(
198
- args, GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE,
199
- {GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT, 0, INT_MAX});
200
- const bool is_internal_channel = grpc_channel_args_find_bool(
201
- args, GRPC_ARG_CHANNELZ_IS_INTERNAL_CHANNEL, false);
178
+ const size_t channel_tracer_max_memory = std::max(
179
+ 0, args.GetInt(GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE)
180
+ .value_or(GRPC_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE_DEFAULT));
181
+ const bool is_internal_channel =
182
+ args.GetBool(GRPC_ARG_CHANNELZ_IS_INTERNAL_CHANNEL).value_or(false);
202
183
  // Create the channelz node.
203
184
  std::string target(builder->target());
204
- grpc_core::RefCountedPtr<grpc_core::channelz::ChannelNode> channelz_node =
205
- grpc_core::MakeRefCounted<grpc_core::channelz::ChannelNode>(
185
+ RefCountedPtr<channelz::ChannelNode> channelz_node =
186
+ MakeRefCounted<channelz::ChannelNode>(
206
187
  target.c_str(), channel_tracer_max_memory, is_internal_channel);
207
188
  channelz_node->AddTraceEvent(
208
- grpc_core::channelz::ChannelTrace::Severity::Info,
189
+ channelz::ChannelTrace::Severity::Info,
209
190
  grpc_slice_from_static_string("Channel created"));
210
191
  // Add channelz node to channel args.
211
192
  // We remove the is_internal_channel arg, since we no longer need it.
212
- grpc_arg new_arg = grpc_channel_arg_pointer_create(
213
- const_cast<char*>(GRPC_ARG_CHANNELZ_CHANNEL_NODE), channelz_node.get(),
214
- &channelz_node_arg_vtable);
215
- const char* args_to_remove[] = {GRPC_ARG_CHANNELZ_IS_INTERNAL_CHANNEL};
216
- grpc_channel_args* new_args = grpc_channel_args_copy_and_add_and_remove(
217
- args, args_to_remove, GPR_ARRAY_SIZE(args_to_remove), &new_arg, 1);
218
- builder->SetChannelArgs(new_args);
219
- grpc_channel_args_destroy(new_args);
193
+ builder->SetChannelArgs(
194
+ args.Remove(GRPC_ARG_CHANNELZ_IS_INTERNAL_CHANNEL)
195
+ .Set(GRPC_ARG_CHANNELZ_CHANNEL_NODE,
196
+ ChannelArgs::Pointer(channelz_node.release(),
197
+ &channelz_node_arg_vtable)));
220
198
  }
221
199
 
222
200
  } // namespace
223
201
 
224
- grpc_channel* grpc_channel_create_internal(
225
- const char* target, const grpc_channel_args* input_args,
202
+ absl::StatusOr<RefCountedPtr<Channel>> Channel::Create(
203
+ const char* target, ChannelArgs args,
226
204
  grpc_channel_stack_type channel_stack_type,
227
- grpc_transport* optional_transport, grpc_error_handle* error) {
228
- // We need to make sure that grpc_shutdown() does not shut things down
229
- // until after the channel is destroyed. However, the channel may not
230
- // actually be destroyed by the time grpc_channel_destroy() returns,
231
- // since there may be other existing refs to the channel. If those
232
- // refs are held by things that are visible to the wrapped language
233
- // (such as outstanding calls on the channel), then the wrapped
234
- // language can be responsible for making sure that grpc_shutdown()
235
- // does not run until after those refs are released. However, the
236
- // channel may also have refs to itself held internally for various
237
- // things that need to be cleaned up at channel destruction (e.g.,
238
- // LB policies, subchannels, etc), and because these refs are not
239
- // visible to the wrapped language, it cannot be responsible for
240
- // deferring grpc_shutdown() until after they are released. To
241
- // accommodate that, we call grpc_init() here and then call
242
- // grpc_shutdown() when the channel is actually destroyed, thus
243
- // ensuring that shutdown is deferred until that point.
244
- grpc_init();
245
- grpc_core::ChannelStackBuilderImpl builder(
205
+ grpc_transport* optional_transport) {
206
+ ChannelStackBuilderImpl builder(
246
207
  grpc_channel_stack_type_string(channel_stack_type), channel_stack_type);
247
- const grpc_core::UniquePtr<char> default_authority =
248
- get_default_authority(input_args);
249
- grpc_channel_args* args =
250
- build_channel_args(input_args, default_authority.get());
208
+ if (!args.GetString(GRPC_ARG_DEFAULT_AUTHORITY).has_value()) {
209
+ auto ssl_override = args.GetString(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG);
210
+ if (ssl_override.has_value()) {
211
+ args = args.Set(GRPC_ARG_DEFAULT_AUTHORITY,
212
+ std::string(ssl_override.value()));
213
+ }
214
+ }
251
215
  if (grpc_channel_stack_type_is_client(channel_stack_type)) {
252
216
  auto channel_args_mutator =
253
217
  grpc_channel_args_get_client_channel_creation_mutator();
@@ -255,12 +219,10 @@ grpc_channel* grpc_channel_create_internal(
255
219
  args = channel_args_mutator(target, args, channel_stack_type);
256
220
  }
257
221
  }
258
- builder.SetChannelArgs(args).SetTarget(target).SetTransport(
259
- optional_transport);
260
- grpc_channel_args_destroy(args);
261
- if (!grpc_core::CoreConfiguration::Get().channel_init().CreateStack(
262
- &builder)) {
263
- grpc_shutdown(); // Since we won't call destroy_channel().
222
+ builder.SetChannelArgs(std::move(args))
223
+ .SetTarget(target)
224
+ .SetTransport(optional_transport);
225
+ if (!CoreConfiguration::Get().channel_init().CreateStack(&builder)) {
264
226
  return nullptr;
265
227
  }
266
228
  // We only need to do this for clients here. For servers, this will be
@@ -268,60 +230,43 @@ grpc_channel* grpc_channel_create_internal(
268
230
  if (grpc_channel_stack_type_is_client(channel_stack_type)) {
269
231
  CreateChannelzNode(&builder);
270
232
  }
271
- grpc_channel* channel =
272
- grpc_channel_create_with_builder(&builder, channel_stack_type, error);
273
- if (channel == nullptr) {
274
- grpc_shutdown(); // Since we won't call destroy_channel().
275
- }
276
- return channel;
233
+ return CreateWithBuilder(&builder);
277
234
  }
278
235
 
279
- size_t grpc_channel_get_call_size_estimate(grpc_channel* channel) {
280
- #define ROUND_UP_SIZE 256
281
- /* We round up our current estimate to the NEXT value of ROUND_UP_SIZE.
282
- This ensures:
283
- 1. a consistent size allocation when our estimate is drifting slowly
284
- (which is common) - which tends to help most allocators reuse memory
285
- 2. a small amount of allowed growth over the estimate without hitting
286
- the arena size doubling case, reducing overall memory usage */
287
- return (static_cast<size_t>(
288
- gpr_atm_no_barrier_load(&channel->call_size_estimate)) +
289
- 2 * ROUND_UP_SIZE) &
290
- ~static_cast<size_t>(ROUND_UP_SIZE - 1);
291
- }
292
-
293
- void grpc_channel_update_call_size_estimate(grpc_channel* channel,
294
- size_t size) {
295
- size_t cur = static_cast<size_t>(
296
- gpr_atm_no_barrier_load(&channel->call_size_estimate));
236
+ void Channel::UpdateCallSizeEstimate(size_t size) {
237
+ size_t cur = call_size_estimate_.load(std::memory_order_relaxed);
297
238
  if (cur < size) {
298
- /* size grew: update estimate */
299
- gpr_atm_no_barrier_cas(&channel->call_size_estimate,
300
- static_cast<gpr_atm>(cur),
301
- static_cast<gpr_atm>(size));
302
- /* if we lose: never mind, something else will likely update soon enough */
239
+ // size grew: update estimate
240
+ call_size_estimate_.compare_exchange_weak(
241
+ cur, size, std::memory_order_relaxed, std::memory_order_relaxed);
242
+ // if we lose: never mind, something else will likely update soon enough
303
243
  } else if (cur == size) {
304
- /* no change: holding pattern */
244
+ // no change: holding pattern
305
245
  } else if (cur > 0) {
306
- /* size shrank: decrease estimate */
307
- gpr_atm_no_barrier_cas(
308
- &channel->call_size_estimate, static_cast<gpr_atm>(cur),
309
- static_cast<gpr_atm>(std::min(cur - 1, (255 * cur + size) / 256)));
310
- /* if we lose: never mind, something else will likely update soon enough */
246
+ // size shrank: decrease estimate
247
+ call_size_estimate_.compare_exchange_weak(
248
+ cur, std::min(cur - 1, (255 * cur + size) / 256),
249
+ std::memory_order_relaxed, std::memory_order_relaxed);
250
+ // if we lose: never mind, something else will likely update soon enough
311
251
  }
312
252
  }
313
253
 
254
+ } // namespace grpc_core
255
+
314
256
  char* grpc_channel_get_target(grpc_channel* channel) {
315
257
  GRPC_API_TRACE("grpc_channel_get_target(channel=%p)", 1, (channel));
316
- return gpr_strdup(channel->target->c_str());
258
+ auto target = grpc_core::Channel::FromC(channel)->target();
259
+ char* buffer = static_cast<char*>(gpr_zalloc(target.size() + 1));
260
+ memcpy(buffer, target.data(), target.size());
261
+ return buffer;
317
262
  }
318
263
 
319
264
  void grpc_channel_get_info(grpc_channel* channel,
320
265
  const grpc_channel_info* channel_info) {
321
266
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
322
267
  grpc_core::ExecCtx exec_ctx;
323
- grpc_channel_element* elem =
324
- grpc_channel_stack_element(CHANNEL_STACK_FROM_CHANNEL(channel), 0);
268
+ grpc_channel_element* elem = grpc_channel_stack_element(
269
+ grpc_core::Channel::FromC(channel)->channel_stack(), 0);
325
270
  elem->filter->get_channel_info(elem, channel_info);
326
271
  }
327
272
 
@@ -332,21 +277,22 @@ void grpc_channel_reset_connect_backoff(grpc_channel* channel) {
332
277
  (channel));
333
278
  grpc_transport_op* op = grpc_make_transport_op(nullptr);
334
279
  op->reset_connect_backoff = true;
335
- grpc_channel_element* elem =
336
- grpc_channel_stack_element(CHANNEL_STACK_FROM_CHANNEL(channel), 0);
280
+ grpc_channel_element* elem = grpc_channel_stack_element(
281
+ grpc_core::Channel::FromC(channel)->channel_stack(), 0);
337
282
  elem->filter->start_transport_op(elem, op);
338
283
  }
339
284
 
340
285
  static grpc_call* grpc_channel_create_call_internal(
341
- grpc_channel* channel, grpc_call* parent_call, uint32_t propagation_mask,
286
+ grpc_channel* c_channel, grpc_call* parent_call, uint32_t propagation_mask,
342
287
  grpc_completion_queue* cq, grpc_pollset_set* pollset_set_alternative,
343
288
  grpc_core::Slice path, absl::optional<grpc_core::Slice> authority,
344
289
  grpc_core::Timestamp deadline) {
345
- GPR_ASSERT(channel->is_client);
290
+ auto channel = grpc_core::Channel::FromC(c_channel)->Ref();
291
+ GPR_ASSERT(channel->is_client());
346
292
  GPR_ASSERT(!(cq != nullptr && pollset_set_alternative != nullptr));
347
293
 
348
294
  grpc_call_create_args args;
349
- args.channel = channel;
295
+ args.channel = std::move(channel);
350
296
  args.server = nullptr;
351
297
  args.parent = parent_call;
352
298
  args.propagation_mask = propagation_mask;
@@ -424,20 +370,27 @@ void* grpc_channel_register_call(grpc_channel* channel, const char* method,
424
370
  GPR_ASSERT(!reserved);
425
371
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
426
372
  grpc_core::ExecCtx exec_ctx;
373
+ return grpc_core::Channel::FromC(channel)->RegisterCall(method, host);
374
+ }
375
+
376
+ namespace grpc_core {
427
377
 
428
- grpc_core::MutexLock lock(&channel->registration_table->mu);
429
- channel->registration_table->method_registration_attempts++;
378
+ RegisteredCall* Channel::RegisterCall(const char* method, const char* host) {
379
+ MutexLock lock(&registration_table_.mu);
380
+ registration_table_.method_registration_attempts++;
430
381
  auto key = std::make_pair(std::string(host != nullptr ? host : ""),
431
382
  std::string(method != nullptr ? method : ""));
432
- auto rc_posn = channel->registration_table->map.find(key);
433
- if (rc_posn != channel->registration_table->map.end()) {
383
+ auto rc_posn = registration_table_.map.find(key);
384
+ if (rc_posn != registration_table_.map.end()) {
434
385
  return &rc_posn->second;
435
386
  }
436
- auto insertion_result = channel->registration_table->map.insert(
437
- {std::move(key), grpc_core::RegisteredCall(method, host)});
387
+ auto insertion_result = registration_table_.map.insert(
388
+ {std::move(key), RegisteredCall(method, host)});
438
389
  return &insertion_result.first->second;
439
390
  }
440
391
 
392
+ } // namespace grpc_core
393
+
441
394
  grpc_call* grpc_channel_create_registered_call(
442
395
  grpc_channel* channel, grpc_call* parent_call, uint32_t propagation_mask,
443
396
  grpc_completion_queue* completion_queue, void* registered_call_handle,
@@ -469,32 +422,16 @@ grpc_call* grpc_channel_create_registered_call(
469
422
  return call;
470
423
  }
471
424
 
472
- static void destroy_channel(void* arg, grpc_error_handle /*error*/) {
473
- grpc_channel* channel = static_cast<grpc_channel*>(arg);
474
- if (channel->channelz_node != nullptr) {
475
- channel->channelz_node->AddTraceEvent(
476
- grpc_core::channelz::ChannelTrace::Severity::Info,
477
- grpc_slice_from_static_string("Channel destroyed"));
478
- channel->channelz_node.reset();
479
- }
480
- grpc_channel_stack_destroy(CHANNEL_STACK_FROM_CHANNEL(channel));
481
- channel->registration_table.Destroy();
482
- channel->allocator.Destroy();
483
- channel->target.Destroy();
484
- gpr_free(channel);
485
- // See comment in grpc_channel_create_internal() for why we do this.
486
- grpc_shutdown();
487
- }
488
-
489
- void grpc_channel_destroy_internal(grpc_channel* channel) {
425
+ void grpc_channel_destroy_internal(grpc_channel* c_channel) {
426
+ grpc_core::RefCountedPtr<grpc_core::Channel> channel(
427
+ grpc_core::Channel::FromC(c_channel));
490
428
  grpc_transport_op* op = grpc_make_transport_op(nullptr);
491
429
  grpc_channel_element* elem;
492
- GRPC_API_TRACE("grpc_channel_destroy(channel=%p)", 1, (channel));
430
+ GRPC_API_TRACE("grpc_channel_destroy(channel=%p)", 1, (c_channel));
493
431
  op->disconnect_with_error =
494
432
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Channel Destroyed");
495
- elem = grpc_channel_stack_element(CHANNEL_STACK_FROM_CHANNEL(channel), 0);
433
+ elem = grpc_channel_stack_element(channel->channel_stack(), 0);
496
434
  elem->filter->start_transport_op(elem, op);
497
- GRPC_CHANNEL_INTERNAL_UNREF(channel, "channel");
498
435
  }
499
436
 
500
437
  void grpc_channel_destroy(grpc_channel* channel) {