grpc 1.64.0 → 1.65.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (622) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +57 -58
  3. data/include/grpc/event_engine/event_engine.h +13 -6
  4. data/include/grpc/impl/channel_arg_names.h +7 -3
  5. data/include/grpc/module.modulemap +1 -0
  6. data/include/grpc/passive_listener.h +62 -0
  7. data/include/grpc/support/log.h +1 -6
  8. data/include/grpc/support/port_platform.h +3 -0
  9. data/src/core/channelz/channel_trace.cc +1 -1
  10. data/src/core/channelz/channel_trace.h +1 -1
  11. data/src/core/channelz/channelz.cc +3 -3
  12. data/src/core/channelz/channelz.h +7 -7
  13. data/src/core/channelz/channelz_registry.cc +4 -3
  14. data/src/core/client_channel/backup_poller.cc +4 -5
  15. data/src/core/client_channel/client_channel.cc +1324 -0
  16. data/src/core/client_channel/client_channel.h +243 -0
  17. data/src/core/client_channel/client_channel_filter.cc +266 -709
  18. data/src/core/client_channel/client_channel_filter.h +11 -64
  19. data/src/core/client_channel/client_channel_internal.h +16 -5
  20. data/src/core/client_channel/client_channel_plugin.cc +1 -14
  21. data/src/core/client_channel/client_channel_service_config.h +3 -3
  22. data/src/core/client_channel/config_selector.cc +1 -1
  23. data/src/core/client_channel/config_selector.h +1 -1
  24. data/src/core/client_channel/dynamic_filters.cc +3 -3
  25. data/src/core/client_channel/dynamic_filters.h +1 -3
  26. data/src/core/client_channel/load_balanced_call_destination.cc +336 -0
  27. data/src/core/client_channel/load_balanced_call_destination.h +49 -0
  28. data/src/core/client_channel/retry_filter.cc +2 -9
  29. data/src/core/client_channel/retry_filter.h +2 -7
  30. data/src/core/client_channel/retry_filter_legacy_call_data.cc +65 -72
  31. data/src/core/client_channel/retry_filter_legacy_call_data.h +0 -2
  32. data/src/core/client_channel/retry_service_config.cc +4 -5
  33. data/src/core/client_channel/retry_service_config.h +3 -3
  34. data/src/core/client_channel/subchannel.cc +220 -112
  35. data/src/core/client_channel/subchannel.h +31 -18
  36. data/src/core/client_channel/subchannel_pool_interface.cc +0 -2
  37. data/src/core/client_channel/subchannel_pool_interface.h +2 -4
  38. data/src/core/client_channel/subchannel_stream_client.cc +36 -49
  39. data/src/core/client_channel/subchannel_stream_client.h +2 -4
  40. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +7 -10
  41. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +1 -0
  42. data/src/core/ext/filters/backend_metrics/backend_metric_provider.h +7 -0
  43. data/src/core/ext/filters/census/grpc_context.cc +2 -4
  44. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +8 -15
  45. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +2 -0
  46. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +3 -7
  47. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +1 -0
  48. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +3 -3
  49. data/src/core/ext/filters/http/client/http_client_filter.cc +1 -0
  50. data/src/core/ext/filters/http/client/http_client_filter.h +1 -0
  51. data/src/core/ext/filters/http/client_authority_filter.cc +1 -0
  52. data/src/core/ext/filters/http/client_authority_filter.h +1 -0
  53. data/src/core/ext/filters/http/message_compress/compression_filter.cc +10 -15
  54. data/src/core/ext/filters/http/message_compress/compression_filter.h +2 -0
  55. data/src/core/ext/filters/http/server/http_server_filter.cc +2 -2
  56. data/src/core/ext/filters/http/server/http_server_filter.h +1 -0
  57. data/src/core/ext/filters/message_size/message_size_filter.cc +6 -9
  58. data/src/core/ext/filters/message_size/message_size_filter.h +6 -6
  59. data/src/core/ext/filters/rbac/rbac_filter.cc +2 -5
  60. data/src/core/ext/filters/rbac/rbac_filter.h +1 -0
  61. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -2
  62. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +1 -1
  63. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +2 -6
  64. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +1 -0
  65. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +3 -3
  66. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  67. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +8 -25
  68. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -5
  69. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +223 -148
  70. data/src/core/ext/transport/chttp2/server/chttp2_server.h +33 -0
  71. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +131 -107
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +8 -8
  73. data/src/core/ext/transport/chttp2/transport/context_list_entry.h +1 -1
  74. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -4
  75. data/src/core/ext/transport/chttp2/transport/flow_control.h +0 -2
  76. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -6
  77. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -2
  78. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +9 -5
  79. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -4
  80. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +9 -2
  81. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +5 -7
  82. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +1 -1
  83. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +3 -8
  84. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
  85. data/src/core/ext/transport/chttp2/transport/http2_settings.h +1 -1
  86. data/src/core/ext/transport/chttp2/transport/internal.h +29 -19
  87. data/src/core/ext/transport/chttp2/transport/parsing.cc +15 -25
  88. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +0 -2
  89. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +0 -2
  90. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +29 -13
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +5 -4
  92. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -5
  93. data/src/core/ext/transport/chttp2/transport/writing.cc +24 -25
  94. data/src/core/ext/transport/inproc/inproc_transport.cc +56 -32
  95. data/src/core/ext/transport/inproc/inproc_transport.h +1 -3
  96. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +13 -15
  97. data/src/core/ext/transport/inproc/legacy_inproc_transport.h +0 -2
  98. data/src/core/handshaker/handshaker.cc +6 -14
  99. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +9 -17
  100. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +3 -2
  101. data/src/core/handshaker/security/secure_endpoint.cc +38 -32
  102. data/src/core/handshaker/security/secure_endpoint.h +0 -2
  103. data/src/core/handshaker/security/security_handshaker.cc +25 -37
  104. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +2 -1
  105. data/src/core/lib/address_utils/parse_address.cc +27 -39
  106. data/src/core/lib/address_utils/sockaddr_utils.cc +5 -6
  107. data/src/core/lib/avl/avl.h +1 -1
  108. data/src/core/lib/channel/channel_args.cc +13 -17
  109. data/src/core/lib/channel/channel_args.h +19 -8
  110. data/src/core/lib/channel/channel_stack.cc +5 -63
  111. data/src/core/lib/channel/channel_stack.h +13 -37
  112. data/src/core/lib/channel/channel_stack_builder.h +0 -5
  113. data/src/core/lib/channel/channel_stack_builder_impl.cc +0 -142
  114. data/src/core/lib/channel/channel_stack_builder_impl.h +0 -2
  115. data/src/core/lib/channel/connected_channel.cc +37 -676
  116. data/src/core/lib/channel/promise_based_filter.cc +41 -47
  117. data/src/core/lib/channel/promise_based_filter.h +124 -477
  118. data/src/core/lib/channel/status_util.cc +1 -1
  119. data/src/core/lib/compression/compression.cc +1 -1
  120. data/src/core/lib/compression/message_compress.cc +6 -6
  121. data/src/core/lib/config/config_vars.cc +2 -7
  122. data/src/core/lib/config/config_vars.h +1 -5
  123. data/src/core/lib/debug/event_log.h +1 -1
  124. data/src/core/lib/debug/trace.cc +43 -59
  125. data/src/core/lib/debug/trace.h +2 -97
  126. data/src/core/lib/debug/trace_flags.cc +255 -0
  127. data/src/core/lib/debug/trace_flags.h +133 -0
  128. data/src/core/lib/debug/trace_impl.h +115 -0
  129. data/src/core/lib/event_engine/ares_resolver.cc +5 -7
  130. data/src/core/lib/event_engine/ares_resolver.h +1 -3
  131. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +1 -1
  132. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +17 -22
  133. data/src/core/lib/event_engine/event_engine.cc +29 -4
  134. data/src/core/lib/event_engine/extensions/supports_fd.h +7 -0
  135. data/src/core/lib/event_engine/extensions/tcp_trace.h +43 -0
  136. data/src/core/lib/event_engine/forkable.cc +4 -5
  137. data/src/core/lib/event_engine/forkable.h +0 -11
  138. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +10 -11
  139. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +4 -3
  140. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +1 -1
  141. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +19 -33
  142. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +3 -2
  143. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +24 -7
  144. data/src/core/lib/event_engine/posix_engine/posix_engine.h +2 -0
  145. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +14 -16
  146. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +18 -22
  147. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +13 -17
  148. data/src/core/lib/event_engine/posix_engine/timer.cc +1 -1
  149. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +4 -6
  150. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -1
  151. data/src/core/lib/event_engine/shim.cc +1 -1
  152. data/src/core/lib/event_engine/tcp_socket_utils.cc +6 -8
  153. data/src/core/lib/event_engine/thread_local.h +1 -1
  154. data/src/core/lib/event_engine/thread_pool/thread_count.h +1 -1
  155. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +19 -21
  156. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -6
  157. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +14 -13
  158. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +4 -3
  159. data/src/core/lib/event_engine/trace.h +6 -17
  160. data/src/core/lib/event_engine/windows/iocp.h +1 -1
  161. data/src/core/lib/event_engine/windows/win_socket.cc +23 -17
  162. data/src/core/lib/event_engine/windows/win_socket.h +4 -5
  163. data/src/core/lib/event_engine/windows/windows_endpoint.cc +6 -9
  164. data/src/core/lib/event_engine/windows/windows_engine.cc +201 -87
  165. data/src/core/lib/event_engine/windows/windows_engine.h +136 -25
  166. data/src/core/lib/event_engine/windows/windows_listener.cc +12 -23
  167. data/src/core/lib/experiments/experiments.cc +35 -151
  168. data/src/core/lib/experiments/experiments.h +12 -45
  169. data/src/core/lib/gprpp/bitset.h +1 -1
  170. data/src/core/lib/gprpp/crash.cc +2 -3
  171. data/src/core/lib/gprpp/dual_ref_counted.h +45 -33
  172. data/src/core/lib/gprpp/dump_args.cc +54 -0
  173. data/src/core/lib/gprpp/dump_args.h +69 -0
  174. data/src/core/lib/gprpp/glob.cc +70 -0
  175. data/src/core/lib/gprpp/glob.h +29 -0
  176. data/src/core/lib/gprpp/per_cpu.cc +1 -1
  177. data/src/core/lib/gprpp/posix/stat.cc +3 -4
  178. data/src/core/lib/gprpp/posix/thd.cc +8 -9
  179. data/src/core/lib/gprpp/ref_counted.h +30 -22
  180. data/src/core/lib/gprpp/single_set_ptr.h +5 -3
  181. data/src/core/lib/gprpp/status_helper.cc +11 -30
  182. data/src/core/lib/gprpp/status_helper.h +3 -31
  183. data/src/core/lib/gprpp/time.cc +3 -4
  184. data/src/core/lib/gprpp/time.h +3 -2
  185. data/src/core/lib/gprpp/unique_type_name.h +1 -1
  186. data/src/core/lib/gprpp/validation_errors.cc +10 -1
  187. data/src/core/lib/gprpp/validation_errors.h +11 -0
  188. data/src/core/lib/gprpp/windows/stat.cc +3 -4
  189. data/src/core/lib/gprpp/windows/thd.cc +3 -2
  190. data/src/core/lib/gprpp/work_serializer.cc +48 -57
  191. data/src/core/lib/iomgr/buffer_list.cc +4 -2
  192. data/src/core/lib/iomgr/call_combiner.cc +18 -27
  193. data/src/core/lib/iomgr/call_combiner.h +1 -3
  194. data/src/core/lib/iomgr/cfstream_handle.cc +4 -6
  195. data/src/core/lib/iomgr/closure.h +2 -4
  196. data/src/core/lib/iomgr/combiner.cc +6 -8
  197. data/src/core/lib/iomgr/combiner.h +0 -2
  198. data/src/core/lib/iomgr/endpoint.cc +0 -6
  199. data/src/core/lib/iomgr/endpoint.h +0 -2
  200. data/src/core/lib/iomgr/endpoint_cfstream.cc +19 -41
  201. data/src/core/lib/iomgr/endpoint_pair_posix.cc +1 -1
  202. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -6
  203. data/src/core/lib/iomgr/error.cc +13 -21
  204. data/src/core/lib/iomgr/error.h +1 -1
  205. data/src/core/lib/iomgr/ev_apple.cc +3 -5
  206. data/src/core/lib/iomgr/ev_epoll1_linux.cc +43 -42
  207. data/src/core/lib/iomgr/ev_poll_posix.cc +38 -29
  208. data/src/core/lib/iomgr/ev_posix.cc +8 -9
  209. data/src/core/lib/iomgr/ev_posix.h +10 -7
  210. data/src/core/lib/iomgr/event_engine_shims/closure.cc +2 -2
  211. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +14 -28
  212. data/src/core/lib/iomgr/exec_ctx.cc +2 -2
  213. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  214. data/src/core/lib/iomgr/executor.cc +6 -15
  215. data/src/core/lib/iomgr/executor.h +1 -1
  216. data/src/core/lib/iomgr/fork_posix.cc +8 -10
  217. data/src/core/lib/iomgr/fork_windows.cc +3 -1
  218. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +2 -3
  219. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +3 -5
  220. data/src/core/lib/iomgr/internal_errqueue.cc +4 -2
  221. data/src/core/lib/iomgr/iocp_windows.cc +4 -3
  222. data/src/core/lib/iomgr/iomgr.cc +13 -17
  223. data/src/core/lib/iomgr/lockfree_event.cc +3 -5
  224. data/src/core/lib/iomgr/pollset.h +0 -2
  225. data/src/core/lib/iomgr/pollset_windows.cc +0 -2
  226. data/src/core/lib/iomgr/resolve_address_posix.cc +7 -14
  227. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  228. data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
  229. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  230. data/src/core/lib/iomgr/socket_utils_common_posix.cc +11 -17
  231. data/src/core/lib/iomgr/socket_windows.cc +4 -6
  232. data/src/core/lib/iomgr/tcp_client_cfstream.cc +3 -5
  233. data/src/core/lib/iomgr/tcp_client_posix.cc +9 -15
  234. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -4
  235. data/src/core/lib/iomgr/tcp_posix.cc +57 -84
  236. data/src/core/lib/iomgr/tcp_posix.h +0 -2
  237. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -3
  238. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +4 -6
  239. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +7 -7
  240. data/src/core/lib/iomgr/tcp_server_windows.cc +10 -16
  241. data/src/core/lib/iomgr/tcp_windows.cc +25 -41
  242. data/src/core/lib/iomgr/timer_generic.cc +17 -20
  243. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  244. data/src/core/lib/iomgr/timer_manager.cc +17 -30
  245. data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
  246. data/src/core/lib/iomgr/vsock.cc +1 -1
  247. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +3 -3
  248. data/src/core/lib/promise/activity.h +27 -4
  249. data/src/core/lib/promise/cancel_callback.h +24 -0
  250. data/src/core/lib/promise/context.h +11 -0
  251. data/src/core/lib/promise/detail/basic_seq.h +1 -2
  252. data/src/core/lib/promise/detail/join_state.h +354 -398
  253. data/src/core/lib/promise/detail/promise_like.h +13 -6
  254. data/src/core/lib/promise/detail/seq_state.h +1178 -1178
  255. data/src/core/lib/promise/for_each.h +6 -6
  256. data/src/core/lib/promise/interceptor_list.h +6 -7
  257. data/src/core/lib/promise/latch.h +9 -9
  258. data/src/core/lib/promise/map.h +17 -0
  259. data/src/core/lib/promise/observable.h +182 -0
  260. data/src/core/lib/promise/party.cc +7 -8
  261. data/src/core/lib/promise/party.h +10 -8
  262. data/src/core/lib/promise/pipe.h +16 -35
  263. data/src/core/lib/promise/promise.h +1 -0
  264. data/src/core/lib/promise/status_flag.h +2 -0
  265. data/src/core/lib/resource_quota/arena.cc +56 -79
  266. data/src/core/lib/resource_quota/arena.h +118 -209
  267. data/src/core/lib/resource_quota/memory_quota.cc +12 -13
  268. data/src/core/lib/resource_quota/memory_quota.h +2 -3
  269. data/src/core/lib/resource_quota/periodic_update.cc +1 -1
  270. data/src/core/lib/resource_quota/resource_quota.h +1 -1
  271. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  272. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  273. data/src/core/lib/security/authorization/evaluate_args.cc +6 -8
  274. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +5 -6
  275. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +1 -0
  276. data/src/core/lib/security/authorization/matchers.cc +3 -3
  277. data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +2 -2
  278. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +2 -3
  279. data/src/core/lib/security/context/security_context.cc +12 -13
  280. data/src/core/lib/security/context/security_context.h +31 -8
  281. data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
  282. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +3 -1
  283. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -3
  284. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +5 -5
  285. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +3 -3
  286. data/src/core/lib/security/credentials/call_creds_util.cc +2 -1
  287. data/src/core/lib/security/credentials/channel_creds_registry.h +2 -2
  288. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +5 -3
  289. data/src/core/lib/security/credentials/composite/composite_credentials.h +1 -1
  290. data/src/core/lib/security/credentials/credentials.cc +6 -6
  291. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -4
  292. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +2 -2
  293. data/src/core/lib/security/credentials/external/external_account_credentials.cc +9 -11
  294. data/src/core/lib/security/credentials/external/external_account_credentials.h +3 -3
  295. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +2 -2
  296. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -4
  297. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +1 -1
  298. data/src/core/lib/security/credentials/fake/fake_credentials.h +1 -1
  299. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +3 -3
  300. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +11 -11
  301. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +1 -1
  302. data/src/core/lib/security/credentials/iam/iam_credentials.h +1 -1
  303. data/src/core/lib/security/credentials/jwt/json_token.cc +14 -15
  304. data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
  305. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +6 -5
  306. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +1 -1
  307. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +50 -54
  308. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +1 -1
  309. data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
  310. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +12 -11
  311. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -4
  312. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
  313. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +1 -3
  314. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +15 -21
  315. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  316. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +21 -30
  317. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +1 -1
  318. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +1 -1
  319. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -4
  320. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +3 -5
  321. data/src/core/lib/security/credentials/tls/tls_credentials.cc +14 -16
  322. data/src/core/lib/security/credentials/tls/tls_utils.cc +4 -4
  323. data/src/core/lib/security/credentials/xds/xds_credentials.cc +1 -1
  324. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -16
  325. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +15 -12
  326. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +6 -6
  327. data/src/core/lib/security/security_connector/load_system_roots_windows.cc +1 -1
  328. data/src/core/lib/security/security_connector/local/local_security_connector.cc +8 -12
  329. data/src/core/lib/security/security_connector/security_connector.cc +1 -4
  330. data/src/core/lib/security/security_connector/security_connector.h +1 -3
  331. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +17 -19
  332. data/src/core/lib/security/security_connector/ssl_utils.cc +19 -21
  333. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +29 -40
  334. data/src/core/lib/security/transport/auth_filters.h +1 -0
  335. data/src/core/lib/security/transport/client_auth_filter.cc +7 -13
  336. data/src/core/lib/security/transport/server_auth_filter.cc +3 -8
  337. data/src/core/lib/security/util/json_util.h +1 -1
  338. data/src/core/lib/slice/slice.h +1 -1
  339. data/src/core/lib/slice/slice_refcount.h +2 -4
  340. data/src/core/lib/slice/slice_string_helpers.cc +1 -1
  341. data/src/core/lib/surface/api_trace.h +1 -3
  342. data/src/core/lib/surface/call.cc +64 -3739
  343. data/src/core/lib/surface/call.h +41 -143
  344. data/src/core/lib/surface/call_log_batch.cc +1 -1
  345. data/src/core/lib/surface/call_utils.cc +276 -0
  346. data/src/core/lib/surface/call_utils.h +449 -0
  347. data/src/core/lib/surface/channel.cc +8 -3
  348. data/src/core/lib/surface/channel.h +10 -7
  349. data/src/core/lib/surface/channel_create.cc +14 -6
  350. data/src/core/lib/surface/channel_create.h +3 -2
  351. data/src/core/lib/surface/channel_init.cc +21 -77
  352. data/src/core/lib/surface/channel_init.h +19 -97
  353. data/src/core/lib/surface/client_call.cc +419 -0
  354. data/src/core/lib/surface/client_call.h +180 -0
  355. data/src/core/lib/surface/completion_queue.cc +28 -33
  356. data/src/core/lib/surface/completion_queue.h +0 -8
  357. data/src/core/lib/surface/filter_stack_call.cc +1157 -0
  358. data/src/core/lib/surface/filter_stack_call.h +369 -0
  359. data/src/core/lib/surface/init.cc +7 -6
  360. data/src/core/lib/surface/lame_client.cc +1 -1
  361. data/src/core/lib/surface/legacy_channel.cc +43 -30
  362. data/src/core/lib/surface/legacy_channel.h +9 -18
  363. data/src/core/lib/surface/server_call.cc +222 -0
  364. data/src/core/lib/surface/server_call.h +167 -0
  365. data/src/core/lib/surface/version.cc +2 -2
  366. data/src/core/lib/transport/bdp_estimator.cc +3 -5
  367. data/src/core/lib/transport/bdp_estimator.h +2 -4
  368. data/src/core/lib/transport/call_arena_allocator.h +9 -7
  369. data/src/core/lib/transport/call_destination.h +76 -0
  370. data/src/core/lib/transport/call_filters.cc +28 -10
  371. data/src/core/lib/transport/call_filters.h +128 -22
  372. data/src/core/lib/transport/call_spine.cc +5 -6
  373. data/src/core/lib/transport/call_spine.h +159 -334
  374. data/src/core/lib/transport/connectivity_state.cc +8 -10
  375. data/src/core/lib/transport/connectivity_state.h +0 -2
  376. data/src/core/lib/transport/interception_chain.cc +155 -0
  377. data/src/core/lib/transport/interception_chain.h +236 -0
  378. data/src/core/lib/transport/metadata_batch.h +10 -1
  379. data/src/core/lib/transport/metadata_info.h +1 -1
  380. data/src/core/lib/transport/transport.cc +3 -6
  381. data/src/core/lib/transport/transport.h +43 -40
  382. data/src/core/load_balancing/child_policy_handler.cc +8 -8
  383. data/src/core/load_balancing/endpoint_list.cc +5 -5
  384. data/src/core/load_balancing/endpoint_list.h +1 -1
  385. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +1 -0
  386. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -0
  387. data/src/core/load_balancing/grpclb/grpclb.cc +25 -29
  388. data/src/core/load_balancing/grpclb/grpclb_balancer_addresses.cc +1 -1
  389. data/src/core/load_balancing/grpclb/load_balancer_api.cc +3 -4
  390. data/src/core/load_balancing/health_check_client.cc +10 -13
  391. data/src/core/load_balancing/lb_policy.cc +5 -8
  392. data/src/core/load_balancing/lb_policy.h +19 -3
  393. data/src/core/load_balancing/lb_policy_factory.h +1 -1
  394. data/src/core/load_balancing/lb_policy_registry.cc +2 -3
  395. data/src/core/load_balancing/lb_policy_registry.h +1 -1
  396. data/src/core/load_balancing/oob_backend_metric.cc +2 -4
  397. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +33 -35
  398. data/src/core/load_balancing/outlier_detection/outlier_detection.h +3 -3
  399. data/src/core/load_balancing/pick_first/pick_first.cc +65 -65
  400. data/src/core/load_balancing/priority/priority.cc +26 -28
  401. data/src/core/load_balancing/ring_hash/ring_hash.cc +11 -13
  402. data/src/core/load_balancing/ring_hash/ring_hash.h +3 -3
  403. data/src/core/load_balancing/rls/rls.cc +82 -82
  404. data/src/core/load_balancing/round_robin/round_robin.cc +17 -20
  405. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +54 -43
  406. data/src/core/load_balancing/weighted_target/weighted_target.cc +21 -24
  407. data/src/core/load_balancing/xds/cds.cc +14 -16
  408. data/src/core/load_balancing/xds/xds_cluster_impl.cc +16 -18
  409. data/src/core/load_balancing/xds/xds_cluster_manager.cc +15 -17
  410. data/src/core/load_balancing/xds/xds_override_host.cc +40 -41
  411. data/src/core/load_balancing/xds/xds_override_host.h +3 -3
  412. data/src/core/load_balancing/xds/xds_wrr_locality.cc +10 -12
  413. data/src/core/plugin_registry/grpc_plugin_registry.cc +5 -1
  414. data/src/core/resolver/binder/binder_resolver.cc +3 -2
  415. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +3 -2
  416. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
  417. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +7 -14
  418. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -5
  419. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  420. data/src/core/resolver/dns/dns_resolver_plugin.cc +6 -5
  421. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +4 -9
  422. data/src/core/resolver/dns/event_engine/service_config_helper.cc +5 -5
  423. data/src/core/resolver/dns/native/dns_resolver.cc +8 -9
  424. data/src/core/resolver/endpoint_addresses.cc +1 -1
  425. data/src/core/resolver/fake/fake_resolver.cc +1 -1
  426. data/src/core/resolver/fake/fake_resolver.h +1 -1
  427. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +13 -14
  428. data/src/core/resolver/polling_resolver.cc +30 -35
  429. data/src/core/resolver/resolver.cc +2 -6
  430. data/src/core/resolver/resolver.h +0 -2
  431. data/src/core/resolver/resolver_registry.cc +6 -8
  432. data/src/core/resolver/sockaddr/sockaddr_resolver.cc +3 -3
  433. data/src/core/resolver/xds/xds_dependency_manager.cc +22 -23
  434. data/src/core/resolver/xds/xds_resolver.cc +13 -15
  435. data/src/core/server/server.cc +269 -389
  436. data/src/core/server/server.h +37 -19
  437. data/src/core/server/server_call_tracer_filter.cc +7 -14
  438. data/src/core/server/server_config_selector.h +1 -1
  439. data/src/core/server/server_config_selector_filter.cc +3 -3
  440. data/src/core/server/server_interface.h +2 -0
  441. data/src/core/server/xds_channel_stack_modifier.cc +1 -1
  442. data/src/core/server/xds_channel_stack_modifier.h +1 -1
  443. data/src/core/server/xds_server_config_fetcher.cc +1 -4
  444. data/src/core/service_config/service_config.h +1 -1
  445. data/src/core/service_config/service_config_call_data.h +13 -11
  446. data/src/core/service_config/service_config_channel_arg_filter.cc +6 -4
  447. data/src/core/service_config/service_config_impl.cc +5 -5
  448. data/src/core/service_config/service_config_impl.h +1 -1
  449. data/src/core/service_config/service_config_parser.cc +3 -6
  450. data/src/core/service_config/service_config_parser.h +1 -1
  451. data/src/core/{lib/channel → telemetry}/call_tracer.cc +20 -30
  452. data/src/core/{lib/channel → telemetry}/call_tracer.h +32 -9
  453. data/src/core/{lib/debug → telemetry}/histogram_view.cc +1 -1
  454. data/src/core/{lib/debug → telemetry}/histogram_view.h +3 -3
  455. data/src/core/telemetry/metrics.cc +178 -0
  456. data/src/core/telemetry/metrics.h +562 -0
  457. data/src/core/{lib/debug → telemetry}/stats.cc +1 -1
  458. data/src/core/{lib/debug → telemetry}/stats.h +5 -5
  459. data/src/core/{lib/debug → telemetry}/stats_data.cc +1 -1
  460. data/src/core/{lib/debug → telemetry}/stats_data.h +4 -4
  461. data/src/core/{lib/channel → telemetry}/tcp_tracer.h +3 -3
  462. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +12 -13
  463. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +25 -27
  464. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +32 -33
  465. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
  466. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -1
  467. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +5 -4
  468. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +5 -3
  469. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  470. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -3
  471. data/src/core/tsi/fake_transport_security.cc +14 -17
  472. data/src/core/tsi/local_transport_security.cc +6 -5
  473. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +4 -4
  474. data/src/core/tsi/ssl_transport_security.cc +76 -81
  475. data/src/core/tsi/ssl_transport_security_utils.cc +74 -18
  476. data/src/core/tsi/ssl_transport_security_utils.h +11 -0
  477. data/src/core/tsi/transport_security.cc +0 -4
  478. data/src/core/tsi/transport_security.h +0 -2
  479. data/src/core/tsi/transport_security_interface.h +0 -4
  480. data/src/core/{lib/gpr → util}/alloc.h +3 -3
  481. data/src/core/{lib/gpr → util}/android/log.cc +0 -19
  482. data/src/core/{lib/gpr → util}/atm.cc +1 -1
  483. data/src/core/{ext/gcp/metadata_query.cc → util/gcp_metadata_query.cc} +25 -26
  484. data/src/core/{ext/gcp/metadata_query.h → util/gcp_metadata_query.h} +11 -11
  485. data/src/core/{lib/http → util/http_client}/format_request.cc +4 -3
  486. data/src/core/{lib/http → util/http_client}/format_request.h +6 -5
  487. data/src/core/{lib/http → util/http_client}/httpcli.cc +9 -10
  488. data/src/core/{lib/http → util/http_client}/httpcli.h +6 -5
  489. data/src/core/{lib/http → util/http_client}/httpcli_security_connector.cc +9 -9
  490. data/src/core/{lib/http → util/http_client}/httpcli_ssl_credentials.h +5 -4
  491. data/src/core/{lib/http → util/http_client}/parser.cc +4 -5
  492. data/src/core/{lib/http → util/http_client}/parser.h +5 -6
  493. data/src/core/{lib → util}/json/json.h +5 -4
  494. data/src/core/{lib → util}/json/json_args.h +5 -5
  495. data/src/core/{lib → util}/json/json_channel_args.h +6 -6
  496. data/src/core/{lib → util}/json/json_object_loader.cc +3 -2
  497. data/src/core/{lib → util}/json/json_object_loader.h +7 -7
  498. data/src/core/{lib → util}/json/json_reader.cc +3 -2
  499. data/src/core/{lib → util}/json/json_reader.h +6 -6
  500. data/src/core/{lib → util}/json/json_util.cc +4 -4
  501. data/src/core/{lib → util}/json/json_util.h +6 -6
  502. data/src/core/{lib → util}/json/json_writer.cc +3 -3
  503. data/src/core/{lib → util}/json/json_writer.h +6 -6
  504. data/src/core/{lib/gpr → util}/linux/log.cc +0 -45
  505. data/src/core/{lib/gpr → util}/log.cc +45 -12
  506. data/src/core/{lib/gpr → util}/msys/tmpfile.cc +2 -2
  507. data/src/core/{lib/gpr → util}/posix/cpu.cc +1 -1
  508. data/src/core/{lib/gpr → util}/posix/log.cc +0 -42
  509. data/src/core/{lib/gpr → util}/posix/time.cc +1 -1
  510. data/src/core/{lib/gpr → util}/posix/tmpfile.cc +2 -2
  511. data/src/core/{lib/gpr → util}/spinlock.h +3 -3
  512. data/src/core/{lib/gpr → util}/string.cc +2 -2
  513. data/src/core/{lib/gpr → util}/string.h +3 -3
  514. data/src/core/{lib/gpr → util}/time_precise.cc +1 -1
  515. data/src/core/{lib/gpr → util}/time_precise.h +3 -3
  516. data/src/core/{lib/gpr → util}/tmpfile.h +3 -3
  517. data/src/core/{lib/gpr → util}/useful.h +3 -3
  518. data/src/core/{lib/gpr → util}/windows/log.cc +1 -44
  519. data/src/core/{lib/gpr → util}/windows/string.cc +1 -1
  520. data/src/core/{lib/gpr → util}/windows/string_util.cc +1 -1
  521. data/src/core/{lib/gpr → util}/windows/time.cc +1 -1
  522. data/src/core/{lib/gpr → util}/windows/tmpfile.cc +1 -1
  523. data/src/core/xds/grpc/certificate_provider_store.cc +3 -3
  524. data/src/core/xds/grpc/certificate_provider_store.h +4 -4
  525. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +3 -3
  526. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +3 -3
  527. data/src/core/xds/grpc/xds_audit_logger_registry.h +1 -1
  528. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +5 -5
  529. data/src/core/xds/grpc/xds_bootstrap_grpc.h +3 -3
  530. data/src/core/xds/grpc/xds_certificate_provider.h +1 -1
  531. data/src/core/xds/grpc/xds_client_grpc.cc +27 -23
  532. data/src/core/xds/grpc/xds_client_grpc.h +2 -2
  533. data/src/core/xds/grpc/xds_cluster.cc +4 -5
  534. data/src/core/xds/grpc/xds_cluster.h +1 -1
  535. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  536. data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +1 -1
  537. data/src/core/xds/grpc/xds_common_types.cc +1 -1
  538. data/src/core/xds/grpc/xds_common_types.h +1 -1
  539. data/src/core/xds/grpc/xds_endpoint.cc +4 -5
  540. data/src/core/xds/grpc/xds_http_fault_filter.cc +2 -2
  541. data/src/core/xds/grpc/xds_http_filters.h +2 -2
  542. data/src/core/xds/grpc/xds_http_rbac_filter.cc +3 -3
  543. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +2 -2
  544. data/src/core/xds/grpc/xds_lb_policy_registry.h +1 -1
  545. data/src/core/xds/grpc/xds_listener.cc +4 -6
  546. data/src/core/xds/grpc/xds_route_config.cc +7 -8
  547. data/src/core/xds/grpc/xds_transport_grpc.cc +2 -2
  548. data/src/core/xds/grpc/xds_transport_grpc.h +1 -1
  549. data/src/core/xds/xds_client/xds_api.cc +5 -9
  550. data/src/core/xds/xds_client/xds_bootstrap.cc +1 -1
  551. data/src/core/xds/xds_client/xds_bootstrap.h +1 -1
  552. data/src/core/xds/xds_client/xds_client.cc +39 -45
  553. data/src/core/xds/xds_client/xds_client.h +0 -3
  554. data/src/core/xds/xds_client/xds_client_stats.cc +20 -18
  555. data/src/core/xds/xds_client/xds_client_stats.h +2 -2
  556. data/src/ruby/ext/grpc/rb_call.c +8 -1
  557. data/src/ruby/ext/grpc/rb_completion_queue.c +15 -32
  558. data/src/ruby/ext/grpc/rb_completion_queue.h +7 -1
  559. data/src/ruby/ext/grpc/rb_server.c +39 -22
  560. data/src/ruby/lib/grpc/version.rb +1 -1
  561. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +4 -0
  562. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +12 -12
  563. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +66 -41
  564. data/third_party/boringssl-with-bazel/src/crypto/dilithium/dilithium.c +1497 -0
  565. data/third_party/boringssl-with-bazel/src/crypto/dilithium/internal.h +58 -0
  566. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -3
  567. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +0 -2
  568. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +2 -0
  569. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +5 -0
  570. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +45 -1
  571. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +33 -23
  572. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c +3 -6
  573. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +9 -4
  574. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +6 -0
  575. data/third_party/boringssl-with-bazel/src/crypto/internal.h +7 -0
  576. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +0 -4
  577. data/third_party/boringssl-with-bazel/src/crypto/x509/v3_utl.c +49 -16
  578. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -10
  579. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +7 -17
  580. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +8 -6
  581. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +3 -0
  582. data/third_party/boringssl-with-bazel/src/include/openssl/experimental/dilithium.h +125 -0
  583. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +0 -23
  584. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +1 -1
  585. data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -10
  586. metadata +95 -91
  587. data/src/core/ext/transport/chttp2/transport/http_trace.cc +0 -19
  588. data/src/core/ext/transport/chttp2/transport/http_trace.h +0 -24
  589. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -23
  590. data/src/core/handshaker/security/tsi_error.cc +0 -31
  591. data/src/core/handshaker/security/tsi_error.h +0 -30
  592. data/src/core/lib/channel/channel_stack_trace.cc +0 -19
  593. data/src/core/lib/channel/channel_stack_trace.h +0 -24
  594. data/src/core/lib/channel/context.h +0 -105
  595. data/src/core/lib/channel/metrics.cc +0 -334
  596. data/src/core/lib/channel/metrics.h +0 -365
  597. data/src/core/lib/event_engine/trace.cc +0 -25
  598. data/src/core/lib/iomgr/ev_windows.cc +0 -30
  599. data/src/core/lib/promise/trace.cc +0 -20
  600. data/src/core/lib/promise/trace.h +0 -24
  601. data/src/core/lib/resource_quota/trace.cc +0 -19
  602. data/src/core/lib/resource_quota/trace.h +0 -24
  603. data/src/core/lib/slice/slice_refcount.cc +0 -20
  604. data/src/core/lib/surface/api_trace.cc +0 -25
  605. data/src/core/lib/surface/call_trace.h +0 -24
  606. data/src/core/lib/surface/wait_for_cq_end_op.cc +0 -75
  607. data/src/core/lib/surface/wait_for_cq_end_op.h +0 -72
  608. data/src/core/lib/transport/batch_builder.cc +0 -172
  609. data/src/core/lib/transport/batch_builder.h +0 -474
  610. data/src/core/resolver/xds/xds_resolver_trace.cc +0 -25
  611. data/src/core/resolver/xds/xds_resolver_trace.h +0 -30
  612. data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +0 -122
  613. /data/src/core/{lib/gpr → util}/alloc.cc +0 -0
  614. /data/src/core/{lib/gpr → util}/iphone/cpu.cc +0 -0
  615. /data/src/core/{lib/gpr → util}/linux/cpu.cc +0 -0
  616. /data/src/core/{lib/gpr → util}/posix/string.cc +0 -0
  617. /data/src/core/{lib/gpr → util}/posix/sync.cc +0 -0
  618. /data/src/core/{lib/gpr → util}/sync.cc +0 -0
  619. /data/src/core/{lib/gpr → util}/sync_abseil.cc +0 -0
  620. /data/src/core/{lib/gpr → util}/time.cc +0 -0
  621. /data/src/core/{lib/gpr → util}/windows/cpu.cc +0 -0
  622. /data/src/core/{lib/gpr → util}/windows/sync.cc +0 -0
