From e5cd63f971ffbeef9afc6c6efbea85f10dd80477 Mon Sep 17 00:00:00 2001 From: Tanvi Jagtap <139093547+tanvi-jagtap@users.noreply.github.com> Date: Fri, 10 May 2024 19:49:00 -0700 Subject: [PATCH 01/10] [grpc][Gpr_To_Absl_Logging] Migrating from gpr to absl logging - gpr_log (#36575) [grpc][Gpr_To_Absl_Logging] Migrating from gpr to absl logging - gpr_log In this CL we are migrating from gRPCs own gpr logging mechanism to absl logging mechanism. The intention is to deprecate gpr_log in the future. We have the following mapping 1. gpr_log(GPR_INFO,...) -> LOG(INFO) 2. gpr_log(GPR_ERROR,...) -> LOG(ERROR) 3. gpr_log(GPR_DEBUG,...) -> VLOG(2) Reviewers need to check : 1. If the above mapping is correct. 2. The content of the log is as before. gpr_log format strings did not use string_view or std::string . absl LOG accepts these. So there will be some elimination of string_view and std::string related conversions. This is expected. Closes #36575 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/36575 from tanvi-jagtap:test_core_e2e_all ef6f23db8c4d4a48818d94501492d3382ce57af4 PiperOrigin-RevId: 632669009 --- test/core/end2end/BUILD | 27 ++++++++++-- test/core/end2end/bad_server_response_test.cc | 19 ++++---- test/core/end2end/connection_refused_test.cc | 8 ++-- test/core/end2end/cq_verifier.cc | 15 +++---- test/core/end2end/dualstack_socket_test.cc | 27 ++++++------ test/core/end2end/end2end_tests.cc | 7 +-- .../end2end/fixtures/http_proxy_fixture.cc | 8 ++-- test/core/end2end/fixtures/proxy.cc | 6 +-- test/core/end2end/fuzzers/BUILD | 2 + test/core/end2end/fuzzers/fuzzing_common.cc | 3 +- test/core/end2end/fuzzers/network_input.cc | 4 +- test/core/end2end/goaway_server_test.cc | 7 ++- test/core/end2end/grpc_core_end2end_test.bzl | 3 ++ test/core/end2end/h2_ssl_cert_test.cc | 6 +-- .../end2end/invalid_call_argument_test.cc | 44 +++++++++---------- test/core/end2end/no_server_test.cc | 6 +-- test/core/end2end/tests/call_creds.cc | 14 +++--- .../core/end2end/tests/disappearing_server.cc | 6 +-- test/core/end2end/tests/filter_context.cc | 8 ++-- .../end2end/tests/resource_quota_server.cc | 12 ++--- test/core/end2end/tests/server_streaming.cc | 4 +- .../end2end/tests/simple_delayed_request.cc | 8 ++-- test/core/end2end/tests/simple_request.cc | 4 +- .../tests/timeout_before_request_call.cc | 3 +- 24 files changed, 134 insertions(+), 117 deletions(-) diff --git a/test/core/end2end/BUILD b/test/core/end2end/BUILD index 08c373e425d..597fb7c0c26 100644 --- a/test/core/end2end/BUILD +++ b/test/core/end2end/BUILD @@ -28,6 +28,7 @@ grpc_cc_library( "absl/container:flat_hash_map", "absl/functional:any_invocable", "absl/log:check", + "absl/log:log", "absl/strings", "absl/strings:str_format", "absl/types:variant", @@ -64,6 +65,7 @@ grpc_cc_library( hdrs = ["fixtures/http_proxy_fixture.h"], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -96,7 +98,10 @@ grpc_cc_library( name = "proxy", srcs = ["fixtures/proxy.cc"], hdrs = ["fixtures/proxy.h"], - external_deps = ["absl/log:check"], + external_deps = [ + "absl/log:check", + "absl/log:log", + ], language = "C++", deps = [ "//:channel_arg_names", @@ -120,6 +125,7 @@ grpc_cc_library( external_deps = [ "absl/functional:any_invocable", "absl/log:check", + "absl/log:log", "absl/memory", "absl/meta:type_traits", "absl/random", @@ -500,7 +506,10 @@ grpc_core_end2end_test(name = "write_buffering_at_end") grpc_cc_test( name = "bad_server_response_test", srcs = ["bad_server_response_test.cc"], - external_deps = ["absl/log:check"], + external_deps = [ + "absl/log:check", + "absl/log:log", + ], language = "C++", deps = [ "cq_verifier", @@ -523,7 +532,10 @@ grpc_cc_test( grpc_cc_test( name = "connection_refused_test", srcs = ["connection_refused_test.cc"], - external_deps = ["absl/log:check"], + external_deps = [ + "absl/log:check", + "absl/log:log", + ], language = "C++", deps = [ "cq_verifier", @@ -541,6 +553,7 @@ grpc_cc_test( srcs = ["dualstack_socket_test.cc"], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status:statusor", "absl/strings", "absl/strings:str_format", @@ -565,6 +578,7 @@ grpc_cc_test( srcs = ["goaway_server_test.cc"], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -596,7 +610,10 @@ grpc_cc_test( grpc_cc_test( name = "invalid_call_argument_test", srcs = ["invalid_call_argument_test.cc"], - external_deps = ["absl/log:check"], + external_deps = [ + "absl/log:check", + "absl/log:log", + ], language = "C++", deps = [ "cq_verifier", @@ -623,6 +640,7 @@ grpc_cc_test( srcs = ["no_server_test.cc"], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/time", @@ -652,6 +670,7 @@ grpc_cc_test( external_deps = [ "absl/functional:any_invocable", "absl/log:check", + "absl/log:log", "absl/memory", "absl/meta:type_traits", "absl/strings", diff --git a/test/core/end2end/bad_server_response_test.cc b/test/core/end2end/bad_server_response_test.cc index eb9b0c09a2f..b2c38dba64a 100644 --- a/test/core/end2end/bad_server_response_test.cc +++ b/test/core/end2end/bad_server_response_test.cc @@ -25,6 +25,7 @@ #include #include "absl/log/check.h" +#include "absl/log/log.h" #include #include @@ -35,7 +36,6 @@ #include #include #include -#include #include #include @@ -135,8 +135,7 @@ static void handle_write() { static void handle_read(void* /*arg*/, grpc_error_handle error) { if (!error.ok()) { - gpr_log(GPR_ERROR, "handle_read error: %s", - grpc_core::StatusToString(error).c_str()); + LOG(ERROR) << "handle_read error: " << grpc_core::StatusToString(error); return; } state.incoming_data_length += state.temp_incoming_buffer.length; @@ -145,15 +144,13 @@ static void handle_read(void* /*arg*/, grpc_error_handle error) { for (i = 0; i < state.temp_incoming_buffer.count; i++) { char* dump = grpc_dump_slice(state.temp_incoming_buffer.slices[i], GPR_DUMP_HEX | GPR_DUMP_ASCII); - gpr_log(GPR_DEBUG, "Server received: %s", dump); + VLOG(2) << "Server received: " << dump; gpr_free(dump); } - gpr_log(GPR_DEBUG, - "got %" PRIuPTR " bytes, expected %" PRIuPTR - " bytes or a non-HTTP2 response to be sent", - state.incoming_data_length, - SERVER_INCOMING_DATA_LENGTH_LOWER_THRESHOLD); + VLOG(2) << "got " << state.incoming_data_length << " bytes, expected " + << SERVER_INCOMING_DATA_LENGTH_LOWER_THRESHOLD + << " bytes or a non-HTTP2 response to be sent"; if (state.incoming_data_length >= SERVER_INCOMING_DATA_LENGTH_LOWER_THRESHOLD || !state.http2_response) { @@ -299,8 +296,8 @@ static void actually_poll_server(void* arg) { bool done = gpr_atm_acq_load(&state.done_atm) != 0; gpr_timespec time_left = gpr_time_sub(deadline, gpr_now(GPR_CLOCK_REALTIME)); - gpr_log(GPR_DEBUG, "done=%d, time_left=%" PRId64 ".%09d", done, - time_left.tv_sec, time_left.tv_nsec); + VLOG(2) << "done=" << done << ", time_left=" << time_left.tv_sec << "." + << time_left.tv_nsec; if (done || gpr_time_cmp(time_left, gpr_time_0(GPR_TIMESPAN)) < 0) { break; } diff --git a/test/core/end2end/connection_refused_test.cc b/test/core/end2end/connection_refused_test.cc index 055e115a286..1e3414b8875 100644 --- a/test/core/end2end/connection_refused_test.cc +++ b/test/core/end2end/connection_refused_test.cc @@ -21,6 +21,7 @@ #include #include "absl/log/check.h" +#include "absl/log/log.h" #include #include @@ -29,7 +30,6 @@ #include #include #include -#include #include #include "src/core/lib/channel/channel_args.h" @@ -49,8 +49,8 @@ static void run_test(bool wait_for_ready, bool use_service_config) { grpc_status_code status; grpc_slice details; - gpr_log(GPR_INFO, "TEST: wait_for_ready=%d use_service_config=%d", - wait_for_ready, use_service_config); + LOG(INFO) << "TEST: wait_for_ready=" << wait_for_ready + << " use_service_config=" << use_service_config; grpc_init(); @@ -81,7 +81,7 @@ static void run_test(bool wait_for_ready, bool use_service_config) { // create a call, channel to a port which will refuse connection int port = grpc_pick_unused_port_or_die(); std::string addr = grpc_core::JoinHostPort("127.0.0.1", port); - gpr_log(GPR_INFO, "server: %s", addr.c_str()); + LOG(INFO) << "server: " << addr; grpc_channel_credentials* creds = grpc_insecure_credentials_create(); chan = grpc_channel_create(addr.c_str(), creds, args); grpc_channel_credentials_release(creds); diff --git a/test/core/end2end/cq_verifier.cc b/test/core/end2end/cq_verifier.cc index c318f7fa301..c0bc5b66f97 100644 --- a/test/core/end2end/cq_verifier.cc +++ b/test/core/end2end/cq_verifier.cc @@ -29,6 +29,7 @@ #include #include "absl/log/check.h" +#include "absl/log/log.h" #include "absl/strings/escaping.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" @@ -41,7 +42,6 @@ #include #include #include -#include #include #include "src/core/lib/compression/message_compress.h" @@ -126,9 +126,8 @@ int raw_byte_buffer_eq_slice(grpc_byte_buffer* rbb, grpc_slice b) { 0 == memcmp(GRPC_SLICE_START_PTR(a), GRPC_SLICE_START_PTR(b), GRPC_SLICE_LENGTH(a)); if (!ok) { - gpr_log(GPR_ERROR, - "SLICE MISMATCH: left_length=%" PRIuPTR " right_length=%" PRIuPTR, - GRPC_SLICE_LENGTH(a), GRPC_SLICE_LENGTH(b)); + LOG(ERROR) << "SLICE MISMATCH: left_length=" << GRPC_SLICE_LENGTH(a) + << " right_length=" << GRPC_SLICE_LENGTH(b); std::string out; const char* a_str = reinterpret_cast(GRPC_SLICE_START_PTR(a)); const char* b_str = reinterpret_cast(GRPC_SLICE_START_PTR(b)); @@ -151,7 +150,7 @@ int raw_byte_buffer_eq_slice(grpc_byte_buffer* rbb, grpc_slice b) { absl::CEscape(absl::string_view(&b_str[i], 1)), "\u001b[0m"); } - gpr_log(GPR_ERROR, "%s", out.c_str()); + LOG(ERROR) << out; } } grpc_slice_unref(a); @@ -365,8 +364,7 @@ void CqVerifier::Verify(Duration timeout, SourceLocation location) { while (!expectations_.empty()) { must_log = std::exchange(added_expectations_, false) || must_log; if (log_verifications_ && must_log) { - gpr_log(GPR_ERROR, "Verify %s for %s", ToShortString().c_str(), - timeout.ToString().c_str()); + LOG(ERROR) << "Verify " << ToShortString() << " for " << timeout; } must_log = false; grpc_event ev = Step(deadline); @@ -423,8 +421,7 @@ bool CqVerifier::AllMaybes() const { void CqVerifier::VerifyEmpty(Duration timeout, SourceLocation location) { if (log_verifications_) { - gpr_log(GPR_ERROR, "Verify empty completion queue for %s", - timeout.ToString().c_str()); + LOG(ERROR) << "Verify empty completion queue for " << timeout; } const gpr_timespec deadline = gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), timeout.as_timespec()); diff --git a/test/core/end2end/dualstack_socket_test.cc b/test/core/end2end/dualstack_socket_test.cc index bf793e97bec..33ab2091c1b 100644 --- a/test/core/end2end/dualstack_socket_test.cc +++ b/test/core/end2end/dualstack_socket_test.cc @@ -21,6 +21,7 @@ #include #include "absl/log/check.h" +#include "absl/log/log.h" #include "absl/status/statusor.h" #include @@ -47,7 +48,6 @@ #include #include #include -#include #include "src/core/lib/address_utils/sockaddr_utils.h" #include "src/core/lib/gprpp/host_port.h" @@ -78,7 +78,7 @@ static void log_resolved_addrs(const char* label, const char* hostname) { return; } for (const auto& addr : *addresses_or) { - gpr_log(GPR_INFO, "%s: %s", label, grpc_sockaddr_to_uri(&addr)->c_str()); + LOG(INFO) << label << ": " << grpc_sockaddr_to_uri(&addr)->c_str(); } } @@ -152,9 +152,9 @@ void test_connect(const char* server_host, const char* client_host, int port, client = grpc_channel_create(client_hostport.c_str(), creds, nullptr); grpc_channel_credentials_release(creds); - gpr_log(GPR_INFO, "Testing with server=%s client=%s (expecting %s)", - server_hostport.c_str(), client_hostport.c_str(), - expect_ok ? "success" : "failure"); + LOG(INFO) << "Testing with server=" << server_hostport.c_str() + << " client=" << client_hostport.c_str() << " (expecting " + << (expect_ok ? "success" : "failure") << ")"; log_resolved_addrs("server resolved addr", server_host); log_resolved_addrs("client resolved addr", client_host); @@ -236,7 +236,7 @@ void test_connect(const char* server_host, const char* client_host, int port, cqv.Verify(); peer = grpc_call_get_peer(c); - gpr_log(GPR_DEBUG, "got peer: '%s'", peer); + VLOG(2) << "got peer: '" << peer << "'"; gpr_free(peer); CHECK_EQ(status, GRPC_STATUS_UNIMPLEMENTED); @@ -251,8 +251,8 @@ void test_connect(const char* server_host, const char* client_host, int port, cqv.Expect(grpc_core::CqVerifier::tag(1), true); cqv.Verify(); - gpr_log(GPR_INFO, "status: %d (expected: %d)", status, - GRPC_STATUS_UNAVAILABLE); + LOG(INFO) << "status: " << status + << " (expected: " << GRPC_STATUS_UNAVAILABLE << ")"; CHECK_EQ(status, GRPC_STATUS_UNAVAILABLE); } @@ -301,10 +301,9 @@ int external_dns_works(const char* host) { // dualstack_socket_test from functioning correctly). See b/201064791. if (grpc_sockaddr_to_uri(&addr).value() == "ipv6:%5B64:ff9b::7f00:1%5D:80") { - gpr_log( - GPR_INFO, - "Detected DNS64 server response. Tests that depend on " - "*.unittest.grpc.io. will be skipped as they won't work with DNS64."); + LOG(INFO) << "Detected DNS64 server response. Tests that depend on " + "*.unittest.grpc.io. will be skipped as they won't work " + "with DNS64."; result = 0; break; } @@ -319,7 +318,7 @@ int main(int argc, char** argv) { grpc_init(); if (!grpc_ipv6_loopback_available()) { - gpr_log(GPR_INFO, "Can't bind to ::1. Skipping IPv6 tests."); + LOG(INFO) << "Can't bind to ::1. Skipping IPv6 tests."; do_ipv6 = 0; } @@ -360,7 +359,7 @@ int main(int argc, char** argv) { if (!external_dns_works("loopback4.unittest.grpc.io") || !external_dns_works("loopback46.unittest.grpc.io")) { - gpr_log(GPR_INFO, "Skipping tests that depend on *.unittest.grpc.io."); + LOG(INFO) << "Skipping tests that depend on *.unittest.grpc.io."; } else { test_connect("loopback46.unittest.grpc.io", "loopback4.unittest.grpc.io", 0, 1); diff --git a/test/core/end2end/end2end_tests.cc b/test/core/end2end/end2end_tests.cc index 30615b1698a..51505c91fd5 100644 --- a/test/core/end2end/end2end_tests.cc +++ b/test/core/end2end/end2end_tests.cc @@ -23,6 +23,7 @@ #include #include "absl/log/check.h" +#include "absl/log/log.h" #include "absl/memory/memory.h" #include "absl/random/random.h" @@ -117,7 +118,7 @@ void CoreEnd2endTest::TearDown() { // This will wait until gRPC shutdown has actually happened to make sure // no gRPC resources (such as thread) are active. (timeout = 10s) if (!grpc_wait_until_shutdown(10)) { - gpr_log(GPR_ERROR, "Timeout in waiting for gRPC shutdown"); + LOG(ERROR) << "Timeout in waiting for gRPC shutdown"; } } CHECK_EQ(client_, nullptr); @@ -153,8 +154,8 @@ std::string CoreEnd2endTest::IncomingMessage::payload() const { grpc_slice_buffer decompressed_buffer; grpc_slice_buffer_init(&decompressed_buffer); CHECK(grpc_msg_decompress(payload_->data.raw.compression, - &payload_->data.raw.slice_buffer, - &decompressed_buffer)); + &payload_->data.raw.slice_buffer, + &decompressed_buffer)); grpc_byte_buffer* rbb = grpc_raw_byte_buffer_create( decompressed_buffer.slices, decompressed_buffer.count); grpc_byte_buffer_reader reader; diff --git a/test/core/end2end/fixtures/http_proxy_fixture.cc b/test/core/end2end/fixtures/http_proxy_fixture.cc index be2ec412014..3eca777e098 100644 --- a/test/core/end2end/fixtures/http_proxy_fixture.cc +++ b/test/core/end2end/fixtures/http_proxy_fixture.cc @@ -27,6 +27,7 @@ #include #include "absl/log/check.h" +#include "absl/log/log.h" #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/escaping.h" @@ -37,7 +38,6 @@ #include #include #include -#include #include #include "src/core/lib/address_utils/sockaddr_utils.h" @@ -510,8 +510,8 @@ static bool proxy_auth_header_matches(absl::string_view proxy_auth_header_val, // which will cause the client connection to be dropped. static void on_read_request_done_locked(void* arg, grpc_error_handle error) { proxy_connection* conn = static_cast(arg); - gpr_log(GPR_DEBUG, "on_read_request_done: %p %s", conn, - grpc_core::StatusToString(error).c_str()); + VLOG(2) << "on_read_request_done: " << conn << " " + << grpc_core::StatusToString(error); if (!error.ok()) { proxy_connection_failed(conn, SETUP_FAILED, "HTTP proxy read request", error); @@ -670,7 +670,7 @@ grpc_end2end_http_proxy* grpc_end2end_http_proxy_create( // Construct proxy address. const int proxy_port = grpc_pick_unused_port_or_die(); proxy->proxy_name = grpc_core::JoinHostPort("localhost", proxy_port); - gpr_log(GPR_INFO, "Proxy address: %s", proxy->proxy_name.c_str()); + LOG(INFO) << "Proxy address: " << proxy->proxy_name; // Create TCP server. auto channel_args = grpc_core::CoreConfiguration::Get() .channel_args_preconditioning() diff --git a/test/core/end2end/fixtures/proxy.cc b/test/core/end2end/fixtures/proxy.cc index cb1a2e04cb2..febdb809838 100644 --- a/test/core/end2end/fixtures/proxy.cc +++ b/test/core/end2end/fixtures/proxy.cc @@ -24,6 +24,7 @@ #include #include "absl/log/check.h" +#include "absl/log/log.h" #include #include @@ -31,7 +32,6 @@ #include #include #include -#include #include #include @@ -106,8 +106,8 @@ grpc_end2end_proxy* grpc_end2end_proxy_create( proxy->proxy_port = grpc_core::JoinHostPort("localhost", proxy_port); proxy->server_port = grpc_core::JoinHostPort("localhost", server_port); - gpr_log(GPR_DEBUG, "PROXY ADDR:%s BACKEND:%s", proxy->proxy_port.c_str(), - proxy->server_port.c_str()); + VLOG(2) << "PROXY ADDR:" << proxy->proxy_port + << " BACKEND:" << proxy->server_port; proxy->cq = grpc_completion_queue_create_for_next(nullptr); proxy->server = def->create_server(proxy->proxy_port.c_str(), server_args); diff --git a/test/core/end2end/fuzzers/BUILD b/test/core/end2end/fuzzers/BUILD index 35f52f6be3b..c3a1f0245c9 100644 --- a/test/core/end2end/fuzzers/BUILD +++ b/test/core/end2end/fuzzers/BUILD @@ -36,6 +36,7 @@ grpc_cc_library( hdrs = ["fuzzing_common.h"], external_deps = [ "absl/log:check", + "absl/log:log", "absl/strings", ], deps = [ @@ -92,6 +93,7 @@ grpc_cc_library( name = "network_input", srcs = ["network_input.cc"], hdrs = ["network_input.h"], + external_deps = ["absl/log:log"], deps = [ "fuzzer_input_proto", "//:chttp2_frame", diff --git a/test/core/end2end/fuzzers/fuzzing_common.cc b/test/core/end2end/fuzzers/fuzzing_common.cc index 4a20a7870fe..2597694bf3b 100644 --- a/test/core/end2end/fuzzers/fuzzing_common.cc +++ b/test/core/end2end/fuzzers/fuzzing_common.cc @@ -24,6 +24,7 @@ #include #include "absl/log/check.h" +#include "absl/log/log.h" #include "absl/strings/str_cat.h" #include "absl/types/optional.h" @@ -638,7 +639,7 @@ bool BasicFuzzer::Continue() { BasicFuzzer::Result BasicFuzzer::ExecuteAction( const api_fuzzer::Action& action) { - gpr_log(GPR_DEBUG, "EXECUTE_ACTION: %s", action.DebugString().c_str()); + VLOG(2) << "EXECUTE_ACTION: " << action.DebugString(); switch (action.type_case()) { case api_fuzzer::Action::TYPE_NOT_SET: return BasicFuzzer::Result::kFailed; diff --git a/test/core/end2end/fuzzers/network_input.cc b/test/core/end2end/fuzzers/network_input.cc index 855d3185678..278fd0ffc69 100644 --- a/test/core/end2end/fuzzers/network_input.cc +++ b/test/core/end2end/fuzzers/network_input.cc @@ -23,6 +23,7 @@ #include #include +#include "absl/log/log.h" #include "absl/strings/string_view.h" #include "absl/types/span.h" @@ -520,8 +521,7 @@ Duration ScheduleConnection( endpoint) mutable { ExecCtx exec_ctx; if (!endpoint.ok()) { - gpr_log(GPR_ERROR, "Failed to connect: %s", - endpoint.status().ToString().c_str()); + LOG(ERROR) << "Failed to connect: " << endpoint.status(); return; } std::shared_ptr ep = diff --git a/test/core/end2end/goaway_server_test.cc b/test/core/end2end/goaway_server_test.cc index 3efd3939364..edf58074223 100644 --- a/test/core/end2end/goaway_server_test.cc +++ b/test/core/end2end/goaway_server_test.cc @@ -27,6 +27,7 @@ #include #include "absl/log/check.h" +#include "absl/log/log.h" #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/str_cat.h" @@ -40,7 +41,6 @@ #include #include #include -#include #include #include @@ -212,9 +212,8 @@ static void my_cancel_ares_request(grpc_ares_request* request) { int main(int argc, char** argv) { // TODO(yijiem): rewrite this test with a custom EventEngine DNS Resolver if (grpc_core::IsEventEngineDnsEnabled()) { - gpr_log( - GPR_ERROR, - "Skipping iomgr-specific DNS test because EventEngine DNS is enabled"); + LOG(ERROR) << "Skipping iomgr-specific DNS test because EventEngine DNS is " + "enabled"; return 0; } grpc_completion_queue* cq; diff --git a/test/core/end2end/grpc_core_end2end_test.bzl b/test/core/end2end/grpc_core_end2end_test.bzl index 78733efcf2b..8b75ae6aac8 100644 --- a/test/core/end2end/grpc_core_end2end_test.bzl +++ b/test/core/end2end/grpc_core_end2end_test.bzl @@ -43,6 +43,9 @@ def grpc_core_end2end_test(name, shard_count = 10, tags = []): srcs = [ "tests/%s.cc" % name, ], + external_deps = [ + "absl/log:log", + ], deps = [ "cq_verifier", "end2end_test_lib", diff --git a/test/core/end2end/h2_ssl_cert_test.cc b/test/core/end2end/h2_ssl_cert_test.cc index d24c6956235..3d1470194ec 100644 --- a/test/core/end2end/h2_ssl_cert_test.cc +++ b/test/core/end2end/h2_ssl_cert_test.cc @@ -25,6 +25,7 @@ #include "absl/functional/any_invocable.h" #include "absl/log/check.h" +#include "absl/log/log.h" #include "absl/types/optional.h" #include "gtest/gtest.h" @@ -37,7 +38,6 @@ #include #include #include -#include #include #include "src/core/lib/channel/channel_args.h" @@ -245,9 +245,7 @@ static void simple_request_body(grpc_core::CoreTestFixture* f, class H2SslCertTest : public ::testing::TestWithParam { protected: - H2SslCertTest() { - gpr_log(GPR_INFO, "SSL_CERT_tests/%s", GetParam().config.name); - } + H2SslCertTest() { LOG(INFO) << "SSL_CERT_tests/" << GetParam().config.name; } void SetUp() override { fixture_ = GetParam().config.create_fixture(grpc_core::ChannelArgs(), grpc_core::ChannelArgs()); diff --git a/test/core/end2end/invalid_call_argument_test.cc b/test/core/end2end/invalid_call_argument_test.cc index a297eb61a3b..1f086c3f98a 100644 --- a/test/core/end2end/invalid_call_argument_test.cc +++ b/test/core/end2end/invalid_call_argument_test.cc @@ -24,6 +24,7 @@ #include #include "absl/log/check.h" +#include "absl/log/log.h" #include #include @@ -32,7 +33,6 @@ #include #include #include -#include #include #include @@ -155,7 +155,7 @@ static void cleanup_test() { } static void test_non_null_reserved_on_start_batch() { - gpr_log(GPR_INFO, "test_non_null_reserved_on_start_batch"); + LOG(INFO) << "test_non_null_reserved_on_start_batch"; prepare_test(1); CHECK(GRPC_CALL_ERROR == @@ -165,7 +165,7 @@ static void test_non_null_reserved_on_start_batch() { } static void test_non_null_reserved_on_op() { - gpr_log(GPR_INFO, "test_non_null_reserved_on_op"); + LOG(INFO) << "test_non_null_reserved_on_op"; grpc_op* op; prepare_test(1); @@ -184,7 +184,7 @@ static void test_non_null_reserved_on_op() { } static void test_send_initial_metadata_more_than_once() { - gpr_log(GPR_INFO, "test_send_initial_metadata_more_than_once"); + LOG(INFO) << "test_send_initial_metadata_more_than_once"; grpc_op* op; prepare_test(1); @@ -216,7 +216,7 @@ static void test_send_initial_metadata_more_than_once() { } static void test_too_many_metadata() { - gpr_log(GPR_INFO, "test_too_many_metadata"); + LOG(INFO) << "test_too_many_metadata"; grpc_op* op; prepare_test(1); @@ -235,7 +235,7 @@ static void test_too_many_metadata() { } static void test_send_null_message() { - gpr_log(GPR_INFO, "test_send_null_message"); + LOG(INFO) << "test_send_null_message"; grpc_op* op; prepare_test(1); @@ -259,7 +259,7 @@ static void test_send_null_message() { } static void test_send_messages_at_the_same_time() { - gpr_log(GPR_INFO, "test_send_messages_at_the_same_time"); + LOG(INFO) << "test_send_messages_at_the_same_time"; grpc_op* op; grpc_slice request_payload_slice = @@ -293,7 +293,7 @@ static void test_send_messages_at_the_same_time() { } static void test_send_server_status_from_client() { - gpr_log(GPR_INFO, "test_send_server_status_from_client"); + LOG(INFO) << "test_send_server_status_from_client"; grpc_op* op; prepare_test(1); @@ -315,7 +315,7 @@ static void test_send_server_status_from_client() { } static void test_receive_initial_metadata_twice_at_client() { - gpr_log(GPR_INFO, "test_receive_initial_metadata_twice_at_client"); + LOG(INFO) << "test_receive_initial_metadata_twice_at_client"; grpc_op* op; prepare_test(1); @@ -347,7 +347,7 @@ static void test_receive_initial_metadata_twice_at_client() { } static void test_receive_message_with_invalid_flags() { - gpr_log(GPR_INFO, "test_receive_message_with_invalid_flags"); + LOG(INFO) << "test_receive_message_with_invalid_flags"; grpc_op* op; grpc_byte_buffer* payload = nullptr; @@ -366,7 +366,7 @@ static void test_receive_message_with_invalid_flags() { } static void test_receive_two_messages_at_the_same_time() { - gpr_log(GPR_INFO, "test_receive_two_messages_at_the_same_time"); + LOG(INFO) << "test_receive_two_messages_at_the_same_time"; grpc_op* op; grpc_byte_buffer* payload = nullptr; @@ -390,7 +390,7 @@ static void test_receive_two_messages_at_the_same_time() { } static void test_recv_close_on_server_from_client() { - gpr_log(GPR_INFO, "test_recv_close_on_server_from_client"); + LOG(INFO) << "test_recv_close_on_server_from_client"; grpc_op* op; prepare_test(1); @@ -409,7 +409,7 @@ static void test_recv_close_on_server_from_client() { } static void test_recv_status_on_client_twice() { - gpr_log(GPR_INFO, "test_recv_status_on_client_twice"); + LOG(INFO) << "test_recv_status_on_client_twice"; grpc_op* op; prepare_test(1); @@ -446,7 +446,7 @@ static void test_recv_status_on_client_twice() { } static void test_send_close_from_client_on_server() { - gpr_log(GPR_INFO, "test_send_close_from_client_on_server"); + LOG(INFO) << "test_send_close_from_client_on_server"; grpc_op* op; prepare_test(0); @@ -464,7 +464,7 @@ static void test_send_close_from_client_on_server() { } static void test_recv_status_on_client_from_server() { - gpr_log(GPR_INFO, "test_recv_status_on_client_from_server"); + LOG(INFO) << "test_recv_status_on_client_from_server"; grpc_op* op; prepare_test(0); @@ -486,7 +486,7 @@ static void test_recv_status_on_client_from_server() { } static void test_send_status_from_server_with_invalid_flags() { - gpr_log(GPR_INFO, "test_send_status_from_server_with_invalid_flags"); + LOG(INFO) << "test_send_status_from_server_with_invalid_flags"; grpc_op* op; prepare_test(0); @@ -508,7 +508,7 @@ static void test_send_status_from_server_with_invalid_flags() { } static void test_too_many_trailing_metadata() { - gpr_log(GPR_INFO, "test_too_many_trailing_metadata"); + LOG(INFO) << "test_too_many_trailing_metadata"; grpc_op* op; prepare_test(0); @@ -531,7 +531,7 @@ static void test_too_many_trailing_metadata() { } static void test_send_server_status_twice() { - gpr_log(GPR_INFO, "test_send_server_status_twice"); + LOG(INFO) << "test_send_server_status_twice"; grpc_op* op; prepare_test(0); @@ -560,7 +560,7 @@ static void test_send_server_status_twice() { } static void test_recv_close_on_server_with_invalid_flags() { - gpr_log(GPR_INFO, "test_recv_close_on_server_with_invalid_flags"); + LOG(INFO) << "test_recv_close_on_server_with_invalid_flags"; grpc_op* op; prepare_test(0); @@ -579,7 +579,7 @@ static void test_recv_close_on_server_with_invalid_flags() { } static void test_recv_close_on_server_twice() { - gpr_log(GPR_INFO, "test_recv_close_on_server_twice"); + LOG(INFO) << "test_recv_close_on_server_twice"; grpc_op* op; prepare_test(0); @@ -603,7 +603,7 @@ static void test_recv_close_on_server_twice() { } static void test_invalid_initial_metadata_reserved_key() { - gpr_log(GPR_INFO, "test_invalid_initial_metadata_reserved_key"); + LOG(INFO) << "test_invalid_initial_metadata_reserved_key"; grpc_metadata metadata; metadata.key = grpc_slice_from_static_string(":start_with_colon"); @@ -626,7 +626,7 @@ static void test_invalid_initial_metadata_reserved_key() { } static void test_multiple_ops_in_a_single_batch() { - gpr_log(GPR_INFO, "test_multiple_ops_in_a_single_batch"); + LOG(INFO) << "test_multiple_ops_in_a_single_batch"; grpc_op* op; prepare_test(1); diff --git a/test/core/end2end/no_server_test.cc b/test/core/end2end/no_server_test.cc index dc3db4b37bf..4b14f0a1a72 100644 --- a/test/core/end2end/no_server_test.cc +++ b/test/core/end2end/no_server_test.cc @@ -21,6 +21,7 @@ #include #include "absl/log/check.h" +#include "absl/log/log.h" #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/time/time.h" @@ -31,7 +32,6 @@ #include #include #include -#include #include #include "src/core/lib/channel/channel_args.h" @@ -45,7 +45,7 @@ #include "test/core/test_util/test_config.h" void run_test(bool wait_for_ready) { - gpr_log(GPR_INFO, "TEST: wait_for_ready=%d", wait_for_ready); + LOG(INFO) << "TEST: wait_for_ready=" << wait_for_ready; grpc_init(); @@ -104,7 +104,7 @@ void run_test(bool wait_for_ready) { cqv.Expect(grpc_core::CqVerifier::tag(1), true); cqv.Verify(); - gpr_log(GPR_INFO, "call status: %d", status); + LOG(INFO) << "call status: " << status; if (wait_for_ready) { CHECK_EQ(status, GRPC_STATUS_DEADLINE_EXCEEDED); } else { diff --git a/test/core/end2end/tests/call_creds.cc b/test/core/end2end/tests/call_creds.cc index ce6b949085f..2b078a1152d 100644 --- a/test/core/end2end/tests/call_creds.cc +++ b/test/core/end2end/tests/call_creds.cc @@ -18,6 +18,7 @@ #include +#include "absl/log/log.h" #include "absl/types/optional.h" #include "gtest/gtest.h" @@ -25,7 +26,6 @@ #include #include #include -#include #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gprpp/time.h" @@ -47,17 +47,17 @@ const char overridden_fake_md_value[] = "overridden_fake_value"; void PrintAuthContext(bool is_client, const grpc_auth_context* ctx) { const grpc_auth_property* p; grpc_auth_property_iterator it; - gpr_log(GPR_INFO, "%s peer:", is_client ? "client" : "server"); - gpr_log(GPR_INFO, "\tauthenticated: %s", - grpc_auth_context_peer_is_authenticated(ctx) ? "YES" : "NO"); + LOG(INFO) << (is_client ? "client" : "server") << " peer:"; + LOG(INFO) << "\tauthenticated: " + << (grpc_auth_context_peer_is_authenticated(ctx) ? "YES" : "NO"); it = grpc_auth_context_peer_identity(ctx); while ((p = grpc_auth_property_iterator_next(&it)) != nullptr) { - gpr_log(GPR_INFO, "\t\t%s: %s", p->name, p->value); + LOG(INFO) << "\t\t" << p->name << ": " << p->value; } - gpr_log(GPR_INFO, "\tall properties:"); + LOG(INFO) << "\tall properties:"; it = grpc_auth_context_property_iterator(ctx); while ((p = grpc_auth_property_iterator_next(&it)) != nullptr) { - gpr_log(GPR_INFO, "\t\t%s: %s", p->name, p->value); + LOG(INFO) << "\t\t" << p->name << ": " << p->value; } } diff --git a/test/core/end2end/tests/disappearing_server.cc b/test/core/end2end/tests/disappearing_server.cc index 81cea5a5ad2..5b65e20eb57 100644 --- a/test/core/end2end/tests/disappearing_server.cc +++ b/test/core/end2end/tests/disappearing_server.cc @@ -18,10 +18,10 @@ #include +#include "absl/log/log.h" #include "gtest/gtest.h" #include -#include #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gprpp/time.h" @@ -31,13 +31,13 @@ namespace grpc_core { static void OneRequestAndShutdownServer(CoreEnd2endTest& test) { - gpr_log(GPR_ERROR, "Create client side call"); + LOG(ERROR) << "Create client side call"; auto c = test.NewClientCall("/service/method") .Timeout(Duration::Seconds(30)) .Create(); CoreEnd2endTest::IncomingMetadata server_initial_md; CoreEnd2endTest::IncomingStatusOnClient server_status; - gpr_log(GPR_ERROR, "Start initial batch"); + LOG(ERROR) << "Start initial batch"; c.NewBatch(1) .SendInitialMetadata({}) .SendCloseFromClient() diff --git a/test/core/end2end/tests/filter_context.cc b/test/core/end2end/tests/filter_context.cc index b3e2759ef1f..789a05d94d7 100644 --- a/test/core/end2end/tests/filter_context.cc +++ b/test/core/end2end/tests/filter_context.cc @@ -20,11 +20,11 @@ #include #include "absl/log/check.h" +#include "absl/log/log.h" #include "absl/status/status.h" #include "gtest/gtest.h" #include -#include #include "src/core/lib/channel/channel_fwd.h" #include "src/core/lib/channel/channel_stack.h" @@ -53,7 +53,7 @@ grpc_error_handle init_call_elem(grpc_call_element* elem, const grpc_call_element_args* args) { call_data* calld = static_cast(elem->call_data); calld->context = args->context; - gpr_log(GPR_INFO, "init_call_elem(): context=%p", args->context); + LOG(INFO) << "init_call_elem(): context=" << args->context; return absl::OkStatus(); } @@ -63,8 +63,8 @@ void start_transport_stream_op_batch(grpc_call_element* elem, // If batch payload context is not null (which will happen in some // cancellation cases), make sure we get the same context here that we // saw in init_call_elem(). - gpr_log(GPR_INFO, "start_transport_stream_op_batch(): context=%p", - batch->payload->context); + LOG(INFO) << "start_transport_stream_op_batch(): context=" + << batch->payload->context; if (batch->payload->context != nullptr) { CHECK(calld->context == batch->payload->context); } diff --git a/test/core/end2end/tests/resource_quota_server.cc b/test/core/end2end/tests/resource_quota_server.cc index acf4c109089..0bc7a69e034 100644 --- a/test/core/end2end/tests/resource_quota_server.cc +++ b/test/core/end2end/tests/resource_quota_server.cc @@ -21,13 +21,13 @@ #include #include +#include "absl/log/log.h" #include "absl/strings/str_format.h" #include "gtest/gtest.h" #include #include #include -#include #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/experiments/experiments.h" @@ -146,11 +146,11 @@ CORE_END2END_TEST(ResourceQuotaTest, ResourceQuota) { cancelled_calls_on_server++; } } - gpr_log(GPR_INFO, - "Done. %d total calls: %d cancelled at server, %d cancelled at " - "client, %d timed out, %d unavailable.", - kNumCalls, cancelled_calls_on_server, cancelled_calls_on_client, - deadline_exceeded, unavailable); + LOG(INFO) << "Done. " << kNumCalls + << " total calls: " << cancelled_calls_on_server + << " cancelled at server, " << cancelled_calls_on_client + << " cancelled at client, " << deadline_exceeded << " timed out, " + << unavailable << " unavailable."; ShutdownServerAndNotify(0); Expect(0, PerformAction{[this](bool success) { diff --git a/test/core/end2end/tests/server_streaming.cc b/test/core/end2end/tests/server_streaming.cc index 76cd2ae7382..b6fd6f30511 100644 --- a/test/core/end2end/tests/server_streaming.cc +++ b/test/core/end2end/tests/server_streaming.cc @@ -19,10 +19,10 @@ #include #include "absl/log/check.h" +#include "absl/log/log.h" #include "gtest/gtest.h" #include -#include #include "src/core/lib/gprpp/time.h" #include "test/core/end2end/cq_verifier.h" @@ -70,7 +70,7 @@ void ServerStreaming(CoreEnd2endTest& test, int num_messages) { test.Expect(104, true); test.Step(); - gpr_log(GPR_DEBUG, "SEEN_STATUS:%d", seen_status); + VLOG(2) << "SEEN_STATUS:" << seen_status; // Client keeps reading messages till it gets the status int num_messages_received = 0; diff --git a/test/core/end2end/tests/simple_delayed_request.cc b/test/core/end2end/tests/simple_delayed_request.cc index e22ea978335..bbdfe4ab790 100644 --- a/test/core/end2end/tests/simple_delayed_request.cc +++ b/test/core/end2end/tests/simple_delayed_request.cc @@ -18,12 +18,12 @@ #include +#include "absl/log/log.h" #include "gtest/gtest.h" #include #include #include -#include #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gprpp/time.h" @@ -37,17 +37,17 @@ CORE_END2END_TEST(Http2SingleHopTest, SimpleDelayedRequestShort) { .Set(GRPC_ARG_INITIAL_RECONNECT_BACKOFF_MS, 1000) .Set(GRPC_ARG_MAX_RECONNECT_BACKOFF_MS, 1000) .Set(GRPC_ARG_MIN_RECONNECT_BACKOFF_MS, 5000)); - gpr_log(GPR_ERROR, "Create client side call"); + LOG(ERROR) << "Create client side call"; auto c = NewClientCall("/foo").Timeout(Duration::Minutes(1)).Create(); IncomingMetadata server_initial_metadata; IncomingStatusOnClient server_status; - gpr_log(GPR_ERROR, "Start initial batch"); + LOG(ERROR) << "Start initial batch"; c.NewBatch(1) .SendInitialMetadata({}, GRPC_INITIAL_METADATA_WAIT_FOR_READY) .SendCloseFromClient() .RecvInitialMetadata(server_initial_metadata) .RecvStatusOnClient(server_status); - gpr_log(GPR_ERROR, "Start server"); + LOG(ERROR) << "Start server"; InitServer(ChannelArgs()); auto s = RequestCall(101); Expect(101, true); diff --git a/test/core/end2end/tests/simple_request.cc b/test/core/end2end/tests/simple_request.cc index 359489f6c2d..1e39734d327 100644 --- a/test/core/end2end/tests/simple_request.cc +++ b/test/core/end2end/tests/simple_request.cc @@ -22,13 +22,13 @@ #include #include +#include "absl/log/log.h" #include "absl/strings/match.h" #include "absl/types/optional.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include -#include #include "src/core/lib/debug/stats.h" #include "src/core/lib/debug/stats_data.h" @@ -91,7 +91,7 @@ void SimpleRequestBody(CoreEnd2endTest& test) { expected_calls *= 2; } auto after = global_stats().Collect(); - gpr_log(GPR_DEBUG, "%s", StatsAsJson(after.get()).c_str()); + VLOG(2) << StatsAsJson(after.get()); EXPECT_EQ(after->client_calls_created - before->client_calls_created, expected_calls); EXPECT_EQ(after->server_calls_created - before->server_calls_created, diff --git a/test/core/end2end/tests/timeout_before_request_call.cc b/test/core/end2end/tests/timeout_before_request_call.cc index 5ad6a9872a1..bb61acd648e 100644 --- a/test/core/end2end/tests/timeout_before_request_call.cc +++ b/test/core/end2end/tests/timeout_before_request_call.cc @@ -16,6 +16,7 @@ #include +#include "absl/log/log.h" #include "gtest/gtest.h" #include @@ -147,7 +148,7 @@ CORE_END2END_TEST(CoreDeadlineSingleHopTest, bool got_call = false; std::unique_ptr client_close; Expect(2, MaybePerformAction{[this, &s, &got_call, &client_close](bool ok) { - gpr_log(GPR_INFO, "\n***\n*** got call: %d\n***", ok); + LOG(INFO) << "\n***\n*** got call: " << ok << "\n***"; got_call = true; if (ok) { // If we successfully get a call, then we should additionally get a From 989268253ee500c72848645dd5233653e0a635eb Mon Sep 17 00:00:00 2001 From: Tanvi Jagtap <139093547+tanvi-jagtap@users.noreply.github.com> Date: Sat, 11 May 2024 00:53:18 -0700 Subject: [PATCH 02/10] [grpc][Gpr_To_Absl_Logging] Migrating from gpr to absl logging - gpr_log (#36580) [grpc][Gpr_To_Absl_Logging] Migrating from gpr to absl logging - gpr_log In this CL we are migrating from gRPCs own gpr logging mechanism to absl logging mechanism. The intention is to deprecate gpr_log in the future. We have the following mapping 1. gpr_log(GPR_INFO,...) -> LOG(INFO) 2. gpr_log(GPR_ERROR,...) -> LOG(ERROR) 3. gpr_log(GPR_DEBUG,...) -> VLOG(2) Reviewers need to check : 1. If the above mapping is correct. 2. The content of the log is as before. gpr_log format strings did not use string_view or std::string . absl LOG accepts these. So there will be some elimination of string_view and std::string related conversions. This is expected. `#define GPR_INFO __FILE__, __LINE__, GPR_LOG_SEVERITY_INFO` Which means passing explicit parameters to gpr_info will over-ride the file name and line number of the call site. The right replacement API for this is `LOG(INFO).AtLocation(absl::string_view file, int line) << ... ` Closes #36580 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/36580 from tanvi-jagtap:large_seq_state_tjagtap 8f6dd756c62434b13d9f0a90150934a3677c4e81 PiperOrigin-RevId: 632721079 --- src/core/lib/promise/detail/seq_state.h | 711 ++++++++++++------------ 1 file changed, 342 insertions(+), 369 deletions(-) diff --git a/src/core/lib/promise/detail/seq_state.h b/src/core/lib/promise/detail/seq_state.h index 3e69e60b741..841cd6cb042 100644 --- a/src/core/lib/promise/detail/seq_state.h +++ b/src/core/lib/promise/detail/seq_state.h @@ -23,6 +23,7 @@ #include "absl/base/attributes.h" #include "absl/log/check.h" +#include "absl/log/log.h" #include "absl/strings/str_cat.h" #include @@ -144,22 +145,21 @@ struct SeqState { switch (state) { case State::kState0: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 1/2", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 1/2"; } auto result = prior.current_promise(); PromiseResult0* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 1/2 gets %s", this, - p != nullptr - ? (PromiseResultTraits0::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits0::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 1/2 gets " + << (p != nullptr + ? (PromiseResultTraits0::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits0::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits0::IsOk(*p)) { @@ -177,14 +177,14 @@ struct SeqState { default: case State::kState1: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 2/2", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 2/2"; } auto result = current_promise(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 2/2 gets %s", this, - result.ready() ? "ready" : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 2/2 gets " + << (result.ready() ? "ready" : "pending"); } auto* p = result.value_if_ready(); if (p == nullptr) return Pending{}; @@ -287,22 +287,21 @@ struct SeqState { switch (state) { case State::kState0: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 1/3", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 1/3"; } auto result = prior.prior.current_promise(); PromiseResult0* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 1/3 gets %s", this, - p != nullptr - ? (PromiseResultTraits0::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits0::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 1/3 gets " + << (p != nullptr + ? (PromiseResultTraits0::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits0::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits0::IsOk(*p)) { @@ -319,22 +318,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState1: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 2/3", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 2/3"; } auto result = prior.current_promise(); PromiseResult1* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 2/3 gets %s", this, - p != nullptr - ? (PromiseResultTraits1::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits1::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 2/3 gets " + << (p != nullptr + ? (PromiseResultTraits1::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits1::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits1::IsOk(*p)) { @@ -352,14 +350,14 @@ struct SeqState { default: case State::kState2: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 3/3", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 3/3"; } auto result = current_promise(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 3/3 gets %s", this, - result.ready() ? "ready" : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 3/3 gets " + << (result.ready() ? "ready" : "pending"); } auto* p = result.value_if_ready(); if (p == nullptr) return Pending{}; @@ -489,22 +487,21 @@ struct SeqState { switch (state) { case State::kState0: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 1/4", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 1/4"; } auto result = prior.prior.prior.current_promise(); PromiseResult0* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 1/4 gets %s", this, - p != nullptr - ? (PromiseResultTraits0::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits0::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 1/4 gets " + << (p != nullptr + ? (PromiseResultTraits0::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits0::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits0::IsOk(*p)) { @@ -521,22 +518,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState1: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 2/4", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 2/4"; } auto result = prior.prior.current_promise(); PromiseResult1* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 2/4 gets %s", this, - p != nullptr - ? (PromiseResultTraits1::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits1::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 2/4 gets " + << (p != nullptr + ? (PromiseResultTraits1::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits1::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits1::IsOk(*p)) { @@ -553,22 +549,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState2: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 3/4", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 3/4"; } auto result = prior.current_promise(); PromiseResult2* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 3/4 gets %s", this, - p != nullptr - ? (PromiseResultTraits2::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits2::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 3/4 gets " + << (p != nullptr + ? (PromiseResultTraits2::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits2::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits2::IsOk(*p)) { @@ -586,14 +581,14 @@ struct SeqState { default: case State::kState3: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 4/4", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 4/4"; } auto result = current_promise(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 4/4 gets %s", this, - result.ready() ? "ready" : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 4/4 gets " + << (result.ready() ? "ready" : "pending"); } auto* p = result.value_if_ready(); if (p == nullptr) return Pending{}; @@ -751,22 +746,21 @@ struct SeqState { switch (state) { case State::kState0: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 1/5", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 1/5"; } auto result = prior.prior.prior.prior.current_promise(); PromiseResult0* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 1/5 gets %s", this, - p != nullptr - ? (PromiseResultTraits0::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits0::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 1/5 gets " + << (p != nullptr + ? (PromiseResultTraits0::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits0::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits0::IsOk(*p)) { @@ -783,22 +777,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState1: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 2/5", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 2/5"; } auto result = prior.prior.prior.current_promise(); PromiseResult1* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 2/5 gets %s", this, - p != nullptr - ? (PromiseResultTraits1::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits1::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 2/5 gets " + << (p != nullptr + ? (PromiseResultTraits1::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits1::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits1::IsOk(*p)) { @@ -815,22 +808,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState2: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 3/5", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 3/5"; } auto result = prior.prior.current_promise(); PromiseResult2* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 3/5 gets %s", this, - p != nullptr - ? (PromiseResultTraits2::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits2::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 3/5 gets " + << (p != nullptr + ? (PromiseResultTraits2::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits2::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits2::IsOk(*p)) { @@ -847,22 +839,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState3: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 4/5", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 4/5"; } auto result = prior.current_promise(); PromiseResult3* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 4/5 gets %s", this, - p != nullptr - ? (PromiseResultTraits3::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits3::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 4/5 gets " + << (p != nullptr + ? (PromiseResultTraits3::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits3::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits3::IsOk(*p)) { @@ -880,14 +871,14 @@ struct SeqState { default: case State::kState4: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 5/5", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 5/5"; } auto result = current_promise(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 5/5 gets %s", this, - result.ready() ? "ready" : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 5/5 gets " + << (result.ready() ? "ready" : "pending"); } auto* p = result.value_if_ready(); if (p == nullptr) return Pending{}; @@ -1082,22 +1073,21 @@ struct SeqState { switch (state) { case State::kState0: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 1/6", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 1/6"; } auto result = prior.prior.prior.prior.prior.current_promise(); PromiseResult0* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 1/6 gets %s", this, - p != nullptr - ? (PromiseResultTraits0::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits0::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 1/6 gets " + << (p != nullptr + ? (PromiseResultTraits0::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits0::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits0::IsOk(*p)) { @@ -1115,22 +1105,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState1: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 2/6", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 2/6"; } auto result = prior.prior.prior.prior.current_promise(); PromiseResult1* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 2/6 gets %s", this, - p != nullptr - ? (PromiseResultTraits1::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits1::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 2/6 gets " + << (p != nullptr + ? (PromiseResultTraits1::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits1::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits1::IsOk(*p)) { @@ -1147,22 +1136,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState2: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 3/6", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 3/6"; } auto result = prior.prior.prior.current_promise(); PromiseResult2* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 3/6 gets %s", this, - p != nullptr - ? (PromiseResultTraits2::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits2::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 3/6 gets " + << (p != nullptr + ? (PromiseResultTraits2::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits2::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits2::IsOk(*p)) { @@ -1179,22 +1167,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState3: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 4/6", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 4/6"; } auto result = prior.prior.current_promise(); PromiseResult3* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 4/6 gets %s", this, - p != nullptr - ? (PromiseResultTraits3::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits3::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 4/6 gets " + << (p != nullptr + ? (PromiseResultTraits3::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits3::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits3::IsOk(*p)) { @@ -1211,22 +1198,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState4: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 5/6", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 5/6"; } auto result = prior.current_promise(); PromiseResult4* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 5/6 gets %s", this, - p != nullptr - ? (PromiseResultTraits4::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits4::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 5/6 gets " + << (p != nullptr + ? (PromiseResultTraits4::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits4::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits4::IsOk(*p)) { @@ -1249,9 +1235,9 @@ struct SeqState { } auto result = current_promise(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 6/6 gets %s", this, - result.ready() ? "ready" : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 6/6 gets " + << (result.ready() ? "ready" : "pending"); } auto* p = result.value_if_ready(); if (p == nullptr) return Pending{}; @@ -1478,22 +1464,21 @@ struct SeqState { switch (state) { case State::kState0: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 1/7", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 1/7"; } auto result = prior.prior.prior.prior.prior.prior.current_promise(); PromiseResult0* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 1/7 gets %s", this, - p != nullptr - ? (PromiseResultTraits0::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits0::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 1/7 gets " + << (p != nullptr + ? (PromiseResultTraits0::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits0::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits0::IsOk(*p)) { @@ -1511,22 +1496,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState1: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 2/7", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 2/7"; } auto result = prior.prior.prior.prior.prior.current_promise(); PromiseResult1* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 2/7 gets %s", this, - p != nullptr - ? (PromiseResultTraits1::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits1::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 2/7 gets " + << (p != nullptr + ? (PromiseResultTraits1::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits1::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits1::IsOk(*p)) { @@ -1544,22 +1528,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState2: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 3/7", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 3/7"; } auto result = prior.prior.prior.prior.current_promise(); PromiseResult2* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 3/7 gets %s", this, - p != nullptr - ? (PromiseResultTraits2::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits2::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 3/7 gets " + << (p != nullptr + ? (PromiseResultTraits2::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits2::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits2::IsOk(*p)) { @@ -1576,22 +1559,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState3: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 4/7", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 4/7"; } auto result = prior.prior.prior.current_promise(); PromiseResult3* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 4/7 gets %s", this, - p != nullptr - ? (PromiseResultTraits3::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits3::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 4/7 gets " + << (p != nullptr + ? (PromiseResultTraits3::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits3::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits3::IsOk(*p)) { @@ -1608,22 +1590,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState4: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 5/7", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 5/7"; } auto result = prior.prior.current_promise(); PromiseResult4* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 5/7 gets %s", this, - p != nullptr - ? (PromiseResultTraits4::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits4::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 5/7 gets " + << (p != nullptr + ? (PromiseResultTraits4::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits4::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits4::IsOk(*p)) { @@ -1640,22 +1621,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState5: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 6/7", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 6/7"; } auto result = prior.current_promise(); PromiseResult5* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 6/7 gets %s", this, - p != nullptr - ? (PromiseResultTraits5::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits5::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 6/7 gets " + << (p != nullptr + ? (PromiseResultTraits5::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits5::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits5::IsOk(*p)) { @@ -1673,14 +1653,14 @@ struct SeqState { default: case State::kState6: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 7/7", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 7/7"; } auto result = current_promise(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 7/7 gets %s", this, - result.ready() ? "ready" : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 7/7 gets " + << (result.ready() ? "ready" : "pending"); } auto* p = result.value_if_ready(); if (p == nullptr) return Pending{}; @@ -1940,23 +1920,22 @@ struct SeqState { switch (state) { case State::kState0: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 1/8", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 1/8"; } auto result = prior.prior.prior.prior.prior.prior.prior.current_promise(); PromiseResult0* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 1/8 gets %s", this, - p != nullptr - ? (PromiseResultTraits0::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits0::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 1/8 gets " + << (p != nullptr + ? (PromiseResultTraits0::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits0::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits0::IsOk(*p)) { @@ -1975,22 +1954,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState1: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 2/8", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 2/8"; } auto result = prior.prior.prior.prior.prior.prior.current_promise(); PromiseResult1* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 2/8 gets %s", this, - p != nullptr - ? (PromiseResultTraits1::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits1::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 2/8 gets " + << (p != nullptr + ? (PromiseResultTraits1::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits1::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits1::IsOk(*p)) { @@ -2008,22 +1986,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState2: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 3/8", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 3/8"; } auto result = prior.prior.prior.prior.prior.current_promise(); PromiseResult2* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 3/8 gets %s", this, - p != nullptr - ? (PromiseResultTraits2::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits2::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 3/8 gets " + << (p != nullptr + ? (PromiseResultTraits2::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits2::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits2::IsOk(*p)) { @@ -2041,22 +2018,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState3: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 4/8", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 4/8"; } auto result = prior.prior.prior.prior.current_promise(); PromiseResult3* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 4/8 gets %s", this, - p != nullptr - ? (PromiseResultTraits3::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits3::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 4/8 gets " + << (p != nullptr + ? (PromiseResultTraits3::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits3::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits3::IsOk(*p)) { @@ -2073,22 +2049,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState4: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 5/8", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 5/8"; } auto result = prior.prior.prior.current_promise(); PromiseResult4* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 5/8 gets %s", this, - p != nullptr - ? (PromiseResultTraits4::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits4::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 5/8 gets " + << (p != nullptr + ? (PromiseResultTraits4::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits4::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits4::IsOk(*p)) { @@ -2105,22 +2080,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState5: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 6/8", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 6/8"; } auto result = prior.prior.current_promise(); PromiseResult5* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 6/8 gets %s", this, - p != nullptr - ? (PromiseResultTraits5::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits5::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 6/8 gets " + << (p != nullptr + ? (PromiseResultTraits5::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits5::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits5::IsOk(*p)) { @@ -2137,22 +2111,21 @@ struct SeqState { ABSL_FALLTHROUGH_INTENDED; case State::kState6: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 7/8", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 7/8"; } auto result = prior.current_promise(); PromiseResult6* p = result.value_if_ready(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log( - whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 7/8 gets %s", this, - p != nullptr - ? (PromiseResultTraits6::IsOk(*p) - ? "ready" - : absl::StrCat("early-error:", - PromiseResultTraits6::ErrorString(*p)) - .c_str()) - : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 7/8 gets " + << (p != nullptr + ? (PromiseResultTraits6::IsOk(*p) + ? "ready" + : absl::StrCat( + "early-error:", + PromiseResultTraits6::ErrorString(*p))) + : "pending"); } if (p == nullptr) return Pending{}; if (!PromiseResultTraits6::IsOk(*p)) { @@ -2170,14 +2143,14 @@ struct SeqState { default: case State::kState7: { if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: begin poll step 8/8", this); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: begin poll step 8/8"; } auto result = current_promise(); if (grpc_trace_promise_primitives.enabled()) { - gpr_log(whence.file(), whence.line(), GPR_LOG_SEVERITY_INFO, - "seq[%p]: poll step 8/8 gets %s", this, - result.ready() ? "ready" : "pending"); + LOG(INFO).AtLocation(whence.file(), whence.line()) + << "seq[" << this << "]: poll step 8/8 gets " + << (result.ready() ? "ready" : "pending"); } auto* p = result.value_if_ready(); if (p == nullptr) return Pending{}; From 06b097691e08851bd63c23dba5b538738187129a Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Sun, 12 May 2024 10:54:15 -0700 Subject: [PATCH 03/10] [logging] Add a helper to drop a list of variables out in a LOG statement (#36554) Not the fastest implementation possible, but it's a log helper so I'm not particularly fussed either -- but a useful utility that we can iterate on later to help debugging. Closes #36554 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/36554 from ctiller:args 33b4802fccb1a667ab81c1e2b2e1c5a55c993119 PiperOrigin-RevId: 632997320 --- CMakeLists.txt | 36 +++++++++++++++ build_autogenerated.yaml | 14 ++++++ src/core/BUILD | 19 ++++++++ src/core/lib/gprpp/dump_args.cc | 54 ++++++++++++++++++++++ src/core/lib/gprpp/dump_args.h | 69 ++++++++++++++++++++++++++++ test/core/gprpp/BUILD | 14 ++++++ test/core/gprpp/dump_args_test.cc | 44 ++++++++++++++++++ tools/distrib/fix_build_deps.py | 9 ++-- tools/run_tests/generated/tests.json | 24 ++++++++++ 9 files changed, 280 insertions(+), 3 deletions(-) create mode 100644 src/core/lib/gprpp/dump_args.cc create mode 100644 src/core/lib/gprpp/dump_args.h create mode 100644 test/core/gprpp/dump_args_test.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 449d17ec767..1b107dddb0f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1052,6 +1052,7 @@ if(gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_dependencies(buildtests_cxx dualstack_socket_test) endif() + add_dependencies(buildtests_cxx dump_args_test) add_dependencies(buildtests_cxx duplicate_header_bad_client_test) add_dependencies(buildtests_cxx empty_batch_test) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) @@ -12390,6 +12391,41 @@ endif() endif() if(gRPC_BUILD_TESTS) +add_executable(dump_args_test + src/core/lib/gprpp/dump_args.cc + test/core/gprpp/dump_args_test.cc +) +target_compile_features(dump_args_test PUBLIC cxx_std_14) +target_include_directories(dump_args_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_RE2_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_XXHASH_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(dump_args_test + ${_gRPC_ALLTARGETS_LIBRARIES} + gtest + absl::any_invocable + absl::check +) + + +endif() +if(gRPC_BUILD_TESTS) + add_executable(duplicate_header_bad_client_test test/core/bad_client/bad_client.cc test/core/bad_client/tests/duplicate_header.cc diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index d15f905f347..7458cc04b7f 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -8661,6 +8661,20 @@ targets: - linux - posix - mac +- name: dump_args_test + gtest: true + build: test + language: c++ + headers: + - src/core/lib/gprpp/dump_args.h + src: + - src/core/lib/gprpp/dump_args.cc + - test/core/gprpp/dump_args_test.cc + deps: + - gtest + - absl/functional:any_invocable + - absl/log:check + uses_polling: false - name: duplicate_header_bad_client_test gtest: true build: test diff --git a/src/core/BUILD b/src/core/BUILD index 87225db6d7c..b15bf14f933 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -48,6 +48,25 @@ grpc_cc_library( language = "c++", ) +grpc_cc_library( + name = "dump_args", + srcs = [ + "lib/gprpp/dump_args.cc", + ], + hdrs = [ + "lib/gprpp/dump_args.h", + ], + external_deps = [ + "absl/functional:any_invocable", + "absl/log:check", + "absl/strings", + ], + language = "c++", + deps = [ + "//:gpr_platform", + ], +) + grpc_cc_library( name = "slice_cast", hdrs = [ diff --git a/src/core/lib/gprpp/dump_args.cc b/src/core/lib/gprpp/dump_args.cc new file mode 100644 index 00000000000..e5bc183246b --- /dev/null +++ b/src/core/lib/gprpp/dump_args.cc @@ -0,0 +1,54 @@ +// Copyright 2024 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "src/core/lib/gprpp/dump_args.h" + +#include "absl/log/check.h" +#include "absl/strings/ascii.h" +#include "absl/strings/string_view.h" + +namespace grpc_core { +namespace dump_args_detail { + +std::ostream& operator<<(std::ostream& out, const DumpArgs& args) { + // Parse the argument string into a vector of keys. + // #__VA_ARGS__ produces a stringified version of the arguments passed to the + // macro. It's comma separated, and we can use that to split the string into + // keys. Those keys might include parenthesis for e.g. argument lists, and so + // we need to skip commas that are inside parenthesis. + std::vector keys; + int depth = 0; + const char* start = args.arg_string_; + for (const char* p = args.arg_string_; *p; ++p) { + if (*p == '(') { + ++depth; + } else if (*p == ')') { + --depth; + } else if (*p == ',' && depth == 0) { + keys.push_back(absl::string_view(start, p - start)); + start = p + 1; + } + } + keys.push_back(start); + CHECK_EQ(keys.size(), args.arg_dumpers_.size()); + for (size_t i = 0; i < keys.size(); i++) { + if (i != 0) out << ", "; + out << absl::StripAsciiWhitespace(keys[i]) << " = "; + args.arg_dumpers_[i](out); + } + return out; +} + +} // namespace dump_args_detail +} // namespace grpc_core \ No newline at end of file diff --git a/src/core/lib/gprpp/dump_args.h b/src/core/lib/gprpp/dump_args.h new file mode 100644 index 00000000000..c2b66ce2be3 --- /dev/null +++ b/src/core/lib/gprpp/dump_args.h @@ -0,0 +1,69 @@ +// Copyright 2024 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef GRPC_SRC_CORE_LIB_GPRPP_DUMP_ARGS_H +#define GRPC_SRC_CORE_LIB_GPRPP_DUMP_ARGS_H + +#include +#include + +#include "absl/functional/any_invocable.h" + +namespace grpc_core { +namespace dump_args_detail { + +// Helper function... just ignore the initializer list passed into it. +// Allows doing 'statements' via parameter pack expansion in C++11 - given +// template : +// do_these_things({foo()...}); +// will execute foo() for each T in Ts. +template +void do_these_things(std::initializer_list) {} + +class DumpArgs { + public: + template + explicit DumpArgs(const char* arg_string, const Args&... args) + : arg_string_(arg_string) { + do_these_things( + {AddDumper([a = &args](std::ostream& os) { os << *a; })...}); + } + + friend std::ostream& operator<<(std::ostream& out, const DumpArgs& args); + + private: + int AddDumper(absl::AnyInvocable dumper) { + arg_dumpers_.push_back(std::move(dumper)); + return 0; + } + + const char* arg_string_; + std::vector> arg_dumpers_; +}; + +} // namespace dump_args_detail +} // namespace grpc_core + +// Helper to print a list of variables and their values. +// Each type must be streamable to std::ostream. +// Usage: +// int a = 1; +// int b = 2; +// LOG(INFO) << GRPC_DUMP_ARGS(a, b) +// Output: +// a = 1, b = 2 +#define GRPC_DUMP_ARGS(...) \ + grpc_core::dump_args_detail::DumpArgs(#__VA_ARGS__, __VA_ARGS__) + +#endif // GRPC_SRC_CORE_LIB_GPRPP_DUMP_ARGS_H diff --git a/test/core/gprpp/BUILD b/test/core/gprpp/BUILD index b6ca769f46d..177c5809b0c 100644 --- a/test/core/gprpp/BUILD +++ b/test/core/gprpp/BUILD @@ -60,6 +60,20 @@ grpc_cc_test( ], ) +grpc_cc_test( + name = "dump_args_test", + srcs = ["dump_args_test.cc"], + external_deps = [ + "gtest", + ], + language = "C++", + uses_event_engine = False, + uses_polling = False, + deps = [ + "//src/core:dump_args", + ], +) + # TODO(hork): solidify fork support requirements for EventEngines grpc_cc_test( name = "fork_test", diff --git a/test/core/gprpp/dump_args_test.cc b/test/core/gprpp/dump_args_test.cc new file mode 100644 index 00000000000..2207d4eab62 --- /dev/null +++ b/test/core/gprpp/dump_args_test.cc @@ -0,0 +1,44 @@ +// Copyright 2024 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "src/core/lib/gprpp/dump_args.h" + +#include + +#include "gtest/gtest.h" + +template +std::string Stringify(const T& t) { + std::ostringstream oss; + oss << t; + return oss.str(); +} + +int add(int a, int b) { return a + b; } + +TEST(DumpArgsTest, Basic) { + int a = 1; + int b = 2; + int c = 3; + EXPECT_EQ("a = 1, b = 2, c = 3", Stringify(GRPC_DUMP_ARGS(a, b, c))); +} + +TEST(DumpArgsTest, FunctionCall) { + EXPECT_EQ("add(1, 2) = 3", Stringify(GRPC_DUMP_ARGS(add(1, 2)))); +} + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/tools/distrib/fix_build_deps.py b/tools/distrib/fix_build_deps.py index 03dbcc9137b..0a114910e3e 100755 --- a/tools/distrib/fix_build_deps.py +++ b/tools/distrib/fix_build_deps.py @@ -64,6 +64,7 @@ EXTERNAL_DEPS = { "absl/functional/bind_front.h": "absl/functional:bind_front", "absl/functional/function_ref.h": "absl/functional:function_ref", "absl/hash/hash.h": "absl/hash", + "absl/log/check.h": "absl/log:check", "absl/memory/memory.h": "absl/memory", "absl/meta/type_traits.h": "absl/meta:type_traits", "absl/numeric/int128.h": "absl/numeric:int128", @@ -543,9 +544,11 @@ def make_library(library): # once EventEngine lands we can clean this up deps = Choices( library, - {"//:grpc_base": ["//:grpc", "//:grpc_unsecure"]} - if library.startswith("//test/") - else {}, + ( + {"//:grpc_base": ["//:grpc", "//:grpc_unsecure"]} + if library.startswith("//test/") + else {} + ), ) external_deps = Choices(None, {}) for hdr in hdrs: diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 61b98ca9bd1..a733817a370 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -2969,6 +2969,30 @@ ], "uses_polling": true }, + { + "args": [], + "benchmark": false, + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "dump_args_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "uses_polling": false + }, { "args": [], "benchmark": false, From 5a99b7ea827ad5acefea363ddd54c6a0fa05c91b Mon Sep 17 00:00:00 2001 From: Tanvi Jagtap <139093547+tanvi-jagtap@users.noreply.github.com> Date: Sun, 12 May 2024 20:10:52 -0700 Subject: [PATCH 04/10] [grpc][Gpr_To_Absl_Logging] Migrating from gpr to absl logging - gpr_log (#36585) [grpc][Gpr_To_Absl_Logging] Migrating from gpr to absl logging - gpr_log In this CL we are migrating from gRPCs own gpr logging mechanism to absl logging mechanism. The intention is to deprecate gpr_log in the future. We have the following mapping 1. gpr_log(GPR_INFO,...) -> LOG(INFO) 2. gpr_log(GPR_ERROR,...) -> LOG(ERROR) 3. gpr_log(GPR_DEBUG,...) -> VLOG(2) Reviewers need to check : 1. If the above mapping is correct. 2. The content of the log is as before. gpr_log format strings did not use string_view or std::string . absl LOG accepts these. So there will be some elimination of string_view and std::string related conversions. This is expected. Closes #36585 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/36585 from tanvi-jagtap:large_file_regex_conv 2ca173855a9de7b3d4865d6528221d1d7c6cda58 PiperOrigin-RevId: 633069869 --- .../binder/transport/binder_transport.cc | 29 +++++---- .../binder/wire_format/wire_reader_impl.cc | 21 +++--- .../chttp2/transport/chttp2_transport.cc | 3 +- src/core/lib/iomgr/ev_epoll1_linux.cc | 25 +++---- src/core/lib/iomgr/tcp_posix.cc | 27 ++++---- .../security/credentials/jwt/jwt_verifier.cc | 58 ++++++++--------- src/core/lib/surface/call.cc | 4 +- .../load_balancing/xds/xds_override_host.cc | 7 +- .../alts/handshaker/alts_tsi_handshaker.cc | 65 +++++++++---------- 9 files changed, 122 insertions(+), 117 deletions(-) diff --git a/src/core/ext/transport/binder/transport/binder_transport.cc b/src/core/ext/transport/binder/transport/binder_transport.cc index b5e32e913b7..65512675d96 100644 --- a/src/core/ext/transport/binder/transport/binder_transport.cc +++ b/src/core/ext/transport/binder/transport/binder_transport.cc @@ -24,6 +24,7 @@ #include #include "absl/log/check.h" +#include "absl/log/log.h" #include "absl/memory/memory.h" #include "absl/strings/str_cat.h" #include "absl/strings/substitute.h" @@ -141,7 +142,7 @@ static void AssignMetadata(grpc_metadata_batch* mb, static void cancel_stream_locked(grpc_binder_transport* transport, grpc_binder_stream* stream, grpc_error_handle error) { - gpr_log(GPR_INFO, "cancel_stream_locked"); + LOG(INFO) << "cancel_stream_locked"; if (!stream->is_closed) { CHECK(stream->cancel_self_error.ok()); stream->is_closed = true; @@ -200,7 +201,7 @@ static void recv_initial_metadata_locked(void* arg, CHECK(stream->recv_initial_metadata); CHECK(stream->recv_initial_metadata_ready); if (!args->initial_metadata.ok()) { - gpr_log(GPR_ERROR, "Failed to parse initial metadata"); + LOG(ERROR) << "Failed to parse initial metadata"; return absl_status_to_grpc_error(args->initial_metadata.status()); } if (!stream->is_client) { @@ -237,11 +238,11 @@ static void recv_message_locked(void* arg, grpc_error_handle /*error*/) { CHECK(stream->recv_message); CHECK(stream->recv_message_ready); if (!args->message.ok()) { - gpr_log(GPR_ERROR, "Failed to receive message"); + LOG(ERROR) << "Failed to receive message"; if (args->message.status().message() == grpc_binder::TransportStreamReceiver:: kGrpcBinderTransportCancelledGracefully) { - gpr_log(GPR_ERROR, "message cancelled gracefully"); + LOG(ERROR) << "message cancelled gracefully"; // Cancelled because we've already received trailing metadata. // It's not an error in this case. return absl::OkStatus(); @@ -281,13 +282,13 @@ static void recv_trailing_metadata_locked(void* arg, CHECK(stream->recv_trailing_metadata); CHECK(stream->recv_trailing_metadata_finished); if (!args->trailing_metadata.ok()) { - gpr_log(GPR_ERROR, "Failed to receive trailing metadata"); + LOG(ERROR) << "Failed to receive trailing metadata"; return absl_status_to_grpc_error(args->trailing_metadata.status()); } if (!stream->is_client) { // Client will not send non-empty trailing metadata. if (!args->trailing_metadata.value().empty()) { - gpr_log(GPR_ERROR, "Server receives non-empty trailing metadata."); + LOG(ERROR) << "Server receives non-empty trailing metadata."; return absl::CancelledError(); } } else { @@ -371,7 +372,7 @@ class MetadataEncoder { static void accept_stream_locked(void* gt, grpc_error_handle /*error*/) { grpc_binder_transport* transport = static_cast(gt); if (transport->accept_stream_fn) { - gpr_log(GPR_INFO, "Accepting a stream"); + LOG(INFO) << "Accepting a stream"; // must pass in a non-null value. (*transport->accept_stream_fn)(transport->accept_stream_user_data, transport, transport); @@ -449,7 +450,7 @@ static void perform_stream_op_locked(void* stream_op, std::make_unique(tx_code, transport->is_client); if (op->send_initial_metadata) { - gpr_log(GPR_INFO, "send_initial_metadata"); + LOG(INFO) << "send_initial_metadata"; grpc_binder::Metadata init_md; auto batch = op->payload->send_initial_metadata.send_initial_metadata; @@ -459,12 +460,12 @@ static void perform_stream_op_locked(void* stream_op, tx->SetPrefix(init_md); } if (op->send_message) { - gpr_log(GPR_INFO, "send_message"); + LOG(INFO) << "send_message"; tx->SetData(op->payload->send_message.send_message->JoinIntoString()); } if (op->send_trailing_metadata) { - gpr_log(GPR_INFO, "send_trailing_metadata"); + LOG(INFO) << "send_trailing_metadata"; auto batch = op->payload->send_trailing_metadata.send_trailing_metadata; grpc_binder::Metadata trailing_metadata; @@ -477,7 +478,7 @@ static void perform_stream_op_locked(void* stream_op, tx->SetSuffix(trailing_metadata); } if (op->recv_initial_metadata) { - gpr_log(GPR_INFO, "recv_initial_metadata"); + LOG(INFO) << "recv_initial_metadata"; stream->recv_initial_metadata_ready = op->payload->recv_initial_metadata.recv_initial_metadata_ready; stream->recv_initial_metadata = @@ -500,7 +501,7 @@ static void perform_stream_op_locked(void* stream_op, }); } if (op->recv_message) { - gpr_log(GPR_INFO, "recv_message"); + LOG(INFO) << "recv_message"; stream->recv_message_ready = op->payload->recv_message.recv_message_ready; stream->recv_message = op->payload->recv_message.recv_message; stream->call_failed_before_recv_message = @@ -523,7 +524,7 @@ static void perform_stream_op_locked(void* stream_op, }); } if (op->recv_trailing_metadata) { - gpr_log(GPR_INFO, "recv_trailing_metadata"); + LOG(INFO) << "recv_trailing_metadata"; stream->recv_trailing_metadata_finished = op->payload->recv_trailing_metadata.recv_trailing_metadata_ready; stream->recv_trailing_metadata = @@ -571,7 +572,7 @@ static void perform_stream_op_locked(void* stream_op, if (op->on_complete != nullptr) { grpc_core::ExecCtx::Run(DEBUG_LOCATION, op->on_complete, absl_status_to_grpc_error(status)); - gpr_log(GPR_INFO, "on_complete closure scheduled"); + LOG(INFO) << "on_complete closure scheduled"; } GRPC_BINDER_STREAM_UNREF(stream, "perform_stream_op"); } diff --git a/src/core/ext/transport/binder/wire_format/wire_reader_impl.cc b/src/core/ext/transport/binder/wire_format/wire_reader_impl.cc index 8595f8bf149..02cd6cf09cd 100644 --- a/src/core/ext/transport/binder/wire_format/wire_reader_impl.cc +++ b/src/core/ext/transport/binder/wire_format/wire_reader_impl.cc @@ -26,6 +26,7 @@ #include "absl/functional/any_invocable.h" #include "absl/log/check.h" +#include "absl/log/log.h" #include "absl/memory/memory.h" #include "absl/status/statusor.h" @@ -136,9 +137,9 @@ void WireReaderImpl::SendSetupTransport(Binder* binder) { std::unique_ptr WireReaderImpl::RecvSetupTransport() { // TODO(b/191941760): avoid blocking, handle wire_writer_noti lifetime // better - gpr_log(GPR_DEBUG, "start waiting for noti"); + VLOG(2) << "start waiting for noti"; connection_noti_.WaitForNotification(); - gpr_log(GPR_DEBUG, "end waiting for noti"); + VLOG(2) << "end waiting for noti"; return std::move(other_end_binder_); } @@ -153,8 +154,8 @@ absl::Status WireReaderImpl::ProcessTransaction(transaction_code_t code, BinderTransportTxCode::SETUP_TRANSPORT) && code <= static_cast( BinderTransportTxCode::PING_RESPONSE))) { - gpr_log(GPR_INFO, - "Received unknown control message. Shutdown transport gracefully."); + LOG(INFO) + << "Received unknown control message. Shutdown transport gracefully."; // TODO(waynetu): Shutdown transport gracefully. return absl::OkStatus(); } @@ -210,8 +211,8 @@ absl::Status WireReaderImpl::ProcessTransaction(transaction_code_t code, break; } case BinderTransportTxCode::SHUTDOWN_TRANSPORT: { - gpr_log(GPR_ERROR, - "Received SHUTDOWN_TRANSPORT request but not implemented yet."); + LOG(ERROR) + << "Received SHUTDOWN_TRANSPORT request but not implemented yet."; return absl::UnimplementedError("SHUTDOWN_TRANSPORT"); } case BinderTransportTxCode::ACKNOWLEDGE_BYTES: { @@ -286,16 +287,16 @@ absl::Status WireReaderImpl::ProcessStreamingTransaction( tx_process_result.ToString().c_str()); // Something went wrong when receiving transaction. Cancel failed requests. if (cancellation_flags & kFlagPrefix) { - gpr_log(GPR_INFO, "cancelling initial metadata"); + LOG(INFO) << "cancelling initial metadata"; transport_stream_receiver_->NotifyRecvInitialMetadata(code, tx_process_result); } if (cancellation_flags & kFlagMessageData) { - gpr_log(GPR_INFO, "cancelling message data"); + LOG(INFO) << "cancelling message data"; transport_stream_receiver_->NotifyRecvMessage(code, tx_process_result); } if (cancellation_flags & kFlagSuffix) { - gpr_log(GPR_INFO, "cancelling trailing metadata"); + LOG(INFO) << "cancelling trailing metadata"; transport_stream_receiver_->NotifyRecvTrailingMetadata( code, tx_process_result, 0); } @@ -338,7 +339,7 @@ absl::Status WireReaderImpl::ProcessStreamingTransactionImpl( // intended behavior. // TODO(waynetu): What should be returned here? if (flags == 0) { - gpr_log(GPR_INFO, "[WARNING] Receive empty transaction. Ignored."); + LOG(INFO) << "[WARNING] Receive empty transaction. Ignored."; return absl::OkStatus(); } diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc index 9a28649dd52..4acd9b51b3f 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc @@ -35,6 +35,7 @@ #include "absl/container/flat_hash_map.h" #include "absl/hash/hash.h" #include "absl/log/check.h" +#include "absl/log/log.h" #include "absl/meta/type_traits.h" #include "absl/random/random.h" #include "absl/status/status.h" @@ -1324,7 +1325,7 @@ static bool contains_non_ok_status(grpc_metadata_batch* batch) { static void log_metadata(const grpc_metadata_batch* md_batch, uint32_t id, bool is_client, bool is_initial) { - gpr_log(GPR_INFO, "--metadata--"); + LOG(INFO) << "--metadata--"; const std::string prefix = absl::StrCat( "HTTP:", id, is_initial ? ":HDR" : ":TRL", is_client ? ":CLI:" : ":SVR:"); md_batch->Log([&prefix](absl::string_view key, absl::string_view value) { diff --git a/src/core/lib/iomgr/ev_epoll1_linux.cc b/src/core/lib/iomgr/ev_epoll1_linux.cc index c36f3833d9f..6461b10a6cb 100644 --- a/src/core/lib/iomgr/ev_epoll1_linux.cc +++ b/src/core/lib/iomgr/ev_epoll1_linux.cc @@ -41,6 +41,7 @@ #include #include +#include "absl/log/log.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" #include "absl/strings/str_join.h" @@ -100,14 +101,14 @@ static int epoll_create_and_cloexec() { #ifdef GRPC_LINUX_EPOLL_CREATE1 int fd = epoll_create1(EPOLL_CLOEXEC); if (fd < 0) { - gpr_log(GPR_ERROR, "epoll_create1 unavailable"); + LOG(ERROR) << "epoll_create1 unavailable"; } #else int fd = epoll_create(MAX_EPOLL_EVENTS); if (fd < 0) { - gpr_log(GPR_ERROR, "epoll_create unavailable"); + LOG(ERROR) << "epoll_create unavailable"; } else if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) { - gpr_log(GPR_ERROR, "fcntl following epoll_create failed"); + LOG(ERROR) << "fcntl following epoll_create failed"; return -1; } #endif @@ -891,7 +892,7 @@ static bool check_neighborhood_for_available_poller( } } else { if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) { - gpr_log(GPR_INFO, " .. beaten to choose next poller"); + LOG(INFO) << " .. beaten to choose next poller"; } } // even if we didn't win the cas, there's a worker, we can stop @@ -990,7 +991,7 @@ static void end_worker(grpc_pollset* pollset, grpc_pollset_worker* worker, gpr_cv_destroy(&worker->cv); } if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) { - gpr_log(GPR_INFO, " .. remove worker"); + LOG(INFO) << " .. remove worker"; } if (EMPTIED == worker_remove(pollset, worker)) { pollset_maybe_finish_shutdown(pollset); @@ -1081,7 +1082,7 @@ static grpc_error_handle pollset_kick(grpc_pollset* pollset, if (root_worker == nullptr) { pollset->kicked_without_poller = true; if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) { - gpr_log(GPR_INFO, " .. kicked_without_poller"); + LOG(INFO) << " .. kicked_without_poller"; } goto done; } @@ -1146,7 +1147,7 @@ static grpc_error_handle pollset_kick(grpc_pollset* pollset, } } else { if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) { - gpr_log(GPR_INFO, " .. kicked while waking up"); + LOG(INFO) << " .. kicked while waking up"; } goto done; } @@ -1156,7 +1157,7 @@ static grpc_error_handle pollset_kick(grpc_pollset* pollset, if (specific_worker->state == KICKED) { if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) { - gpr_log(GPR_INFO, " .. specific worker already kicked"); + LOG(INFO) << " .. specific worker already kicked"; } goto done; } else if (g_current_thread_worker == specific_worker) { @@ -1169,21 +1170,21 @@ static grpc_error_handle pollset_kick(grpc_pollset* pollset, reinterpret_cast( gpr_atm_no_barrier_load(&g_active_poller))) { if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) { - gpr_log(GPR_INFO, " .. kick active poller"); + LOG(INFO) << " .. kick active poller"; } SET_KICK_STATE(specific_worker, KICKED); ret_err = grpc_wakeup_fd_wakeup(&global_wakeup_fd); goto done; } else if (specific_worker->initialized_cv) { if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) { - gpr_log(GPR_INFO, " .. kick waiting worker"); + LOG(INFO) << " .. kick waiting worker"; } SET_KICK_STATE(specific_worker, KICKED); gpr_cv_signal(&specific_worker->cv); goto done; } else { if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) { - gpr_log(GPR_INFO, " .. kick non-waiting worker"); + LOG(INFO) << " .. kick non-waiting worker"; } SET_KICK_STATE(specific_worker, KICKED); goto done; @@ -1311,7 +1312,7 @@ static void reset_event_manager_on_fork() { static bool init_epoll1_linux() { if (!g_is_shutdown) return true; if (!grpc_has_wakeup_fd()) { - gpr_log(GPR_ERROR, "Skipping epoll1 because of no wakeup fd."); + LOG(ERROR) << "Skipping epoll1 because of no wakeup fd."; return false; } diff --git a/src/core/lib/iomgr/tcp_posix.cc b/src/core/lib/iomgr/tcp_posix.cc index 880b10c1764..46c54c9502e 100644 --- a/src/core/lib/iomgr/tcp_posix.cc +++ b/src/core/lib/iomgr/tcp_posix.cc @@ -46,6 +46,7 @@ #include #include "absl/log/check.h" +#include "absl/log/log.h" #include #include @@ -212,7 +213,7 @@ class TcpZerocopySendCtx { if (send_records_ == nullptr || free_send_records_ == nullptr) { gpr_free(send_records_); gpr_free(free_send_records_); - gpr_log(GPR_INFO, "Disabling TCP TX zerocopy due to memory pressure.\n"); + LOG(INFO) << "Disabling TCP TX zerocopy due to memory pressure.\n"; memory_limited_ = true; } else { for (int idx = 0; idx < max_sends_; ++idx) { @@ -836,7 +837,7 @@ static void tcp_destroy(grpc_endpoint* ep) { static void perform_reclamation(grpc_tcp* tcp) ABSL_LOCKS_EXCLUDED(tcp->read_mu) { if (GRPC_TRACE_FLAG_ENABLED(grpc_resource_quota_trace)) { - gpr_log(GPR_INFO, "TCP: benign reclamation to free memory"); + LOG(INFO) << "TCP: benign reclamation to free memory"; } tcp->read_mu.Lock(); if (tcp->incoming_buffer != nullptr) { @@ -1294,7 +1295,7 @@ static bool tcp_write_with_timestamps(grpc_tcp* tcp, struct msghdr* msg, if (setsockopt(tcp->fd, SOL_SOCKET, SO_TIMESTAMPING, static_cast(&opt), sizeof(opt)) != 0) { if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) { - gpr_log(GPR_ERROR, "Failed to set timestamping options on the socket."); + LOG(ERROR) << "Failed to set timestamping options on the socket."; } return false; } @@ -1380,7 +1381,7 @@ struct cmsghdr* process_timestamp(grpc_tcp* tcp, msghdr* msg, cmsghdr* opt_stats = nullptr; if (next_cmsg == nullptr) { if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) { - gpr_log(GPR_ERROR, "Received timestamp without extended error"); + LOG(ERROR) << "Received timestamp without extended error"; } return cmsg; } @@ -1392,7 +1393,7 @@ struct cmsghdr* process_timestamp(grpc_tcp* tcp, msghdr* msg, next_cmsg = CMSG_NXTHDR(msg, opt_stats); if (next_cmsg == nullptr) { if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) { - gpr_log(GPR_ERROR, "Received timestamp without extended error"); + LOG(ERROR) << "Received timestamp without extended error"; } return opt_stats; } @@ -1402,7 +1403,7 @@ struct cmsghdr* process_timestamp(grpc_tcp* tcp, msghdr* msg, !(next_cmsg->cmsg_type == IP_RECVERR || next_cmsg->cmsg_type == IPV6_RECVERR)) { if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) { - gpr_log(GPR_ERROR, "Unexpected control message"); + LOG(ERROR) << "Unexpected control message"; } return cmsg; } @@ -1412,7 +1413,7 @@ struct cmsghdr* process_timestamp(grpc_tcp* tcp, msghdr* msg, auto serr = reinterpret_cast(CMSG_DATA(next_cmsg)); if (serr->ee_errno != ENOMSG || serr->ee_origin != SO_EE_ORIGIN_TIMESTAMPING) { - gpr_log(GPR_ERROR, "Unexpected control message"); + LOG(ERROR) << "Unexpected control message"; return cmsg; } tcp->tb_list.ProcessTimestamp(serr, opt_stats, tss); @@ -1462,7 +1463,7 @@ static bool process_errors(grpc_tcp* tcp) { return processed_err; } if (GPR_UNLIKELY((msg.msg_flags & MSG_CTRUNC) != 0)) { - gpr_log(GPR_ERROR, "Error message was truncated."); + LOG(ERROR) << "Error message was truncated."; } if (msg.msg_controllen == 0) { @@ -1539,14 +1540,14 @@ static bool tcp_write_with_timestamps(grpc_tcp* /*tcp*/, struct msghdr* /*msg*/, ssize_t* /*sent_length*/, int* /* saved_errno */, int /*additional_flags*/) { - gpr_log(GPR_ERROR, "Write with timestamps not supported for this platform"); + LOG(ERROR) << "Write with timestamps not supported for this platform"; CHECK(0); return false; } static void tcp_handle_error(void* /*arg*/ /* grpc_tcp */, grpc_error_handle /*error*/) { - gpr_log(GPR_ERROR, "Error handling is not supported for this platform"); + LOG(ERROR) << "Error handling is not supported for this platform"; CHECK(0); } #endif // GRPC_LINUX_ERRQUEUE @@ -1842,7 +1843,7 @@ static void tcp_handle_write(void* arg /* grpc_tcp */, : tcp_flush(tcp, &error); if (!flush_result) { if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) { - gpr_log(GPR_INFO, "write: delayed"); + LOG(INFO) << "write: delayed"; } notify_on_write(tcp); // tcp_flush does not populate error if it has returned false. @@ -1915,7 +1916,7 @@ static void tcp_write(grpc_endpoint* ep, grpc_slice_buffer* buf, tcp->write_cb = cb; tcp->current_zerocopy_send = zerocopy_send_record; if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) { - gpr_log(GPR_INFO, "write: delayed"); + LOG(INFO) << "write: delayed"; } notify_on_write(tcp); } else { @@ -2029,7 +2030,7 @@ grpc_endpoint* grpc_tcp_create(grpc_fd* em_fd, if (err == 0) { tcp->tcp_zerocopy_send_ctx.set_enabled(true); } else { - gpr_log(GPR_ERROR, "Failed to set zerocopy options on the socket."); + LOG(ERROR) << "Failed to set zerocopy options on the socket."; } #endif } diff --git a/src/core/lib/security/credentials/jwt/jwt_verifier.cc b/src/core/lib/security/credentials/jwt/jwt_verifier.cc index 0e927aa075d..49cc8e21be1 100644 --- a/src/core/lib/security/credentials/jwt/jwt_verifier.cc +++ b/src/core/lib/security/credentials/jwt/jwt_verifier.cc @@ -42,6 +42,7 @@ #endif #include "absl/log/check.h" +#include "absl/log/log.h" #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/escaping.h" @@ -114,7 +115,7 @@ static const EVP_MD* evp_md_from_alg(const char* alg) { static Json parse_json_part_from_jwt(const char* str, size_t len) { std::string string; if (!absl::WebSafeBase64Unescape(absl::string_view(str, len), &string)) { - gpr_log(GPR_ERROR, "Invalid base64."); + LOG(ERROR) << "Invalid base64."; return Json(); // JSON null } auto json = grpc_core::JsonParse(string); @@ -163,13 +164,13 @@ static jose_header* jose_header_from_json(Json json) { Json::Object::const_iterator it; jose_header* h = grpc_core::Zalloc(); if (json.type() != Json::Type::kObject) { - gpr_log(GPR_ERROR, "JSON value is not an object"); + LOG(ERROR) << "JSON value is not an object"; goto error; } // Check alg field. it = json.object().find("alg"); if (it == json.object().end()) { - gpr_log(GPR_ERROR, "Missing alg field."); + LOG(ERROR) << "Missing alg field."; goto error; } // We only support RSA-1.5 signatures for now. @@ -180,7 +181,7 @@ static jose_header* jose_header_from_json(Json json) { if (it->second.type() != Json::Type::kString || strncmp(alg_value, "RS", 2) != 0 || evp_md_from_alg(alg_value) == nullptr) { - gpr_log(GPR_ERROR, "Invalid alg field"); + LOG(ERROR) << "Invalid alg field"; goto error; } h->alg = alg_value; @@ -319,13 +320,13 @@ grpc_jwt_verifier_status grpc_jwt_claims_check(const grpc_jwt_claims* claims, skewed_now = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), grpc_jwt_verifier_clock_skew); if (gpr_time_cmp(skewed_now, claims->nbf) < 0) { - gpr_log(GPR_ERROR, "JWT is not valid yet."); + LOG(ERROR) << "JWT is not valid yet."; return GRPC_JWT_VERIFIER_TIME_CONSTRAINT_FAILURE; } skewed_now = gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME), grpc_jwt_verifier_clock_skew); if (gpr_time_cmp(skewed_now, claims->exp) > 0) { - gpr_log(GPR_ERROR, "JWT is expired."); + LOG(ERROR) << "JWT is expired."; return GRPC_JWT_VERIFIER_TIME_CONSTRAINT_FAILURE; } @@ -430,7 +431,7 @@ struct grpc_jwt_verifier { static Json json_from_http(const grpc_http_response* response) { if (response == nullptr) { - gpr_log(GPR_ERROR, "HTTP response is NULL."); + LOG(ERROR) << "HTTP response is NULL."; return Json(); // JSON null } if (response->status != 200) { @@ -441,7 +442,7 @@ static Json json_from_http(const grpc_http_response* response) { auto json = grpc_core::JsonParse( absl::string_view(response->body, response->body_length)); if (!json.ok()) { - gpr_log(GPR_ERROR, "Invalid JSON found in response."); + LOG(ERROR) << "Invalid JSON found in response."; return Json(); // JSON null } return std::move(*json); @@ -464,12 +465,12 @@ static EVP_PKEY* extract_pkey_from_x509(const char* x509_str) { BIO_write(bio, x509_str, static_cast(len)); x509 = PEM_read_bio_X509(bio, nullptr, nullptr, nullptr); if (x509 == nullptr) { - gpr_log(GPR_ERROR, "Unable to parse x509 cert."); + LOG(ERROR) << "Unable to parse x509 cert."; goto end; } result = X509_get_pubkey(x509); if (result == nullptr) { - gpr_log(GPR_ERROR, "Cannot find public key in X509 cert."); + LOG(ERROR) << "Cannot find public key in X509 cert."; } end: @@ -482,7 +483,7 @@ static BIGNUM* bignum_from_base64(const char* b64) { if (b64 == nullptr) return nullptr; std::string string; if (!absl::WebSafeBase64Unescape(b64, &string)) { - gpr_log(GPR_ERROR, "Invalid base64 for big num."); + LOG(ERROR) << "Invalid base64 for big num."; return nullptr; } return BN_bin2bn(reinterpret_cast(string.data()), @@ -540,27 +541,27 @@ static EVP_PKEY* pkey_from_jwk(const Json& json, const char* kty) { #if OPENSSL_VERSION_NUMBER < 0x30000000L rsa = RSA_new(); if (rsa == nullptr) { - gpr_log(GPR_ERROR, "Could not create rsa key."); + LOG(ERROR) << "Could not create rsa key."; goto end; } #endif it = json.object().find("n"); if (it == json.object().end()) { - gpr_log(GPR_ERROR, "Missing RSA public key field."); + LOG(ERROR) << "Missing RSA public key field."; goto end; } tmp_n = bignum_from_base64(validate_string_field(it->second, "n")); if (tmp_n == nullptr) goto end; it = json.object().find("e"); if (it == json.object().end()) { - gpr_log(GPR_ERROR, "Missing RSA public key field."); + LOG(ERROR) << "Missing RSA public key field."; goto end; } tmp_e = bignum_from_base64(validate_string_field(it->second, "e")); if (tmp_e == nullptr) goto end; #if OPENSSL_VERSION_NUMBER < 0x30000000L if (!RSA_set0_key(rsa, tmp_n, tmp_e, nullptr)) { - gpr_log(GPR_ERROR, "Cannot set RSA key from inputs."); + LOG(ERROR) << "Cannot set RSA key from inputs."; goto end; } // RSA_set0_key takes ownership on success. @@ -573,21 +574,21 @@ static EVP_PKEY* pkey_from_jwk(const Json& json, const char* kty) { if (!OSSL_PARAM_BLD_push_BN(bld, "n", tmp_n) || !OSSL_PARAM_BLD_push_BN(bld, "e", tmp_e) || (params = OSSL_PARAM_BLD_to_param(bld)) == NULL) { - gpr_log(GPR_ERROR, "Could not create OSSL_PARAM"); + LOG(ERROR) << "Could not create OSSL_PARAM"; goto end; } ctx = EVP_PKEY_CTX_new_from_name(nullptr, "RSA", nullptr); if (ctx == nullptr) { - gpr_log(GPR_ERROR, "Could not create rsa key."); + LOG(ERROR) << "Could not create rsa key."; goto end; } if (EVP_PKEY_fromdata_init(ctx) <= 0) { - gpr_log(GPR_ERROR, "Could not create rsa key."); + LOG(ERROR) << "Could not create rsa key."; goto end; } if (EVP_PKEY_fromdata(ctx, &result, EVP_PKEY_KEYPAIR, params) <= 0) { - gpr_log(GPR_ERROR, "Cannot set RSA key from inputs."); + LOG(ERROR) << "Cannot set RSA key from inputs."; goto end; } #endif @@ -618,8 +619,7 @@ static EVP_PKEY* find_verification_key(const Json& json, const char* header_alg, return extract_pkey_from_x509(cur->string().c_str()); } if (jwt_keys->type() != Json::Type::kArray) { - gpr_log(GPR_ERROR, - "Unexpected value type of keys property in jwks key set."); + LOG(ERROR) << "Unexpected value type of keys property in jwks key set."; return nullptr; } // Key format is specified in: @@ -661,21 +661,21 @@ static int verify_jwt_signature(EVP_PKEY* key, const char* alg, CHECK_NE(md, nullptr); // Checked before. if (md_ctx == nullptr) { - gpr_log(GPR_ERROR, "Could not create EVP_MD_CTX."); + LOG(ERROR) << "Could not create EVP_MD_CTX."; goto end; } if (EVP_DigestVerifyInit(md_ctx, nullptr, md, nullptr, key) != 1) { - gpr_log(GPR_ERROR, "EVP_DigestVerifyInit failed."); + LOG(ERROR) << "EVP_DigestVerifyInit failed."; goto end; } if (EVP_DigestVerifyUpdate(md_ctx, GRPC_SLICE_START_PTR(signed_data), GRPC_SLICE_LENGTH(signed_data)) != 1) { - gpr_log(GPR_ERROR, "EVP_DigestVerifyUpdate failed."); + LOG(ERROR) << "EVP_DigestVerifyUpdate failed."; goto end; } if (EVP_DigestVerifyFinal(md_ctx, GRPC_SLICE_START_PTR(signature), GRPC_SLICE_LENGTH(signature)) != 1) { - gpr_log(GPR_ERROR, "JWT signature verification failed."); + LOG(ERROR) << "JWT signature verification failed."; goto end; } @@ -742,7 +742,7 @@ static void on_openid_config_retrieved(void* user_data, if (json.type() == Json::Type::kNull) goto error; cur = find_property_by_name(json, "jwks_uri"); if (cur == nullptr) { - gpr_log(GPR_ERROR, "Could not find jwks_uri in openid config."); + LOG(ERROR) << "Could not find jwks_uri in openid config."; goto error; } jwks_uri = validate_string_field(*cur, "jwks_uri"); @@ -843,11 +843,11 @@ static void retrieve_key_and_verify(verifier_cb_ctx* ctx) { CHECK(ctx != nullptr && ctx->header != nullptr && ctx->claims != nullptr); iss = ctx->claims->iss; if (ctx->header->kid == nullptr) { - gpr_log(GPR_ERROR, "Missing kid in jose header."); + LOG(ERROR) << "Missing kid in jose header."; goto error; } if (iss == nullptr) { - gpr_log(GPR_ERROR, "Missing iss in claims."); + LOG(ERROR) << "Missing iss in claims."; goto error; } @@ -862,7 +862,7 @@ static void retrieve_key_and_verify(verifier_cb_ctx* ctx) { CHECK_NE(ctx->verifier, nullptr); mapping = verifier_get_mapping(ctx->verifier, email_domain); if (mapping == nullptr) { - gpr_log(GPR_ERROR, "Missing mapping for issuer email."); + LOG(ERROR) << "Missing mapping for issuer email."; goto error; } host = gpr_strdup(mapping->key_url_prefix); diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc index 4c425b87470..6d2457dba2d 100644 --- a/src/core/lib/surface/call.cc +++ b/src/core/lib/surface/call.cc @@ -34,6 +34,7 @@ #include "absl/base/thread_annotations.h" #include "absl/log/check.h" +#include "absl/log/log.h" #include "absl/status/status.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" @@ -1138,8 +1139,7 @@ void FilterStackCall::RecvTrailingFilter(grpc_metadata_batch* b, } else if (!is_client()) { SetFinalStatus(absl::OkStatus()); } else { - gpr_log(GPR_DEBUG, - "Received trailing metadata with no error and no status"); + VLOG(2) << "Received trailing metadata with no error and no status"; SetFinalStatus(grpc_error_set_int(GRPC_ERROR_CREATE("No status received"), StatusIntProperty::kRpcStatus, GRPC_STATUS_UNKNOWN)); diff --git a/src/core/load_balancing/xds/xds_override_host.cc b/src/core/load_balancing/xds/xds_override_host.cc index c8821ca0a91..41b3eb36ef6 100644 --- a/src/core/load_balancing/xds/xds_override_host.cc +++ b/src/core/load_balancing/xds/xds_override_host.cc @@ -32,6 +32,7 @@ #include "absl/base/thread_annotations.h" #include "absl/functional/function_ref.h" #include "absl/log/check.h" +#include "absl/log/log.h" #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/str_cat.h" @@ -530,7 +531,7 @@ XdsOverrideHostLb::Picker::PickOverridenHost( // a connection attempt and queue the pick until that attempt completes. if (idle_subchannel != nullptr) { if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) { - gpr_log(GPR_INFO, "Picker override found IDLE subchannel"); + LOG(INFO) << "Picker override found IDLE subchannel"; } // Deletes itself after the connection is requested. new SubchannelConnectionRequester(std::move(idle_subchannel)); @@ -540,7 +541,7 @@ XdsOverrideHostLb::Picker::PickOverridenHost( // queue the pick and wait for the connection attempt to complete. if (found_connecting) { if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) { - gpr_log(GPR_INFO, "Picker override found CONNECTING subchannel"); + LOG(INFO) << "Picker override found CONNECTING subchannel"; } return PickResult::Queue(); } @@ -549,7 +550,7 @@ XdsOverrideHostLb::Picker::PickOverridenHost( // creation of a subchannel for that entry. if (!address_with_no_subchannel.empty()) { if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_override_host_trace)) { - gpr_log(GPR_INFO, "Picker override found entry with no subchannel"); + LOG(INFO) << "Picker override found entry with no subchannel"; } if (!IsWorkSerializerDispatchEnabled()) { new SubchannelCreationRequester(policy_, address_with_no_subchannel); diff --git a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc index 11849b655b8..fa22ca884b7 100644 --- a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +++ b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc @@ -23,6 +23,7 @@ #include #include "absl/log/check.h" +#include "absl/log/log.h" #include "upb/mem/arena.hpp" #include @@ -87,7 +88,7 @@ typedef struct alts_tsi_handshaker_result { static tsi_result handshaker_result_extract_peer( const tsi_handshaker_result* self, tsi_peer* peer) { if (self == nullptr || peer == nullptr) { - gpr_log(GPR_ERROR, "Invalid argument to handshaker_result_extract_peer()"); + LOG(ERROR) << "Invalid argument to handshaker_result_extract_peer()"; return TSI_INVALID_ARGUMENT; } alts_tsi_handshaker_result* result = @@ -97,7 +98,7 @@ static tsi_result handshaker_result_extract_peer( tsi_result ok = tsi_construct_peer(kTsiAltsNumOfPeerProperties, peer); int index = 0; if (ok != TSI_OK) { - gpr_log(GPR_ERROR, "Failed to construct tsi peer"); + LOG(ERROR) << "Failed to construct tsi peer"; return ok; } CHECK_NE(&peer->properties[index], nullptr); @@ -106,7 +107,7 @@ static tsi_result handshaker_result_extract_peer( &peer->properties[index]); if (ok != TSI_OK) { tsi_peer_destruct(peer); - gpr_log(GPR_ERROR, "Failed to set tsi peer property"); + LOG(ERROR) << "Failed to set tsi peer property"; return ok; } index++; @@ -116,7 +117,7 @@ static tsi_result handshaker_result_extract_peer( &peer->properties[index]); if (ok != TSI_OK) { tsi_peer_destruct(peer); - gpr_log(GPR_ERROR, "Failed to set tsi peer property"); + LOG(ERROR) << "Failed to set tsi peer property"; } index++; CHECK_NE(&peer->properties[index], nullptr); @@ -126,7 +127,7 @@ static tsi_result handshaker_result_extract_peer( GRPC_SLICE_LENGTH(result->rpc_versions), &peer->properties[index]); if (ok != TSI_OK) { tsi_peer_destruct(peer); - gpr_log(GPR_ERROR, "Failed to set tsi peer property"); + LOG(ERROR) << "Failed to set tsi peer property"; } index++; CHECK_NE(&peer->properties[index], nullptr); @@ -136,7 +137,7 @@ static tsi_result handshaker_result_extract_peer( GRPC_SLICE_LENGTH(result->serialized_context), &peer->properties[index]); if (ok != TSI_OK) { tsi_peer_destruct(peer); - gpr_log(GPR_ERROR, "Failed to set tsi peer property"); + LOG(ERROR) << "Failed to set tsi peer property"; } index++; CHECK_NE(&peer->properties[index], nullptr); @@ -146,7 +147,7 @@ static tsi_result handshaker_result_extract_peer( &peer->properties[index]); if (ok != TSI_OK) { tsi_peer_destruct(peer); - gpr_log(GPR_ERROR, "Failed to set tsi peer property"); + LOG(ERROR) << "Failed to set tsi peer property"; } CHECK(++index == kTsiAltsNumOfPeerProperties); return ok; @@ -163,8 +164,7 @@ static tsi_result handshaker_result_create_zero_copy_grpc_protector( const tsi_handshaker_result* self, size_t* max_output_protected_frame_size, tsi_zero_copy_grpc_protector** protector) { if (self == nullptr || protector == nullptr) { - gpr_log(GPR_ERROR, - "Invalid arguments to create_zero_copy_grpc_protector()"); + LOG(ERROR) << "Invalid arguments to create_zero_copy_grpc_protector()"; return TSI_INVALID_ARGUMENT; } alts_tsi_handshaker_result* result = @@ -198,7 +198,7 @@ static tsi_result handshaker_result_create_zero_copy_grpc_protector( /*is_integrity_only=*/false, /*enable_extra_copy=*/false, max_output_protected_frame_size, protector); if (ok != TSI_OK) { - gpr_log(GPR_ERROR, "Failed to create zero-copy grpc protector"); + LOG(ERROR) << "Failed to create zero-copy grpc protector"; } return ok; } @@ -207,8 +207,8 @@ static tsi_result handshaker_result_create_frame_protector( const tsi_handshaker_result* self, size_t* max_output_protected_frame_size, tsi_frame_protector** protector) { if (self == nullptr || protector == nullptr) { - gpr_log(GPR_ERROR, - "Invalid arguments to handshaker_result_create_frame_protector()"); + LOG(ERROR) + << "Invalid arguments to handshaker_result_create_frame_protector()"; return TSI_INVALID_ARGUMENT; } alts_tsi_handshaker_result* result = @@ -219,7 +219,7 @@ static tsi_result handshaker_result_create_frame_protector( kAltsAes128GcmRekeyKeyLength, result->is_client, /*is_rekey=*/true, max_output_protected_frame_size, protector); if (ok != TSI_OK) { - gpr_log(GPR_ERROR, "Failed to create frame protector"); + LOG(ERROR) << "Failed to create frame protector"; } return ok; } @@ -228,8 +228,7 @@ static tsi_result handshaker_result_get_unused_bytes( const tsi_handshaker_result* self, const unsigned char** bytes, size_t* bytes_size) { if (self == nullptr || bytes == nullptr || bytes_size == nullptr) { - gpr_log(GPR_ERROR, - "Invalid arguments to handshaker_result_get_unused_bytes()"); + LOG(ERROR) << "Invalid arguments to handshaker_result_get_unused_bytes()"; return TSI_INVALID_ARGUMENT; } alts_tsi_handshaker_result* result = @@ -267,7 +266,7 @@ tsi_result alts_tsi_handshaker_result_create(grpc_gcp_HandshakerResp* resp, bool is_client, tsi_handshaker_result** result) { if (result == nullptr || resp == nullptr) { - gpr_log(GPR_ERROR, "Invalid arguments to create_handshaker_result()"); + LOG(ERROR) << "Invalid arguments to create_handshaker_result()"; return TSI_INVALID_ARGUMENT; } const grpc_gcp_HandshakerResult* hresult = @@ -275,42 +274,42 @@ tsi_result alts_tsi_handshaker_result_create(grpc_gcp_HandshakerResp* resp, const grpc_gcp_Identity* identity = grpc_gcp_HandshakerResult_peer_identity(hresult); if (identity == nullptr) { - gpr_log(GPR_ERROR, "Invalid identity"); + LOG(ERROR) << "Invalid identity"; return TSI_FAILED_PRECONDITION; } upb_StringView peer_service_account = grpc_gcp_Identity_service_account(identity); if (peer_service_account.size == 0) { - gpr_log(GPR_ERROR, "Invalid peer service account"); + LOG(ERROR) << "Invalid peer service account"; return TSI_FAILED_PRECONDITION; } upb_StringView key_data = grpc_gcp_HandshakerResult_key_data(hresult); if (key_data.size < kAltsAes128GcmRekeyKeyLength) { - gpr_log(GPR_ERROR, "Bad key length"); + LOG(ERROR) << "Bad key length"; return TSI_FAILED_PRECONDITION; } const grpc_gcp_RpcProtocolVersions* peer_rpc_version = grpc_gcp_HandshakerResult_peer_rpc_versions(hresult); if (peer_rpc_version == nullptr) { - gpr_log(GPR_ERROR, "Peer does not set RPC protocol versions."); + LOG(ERROR) << "Peer does not set RPC protocol versions."; return TSI_FAILED_PRECONDITION; } upb_StringView application_protocol = grpc_gcp_HandshakerResult_application_protocol(hresult); if (application_protocol.size == 0) { - gpr_log(GPR_ERROR, "Invalid application protocol"); + LOG(ERROR) << "Invalid application protocol"; return TSI_FAILED_PRECONDITION; } upb_StringView record_protocol = grpc_gcp_HandshakerResult_record_protocol(hresult); if (record_protocol.size == 0) { - gpr_log(GPR_ERROR, "Invalid record protocol"); + LOG(ERROR) << "Invalid record protocol"; return TSI_FAILED_PRECONDITION; } const grpc_gcp_Identity* local_identity = grpc_gcp_HandshakerResult_local_identity(hresult); if (local_identity == nullptr) { - gpr_log(GPR_ERROR, "Invalid local identity"); + LOG(ERROR) << "Invalid local identity"; return TSI_FAILED_PRECONDITION; } upb_StringView local_service_account = @@ -331,7 +330,7 @@ tsi_result alts_tsi_handshaker_result_create(grpc_gcp_HandshakerResp* resp, bool serialized = grpc_gcp_rpc_protocol_versions_encode( peer_rpc_version, rpc_versions_arena.ptr(), &sresult->rpc_versions); if (!serialized) { - gpr_log(GPR_ERROR, "Failed to serialize peer's RPC protocol versions."); + LOG(ERROR) << "Failed to serialize peer's RPC protocol versions."; return TSI_FAILED_PRECONDITION; } upb::Arena context_arena; @@ -348,7 +347,7 @@ tsi_result alts_tsi_handshaker_result_create(grpc_gcp_HandshakerResp* resp, context, const_cast(peer_rpc_version)); grpc_gcp_Identity* peer_identity = const_cast(identity); if (peer_identity == nullptr) { - gpr_log(GPR_ERROR, "Null peer identity in ALTS context."); + LOG(ERROR) << "Null peer identity in ALTS context."; return TSI_FAILED_PRECONDITION; } if (grpc_gcp_Identity_attributes_size(identity) != 0) { @@ -372,7 +371,7 @@ tsi_result alts_tsi_handshaker_result_create(grpc_gcp_HandshakerResp* resp, char* serialized_ctx = grpc_gcp_AltsContext_serialize( context, context_arena.ptr(), &serialized_ctx_length); if (serialized_ctx == nullptr) { - gpr_log(GPR_ERROR, "Failed to serialize peer's ALTS context."); + LOG(ERROR) << "Failed to serialize peer's ALTS context."; return TSI_FAILED_PRECONDITION; } sresult->serialized_context = @@ -388,7 +387,7 @@ static void on_handshaker_service_resp_recv(void* arg, grpc_error_handle error) { alts_handshaker_client* client = static_cast(arg); if (client == nullptr) { - gpr_log(GPR_ERROR, "ALTS handshaker client is nullptr"); + LOG(ERROR) << "ALTS handshaker client is nullptr"; return; } bool success = true; @@ -440,7 +439,7 @@ static tsi_result alts_tsi_handshaker_continue_handshaker_next( handshaker->client_vtable_for_testing, handshaker->is_client, handshaker->max_frame_size, error); if (client == nullptr) { - gpr_log(GPR_ERROR, "Failed to create ALTS handshaker client"); + LOG(ERROR) << "Failed to create ALTS handshaker client"; if (error != nullptr) *error = "Failed to create ALTS handshaker client"; return TSI_FAILED_PRECONDITION; } @@ -449,7 +448,7 @@ static tsi_result alts_tsi_handshaker_continue_handshaker_next( CHECK_EQ(handshaker->client, nullptr); handshaker->client = client; if (handshaker->shutdown) { - gpr_log(GPR_INFO, "TSI handshake shutdown"); + LOG(INFO) << "TSI handshake shutdown"; if (error != nullptr) *error = "TSI handshaker shutdown"; return TSI_HANDSHAKE_SHUTDOWN; } @@ -529,7 +528,7 @@ static tsi_result handshaker_next( size_t* /*bytes_to_send_size*/, tsi_handshaker_result** /*result*/, tsi_handshaker_on_next_done_cb cb, void* user_data, std::string* error) { if (self == nullptr || cb == nullptr) { - gpr_log(GPR_ERROR, "Invalid arguments to handshaker_next()"); + LOG(ERROR) << "Invalid arguments to handshaker_next()"; if (error != nullptr) *error = "invalid argument"; return TSI_INVALID_ARGUMENT; } @@ -538,7 +537,7 @@ static tsi_result handshaker_next( { grpc_core::MutexLock lock(&handshaker->mu); if (handshaker->shutdown) { - gpr_log(GPR_INFO, "TSI handshake shutdown"); + LOG(INFO) << "TSI handshake shutdown"; if (error != nullptr) *error = "handshake shutdown"; return TSI_HANDSHAKE_SHUTDOWN; } @@ -569,7 +568,7 @@ static tsi_result handshaker_next( tsi_result ok = alts_tsi_handshaker_continue_handshaker_next( handshaker, received_bytes, received_bytes_size, cb, user_data, error); if (ok != TSI_OK) { - gpr_log(GPR_ERROR, "Failed to schedule ALTS handshaker requests"); + LOG(ERROR) << "Failed to schedule ALTS handshaker requests"; return ok; } } @@ -651,7 +650,7 @@ tsi_result alts_tsi_handshaker_create( size_t user_specified_max_frame_size) { if (handshaker_service_url == nullptr || self == nullptr || options == nullptr || (is_client && target_name == nullptr)) { - gpr_log(GPR_ERROR, "Invalid arguments to alts_tsi_handshaker_create()"); + LOG(ERROR) << "Invalid arguments to alts_tsi_handshaker_create()"; return TSI_INVALID_ARGUMENT; } bool use_dedicated_cq = interested_parties == nullptr; From 1da5aaf8550bf0b1908dbee7bf5d4a1ebe8113e5 Mon Sep 17 00:00:00 2001 From: Tanvi Jagtap <139093547+tanvi-jagtap@users.noreply.github.com> Date: Mon, 13 May 2024 03:18:46 -0700 Subject: [PATCH 05/10] [grpc][Gpr_To_Absl_Logging] Migrating from gpr to absl logging - BUILD (#36588) [grpc][Gpr_To_Absl_Logging] Migrating from gpr to absl logging - BUILD In this CL we are just editing the build and bzl files to add dependencies. This is done to prevent merge conflict and constantly having to re-make the make files using generate_projects.sh for each set of changes. Closes #36588 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/36588 from tanvi-jagtap:build_src_cpp 1b7e617bdd93f2680ae7c41995d67113b5278a99 PiperOrigin-RevId: 633149794 --- src/cpp/ext/csm/BUILD | 1 + src/cpp/ext/gcp/BUILD | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/cpp/ext/csm/BUILD b/src/cpp/ext/csm/BUILD index fda0e37dbe8..6ee6bef1d4a 100644 --- a/src/cpp/ext/csm/BUILD +++ b/src/cpp/ext/csm/BUILD @@ -42,6 +42,7 @@ grpc_cc_library( external_deps = [ "absl/functional:any_invocable", "absl/log:check", + "absl/log:log", "absl/status:statusor", "absl/strings", "absl/types:optional", diff --git a/src/cpp/ext/gcp/BUILD b/src/cpp/ext/gcp/BUILD index a95fe68b71c..814bf9012a2 100644 --- a/src/cpp/ext/gcp/BUILD +++ b/src/cpp/ext/gcp/BUILD @@ -115,6 +115,7 @@ grpc_cc_library( ], external_deps = [ "absl/base:core_headers", + "absl/log:log", "absl/numeric:int128", "absl/strings", "absl/strings:str_format", @@ -157,6 +158,7 @@ grpc_cc_library( "absl/container:flat_hash_map", "absl/functional:any_invocable", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/types:optional", From 28b4fafc002cd9c454caa62193e339fdddc25f61 Mon Sep 17 00:00:00 2001 From: Tanvi Jagtap <139093547+tanvi-jagtap@users.noreply.github.com> Date: Mon, 13 May 2024 03:28:10 -0700 Subject: [PATCH 06/10] [grpc][Gpr_To_Absl_Logging] Migrating from gpr to absl logging - BUILD (#36593) [grpc][Gpr_To_Absl_Logging] Migrating from gpr to absl logging - BUILD In this CL we are just editing the build and bzl files to add dependencies. This is done to prevent merge conflict and constantly having to re-make the make files using generate_projects.sh for each set of changes. Closes #36593 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/36593 from tanvi-jagtap:build_src_core_ext_transport d73925c0f1a0b1c65cee851ca7497afdf35e7fbe PiperOrigin-RevId: 633151530 --- src/core/ext/transport/cronet/BUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/ext/transport/cronet/BUILD b/src/core/ext/transport/cronet/BUILD index 50897682381..1e7e8253e62 100644 --- a/src/core/ext/transport/cronet/BUILD +++ b/src/core/ext/transport/cronet/BUILD @@ -41,6 +41,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "cronet_c_for_grpc", ], language = "c++", From 766226814a8746e1418051b3d876a49a448d607b Mon Sep 17 00:00:00 2001 From: Tanvi Jagtap <139093547+tanvi-jagtap@users.noreply.github.com> Date: Mon, 13 May 2024 03:34:24 -0700 Subject: [PATCH 07/10] [grpc][Gpr_To_Absl_Logging] Migrating from gpr to absl logging - BUILD (#36592) [grpc][Gpr_To_Absl_Logging] Migrating from gpr to absl logging - BUILD In this CL we are just editing the build and bzl files to add dependencies. This is done to prevent merge conflict and constantly having to re-make the make files using generate_projects.sh for each set of changes. Closes #36592 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/36592 from tanvi-jagtap:build_src_core b36408ae0ebe291352db60a8e0b12fef95046587 PiperOrigin-RevId: 633152985 --- src/core/BUILD | 125 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 120 insertions(+), 5 deletions(-) diff --git a/src/core/BUILD b/src/core/BUILD index b15bf14f933..babf6143381 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -216,6 +216,7 @@ grpc_cc_library( external_deps = [ "absl/functional:any_invocable", "absl/log:check", + "absl/log:log", "absl/strings", ], language = "c++", @@ -414,6 +415,7 @@ grpc_cc_library( "lib/gprpp/validation_errors.h", ], external_deps = [ + "absl/log:log", "absl/status", "absl/strings", ], @@ -530,7 +532,10 @@ grpc_cc_library( grpc_cc_library( name = "map_pipe", - external_deps = ["absl/status"], + external_deps = [ + "absl/log:log", + "absl/status", + ], language = "c++", public_hdrs = [ "lib/promise/map_pipe.h", @@ -559,6 +564,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/log:check", + "absl/log:log", "absl/strings", "absl/strings:str_format", ], @@ -1003,6 +1009,7 @@ grpc_cc_library( name = "latch", external_deps = [ "absl/log:check", + "absl/log:log", "absl/strings", ], language = "c++", @@ -1021,6 +1028,7 @@ grpc_cc_library( name = "inter_activity_latch", external_deps = [ "absl/base:core_headers", + "absl/log:log", "absl/strings", ], language = "c++", @@ -1043,6 +1051,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/strings", "absl/strings:str_format", "absl/types:optional", @@ -1066,6 +1075,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/strings", "absl/types:optional", "absl/types:variant", @@ -1177,6 +1187,7 @@ grpc_cc_library( name = "for_each", external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/strings", ], @@ -1199,6 +1210,7 @@ grpc_cc_library( name = "ref_counted", external_deps = [ "absl/log:check", + "absl/log:log", ], language = "c++", public_hdrs = ["lib/gprpp/ref_counted.h"], @@ -1215,6 +1227,7 @@ grpc_cc_library( name = "dual_ref_counted", external_deps = [ "absl/log:check", + "absl/log:log", ], language = "c++", public_hdrs = ["lib/gprpp/dual_ref_counted.h"], @@ -1410,6 +1423,7 @@ grpc_cc_library( "absl/base:core_headers", "absl/container:flat_hash_set", "absl/log:check", + "absl/log:log", "absl/status", "absl/strings", "absl/types:optional", @@ -1460,6 +1474,9 @@ grpc_cc_library( hdrs = [ "lib/resource_quota/arena.h", ], + external_deps = [ + "absl/log:log", + ], visibility = [ "@grpc:alt_grpc_base_legacy", ], @@ -1559,6 +1576,9 @@ grpc_cc_library( hdrs = [ "lib/slice/slice_refcount.h", ], + external_deps = [ + "absl/log:log", + ], public_hdrs = [ "//:include/grpc/slice.h", ], @@ -1626,6 +1646,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/strings:str_format", ], @@ -1653,6 +1674,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/strings:str_format", ], visibility = ["@grpc:alt_grpc_base_legacy"], @@ -1674,6 +1696,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/strings:str_format", "absl/types:optional", ], @@ -1755,6 +1778,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", ], deps = [ "//:config_vars", @@ -1904,6 +1928,7 @@ grpc_cc_library( "absl/container:flat_hash_set", "absl/functional:any_invocable", "absl/log:check", + "absl/log:log", "absl/time", "absl/types:optional", ], @@ -1954,6 +1979,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/log:check", + "absl/log:log", "absl/time", "absl/types:optional", ], @@ -2111,6 +2137,7 @@ grpc_cc_library( "absl/container:inlined_vector", "absl/functional:function_ref", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -2217,6 +2244,7 @@ grpc_cc_library( ], external_deps = [ "absl/functional:any_invocable", + "absl/log:log", "absl/status", "absl/types:optional", ], @@ -2241,6 +2269,7 @@ grpc_cc_library( "absl/functional:any_invocable", "absl/hash", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -2302,6 +2331,7 @@ grpc_cc_library( external_deps = [ "absl/cleanup", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -2334,6 +2364,7 @@ grpc_cc_library( external_deps = [ "absl/cleanup", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -2361,6 +2392,7 @@ grpc_cc_library( "absl/base:core_headers", "absl/functional:any_invocable", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -2397,6 +2429,7 @@ grpc_cc_library( "absl/functional:any_invocable", "absl/hash", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -2439,6 +2472,7 @@ grpc_cc_library( hdrs = ["lib/event_engine/windows/windows_engine.h"], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -2493,6 +2527,7 @@ grpc_cc_library( "absl/base:core_headers", "absl/functional:any_invocable", "absl/log:check", + "absl/log:log", "absl/status", "absl/strings:str_format", ], @@ -2522,6 +2557,7 @@ grpc_cc_library( "absl/cleanup", "absl/functional:any_invocable", "absl/log:check", + "absl/log:log", "absl/status", "absl/strings:str_format", ], @@ -2550,6 +2586,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings:str_format", @@ -2584,6 +2621,7 @@ grpc_cc_library( external_deps = [ "absl/container:flat_hash_map", "absl/log:check", + "absl/log:log", "absl/strings", "absl/strings:str_format", ], @@ -2618,6 +2656,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -2644,6 +2683,9 @@ grpc_cc_library( hdrs = [ "lib/event_engine/trace.h", ], + external_deps = [ + "absl/log:log", + ], deps = [ "//:gpr", "//:gpr_platform", @@ -2834,6 +2876,7 @@ grpc_cc_library( "absl/functional:any_invocable", "absl/hash", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -2890,6 +2933,7 @@ grpc_cc_library( hdrs = ["lib/transport/bdp_estimator.h"], external_deps = [ "absl/log:check", + "absl/log:log", "absl/strings", ], deps = [ @@ -3075,6 +3119,7 @@ grpc_cc_library( external_deps = [ "absl/functional:any_invocable", "absl/log:check", + "absl/log:log", "absl/strings", "absl/types:optional", ], @@ -3151,7 +3196,10 @@ grpc_cc_library( hdrs = [ "service_config/service_config_parser.h", ], - external_deps = ["absl/strings"], + external_deps = [ + "absl/log:log", + "absl/strings", + ], language = "c++", deps = [ "channel_args", @@ -3180,6 +3228,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/meta:type_traits", "absl/strings", "absl/strings:str_format", @@ -3355,6 +3404,7 @@ grpc_cc_library( "client_channel/retry_service_config.h", ], external_deps = [ + "absl/log:log", "absl/strings", "absl/types:optional", ], @@ -3405,6 +3455,7 @@ grpc_cc_library( "client_channel/backup_poller.h", ], external_deps = [ + "absl/log:log", "absl/status", ], language = "c++", @@ -3428,6 +3479,7 @@ grpc_cc_library( "service_config/service_config_channel_arg_filter.cc", ], external_deps = [ + "absl/log:log", "absl/status", "absl/status:statusor", "absl/types:optional", @@ -3514,6 +3566,7 @@ grpc_cc_library( hdrs = ["load_balancing/lb_policy_registry.h"], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -3624,6 +3677,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -3763,6 +3817,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/strings", ], deps = [ @@ -3810,6 +3865,7 @@ grpc_cc_library( "lib/security/authorization/grpc_server_authz_filter.h", ], external_deps = [ + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -3852,6 +3908,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/container:flat_hash_map", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -3885,6 +3942,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -3965,6 +4023,9 @@ grpc_cc_library( hdrs = [ "tsi/local_transport_security.h", ], + external_deps = [ + "absl/log:log", + ], language = "c++", deps = [ "//:event_engine_base_hdrs", @@ -3986,6 +4047,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -4033,6 +4095,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/strings", "absl/strings:str_format", @@ -4078,6 +4141,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status:statusor", "absl/strings", "absl/types:optional", @@ -4160,6 +4224,7 @@ grpc_cc_library( "absl/container:inlined_vector", "absl/functional:bind_front", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -4246,6 +4311,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -4308,6 +4374,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -4354,6 +4421,7 @@ grpc_cc_library( "lib/http/httpcli_ssl_credentials.h", ], external_deps = [ + "absl/log:log", "absl/status", "absl/strings", "absl/types:optional", @@ -4428,6 +4496,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -4578,6 +4647,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/log:check", + "absl/log:log", "absl/meta:type_traits", "absl/random", "absl/status", @@ -4659,6 +4729,7 @@ grpc_cc_library( "ext/filters/message_size/message_size_filter.h", ], external_deps = [ + "absl/log:log", "absl/status:statusor", "absl/strings", "absl/strings:str_format", @@ -4707,6 +4778,7 @@ grpc_cc_library( ], external_deps = [ "absl/base:core_headers", + "absl/log:log", "absl/meta:type_traits", "absl/random", "absl/status", @@ -5099,6 +5171,7 @@ grpc_cc_library( "absl/cleanup", "absl/functional:bind_front", "absl/log:check", + "absl/log:log", "absl/memory", "absl/random", "absl/status", @@ -5283,6 +5356,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -5361,6 +5435,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -5421,6 +5496,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -5471,6 +5547,7 @@ grpc_cc_library( "load_balancing/xds/xds_cluster_manager.cc", ], external_deps = [ + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -5514,6 +5591,7 @@ grpc_cc_library( "load_balancing/xds/xds_wrr_locality.cc", ], external_deps = [ + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -5583,6 +5661,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -5630,6 +5709,7 @@ grpc_cc_library( external_deps = [ "absl/functional:function_ref", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/types:optional", @@ -5754,7 +5834,10 @@ grpc_cc_library( hdrs = [ "lib/transport/connectivity_state.h", ], - external_deps = ["absl/status"], + external_deps = [ + "absl/log:log", + "absl/status", + ], deps = [ "closure", "error", @@ -5789,6 +5872,7 @@ grpc_cc_library( "absl/base:core_headers", "absl/container:inlined_vector", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -5839,6 +5923,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/meta:type_traits", "absl/random", "absl/status", @@ -6013,6 +6098,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -6061,6 +6147,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/log:check", + "absl/log:log", "absl/meta:type_traits", "absl/random", "absl/status", @@ -6172,6 +6259,7 @@ grpc_cc_library( ], external_deps = [ "absl/container:inlined_vector", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -6216,6 +6304,7 @@ grpc_cc_library( "ext/filters/backend_metrics/backend_metric_filter.h", ], external_deps = [ + "absl/log:log", "absl/status:statusor", "absl/strings", "absl/types:optional", @@ -6256,6 +6345,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -6320,6 +6410,7 @@ grpc_cc_library( "absl/base:core_headers", "absl/cleanup", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -6361,7 +6452,10 @@ grpc_cc_library( hdrs = [ "resolver/dns/dns_resolver_plugin.h", ], - external_deps = ["absl/strings"], + external_deps = [ + "absl/log:log", + "absl/strings", + ], language = "c++", deps = [ "experiments", @@ -6385,6 +6479,7 @@ grpc_cc_library( ], external_deps = [ "absl/functional:bind_front", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -6418,6 +6513,7 @@ grpc_cc_library( "resolver/sockaddr/sockaddr_resolver.cc", ], external_deps = [ + "absl/log:log", "absl/status:statusor", "absl/strings", ], @@ -6442,6 +6538,7 @@ grpc_cc_library( "resolver/binder/binder_resolver.cc", ], external_deps = [ + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -6503,6 +6600,7 @@ grpc_cc_library( "absl/container:flat_hash_map", "absl/container:flat_hash_set", "absl/log:check", + "absl/log:log", "absl/strings", ], language = "c++", @@ -6526,6 +6624,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/meta:type_traits", "absl/random", "absl/status", @@ -6587,6 +6686,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status:statusor", "absl/strings", "absl/types:optional", @@ -6654,6 +6754,7 @@ grpc_cc_library( external_deps = [ "absl/functional:function_ref", "absl/log:check", + "absl/log:log", "absl/status", "absl/strings", "absl/strings:str_format", @@ -6848,6 +6949,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings:str_format", @@ -6905,6 +7007,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -6966,6 +7069,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -7091,6 +7195,7 @@ grpc_cc_library( external_deps = [ "absl/functional:any_invocable", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -7144,6 +7249,7 @@ grpc_cc_library( "ext/filters/logging/logging_filter.h", ], external_deps = [ + "absl/log:log", "absl/numeric:int128", "absl/random", "absl/random:distributions", @@ -7222,7 +7328,10 @@ grpc_cc_library( hdrs = [ "ext/transport/chaotic_good/chaotic_good_transport.h", ], - external_deps = ["absl/random"], + external_deps = [ + "absl/log:log", + "absl/random", + ], language = "c++", deps = [ "chaotic_good_frame", @@ -7251,6 +7360,7 @@ grpc_cc_library( "absl/base:core_headers", "absl/container:flat_hash_map", "absl/log:check", + "absl/log:log", "absl/random", "absl/random:bit_gen_ref", "absl/status", @@ -7309,6 +7419,7 @@ grpc_cc_library( "absl/container:flat_hash_map", "absl/functional:any_invocable", "absl/log:check", + "absl/log:log", "absl/random", "absl/random:bit_gen_ref", "absl/status", @@ -7394,6 +7505,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", ], deps = [ "call_final_info", @@ -7504,6 +7616,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", ], deps = [ "1999", @@ -7641,6 +7754,7 @@ grpc_cc_library( external_deps = [ "absl/container:flat_hash_map", "absl/log:check", + "absl/log:log", "absl/random", "absl/random:bit_gen_ref", "absl/status", @@ -7706,6 +7820,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/random", "absl/random:bit_gen_ref", "absl/status", From 88ed4299f9911b4391d91c19bf76ef02055a7b24 Mon Sep 17 00:00:00 2001 From: Tanvi Jagtap <139093547+tanvi-jagtap@users.noreply.github.com> Date: Mon, 13 May 2024 07:22:27 -0700 Subject: [PATCH 08/10] [grpc][Gpr_To_Absl_Logging] Migrating from gpr to absl logging - BUILD (#36587) [grpc][Gpr_To_Absl_Logging] Migrating from gpr to absl logging - BUILD In this CL we are just editing the build and bzl files to add dependencies. This is done to prevent merge conflict and constantly having to re-make the make files using generate_projects.sh for each set of changes. Closes #36587 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/36587 from tanvi-jagtap:build_include 2a167f6e52b7e900d019f92993d503d5b4622a50 PiperOrigin-RevId: 633201049 --- BUILD | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/BUILD b/BUILD index 7a295c7991b..00b47379fb3 100644 --- a/BUILD +++ b/BUILD @@ -906,6 +906,7 @@ grpc_cc_library( hdrs = GRPCXX_PUBLIC_HDRS, external_deps = [ "absl/log:check", + "absl/log:log", "absl/strings:cord", "absl/synchronization", "protobuf_headers", @@ -936,6 +937,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/strings:cord", ], language = "c++", @@ -1250,6 +1252,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/strings", "absl/synchronization", ], @@ -2457,6 +2460,7 @@ grpc_cc_library( "absl/base:core_headers", "absl/functional:any_invocable", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -2541,6 +2545,7 @@ grpc_cc_library( "absl/base:core_headers", "absl/functional:any_invocable", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", From c31b115a6307be6046624df3208bd4afb676c409 Mon Sep 17 00:00:00 2001 From: Tanvi Jagtap <139093547+tanvi-jagtap@users.noreply.github.com> Date: Mon, 13 May 2024 07:55:29 -0700 Subject: [PATCH 09/10] [grpc][Gpr_To_Absl_Logging] Migrating from gpr to absl logging - BUILD (#36591) [grpc][Gpr_To_Absl_Logging] Migrating from gpr to absl logging - BUILD In this CL we are just editing the build and bzl files to add dependencies. This is done to prevent merge conflict and constantly having to re-make the make files using generate_projects.sh for each set of changes. Closes #36591 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/36591 from tanvi-jagtap:build_root_02 62ee245c88b610d6aca9de5215a97548602da682 PiperOrigin-RevId: 633209659 --- BUILD | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/BUILD b/BUILD index 00b47379fb3..0c113b8bf25 100644 --- a/BUILD +++ b/BUILD @@ -583,6 +583,7 @@ grpc_cc_library( defines = ["GRPC_NO_XDS"], external_deps = [ "absl/base:core_headers", + "absl/log:log", ], language = "c++", public_hdrs = GRPC_PUBLIC_HDRS, @@ -654,6 +655,7 @@ grpc_cc_library( }), external_deps = [ "absl/base:core_headers", + "absl/log:log", ], language = "c++", public_hdrs = GRPC_PUBLIC_HDRS, @@ -787,9 +789,9 @@ grpc_cc_library( "absl/base:core_headers", "absl/base:log_severity", "absl/functional:any_invocable", - "absl/log", "absl/log:check", "absl/log:globals", + "absl/log:log", "absl/memory", "absl/random", "absl/status", @@ -1007,6 +1009,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -1066,6 +1069,7 @@ grpc_cc_library( ], external_deps = [ "absl/container:flat_hash_set", + "absl/log:log", "absl/strings", "absl/types:optional", "absl/types:span", @@ -1385,6 +1389,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/log:check", + "absl/log:log", "absl/status:statusor", "absl/strings", "absl/types:optional", @@ -1444,6 +1449,7 @@ grpc_cc_library( external_deps = [ "absl/container:inlined_vector", "absl/log:check", + "absl/log:log", ], language = "c++", deps = [ @@ -1495,6 +1501,9 @@ grpc_cc_library( hdrs = [ "//src/core:lib/surface/api_trace.h", ], + external_deps = [ + "absl/log:log", + ], language = "c++", deps = [ "gpr", @@ -1813,6 +1822,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/types:optional", @@ -1902,6 +1912,7 @@ grpc_cc_library( "absl/container:flat_hash_set", "absl/hash", "absl/log:check", + "absl/log:log", "absl/random", "absl/status", "absl/status:statusor", @@ -2295,6 +2306,7 @@ grpc_cc_library( "absl/base:core_headers", "absl/container:inlined_vector", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -2402,6 +2414,7 @@ grpc_cc_library( "//src/core:tsi/alts/handshaker/transport_security_common_api.h", ], external_deps = [ + "absl/log:log", "@com_google_protobuf//upb:base", "@com_google_protobuf//upb:mem", ], @@ -2979,6 +2992,7 @@ grpc_cc_library( "absl/base:core_headers", "absl/container:inlined_vector", "absl/log:check", + "absl/log:log", ], language = "c++", visibility = ["@grpc:client_channel"], @@ -2999,7 +3013,10 @@ grpc_cc_library( name = "grpc_trace", srcs = ["//src/core:lib/debug/trace.cc"], hdrs = ["//src/core:lib/debug/trace.h"], - external_deps = ["absl/strings"], + external_deps = [ + "absl/log:log", + "absl/strings", + ], language = "c++", visibility = ["@grpc:trace"], deps = [ @@ -3144,6 +3161,7 @@ grpc_cc_library( "absl/base:core_headers", "absl/container:inlined_vector", "absl/log:check", + "absl/log:log", "absl/status", "absl/strings:str_format", ], @@ -3180,6 +3198,7 @@ grpc_cc_library( ], external_deps = [ "absl/base:core_headers", + "absl/log:log", "absl/status", "absl/strings", "absl/types:optional", @@ -3226,6 +3245,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/strings:str_format", ], visibility = [ @@ -3257,6 +3277,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -3291,6 +3312,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/strings", "absl/strings:str_format", ], @@ -3319,6 +3341,9 @@ grpc_cc_library( hdrs = [ "//src/core:lib/iomgr/internal_errqueue.h", ], + external_deps = [ + "absl/log:log", + ], tags = ["nofixdeps"], visibility = ["@grpc:iomgr_internal_errqueue"], deps = [ @@ -3337,6 +3362,7 @@ grpc_cc_library( "//src/core:lib/iomgr/buffer_list.h", ], external_deps = [ + "absl/log:log", "absl/strings", "absl/strings:str_format", "absl/types:optional", @@ -3383,6 +3409,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -3550,6 +3577,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -3583,6 +3611,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/log:check", + "absl/log:log", "absl/status", "absl/strings", "@com_google_protobuf//upb:base", @@ -3625,6 +3654,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/strings", ], @@ -3816,6 +3846,7 @@ grpc_cc_library( "absl/base:core_headers", "absl/functional:any_invocable", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -3880,6 +3911,7 @@ grpc_cc_library( "absl/base:core_headers", "absl/functional:bind_front", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -3934,6 +3966,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/status", "absl/strings", "absl/types:optional", @@ -3978,6 +4011,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", ], language = "c++", visibility = [ @@ -4066,7 +4100,10 @@ grpc_cc_library( "//src/core:lib/security/security_connector/load_system_roots_supported.h", "//src/core:lib/security/util/json_util.h", ], - external_deps = ["absl/strings"], + external_deps = [ + "absl/log:log", + "absl/strings", + ], language = "c++", visibility = ["@grpc:public"], deps = [ @@ -4159,6 +4196,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/types:span", "libcrypto", "libssl", @@ -4190,6 +4228,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/memory", "libssl", ], @@ -4270,6 +4309,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/log:check", + "absl/log:log", "absl/status", "absl/status:statusor", "absl/strings", @@ -4522,6 +4562,7 @@ grpc_cc_library( external_deps = [ "absl/functional:function_ref", "absl/log:check", + "absl/log:log", "absl/status", "absl/strings", ], @@ -4578,6 +4619,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/log:check", + "absl/log:log", "absl/random:bit_gen_ref", "absl/status", "absl/strings", @@ -4620,6 +4662,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/strings", ], deps = [ @@ -4860,6 +4903,7 @@ grpc_cc_library( ], external_deps = [ "absl/log:check", + "absl/log:log", "absl/strings", "absl/types:span", ], From 0ecee5ad3fe69fd4a6a8e82761e7c65113518b8f Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 13 May 2024 09:42:24 -0700 Subject: [PATCH 10/10] [call-v3] Server path (#36509) Closes #36509 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/36509 from ctiller:transport-refs-3 2771a2b0e1b4af4c5622839a5a767388d13b1074 PiperOrigin-RevId: 633240374 --- BUILD | 4 +- CMakeLists.txt | 3 + Makefile | 1 + Package.swift | 3 + bazel/experiments.bzl | 21 +- build_autogenerated.yaml | 9 + config.m4 | 1 + config.w32 | 1 + gRPC-C++.podspec | 4 + gRPC-Core.podspec | 5 + grpc.gemspec | 3 + package.xml | 3 + src/core/BUILD | 8 +- .../ext/filters/logging/logging_filter.cc | 4 +- .../chaotic_good/server_transport.cc | 76 +- .../transport/chaotic_good/server_transport.h | 12 +- .../ext/transport/inproc/inproc_transport.cc | 51 +- .../ext/transport/inproc/inproc_transport.h | 2 +- src/core/lib/channel/channel_stack.cc | 26 - src/core/lib/channel/channel_stack.h | 1 - src/core/lib/experiments/experiments.cc | 48 +- src/core/lib/experiments/experiments.h | 8 - src/core/lib/experiments/experiments.yaml | 11 +- src/core/lib/experiments/rollouts.yaml | 2 - src/core/lib/promise/detail/promise_like.h | 11 +- src/core/lib/promise/status_flag.h | 2 + src/core/lib/surface/call.cc | 1015 +++++------------ src/core/lib/surface/call.h | 60 +- src/core/lib/surface/channel_init.cc | 84 +- src/core/lib/surface/channel_init.h | 116 +- src/core/lib/surface/init.cc | 4 +- src/core/lib/transport/call_destination.h | 18 + src/core/lib/transport/call_filters.h | 44 + src/core/lib/transport/call_spine.h | 8 +- src/core/lib/transport/interception_chain.h | 11 + src/core/lib/transport/transport.h | 67 +- .../plugin_registry/grpc_plugin_registry.cc | 3 +- src/core/server/server.cc | 632 +++++----- src/core/server/server.h | 33 +- src/core/server/server_interface.h | 2 + src/python/grpcio/grpc_core_dependencies.py | 1 + test/core/end2end/tests/filter_context.cc | 3 - test/core/surface/channel_init_test.cc | 33 +- .../chaotic_good/chaotic_good_server_test.cc | 6 +- .../chaotic_good/server_transport_test.cc | 37 +- .../core/transport/test_suite/call_content.cc | 2 +- test/core/transport/test_suite/call_shapes.cc | 18 +- .../transport/test_suite/inproc_fixture.cc | 6 +- test/core/transport/test_suite/no_op.cc | 4 +- test/core/transport/test_suite/stress.cc | 2 +- test/core/transport/test_suite/test.cc | 29 +- test/core/transport/test_suite/test.h | 17 +- ..._fullstack_unary_ping_pong_chaotic_good.cc | 1 - tools/doxygen/Doxyfile.c++.internal | 3 + tools/doxygen/Doxyfile.core.internal | 3 + 55 files changed, 991 insertions(+), 1591 deletions(-) diff --git a/BUILD b/BUILD index 0c113b8bf25..f83a6bdc989 100644 --- a/BUILD +++ b/BUILD @@ -1942,9 +1942,7 @@ grpc_cc_library( "promise", "ref_counted_ptr", "stats", - "//src/core:1999", "//src/core:activity", - "//src/core:arena", "//src/core:arena_promise", "//src/core:cancel_callback", "//src/core:channel_args", @@ -1958,6 +1956,7 @@ grpc_cc_library( "//src/core:error", "//src/core:error_utils", "//src/core:experiments", + "//src/core:interception_chain", "//src/core:iomgr_fwd", "//src/core:map", "//src/core:metadata_batch", @@ -2078,6 +2077,7 @@ grpc_cc_library( "//src/core:arena_promise", "//src/core:atomic_utils", "//src/core:bitset", + "//src/core:call_destination", "//src/core:call_filters", "//src/core:call_final_info", "//src/core:call_finalization", diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b107dddb0f..3499823786a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2502,6 +2502,7 @@ add_library(grpc src/core/lib/transport/call_spine.cc src/core/lib/transport/connectivity_state.cc src/core/lib/transport/error_utils.cc + src/core/lib/transport/interception_chain.cc src/core/lib/transport/message.cc src/core/lib/transport/metadata.cc src/core/lib/transport/metadata_batch.cc @@ -3255,6 +3256,7 @@ add_library(grpc_unsecure src/core/lib/transport/call_spine.cc src/core/lib/transport/connectivity_state.cc src/core/lib/transport/error_utils.cc + src/core/lib/transport/interception_chain.cc src/core/lib/transport/message.cc src/core/lib/transport/metadata.cc src/core/lib/transport/metadata_batch.cc @@ -5366,6 +5368,7 @@ add_library(grpc_authorization_provider src/core/lib/transport/call_spine.cc src/core/lib/transport/connectivity_state.cc src/core/lib/transport/error_utils.cc + src/core/lib/transport/interception_chain.cc src/core/lib/transport/message.cc src/core/lib/transport/metadata.cc src/core/lib/transport/metadata_batch.cc diff --git a/Makefile b/Makefile index 25ebda3f986..22625964566 100644 --- a/Makefile +++ b/Makefile @@ -1387,6 +1387,7 @@ LIBGRPC_SRC = \ src/core/lib/transport/call_spine.cc \ src/core/lib/transport/connectivity_state.cc \ src/core/lib/transport/error_utils.cc \ + src/core/lib/transport/interception_chain.cc \ src/core/lib/transport/message.cc \ src/core/lib/transport/metadata.cc \ src/core/lib/transport/metadata_batch.cc \ diff --git a/Package.swift b/Package.swift index 81f99552ac2..c4405cf775f 100644 --- a/Package.swift +++ b/Package.swift @@ -1749,6 +1749,7 @@ let package = Package( "src/core/lib/transport/bdp_estimator.h", "src/core/lib/transport/call_arena_allocator.cc", "src/core/lib/transport/call_arena_allocator.h", + "src/core/lib/transport/call_destination.h", "src/core/lib/transport/call_filters.cc", "src/core/lib/transport/call_filters.h", "src/core/lib/transport/call_final_info.cc", @@ -1761,6 +1762,8 @@ let package = Package( "src/core/lib/transport/error_utils.cc", "src/core/lib/transport/error_utils.h", "src/core/lib/transport/http2_errors.h", + "src/core/lib/transport/interception_chain.cc", + "src/core/lib/transport/interception_chain.h", "src/core/lib/transport/message.cc", "src/core/lib/transport/message.h", "src/core/lib/transport/metadata.cc", diff --git a/bazel/experiments.bzl b/bazel/experiments.bzl index 096b07c8828..0bd711b6641 100644 --- a/bazel/experiments.bzl +++ b/bazel/experiments.bzl @@ -34,9 +34,8 @@ EXPERIMENT_ENABLES = { "pending_queue_cap": "pending_queue_cap", "pick_first_new": "pick_first_new", "promise_based_client_call": "event_engine_client,event_engine_listener,promise_based_client_call", - "promise_based_server_call": "promise_based_server_call", - "chaotic_good": "chaotic_good,event_engine_client,event_engine_listener,promise_based_client_call,promise_based_server_call", - "promise_based_inproc_transport": "event_engine_client,event_engine_listener,promise_based_client_call,promise_based_inproc_transport,promise_based_server_call", + "chaotic_good": "chaotic_good,event_engine_client,event_engine_listener,promise_based_client_call", + "promise_based_inproc_transport": "event_engine_client,event_engine_listener,promise_based_client_call,promise_based_inproc_transport", "rstpit": "rstpit", "schedule_cancellation_over_write": "schedule_cancellation_over_write", "server_privacy": "server_privacy", @@ -59,9 +58,6 @@ EXPERIMENTS = { "dbg": { }, "off": { - "core_end2end_test": [ - "promise_based_server_call", - ], "endpoint_test": [ "tcp_frame_size_tuning", "tcp_rcv_lowat", @@ -73,9 +69,6 @@ EXPERIMENTS = { "tcp_frame_size_tuning", "tcp_rcv_lowat", ], - "logging_test": [ - "promise_based_server_call", - ], "resource_quota_test": [ "free_large_allocator", "unconstrained_max_quota_buffer_size", @@ -107,9 +100,6 @@ EXPERIMENTS = { "dbg": { }, "off": { - "core_end2end_test": [ - "promise_based_server_call", - ], "endpoint_test": [ "tcp_frame_size_tuning", "tcp_rcv_lowat", @@ -121,9 +111,6 @@ EXPERIMENTS = { "tcp_frame_size_tuning", "tcp_rcv_lowat", ], - "logging_test": [ - "promise_based_server_call", - ], "resource_quota_test": [ "free_large_allocator", "unconstrained_max_quota_buffer_size", @@ -149,7 +136,6 @@ EXPERIMENTS = { "chaotic_good", "event_engine_client", "promise_based_client_call", - "promise_based_server_call", ], "endpoint_test": [ "tcp_frame_size_tuning", @@ -168,9 +154,6 @@ EXPERIMENTS = { "lame_client_test": [ "promise_based_client_call", ], - "logging_test": [ - "promise_based_server_call", - ], "resource_quota_test": [ "free_large_allocator", "unconstrained_max_quota_buffer_size", diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 7458cc04b7f..b60ae5b5e2a 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -1110,6 +1110,7 @@ libs: - src/core/lib/transport/batch_builder.h - src/core/lib/transport/bdp_estimator.h - src/core/lib/transport/call_arena_allocator.h + - src/core/lib/transport/call_destination.h - src/core/lib/transport/call_filters.h - src/core/lib/transport/call_final_info.h - src/core/lib/transport/call_spine.h @@ -1117,6 +1118,7 @@ libs: - src/core/lib/transport/custom_metadata.h - src/core/lib/transport/error_utils.h - src/core/lib/transport/http2_errors.h + - src/core/lib/transport/interception_chain.h - src/core/lib/transport/message.h - src/core/lib/transport/metadata.h - src/core/lib/transport/metadata_batch.h @@ -1921,6 +1923,7 @@ libs: - src/core/lib/transport/call_spine.cc - src/core/lib/transport/connectivity_state.cc - src/core/lib/transport/error_utils.cc + - src/core/lib/transport/interception_chain.cc - src/core/lib/transport/message.cc - src/core/lib/transport/metadata.cc - src/core/lib/transport/metadata_batch.cc @@ -2609,6 +2612,7 @@ libs: - src/core/lib/transport/batch_builder.h - src/core/lib/transport/bdp_estimator.h - src/core/lib/transport/call_arena_allocator.h + - src/core/lib/transport/call_destination.h - src/core/lib/transport/call_filters.h - src/core/lib/transport/call_final_info.h - src/core/lib/transport/call_spine.h @@ -2616,6 +2620,7 @@ libs: - src/core/lib/transport/custom_metadata.h - src/core/lib/transport/error_utils.h - src/core/lib/transport/http2_errors.h + - src/core/lib/transport/interception_chain.h - src/core/lib/transport/message.h - src/core/lib/transport/metadata.h - src/core/lib/transport/metadata_batch.h @@ -3032,6 +3037,7 @@ libs: - src/core/lib/transport/call_spine.cc - src/core/lib/transport/connectivity_state.cc - src/core/lib/transport/error_utils.cc + - src/core/lib/transport/interception_chain.cc - src/core/lib/transport/message.cc - src/core/lib/transport/metadata.cc - src/core/lib/transport/metadata_batch.cc @@ -4686,6 +4692,7 @@ libs: - src/core/lib/surface/wait_for_cq_end_op.h - src/core/lib/transport/batch_builder.h - src/core/lib/transport/call_arena_allocator.h + - src/core/lib/transport/call_destination.h - src/core/lib/transport/call_filters.h - src/core/lib/transport/call_final_info.h - src/core/lib/transport/call_spine.h @@ -4693,6 +4700,7 @@ libs: - src/core/lib/transport/custom_metadata.h - src/core/lib/transport/error_utils.h - src/core/lib/transport/http2_errors.h + - src/core/lib/transport/interception_chain.h - src/core/lib/transport/message.h - src/core/lib/transport/metadata.h - src/core/lib/transport/metadata_batch.h @@ -4989,6 +4997,7 @@ libs: - src/core/lib/transport/call_spine.cc - src/core/lib/transport/connectivity_state.cc - src/core/lib/transport/error_utils.cc + - src/core/lib/transport/interception_chain.cc - src/core/lib/transport/message.cc - src/core/lib/transport/metadata.cc - src/core/lib/transport/metadata_batch.cc diff --git a/config.m4 b/config.m4 index d44618c5775..4b72ff9577e 100644 --- a/config.m4 +++ b/config.m4 @@ -762,6 +762,7 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/transport/call_spine.cc \ src/core/lib/transport/connectivity_state.cc \ src/core/lib/transport/error_utils.cc \ + src/core/lib/transport/interception_chain.cc \ src/core/lib/transport/message.cc \ src/core/lib/transport/metadata.cc \ src/core/lib/transport/metadata_batch.cc \ diff --git a/config.w32 b/config.w32 index 0d0a85c04d7..f71331b6d7d 100644 --- a/config.w32 +++ b/config.w32 @@ -727,6 +727,7 @@ if (PHP_GRPC != "no") { "src\\core\\lib\\transport\\call_spine.cc " + "src\\core\\lib\\transport\\connectivity_state.cc " + "src\\core\\lib\\transport\\error_utils.cc " + + "src\\core\\lib\\transport\\interception_chain.cc " + "src\\core\\lib\\transport\\message.cc " + "src\\core\\lib\\transport\\metadata.cc " + "src\\core\\lib\\transport\\metadata_batch.cc " + diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index ec37a7d2469..530f61b07aa 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -1213,6 +1213,7 @@ Pod::Spec.new do |s| 'src/core/lib/transport/batch_builder.h', 'src/core/lib/transport/bdp_estimator.h', 'src/core/lib/transport/call_arena_allocator.h', + 'src/core/lib/transport/call_destination.h', 'src/core/lib/transport/call_filters.h', 'src/core/lib/transport/call_final_info.h', 'src/core/lib/transport/call_spine.h', @@ -1220,6 +1221,7 @@ Pod::Spec.new do |s| 'src/core/lib/transport/custom_metadata.h', 'src/core/lib/transport/error_utils.h', 'src/core/lib/transport/http2_errors.h', + 'src/core/lib/transport/interception_chain.h', 'src/core/lib/transport/message.h', 'src/core/lib/transport/metadata.h', 'src/core/lib/transport/metadata_batch.h', @@ -2482,6 +2484,7 @@ Pod::Spec.new do |s| 'src/core/lib/transport/batch_builder.h', 'src/core/lib/transport/bdp_estimator.h', 'src/core/lib/transport/call_arena_allocator.h', + 'src/core/lib/transport/call_destination.h', 'src/core/lib/transport/call_filters.h', 'src/core/lib/transport/call_final_info.h', 'src/core/lib/transport/call_spine.h', @@ -2489,6 +2492,7 @@ Pod::Spec.new do |s| 'src/core/lib/transport/custom_metadata.h', 'src/core/lib/transport/error_utils.h', 'src/core/lib/transport/http2_errors.h', + 'src/core/lib/transport/interception_chain.h', 'src/core/lib/transport/message.h', 'src/core/lib/transport/metadata.h', 'src/core/lib/transport/metadata_batch.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 5459da7206f..baff363da6c 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -1864,6 +1864,7 @@ Pod::Spec.new do |s| 'src/core/lib/transport/bdp_estimator.h', 'src/core/lib/transport/call_arena_allocator.cc', 'src/core/lib/transport/call_arena_allocator.h', + 'src/core/lib/transport/call_destination.h', 'src/core/lib/transport/call_filters.cc', 'src/core/lib/transport/call_filters.h', 'src/core/lib/transport/call_final_info.cc', @@ -1876,6 +1877,8 @@ Pod::Spec.new do |s| 'src/core/lib/transport/error_utils.cc', 'src/core/lib/transport/error_utils.h', 'src/core/lib/transport/http2_errors.h', + 'src/core/lib/transport/interception_chain.cc', + 'src/core/lib/transport/interception_chain.h', 'src/core/lib/transport/message.cc', 'src/core/lib/transport/message.h', 'src/core/lib/transport/metadata.cc', @@ -3261,6 +3264,7 @@ Pod::Spec.new do |s| 'src/core/lib/transport/batch_builder.h', 'src/core/lib/transport/bdp_estimator.h', 'src/core/lib/transport/call_arena_allocator.h', + 'src/core/lib/transport/call_destination.h', 'src/core/lib/transport/call_filters.h', 'src/core/lib/transport/call_final_info.h', 'src/core/lib/transport/call_spine.h', @@ -3268,6 +3272,7 @@ Pod::Spec.new do |s| 'src/core/lib/transport/custom_metadata.h', 'src/core/lib/transport/error_utils.h', 'src/core/lib/transport/http2_errors.h', + 'src/core/lib/transport/interception_chain.h', 'src/core/lib/transport/message.h', 'src/core/lib/transport/metadata.h', 'src/core/lib/transport/metadata_batch.h', diff --git a/grpc.gemspec b/grpc.gemspec index 44f58db3185..4a58496ff43 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -1751,6 +1751,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/transport/bdp_estimator.h ) s.files += %w( src/core/lib/transport/call_arena_allocator.cc ) s.files += %w( src/core/lib/transport/call_arena_allocator.h ) + s.files += %w( src/core/lib/transport/call_destination.h ) s.files += %w( src/core/lib/transport/call_filters.cc ) s.files += %w( src/core/lib/transport/call_filters.h ) s.files += %w( src/core/lib/transport/call_final_info.cc ) @@ -1763,6 +1764,8 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/transport/error_utils.cc ) s.files += %w( src/core/lib/transport/error_utils.h ) s.files += %w( src/core/lib/transport/http2_errors.h ) + s.files += %w( src/core/lib/transport/interception_chain.cc ) + s.files += %w( src/core/lib/transport/interception_chain.h ) s.files += %w( src/core/lib/transport/message.cc ) s.files += %w( src/core/lib/transport/message.h ) s.files += %w( src/core/lib/transport/metadata.cc ) diff --git a/package.xml b/package.xml index 70f64915ef8..44f87605fa6 100644 --- a/package.xml +++ b/package.xml @@ -1733,6 +1733,7 @@ + @@ -1745,6 +1746,8 @@ + + diff --git a/src/core/BUILD b/src/core/BUILD index babf6143381..a9580c2aaa6 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -664,7 +664,10 @@ grpc_cc_library( grpc_cc_library( name = "promise_like", - external_deps = ["absl/meta:type_traits"], + external_deps = [ + "absl/functional:any_invocable", + "absl/meta:type_traits", + ], language = "c++", public_hdrs = [ "lib/promise/detail/promise_like.h", @@ -3130,6 +3133,7 @@ grpc_cc_library( "channel_fwd", "channel_stack_trace", "channel_stack_type", + "interception_chain", "//:channel_stack_builder", "//:debug_location", "//:gpr", @@ -3147,6 +3151,7 @@ grpc_cc_library( deps = [ "channel_args", "//:channelz", + "//:event_engine_base_hdrs", "//:gpr_platform", ], ) @@ -7087,6 +7092,7 @@ grpc_cc_library( "experiments", "iomgr_fwd", "metadata_batch", + "resource_quota", "slice", "slice_buffer", "status_helper", diff --git a/src/core/ext/filters/logging/logging_filter.cc b/src/core/ext/filters/logging/logging_filter.cc index 1c76e64b06a..587e87ff506 100644 --- a/src/core/ext/filters/logging/logging_filter.cc +++ b/src/core/ext/filters/logging/logging_filter.cc @@ -539,11 +539,11 @@ void RegisterLoggingFilter(LoggingSink* sink) { g_logging_sink = sink; CoreConfiguration::RegisterBuilder([](CoreConfiguration::Builder* builder) { builder->channel_init() - ->RegisterFilter(GRPC_SERVER_CHANNEL) + ->RegisterV2Filter(GRPC_SERVER_CHANNEL) // TODO(yashykt) : Figure out a good place to place this channel arg .IfChannelArg("grpc.experimental.enable_observability", true); builder->channel_init() - ->RegisterFilter(GRPC_CLIENT_CHANNEL) + ->RegisterV2Filter(GRPC_CLIENT_CHANNEL) // TODO(yashykt) : Figure out a good place to place this channel arg .IfChannelArg("grpc.experimental.enable_observability", true); }); diff --git a/src/core/ext/transport/chaotic_good/server_transport.cc b/src/core/ext/transport/chaotic_good/server_transport.cc index c139c6e44e0..98fbf4e915e 100644 --- a/src/core/ext/transport/chaotic_good/server_transport.cc +++ b/src/core/ext/transport/chaotic_good/server_transport.cc @@ -235,37 +235,27 @@ auto ChaoticGoodServerTransport::DeserializeAndPushFragmentToNewCall( FrameHeader frame_header, BufferPair buffers, ChaoticGoodTransport& transport) { ClientFragmentFrame fragment_frame; - ScopedArenaPtr arena(acceptor_->CreateArena()); + ScopedArenaPtr arena(call_arena_allocator_->MakeArena()); absl::Status status = transport.DeserializeFrame( frame_header, std::move(buffers), arena.get(), fragment_frame, FrameLimits{1024 * 1024 * 1024, aligned_bytes_ - 1}); absl::optional call_initiator; if (status.ok()) { - auto create_call_result = acceptor_->CreateCall( - std::move(fragment_frame.headers), arena.release()); - if (grpc_chaotic_good_trace.enabled()) { - gpr_log(GPR_INFO, - "CHAOTIC_GOOD: DeserializeAndPushFragmentToNewCall: " - "create_call_result=%s", - create_call_result.ok() - ? "ok" - : create_call_result.status().ToString().c_str()); - } - if (create_call_result.ok()) { - call_initiator.emplace(std::move(*create_call_result)); - auto add_result = NewStream(frame_header.stream_id, *call_initiator); - if (add_result.ok()) { - call_initiator->SpawnGuarded( - "server-write", [this, stream_id = frame_header.stream_id, - call_initiator = *call_initiator]() { - return CallOutboundLoop(stream_id, call_initiator); - }); - } else { - call_initiator.reset(); - status = add_result; - } + auto call = + MakeCallPair(std::move(fragment_frame.headers), event_engine_.get(), + arena.release(), call_arena_allocator_, nullptr); + call_initiator.emplace(std::move(call.initiator)); + auto add_result = NewStream(frame_header.stream_id, *call_initiator); + if (add_result.ok()) { + call_destination_->StartCall(std::move(call.handler)); + call_initiator->SpawnGuarded( + "server-write", [this, stream_id = frame_header.stream_id, + call_initiator = *call_initiator]() { + return CallOutboundLoop(stream_id, call_initiator); + }); } else { - status = create_call_result.status(); + call_initiator.reset(); + status = add_result; } } return MaybePushFragmentIntoCall(std::move(call_initiator), std::move(status), @@ -366,10 +356,13 @@ ChaoticGoodServerTransport::ChaoticGoodServerTransport( PromiseEndpoint data_endpoint, std::shared_ptr event_engine, HPackParser hpack_parser, HPackCompressor hpack_encoder) - : outgoing_frames_(4), - allocator_(args.GetObject() - ->memory_quota() - ->CreateMemoryAllocator("chaotic-good")) { + : call_arena_allocator_(MakeRefCounted( + args.GetObject() + ->memory_quota() + ->CreateMemoryAllocator("chaotic-good"), + 1024)), + event_engine_(event_engine), + outgoing_frames_(4) { auto transport = MakeRefCounted( std::move(control_endpoint), std::move(data_endpoint), std::move(hpack_parser), std::move(hpack_encoder)); @@ -381,20 +374,25 @@ ChaoticGoodServerTransport::ChaoticGoodServerTransport( OnTransportActivityDone("reader")); } -void ChaoticGoodServerTransport::SetAcceptor(Acceptor* acceptor) { - CHECK_EQ(acceptor_, nullptr); - CHECK_NE(acceptor, nullptr); - acceptor_ = acceptor; +void ChaoticGoodServerTransport::SetCallDestination( + RefCountedPtr call_destination) { + CHECK(call_destination_ == nullptr); + CHECK(call_destination != nullptr); + call_destination_ = call_destination; got_acceptor_.Set(); } -ChaoticGoodServerTransport::~ChaoticGoodServerTransport() { - if (writer_ != nullptr) { - writer_.reset(); - } - if (reader_ != nullptr) { - reader_.reset(); +void ChaoticGoodServerTransport::Orphan() { + ActivityPtr writer; + ActivityPtr reader; + { + MutexLock lock(&mu_); + writer = std::move(writer_); + reader = std::move(reader_); } + writer.reset(); + reader.reset(); + Unref(); } void ChaoticGoodServerTransport::AbortWithError() { diff --git a/src/core/ext/transport/chaotic_good/server_transport.h b/src/core/ext/transport/chaotic_good/server_transport.h index a34ac92b73e..140641abcf6 100644 --- a/src/core/ext/transport/chaotic_good/server_transport.h +++ b/src/core/ext/transport/chaotic_good/server_transport.h @@ -86,7 +86,6 @@ class ChaoticGoodServerTransport final : public ServerTransport { std::shared_ptr event_engine, HPackParser hpack_parser, HPackCompressor hpack_encoder); - ~ChaoticGoodServerTransport() override; FilterStackTransport* filter_stack_transport() override { return nullptr; } ClientTransport* client_transport() override { return nullptr; } @@ -96,9 +95,10 @@ class ChaoticGoodServerTransport final : public ServerTransport { void SetPollsetSet(grpc_stream*, grpc_pollset_set*) override {} void PerformOp(grpc_transport_op*) override; grpc_endpoint* GetEndpoint() override { return nullptr; } - void Orphan() override { Unref(); } + void Orphan() override; - void SetAcceptor(Acceptor* acceptor) override; + void SetCallDestination( + RefCountedPtr call_destination) override; void AbortWithError(); private: @@ -137,7 +137,10 @@ class ChaoticGoodServerTransport final : public ServerTransport { auto PushFragmentIntoCall(CallInitiator call_initiator, ClientFragmentFrame frame, uint32_t stream_id); - Acceptor* acceptor_ = nullptr; + RefCountedPtr call_destination_; + const RefCountedPtr call_arena_allocator_; + const std::shared_ptr + event_engine_; InterActivityLatch got_acceptor_; MpscReceiver outgoing_frames_; // Assigned aligned bytes from setting frame. @@ -146,7 +149,6 @@ class ChaoticGoodServerTransport final : public ServerTransport { // Map of stream incoming server frames, key is stream_id. StreamMap stream_map_ ABSL_GUARDED_BY(mu_); uint32_t last_seen_new_stream_id_ = 0; - grpc_event_engine::experimental::MemoryAllocator allocator_; ActivityPtr writer_ ABSL_GUARDED_BY(mu_); ActivityPtr reader_ ABSL_GUARDED_BY(mu_); ConnectivityStateTracker state_tracker_ ABSL_GUARDED_BY(mu_){ diff --git a/src/core/ext/transport/inproc/inproc_transport.cc b/src/core/ext/transport/inproc/inproc_transport.cc index 7dd316bfca8..dbbd3e63123 100644 --- a/src/core/ext/transport/inproc/inproc_transport.cc +++ b/src/core/ext/transport/inproc/inproc_transport.cc @@ -28,6 +28,7 @@ #include "src/core/lib/gprpp/crash.h" #include "src/core/lib/promise/promise.h" #include "src/core/lib/promise/try_seq.h" +#include "src/core/lib/resource_quota/resource_quota.h" #include "src/core/lib/surface/channel_create.h" #include "src/core/lib/transport/transport.h" #include "src/core/server/server.h" @@ -39,8 +40,18 @@ class InprocClientTransport; class InprocServerTransport final : public ServerTransport { public: - void SetAcceptor(Acceptor* acceptor) override { - acceptor_ = acceptor; + explicit InprocServerTransport(const ChannelArgs& args) + : event_engine_( + args.GetObjectRef()), + call_arena_allocator_(MakeRefCounted( + args.GetObject() + ->memory_quota() + ->CreateMemoryAllocator("inproc_server"), + 1024)) {} + + void SetCallDestination( + RefCountedPtr unstarted_call_handler) override { + unstarted_call_handler_ = unstarted_call_handler; ConnectionState expect = ConnectionState::kInitial; state_.compare_exchange_strong(expect, ConnectionState::kReady, std::memory_order_acq_rel, @@ -95,7 +106,11 @@ class InprocServerTransport final : public ServerTransport { case ConnectionState::kReady: break; } - return acceptor_->CreateCall(std::move(md), acceptor_->CreateArena()); + auto* arena = call_arena_allocator_->MakeArena(); + auto server_call = MakeCallPair(std::move(md), event_engine_.get(), arena, + call_arena_allocator_, nullptr); + unstarted_call_handler_->StartCall(std::move(server_call.handler)); + return std::move(server_call.initiator); } OrphanablePtr MakeClientTransport(); @@ -105,11 +120,14 @@ class InprocServerTransport final : public ServerTransport { std::atomic state_{ConnectionState::kInitial}; std::atomic disconnecting_{false}; - Acceptor* acceptor_; + RefCountedPtr unstarted_call_handler_; absl::Status disconnect_error_; Mutex state_tracker_mu_; ConnectivityStateTracker state_tracker_ ABSL_GUARDED_BY(state_tracker_mu_){ "inproc_server_transport", GRPC_CHANNEL_CONNECTING}; + const std::shared_ptr + event_engine_; + const RefCountedPtr call_arena_allocator_; }; class InprocClientTransport final : public ClientTransport { @@ -118,16 +136,19 @@ class InprocClientTransport final : public ClientTransport { RefCountedPtr server_transport) : server_transport_(std::move(server_transport)) {} - void StartCall(CallHandler call_handler) override { - call_handler.SpawnGuarded( + void StartCall(CallHandler child_call_handler) override { + child_call_handler.SpawnGuarded( "pull_initial_metadata", - TrySeq(call_handler.PullClientInitialMetadata(), + TrySeq(child_call_handler.PullClientInitialMetadata(), [server_transport = server_transport_, - call_handler](ClientMetadataHandle md) { - auto call_initiator = + child_call_handler](ClientMetadataHandle md) { + auto server_call_initiator = server_transport->AcceptCall(std::move(md)); - if (!call_initiator.ok()) return call_initiator.status(); - ForwardCall(call_handler, std::move(*call_initiator)); + if (!server_call_initiator.ok()) { + return server_call_initiator.status(); + } + ForwardCall(child_call_handler, + std::move(*server_call_initiator)); return absl::OkStatus(); })); } @@ -155,7 +176,6 @@ class InprocClientTransport final : public ClientTransport { bool UsePromiseBasedTransport() { if (!IsPromiseBasedInprocTransportEnabled()) return false; CHECK(IsPromiseBasedClientCallEnabled()); - CHECK(IsPromiseBasedServerCallEnabled()); return true; } @@ -180,7 +200,7 @@ OrphanablePtr MakeLameChannel(absl::string_view why, OrphanablePtr MakeInprocChannel(Server* server, ChannelArgs client_channel_args) { - auto transports = MakeInProcessTransportPair(); + auto transports = MakeInProcessTransportPair(server->channel_args()); auto client_transport = std::move(transports.first); auto server_transport = std::move(transports.second); auto error = @@ -205,8 +225,9 @@ OrphanablePtr MakeInprocChannel(Server* server, } // namespace std::pair, OrphanablePtr> -MakeInProcessTransportPair() { - auto server_transport = MakeOrphanable(); +MakeInProcessTransportPair(const ChannelArgs& server_channel_args) { + auto server_transport = + MakeOrphanable(server_channel_args); auto client_transport = server_transport->MakeClientTransport(); return std::make_pair(std::move(client_transport), std::move(server_transport)); diff --git a/src/core/ext/transport/inproc/inproc_transport.h b/src/core/ext/transport/inproc/inproc_transport.h index 676b5f1fa32..46dc9b540f1 100644 --- a/src/core/ext/transport/inproc/inproc_transport.h +++ b/src/core/ext/transport/inproc/inproc_transport.h @@ -30,7 +30,7 @@ extern grpc_core::TraceFlag grpc_inproc_trace; namespace grpc_core { std::pair, OrphanablePtr> -MakeInProcessTransportPair(); +MakeInProcessTransportPair(const ChannelArgs& server_channel_args); } diff --git a/src/core/lib/channel/channel_stack.cc b/src/core/lib/channel/channel_stack.cc index 9b28a321db1..c428bac0006 100644 --- a/src/core/lib/channel/channel_stack.cc +++ b/src/core/lib/channel/channel_stack.cc @@ -305,13 +305,6 @@ grpc_core::NextPromiseFactory ClientNext(grpc_channel_element* elem) { }; } -grpc_core::NextPromiseFactory ServerNext(grpc_channel_element* elem) { - return [elem](grpc_core::CallArgs args) { - return elem->filter->make_call_promise(elem, std::move(args), - ServerNext(elem - 1)); - }; -} - } // namespace grpc_core::ArenaPromise @@ -319,12 +312,6 @@ grpc_channel_stack::MakeClientCallPromise(grpc_core::CallArgs call_args) { return ClientNext(grpc_channel_stack_element(this, 0))(std::move(call_args)); } -grpc_core::ArenaPromise -grpc_channel_stack::MakeServerCallPromise(grpc_core::CallArgs call_args) { - return ServerNext(grpc_channel_stack_element(this, this->count - 1))( - std::move(call_args)); -} - void grpc_channel_stack::InitClientCallSpine( grpc_core::CallSpineInterface* call) { for (size_t i = 0; i < count; i++) { @@ -338,19 +325,6 @@ void grpc_channel_stack::InitClientCallSpine( } } -void grpc_channel_stack::InitServerCallSpine( - grpc_core::CallSpineInterface* call) { - for (size_t i = 0; i < count; i++) { - auto* elem = grpc_channel_stack_element(this, count - 1 - i); - if (elem->filter->init_call == nullptr) { - grpc_core::Crash( - absl::StrCat("Filter '", elem->filter->name, - "' does not support the call-v3 interface")); - } - elem->filter->init_call(elem, call); - } -} - void grpc_call_log_op(const char* file, int line, gpr_log_severity severity, grpc_call_element* elem, grpc_transport_stream_op_batch* op) { diff --git a/src/core/lib/channel/channel_stack.h b/src/core/lib/channel/channel_stack.h index affd34a4191..030173fcd31 100644 --- a/src/core/lib/channel/channel_stack.h +++ b/src/core/lib/channel/channel_stack.h @@ -241,7 +241,6 @@ struct grpc_channel_stack { MakeServerCallPromise(grpc_core::CallArgs call_args); void InitClientCallSpine(grpc_core::CallSpineInterface* call); - void InitServerCallSpine(grpc_core::CallSpineInterface* call); }; // A call stack tracks a set of related filters for one call, and guarantees diff --git a/src/core/lib/experiments/experiments.cc b/src/core/lib/experiments/experiments.cc index c5e2d3fb3b9..4bf01759fc2 100644 --- a/src/core/lib/experiments/experiments.cc +++ b/src/core/lib/experiments/experiments.cc @@ -88,23 +88,17 @@ const char* const additional_constraints_promise_based_client_call = "{}"; const uint8_t required_experiments_promise_based_client_call[] = { static_cast(grpc_core::kExperimentIdEventEngineClient), static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_promise_based_server_call = - "If set, use the new gRPC promise based call code when it's appropriate " - "(ie when all filters in a stack are promise based)"; -const char* const additional_constraints_promise_based_server_call = "{}"; const char* const description_chaotic_good = "If set, enable the chaotic good load transport (this is mostly here for " "testing)"; const char* const additional_constraints_chaotic_good = "{}"; const uint8_t required_experiments_chaotic_good[] = { - static_cast(grpc_core::kExperimentIdPromiseBasedClientCall), - static_cast(grpc_core::kExperimentIdPromiseBasedServerCall)}; + static_cast(grpc_core::kExperimentIdPromiseBasedClientCall)}; const char* const description_promise_based_inproc_transport = "Use promises for the in-process transport."; const char* const additional_constraints_promise_based_inproc_transport = "{}"; const uint8_t required_experiments_promise_based_inproc_transport[] = { - static_cast(grpc_core::kExperimentIdPromiseBasedClientCall), - static_cast(grpc_core::kExperimentIdPromiseBasedServerCall)}; + static_cast(grpc_core::kExperimentIdPromiseBasedClientCall)}; const char* const description_rstpit = "On RST_STREAM on a server, reduce MAX_CONCURRENT_STREAMS for a short " "duration"; @@ -184,15 +178,13 @@ const ExperimentMetadata g_experiment_metadata[] = { {"promise_based_client_call", description_promise_based_client_call, additional_constraints_promise_based_client_call, required_experiments_promise_based_client_call, 2, false, true}, - {"promise_based_server_call", description_promise_based_server_call, - additional_constraints_promise_based_server_call, nullptr, 0, false, true}, {"chaotic_good", description_chaotic_good, - additional_constraints_chaotic_good, required_experiments_chaotic_good, 2, + additional_constraints_chaotic_good, required_experiments_chaotic_good, 1, false, true}, {"promise_based_inproc_transport", description_promise_based_inproc_transport, additional_constraints_promise_based_inproc_transport, - required_experiments_promise_based_inproc_transport, 2, false, false}, + required_experiments_promise_based_inproc_transport, 1, false, false}, {"rstpit", description_rstpit, additional_constraints_rstpit, nullptr, 0, false, true}, {"schedule_cancellation_over_write", @@ -288,23 +280,17 @@ const char* const additional_constraints_promise_based_client_call = "{}"; const uint8_t required_experiments_promise_based_client_call[] = { static_cast(grpc_core::kExperimentIdEventEngineClient), static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_promise_based_server_call = - "If set, use the new gRPC promise based call code when it's appropriate " - "(ie when all filters in a stack are promise based)"; -const char* const additional_constraints_promise_based_server_call = "{}"; const char* const description_chaotic_good = "If set, enable the chaotic good load transport (this is mostly here for " "testing)"; const char* const additional_constraints_chaotic_good = "{}"; const uint8_t required_experiments_chaotic_good[] = { - static_cast(grpc_core::kExperimentIdPromiseBasedClientCall), - static_cast(grpc_core::kExperimentIdPromiseBasedServerCall)}; + static_cast(grpc_core::kExperimentIdPromiseBasedClientCall)}; const char* const description_promise_based_inproc_transport = "Use promises for the in-process transport."; const char* const additional_constraints_promise_based_inproc_transport = "{}"; const uint8_t required_experiments_promise_based_inproc_transport[] = { - static_cast(grpc_core::kExperimentIdPromiseBasedClientCall), - static_cast(grpc_core::kExperimentIdPromiseBasedServerCall)}; + static_cast(grpc_core::kExperimentIdPromiseBasedClientCall)}; const char* const description_rstpit = "On RST_STREAM on a server, reduce MAX_CONCURRENT_STREAMS for a short " "duration"; @@ -384,15 +370,13 @@ const ExperimentMetadata g_experiment_metadata[] = { {"promise_based_client_call", description_promise_based_client_call, additional_constraints_promise_based_client_call, required_experiments_promise_based_client_call, 2, false, true}, - {"promise_based_server_call", description_promise_based_server_call, - additional_constraints_promise_based_server_call, nullptr, 0, false, true}, {"chaotic_good", description_chaotic_good, - additional_constraints_chaotic_good, required_experiments_chaotic_good, 2, + additional_constraints_chaotic_good, required_experiments_chaotic_good, 1, false, true}, {"promise_based_inproc_transport", description_promise_based_inproc_transport, additional_constraints_promise_based_inproc_transport, - required_experiments_promise_based_inproc_transport, 2, false, false}, + required_experiments_promise_based_inproc_transport, 1, false, false}, {"rstpit", description_rstpit, additional_constraints_rstpit, nullptr, 0, false, true}, {"schedule_cancellation_over_write", @@ -488,23 +472,17 @@ const char* const additional_constraints_promise_based_client_call = "{}"; const uint8_t required_experiments_promise_based_client_call[] = { static_cast(grpc_core::kExperimentIdEventEngineClient), static_cast(grpc_core::kExperimentIdEventEngineListener)}; -const char* const description_promise_based_server_call = - "If set, use the new gRPC promise based call code when it's appropriate " - "(ie when all filters in a stack are promise based)"; -const char* const additional_constraints_promise_based_server_call = "{}"; const char* const description_chaotic_good = "If set, enable the chaotic good load transport (this is mostly here for " "testing)"; const char* const additional_constraints_chaotic_good = "{}"; const uint8_t required_experiments_chaotic_good[] = { - static_cast(grpc_core::kExperimentIdPromiseBasedClientCall), - static_cast(grpc_core::kExperimentIdPromiseBasedServerCall)}; + static_cast(grpc_core::kExperimentIdPromiseBasedClientCall)}; const char* const description_promise_based_inproc_transport = "Use promises for the in-process transport."; const char* const additional_constraints_promise_based_inproc_transport = "{}"; const uint8_t required_experiments_promise_based_inproc_transport[] = { - static_cast(grpc_core::kExperimentIdPromiseBasedClientCall), - static_cast(grpc_core::kExperimentIdPromiseBasedServerCall)}; + static_cast(grpc_core::kExperimentIdPromiseBasedClientCall)}; const char* const description_rstpit = "On RST_STREAM on a server, reduce MAX_CONCURRENT_STREAMS for a short " "duration"; @@ -584,15 +562,13 @@ const ExperimentMetadata g_experiment_metadata[] = { {"promise_based_client_call", description_promise_based_client_call, additional_constraints_promise_based_client_call, required_experiments_promise_based_client_call, 2, false, true}, - {"promise_based_server_call", description_promise_based_server_call, - additional_constraints_promise_based_server_call, nullptr, 0, false, true}, {"chaotic_good", description_chaotic_good, - additional_constraints_chaotic_good, required_experiments_chaotic_good, 2, + additional_constraints_chaotic_good, required_experiments_chaotic_good, 1, false, true}, {"promise_based_inproc_transport", description_promise_based_inproc_transport, additional_constraints_promise_based_inproc_transport, - required_experiments_promise_based_inproc_transport, 2, false, false}, + required_experiments_promise_based_inproc_transport, 1, false, false}, {"rstpit", description_rstpit, additional_constraints_rstpit, nullptr, 0, false, true}, {"schedule_cancellation_over_write", diff --git a/src/core/lib/experiments/experiments.h b/src/core/lib/experiments/experiments.h index 65fb7ebfa80..16220be2591 100644 --- a/src/core/lib/experiments/experiments.h +++ b/src/core/lib/experiments/experiments.h @@ -79,7 +79,6 @@ inline bool IsPendingQueueCapEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_PICK_FIRST_NEW inline bool IsPickFirstNewEnabled() { return true; } inline bool IsPromiseBasedClientCallEnabled() { return false; } -inline bool IsPromiseBasedServerCallEnabled() { return false; } inline bool IsChaoticGoodEnabled() { return false; } inline bool IsPromiseBasedInprocTransportEnabled() { return false; } inline bool IsRstpitEnabled() { return false; } @@ -119,7 +118,6 @@ inline bool IsPendingQueueCapEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_PICK_FIRST_NEW inline bool IsPickFirstNewEnabled() { return true; } inline bool IsPromiseBasedClientCallEnabled() { return false; } -inline bool IsPromiseBasedServerCallEnabled() { return false; } inline bool IsChaoticGoodEnabled() { return false; } inline bool IsPromiseBasedInprocTransportEnabled() { return false; } inline bool IsRstpitEnabled() { return false; } @@ -159,7 +157,6 @@ inline bool IsPendingQueueCapEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_PICK_FIRST_NEW inline bool IsPickFirstNewEnabled() { return true; } inline bool IsPromiseBasedClientCallEnabled() { return false; } -inline bool IsPromiseBasedServerCallEnabled() { return false; } inline bool IsChaoticGoodEnabled() { return false; } inline bool IsPromiseBasedInprocTransportEnabled() { return false; } inline bool IsRstpitEnabled() { return false; } @@ -195,7 +192,6 @@ enum ExperimentIds { kExperimentIdPendingQueueCap, kExperimentIdPickFirstNew, kExperimentIdPromiseBasedClientCall, - kExperimentIdPromiseBasedServerCall, kExperimentIdChaoticGood, kExperimentIdPromiseBasedInprocTransport, kExperimentIdRstpit, @@ -277,10 +273,6 @@ inline bool IsPickFirstNewEnabled() { inline bool IsPromiseBasedClientCallEnabled() { return IsExperimentEnabled(kExperimentIdPromiseBasedClientCall); } -#define GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL -inline bool IsPromiseBasedServerCallEnabled() { - return IsExperimentEnabled(kExperimentIdPromiseBasedServerCall); -} #define GRPC_EXPERIMENT_IS_INCLUDED_CHAOTIC_GOOD inline bool IsChaoticGoodEnabled() { return IsExperimentEnabled(kExperimentIdChaoticGood); diff --git a/src/core/lib/experiments/experiments.yaml b/src/core/lib/experiments/experiments.yaml index 0712c8afd85..0e00f5c4d68 100644 --- a/src/core/lib/experiments/experiments.yaml +++ b/src/core/lib/experiments/experiments.yaml @@ -64,7 +64,7 @@ If set, enable the chaotic good load transport (this is mostly here for testing) expiry: 2024/09/09 owner: ctiller@google.com - requires: [promise_based_client_call, promise_based_server_call] + requires: [promise_based_client_call] test_tags: [core_end2end_test] - name: client_privacy description: @@ -170,14 +170,7 @@ owner: ctiller@google.com test_tags: [] allow_in_fuzzing_config: false # experiment currently crashes if enabled - requires: [promise_based_client_call, promise_based_server_call] -- name: promise_based_server_call - description: - If set, use the new gRPC promise based call code when it's appropriate - (ie when all filters in a stack are promise based) - expiry: 2024/06/14 - owner: ctiller@google.com - test_tags: ["core_end2end_test", "logging_test"] + requires: [promise_based_client_call] - name: rstpit description: On RST_STREAM on a server, reduce MAX_CONCURRENT_STREAMS for a short duration diff --git a/src/core/lib/experiments/rollouts.yaml b/src/core/lib/experiments/rollouts.yaml index f9d968d62a2..97018a672cd 100644 --- a/src/core/lib/experiments/rollouts.yaml +++ b/src/core/lib/experiments/rollouts.yaml @@ -94,8 +94,6 @@ ios: broken windows: broken posix: false -- name: promise_based_server_call - default: false - name: rstpit default: false - name: schedule_cancellation_over_write diff --git a/src/core/lib/promise/detail/promise_like.h b/src/core/lib/promise/detail/promise_like.h index a8b80172c22..8e73577675a 100644 --- a/src/core/lib/promise/detail/promise_like.h +++ b/src/core/lib/promise/detail/promise_like.h @@ -17,6 +17,7 @@ #include +#include "absl/functional/any_invocable.h" #include "absl/meta/type_traits.h" #include @@ -63,6 +64,10 @@ auto WrapInPoll(T&& x) -> decltype(PollWrapper::Wrap(std::forward(x))) { return PollWrapper::Wrap(std::forward(x)); } +// T -> T, const T& -> T +template +using RemoveCVRef = absl::remove_cv_t>; + template class PromiseLike; @@ -73,7 +78,7 @@ template class PromiseLike::type>::value>> { private: - GPR_NO_UNIQUE_ADDRESS F f_; + GPR_NO_UNIQUE_ADDRESS RemoveCVRef f_; public: // NOLINTNEXTLINE - internal detail that drastically simplifies calling code. @@ -82,10 +87,6 @@ class PromiseLike::Type; }; -// T -> T, const T& -> T -template -using RemoveCVRef = absl::remove_cv_t>; - } // namespace promise_detail } // namespace grpc_core diff --git a/src/core/lib/promise/status_flag.h b/src/core/lib/promise/status_flag.h index 38d4cf5b720..132b2079c07 100644 --- a/src/core/lib/promise/status_flag.h +++ b/src/core/lib/promise/status_flag.h @@ -171,6 +171,8 @@ class ValueOrFailure { T& value() { return value_.value(); } const T& operator*() const { return *value_; } T& operator*() { return *value_; } + const T* operator->() const { return &*value_; } + T* operator->() { return &*value_; } bool operator==(const ValueOrFailure& other) const { return value_ == other.value_; diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc index 6d2457dba2d..0d268a21572 100644 --- a/src/core/lib/surface/call.cc +++ b/src/core/lib/surface/call.cc @@ -125,7 +125,7 @@ using GrpcClosure = Closure; Call::ParentCall* Call::GetOrCreateParentCall() { ParentCall* p = parent_call_.load(std::memory_order_acquire); if (p == nullptr) { - p = arena_->New(); + p = arena()->New(); ParentCall* expected = nullptr; if (!parent_call_.compare_exchange_strong(expected, p, std::memory_order_release, @@ -244,28 +244,6 @@ void Call::PropagateCancellationToChildren() { } } -char* Call::GetPeer() { - Slice peer_slice = GetPeerString(); - if (!peer_slice.empty()) { - absl::string_view peer_string_view = peer_slice.as_string_view(); - char* peer_string = - static_cast(gpr_malloc(peer_string_view.size() + 1)); - memcpy(peer_string, peer_string_view.data(), peer_string_view.size()); - peer_string[peer_string_view.size()] = '\0'; - return peer_string; - } - char* peer_string = grpc_channel_get_target(channel_->c_ptr()); - if (peer_string != nullptr) return peer_string; - return gpr_strdup("unknown"); -} - -void Call::DeleteThis() { - RefCountedPtr channel = std::move(channel_); - Arena* arena = arena_; - this->~Call(); - channel->DestroyArena(arena); -} - void Call::PrepareOutgoingInitialMetadata(const grpc_op& op, grpc_metadata_batch& md) { // TODO(juanlishen): If the user has already specified a compression @@ -280,7 +258,7 @@ void Call::PrepareOutgoingInitialMetadata(const grpc_op& op, op.data.send_initial_metadata.maybe_compression_level.level; level_set = true; } else { - const grpc_compression_options copts = channel()->compression_options(); + const grpc_compression_options copts = compression_options(); if (copts.default_level.is_set) { level_set = true; effective_compression_level = copts.default_level.level; @@ -312,13 +290,12 @@ void Call::ProcessIncomingInitialMetadata(grpc_metadata_batch& md) { md.Take(GrpcAcceptEncodingMetadata()) .value_or(CompressionAlgorithmSet{GRPC_COMPRESS_NONE}); - const grpc_compression_options compression_options = - channel_->compression_options(); + const grpc_compression_options copts = compression_options(); const grpc_compression_algorithm compression_algorithm = incoming_compression_algorithm_; - if (GPR_UNLIKELY(!CompressionAlgorithmSet::FromUint32( - compression_options.enabled_algorithms_bitset) - .IsSet(compression_algorithm))) { + if (GPR_UNLIKELY( + !CompressionAlgorithmSet::FromUint32(copts.enabled_algorithms_bitset) + .IsSet(compression_algorithm))) { // check if algorithm is supported by current channel config HandleCompressionAlgorithmDisabled(compression_algorithm); } @@ -368,22 +345,20 @@ void Call::UpdateDeadline(Timestamp deadline) { StatusIntProperty::kRpcStatus, GRPC_STATUS_DEADLINE_EXCEEDED)); return; } - auto* const event_engine = channel()->event_engine(); if (deadline_ != Timestamp::InfFuture()) { - if (!event_engine->Cancel(deadline_task_)) return; + if (!event_engine_->Cancel(deadline_task_)) return; } else { InternalRef("deadline"); } deadline_ = deadline; - deadline_task_ = event_engine->RunAfter(deadline - Timestamp::Now(), this); + deadline_task_ = event_engine_->RunAfter(deadline - Timestamp::Now(), this); } void Call::ResetDeadline() { { MutexLock lock(&deadline_mu_); if (deadline_ == Timestamp::InfFuture()) return; - auto* const event_engine = channel()->event_engine(); - if (!event_engine->Cancel(deadline_task_)) return; + if (!event_engine_->Cancel(deadline_task_)) return; deadline_ = Timestamp::InfFuture(); } InternalUnref("deadline[reset]"); @@ -398,11 +373,69 @@ void Call::Run() { InternalUnref("deadline[run]"); } +/////////////////////////////////////////////////////////////////////////////// +// ChannelBasedCall +// TODO(ctiller): once we remove the v2 client code this can be folded into +// FilterStackCall + +class ChannelBasedCall : public Call { + protected: + ChannelBasedCall(Arena* arena, bool is_client, Timestamp send_deadline, + RefCountedPtr channel) + : Call(is_client, send_deadline, channel->event_engine()), + arena_(arena), + channel_(std::move(channel)) { + DCHECK_NE(arena_, nullptr); + } + + Arena* arena() final { return arena_; } + + char* GetPeer() final { + Slice peer_slice = GetPeerString(); + if (!peer_slice.empty()) { + absl::string_view peer_string_view = peer_slice.as_string_view(); + char* peer_string = + static_cast(gpr_malloc(peer_string_view.size() + 1)); + memcpy(peer_string, peer_string_view.data(), peer_string_view.size()); + peer_string[peer_string_view.size()] = '\0'; + return peer_string; + } + char* peer_string = grpc_channel_get_target(channel_->c_ptr()); + if (peer_string != nullptr) return peer_string; + return gpr_strdup("unknown"); + } + + grpc_event_engine::experimental::EventEngine* event_engine() const override { + return channel_->event_engine(); + } + + grpc_compression_options compression_options() override { + return channel_->compression_options(); + } + + void DeleteThis() { + RefCountedPtr channel = std::move(channel_); + Arena* arena = arena_; + this->~ChannelBasedCall(); + channel->DestroyArena(arena); + } + + Channel* channel() const { return channel_.get(); } + + protected: + // Non-virtual arena accessor -- needed by PipeBasedCall + Arena* GetArena() { return arena_; } + + private: + Arena* const arena_; + RefCountedPtr channel_; +}; + /////////////////////////////////////////////////////////////////////////////// // FilterStackCall // To be removed once promise conversion is complete -class FilterStackCall final : public Call { +class FilterStackCall final : public ChannelBasedCall { public: ~FilterStackCall() override { for (int i = 0; i < GRPC_CONTEXT_COUNT; ++i) { @@ -431,10 +464,6 @@ class FilterStackCall final : public Call { GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(*this))); } - grpc_event_engine::experimental::EventEngine* event_engine() const override { - return channel()->event_engine(); - } - grpc_call_element* call_elem(size_t idx) { return grpc_call_stack_element(call_stack(), idx); } @@ -570,8 +599,8 @@ class FilterStackCall final : public Call { }; FilterStackCall(Arena* arena, const grpc_call_create_args& args) - : Call(arena, args.server_transport_data == nullptr, args.send_deadline, - args.channel->Ref()), + : ChannelBasedCall(arena, args.server_transport_data == nullptr, + args.send_deadline, args.channel->Ref()), cq_(args.cq), stream_op_payload_(context_) { context_[GRPC_CONTEXT_CALL].value = this; @@ -1874,15 +1903,15 @@ bool ValidateMetadata(size_t count, grpc_metadata* metadata) { // PromiseBasedCall // Will be folded into Call once the promise conversion is done -class BasicPromiseBasedCall : public Call, public Party { +class BasicPromiseBasedCall : public ChannelBasedCall, public Party { public: using Call::arena; BasicPromiseBasedCall(Arena* arena, uint32_t initial_external_refs, uint32_t initial_internal_refs, const grpc_call_create_args& args) - : Call(arena, args.server_transport_data == nullptr, args.send_deadline, - args.channel->Ref()), + : ChannelBasedCall(arena, args.server_transport_data == nullptr, + args.send_deadline, args.channel->Ref()), Party(initial_internal_refs), external_refs_(initial_external_refs), cq_(args.cq) { @@ -1903,7 +1932,6 @@ class BasicPromiseBasedCall : public Call, public Party { virtual void OrphanCall() = 0; - virtual ServerCallContext* server_call_context() { return nullptr; } void SetCompletionQueue(grpc_completion_queue* cq) final { cq_ = cq; GRPC_CQ_INTERNAL_REF(cq, "bind"); @@ -2533,10 +2561,6 @@ void CallContext::IncrementRefCount(const char* reason) { void CallContext::Unref(const char* reason) { call_->InternalUnref(reason); } -ServerCallContext* CallContext::server_call_context() { - return call_->server_call_context(); -} - RefCountedPtr CallContext::MakeCallSpine( CallArgs call_args) { return call_->MakeCallSpine(std::move(call_args)); @@ -2780,12 +2804,12 @@ class ClientPromiseBasedCall final : public PromiseBasedCall { void PublishInitialMetadata(ServerMetadata* metadata); ClientMetadataHandle send_initial_metadata_; - Pipe server_initial_metadata_{arena()}; + Pipe server_initial_metadata_{GetArena()}; Latch server_trailing_metadata_; Latch cancel_error_; Latch polling_entity_; - Pipe client_to_server_messages_{arena()}; - Pipe server_to_client_messages_{arena()}; + Pipe client_to_server_messages_{GetArena()}; + Pipe server_to_client_messages_{GetArena()}; bool is_trailers_only_ = false; bool scheduled_receive_status_ = false; bool scheduled_send_close_ = false; @@ -3092,242 +3116,7 @@ void ClientPromiseBasedCall::StartRecvStatusOnClient( #endif /////////////////////////////////////////////////////////////////////////////// -// ServerPromiseBasedCall - -#ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL - -class ServerPromiseBasedCall final : public PromiseBasedCall, - public ServerCallContext { - public: - ServerPromiseBasedCall(Arena* arena, grpc_call_create_args* args); - - void OrphanCall() override {} - void CancelWithError(grpc_error_handle) override; - grpc_call_error StartBatch(const grpc_op* ops, size_t nops, void* notify_tag, - bool is_notify_tag_closure) override; - bool is_trailers_only() const override { - Crash("is_trailers_only not implemented for server calls"); - } - absl::string_view GetServerAuthority() const override { - const Slice* authority_metadata = - client_initial_metadata_->get_pointer(HttpAuthorityMetadata()); - if (authority_metadata == nullptr) return ""; - return authority_metadata->as_string_view(); - } - - // Polling order for the server promise stack: - // - // │ ┌───────────────────────────────────────┐ - // │ │ ServerPromiseBasedCall ├──► Lifetime management - // │ ├───────────────────────────────────────┤ - // │ │ ConnectedChannel ├─┐ - // │ ├───────────────────────────────────────┤ └► Interactions with the - // │ │ ... closest to transport filter │ transport - send/recv msgs - // │ ├───────────────────────────────────────┤ and metadata, call phase - // │ │ ... │ ordering - // │ ├───────────────────────────────────────┤ - // │ │ ... closest to app filter │ ┌► Request matching, initial - // │ ├───────────────────────────────────────┤ │ setup, publishing call to - // │ │ Server::ChannelData::MakeCallPromise ├─┘ application - // │ ├───────────────────────────────────────┤ - // │ │ MakeTopOfServerCallPromise ├──► Send trailing metadata - // ▼ └───────────────────────────────────────┘ - // Polling & - // instantiation - // order - - std::string DebugTag() const override { - return absl::StrFormat("SERVER_CALL[%p]: ", this); - } - - ServerCallContext* server_call_context() override { return this; } - - const void* server_stream_data() override { return server_transport_data_; } - void PublishInitialMetadata( - ClientMetadataHandle metadata, - grpc_metadata_array* publish_initial_metadata) override; - ArenaPromise MakeTopOfServerCallPromise( - CallArgs call_args, grpc_completion_queue* cq, - absl::FunctionRef publish) override; - - private: - class RecvCloseOpCancelState { - public: - // Request that receiver be filled in per - // grpc_op_recv_close_on_server. Returns true if the request can - // be fulfilled immediately. Returns false if the request will be - // fulfilled later. - bool ReceiveCloseOnServerOpStarted(int* receiver) { - uintptr_t state = state_.load(std::memory_order_acquire); - uintptr_t new_state; - do { - switch (state) { - case kUnset: - new_state = reinterpret_cast(receiver); - break; - case kFinishedWithFailure: - *receiver = 1; - return true; - case kFinishedWithSuccess: - *receiver = 0; - return true; - default: - Crash("Two threads offered ReceiveCloseOnServerOpStarted"); - } - } while (!state_.compare_exchange_weak(state, new_state, - std::memory_order_acq_rel, - std::memory_order_acquire)); - return false; - } - - // Mark the call as having completed. - // Returns true if this finishes a previous - // RequestReceiveCloseOnServer. - bool CompleteCallWithCancelledSetTo(bool cancelled) { - uintptr_t state = state_.load(std::memory_order_acquire); - uintptr_t new_state; - bool r; - do { - switch (state) { - case kUnset: - new_state = cancelled ? kFinishedWithFailure : kFinishedWithSuccess; - r = false; - break; - case kFinishedWithFailure: - return false; - case kFinishedWithSuccess: - Crash("unreachable"); - default: - new_state = cancelled ? kFinishedWithFailure : kFinishedWithSuccess; - r = true; - } - } while (!state_.compare_exchange_weak(state, new_state, - std::memory_order_acq_rel, - std::memory_order_acquire)); - if (r) *reinterpret_cast(state) = cancelled ? 1 : 0; - return r; - } - - std::string ToString() const { - auto state = state_.load(std::memory_order_relaxed); - switch (state) { - case kUnset: - return "Unset"; - case kFinishedWithFailure: - return "FinishedWithFailure"; - case kFinishedWithSuccess: - return "FinishedWithSuccess"; - default: - return absl::StrFormat("WaitingForReceiver(%p)", - reinterpret_cast(state)); - } - } - - private: - static constexpr uintptr_t kUnset = 0; - static constexpr uintptr_t kFinishedWithFailure = 1; - static constexpr uintptr_t kFinishedWithSuccess = 2; - // Holds one of kUnset, kFinishedWithFailure, or - // kFinishedWithSuccess OR an int* that wants to receive the - // final status. - std::atomic state_{kUnset}; - }; - - void CommitBatch(const grpc_op* ops, size_t nops, - const Completion& completion); - void Finish(ServerMetadataHandle result); - - ServerInterface* const server_; - const void* const server_transport_data_; - PipeSender* server_initial_metadata_ = nullptr; - PipeSender* server_to_client_messages_ = nullptr; - PipeReceiver* client_to_server_messages_ = nullptr; - Latch send_trailing_metadata_; - RecvCloseOpCancelState recv_close_op_cancel_state_; - ClientMetadataHandle client_initial_metadata_; - Completion recv_close_completion_; - std::atomic cancelled_{false}; -}; - -ServerPromiseBasedCall::ServerPromiseBasedCall(Arena* arena, - grpc_call_create_args* args) - : PromiseBasedCall(arena, 0, *args), - server_(args->server), - server_transport_data_(args->server_transport_data) { - global_stats().IncrementServerCallsCreated(); - channelz::ServerNode* channelz_node = server_->channelz_node(); - if (channelz_node != nullptr) { - channelz_node->RecordCallStarted(); - } - ScopedContext activity_context(this); - // TODO(yashykt): In the future, we want to also enable stats and trace - // collecting from when the call is created at the transport. The idea is that - // the transport would create the call tracer and pass it in as part of the - // metadata. - // TODO(yijiem): OpenCensus and internal Census is still using this way to - // set server call tracer. We need to refactor them to stats plugins - // (including removing the client channel filters). - if (args->server != nullptr && - args->server->server_call_tracer_factory() != nullptr) { - auto* server_call_tracer = - args->server->server_call_tracer_factory()->CreateNewServerCallTracer( - arena, args->server->channel_args()); - if (server_call_tracer != nullptr) { - // Note that we are setting both - // GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE and - // GRPC_CONTEXT_CALL_TRACER as a matter of convenience. In the future - // promise-based world, we would just a single tracer object for each - // stack (call, subchannel_call, server_call.) - ContextSet(GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE, - server_call_tracer, nullptr); - ContextSet(GRPC_CONTEXT_CALL_TRACER, server_call_tracer, nullptr); - } - } - args->channel->channel_stack()->stats_plugin_group->AddServerCallTracers( - context()); - Spawn("server_promise", - channel()->channel_stack()->MakeServerCallPromise( - CallArgs{nullptr, ClientInitialMetadataOutstandingToken::Empty(), - nullptr, nullptr, nullptr, nullptr}), - [this](ServerMetadataHandle result) { Finish(std::move(result)); }); -} - -void ServerPromiseBasedCall::Finish(ServerMetadataHandle result) { - if (grpc_call_trace.enabled()) { - gpr_log(GPR_INFO, "%s[call] Finish: recv_close_state:%s result:%s", - DebugTag().c_str(), recv_close_op_cancel_state_.ToString().c_str(), - result->DebugString().c_str()); - } - const auto status = - result->get(GrpcStatusMetadata()).value_or(GRPC_STATUS_UNKNOWN); - channelz::ServerNode* channelz_node = server_->channelz_node(); - if (channelz_node != nullptr) { - if (status == GRPC_STATUS_OK) { - channelz_node->RecordCallSucceeded(); - } else { - channelz_node->RecordCallFailed(); - } - } - bool was_cancelled = result->get(GrpcCallWasCancelled()).value_or(true); - if (recv_close_op_cancel_state_.CompleteCallWithCancelledSetTo( - was_cancelled)) { - FinishOpOnCompletion(&recv_close_completion_, - PendingOp::kReceiveCloseOnServer); - } - if (was_cancelled) set_failed_before_recv_message(); - if (server_initial_metadata_ != nullptr) { - server_initial_metadata_->Close(); - } - Slice message_slice; - if (Slice* message = result->get_pointer(GrpcMessageMetadata())) { - message_slice = message->Ref(); - } - AcceptTransportStatsFromContext(); - SetFinalizationStatus(status, std::move(message_slice)); - set_completed(); - ResetDeadline(); - PropagateCancellationToChildren(); -} +// CallSpine based Server Call grpc_call_error ValidateServerBatch(const grpc_op* ops, size_t nops) { BitSet<8> got_ops; @@ -3371,234 +3160,33 @@ grpc_call_error ValidateServerBatch(const grpc_op* ops, size_t nops) { return GRPC_CALL_OK; } -void ServerPromiseBasedCall::CommitBatch(const grpc_op* ops, size_t nops, - const Completion& completion) { - Party::BulkSpawner spawner(this); - for (size_t op_idx = 0; op_idx < nops; op_idx++) { - const grpc_op& op = ops[op_idx]; - switch (op.op) { - case GRPC_OP_SEND_INITIAL_METADATA: { - auto metadata = arena()->MakePooled(); - PrepareOutgoingInitialMetadata(op, *metadata); - CToMetadata(op.data.send_initial_metadata.metadata, - op.data.send_initial_metadata.count, metadata.get()); - if (grpc_call_trace.enabled()) { - gpr_log(GPR_INFO, "%s[call] Send initial metadata", - DebugTag().c_str()); - } - QueueSend(); - spawner.Spawn( - "call_send_initial_metadata", - [this, metadata = std::move(metadata)]() mutable { - EnactSend(); - return server_initial_metadata_->Push(std::move(metadata)); - }, - [this, - completion = AddOpToCompletion( - completion, PendingOp::kSendInitialMetadata)](bool r) mutable { - if (!r) { - set_failed_before_recv_message(); - FailCompletion(completion); - } - FinishOpOnCompletion(&completion, - PendingOp::kSendInitialMetadata); - }); - } break; - case GRPC_OP_SEND_MESSAGE: - StartSendMessage(op, completion, server_to_client_messages_, spawner); - break; - case GRPC_OP_RECV_MESSAGE: - if (cancelled_.load(std::memory_order_relaxed)) { - set_failed_before_recv_message(); - FailCompletion(completion); - break; - } - StartRecvMessage( - op, completion, []() { return []() { return Empty{}; }; }, - client_to_server_messages_, true, spawner); - break; - case GRPC_OP_SEND_STATUS_FROM_SERVER: { - auto metadata = arena()->MakePooled(); - CToMetadata(op.data.send_status_from_server.trailing_metadata, - op.data.send_status_from_server.trailing_metadata_count, - metadata.get()); - metadata->Set(GrpcStatusMetadata(), - op.data.send_status_from_server.status); - if (auto* details = op.data.send_status_from_server.status_details) { - // TODO(ctiller): this should not be a copy, but we have callers that - // allocate and pass in a slice created with - // grpc_slice_from_static_string and then delete the string after - // passing it in, which shouldn't be a supported API. - metadata->Set(GrpcMessageMetadata(), - Slice(grpc_slice_copy(*details))); - } - spawner.Spawn( - "call_send_status_from_server", - [this, metadata = std::move(metadata)]() mutable { - bool r = true; - if (send_trailing_metadata_.is_set()) { - r = false; - } else { - send_trailing_metadata_.Set(std::move(metadata)); - } - return Map(WaitForSendingStarted(), [this, r](Empty) { - server_initial_metadata_->Close(); - server_to_client_messages_->Close(); - return r; - }); - }, - [this, completion = AddOpToCompletion( - completion, PendingOp::kSendStatusFromServer)]( - bool ok) mutable { - if (!ok) { - set_failed_before_recv_message(); - FailCompletion(completion); - } - FinishOpOnCompletion(&completion, - PendingOp::kSendStatusFromServer); - }); - } break; - case GRPC_OP_RECV_CLOSE_ON_SERVER: - if (grpc_call_trace.enabled()) { - gpr_log(GPR_INFO, "%s[call] StartBatch: RecvClose %s", - DebugTag().c_str(), - recv_close_op_cancel_state_.ToString().c_str()); - } - ForceCompletionSuccess(completion); - recv_close_completion_ = - AddOpToCompletion(completion, PendingOp::kReceiveCloseOnServer); - if (recv_close_op_cancel_state_.ReceiveCloseOnServerOpStarted( - op.data.recv_close_on_server.cancelled)) { - FinishOpOnCompletion(&recv_close_completion_, - PendingOp::kReceiveCloseOnServer); - } - break; - case GRPC_OP_RECV_STATUS_ON_CLIENT: - case GRPC_OP_SEND_CLOSE_FROM_CLIENT: - case GRPC_OP_RECV_INITIAL_METADATA: - abort(); // unreachable - } - } -} - -grpc_call_error ServerPromiseBasedCall::StartBatch(const grpc_op* ops, - size_t nops, - void* notify_tag, - bool is_notify_tag_closure) { - if (nops == 0) { - EndOpImmediately(cq(), notify_tag, is_notify_tag_closure); - return GRPC_CALL_OK; - } - const grpc_call_error validation_result = ValidateServerBatch(ops, nops); - if (validation_result != GRPC_CALL_OK) { - return validation_result; - } - Completion completion = - StartCompletion(notify_tag, is_notify_tag_closure, ops); - CommitBatch(ops, nops, completion); - FinishOpOnCompletion(&completion, PendingOp::kStartingBatch); - return GRPC_CALL_OK; -} - -void ServerPromiseBasedCall::CancelWithError(absl::Status error) { - cancelled_.store(true, std::memory_order_relaxed); - Spawn( - "cancel_with_error", - [this, error = std::move(error)]() { - if (!send_trailing_metadata_.is_set()) { - auto md = ServerMetadataFromStatus(error); - md->Set(GrpcCallWasCancelled(), true); - send_trailing_metadata_.Set(std::move(md)); - } - if (server_to_client_messages_ != nullptr) { - server_to_client_messages_->Close(); - } - if (server_initial_metadata_ != nullptr) { - server_initial_metadata_->Close(); - } - return Empty{}; - }, - [](Empty) {}); -} -#endif - -#ifdef GRPC_EXPERIMENT_IS_INCLUDED_PROMISE_BASED_SERVER_CALL -void ServerPromiseBasedCall::PublishInitialMetadata( - ClientMetadataHandle metadata, - grpc_metadata_array* publish_initial_metadata) { - if (grpc_call_trace.enabled()) { - gpr_log(GPR_INFO, "%s[call] PublishInitialMetadata: %s", DebugTag().c_str(), - metadata->DebugString().c_str()); - } - PublishMetadataArray(metadata.get(), publish_initial_metadata, false); - client_initial_metadata_ = std::move(metadata); -} - -ArenaPromise -ServerPromiseBasedCall::MakeTopOfServerCallPromise( - CallArgs call_args, grpc_completion_queue* cq, - absl::FunctionRef publish) { - SetCompletionQueue(cq); - call_args.polling_entity->Set( - grpc_polling_entity_create_from_pollset(grpc_cq_pollset(cq))); - server_to_client_messages_ = call_args.server_to_client_messages; - client_to_server_messages_ = call_args.client_to_server_messages; - server_initial_metadata_ = call_args.server_initial_metadata; - absl::optional deadline = - client_initial_metadata_->get(GrpcTimeoutMetadata()); - if (deadline.has_value()) { - set_send_deadline(*deadline); - UpdateDeadline(*deadline); - } - ProcessIncomingInitialMetadata(*client_initial_metadata_); - ExternalRef(); - publish(c_ptr()); - return Seq(server_to_client_messages_->AwaitClosed(), - send_trailing_metadata_.Wait()); -} - -/////////////////////////////////////////////////////////////////////////////// -// CallSpine based Server Call - -class ServerCallSpine final : public PipeBasedCallSpine, - public ServerCallContext, - public BasicPromiseBasedCall { +class ServerCall final : public Call, public DualRefCounted { public: - ServerCallSpine(ClientMetadataHandle client_initial_metadata, - ServerInterface* server, Channel* channel, Arena* arena); - - // CallSpineInterface - Pipe& client_initial_metadata() override { - return client_initial_metadata_; - } - Pipe& server_initial_metadata() override { - return server_initial_metadata_; - } - Pipe& client_to_server_messages() override { - return client_to_server_messages_; - } - Pipe& server_to_client_messages() override { - return server_to_client_messages_; + ServerCall(ClientMetadataHandle client_initial_metadata, + CallHandler call_handler, ServerInterface* server, + grpc_completion_queue* cq) + : Call(false, + client_initial_metadata->get(GrpcTimeoutMetadata()) + .value_or(Timestamp::InfFuture()), + call_handler.event_engine()), + call_handler_(std::move(call_handler)), + client_initial_metadata_stored_(std::move(client_initial_metadata)), + cq_(cq), + server_(server) { + call_handler_.legacy_context()[GRPC_CONTEXT_CALL].value = + static_cast(this); + global_stats().IncrementServerCallsCreated(); } - Latch& cancel_latch() override { return cancel_latch_; } - Latch& was_cancelled_latch() override { return was_cancelled_latch_; } - Party& party() override { return *this; } - Arena* arena() override { return BasicPromiseBasedCall::arena(); } - void IncrementRefCount() override { InternalRef("CallSpine"); } - void Unref() override { InternalUnref("CallSpine"); } - // PromiseBasedCall - void OrphanCall() override { - ResetDeadline(); - CancelWithError(absl::CancelledError()); - } void CancelWithError(grpc_error_handle error) override { - SpawnInfallible("CancelWithError", [this, error = std::move(error)] { - auto status = ServerMetadataFromStatus(error); - status->Set(GrpcCallWasCancelled(), true); - PushServerTrailingMetadata(std::move(status)); - return Empty{}; - }); + call_handler_.SpawnInfallible( + "CancelWithError", + [self = WeakRefAsSubclass(), error = std::move(error)] { + auto status = ServerMetadataFromStatus(error); + status->Set(GrpcCallWasCancelled(), true); + self->call_handler_.PushServerTrailingMetadata(std::move(status)); + return Empty{}; + }); } bool is_trailers_only() const override { Crash("is_trailers_only not implemented for server calls"); @@ -3609,102 +3197,78 @@ class ServerCallSpine final : public PipeBasedCallSpine, grpc_call_error StartBatch(const grpc_op* ops, size_t nops, void* notify_tag, bool is_notify_tag_closure) override; - bool Completed() final { Crash("unimplemented"); } - bool failed_before_recv_message() const final { Crash("unimplemented"); } + Arena* arena() override { return call_handler_.arena(); } - ServerCallContext* server_call_context() override { return this; } - const void* server_stream_data() override { Crash("unimplemented"); } - void PublishInitialMetadata( - ClientMetadataHandle metadata, - grpc_metadata_array* publish_initial_metadata) override; - ArenaPromise MakeTopOfServerCallPromise( - CallArgs, grpc_completion_queue*, - absl::FunctionRef) override { - Crash("unimplemented"); + grpc_event_engine::experimental::EventEngine* event_engine() const override { + return call_handler_.event_engine(); } - void V2HackToStartCallWithoutACallFilterStack() override {} + void ExternalRef() override { Ref().release(); } + void ExternalUnref() override { Unref(); } + void InternalRef(const char*) override { WeakRef().release(); } + void InternalUnref(const char*) override { WeakUnref(); } - ClientMetadata& UnprocessedClientInitialMetadata() override { - Crash("not for v2"); + void Orphaned() override { + // TODO(ctiller): only when we're not already finished + CancelWithError(absl::CancelledError()); } - bool RunParty() override { - ScopedContext ctx(this); - return Party::RunParty(); + void ContextSet(grpc_context_index elem, void* value, + void (*destroy)(void*)) override { + call_handler_.legacy_context()[elem] = + grpc_call_context_element{value, destroy}; + } + + void* ContextGet(grpc_context_index elem) const override { + return call_handler_.legacy_context()[elem].value; + } + + void SetCompletionQueue(grpc_completion_queue*) override { + Crash("unimplemented"); + } + + grpc_compression_options compression_options() override { + return server_->compression_options(); } + grpc_call_stack* call_stack() override { return nullptr; } + + char* GetPeer() override { + Slice peer_slice = GetPeerString(); + if (!peer_slice.empty()) { + absl::string_view peer_string_view = peer_slice.as_string_view(); + char* peer_string = + static_cast(gpr_malloc(peer_string_view.size() + 1)); + memcpy(peer_string, peer_string_view.data(), peer_string_view.size()); + peer_string[peer_string_view.size()] = '\0'; + return peer_string; + } + return gpr_strdup("unknown"); + } + + bool Completed() final { Crash("unimplemented"); } + bool failed_before_recv_message() const final { Crash("unimplemented"); } + private: void CommitBatch(const grpc_op* ops, size_t nops, void* notify_tag, bool is_notify_tag_closure); - StatusFlag FinishRecvMessage(NextResult result); + StatusFlag FinishRecvMessage( + ValueOrFailure> result); - std::string DebugTag() const override { - return absl::StrFormat("SERVER_CALL_SPINE[%p]: ", this); - } - - // Initial metadata from client to server - Pipe client_initial_metadata_; - // Initial metadata from server to client - Pipe server_initial_metadata_; - // Messages travelling from the application to the transport. - Pipe client_to_server_messages_; - // Messages travelling from the transport to the application. - Pipe server_to_client_messages_; - // Latch that can be set to terminate the call - Latch cancel_latch_; - Latch was_cancelled_latch_; + std::string DebugTag() { return absl::StrFormat("SERVER_CALL[%p]: ", this); } + + CallHandler call_handler_; grpc_byte_buffer** recv_message_ = nullptr; ClientMetadataHandle client_initial_metadata_stored_; + grpc_completion_queue* const cq_; + ServerInterface* const server_; }; -ServerCallSpine::ServerCallSpine(ClientMetadataHandle client_initial_metadata, - ServerInterface* server, Channel* channel, - Arena* arena) - : BasicPromiseBasedCall(arena, 0, 1, - [channel, server]() -> grpc_call_create_args { - grpc_call_create_args args; - args.channel = channel->Ref(); - args.server = server; - args.parent = nullptr; - args.propagation_mask = 0; - args.cq = nullptr; - args.pollset_set_alternative = nullptr; - args.server_transport_data = - &args; // Arbitrary non-null pointer - args.send_deadline = Timestamp::InfFuture(); - return args; - }()), - client_initial_metadata_(arena), - server_initial_metadata_(arena), - client_to_server_messages_(arena), - server_to_client_messages_(arena) { - global_stats().IncrementServerCallsCreated(); - ScopedContext ctx(this); - channel->channel_stack()->InitServerCallSpine(this); - SpawnGuarded("push_client_initial_metadata", - [this, md = std::move(client_initial_metadata)]() mutable { - return Map(client_initial_metadata_.sender.Push(std::move(md)), - [](bool r) { return StatusFlag(r); }); - }); -} - -void ServerCallSpine::PublishInitialMetadata( - ClientMetadataHandle metadata, - grpc_metadata_array* publish_initial_metadata) { - if (grpc_call_trace.enabled()) { - gpr_log(GPR_INFO, "%s[call] PublishInitialMetadata: %s", DebugTag().c_str(), - metadata->DebugString().c_str()); - } - PublishMetadataArray(metadata.get(), publish_initial_metadata, false); - client_initial_metadata_stored_ = std::move(metadata); -} - -grpc_call_error ServerCallSpine::StartBatch(const grpc_op* ops, size_t nops, - void* notify_tag, - bool is_notify_tag_closure) { +grpc_call_error ServerCall::StartBatch(const grpc_op* ops, size_t nops, + void* notify_tag, + bool is_notify_tag_closure) { if (nops == 0) { - EndOpImmediately(cq(), notify_tag, is_notify_tag_closure); + EndOpImmediately(cq_, notify_tag, is_notify_tag_closure); return GRPC_CALL_OK; } const grpc_call_error validation_result = ValidateServerBatch(ops, nops); @@ -3716,63 +3280,86 @@ grpc_call_error ServerCallSpine::StartBatch(const grpc_op* ops, size_t nops, } namespace { -template +template class MaybeOpImpl { public: - using SetupResult = decltype(std::declval()(grpc_op())); using PromiseFactory = promise_detail::OncePromiseFactory; using Promise = typename PromiseFactory::Promise; - struct Dismissed {}; - using State = absl::variant; + static_assert(!std::is_same::value, + "PromiseFactory must return a promise"); + + MaybeOpImpl() : state_(State::kDismissed) {} + explicit MaybeOpImpl(SetupResult result) : state_(State::kPromiseFactory) { + Construct(&promise_factory_, std::move(result)); + } - // op_ is garbage but shouldn't be uninitialized - MaybeOpImpl() : state_(Dismissed{}), op_(GRPC_OP_RECV_STATUS_ON_CLIENT) {} - MaybeOpImpl(SetupResult result, grpc_op_type op) - : state_(PromiseFactory(std::move(result))), op_(op) {} + ~MaybeOpImpl() { + switch (state_) { + case State::kDismissed: + break; + case State::kPromiseFactory: + Destruct(&promise_factory_); + break; + case State::kPromise: + Destruct(&promise_); + break; + } + } MaybeOpImpl(const MaybeOpImpl&) = delete; MaybeOpImpl& operator=(const MaybeOpImpl&) = delete; - MaybeOpImpl(MaybeOpImpl&& other) noexcept - : state_(MoveState(other.state_)), op_(other.op_) {} - MaybeOpImpl& operator=(MaybeOpImpl&& other) noexcept { - op_ = other.op_; - if (absl::holds_alternative(state_)) { - state_.template emplace(); - return *this; + MaybeOpImpl(MaybeOpImpl&& other) noexcept : state_(other.state_) { + switch (state_) { + case State::kDismissed: + break; + case State::kPromiseFactory: + Construct(&promise_factory_, std::move(other.promise_factory_)); + break; + case State::kPromise: + Construct(&promise_, std::move(other.promise_)); + break; } - // Can't move after first poll => Promise is not an option - state_.template emplace( - std::move(absl::get(other.state_))); - return *this; } + MaybeOpImpl& operator=(MaybeOpImpl&& other) noexcept = delete; Poll operator()() { - if (absl::holds_alternative(state_)) return Success{}; - if (absl::holds_alternative(state_)) { - auto& factory = absl::get(state_); - auto promise = factory.Make(); - state_.template emplace(std::move(promise)); - } - if (grpc_call_trace.enabled()) { - gpr_log(GPR_INFO, "%sBeginPoll %s", - Activity::current()->DebugTag().c_str(), OpName(op_).c_str()); - } - auto& promise = absl::get(state_); - auto r = poll_cast(promise()); - if (grpc_call_trace.enabled()) { - gpr_log(GPR_INFO, "%sEndPoll %s --> %s", - Activity::current()->DebugTag().c_str(), OpName(op_).c_str(), + switch (state_) { + case State::kDismissed: + return Success{}; + case State::kPromiseFactory: { + auto promise = promise_factory_.Make(); + Destruct(&promise_factory_); + Construct(&promise_, std::move(promise)); + state_ = State::kPromise; + } + ABSL_FALLTHROUGH_INTENDED; + case State::kPromise: { + if (grpc_call_trace.enabled()) { + gpr_log(GPR_INFO, "%sBeginPoll %s", + Activity::current()->DebugTag().c_str(), OpName()); + } + auto r = poll_cast(promise_()); + if (grpc_call_trace.enabled()) { + gpr_log( + GPR_INFO, "%sEndPoll %s --> %s", + Activity::current()->DebugTag().c_str(), OpName(), r.pending() ? "PENDING" : (r.value().ok() ? "OK" : "FAILURE")); + } + return r; + } } - return r; + GPR_UNREACHABLE_CODE(return Pending{}); } private: - GPR_NO_UNIQUE_ADDRESS State state_; - GPR_NO_UNIQUE_ADDRESS grpc_op_type op_; + enum class State { + kDismissed, + kPromiseFactory, + kPromise, + }; - static std::string OpName(grpc_op_type op) { - switch (op) { + static const char* OpName() { + switch (kOp) { case GRPC_OP_SEND_INITIAL_METADATA: return "SendInitialMetadata"; case GRPC_OP_SEND_MESSAGE: @@ -3790,30 +3377,34 @@ class MaybeOpImpl { case GRPC_OP_RECV_STATUS_ON_CLIENT: return "RecvStatusOnClient"; } - return absl::StrCat("UnknownOp(", op, ")"); + Crash("Unreachable"); } - static State MoveState(State& state) { - if (absl::holds_alternative(state)) return Dismissed{}; - // Can't move after first poll => Promise is not an option - return std::move(absl::get(state)); - } + // gcc-12 has problems with this being a variant + GPR_NO_UNIQUE_ADDRESS State state_; + union { + PromiseFactory promise_factory_; + Promise promise_; + }; }; -// MaybeOp captures a fairly complicated dance we need to do for the batch API. -// We first check if an op is included or not, and if it is, we run the setup -// function in the context of the API call (NOT in the call party). -// This setup function returns a promise factory which we'll then run *in* the +// MaybeOp captures a fairly complicated dance we need to do for the batch +// API. We first check if an op is included or not, and if it is, we run the +// setup function in the context of the API call (NOT in the call party). This +// setup function returns a promise factory which we'll then run *in* the // party to do initial setup, and have it return the promise that we'll // ultimately poll on til completion. // Once we express our surface API in terms of core internal types this whole // dance will go away. -template -auto MaybeOp(const grpc_op* ops, uint8_t idx, SetupFn setup) { - if (idx == 255) { - return MaybeOpImpl(); +template +auto MaybeOp(const grpc_op* ops, const std::array& idxs, + SetupFn setup) { + using SetupResult = decltype(std::declval()(grpc_op())); + if (idxs[op_type] == 255) { + return MaybeOpImpl(); } else { - return MaybeOpImpl(setup(ops[idx]), ops[idx].op); + auto r = setup(ops[idxs[op_type]]); + return MaybeOpImpl(std::move(r)); } } @@ -3851,63 +3442,61 @@ PollBatchLogger LogPollBatch(void* tag, F f) { } } // namespace -StatusFlag ServerCallSpine::FinishRecvMessage( - NextResult result) { - if (result.has_value()) { - MessageHandle& message = *result; - NoteLastMessageFlags(message->flags()); - if ((message->flags() & GRPC_WRITE_INTERNAL_COMPRESS) && - (incoming_compression_algorithm() != GRPC_COMPRESS_NONE)) { - *recv_message_ = grpc_raw_compressed_byte_buffer_create( - nullptr, 0, incoming_compression_algorithm()); - } else { - *recv_message_ = grpc_raw_byte_buffer_create(nullptr, 0); - } - grpc_slice_buffer_move_into(message->payload()->c_slice_buffer(), - &(*recv_message_)->data.raw.slice_buffer); +StatusFlag ServerCall::FinishRecvMessage( + ValueOrFailure> result) { + if (!result.ok()) { if (grpc_call_trace.enabled()) { gpr_log(GPR_INFO, "%s[call] RecvMessage: outstanding_recv " - "finishes: received %" PRIdPTR " byte message", - DebugTag().c_str(), - (*recv_message_)->data.raw.slice_buffer.length); + "finishes: received end-of-stream with error", + DebugTag().c_str()); } + *recv_message_ = nullptr; recv_message_ = nullptr; - return Success{}; + return Failure{}; } - if (result.cancelled()) { + if (!result->has_value()) { if (grpc_call_trace.enabled()) { gpr_log(GPR_INFO, "%s[call] RecvMessage: outstanding_recv " - "finishes: received end-of-stream with error", + "finishes: received end-of-stream", DebugTag().c_str()); } *recv_message_ = nullptr; recv_message_ = nullptr; - return Failure{}; + return Success{}; } + MessageHandle& message = **result; + NoteLastMessageFlags(message->flags()); + if ((message->flags() & GRPC_WRITE_INTERNAL_COMPRESS) && + (incoming_compression_algorithm() != GRPC_COMPRESS_NONE)) { + *recv_message_ = grpc_raw_compressed_byte_buffer_create( + nullptr, 0, incoming_compression_algorithm()); + } else { + *recv_message_ = grpc_raw_byte_buffer_create(nullptr, 0); + } + grpc_slice_buffer_move_into(message->payload()->c_slice_buffer(), + &(*recv_message_)->data.raw.slice_buffer); if (grpc_call_trace.enabled()) { gpr_log(GPR_INFO, "%s[call] RecvMessage: outstanding_recv " - "finishes: received end-of-stream", - DebugTag().c_str()); + "finishes: received %" PRIdPTR " byte message", + DebugTag().c_str(), (*recv_message_)->data.raw.slice_buffer.length); } - *recv_message_ = nullptr; recv_message_ = nullptr; return Success{}; } -void ServerCallSpine::CommitBatch(const grpc_op* ops, size_t nops, - void* notify_tag, - bool is_notify_tag_closure) { +void ServerCall::CommitBatch(const grpc_op* ops, size_t nops, void* notify_tag, + bool is_notify_tag_closure) { std::array got_ops{255, 255, 255, 255, 255, 255, 255, 255}; for (size_t op_idx = 0; op_idx < nops; op_idx++) { const grpc_op& op = ops[op_idx]; got_ops[op.op] = op_idx; } - if (!is_notify_tag_closure) grpc_cq_begin_op(cq(), notify_tag); - auto send_initial_metadata = MaybeOp( - ops, got_ops[GRPC_OP_SEND_INITIAL_METADATA], [this](const grpc_op& op) { + if (!is_notify_tag_closure) grpc_cq_begin_op(cq_, notify_tag); + auto send_initial_metadata = MaybeOp( + ops, got_ops, [this](const grpc_op& op) { auto metadata = arena()->MakePooled(); PrepareOutgoingInitialMetadata(op, *metadata); CToMetadata(op.data.send_initial_metadata.metadata, @@ -3917,27 +3506,22 @@ void ServerCallSpine::CommitBatch(const grpc_op* ops, size_t nops, DebugTag().c_str()); } return [this, metadata = std::move(metadata)]() mutable { - return Map(server_initial_metadata_.sender.Push(std::move(metadata)), - [this](bool r) { - server_initial_metadata_.sender.Close(); - return StatusFlag(r); - }); + return call_handler_.PushServerInitialMetadata(std::move(metadata)); }; }); auto send_message = - MaybeOp(ops, got_ops[GRPC_OP_SEND_MESSAGE], [this](const grpc_op& op) { + MaybeOp(ops, got_ops, [this](const grpc_op& op) { SliceBuffer send; grpc_slice_buffer_swap( &op.data.send_message.send_message->data.raw.slice_buffer, send.c_slice_buffer()); auto msg = arena()->MakePooled(std::move(send), op.flags); return [this, msg = std::move(msg)]() mutable { - return Map(server_to_client_messages_.sender.Push(std::move(msg)), - [](bool r) { return StatusFlag(r); }); + return call_handler_.PushMessage(std::move(msg)); }; }); - auto send_trailing_metadata = MaybeOp( - ops, got_ops[GRPC_OP_SEND_STATUS_FROM_SERVER], [this](const grpc_op& op) { + auto send_trailing_metadata = MaybeOp( + ops, got_ops, [this](const grpc_op& op) { auto metadata = arena()->MakePooled(); CToMetadata(op.data.send_status_from_server.trailing_metadata, op.data.send_status_from_server.trailing_metadata_count, @@ -3958,18 +3542,18 @@ void ServerCallSpine::CommitBatch(const grpc_op* ops, size_t nops, return [this, metadata = std::move(metadata)]() mutable -> Poll { CHECK(metadata != nullptr); - PushServerTrailingMetadata(std::move(metadata)); + call_handler_.PushServerTrailingMetadata(std::move(metadata)); return Success{}; }; }; }); auto recv_message = - MaybeOp(ops, got_ops[GRPC_OP_RECV_MESSAGE], [this](const grpc_op& op) { + MaybeOp(ops, got_ops, [this](const grpc_op& op) { CHECK_EQ(recv_message_, nullptr); recv_message_ = op.data.recv_message.recv_message; return [this]() mutable { - return Map(client_to_server_messages_.receiver.Next(), - [this](NextResult msg) { + return Map(call_handler_.PullMessage(), + [this](ValueOrFailure> msg) { return FinishRecvMessage(std::move(msg)); }); }; @@ -3980,10 +3564,10 @@ void ServerCallSpine::CommitBatch(const grpc_op* ops, size_t nops, std::move(send_trailing_metadata)), std::move(recv_message)); if (got_ops[GRPC_OP_RECV_CLOSE_ON_SERVER] != 255) { - auto recv_trailing_metadata = MaybeOp( - ops, got_ops[GRPC_OP_RECV_CLOSE_ON_SERVER], [this](const grpc_op& op) { + auto recv_trailing_metadata = MaybeOp( + ops, got_ops, [this](const grpc_op& op) { return [this, cancelled = op.data.recv_close_on_server.cancelled]() { - return Map(WasCancelled(), + return Map(call_handler_.WasCancelled(), [cancelled, this](bool result) -> Success { ResetDeadline(); *cancelled = result ? 1 : 0; @@ -3991,7 +3575,7 @@ void ServerCallSpine::CommitBatch(const grpc_op* ops, size_t nops, }); }; }); - SpawnInfallible( + call_handler_.SpawnInfallible( "final-batch", [primary_ops = std::move(primary_ops), recv_trailing_metadata = std::move(recv_trailing_metadata), @@ -4001,37 +3585,38 @@ void ServerCallSpine::CommitBatch(const grpc_op* ops, size_t nops, Seq(std::move(primary_ops), std::move(recv_trailing_metadata), [is_notify_tag_closure, notify_tag, this](StatusFlag) { return WaitForCqEndOp(is_notify_tag_closure, notify_tag, - absl::OkStatus(), cq()); + absl::OkStatus(), cq_); })); }); } else { - SpawnInfallible("batch", [primary_ops = std::move(primary_ops), - is_notify_tag_closure, notify_tag, - this]() mutable { - return LogPollBatch( - notify_tag, - Seq(std::move(primary_ops), - [is_notify_tag_closure, notify_tag, this](StatusFlag r) { + call_handler_.SpawnInfallible( + "batch", [primary_ops = std::move(primary_ops), is_notify_tag_closure, + notify_tag, this]() mutable { + return LogPollBatch( + notify_tag, + Seq(std::move(primary_ops), [is_notify_tag_closure, notify_tag, + this](StatusFlag r) { return WaitForCqEndOp(is_notify_tag_closure, notify_tag, - StatusCast(r), cq()); + StatusCast(r), cq_); })); - }); + }); } } -RefCountedPtr MakeServerCall( - ClientMetadataHandle client_initial_metadata, ServerInterface* server, - Channel* channel, Arena* arena) { - return RefCountedPtr(arena->New( - std::move(client_initial_metadata), server, channel, arena)); +grpc_call* MakeServerCall(CallHandler call_handler, + ClientMetadataHandle client_initial_metadata, + ServerInterface* server, grpc_completion_queue* cq, + grpc_metadata_array* publish_initial_metadata) { + PublishMetadataArray(client_initial_metadata.get(), publish_initial_metadata, + false); + // TODO(ctiller): ideally we'd put this in the arena with the CallHandler, + // but there's an ownership problem: CallHandler owns the arena, and so would + // get destroyed before the base class Call destructor runs, leading to + // UB/crash. Investigate another path. + return (new ServerCall(std::move(client_initial_metadata), + std::move(call_handler), server, cq)) + ->c_ptr(); } -#else -RefCountedPtr MakeServerCall(ClientMetadataHandle, - ServerInterface*, Channel*, - Arena*) { - Crash("not implemented"); -} -#endif } // namespace grpc_core diff --git a/src/core/lib/surface/call.h b/src/core/lib/surface/call.h index 9fb12f279e4..9388c142f67 100644 --- a/src/core/lib/surface/call.h +++ b/src/core/lib/surface/call.h @@ -82,7 +82,7 @@ class Call : public CppImplOf, public grpc_event_engine::experimental::EventEngine:: Closure /* for deadlines */ { public: - Arena* arena() { return arena_; } + virtual Arena* arena() = 0; bool is_client() const { return is_client_; } virtual void ContextSet(grpc_context_index elem, void* value, @@ -92,7 +92,7 @@ class Call : public CppImplOf, void CancelWithStatus(grpc_status_code status, const char* description); virtual void CancelWithError(grpc_error_handle error) = 0; virtual void SetCompletionQueue(grpc_completion_queue* cq) = 0; - char* GetPeer(); + virtual char* GetPeer() = 0; virtual grpc_call_error StartBatch(const grpc_op* ops, size_t nops, void* notify_tag, bool is_notify_tag_closure) = 0; @@ -157,25 +157,15 @@ class Call : public CppImplOf, Call* sibling_prev = nullptr; }; - Call(Arena* arena, bool is_client, Timestamp send_deadline, - RefCountedPtr channel) - : channel_(std::move(channel)), - arena_(arena), - send_deadline_(send_deadline), - is_client_(is_client) { - DCHECK_NE(arena_, nullptr); - DCHECK(channel_ != nullptr); - } + Call(bool is_client, Timestamp send_deadline, + grpc_event_engine::experimental::EventEngine* event_engine) + : send_deadline_(send_deadline), + is_client_(is_client), + event_engine_(event_engine) {} ~Call() override = default; - void DeleteThis(); - ParentCall* GetOrCreateParentCall(); ParentCall* parent_call(); - Channel* channel() const { - DCHECK(channel_ != nullptr); - return channel_.get(); - } absl::Status InitParent(Call* parent, uint32_t propagation_mask); void PublishToParent(Call* parent); @@ -221,9 +211,9 @@ class Call : public CppImplOf, gpr_cycle_counter start_time() const { return start_time_; } + virtual grpc_compression_options compression_options() = 0; + private: - RefCountedPtr channel_; - Arena* const arena_; std::atomic parent_call_{nullptr}; ChildCall* child_ = nullptr; Timestamp send_deadline_; @@ -247,34 +237,13 @@ class Call : public CppImplOf, Timestamp deadline_ ABSL_GUARDED_BY(deadline_mu_) = Timestamp::InfFuture(); grpc_event_engine::experimental::EventEngine::TaskHandle ABSL_GUARDED_BY( deadline_mu_) deadline_task_; + grpc_event_engine::experimental::EventEngine* const event_engine_; gpr_cycle_counter start_time_ = gpr_get_cycle_counter(); }; class BasicPromiseBasedCall; class ServerPromiseBasedCall; -class ServerCallContext { - public: - virtual void PublishInitialMetadata( - ClientMetadataHandle metadata, - grpc_metadata_array* publish_initial_metadata) = 0; - - // Construct the top of the server call promise for the v2 filter stack. - // TODO(ctiller): delete when v3 is available. - virtual ArenaPromise MakeTopOfServerCallPromise( - CallArgs call_args, grpc_completion_queue* cq, - absl::FunctionRef publish) = 0; - - // Server stream data as supplied by the transport (so we can link the - // transport stream up with the call again). - // TODO(ctiller): legacy API - once we move transports to promises we'll - // create the promise directly and not need to pass around this token. - virtual const void* server_stream_data() = 0; - - protected: - ~ServerCallContext() = default; -}; - // TODO(ctiller): move more call things into this type class CallContext { public: @@ -300,8 +269,6 @@ class CallContext { gpr_atm* peer_string_atm_ptr(); gpr_cycle_counter call_start_time() { return start_time_; } - ServerCallContext* server_call_context(); - void set_traced(bool traced) { traced_ = traced; } bool traced() const { return traced_; } @@ -329,9 +296,10 @@ template <> struct ContextType {}; // TODO(ctiller): remove once call-v3 finalized -RefCountedPtr MakeServerCall( - ClientMetadataHandle client_initial_metadata, ServerInterface* server, - Channel* channel, Arena* arena); +grpc_call* MakeServerCall(CallHandler call_handler, + ClientMetadataHandle client_initial_metadata, + ServerInterface* server, grpc_completion_queue* cq, + grpc_metadata_array* publish_initial_metadata); } // namespace grpc_core diff --git a/src/core/lib/surface/channel_init.cc b/src/core/lib/surface/channel_init.cc index b94b189ffea..698a57b195d 100644 --- a/src/core/lib/surface/channel_init.cc +++ b/src/core/lib/surface/channel_init.cc @@ -104,9 +104,9 @@ ChannelInit::FilterRegistration::ExcludeFromMinimalStack() { ChannelInit::FilterRegistration& ChannelInit::Builder::RegisterFilter( grpc_channel_stack_type type, const grpc_channel_filter* filter, - const ChannelFilterVtable* vtable, SourceLocation registration_source) { + FilterAdder filter_adder, SourceLocation registration_source) { filters_[type].emplace_back(std::make_unique( - filter, vtable, registration_source)); + filter, filter_adder, registration_source)); return *filters_[type].back(); } @@ -223,9 +223,10 @@ ChannelInit::StackConfig ChannelInit::BuildStackConfig( while (!dependencies.empty()) { auto filter = take_ready_dependency(); auto* registration = filter_to_registration[filter]; - filters.emplace_back( - filter, registration->vtable_, std::move(registration->predicates_), - registration->skip_v3_, registration->registration_source_); + filters.emplace_back(filter, registration->filter_adder_, + std::move(registration->predicates_), + registration->skip_v3_, + registration->registration_source_); for (auto& p : dependencies) { p.second.erase(filter); } @@ -406,78 +407,21 @@ bool ChannelInit::CreateStack(ChannelStackBuilder* builder) const { return true; } -absl::StatusOr ChannelInit::CreateStackSegment( - grpc_channel_stack_type type, const ChannelArgs& args) const { +void ChannelInit::AddToInterceptionChainBuilder( + grpc_channel_stack_type type, InterceptionChainBuilder& builder) const { const auto& stack_config = stack_configs_[type]; - std::vector filters; - size_t channel_data_size = 0; - size_t channel_data_alignment = 0; // Based on predicates build a list of filters to include in this segment. for (const auto& filter : stack_config.filters) { if (filter.skip_v3) continue; - if (!filter.CheckPredicates(args)) continue; - if (filter.vtable == nullptr) { - return absl::InvalidArgumentError( + if (!filter.CheckPredicates(builder.channel_args())) continue; + if (filter.filter_adder == nullptr) { + builder.Fail(absl::InvalidArgumentError( absl::StrCat("Filter ", NameFromChannelFilter(filter.filter), - " has no v3-callstack vtable")); + " has no v3-callstack vtable"))); + return; } - channel_data_alignment = - std::max(channel_data_alignment, filter.vtable->alignment); - if (channel_data_size % filter.vtable->alignment != 0) { - channel_data_size += filter.vtable->alignment - - (channel_data_size % filter.vtable->alignment); - } - filters.push_back({channel_data_size, filter.vtable}); - channel_data_size += filter.vtable->size; - } - // Shortcut for empty segments. - if (filters.empty()) return StackSegment(); - // Allocate memory for the channel data, initialize channel filters into it. - uint8_t* p = static_cast( - gpr_malloc_aligned(channel_data_size, channel_data_alignment)); - for (size_t i = 0; i < filters.size(); i++) { - auto r = filters[i].vtable->init(p + filters[i].offset, args); - if (!r.ok()) { - for (size_t j = 0; j < i; j++) { - filters[j].vtable->destroy(p + filters[j].offset); - } - gpr_free_aligned(p); - return r; - } - } - return StackSegment(std::move(filters), p); -} - -/////////////////////////////////////////////////////////////////////////////// -// ChannelInit::StackSegment - -ChannelInit::StackSegment::StackSegment(std::vector filters, - uint8_t* channel_data) - : data_(MakeRefCounted(std::move(filters), channel_data)) {} - -void ChannelInit::StackSegment::AddToCallFilterStack( - CallFilters::StackBuilder& builder) { - if (data_ == nullptr) return; - data_->AddToCallFilterStack(builder); - builder.AddOwnedObject(data_); -}; - -ChannelInit::StackSegment::ChannelData::ChannelData( - std::vector filters, uint8_t* channel_data) - : filters_(std::move(filters)), channel_data_(channel_data) {} - -void ChannelInit::StackSegment::ChannelData::AddToCallFilterStack( - CallFilters::StackBuilder& builder) { - for (const auto& filter : filters_) { - filter.vtable->add_to_stack_builder(channel_data_ + filter.offset, builder); - } -} - -ChannelInit::StackSegment::ChannelData::~ChannelData() { - for (const auto& filter : filters_) { - filter.vtable->destroy(channel_data_ + filter.offset); + filter.filter_adder(builder); } - gpr_free_aligned(channel_data_); } } // namespace grpc_core diff --git a/src/core/lib/surface/channel_init.h b/src/core/lib/surface/channel_init.h index fcfef582994..c5067394014 100644 --- a/src/core/lib/surface/channel_init.h +++ b/src/core/lib/surface/channel_init.h @@ -38,6 +38,7 @@ #include "src/core/lib/gprpp/debug_location.h" #include "src/core/lib/surface/channel_stack_type.h" #include "src/core/lib/transport/call_filters.h" +#include "src/core/lib/transport/interception_chain.h" /// This module provides a way for plugins (and the grpc core library itself) /// to register mutators for channel stacks. @@ -68,6 +69,8 @@ class ChannelInit { using InclusionPredicate = absl::AnyInvocable; // Post processor for the channel stack - applied in PostProcessorSlot order using PostProcessor = absl::AnyInvocable; + // Function that can be called to add a filter to a stack builder + using FilterAdder = void (*)(InterceptionChainBuilder&); // Post processing slots - up to one PostProcessor per slot can be registered // They run after filters registered are added to the channel stack builder, // but before Build is called - allowing ad-hoc mutation to the channel stack. @@ -77,25 +80,15 @@ class ChannelInit { kCount }; - // Vtable-like data structure for channel data initialization - struct ChannelFilterVtable { - size_t size; - size_t alignment; - absl::Status (*init)(void* data, const ChannelArgs& args); - void (*destroy)(void* data); - void (*add_to_stack_builder)(void* data, - CallFilters::StackBuilder& builder); - }; - class FilterRegistration { public: // TODO(ctiller): Remove grpc_channel_filter* arg when that can be // deprecated (once filter stack is removed). explicit FilterRegistration(const grpc_channel_filter* filter, - const ChannelFilterVtable* vtable, + FilterAdder filter_adder, SourceLocation registration_source) : filter_(filter), - vtable_(vtable), + filter_adder_(filter_adder), registration_source_(registration_source) {} FilterRegistration(const FilterRegistration&) = delete; FilterRegistration& operator=(const FilterRegistration&) = delete; @@ -170,7 +163,7 @@ class ChannelInit { private: friend class ChannelInit; const grpc_channel_filter* const filter_; - const ChannelFilterVtable* const vtable_; + const FilterAdder filter_adder_; std::vector after_; std::vector before_; std::vector predicates_; @@ -188,16 +181,17 @@ class ChannelInit { // properties of the filter being registered. // TODO(ctiller): remove in favor of the version that does not mention // grpc_channel_filter - FilterRegistration& RegisterFilter( - grpc_channel_stack_type type, const grpc_channel_filter* filter, - const ChannelFilterVtable* vtable = nullptr, - SourceLocation registration_source = {}); + FilterRegistration& RegisterFilter(grpc_channel_stack_type type, + const grpc_channel_filter* filter, + FilterAdder filter_adder = nullptr, + SourceLocation registration_source = {}); template FilterRegistration& RegisterFilter( grpc_channel_stack_type type, SourceLocation registration_source = {}) { - return RegisterFilter(type, &Filter::kFilter, - VtableForType::vtable(), - registration_source); + return RegisterFilter( + type, &Filter::kFilter, + [](InterceptionChainBuilder& builder) { builder.Add(); }, + registration_source); } // Filter does not participate in v3 @@ -232,58 +226,13 @@ class ChannelInit { [static_cast(PostProcessorSlot::kCount)]; }; - // A set of channel filters that can be added to a call stack. - // TODO(ctiller): move this out so it can be used independently of - // the global registration mechanisms. - class StackSegment final { - public: - // Registration of one channel filter in the stack. - struct ChannelFilter { - size_t offset; - const ChannelFilterVtable* vtable; - }; - - StackSegment() = default; - explicit StackSegment(std::vector filters, - uint8_t* channel_data); - StackSegment(const StackSegment& other) = delete; - StackSegment& operator=(const StackSegment& other) = delete; - StackSegment(StackSegment&& other) noexcept = default; - StackSegment& operator=(StackSegment&& other) = default; - - // Add this segment to a call filter stack builder - void AddToCallFilterStack(CallFilters::StackBuilder& builder); - - private: - // Combined channel data for the stack - class ChannelData : public RefCounted { - public: - explicit ChannelData(std::vector filters, - uint8_t* channel_data); - ~ChannelData() override; - - void AddToCallFilterStack(CallFilters::StackBuilder& builder); - - private: - std::vector filters_; - uint8_t* channel_data_; - }; - - RefCountedPtr data_; - }; - /// Construct a channel stack of some sort: see channel_stack.h for details /// \a builder is the channel stack builder to build into. GRPC_MUST_USE_RESULT bool CreateStack(ChannelStackBuilder* builder) const; - // Create a segment of a channel stack. - // Terminators and post processors are not included in this construction: - // terminators are a legacy filter-stack concept, and post processors - // need to migrate to other mechanisms. - // TODO(ctiller): figure out other mechanisms. - absl::StatusOr CreateStackSegment( - grpc_channel_stack_type type, const ChannelArgs& args) const; + void AddToInterceptionChainBuilder(grpc_channel_stack_type type, + InterceptionChainBuilder& builder) const; private: // The type of object returned by a filter's Create method. @@ -292,16 +241,16 @@ class ChannelInit { typename decltype(T::Create(ChannelArgs(), {}))::value_type; struct Filter { - Filter(const grpc_channel_filter* filter, const ChannelFilterVtable* vtable, + Filter(const grpc_channel_filter* filter, FilterAdder filter_adder, std::vector predicates, bool skip_v3, SourceLocation registration_source) : filter(filter), - vtable(vtable), + filter_adder(filter_adder), predicates(std::move(predicates)), registration_source(registration_source), skip_v3(skip_v3) {} const grpc_channel_filter* filter; - const ChannelFilterVtable* vtable; + const FilterAdder filter_adder; std::vector predicates; SourceLocation registration_source; bool skip_v3 = false; @@ -313,17 +262,6 @@ class ChannelInit { std::vector post_processors; }; - template - struct VtableForType { - static const ChannelFilterVtable* vtable() { return nullptr; } - }; - - template - struct VtableForType> { - static const ChannelFilterVtable kVtable; - static const ChannelFilterVtable* vtable() { return &kVtable; } - }; - StackConfig stack_configs_[GRPC_NUM_CHANNEL_STACK_TYPES]; static StackConfig BuildStackConfig( @@ -331,22 +269,6 @@ class ChannelInit { PostProcessor* post_processors, grpc_channel_stack_type type); }; -template -const ChannelInit::ChannelFilterVtable - ChannelInit::VtableForType>::kVtable = { - sizeof(CreatedType), alignof(CreatedType), - [](void* data, const ChannelArgs& args) -> absl::Status { - // TODO(ctiller): fill in ChannelFilter::Args (2nd arg) - absl::StatusOr> r = T::Create(args, {}); - if (!r.ok()) return r.status(); - new (data) CreatedType(std::move(*r)); - return absl::OkStatus(); - }, - [](void* data) { Destruct(static_cast*>(data)); }, - [](void* data, CallFilters::StackBuilder& builder) { - builder.Add(static_cast*>(data)->get()); - }}; - } // namespace grpc_core #endif // GRPC_SRC_CORE_LIB_SURFACE_CHANNEL_INIT_H diff --git a/src/core/lib/surface/init.cc b/src/core/lib/surface/init.cc index 3ff4c77f062..b2a766ac8a0 100644 --- a/src/core/lib/surface/init.cc +++ b/src/core/lib/surface/init.cc @@ -66,10 +66,10 @@ static bool g_shutting_down ABSL_GUARDED_BY(g_init_mu) = false; namespace grpc_core { void RegisterSecurityFilters(CoreConfiguration::Builder* builder) { builder->channel_init() - ->RegisterFilter(GRPC_CLIENT_SUBCHANNEL) + ->RegisterV2Filter(GRPC_CLIENT_SUBCHANNEL) .IfHasChannelArg(GRPC_ARG_SECURITY_CONNECTOR); builder->channel_init() - ->RegisterFilter(GRPC_CLIENT_DIRECT_CHANNEL) + ->RegisterV2Filter(GRPC_CLIENT_DIRECT_CHANNEL) .IfHasChannelArg(GRPC_ARG_SECURITY_CONNECTOR); builder->channel_init() ->RegisterFilter(GRPC_SERVER_CHANNEL) diff --git a/src/core/lib/transport/call_destination.h b/src/core/lib/transport/call_destination.h index 77683e230f5..938e0fd3725 100644 --- a/src/core/lib/transport/call_destination.h +++ b/src/core/lib/transport/call_destination.h @@ -51,6 +51,24 @@ class CallDestination : public DualRefCounted { virtual void HandleCall(CallHandler unstarted_call_handler) = 0; }; +template +auto MakeCallDestinationFromHandlerFunction(HC handle_call) { + class Impl : public CallDestination { + public: + explicit Impl(HC handle_call) : handle_call_(std::move(handle_call)) {} + + void Orphaned() override {} + + void HandleCall(CallHandler call_handler) override { + handle_call_(std::move(call_handler)); + } + + private: + HC handle_call_; + }; + return MakeRefCounted(std::move(handle_call)); +} + } // namespace grpc_core #endif // GRPC_SRC_CORE_LIB_TRANSPORT_CALL_DESTINATION_H diff --git a/src/core/lib/transport/call_filters.h b/src/core/lib/transport/call_filters.h index a9e3a1c5b98..d637b6fb0de 100644 --- a/src/core/lib/transport/call_filters.h +++ b/src/core/lib/transport/call_filters.h @@ -1245,6 +1245,42 @@ const NoInterceptor template const NoInterceptor ServerTrailingMetadataInterceptor::Call::OnFinalize; +template +class ClientInitialMetadataInterceptor { + public: + class Call { + public: + auto OnClientInitialMetadata(ClientMetadata& md, + ClientInitialMetadataInterceptor* filter) { + return filter->fn_(md); + } + static const NoInterceptor OnServerInitialMetadata; + static const NoInterceptor OnClientToServerMessage; + static const NoInterceptor OnServerToClientMessage; + static const NoInterceptor OnServerTrailingMetadata; + static const NoInterceptor OnFinalize; + }; + + explicit ClientInitialMetadataInterceptor(Fn fn) : fn_(std::move(fn)) {} + + private: + GPR_NO_UNIQUE_ADDRESS Fn fn_; +}; +template +const NoInterceptor + ClientInitialMetadataInterceptor::Call::OnServerInitialMetadata; +template +const NoInterceptor + ClientInitialMetadataInterceptor::Call::OnClientToServerMessage; +template +const NoInterceptor + ClientInitialMetadataInterceptor::Call::OnServerToClientMessage; +template +const NoInterceptor + ClientInitialMetadataInterceptor::Call::OnServerTrailingMetadata; +template +const NoInterceptor ClientInitialMetadataInterceptor::Call::OnFinalize; + } // namespace filters_detail // Execution environment for a stack of filters. @@ -1302,6 +1338,14 @@ class CallFilters { AddOwnedObject([](void* p) { delete static_cast(p); }, p.release()); } + template + void AddOnClientInitialMetadata(Fn fn) { + auto filter = std::make_unique< + filters_detail::ClientInitialMetadataInterceptor>(std::move(fn)); + Add(filter.get()); + AddOwnedObject(std::move(filter)); + } + template void AddOnServerTrailingMetadata(Fn fn) { auto filter = std::make_unique< diff --git a/src/core/lib/transport/call_spine.h b/src/core/lib/transport/call_spine.h index 8593e47e9c8..59c1fc2da16 100644 --- a/src/core/lib/transport/call_spine.h +++ b/src/core/lib/transport/call_spine.h @@ -518,6 +518,8 @@ class CallHandler { auto PullMessage() { return spine_->PullClientToServerMessage(); } + auto WasCancelled() { return spine_->WasCancelled(); } + template void SpawnGuarded(absl::string_view name, PromiseFactory promise_factory, DebugLocation whence = {}) { @@ -536,11 +538,15 @@ class CallHandler { Arena* arena() { return spine_->arena(); } - grpc_event_engine::experimental::EventEngine* event_engine() { + grpc_event_engine::experimental::EventEngine* event_engine() const { return DownCast(spine_.get())->event_engine(); } // TODO(ctiller): re-evaluate this API + const grpc_call_context_element* legacy_context() const { + return DownCast(spine_.get())->legacy_context(); + } + grpc_call_context_element* legacy_context() { return DownCast(spine_.get())->legacy_context(); } diff --git a/src/core/lib/transport/interception_chain.h b/src/core/lib/transport/interception_chain.h index 5b05e481ff6..e9dcb937b19 100644 --- a/src/core/lib/transport/interception_chain.h +++ b/src/core/lib/transport/interception_chain.h @@ -175,12 +175,23 @@ class InterceptionChainBuilder final { return *this; }; + // Add a filter that just mutates client initial metadata. + template + void AddOnClientInitialMetadata(F f) { + stack_builder().AddOnClientInitialMetadata(std::move(f)); + } + // Add a filter that just mutates server trailing metadata. template void AddOnServerTrailingMetadata(F f) { stack_builder().AddOnServerTrailingMetadata(std::move(f)); } + void Fail(absl::Status status) { + CHECK(!status.ok()) << status; + if (status_.ok()) status_ = std::move(status); + } + // Build this stack absl::StatusOr> Build( FinalDestination final_destination); diff --git a/src/core/lib/transport/transport.h b/src/core/lib/transport/transport.h index 65f57fdd475..5dbe2c6695f 100644 --- a/src/core/lib/transport/transport.h +++ b/src/core/lib/transport/transport.h @@ -55,6 +55,7 @@ #include "src/core/lib/promise/pipe.h" #include "src/core/lib/resource_quota/arena.h" #include "src/core/lib/slice/slice_buffer.h" +#include "src/core/lib/transport/call_destination.h" #include "src/core/lib/transport/call_final_info.h" #include "src/core/lib/transport/call_spine.h" #include "src/core/lib/transport/connectivity_state.h" @@ -481,6 +482,15 @@ typedef struct grpc_transport_op { grpc_handler_private_op_data handler_private; } grpc_transport_op; +// Allocate a grpc_transport_op, and preconfigure the on_complete closure to +// \a on_complete and then delete the returned transport op +grpc_transport_op* grpc_make_transport_op(grpc_closure* on_complete); +// Allocate a grpc_transport_stream_op_batch, and preconfigure the on_complete +// closure +// to \a on_complete and then delete the returned transport op +grpc_transport_stream_op_batch* grpc_make_transport_stream_op( + grpc_closure* on_complete); + void grpc_transport_stream_op_batch_finish_with_failure( grpc_transport_stream_op_batch* batch, grpc_error_handle error, grpc_core::CallCombiner* call_combiner); @@ -507,6 +517,21 @@ class Transport : public InternallyRefCounted { struct RawPointerChannelArgTag {}; static absl::string_view ChannelArgName() { return GRPC_ARG_TRANSPORT; } + // Though internally ref counted transports expose their "Ref" method to + // create a RefCountedPtr to themselves. The OrphanablePtr owner is the + // singleton decision maker on whether the transport should be destroyed or + // not. + // TODO(ctiller): consider moving to a DualRefCounted model (with the + // disadvantage that we would accidentally have many strong owners which is + // unnecessary for this type). + RefCountedPtr Ref() { + return InternallyRefCounted::Ref(); + } + template + RefCountedPtr RefAsSubclass() { + return InternallyRefCounted::RefAsSubclass(); + } + virtual FilterStackTransport* filter_stack_transport() = 0; virtual ClientTransport* client_transport() = 0; virtual ServerTransport* server_transport() = 0; @@ -527,6 +552,20 @@ class Transport : public InternallyRefCounted { // implementation of grpc_transport_perform_op virtual void PerformOp(grpc_transport_op* op) = 0; + void StartConnectivityWatch( + OrphanablePtr watcher) { + grpc_transport_op* op = grpc_make_transport_op(nullptr); + op->start_connectivity_watch = std::move(watcher); + PerformOp(op); + } + + void DisconnectWithError(grpc_error_handle error) { + CHECK(!error.ok()) << error; + grpc_transport_op* op = grpc_make_transport_op(nullptr); + op->disconnect_with_error = error; + PerformOp(op); + } + // implementation of grpc_transport_get_endpoint virtual grpc_endpoint* GetEndpoint() = 0; }; @@ -582,24 +621,9 @@ class ClientTransport : public Transport { class ServerTransport : public Transport { public: - // Acceptor helps transports create calls. - class Acceptor { - public: - // Returns an arena that can be used to allocate memory for initial metadata - // parsing, and later passed to CreateCall() as the underlying arena for - // that call. - virtual Arena* CreateArena() = 0; - // Create a call at the server (or fail) - // arena must have been previously allocated by CreateArena() - virtual absl::StatusOr CreateCall( - ClientMetadataHandle client_initial_metadata, Arena* arena) = 0; - - protected: - ~Acceptor() = default; - }; - // Called once slightly after transport setup to register the accept function. - virtual void SetAcceptor(Acceptor* acceptor) = 0; + virtual void SetCallDestination( + RefCountedPtr unstarted_call_handler) = 0; protected: ~ServerTransport() override = default; @@ -607,15 +631,6 @@ class ServerTransport : public Transport { } // namespace grpc_core -// Allocate a grpc_transport_op, and preconfigure the on_complete closure to -// \a on_complete and then delete the returned transport op -grpc_transport_op* grpc_make_transport_op(grpc_closure* on_complete); -// Allocate a grpc_transport_stream_op_batch, and preconfigure the on_complete -// closure -// to \a on_complete and then delete the returned transport op -grpc_transport_stream_op_batch* grpc_make_transport_stream_op( - grpc_closure* on_complete); - namespace grpc_core { // This is the key to be used for loading/storing keepalive_throttling in the // absl::Status object. diff --git a/src/core/plugin_registry/grpc_plugin_registry.cc b/src/core/plugin_registry/grpc_plugin_registry.cc index c0205fa8497..80b4010593e 100644 --- a/src/core/plugin_registry/grpc_plugin_registry.cc +++ b/src/core/plugin_registry/grpc_plugin_registry.cc @@ -79,10 +79,11 @@ namespace { void RegisterBuiltins(CoreConfiguration::Builder* builder) { RegisterServerCallTracerFilter(builder); builder->channel_init() - ->RegisterFilter(GRPC_CLIENT_LAME_CHANNEL) + ->RegisterV2Filter(GRPC_CLIENT_LAME_CHANNEL) .Terminal(); builder->channel_init() ->RegisterFilter(GRPC_SERVER_CHANNEL, &Server::kServerTopFilter) + .SkipV3() .BeforeAll(); } diff --git a/src/core/server/server.cc b/src/core/server/server.cc index 04d0f52da3e..40c87eda174 100644 --- a/src/core/server/server.cc +++ b/src/core/server/server.cc @@ -57,6 +57,7 @@ #include "src/core/lib/gprpp/crash.h" #include "src/core/lib/gprpp/debug_location.h" #include "src/core/lib/gprpp/mpscq.h" +#include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/status_helper.h" #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/iomgr/pollset_set.h" @@ -81,6 +82,7 @@ #include "src/core/lib/surface/wait_for_cq_end_op.h" #include "src/core/lib/transport/connectivity_state.h" #include "src/core/lib/transport/error_utils.h" +#include "src/core/lib/transport/interception_chain.h" namespace grpc_core { @@ -235,7 +237,8 @@ struct Server::RequestedCall { template void Complete(OptionalPayload payload, ClientMetadata& md) { - Timestamp deadline = GetContext()->deadline(); + Timestamp deadline = + md.get(GrpcTimeoutMetadata()).value_or(Timestamp::InfFuture()); switch (type) { case RequestedCall::Type::BATCH_CALL: CHECK(!payload.has_value()); @@ -288,23 +291,29 @@ struct Server::RequestedCall { // application to explicitly request RPCs and then matching those to incoming // RPCs, along with a slow path by which incoming RPCs are put on a locked // pending list if they aren't able to be matched to an application request. -class Server::RealRequestMatcherFilterStack : public RequestMatcherInterface { +class Server::RealRequestMatcher : public RequestMatcherInterface { public: - explicit RealRequestMatcherFilterStack(Server* server) + explicit RealRequestMatcher(Server* server) : server_(server), requests_per_cq_(server->cqs_.size()) {} - ~RealRequestMatcherFilterStack() override { + ~RealRequestMatcher() override { for (LockedMultiProducerSingleConsumerQueue& queue : requests_per_cq_) { CHECK_EQ(queue.Pop(), nullptr); } - CHECK(pending_.empty()); + CHECK(pending_filter_stack_.empty()); + CHECK(pending_promises_.empty()); } void ZombifyPending() override { - while (!pending_.empty()) { - pending_.front().calld->SetState(CallData::CallState::ZOMBIED); - pending_.front().calld->KillZombie(); - pending_.pop(); + while (!pending_filter_stack_.empty()) { + pending_filter_stack_.front().calld->SetState( + CallData::CallState::ZOMBIED); + pending_filter_stack_.front().calld->KillZombie(); + pending_filter_stack_.pop(); + } + while (!pending_promises_.empty()) { + pending_promises_.front()->Finish(absl::InternalError("Server closed")); + pending_promises_.pop(); } } @@ -329,35 +338,56 @@ class Server::RealRequestMatcherFilterStack : public RequestMatcherInterface { // matching calls struct NextPendingCall { RequestedCall* rc = nullptr; - CallData* pending; + CallData* pending_filter_stack = nullptr; + PendingCallPromises pending_promise; }; while (true) { NextPendingCall pending_call; { MutexLock lock(&server_->mu_call_); - while (!pending_.empty() && - pending_.front().Age() > server_->max_time_in_pending_queue_) { - pending_.front().calld->SetState(CallData::CallState::ZOMBIED); - pending_.front().calld->KillZombie(); - pending_.pop(); + while (!pending_filter_stack_.empty() && + pending_filter_stack_.front().Age() > + server_->max_time_in_pending_queue_) { + pending_filter_stack_.front().calld->SetState( + CallData::CallState::ZOMBIED); + pending_filter_stack_.front().calld->KillZombie(); + pending_filter_stack_.pop(); } - if (!pending_.empty()) { + if (!pending_promises_.empty()) { pending_call.rc = reinterpret_cast( requests_per_cq_[request_queue_index].Pop()); if (pending_call.rc != nullptr) { - pending_call.pending = pending_.front().calld; - pending_.pop(); + pending_call.pending_promise = + std::move(pending_promises_.front()); + pending_promises_.pop(); + } + } else if (!pending_filter_stack_.empty()) { + pending_call.rc = reinterpret_cast( + requests_per_cq_[request_queue_index].Pop()); + if (pending_call.rc != nullptr) { + pending_call.pending_filter_stack = + pending_filter_stack_.front().calld; + pending_filter_stack_.pop(); } } } if (pending_call.rc == nullptr) break; - if (!pending_call.pending->MaybeActivate()) { - // Zombied Call - pending_call.pending->KillZombie(); - requests_per_cq_[request_queue_index].Push( - &pending_call.rc->mpscq_node); + if (pending_call.pending_filter_stack != nullptr) { + if (!pending_call.pending_filter_stack->MaybeActivate()) { + // Zombied Call + pending_call.pending_filter_stack->KillZombie(); + requests_per_cq_[request_queue_index].Push( + &pending_call.rc->mpscq_node); + } else { + pending_call.pending_filter_stack->Publish(request_queue_index, + pending_call.rc); + } } else { - pending_call.pending->Publish(request_queue_index, pending_call.rc); + if (!pending_call.pending_promise->Finish( + server(), request_queue_index, pending_call.rc)) { + requests_per_cq_[request_queue_index].Push( + &pending_call.rc->mpscq_node); + } } } } @@ -395,7 +425,7 @@ class Server::RealRequestMatcherFilterStack : public RequestMatcherInterface { } if (rc == nullptr) { calld->SetState(CallData::CallState::PENDING); - pending_.push(PendingCall{calld}); + pending_filter_stack_.push(PendingCallFilterStack{calld}); return; } } @@ -403,91 +433,6 @@ class Server::RealRequestMatcherFilterStack : public RequestMatcherInterface { calld->Publish(cq_idx, rc); } - ArenaPromise> MatchRequest(size_t) override { - Crash("not implemented for filter stack request matcher"); - } - - Server* server() const final { return server_; } - - private: - Server* const server_; - struct PendingCall { - CallData* calld; - Timestamp created = Timestamp::Now(); - Duration Age() { return Timestamp::Now() - created; } - }; - std::queue pending_; - std::vector requests_per_cq_; -}; - -class Server::RealRequestMatcherPromises : public RequestMatcherInterface { - public: - explicit RealRequestMatcherPromises(Server* server) - : server_(server), requests_per_cq_(server->cqs_.size()) {} - - ~RealRequestMatcherPromises() override { - for (LockedMultiProducerSingleConsumerQueue& queue : requests_per_cq_) { - CHECK_EQ(queue.Pop(), nullptr); - } - } - - void ZombifyPending() override { - while (!pending_.empty()) { - pending_.front()->Finish(absl::InternalError("Server closed")); - pending_.pop(); - } - } - - void KillRequests(grpc_error_handle error) override { - for (size_t i = 0; i < requests_per_cq_.size(); i++) { - RequestedCall* rc; - while ((rc = reinterpret_cast( - requests_per_cq_[i].Pop())) != nullptr) { - server_->FailCall(i, rc, error); - } - } - } - - size_t request_queue_count() const override { - return requests_per_cq_.size(); - } - - void RequestCallWithPossiblePublish(size_t request_queue_index, - RequestedCall* call) override { - if (requests_per_cq_[request_queue_index].Push(&call->mpscq_node)) { - // this was the first queued request: we need to lock and start - // matching calls - struct NextPendingCall { - RequestedCall* rc = nullptr; - PendingCall pending; - }; - while (true) { - NextPendingCall pending_call; - { - MutexLock lock(&server_->mu_call_); - if (!pending_.empty()) { - pending_call.rc = reinterpret_cast( - requests_per_cq_[request_queue_index].Pop()); - if (pending_call.rc != nullptr) { - pending_call.pending = std::move(pending_.front()); - pending_.pop(); - } - } - } - if (pending_call.rc == nullptr) break; - if (!pending_call.pending->Finish(server(), request_queue_index, - pending_call.rc)) { - requests_per_cq_[request_queue_index].Push( - &pending_call.rc->mpscq_node); - } - } - } - } - - void MatchOrQueue(size_t, CallData*) override { - Crash("not implemented for promises"); - } - ArenaPromise> MatchRequest( size_t start_request_queue_index) override { for (size_t i = 0; i < requests_per_cq_.size(); i++) { @@ -509,10 +454,11 @@ class Server::RealRequestMatcherPromises : public RequestMatcherInterface { { std::vector> removed_pending; MutexLock lock(&server_->mu_call_); - while (!pending_.empty() && - pending_.front()->Age() > server_->max_time_in_pending_queue_) { - removed_pending.push_back(std::move(pending_.front())); - pending_.pop(); + while (!pending_promises_.empty() && + pending_promises_.front()->Age() > + server_->max_time_in_pending_queue_) { + removed_pending.push_back(std::move(pending_promises_.front())); + pending_promises_.pop(); } for (loop_count = 0; loop_count < requests_per_cq_.size(); loop_count++) { cq_idx = @@ -521,14 +467,14 @@ class Server::RealRequestMatcherPromises : public RequestMatcherInterface { if (rc != nullptr) break; } if (rc == nullptr) { - if (server_->pending_backlog_protector_.Reject(pending_.size(), + if (server_->pending_backlog_protector_.Reject(pending_promises_.size(), server_->bitgen_)) { return Immediate(absl::ResourceExhaustedError( "Too many pending requests for this server")); } auto w = std::make_shared( GetContext()->MakeOwningWaker()); - pending_.push(w); + pending_promises_.push(w); return OnCancel( [w]() -> Poll> { std::unique_ptr> r( @@ -546,6 +492,11 @@ class Server::RealRequestMatcherPromises : public RequestMatcherInterface { private: Server* const server_; + struct PendingCallFilterStack { + CallData* calld; + Timestamp created = Timestamp::Now(); + Duration Age() { return Timestamp::Now() - created; } + }; struct ActivityWaiter { using ResultType = absl::StatusOr; explicit ActivityWaiter(Waker waker) : waker(std::move(waker)) {} @@ -580,8 +531,9 @@ class Server::RealRequestMatcherPromises : public RequestMatcherInterface { std::atomic result{nullptr}; const Timestamp created = Timestamp::Now(); }; - using PendingCall = std::shared_ptr; - std::queue pending_; + using PendingCallPromises = std::shared_ptr; + std::queue pending_filter_stack_; + std::queue pending_promises_; std::vector requests_per_cq_; }; @@ -784,13 +736,40 @@ class ChannelBroadcaster { } // namespace +// +// Server::TransportConnectivityWatcher +// + +class Server::TransportConnectivityWatcher + : public AsyncConnectivityStateWatcherInterface { + public: + TransportConnectivityWatcher(RefCountedPtr transport, + RefCountedPtr server) + : transport_(std::move(transport)), server_(std::move(server)) {} + + private: + void OnConnectivityStateChange(grpc_connectivity_state new_state, + const absl::Status& /*status*/) override { + // Don't do anything until we are being shut down. + if (new_state != GRPC_CHANNEL_SHUTDOWN) return; + // Shut down channel. + MutexLock lock(&server_->mu_global_); + server_->connections_.erase(transport_.get()); + --server_->connections_open_; + server_->MaybeFinishShutdown(); + } + + RefCountedPtr transport_; + RefCountedPtr server_; +}; + // // Server // const grpc_channel_filter Server::kServerTopFilter = { Server::CallData::StartTransportStreamOpBatch, - Server::ChannelData::MakeCallPromise, + nullptr, [](grpc_channel_element*, CallSpineInterface*) { // TODO(ctiller): remove the server filter when call-v3 is finalized }, @@ -826,12 +805,91 @@ RefCountedPtr CreateChannelzNode( return channelz_node; } +absl::StatusOr CheckClientMetadata( + ValueOrFailure md) { + if (!md.ok()) { + return absl::InternalError("Missing metadata"); + } + if (!md.value()->get_pointer(HttpPathMetadata())) { + return absl::InternalError("Missing :path header"); + } + if (!md.value()->get_pointer(HttpAuthorityMetadata())) { + return absl::InternalError("Missing :authority header"); + } + return std::move(*md); +} } // namespace +auto Server::MatchAndPublishCall(CallHandler call_handler) { + call_handler.SpawnGuarded("request_matcher", [this, call_handler]() mutable { + return TrySeq( + // Wait for initial metadata to pass through all filters + Map(call_handler.PullClientInitialMetadata(), CheckClientMetadata), + // Match request with requested call + [this, call_handler](ClientMetadataHandle md) mutable { + auto* registered_method = static_cast( + md->get(GrpcRegisteredMethod()).value_or(nullptr)); + RequestMatcherInterface* rm; + grpc_server_register_method_payload_handling payload_handling = + GRPC_SRM_PAYLOAD_NONE; + if (registered_method == nullptr) { + rm = unregistered_request_matcher_.get(); + } else { + payload_handling = registered_method->payload_handling; + rm = registered_method->matcher.get(); + } + auto maybe_read_first_message = If( + payload_handling == GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER, + [call_handler]() mutable { return call_handler.PullMessage(); }, + []() -> ValueOrFailure> { + return ValueOrFailure>( + absl::nullopt); + }); + return TryJoin( + std::move(maybe_read_first_message), rm->MatchRequest(0), + [md = std::move(md)]() mutable { + return ValueOrFailure(std::move(md)); + }); + }, + // Publish call to cq + [call_handler, this](std::tuple, + RequestMatcherInterface::MatchResult, + ClientMetadataHandle> + r) { + RequestMatcherInterface::MatchResult& mr = std::get<1>(r); + auto md = std::move(std::get<2>(r)); + auto* rc = mr.TakeCall(); + rc->Complete(std::move(std::get<0>(r)), *md); + grpc_call* call = + MakeServerCall(call_handler, std::move(md), this, + rc->cq_bound_to_call, rc->initial_metadata); + *rc->call = call; + return Map(WaitForCqEndOp(false, rc->tag, absl::OkStatus(), mr.cq()), + [rc = std::unique_ptr(rc)](Empty) { + return absl::OkStatus(); + }); + }); + }); +} + +absl::StatusOr> +Server::MakeCallDestination(const ChannelArgs& args) { + InterceptionChainBuilder builder(args); + builder.AddOnClientInitialMetadata( + [this](ClientMetadata& md) { SetRegisteredMethodOnMetadata(md); }); + CoreConfiguration::Get().channel_init().AddToInterceptionChainBuilder( + GRPC_SERVER_CHANNEL, builder); + return builder.Build( + MakeCallDestinationFromHandlerFunction([this](CallHandler handler) { + return MatchAndPublishCall(std::move(handler)); + })); +} + Server::Server(const ChannelArgs& args) : channel_args_(args), channelz_node_(CreateChannelzNode(args)), server_call_tracer_factory_(ServerCallTracerFactory::Get(args)), + compression_options_(CompressionOptionsFromChannelArgs(args)), max_time_in_pending_queue_(Duration::Seconds( channel_args_ .GetInt(GRPC_ARG_SERVER_MAX_UNREQUESTED_TIME_IN_SERVER_SECONDS) @@ -862,15 +920,6 @@ void Server::AddListener(OrphanablePtr listener) { } void Server::Start() { - auto make_real_request_matcher = - [this]() -> std::unique_ptr { - if (IsPromiseBasedServerCallEnabled()) { - return std::make_unique(this); - } else { - return std::make_unique(this); - } - }; - started_ = true; for (grpc_completion_queue* cq : cqs_) { if (grpc_cq_can_listen(cq)) { @@ -878,11 +927,11 @@ void Server::Start() { } } if (unregistered_request_matcher_ == nullptr) { - unregistered_request_matcher_ = make_real_request_matcher(); + unregistered_request_matcher_ = std::make_unique(this); } for (auto& rm : registered_methods_) { if (rm.second->matcher == nullptr) { - rm.second->matcher = make_real_request_matcher(); + rm.second->matcher = std::make_unique(this); } } { @@ -913,37 +962,61 @@ grpc_error_handle Server::SetupTransport( const RefCountedPtr& socket_node) { // Create channel. global_stats().IncrementServerChannelsCreated(); - absl::StatusOr> channel = - LegacyChannel::Create("", args.SetObject(transport), GRPC_SERVER_CHANNEL); - if (!channel.ok()) { - return absl_status_to_grpc_error(channel.status()); - } - ChannelData* chand = static_cast( - grpc_channel_stack_element((*channel)->channel_stack(), 0)->channel_data); - // Set up CQs. - size_t cq_idx; - for (cq_idx = 0; cq_idx < cqs_.size(); cq_idx++) { - if (grpc_cq_pollset(cqs_[cq_idx]) == accepting_pollset) break; - } - if (cq_idx == cqs_.size()) { - // Completion queue not found. Pick a random one to publish new calls to. - cq_idx = static_cast(rand()) % std::max(1, cqs_.size()); - } // Set up channelz node. - intptr_t channelz_socket_uuid = 0; - if (socket_node != nullptr) { - channelz_socket_uuid = socket_node->uuid(); - channelz_node_->AddChildSocket(socket_node); - } - // Initialize chand. - chand->InitTransport(Ref(), std::move(*channel), cq_idx, transport, - channelz_socket_uuid); + if (transport->server_transport() != nullptr) { + // Take ownership + // TODO(ctiller): post-v3-transition make this method take an + // OrphanablePtr directly. + OrphanablePtr t(transport->server_transport()); + auto destination = MakeCallDestination(args.SetObject(transport)); + if (!destination.ok()) { + return absl_status_to_grpc_error(destination.status()); + } + // TODO(ctiller): add channelz node + t->SetCallDestination(std::move(*destination)); + MutexLock lock(&mu_global_); + if (ShutdownCalled()) { + t->DisconnectWithError(GRPC_ERROR_CREATE("Server shutdown")); + } + t->StartConnectivityWatch(MakeOrphanable( + t->RefAsSubclass(), Ref())); + gpr_log(GPR_INFO, "Adding connection"); + connections_.emplace(std::move(t)); + ++connections_open_; + } else { + CHECK(transport->filter_stack_transport() != nullptr); + absl::StatusOr> channel = LegacyChannel::Create( + "", args.SetObject(transport), GRPC_SERVER_CHANNEL); + if (!channel.ok()) { + return absl_status_to_grpc_error(channel.status()); + } + ChannelData* chand = static_cast( + grpc_channel_stack_element((*channel)->channel_stack(), 0) + ->channel_data); + // Set up CQs. + size_t cq_idx; + for (cq_idx = 0; cq_idx < cqs_.size(); cq_idx++) { + if (grpc_cq_pollset(cqs_[cq_idx]) == accepting_pollset) break; + } + if (cq_idx == cqs_.size()) { + // Completion queue not found. Pick a random one to publish new calls to. + cq_idx = static_cast(rand()) % std::max(1, cqs_.size()); + } + intptr_t channelz_socket_uuid = 0; + if (socket_node != nullptr) { + channelz_socket_uuid = socket_node->uuid(); + channelz_node_->AddChildSocket(socket_node); + } + // Initialize chand. + chand->InitTransport(Ref(), std::move(*channel), cq_idx, transport, + channelz_socket_uuid); + } return absl::OkStatus(); } bool Server::HasOpenConnections() { MutexLock lock(&mu_global_); - return !channels_.empty(); + return !channels_.empty() || !connections_.empty(); } void Server::SetRegisteredMethodAllocator( @@ -1023,16 +1096,18 @@ void Server::MaybeFinishShutdown() { MutexLock lock(&mu_call_); KillPendingWorkLocked(GRPC_ERROR_CREATE("Server Shutdown")); } - if (!channels_.empty() || listeners_destroyed_ < listeners_.size()) { + if (!channels_.empty() || connections_open_ > 0 || + listeners_destroyed_ < listeners_.size()) { if (gpr_time_cmp(gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME), last_shutdown_message_time_), gpr_time_from_seconds(1, GPR_TIMESPAN)) >= 0) { last_shutdown_message_time_ = gpr_now(GPR_CLOCK_REALTIME); gpr_log(GPR_DEBUG, - "Waiting for %" PRIuPTR " channels and %" PRIuPTR "/%" PRIuPTR + "Waiting for %" PRIuPTR " channels %" PRIuPTR + " connections and %" PRIuPTR "/%" PRIuPTR " listeners to be destroyed before shutting down server", - channels_.size(), listeners_.size() - listeners_destroyed_, - listeners_.size()); + channels_.size(), connections_open_, + listeners_.size() - listeners_destroyed_, listeners_.size()); } return; } @@ -1095,6 +1170,7 @@ void DonePublishedShutdown(void* /*done_arg*/, grpc_cq_completion* storage) { // -- Once there are no more calls in progress, the channel is closed. void Server::ShutdownAndNotify(grpc_completion_queue* cq, void* tag) { ChannelBroadcaster broadcaster; + absl::flat_hash_set> removing_connections; { // Wait for startup to be finished. Locks mu_global. MutexLock lock(&mu_global_); @@ -1114,6 +1190,7 @@ void Server::ShutdownAndNotify(grpc_completion_queue* cq, void* tag) { } last_shutdown_message_time_ = gpr_now(GPR_CLOCK_REALTIME); broadcaster.FillChannelsLocked(GetChannelsLocked()); + removing_connections.swap(connections_); // Collect all unregistered then registered calls. { MutexLock lock(&mu_call_); @@ -1300,17 +1377,6 @@ Server::ChannelData::~ChannelData() { } } -Arena* Server::ChannelData::CreateArena() { return channel_->CreateArena(); } - -absl::StatusOr Server::ChannelData::CreateCall( - ClientMetadataHandle client_initial_metadata, Arena* arena) { - SetRegisteredMethodOnMetadata(*client_initial_metadata); - auto call = MakeServerCall(std::move(client_initial_metadata), server_.get(), - channel_.get(), arena); - InitCall(call); - return CallInitiator(std::move(call)); -} - void Server::ChannelData::InitTransport(RefCountedPtr server, OrphanablePtr channel, size_t cq_idx, Transport* transport, @@ -1327,22 +1393,15 @@ void Server::ChannelData::InitTransport(RefCountedPtr server, } // Start accept_stream transport op. grpc_transport_op* op = grpc_make_transport_op(nullptr); - int accept_stream_types = 0; - if (transport->filter_stack_transport() != nullptr) { - ++accept_stream_types; - op->set_accept_stream = true; - op->set_accept_stream_fn = AcceptStream; - op->set_registered_method_matcher_fn = [](void* arg, - ClientMetadata* metadata) { - static_cast(arg)->SetRegisteredMethodOnMetadata(*metadata); - }; - op->set_accept_stream_user_data = this; - } - if (transport->server_transport() != nullptr) { - ++accept_stream_types; - transport->server_transport()->SetAcceptor(this); - } - CHECK_EQ(accept_stream_types, 1); + CHECK(transport->filter_stack_transport() != nullptr); + op->set_accept_stream = true; + op->set_accept_stream_fn = AcceptStream; + op->set_registered_method_matcher_fn = [](void* arg, + ClientMetadata* metadata) { + static_cast(arg)->server_->SetRegisteredMethodOnMetadata( + *metadata); + }; + op->set_accept_stream_user_data = this; op->start_connectivity_watch = MakeOrphanable(this); if (server_->ShutdownCalled()) { op->disconnect_with_error = GRPC_ERROR_CREATE("Server shutdown"); @@ -1350,24 +1409,23 @@ void Server::ChannelData::InitTransport(RefCountedPtr server, transport->PerformOp(op); } -Server::RegisteredMethod* Server::ChannelData::GetRegisteredMethod( +Server::RegisteredMethod* Server::GetRegisteredMethod( const absl::string_view& host, const absl::string_view& path) { - if (server_->registered_methods_.empty()) return nullptr; + if (registered_methods_.empty()) return nullptr; // check for an exact match with host - auto it = server_->registered_methods_.find(std::make_pair(host, path)); - if (it != server_->registered_methods_.end()) { + auto it = registered_methods_.find(std::make_pair(host, path)); + if (it != registered_methods_.end()) { return it->second.get(); } // check for wildcard method definition (no host set) - it = server_->registered_methods_.find(std::make_pair("", path)); - if (it != server_->registered_methods_.end()) { + it = registered_methods_.find(std::make_pair("", path)); + if (it != registered_methods_.end()) { return it->second.get(); } return nullptr; } -void Server::ChannelData::SetRegisteredMethodOnMetadata( - ClientMetadata& metadata) { +void Server::SetRegisteredMethodOnMetadata(ClientMetadata& metadata) { auto* authority = metadata.get_pointer(HttpAuthorityMetadata()); if (authority == nullptr) { authority = metadata.get_pointer(HostMetadata()); @@ -1403,188 +1461,14 @@ void Server::ChannelData::AcceptStream(void* arg, Transport* /*transport*/, grpc_call* call; grpc_error_handle error = grpc_call_create(&args, &call); grpc_call_stack* call_stack = grpc_call_get_call_stack(call); - if (call_stack == nullptr) { // Promise based calls do not have a call stack - CHECK(error.ok()); - CHECK(IsPromiseBasedServerCallEnabled()); + CHECK_NE(call_stack, nullptr); + grpc_call_element* elem = grpc_call_stack_element(call_stack, 0); + auto* calld = static_cast(elem->call_data); + if (!error.ok()) { + calld->FailCallCreation(); return; - } else { - grpc_call_element* elem = grpc_call_stack_element(call_stack, 0); - auto* calld = static_cast(elem->call_data); - if (!error.ok()) { - calld->FailCallCreation(); - return; - } - calld->Start(elem); } -} - -namespace { -auto CancelledDueToServerShutdown() { - return [] { - return ServerMetadataFromStatus(absl::CancelledError("Server shutdown")); - }; -} -} // namespace - -void Server::ChannelData::InitCall(RefCountedPtr call) { - call->SpawnGuarded("request_matcher", [this, call]() { - return TrySeq( - // Wait for initial metadata to pass through all filters - Map(call->PullClientInitialMetadata(), - [](ValueOrFailure md) - -> absl::StatusOr { - if (!md.ok()) { - return absl::InternalError("Missing metadata"); - } - if (!md.value()->get_pointer(HttpPathMetadata())) { - return absl::InternalError("Missing :path header"); - } - if (!md.value()->get_pointer(HttpAuthorityMetadata())) { - return absl::InternalError("Missing :authority header"); - } - return std::move(*md); - }), - // Match request with requested call - [this, call](ClientMetadataHandle md) { - auto* registered_method = static_cast( - md->get(GrpcRegisteredMethod()).value_or(nullptr)); - RequestMatcherInterface* rm; - grpc_server_register_method_payload_handling payload_handling = - GRPC_SRM_PAYLOAD_NONE; - if (registered_method == nullptr) { - rm = server_->unregistered_request_matcher_.get(); - } else { - payload_handling = registered_method->payload_handling; - rm = registered_method->matcher.get(); - } - auto maybe_read_first_message = If( - payload_handling == GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER, - [call]() { return call->PullClientToServerMessage(); }, - []() -> ValueOrFailure> { - return ValueOrFailure>( - absl::nullopt); - }); - return TryJoin( - std::move(maybe_read_first_message), rm->MatchRequest(cq_idx()), - [md = std::move(md)]() mutable { - return ValueOrFailure(std::move(md)); - }); - }, - // Publish call to cq - [](std::tuple, - RequestMatcherInterface::MatchResult, - ClientMetadataHandle> - r) { - RequestMatcherInterface::MatchResult& mr = std::get<1>(r); - auto md = std::move(std::get<2>(r)); - auto* rc = mr.TakeCall(); - rc->Complete(std::move(std::get<0>(r)), *md); - auto* call_context = GetContext(); - const auto* deadline = md->get_pointer(GrpcTimeoutMetadata()); - if (deadline != nullptr) { - GetContext()->UpdateDeadline(*deadline); - } - *rc->call = call_context->c_call(); - grpc_call_ref(*rc->call); - grpc_call_set_completion_queue(call_context->c_call(), - rc->cq_bound_to_call); - call_context->server_call_context()->PublishInitialMetadata( - std::move(md), rc->initial_metadata); - // TODO(ctiller): publish metadata - return Map(WaitForCqEndOp(false, rc->tag, absl::OkStatus(), mr.cq()), - [rc = std::unique_ptr(rc)](Empty) { - return absl::OkStatus(); - }); - }); - }); -} - -ArenaPromise Server::ChannelData::MakeCallPromise( - grpc_channel_element* elem, CallArgs call_args, NextPromiseFactory) { - auto* chand = static_cast(elem->channel_data); - auto* server = chand->server_.get(); - if (server->ShutdownCalled()) return CancelledDueToServerShutdown(); - auto cleanup_ref = - absl::MakeCleanup([server] { server->ShutdownUnrefOnRequest(); }); - if (!server->ShutdownRefOnRequest()) return CancelledDueToServerShutdown(); - auto path_ptr = - call_args.client_initial_metadata->get_pointer(HttpPathMetadata()); - if (path_ptr == nullptr) { - return [] { - return ServerMetadataFromStatus( - absl::InternalError("Missing :path header")); - }; - } - auto host_ptr = - call_args.client_initial_metadata->get_pointer(HttpAuthorityMetadata()); - if (host_ptr == nullptr) { - return [] { - return ServerMetadataFromStatus( - absl::InternalError("Missing :authority header")); - }; - } - // Find request matcher. - RequestMatcherInterface* matcher; - RegisteredMethod* rm = static_cast( - call_args.client_initial_metadata->get(GrpcRegisteredMethod()) - .value_or(nullptr)); - ArenaPromise>> - maybe_read_first_message([] { return NextResult(); }); - if (rm != nullptr) { - matcher = rm->matcher.get(); - switch (rm->payload_handling) { - case GRPC_SRM_PAYLOAD_NONE: - break; - case GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER: - maybe_read_first_message = - Map(call_args.client_to_server_messages->Next(), - [](NextResult msg) - -> absl::StatusOr> { - return std::move(msg); - }); - } - } else { - matcher = server->unregistered_request_matcher_.get(); - } - return TrySeq( - std::move(maybe_read_first_message), - [cleanup_ref = std::move(cleanup_ref), matcher, - chand](NextResult payload) mutable { - return Map( - [cleanup_ref = std::move(cleanup_ref), - mr = matcher->MatchRequest(chand->cq_idx())]() mutable { - return mr(); - }, - [payload = std::move(payload)]( - absl::StatusOr mr) mutable - -> absl::StatusOr>> { - if (!mr.ok()) return mr.status(); - return std::make_pair(std::move(*mr), std::move(payload)); - }); - }, - [call_args = - std::move(call_args)](std::pair> - r) mutable { - auto& mr = r.first; - auto& payload = r.second; - auto* rc = mr.TakeCall(); - auto* cq_for_new_request = mr.cq(); - auto* server_call_context = - GetContext()->server_call_context(); - rc->Complete(std::move(payload), *call_args.client_initial_metadata); - server_call_context->PublishInitialMetadata( - std::move(call_args.client_initial_metadata), rc->initial_metadata); - return server_call_context->MakeTopOfServerCallPromise( - std::move(call_args), rc->cq_bound_to_call, - [rc, cq_for_new_request](grpc_call* call) { - *rc->call = call; - grpc_cq_end_op(cq_for_new_request, rc->tag, absl::OkStatus(), - Server::DoneRequestEvent, rc, &rc->completion, - true); - }); - }); + calld->Start(elem); } void Server::ChannelData::FinishDestroy(void* arg, diff --git a/src/core/server/server.h b/src/core/server/server.h index a4353794a37..01b541c233e 100644 --- a/src/core/server/server.h +++ b/src/core/server/server.h @@ -38,6 +38,7 @@ #include "absl/strings/string_view.h" #include "absl/types/optional.h" +#include #include #include #include @@ -215,6 +216,10 @@ class Server : public ServerInterface, void SendGoaways() ABSL_LOCKS_EXCLUDED(mu_global_, mu_call_); + grpc_compression_options compression_options() const override { + return compression_options_; + } + private: // note: the grpc_core::Server redundant namespace qualification is // required for older gcc versions. @@ -227,13 +232,12 @@ class Server : public ServerInterface, struct RequestedCall; class RequestMatcherInterface; - class RealRequestMatcherFilterStack; - class RealRequestMatcherPromises; + class RealRequestMatcher; class AllocatingRequestMatcherBase; class AllocatingRequestMatcherBatch; class AllocatingRequestMatcherRegistered; - class ChannelData final : public ServerTransport::Acceptor { + class ChannelData final { public: ChannelData() = default; ~ChannelData(); @@ -246,26 +250,17 @@ class Server : public ServerInterface, Channel* channel() const { return channel_.get(); } size_t cq_idx() const { return cq_idx_; } - RegisteredMethod* GetRegisteredMethod(const absl::string_view& host, - const absl::string_view& path); // Filter vtable functions. static grpc_error_handle InitChannelElement( grpc_channel_element* elem, grpc_channel_element_args* args); static void DestroyChannelElement(grpc_channel_element* elem); - static ArenaPromise MakeCallPromise( - grpc_channel_element* elem, CallArgs call_args, NextPromiseFactory); void InitCall(RefCountedPtr call); - Arena* CreateArena() override; - absl::StatusOr CreateCall( - ClientMetadataHandle client_initial_metadata, Arena* arena) override; - private: class ConnectivityWatcher; static void AcceptStream(void* arg, Transport* /*transport*/, const void* transport_server_data); - void SetRegisteredMethodOnMetadata(ClientMetadata& metadata); void Destroy() ABSL_EXCLUSIVE_LOCKS_REQUIRED(server_->mu_global_); @@ -396,6 +391,12 @@ class Server : public ServerInterface, using is_transparent = void; }; + class TransportConnectivityWatcher; + + RegisteredMethod* GetRegisteredMethod(const absl::string_view& host, + const absl::string_view& path); + void SetRegisteredMethodOnMetadata(ClientMetadata& metadata); + static void ListenerDestroyDone(void* arg, grpc_error_handle error); static void DoneShutdownEvent(void* server, @@ -457,6 +458,10 @@ class Server : public ServerInterface, return shutdown_refs_.load(std::memory_order_acquire) == 0; } + auto MatchAndPublishCall(CallHandler call_handler); + absl::StatusOr> MakeCallDestination( + const ChannelArgs& args); + ChannelArgs const channel_args_; RefCountedPtr channelz_node_; std::unique_ptr config_fetcher_; @@ -465,6 +470,7 @@ class Server : public ServerInterface, std::vector cqs_; std::vector pollsets_; bool started_ = false; + const grpc_compression_options compression_options_; // The two following mutexes control access to server-state. // mu_global_ controls access to non-call-related state (e.g., channel state). @@ -512,6 +518,9 @@ class Server : public ServerInterface, absl::BitGen bitgen_ ABSL_GUARDED_BY(mu_call_); std::list channels_; + absl::flat_hash_set> connections_ + ABSL_GUARDED_BY(mu_global_); + size_t connections_open_ ABSL_GUARDED_BY(mu_global_) = 0; std::list listeners_; size_t listeners_destroyed_ = 0; diff --git a/src/core/server/server_interface.h b/src/core/server/server_interface.h index 3cb7b1702ff..431ad369714 100644 --- a/src/core/server/server_interface.h +++ b/src/core/server/server_interface.h @@ -17,6 +17,7 @@ #ifndef GRPC_SRC_CORE_SERVER_SERVER_INTERFACE_H #define GRPC_SRC_CORE_SERVER_SERVER_INTERFACE_H +#include #include #include "src/core/channelz/channelz.h" @@ -36,6 +37,7 @@ class ServerInterface { virtual const ChannelArgs& channel_args() const = 0; virtual channelz::ServerNode* channelz_node() const = 0; virtual ServerCallTracerFactory* server_call_tracer_factory() const = 0; + virtual grpc_compression_options compression_options() const = 0; }; } // namespace grpc_core diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 377dac99484..f00614f2c35 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -736,6 +736,7 @@ CORE_SOURCE_FILES = [ 'src/core/lib/transport/call_spine.cc', 'src/core/lib/transport/connectivity_state.cc', 'src/core/lib/transport/error_utils.cc', + 'src/core/lib/transport/interception_chain.cc', 'src/core/lib/transport/message.cc', 'src/core/lib/transport/metadata.cc', 'src/core/lib/transport/metadata_batch.cc', diff --git a/test/core/end2end/tests/filter_context.cc b/test/core/end2end/tests/filter_context.cc index 789a05d94d7..7d53047f971 100644 --- a/test/core/end2end/tests/filter_context.cc +++ b/test/core/end2end/tests/filter_context.cc @@ -103,9 +103,6 @@ CORE_END2END_TEST(CoreEnd2endTest, FilterContext) { CoreConfiguration::RegisterBuilder([](CoreConfiguration::Builder* builder) { for (auto type : {GRPC_CLIENT_CHANNEL, GRPC_CLIENT_SUBCHANNEL, GRPC_CLIENT_DIRECT_CHANNEL, GRPC_SERVER_CHANNEL}) { - if (type == GRPC_SERVER_CHANNEL && IsPromiseBasedServerCallEnabled()) { - continue; - } builder->channel_init()->RegisterFilter(type, &test_filter); } }); diff --git a/test/core/surface/channel_init_test.cc b/test/core/surface/channel_init_test.cc index 1b0baeafba0..a90777973c3 100644 --- a/test/core/surface/channel_init_test.cc +++ b/test/core/surface/channel_init_test.cc @@ -23,7 +23,10 @@ #include "src/core/lib/channel/channel_stack.h" #include "src/core/lib/channel/channel_stack_builder_impl.h" +#include "src/core/lib/channel/promise_based_filter.h" +#include "src/core/lib/resource_quota/resource_quota.h" #include "src/core/lib/surface/channel_stack_type.h" +#include "src/core/lib/transport/call_arena_allocator.h" #include "test/core/test_util/test_config.h" namespace grpc_core { @@ -208,7 +211,7 @@ class TestFilter1 { explicit TestFilter1(int* p) : p_(p) {} static absl::StatusOr> Create( - const ChannelArgs& args, Empty) { + const ChannelArgs& args, ChannelFilter::Args) { EXPECT_EQ(args.GetInt("foo"), 1); return std::make_unique(args.GetPointer("p")); } @@ -250,19 +253,23 @@ TEST(ChannelInitTest, CanCreateFilterWithCall) { b.RegisterFilter(GRPC_CLIENT_CHANNEL); auto init = b.Build(); int p = 0; - auto segment = init.CreateStackSegment( - GRPC_CLIENT_CHANNEL, - ChannelArgs().Set("foo", 1).Set("p", ChannelArgs::UnownedPointer(&p))); - ASSERT_TRUE(segment.ok()) << segment.status(); - CallFilters::StackBuilder stack_builder; - segment->AddToCallFilterStack(stack_builder); - segment = absl::CancelledError(); // force the segment to be destroyed - auto stack = stack_builder.Build(); - { - CallFilters call_filters(Arena::MakePooled()); - call_filters.SetStack(std::move(stack)); - } + InterceptionChainBuilder chain_builder{ + ChannelArgs().Set("foo", 1).Set("p", ChannelArgs::UnownedPointer(&p))}; + init.AddToInterceptionChainBuilder(GRPC_CLIENT_CHANNEL, chain_builder); + int handled = 0; + auto stack = chain_builder.Build(MakeCallDestinationFromHandlerFunction( + [&handled](CallHandler) { ++handled; })); + ASSERT_TRUE(stack.ok()) << stack.status(); + RefCountedPtr allocator = + MakeRefCounted( + ResourceQuota::Default()->memory_quota()->CreateMemoryAllocator( + "test"), + 1024); + auto call = MakeCallPair(Arena::MakePooled(), nullptr, + allocator->MakeArena(), allocator, nullptr); + (*stack)->StartCall(std::move(call.handler)); EXPECT_EQ(p, 1); + EXPECT_EQ(handled, 1); } } // namespace diff --git a/test/core/transport/chaotic_good/chaotic_good_server_test.cc b/test/core/transport/chaotic_good/chaotic_good_server_test.cc index b5b058b43ee..40de0b35cbe 100644 --- a/test/core/transport/chaotic_good/chaotic_good_server_test.cc +++ b/test/core/transport/chaotic_good/chaotic_good_server_test.cc @@ -39,6 +39,7 @@ #include "src/core/lib/uri/uri_parser.h" #include "src/core/server/server.h" #include "test/core/event_engine/event_engine_test_utils.h" +#include "test/core/test_util/build.h" #include "test/core/test_util/port.h" #include "test/core/test_util/test_config.h" @@ -67,7 +68,10 @@ class ChaoticGoodServerTest : public ::testing::Test { auto ev = grpc_completion_queue_pluck( shutdown_cq, nullptr, grpc_timeout_milliseconds_to_deadline(15000), nullptr); - CHECK(ev.type == GRPC_OP_COMPLETE); + if (ev.type == GRPC_QUEUE_TIMEOUT) { + AsanAssertNoLeaks(); + } + CHECK_EQ(ev.type, GRPC_OP_COMPLETE); CHECK_EQ(ev.tag, nullptr); grpc_completion_queue_destroy(shutdown_cq); grpc_server_destroy(server_); diff --git a/test/core/transport/chaotic_good/server_transport_test.cc b/test/core/transport/chaotic_good/server_transport_test.cc index a5dd0008b9a..da80f94781f 100644 --- a/test/core/transport/chaotic_good/server_transport_test.cc +++ b/test/core/transport/chaotic_good/server_transport_test.cc @@ -82,19 +82,19 @@ ServerMetadataHandle TestTrailingMetadata() { return md; } -class MockAcceptor : public ServerTransport::Acceptor { +class MockCallDestination : public UnstartedCallDestination { public: - virtual ~MockAcceptor() = default; - MOCK_METHOD(Arena*, CreateArena, (), (override)); - MOCK_METHOD(absl::StatusOr, CreateCall, - (ClientMetadataHandle client_initial_metadata, Arena* arena), + ~MockCallDestination() override = default; + MOCK_METHOD(void, Orphaned, (), (override)); + MOCK_METHOD(void, StartCall, (UnstartedCallHandler unstarted_call_handler), (override)); }; TEST_F(TransportTest, ReadAndWriteOneMessage) { MockPromiseEndpoint control_endpoint; MockPromiseEndpoint data_endpoint; - StrictMock acceptor; + auto call_destination = MakeRefCounted>(); + EXPECT_CALL(*call_destination, Orphaned()).Times(1); auto transport = MakeOrphanable( CoreConfiguration::Get() .channel_args_preconditioning() @@ -112,19 +112,21 @@ TEST_F(TransportTest, ReadAndWriteOneMessage) { data_endpoint.ExpectRead( {EventEngineSlice::FromCopiedString("12345678"), Zeros(56)}, nullptr); // Once that's read we'll create a new call - auto* call_arena = MakeArena(); - EXPECT_CALL(acceptor, CreateArena).WillOnce(Return(call_arena)); StrictMock> on_done; - EXPECT_CALL(acceptor, CreateCall(_, call_arena)) - .WillOnce(WithArgs<0>([this, call_arena, &on_done]( - ClientMetadataHandle client_initial_metadata) { - EXPECT_EQ(client_initial_metadata->get_pointer(HttpPathMetadata()) + auto control_address = + grpc_event_engine::experimental::URIToResolvedAddress("ipv4:1.2.3.4:5678") + .value(); + EXPECT_CALL(*control_endpoint.endpoint, GetPeerAddress) + .WillRepeatedly([&control_address]() { return control_address; }); + EXPECT_CALL(*call_destination, StartCall(_)) + .WillOnce(WithArgs<0>([&on_done]( + UnstartedCallHandler unstarted_call_handler) { + EXPECT_EQ(unstarted_call_handler.UnprocessedClientInitialMetadata() + .get_pointer(HttpPathMetadata()) ->as_string_view(), "/demo.Service/Step"); - CallInitiatorAndHandler call = MakeCallPair( - std::move(client_initial_metadata), event_engine().get(), - call_arena, call_arena_allocator(), nullptr); - auto handler = call.handler.V2HackToStartCallWithoutACallFilterStack(); + auto handler = + unstarted_call_handler.V2HackToStartCallWithoutACallFilterStack(); handler.SpawnInfallible("test-io", [&on_done, handler]() mutable { return Seq( handler.PullClientInitialMetadata(), @@ -163,9 +165,8 @@ TEST_F(TransportTest, ReadAndWriteOneMessage) { return Empty{}; }); }); - return std::move(call.initiator); })); - transport->SetAcceptor(&acceptor); + transport->SetCallDestination(call_destination); EXPECT_CALL(on_done, Call()); EXPECT_CALL(*control_endpoint.endpoint, Read) .InSequence(control_endpoint.read_sequence) diff --git a/test/core/transport/test_suite/call_content.cc b/test/core/transport/test_suite/call_content.cc index 9e334f24fb6..cfcac0bf91b 100644 --- a/test/core/transport/test_suite/call_content.cc +++ b/test/core/transport/test_suite/call_content.cc @@ -62,7 +62,7 @@ void FillMetadata(const std::vector>& md, } // namespace TRANSPORT_TEST(UnaryWithSomeContent) { - SetServerAcceptor(); + SetServerCallDestination(); const auto client_initial_metadata = RandomMetadata(); const auto server_initial_metadata = RandomMetadata(); const auto server_trailing_metadata = RandomMetadata(); diff --git a/test/core/transport/test_suite/call_shapes.cc b/test/core/transport/test_suite/call_shapes.cc index fdae653119d..89ee26ccd2f 100644 --- a/test/core/transport/test_suite/call_shapes.cc +++ b/test/core/transport/test_suite/call_shapes.cc @@ -17,7 +17,7 @@ namespace grpc_core { TRANSPORT_TEST(MetadataOnlyRequest) { - SetServerAcceptor(); + SetServerCallDestination(); auto md = Arena::MakePooled(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); @@ -72,7 +72,7 @@ TRANSPORT_TEST(MetadataOnlyRequestServerAbortsAfterInitialMetadata) { "wrong status code: we don't care for any cases we're " "rolling out soon, so leaving this disabled."; - SetServerAcceptor(); + SetServerCallDestination(); auto md = Arena::MakePooled(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); @@ -125,7 +125,7 @@ TRANSPORT_TEST(MetadataOnlyRequestServerAbortsImmediately) { "wrong status code: we don't care for any cases we're " "rolling out soon, so leaving this disabled."; - SetServerAcceptor(); + SetServerCallDestination(); auto md = Arena::MakePooled(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); @@ -165,7 +165,7 @@ TRANSPORT_TEST(MetadataOnlyRequestServerAbortsImmediately) { } TRANSPORT_TEST(CanCreateCallThenAbandonIt) { - SetServerAcceptor(); + SetServerCallDestination(); auto md = Arena::MakePooled(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); @@ -178,7 +178,7 @@ TRANSPORT_TEST(CanCreateCallThenAbandonIt) { } TRANSPORT_TEST(UnaryRequest) { - SetServerAcceptor(); + SetServerCallDestination(); auto md = Arena::MakePooled(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); @@ -257,7 +257,7 @@ TRANSPORT_TEST(UnaryRequest) { } TRANSPORT_TEST(UnaryRequestOmitCheckEndOfStream) { - SetServerAcceptor(); + SetServerCallDestination(); auto md = Arena::MakePooled(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); @@ -326,7 +326,7 @@ TRANSPORT_TEST(UnaryRequestOmitCheckEndOfStream) { } TRANSPORT_TEST(UnaryRequestWaitForServerInitialMetadataBeforeSendingPayload) { - SetServerAcceptor(); + SetServerCallDestination(); auto md = Arena::MakePooled(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); @@ -404,7 +404,7 @@ TRANSPORT_TEST(UnaryRequestWaitForServerInitialMetadataBeforeSendingPayload) { } TRANSPORT_TEST(ClientStreamingRequest) { - SetServerAcceptor(); + SetServerCallDestination(); auto md = Arena::MakePooled(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); @@ -518,7 +518,7 @@ TRANSPORT_TEST(ClientStreamingRequest) { } TRANSPORT_TEST(ServerStreamingRequest) { - SetServerAcceptor(); + SetServerCallDestination(); auto md = Arena::MakePooled(); md->Set(HttpPathMetadata(), Slice::FromExternalString("/foo/bar")); auto initiator = CreateCall(std::move(md)); diff --git a/test/core/transport/test_suite/inproc_fixture.cc b/test/core/transport/test_suite/inproc_fixture.cc index 357bbef66be..65468229341 100644 --- a/test/core/transport/test_suite/inproc_fixture.cc +++ b/test/core/transport/test_suite/inproc_fixture.cc @@ -13,12 +13,16 @@ // limitations under the License. #include "src/core/ext/transport/inproc/inproc_transport.h" +#include "src/core/lib/config/core_configuration.h" #include "test/core/transport/test_suite/fixture.h" namespace grpc_core { TRANSPORT_FIXTURE(Inproc) { - auto transports = MakeInProcessTransportPair(); + auto transports = + MakeInProcessTransportPair(CoreConfiguration::Get() + .channel_args_preconditioning() + .PreconditionChannelArgs(nullptr)); return {std::move(transports.first), std::move(transports.second)}; } diff --git a/test/core/transport/test_suite/no_op.cc b/test/core/transport/test_suite/no_op.cc index 0efd226257d..26e21e44e32 100644 --- a/test/core/transport/test_suite/no_op.cc +++ b/test/core/transport/test_suite/no_op.cc @@ -20,8 +20,8 @@ TRANSPORT_TEST(NoOp) {} TRANSPORT_TEST(WaitForAllPendingWork) { WaitForAllPendingWork(); } -TRANSPORT_TEST(SetServerAcceptorAndFinish) { - SetServerAcceptor(); +TRANSPORT_TEST(SetServerCallDestinationAndFinish) { + SetServerCallDestination(); WaitForAllPendingWork(); } diff --git a/test/core/transport/test_suite/stress.cc b/test/core/transport/test_suite/stress.cc index ca20fb7ff3f..e791bb18b8f 100644 --- a/test/core/transport/test_suite/stress.cc +++ b/test/core/transport/test_suite/stress.cc @@ -19,7 +19,7 @@ namespace grpc_core { TRANSPORT_TEST(ManyUnaryRequests) { - SetServerAcceptor(); + SetServerCallDestination(); const int kNumRequests = absl::LogUniform(rng(), 10, 100); std::list call_names; auto make_call_name = [&call_names](int i, diff --git a/test/core/transport/test_suite/test.cc b/test/core/transport/test_suite/test.cc index e170c9acda6..c228196983e 100644 --- a/test/core/transport/test_suite/test.cc +++ b/test/core/transport/test_suite/test.cc @@ -52,8 +52,9 @@ void TransportTest::RunTest() { event_engine_->UnsetGlobalHooks(); } -void TransportTest::SetServerAcceptor() { - transport_pair_.server->server_transport()->SetAcceptor(&acceptor_); +void TransportTest::SetServerCallDestination() { + transport_pair_.server->server_transport()->SetCallDestination( + server_call_destination_); } CallInitiator TransportTest::CreateCall( @@ -71,8 +72,10 @@ CallInitiator TransportTest::CreateCall( CallHandler TransportTest::TickUntilServerCall() { WatchDog watchdog(this); for (;;) { - auto handler = acceptor_.PopHandler(); - if (handler.has_value()) return std::move(*handler); + auto handler = server_call_destination_->PopHandler(); + if (handler.has_value()) { + return std::move(*handler); + } event_engine_->Tick(); } } @@ -227,22 +230,14 @@ std::string TransportTest::RandomMessage() { } /////////////////////////////////////////////////////////////////////////////// -// TransportTest::Acceptor - -Arena* TransportTest::Acceptor::CreateArena() { - return test_->call_arena_allocator_->MakeArena(); -} +// TransportTest::ServerCallDestination -absl::StatusOr TransportTest::Acceptor::CreateCall( - ClientMetadataHandle client_initial_metadata, Arena* arena) { - auto call = MakeCallPair(std::move(client_initial_metadata), - test_->event_engine_.get(), arena, - test_->call_arena_allocator_, nullptr); - handlers_.push(call.handler.V2HackToStartCallWithoutACallFilterStack()); - return std::move(call.initiator); +void TransportTest::ServerCallDestination::StartCall( + UnstartedCallHandler handler) { + handlers_.push(handler.V2HackToStartCallWithoutACallFilterStack()); } -absl::optional TransportTest::Acceptor::PopHandler() { +absl::optional TransportTest::ServerCallDestination::PopHandler() { if (!handlers_.empty()) { auto handler = std::move(handlers_.front()); handlers_.pop(); diff --git a/test/core/transport/test_suite/test.h b/test/core/transport/test_suite/test.h index 1add21cdd29..841b8cedfc8 100644 --- a/test/core/transport/test_suite/test.h +++ b/test/core/transport/test_suite/test.h @@ -32,6 +32,7 @@ #include "src/core/lib/resource_quota/resource_quota.h" #include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h" #include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.pb.h" +#include "test/core/test_util/test_config.h" #include "test/core/transport/test_suite/fixture.h" namespace grpc_core { @@ -220,7 +221,7 @@ class TransportTest : public ::testing::Test { fixture_(std::move(fixture)), rng_(rng) {} - void SetServerAcceptor(); + void SetServerCallDestination(); CallInitiator CreateCall(ClientMetadataHandle client_initial_metadata); std::string RandomString(int min_length, int max_length, @@ -270,18 +271,14 @@ class TransportTest : public ::testing::Test { void Timeout(); - class Acceptor final : public ServerTransport::Acceptor { + class ServerCallDestination final : public UnstartedCallDestination { public: - explicit Acceptor(TransportTest* test) : test_(test) {} - - Arena* CreateArena() override; - absl::StatusOr CreateCall( - ClientMetadataHandle client_initial_metadata, Arena* arena) override; + void StartCall(UnstartedCallHandler unstarted_call_handler) override; + void Orphaned() override {} absl::optional PopHandler(); private: std::queue handlers_; - TransportTest* const test_; }; class WatchDog { @@ -296,6 +293,7 @@ class TransportTest : public ::testing::Test { [this]() { test_->Timeout(); })}; }; + grpc::testing::TestGrpcScope grpc_scope_; std::shared_ptr event_engine_{ std::make_shared( @@ -313,7 +311,8 @@ class TransportTest : public ::testing::Test { ->memory_quota() ->CreateMemoryAllocator("test-allocator"), 1024)}; - Acceptor acceptor_{this}; + RefCountedPtr server_call_destination_ = + MakeRefCounted(); TransportFixture::ClientAndServerTransportPair transport_pair_ = fixture_->CreateTransportPair(event_engine_); std::queue> diff --git a/test/cpp/microbenchmarks/bm_fullstack_unary_ping_pong_chaotic_good.cc b/test/cpp/microbenchmarks/bm_fullstack_unary_ping_pong_chaotic_good.cc index 04a8f010cd5..b79df3ed4d1 100644 --- a/test/cpp/microbenchmarks/bm_fullstack_unary_ping_pong_chaotic_good.cc +++ b/test/cpp/microbenchmarks/bm_fullstack_unary_ping_pong_chaotic_good.cc @@ -111,7 +111,6 @@ int main(int argc, char** argv) { grpc_core::ForceEnableExperiment("event_engine_client", true); grpc_core::ForceEnableExperiment("event_engine_listener", true); grpc_core::ForceEnableExperiment("promise_based_client_call", true); - grpc_core::ForceEnableExperiment("promise_based_server_call", true); grpc_core::ForceEnableExperiment("chaotic_good", true); grpc::testing::TestEnvironment env(&argc, argv); LibraryInitializer libInit; diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 02efb7460b9..649e1eb576a 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -2750,6 +2750,7 @@ src/core/lib/transport/bdp_estimator.cc \ src/core/lib/transport/bdp_estimator.h \ src/core/lib/transport/call_arena_allocator.cc \ src/core/lib/transport/call_arena_allocator.h \ +src/core/lib/transport/call_destination.h \ src/core/lib/transport/call_filters.cc \ src/core/lib/transport/call_filters.h \ src/core/lib/transport/call_final_info.cc \ @@ -2762,6 +2763,8 @@ src/core/lib/transport/custom_metadata.h \ src/core/lib/transport/error_utils.cc \ src/core/lib/transport/error_utils.h \ src/core/lib/transport/http2_errors.h \ +src/core/lib/transport/interception_chain.cc \ +src/core/lib/transport/interception_chain.h \ src/core/lib/transport/message.cc \ src/core/lib/transport/message.h \ src/core/lib/transport/metadata.cc \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index f98a7a95a21..d3a4f44a588 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -2527,6 +2527,7 @@ src/core/lib/transport/bdp_estimator.cc \ src/core/lib/transport/bdp_estimator.h \ src/core/lib/transport/call_arena_allocator.cc \ src/core/lib/transport/call_arena_allocator.h \ +src/core/lib/transport/call_destination.h \ src/core/lib/transport/call_filters.cc \ src/core/lib/transport/call_filters.h \ src/core/lib/transport/call_final_info.cc \ @@ -2539,6 +2540,8 @@ src/core/lib/transport/custom_metadata.h \ src/core/lib/transport/error_utils.cc \ src/core/lib/transport/error_utils.h \ src/core/lib/transport/http2_errors.h \ +src/core/lib/transport/interception_chain.cc \ +src/core/lib/transport/interception_chain.h \ src/core/lib/transport/message.cc \ src/core/lib/transport/message.h \ src/core/lib/transport/metadata.cc \