grpc 1.64.3 → 1.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (632) 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 +7 -17
  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 +32 -43
  82. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +1 -3
  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 +3 -8
  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 +6 -5
  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 -3738
  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 +40 -27
  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/util/log.cc +165 -0
  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 +6 -6
  555. data/src/core/xds/xds_client/xds_client_stats.h +2 -2
  556. data/src/ruby/bin/math_pb.rb +1 -22
  557. data/src/ruby/ext/grpc/rb_call.c +8 -1
  558. data/src/ruby/ext/grpc/rb_completion_queue.c +15 -32
  559. data/src/ruby/ext/grpc/rb_completion_queue.h +7 -1
  560. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
  561. data/src/ruby/ext/grpc/rb_server.c +39 -22
  562. data/src/ruby/lib/grpc/version.rb +1 -1
  563. data/src/ruby/pb/grpc/health/v1/health_pb.rb +1 -22
  564. data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services_pb.rb +5 -5
  565. data/src/ruby/pb/grpc/testing/metrics_pb.rb +10 -19
  566. data/src/ruby/pb/grpc/testing/metrics_services_pb.rb +5 -5
  567. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +1 -22
  568. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +1 -22
  569. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +1 -22
  570. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +4 -0
  571. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +12 -12
  572. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +66 -41
  573. data/third_party/boringssl-with-bazel/src/crypto/dilithium/dilithium.c +1497 -0
  574. data/third_party/boringssl-with-bazel/src/crypto/dilithium/internal.h +58 -0
  575. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -3
  576. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +0 -2
  577. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +2 -0
  578. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +5 -0
  579. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +45 -1
  580. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +33 -23
  581. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c +3 -6
  582. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +9 -4
  583. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +6 -0
  584. data/third_party/boringssl-with-bazel/src/crypto/internal.h +7 -0
  585. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +0 -4
  586. data/third_party/boringssl-with-bazel/src/crypto/x509/v3_utl.c +49 -16
  587. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -10
  588. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +7 -17
  589. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +8 -6
  590. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +3 -0
  591. data/third_party/boringssl-with-bazel/src/include/openssl/experimental/dilithium.h +125 -0
  592. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +0 -23
  593. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +1 -1
  594. data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -10
  595. metadata +103 -93
  596. data/src/core/ext/transport/chttp2/transport/http_trace.cc +0 -19
  597. data/src/core/ext/transport/chttp2/transport/http_trace.h +0 -24
  598. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -23
  599. data/src/core/handshaker/security/tsi_error.cc +0 -31
  600. data/src/core/handshaker/security/tsi_error.h +0 -30
  601. data/src/core/lib/channel/channel_stack_trace.cc +0 -19
  602. data/src/core/lib/channel/channel_stack_trace.h +0 -24
  603. data/src/core/lib/channel/context.h +0 -105
  604. data/src/core/lib/channel/metrics.cc +0 -334
  605. data/src/core/lib/channel/metrics.h +0 -365
  606. data/src/core/lib/event_engine/trace.cc +0 -25
  607. data/src/core/lib/gpr/log.cc +0 -166
  608. data/src/core/lib/iomgr/ev_windows.cc +0 -30
  609. data/src/core/lib/promise/trace.cc +0 -20
  610. data/src/core/lib/promise/trace.h +0 -24
  611. data/src/core/lib/resource_quota/trace.cc +0 -19
  612. data/src/core/lib/resource_quota/trace.h +0 -24
  613. data/src/core/lib/slice/slice_refcount.cc +0 -20
  614. data/src/core/lib/surface/api_trace.cc +0 -25
  615. data/src/core/lib/surface/call_trace.h +0 -24
  616. data/src/core/lib/surface/wait_for_cq_end_op.cc +0 -75
  617. data/src/core/lib/surface/wait_for_cq_end_op.h +0 -72
  618. data/src/core/lib/transport/batch_builder.cc +0 -172
  619. data/src/core/lib/transport/batch_builder.h +0 -474
  620. data/src/core/resolver/xds/xds_resolver_trace.cc +0 -25
  621. data/src/core/resolver/xds/xds_resolver_trace.h +0 -30
  622. data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +0 -122
  623. /data/src/core/{lib/gpr → util}/alloc.cc +0 -0
  624. /data/src/core/{lib/gpr → util}/iphone/cpu.cc +0 -0
  625. /data/src/core/{lib/gpr → util}/linux/cpu.cc +0 -0
  626. /data/src/core/{lib/gpr → util}/posix/string.cc +0 -0
  627. /data/src/core/{lib/gpr → util}/posix/sync.cc +0 -0
  628. /data/src/core/{lib/gpr → util}/sync.cc +0 -0
  629. /data/src/core/{lib/gpr → util}/sync_abseil.cc +0 -0
  630. /data/src/core/{lib/gpr → util}/time.cc +0 -0
  631. /data/src/core/{lib/gpr → util}/windows/cpu.cc +0 -0
  632. /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;