@@ -33,6 +33,7 @@
33
33
  #include "absl/cleanup/cleanup.h"
34
34
  #include "absl/container/flat_hash_map.h"
35
35
  #include "absl/log/check.h"
36
+ #include "absl/log/log.h"
36
37
  #include "absl/status/status.h"
37
38
  #include "absl/types/optional.h"
38
39
 
@@ -51,12 +52,11 @@
51
52
  #include "src/core/lib/channel/channel_args.h"
52
53
  #include "src/core/lib/channel/channel_args_preconditioning.h"
53
54
  #include "src/core/lib/config/core_configuration.h"
54
- #include "src/core/lib/debug/stats.h"
55
55
  #include "src/core/lib/experiments/experiments.h"
56
- #include "src/core/lib/gpr/useful.h"
57
56
  #include "src/core/lib/gprpp/crash.h"
58
57
  #include "src/core/lib/gprpp/debug_location.h"
59
58
  #include "src/core/lib/gprpp/mpscq.h"
59
+ #include "src/core/lib/gprpp/orphanable.h"
60
60
  #include "src/core/lib/gprpp/status_helper.h"
61
61
  #include "src/core/lib/iomgr/exec_ctx.h"
62
62
  #include "src/core/lib/iomgr/pollset_set.h"
@@ -74,18 +74,20 @@
74
74
  #include "src/core/lib/slice/slice_internal.h"
75
75
  #include "src/core/lib/surface/api_trace.h"
76
76
  #include "src/core/lib/surface/call.h"
77
+ #include "src/core/lib/surface/call_utils.h"
77
78
  #include "src/core/lib/surface/channel.h"
78
79
  #include "src/core/lib/surface/channel_stack_type.h"
79
80
  #include "src/core/lib/surface/completion_queue.h"
80
81
  #include "src/core/lib/surface/legacy_channel.h"
81
- #include "src/core/lib/surface/wait_for_cq_end_op.h"
82
+ #include "src/core/lib/surface/server_call.h"
82
83
  #include "src/core/lib/transport/connectivity_state.h"
83
84
  #include "src/core/lib/transport/error_utils.h"
85
+ #include "src/core/lib/transport/interception_chain.h"
86
+ #include "src/core/telemetry/stats.h"
87
+ #include "src/core/util/useful.h"
84
88
 
85
89
  namespace grpc_core {
86
90
 
87
- TraceFlag grpc_server_channel_trace(false, "server_channel");
88
-
89
91
  //
90
92
  // Server::RegisteredMethod
91
93
  //
@@ -235,7 +237,8 @@ struct Server::RequestedCall {
235
237
 
236
238
  template <typename OptionalPayload>
237
239
  void Complete(OptionalPayload payload, ClientMetadata& md) {
238
- Timestamp deadline = GetContext<Call>()->deadline();
240
+ Timestamp deadline =
241
+ md.get(GrpcTimeoutMetadata()).value_or(Timestamp::InfFuture());
239
242
  switch (type) {
240
243
  case RequestedCall::Type::BATCH_CALL:
241
244
  CHECK(!payload.has_value());
@@ -288,23 +291,29 @@ struct Server::RequestedCall {
288
291
  // application to explicitly request RPCs and then matching those to incoming
289
292
  // RPCs, along with a slow path by which incoming RPCs are put on a locked
290
293
  // pending list if they aren't able to be matched to an application request.
291
- class Server::RealRequestMatcherFilterStack : public RequestMatcherInterface {
294
+ class Server::RealRequestMatcher : public RequestMatcherInterface {
292
295
  public:
293
- explicit RealRequestMatcherFilterStack(Server* server)
296
+ explicit RealRequestMatcher(Server* server)
294
297
  : server_(server), requests_per_cq_(server->cqs_.size()) {}
295
298
 
296
- ~RealRequestMatcherFilterStack() override {
299
+ ~RealRequestMatcher() override {
297
300
  for (LockedMultiProducerSingleConsumerQueue& queue : requests_per_cq_) {
298
301
  CHECK_EQ(queue.Pop(), nullptr);
299
302
  }
300
- CHECK(pending_.empty());
303
+ CHECK(pending_filter_stack_.empty());
304
+ CHECK(pending_promises_.empty());
301
305
  }
302
306
 
303
307
  void ZombifyPending() override {
304
- while (!pending_.empty()) {
305
- pending_.front().calld->SetState(CallData::CallState::ZOMBIED);
306
- pending_.front().calld->KillZombie();
307
- pending_.pop();
308
+ while (!pending_filter_stack_.empty()) {
309
+ pending_filter_stack_.front().calld->SetState(
310
+ CallData::CallState::ZOMBIED);
311
+ pending_filter_stack_.front().calld->KillZombie();
312
+ pending_filter_stack_.pop();
313
+ }
314
+ while (!pending_promises_.empty()) {
315
+ pending_promises_.front()->Finish(absl::InternalError("Server closed"));
316
+ pending_promises_.pop();
308
317
  }
309
318
  }
310
319
 
@@ -329,35 +338,56 @@ class Server::RealRequestMatcherFilterStack : public RequestMatcherInterface {
329
338
  // matching calls
330
339
  struct NextPendingCall {
331
340
  RequestedCall* rc = nullptr;
332
- CallData* pending;
341
+ CallData* pending_filter_stack = nullptr;
342
+ PendingCallPromises pending_promise;
333
343
  };
334
344
  while (true) {
335
345
  NextPendingCall pending_call;
336
346
  {
337
347
  MutexLock lock(&server_->mu_call_);
338
- while (!pending_.empty() &&
339
- pending_.front().Age() > server_->max_time_in_pending_queue_) {
340
- pending_.front().calld->SetState(CallData::CallState::ZOMBIED);
341
- pending_.front().calld->KillZombie();
342
- pending_.pop();
348
+ while (!pending_filter_stack_.empty() &&
349
+ pending_filter_stack_.front().Age() >
350
+ server_->max_time_in_pending_queue_) {
351
+ pending_filter_stack_.front().calld->SetState(
352
+ CallData::CallState::ZOMBIED);
353
+ pending_filter_stack_.front().calld->KillZombie();
354
+ pending_filter_stack_.pop();
343
355
  }
344
- if (!pending_.empty()) {
356
+ if (!pending_promises_.empty()) {
345
357
  pending_call.rc = reinterpret_cast<RequestedCall*>(
346
358
  requests_per_cq_[request_queue_index].Pop());
347
359
  if (pending_call.rc != nullptr) {
348
- pending_call.pending = pending_.front().calld;
349
- pending_.pop();
360
+ pending_call.pending_promise =
361
+ std::move(pending_promises_.front());
362
+ pending_promises_.pop();
363
+ }
364
+ } else if (!pending_filter_stack_.empty()) {
365
+ pending_call.rc = reinterpret_cast<RequestedCall*>(
366
+ requests_per_cq_[request_queue_index].Pop());
367
+ if (pending_call.rc != nullptr) {
368
+ pending_call.pending_filter_stack =
369
+ pending_filter_stack_.front().calld;
370
+ pending_filter_stack_.pop();
350
371
  }
351
372
  }
352
373
  }
353
374
  if (pending_call.rc == nullptr) break;
354
- if (!pending_call.pending->MaybeActivate()) {
355
- // Zombied Call
356
- pending_call.pending->KillZombie();
357
- requests_per_cq_[request_queue_index].Push(
358
- &pending_call.rc->mpscq_node);
375
+ if (pending_call.pending_filter_stack != nullptr) {
376
+ if (!pending_call.pending_filter_stack->MaybeActivate()) {
377
+ // Zombied Call
378
+ pending_call.pending_filter_stack->KillZombie();
379
+ requests_per_cq_[request_queue_index].Push(
380
+ &pending_call.rc->mpscq_node);
381
+ } else {
382
+ pending_call.pending_filter_stack->Publish(request_queue_index,
383
+ pending_call.rc);
384
+ }
359
385
  } else {
360
- pending_call.pending->Publish(request_queue_index, pending_call.rc);
386
+ if (!pending_call.pending_promise->Finish(
387
+ server(), request_queue_index, pending_call.rc)) {
388
+ requests_per_cq_[request_queue_index].Push(
389
+ &pending_call.rc->mpscq_node);
390
+ }
361
391
  }
362
392
  }
363
393
  }
@@ -395,7 +425,7 @@ class Server::RealRequestMatcherFilterStack : public RequestMatcherInterface {
395
425
  }
396
426
  if (rc == nullptr) {
397
427
  calld->SetState(CallData::CallState::PENDING);
398
- pending_.push(PendingCall{calld});
428
+ pending_filter_stack_.push(PendingCallFilterStack{calld});
399
429
  return;
400
430
  }
401
431
  }
@@ -403,91 +433,6 @@ class Server::RealRequestMatcherFilterStack : public RequestMatcherInterface {
403
433
  calld->Publish(cq_idx, rc);
404
434
  }
405
435
 
406
- ArenaPromise<absl::StatusOr<MatchResult>> MatchRequest(size_t) override {
407
- Crash("not implemented for filter stack request matcher");
408
- }
409
-
410
- Server* server() const final { return server_; }
411
-
412
- private:
413
- Server* const server_;
414
- struct PendingCall {
415
- CallData* calld;
416
- Timestamp created = Timestamp::Now();
417
- Duration Age() { return Timestamp::Now() - created; }
418
- };
419
- std::queue<PendingCall> pending_;
420
- std::vector<LockedMultiProducerSingleConsumerQueue> requests_per_cq_;
421
- };
422
-
423
- class Server::RealRequestMatcherPromises : public RequestMatcherInterface {
424
- public:
425
- explicit RealRequestMatcherPromises(Server* server)
426
- : server_(server), requests_per_cq_(server->cqs_.size()) {}
427
-
428
- ~RealRequestMatcherPromises() override {
429
- for (LockedMultiProducerSingleConsumerQueue& queue : requests_per_cq_) {
430
- CHECK_EQ(queue.Pop(), nullptr);
431
- }
432
- }
433
-
434
- void ZombifyPending() override {
435
- while (!pending_.empty()) {
436
- pending_.front()->Finish(absl::InternalError("Server closed"));
437
- pending_.pop();
438
- }
439
- }
440
-
441
- void KillRequests(grpc_error_handle error) override {
442
- for (size_t i = 0; i < requests_per_cq_.size(); i++) {
443
- RequestedCall* rc;
444
- while ((rc = reinterpret_cast<RequestedCall*>(
445
- requests_per_cq_[i].Pop())) != nullptr) {
446
- server_->FailCall(i, rc, error);
447
- }
448
- }
449
- }
450
-
451
- size_t request_queue_count() const override {
452
- return requests_per_cq_.size();
453
- }
454
-
455
- void RequestCallWithPossiblePublish(size_t request_queue_index,
456
- RequestedCall* call) override {
457
- if (requests_per_cq_[request_queue_index].Push(&call->mpscq_node)) {
458
- // this was the first queued request: we need to lock and start
459
- // matching calls
460
- struct NextPendingCall {
461
- RequestedCall* rc = nullptr;
462
- PendingCall pending;
463
- };
464
- while (true) {
465
- NextPendingCall pending_call;
466
- {
467
- MutexLock lock(&server_->mu_call_);
468
- if (!pending_.empty()) {
469
- pending_call.rc = reinterpret_cast<RequestedCall*>(
470
- requests_per_cq_[request_queue_index].Pop());
471
- if (pending_call.rc != nullptr) {
472
- pending_call.pending = std::move(pending_.front());
473
- pending_.pop();
474
- }
475
- }
476
- }
477
- if (pending_call.rc == nullptr) break;
478
- if (!pending_call.pending->Finish(server(), request_queue_index,
479
- pending_call.rc)) {
480
- requests_per_cq_[request_queue_index].Push(
481
- &pending_call.rc->mpscq_node);
482
- }
483
- }
484
- }
485
- }
486
-
487
- void MatchOrQueue(size_t, CallData*) override {
488
- Crash("not implemented for promises");
489
- }
490
-
491
436
  ArenaPromise<absl::StatusOr<MatchResult>> MatchRequest(
492
437
  size_t start_request_queue_index) override {
493
438
  for (size_t i = 0; i < requests_per_cq_.size(); i++) {
@@ -509,10 +454,11 @@ class Server::RealRequestMatcherPromises : public RequestMatcherInterface {
509
454
  {
510
455
  std::vector<std::shared_ptr<ActivityWaiter>> removed_pending;
511
456
  MutexLock lock(&server_->mu_call_);
512
- while (!pending_.empty() &&
513
- pending_.front()->Age() > server_->max_time_in_pending_queue_) {
514
- removed_pending.push_back(std::move(pending_.front()));
515
- pending_.pop();
457
+ while (!pending_promises_.empty() &&
458
+ pending_promises_.front()->Age() >
459
+ server_->max_time_in_pending_queue_) {
460
+ removed_pending.push_back(std::move(pending_promises_.front()));
461
+ pending_promises_.pop();
516
462
  }
517
463
  for (loop_count = 0; loop_count < requests_per_cq_.size(); loop_count++) {
518
464
  cq_idx =
@@ -521,14 +467,14 @@ class Server::RealRequestMatcherPromises : public RequestMatcherInterface {
521
467
  if (rc != nullptr) break;
522
468
  }
523
469
  if (rc == nullptr) {
524
- if (server_->pending_backlog_protector_.Reject(pending_.size(),
470
+ if (server_->pending_backlog_protector_.Reject(pending_promises_.size(),
525
471
  server_->bitgen_)) {
526
472
  return Immediate(absl::ResourceExhaustedError(
527
473
  "Too many pending requests for this server"));
528
474
  }
529
475
  auto w = std::make_shared<ActivityWaiter>(
530
476
  GetContext<Activity>()->MakeOwningWaker());
531
- pending_.push(w);
477
+ pending_promises_.push(w);
532
478
  return OnCancel(
533
479
  [w]() -> Poll<absl::StatusOr<MatchResult>> {
534
480
  std::unique_ptr<absl::StatusOr<MatchResult>> r(
@@ -546,6 +492,11 @@ class Server::RealRequestMatcherPromises : public RequestMatcherInterface {
546
492
 
547
493
  private:
548
494
  Server* const server_;
495
+ struct PendingCallFilterStack {
496
+ CallData* calld;
497
+ Timestamp created = Timestamp::Now();
498
+ Duration Age() { return Timestamp::Now() - created; }
499
+ };
549
500
  struct ActivityWaiter {
550
501
  using ResultType = absl::StatusOr<MatchResult>;
551
502
  explicit ActivityWaiter(Waker waker) : waker(std::move(waker)) {}
@@ -580,8 +531,9 @@ class Server::RealRequestMatcherPromises : public RequestMatcherInterface {
580
531
  std::atomic<ResultType*> result{nullptr};
581
532
  const Timestamp created = Timestamp::Now();
582
533
  };
583
- using PendingCall = std::shared_ptr<ActivityWaiter>;
584
- std::queue<PendingCall> pending_;
534
+ using PendingCallPromises = std::shared_ptr<ActivityWaiter>;
535
+ std::queue<PendingCallFilterStack> pending_filter_stack_;
536
+ std::queue<PendingCallPromises> pending_promises_;
585
537
  std::vector<LockedMultiProducerSingleConsumerQueue> requests_per_cq_;
586
538
  };
587
539
 
@@ -784,16 +736,39 @@ class ChannelBroadcaster {
784
736
 
785
737
  } // namespace
786
738
 
739
+ //
740
+ // Server::TransportConnectivityWatcher
741
+ //
742
+
743
+ class Server::TransportConnectivityWatcher
744
+ : public AsyncConnectivityStateWatcherInterface {
745
+ public:
746
+ TransportConnectivityWatcher(RefCountedPtr<ServerTransport> transport,
747
+ RefCountedPtr<Server> server)
748
+ : transport_(std::move(transport)), server_(std::move(server)) {}
749
+
750
+ private:
751
+ void OnConnectivityStateChange(grpc_connectivity_state new_state,
752
+ const absl::Status& /*status*/) override {
753
+ // Don't do anything until we are being shut down.
754
+ if (new_state != GRPC_CHANNEL_SHUTDOWN) return;
755
+ // Shut down channel.
756
+ MutexLock lock(&server_->mu_global_);
757
+ server_->connections_.erase(transport_.get());
758
+ --server_->connections_open_;
759
+ server_->MaybeFinishShutdown();
760
+ }
761
+
762
+ RefCountedPtr<ServerTransport> transport_;
763
+ RefCountedPtr<Server> server_;
764
+ };
765
+
787
766
  //
788
767
  // Server
789
768
  //
790
769
 
791
770
  const grpc_channel_filter Server::kServerTopFilter = {
792
771
  Server::CallData::StartTransportStreamOpBatch,
793
- Server::ChannelData::MakeCallPromise,
794
- [](grpc_channel_element*, CallSpineInterface*) {
795
- // TODO(ctiller): remove the server filter when call-v3 is finalized
796
- },
797
772
  grpc_channel_next_op,
798
773
  sizeof(Server::CallData),
799
774
  Server::CallData::InitCallElement,
@@ -826,12 +801,91 @@ RefCountedPtr<channelz::ServerNode> CreateChannelzNode(
826
801
  return channelz_node;
827
802
  }
828
803
 
804
+ absl::StatusOr<ClientMetadataHandle> CheckClientMetadata(
805
+ ValueOrFailure<ClientMetadataHandle> md) {
806
+ if (!md.ok()) {
807
+ return absl::InternalError("Error reading metadata");
808
+ }
809
+ if (!md.value()->get_pointer(HttpPathMetadata())) {
810
+ return absl::InternalError("Missing :path header");
811
+ }
812
+ if (!md.value()->get_pointer(HttpAuthorityMetadata())) {
813
+ return absl::InternalError("Missing :authority header");
814
+ }
815
+ return std::move(*md);
816
+ }
829
817
  } // namespace
830
818
 
819
+ auto Server::MatchAndPublishCall(CallHandler call_handler) {
820
+ call_handler.SpawnGuarded("request_matcher", [this, call_handler]() mutable {
821
+ return TrySeq(
822
+ // Wait for initial metadata to pass through all filters
823
+ Map(call_handler.PullClientInitialMetadata(), CheckClientMetadata),
824
+ // Match request with requested call
825
+ [this, call_handler](ClientMetadataHandle md) mutable {
826
+ auto* registered_method = static_cast<RegisteredMethod*>(
827
+ md->get(GrpcRegisteredMethod()).value_or(nullptr));
828
+ RequestMatcherInterface* rm;
829
+ grpc_server_register_method_payload_handling payload_handling =
830
+ GRPC_SRM_PAYLOAD_NONE;
831
+ if (registered_method == nullptr) {
832
+ rm = unregistered_request_matcher_.get();
833
+ } else {
834
+ payload_handling = registered_method->payload_handling;
835
+ rm = registered_method->matcher.get();
836
+ }
837
+ auto maybe_read_first_message = If(
838
+ payload_handling == GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER,
839
+ [call_handler]() mutable { return call_handler.PullMessage(); },
840
+ []() -> ValueOrFailure<absl::optional<MessageHandle>> {
841
+ return ValueOrFailure<absl::optional<MessageHandle>>(
842
+ absl::nullopt);
843
+ });
844
+ return TryJoin<absl::StatusOr>(
845
+ std::move(maybe_read_first_message), rm->MatchRequest(0),
846
+ [md = std::move(md)]() mutable {
847
+ return ValueOrFailure<ClientMetadataHandle>(std::move(md));
848
+ });
849
+ },
850
+ // Publish call to cq
851
+ [call_handler, this](std::tuple<absl::optional<MessageHandle>,
852
+ RequestMatcherInterface::MatchResult,
853
+ ClientMetadataHandle>
854
+ r) {
855
+ RequestMatcherInterface::MatchResult& mr = std::get<1>(r);
856
+ auto md = std::move(std::get<2>(r));
857
+ auto* rc = mr.TakeCall();
858
+ rc->Complete(std::move(std::get<0>(r)), *md);
859
+ grpc_call* call =
860
+ MakeServerCall(call_handler, std::move(md), this,
861
+ rc->cq_bound_to_call, rc->initial_metadata);
862
+ *rc->call = call;
863
+ return Map(WaitForCqEndOp(false, rc->tag, absl::OkStatus(), mr.cq()),
864
+ [rc = std::unique_ptr<RequestedCall>(rc)](Empty) {
865
+ return absl::OkStatus();
866
+ });
867
+ });
868
+ });
869
+ }
870
+
871
+ absl::StatusOr<RefCountedPtr<UnstartedCallDestination>>
872
+ Server::MakeCallDestination(const ChannelArgs& args) {
873
+ InterceptionChainBuilder builder(args);
874
+ builder.AddOnClientInitialMetadata(
875
+ [this](ClientMetadata& md) { SetRegisteredMethodOnMetadata(md); });
876
+ CoreConfiguration::Get().channel_init().AddToInterceptionChainBuilder(
877
+ GRPC_SERVER_CHANNEL, builder);
878
+ return builder.Build(
879
+ MakeCallDestinationFromHandlerFunction([this](CallHandler handler) {
880
+ return MatchAndPublishCall(std::move(handler));
881
+ }));
882
+ }
883
+
831
884
  Server::Server(const ChannelArgs& args)
832
885
  : channel_args_(args),
833
886
  channelz_node_(CreateChannelzNode(args)),
834
887
  server_call_tracer_factory_(ServerCallTracerFactory::Get(args)),
888
+ compression_options_(CompressionOptionsFromChannelArgs(args)),
835
889
  max_time_in_pending_queue_(Duration::Seconds(
836
890
  channel_args_
837
891
  .GetInt(GRPC_ARG_SERVER_MAX_UNREQUESTED_TIME_IN_SERVER_SECONDS)
@@ -862,15 +916,6 @@ void Server::AddListener(OrphanablePtr<ListenerInterface> listener) {
862
916
  }
863
917
 
864
918
  void Server::Start() {
865
- auto make_real_request_matcher =
866
- [this]() -> std::unique_ptr<RequestMatcherInterface> {
867
- if (IsPromiseBasedServerCallEnabled()) {
868
- return std::make_unique<RealRequestMatcherPromises>(this);
869
- } else {
870
- return std::make_unique<RealRequestMatcherFilterStack>(this);
871
- }
872
- };
873
-
874
919
  started_ = true;
875
920
  for (grpc_completion_queue* cq : cqs_) {
876
921
  if (grpc_cq_can_listen(cq)) {
@@ -878,11 +923,11 @@ void Server::Start() {
878
923
  }
879
924
  }
880
925
  if (unregistered_request_matcher_ == nullptr) {
881
- unregistered_request_matcher_ = make_real_request_matcher();
926
+ unregistered_request_matcher_ = std::make_unique<RealRequestMatcher>(this);
882
927
  }
883
928
  for (auto& rm : registered_methods_) {
884
929
  if (rm.second->matcher == nullptr) {
885
- rm.second->matcher = make_real_request_matcher();
930
+ rm.second->matcher = std::make_unique<RealRequestMatcher>(this);
886
931
  }
887
932
  }
888
933
  {
@@ -913,37 +958,63 @@ grpc_error_handle Server::SetupTransport(
913
958
  const RefCountedPtr<channelz::SocketNode>& socket_node) {
914
959
  // Create channel.
915
960
  global_stats().IncrementServerChannelsCreated();
916
- absl::StatusOr<OrphanablePtr<Channel>> channel =
917
- LegacyChannel::Create("", args.SetObject(transport), GRPC_SERVER_CHANNEL);
918
- if (!channel.ok()) {
919
- return absl_status_to_grpc_error(channel.status());
920
- }
921
- ChannelData* chand = static_cast<ChannelData*>(
922
- grpc_channel_stack_element((*channel)->channel_stack(), 0)->channel_data);
923
- // Set up CQs.
924
- size_t cq_idx;
925
- for (cq_idx = 0; cq_idx < cqs_.size(); cq_idx++) {
926
- if (grpc_cq_pollset(cqs_[cq_idx]) == accepting_pollset) break;
927
- }
928
- if (cq_idx == cqs_.size()) {
929
- // Completion queue not found. Pick a random one to publish new calls to.
930
- cq_idx = static_cast<size_t>(rand()) % std::max<size_t>(1, cqs_.size());
931
- }
932
961
  // Set up channelz node.
933
- intptr_t channelz_socket_uuid = 0;
934
- if (socket_node != nullptr) {
935
- channelz_socket_uuid = socket_node->uuid();
936
- channelz_node_->AddChildSocket(socket_node);
937
- }
938
- // Initialize chand.
939
- chand->InitTransport(Ref(), std::move(*channel), cq_idx, transport,
940
- channelz_socket_uuid);
962
+ if (transport->server_transport() != nullptr) {
963
+ // Take ownership
964
+ // TODO(ctiller): post-v3-transition make this method take an
965
+ // OrphanablePtr<ServerTransport> directly.
966
+ OrphanablePtr<ServerTransport> t(transport->server_transport());
967
+ auto destination = MakeCallDestination(args.SetObject(transport));
968
+ if (!destination.ok()) {
969
+ return absl_status_to_grpc_error(destination.status());
970
+ }
971
+ // TODO(ctiller): add channelz node
972
+ t->SetCallDestination(std::move(*destination));
973
+ MutexLock lock(&mu_global_);
974
+ if (ShutdownCalled()) {
975
+ t->DisconnectWithError(GRPC_ERROR_CREATE("Server shutdown"));
976
+ }
977
+ t->StartConnectivityWatch(MakeOrphanable<TransportConnectivityWatcher>(
978
+ t->RefAsSubclass<ServerTransport>(), Ref()));
979
+ LOG(INFO) << "Adding connection";
980
+ connections_.emplace(std::move(t));
981
+ ++connections_open_;
982
+ } else {
983
+ CHECK(transport->filter_stack_transport() != nullptr);
984
+ absl::StatusOr<RefCountedPtr<Channel>> channel = LegacyChannel::Create(
985
+ "", args.SetObject(transport), GRPC_SERVER_CHANNEL);
986
+ if (!channel.ok()) {
987
+ return absl_status_to_grpc_error(channel.status());
988
+ }
989
+ CHECK(*channel != nullptr);
990
+ auto* channel_stack = (*channel)->channel_stack();
991
+ CHECK(channel_stack != nullptr);
992
+ ChannelData* chand = static_cast<ChannelData*>(
993
+ grpc_channel_stack_element(channel_stack, 0)->channel_data);
994
+ // Set up CQs.
995
+ size_t cq_idx;
996
+ for (cq_idx = 0; cq_idx < cqs_.size(); cq_idx++) {
997
+ if (grpc_cq_pollset(cqs_[cq_idx]) == accepting_pollset) break;
998
+ }
999
+ if (cq_idx == cqs_.size()) {
1000
+ // Completion queue not found. Pick a random one to publish new calls to.
1001
+ cq_idx = static_cast<size_t>(rand()) % std::max<size_t>(1, cqs_.size());
1002
+ }
1003
+ intptr_t channelz_socket_uuid = 0;
1004
+ if (socket_node != nullptr) {
1005
+ channelz_socket_uuid = socket_node->uuid();
1006
+ channelz_node_->AddChildSocket(socket_node);
1007
+ }
1008
+ // Initialize chand.
1009
+ chand->InitTransport(Ref(), std::move(*channel), cq_idx, transport,
1010
+ channelz_socket_uuid);
1011
+ }
941
1012
  return absl::OkStatus();
942
1013
  }
943
1014
 
944
1015
  bool Server::HasOpenConnections() {
945
1016
  MutexLock lock(&mu_global_);
946
- return !channels_.empty();
1017
+ return !channels_.empty() || !connections_.empty();
947
1018
  }
948
1019
 
949
1020
  void Server::SetRegisteredMethodAllocator(
@@ -1023,16 +1094,18 @@ void Server::MaybeFinishShutdown() {
1023
1094
  MutexLock lock(&mu_call_);
1024
1095
  KillPendingWorkLocked(GRPC_ERROR_CREATE("Server Shutdown"));
1025
1096
  }
1026
- if (!channels_.empty() || listeners_destroyed_ < listeners_.size()) {
1097
+ if (!channels_.empty() || connections_open_ > 0 ||
1098
+ listeners_destroyed_ < listeners_.size()) {
1027
1099
  if (gpr_time_cmp(gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME),
1028
1100
  last_shutdown_message_time_),
1029
1101
  gpr_time_from_seconds(1, GPR_TIMESPAN)) >= 0) {
1030
1102
  last_shutdown_message_time_ = gpr_now(GPR_CLOCK_REALTIME);
1031
1103
  gpr_log(GPR_DEBUG,
1032
- "Waiting for %" PRIuPTR " channels and %" PRIuPTR "/%" PRIuPTR
1104
+ "Waiting for %" PRIuPTR " channels %" PRIuPTR
1105
+ " connections and %" PRIuPTR "/%" PRIuPTR
1033
1106
  " listeners to be destroyed before shutting down server",
1034
- channels_.size(), listeners_.size() - listeners_destroyed_,
1035
- listeners_.size());
1107
+ channels_.size(), connections_open_,
1108
+ listeners_.size() - listeners_destroyed_, listeners_.size());
1036
1109
  }
1037
1110
  return;
1038
1111
  }
@@ -1059,7 +1132,7 @@ std::vector<RefCountedPtr<Channel>> Server::GetChannelsLocked() const {
1059
1132
  std::vector<RefCountedPtr<Channel>> channels;
1060
1133
  channels.reserve(channels_.size());
1061
1134
  for (const ChannelData* chand : channels_) {
1062
- channels.push_back(chand->channel()->Ref());
1135
+ channels.push_back(chand->channel()->RefAsSubclass<Channel>());
1063
1136
  }
1064
1137
  return channels;
1065
1138
  }
@@ -1095,6 +1168,7 @@ void DonePublishedShutdown(void* /*done_arg*/, grpc_cq_completion* storage) {
1095
1168
  // -- Once there are no more calls in progress, the channel is closed.
1096
1169
  void Server::ShutdownAndNotify(grpc_completion_queue* cq, void* tag) {
1097
1170
  ChannelBroadcaster broadcaster;
1171
+ absl::flat_hash_set<OrphanablePtr<ServerTransport>> removing_connections;
1098
1172
  {
1099
1173
  // Wait for startup to be finished. Locks mu_global.
1100
1174
  MutexLock lock(&mu_global_);
@@ -1114,6 +1188,7 @@ void Server::ShutdownAndNotify(grpc_completion_queue* cq, void* tag) {
1114
1188
  }
1115
1189
  last_shutdown_message_time_ = gpr_now(GPR_CLOCK_REALTIME);
1116
1190
  broadcaster.FillChannelsLocked(GetChannelsLocked());
1191
+ removing_connections.swap(connections_);
1117
1192
  // Collect all unregistered then registered calls.
1118
1193
  {
1119
1194
  MutexLock lock(&mu_call_);
@@ -1264,7 +1339,7 @@ class Server::ChannelData::ConnectivityWatcher
1264
1339
  : public AsyncConnectivityStateWatcherInterface {
1265
1340
  public:
1266
1341
  explicit ConnectivityWatcher(ChannelData* chand)
1267
- : chand_(chand), channel_(chand_->channel_->Ref()) {}
1342
+ : chand_(chand), channel_(chand_->channel_->RefAsSubclass<Channel>()) {}
1268
1343
 
1269
1344
  private:
1270
1345
  void OnConnectivityStateChange(grpc_connectivity_state new_state,
@@ -1300,19 +1375,8 @@ Server::ChannelData::~ChannelData() {
1300
1375
  }
1301
1376
  }
1302
1377
 
1303
- Arena* Server::ChannelData::CreateArena() { return channel_->CreateArena(); }
1304
-
1305
- absl::StatusOr<CallInitiator> Server::ChannelData::CreateCall(
1306
- ClientMetadataHandle client_initial_metadata, Arena* arena) {
1307
- SetRegisteredMethodOnMetadata(*client_initial_metadata);
1308
- auto call = MakeServerCall(std::move(client_initial_metadata), server_.get(),
1309
- channel_.get(), arena);
1310
- InitCall(call);
1311
- return CallInitiator(std::move(call));
1312
- }
1313
-
1314
1378
  void Server::ChannelData::InitTransport(RefCountedPtr<Server> server,
1315
- OrphanablePtr<Channel> channel,
1379
+ RefCountedPtr<Channel> channel,
1316
1380
  size_t cq_idx, Transport* transport,
1317
1381
  intptr_t channelz_socket_uuid) {
1318
1382
  server_ = std::move(server);
@@ -1327,22 +1391,15 @@ void Server::ChannelData::InitTransport(RefCountedPtr<Server> server,
1327
1391
  }
1328
1392
  // Start accept_stream transport op.
1329
1393
  grpc_transport_op* op = grpc_make_transport_op(nullptr);
1330
- int accept_stream_types = 0;
1331
- if (transport->filter_stack_transport() != nullptr) {
1332
- ++accept_stream_types;
1333
- op->set_accept_stream = true;
1334
- op->set_accept_stream_fn = AcceptStream;
1335
- op->set_registered_method_matcher_fn = [](void* arg,
1336
- ClientMetadata* metadata) {
1337
- static_cast<ChannelData*>(arg)->SetRegisteredMethodOnMetadata(*metadata);
1338
- };
1339
- op->set_accept_stream_user_data = this;
1340
- }
1341
- if (transport->server_transport() != nullptr) {
1342
- ++accept_stream_types;
1343
- transport->server_transport()->SetAcceptor(this);
1344
- }
1345
- CHECK_EQ(accept_stream_types, 1);
1394
+ CHECK(transport->filter_stack_transport() != nullptr);
1395
+ op->set_accept_stream = true;
1396
+ op->set_accept_stream_fn = AcceptStream;
1397
+ op->set_registered_method_matcher_fn = [](void* arg,
1398
+ ClientMetadata* metadata) {
1399
+ static_cast<ChannelData*>(arg)->server_->SetRegisteredMethodOnMetadata(
1400
+ *metadata);
1401
+ };
1402
+ op->set_accept_stream_user_data = this;
1346
1403
  op->start_connectivity_watch = MakeOrphanable<ConnectivityWatcher>(this);
1347
1404
  if (server_->ShutdownCalled()) {
1348
1405
  op->disconnect_with_error = GRPC_ERROR_CREATE("Server shutdown");
@@ -1350,24 +1407,23 @@ void Server::ChannelData::InitTransport(RefCountedPtr<Server> server,
1350
1407
  transport->PerformOp(op);
1351
1408
  }
1352
1409
 
1353
- Server::RegisteredMethod* Server::ChannelData::GetRegisteredMethod(
1410
+ Server::RegisteredMethod* Server::GetRegisteredMethod(
1354
1411
  const absl::string_view& host, const absl::string_view& path) {
1355
- if (server_->registered_methods_.empty()) return nullptr;
1412
+ if (registered_methods_.empty()) return nullptr;
1356
1413
  // check for an exact match with host
1357
- auto it = server_->registered_methods_.find(std::make_pair(host, path));
1358
- if (it != server_->registered_methods_.end()) {
1414
+ auto it = registered_methods_.find(std::make_pair(host, path));
1415
+ if (it != registered_methods_.end()) {
1359
1416
  return it->second.get();
1360
1417
  }
1361
1418
  // check for wildcard method definition (no host set)
1362
- it = server_->registered_methods_.find(std::make_pair("", path));
1363
- if (it != server_->registered_methods_.end()) {
1419
+ it = registered_methods_.find(std::make_pair("", path));
1420
+ if (it != registered_methods_.end()) {
1364
1421
  return it->second.get();
1365
1422
  }
1366
1423
  return nullptr;
1367
1424
  }
1368
1425
 
1369
- void Server::ChannelData::SetRegisteredMethodOnMetadata(
1370
- ClientMetadata& metadata) {
1426
+ void Server::SetRegisteredMethodOnMetadata(ClientMetadata& metadata) {
1371
1427
  auto* authority = metadata.get_pointer(HttpAuthorityMetadata());
1372
1428
  if (authority == nullptr) {
1373
1429
  authority = metadata.get_pointer(HostMetadata());
@@ -1392,7 +1448,7 @@ void Server::ChannelData::AcceptStream(void* arg, Transport* /*transport*/,
1392
1448
  auto* chand = static_cast<Server::ChannelData*>(arg);
1393
1449
  // create a call
1394
1450
  grpc_call_create_args args;
1395
- args.channel = chand->channel_->Ref();
1451
+ args.channel = chand->channel_->RefAsSubclass<Channel>();
1396
1452
  args.server = chand->server_.get();
1397
1453
  args.parent = nullptr;
1398
1454
  args.propagation_mask = 0;
@@ -1403,188 +1459,14 @@ void Server::ChannelData::AcceptStream(void* arg, Transport* /*transport*/,
1403
1459
  grpc_call* call;
1404
1460
  grpc_error_handle error = grpc_call_create(&args, &call);
1405
1461
  grpc_call_stack* call_stack = grpc_call_get_call_stack(call);
1406
- if (call_stack == nullptr) { // Promise based calls do not have a call stack
1407
- CHECK(error.ok());
1408
- CHECK(IsPromiseBasedServerCallEnabled());
1462
+ CHECK_NE(call_stack, nullptr);
1463
+ grpc_call_element* elem = grpc_call_stack_element(call_stack, 0);
1464
+ auto* calld = static_cast<Server::CallData*>(elem->call_data);
1465
+ if (!error.ok()) {
1466
+ calld->FailCallCreation();
1409
1467
  return;
1410
- } else {
1411
- grpc_call_element* elem = grpc_call_stack_element(call_stack, 0);
1412
- auto* calld = static_cast<Server::CallData*>(elem->call_data);
1413
- if (!error.ok()) {
1414
- calld->FailCallCreation();
1415
- return;
1416
- }
1417
- calld->Start(elem);
1418
1468
  }
1419
- }
1420
-
1421
- namespace {
1422
- auto CancelledDueToServerShutdown() {
1423
- return [] {
1424
- return ServerMetadataFromStatus(absl::CancelledError("Server shutdown"));
1425
- };
1426
- }
1427
- } // namespace
1428
-
1429
- void Server::ChannelData::InitCall(RefCountedPtr<CallSpineInterface> call) {
1430
- call->SpawnGuarded("request_matcher", [this, call]() {
1431
- return TrySeq(
1432
- // Wait for initial metadata to pass through all filters
1433
- Map(call->PullClientInitialMetadata(),
1434
- [](ValueOrFailure<ClientMetadataHandle> md)
1435
- -> absl::StatusOr<ClientMetadataHandle> {
1436
- if (!md.ok()) {
1437
- return absl::InternalError("Missing metadata");
1438
- }
1439
- if (!md.value()->get_pointer(HttpPathMetadata())) {
1440
- return absl::InternalError("Missing :path header");
1441
- }
1442
- if (!md.value()->get_pointer(HttpAuthorityMetadata())) {
1443
- return absl::InternalError("Missing :authority header");
1444
- }
1445
- return std::move(*md);
1446
- }),
1447
- // Match request with requested call
1448
- [this, call](ClientMetadataHandle md) {
1449
- auto* registered_method = static_cast<RegisteredMethod*>(
1450
- md->get(GrpcRegisteredMethod()).value_or(nullptr));
1451
- RequestMatcherInterface* rm;
1452
- grpc_server_register_method_payload_handling payload_handling =
1453
- GRPC_SRM_PAYLOAD_NONE;
1454
- if (registered_method == nullptr) {
1455
- rm = server_->unregistered_request_matcher_.get();
1456
- } else {
1457
- payload_handling = registered_method->payload_handling;
1458
- rm = registered_method->matcher.get();
1459
- }
1460
- auto maybe_read_first_message = If(
1461
- payload_handling == GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER,
1462
- [call]() { return call->PullClientToServerMessage(); },
1463
- []() -> ValueOrFailure<absl::optional<MessageHandle>> {
1464
- return ValueOrFailure<absl::optional<MessageHandle>>(
1465
- absl::nullopt);
1466
- });
1467
- return TryJoin<absl::StatusOr>(
1468
- std::move(maybe_read_first_message), rm->MatchRequest(cq_idx()),
1469
- [md = std::move(md)]() mutable {
1470
- return ValueOrFailure<ClientMetadataHandle>(std::move(md));
1471
- });
1472
- },
1473
- // Publish call to cq
1474
- [](std::tuple<absl::optional<MessageHandle>,
1475
- RequestMatcherInterface::MatchResult,
1476
- ClientMetadataHandle>
1477
- r) {
1478
- RequestMatcherInterface::MatchResult& mr = std::get<1>(r);
1479
- auto md = std::move(std::get<2>(r));
1480
- auto* rc = mr.TakeCall();
1481
- rc->Complete(std::move(std::get<0>(r)), *md);
1482
- auto* call_context = GetContext<CallContext>();
1483
- const auto* deadline = md->get_pointer(GrpcTimeoutMetadata());
1484
- if (deadline != nullptr) {
1485
- GetContext<Call>()->UpdateDeadline(*deadline);
1486
- }
1487
- *rc->call = call_context->c_call();
1488
- grpc_call_ref(*rc->call);
1489
- grpc_call_set_completion_queue(call_context->c_call(),
1490
- rc->cq_bound_to_call);
1491
- call_context->server_call_context()->PublishInitialMetadata(
1492
- std::move(md), rc->initial_metadata);
1493
- // TODO(ctiller): publish metadata
1494
- return Map(WaitForCqEndOp(false, rc->tag, absl::OkStatus(), mr.cq()),
1495
- [rc = std::unique_ptr<RequestedCall>(rc)](Empty) {
1496
- return absl::OkStatus();
1497
- });
1498
- });
1499
- });
1500
- }
1501
-
1502
- ArenaPromise<ServerMetadataHandle> Server::ChannelData::MakeCallPromise(
1503
- grpc_channel_element* elem, CallArgs call_args, NextPromiseFactory) {
1504
- auto* chand = static_cast<Server::ChannelData*>(elem->channel_data);
1505
- auto* server = chand->server_.get();
1506
- if (server->ShutdownCalled()) return CancelledDueToServerShutdown();
1507
- auto cleanup_ref =
1508
- absl::MakeCleanup([server] { server->ShutdownUnrefOnRequest(); });
1509
- if (!server->ShutdownRefOnRequest()) return CancelledDueToServerShutdown();
1510
- auto path_ptr =
1511
- call_args.client_initial_metadata->get_pointer(HttpPathMetadata());
1512
- if (path_ptr == nullptr) {
1513
- return [] {
1514
- return ServerMetadataFromStatus(
1515
- absl::InternalError("Missing :path header"));
1516
- };
1517
- }
1518
- auto host_ptr =
1519
- call_args.client_initial_metadata->get_pointer(HttpAuthorityMetadata());
1520
- if (host_ptr == nullptr) {
1521
- return [] {
1522
- return ServerMetadataFromStatus(
1523
- absl::InternalError("Missing :authority header"));
1524
- };
1525
- }
1526
- // Find request matcher.
1527
- RequestMatcherInterface* matcher;
1528
- RegisteredMethod* rm = static_cast<RegisteredMethod*>(
1529
- call_args.client_initial_metadata->get(GrpcRegisteredMethod())
1530
- .value_or(nullptr));
1531
- ArenaPromise<absl::StatusOr<NextResult<MessageHandle>>>
1532
- maybe_read_first_message([] { return NextResult<MessageHandle>(); });
1533
- if (rm != nullptr) {
1534
- matcher = rm->matcher.get();
1535
- switch (rm->payload_handling) {
1536
- case GRPC_SRM_PAYLOAD_NONE:
1537
- break;
1538
- case GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER:
1539
- maybe_read_first_message =
1540
- Map(call_args.client_to_server_messages->Next(),
1541
- [](NextResult<MessageHandle> msg)
1542
- -> absl::StatusOr<NextResult<MessageHandle>> {
1543
- return std::move(msg);
1544
- });
1545
- }
1546
- } else {
1547
- matcher = server->unregistered_request_matcher_.get();
1548
- }
1549
- return TrySeq(
1550
- std::move(maybe_read_first_message),
1551
- [cleanup_ref = std::move(cleanup_ref), matcher,
1552
- chand](NextResult<MessageHandle> payload) mutable {
1553
- return Map(
1554
- [cleanup_ref = std::move(cleanup_ref),
1555
- mr = matcher->MatchRequest(chand->cq_idx())]() mutable {
1556
- return mr();
1557
- },
1558
- [payload = std::move(payload)](
1559
- absl::StatusOr<RequestMatcherInterface::MatchResult> mr) mutable
1560
- -> absl::StatusOr<std::pair<RequestMatcherInterface::MatchResult,
1561
- NextResult<MessageHandle>>> {
1562
- if (!mr.ok()) return mr.status();
1563
- return std::make_pair(std::move(*mr), std::move(payload));
1564
- });
1565
- },
1566
- [call_args =
1567
- std::move(call_args)](std::pair<RequestMatcherInterface::MatchResult,
1568
- NextResult<MessageHandle>>
1569
- r) mutable {
1570
- auto& mr = r.first;
1571
- auto& payload = r.second;
1572
- auto* rc = mr.TakeCall();
1573
- auto* cq_for_new_request = mr.cq();
1574
- auto* server_call_context =
1575
- GetContext<CallContext>()->server_call_context();
1576
- rc->Complete(std::move(payload), *call_args.client_initial_metadata);
1577
- server_call_context->PublishInitialMetadata(
1578
- std::move(call_args.client_initial_metadata), rc->initial_metadata);
1579
- return server_call_context->MakeTopOfServerCallPromise(
1580
- std::move(call_args), rc->cq_bound_to_call,
1581
- [rc, cq_for_new_request](grpc_call* call) {
1582
- *rc->call = call;
1583
- grpc_cq_end_op(cq_for_new_request, rc->tag, absl::OkStatus(),
1584
- Server::DoneRequestEvent, rc, &rc->completion,
1585
- true);
1586
- });
1587
- });
1469
+ calld->Start(elem);
1588
1470
  }
1589
1471
 
1590
1472
  void Server::ChannelData::FinishDestroy(void* arg,
@@ -1609,9 +1491,7 @@ void Server::ChannelData::Destroy() {
1609
1491
  "Server::ChannelData::Destroy");
1610
1492
  GRPC_CLOSURE_INIT(&finish_destroy_channel_closure_, FinishDestroy, this,
1611
1493
  grpc_schedule_on_exec_ctx);
1612
- if (GRPC_TRACE_FLAG_ENABLED(grpc_server_channel_trace)) {
1613
- gpr_log(GPR_INFO, "Disconnected client");
1614
- }
1494
+ GRPC_TRACE_LOG(server_channel, INFO) << "Disconnected client";
1615
1495
  grpc_transport_op* op =
1616
1496
  grpc_make_transport_op(&finish_destroy_channel_closure_);
1617
1497
  op->set_accept_stream = true;