diff --git a/BUILD b/BUILD index ba8cce5ec38..4256b1fcaf8 100644 --- a/BUILD +++ b/BUILD @@ -1530,6 +1530,7 @@ grpc_cc_library( "//src/core:arena_promise", "//src/core:atomic_utils", "//src/core:bitset", + "//src/core:call_final_info", "//src/core:cancel_callback", "//src/core:channel_args", "//src/core:channel_args_endpoint_config", diff --git a/CMakeLists.txt b/CMakeLists.txt index 4455b799b10..eb2eac86917 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2500,6 +2500,7 @@ add_library(grpc src/core/lib/surface/version.cc src/core/lib/transport/batch_builder.cc src/core/lib/transport/bdp_estimator.cc + src/core/lib/transport/call_final_info.cc src/core/lib/transport/connectivity_state.cc src/core/lib/transport/error_utils.cc src/core/lib/transport/handshaker.cc @@ -3193,6 +3194,7 @@ add_library(grpc_unsecure src/core/lib/surface/version.cc src/core/lib/transport/batch_builder.cc src/core/lib/transport/bdp_estimator.cc + src/core/lib/transport/call_final_info.cc src/core/lib/transport/connectivity_state.cc src/core/lib/transport/error_utils.cc src/core/lib/transport/handshaker.cc @@ -5179,6 +5181,7 @@ add_library(grpc_authorization_provider src/core/lib/surface/validate_metadata.cc src/core/lib/surface/version.cc src/core/lib/transport/batch_builder.cc + src/core/lib/transport/call_final_info.cc src/core/lib/transport/connectivity_state.cc src/core/lib/transport/error_utils.cc src/core/lib/transport/handshaker.cc diff --git a/Makefile b/Makefile index 1d547978b3d..9f76d67a533 100644 --- a/Makefile +++ b/Makefile @@ -1701,6 +1701,7 @@ LIBGRPC_SRC = \ src/core/lib/surface/version.cc \ src/core/lib/transport/batch_builder.cc \ src/core/lib/transport/bdp_estimator.cc \ + src/core/lib/transport/call_final_info.cc \ src/core/lib/transport/connectivity_state.cc \ src/core/lib/transport/error_utils.cc \ src/core/lib/transport/handshaker.cc \ @@ -2244,6 +2245,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/lib/surface/version.cc \ src/core/lib/transport/batch_builder.cc \ src/core/lib/transport/bdp_estimator.cc \ + src/core/lib/transport/call_final_info.cc \ src/core/lib/transport/connectivity_state.cc \ src/core/lib/transport/error_utils.cc \ src/core/lib/transport/handshaker.cc \ diff --git a/Package.swift b/Package.swift index 909c493af11..5bf0a78e600 100644 --- a/Package.swift +++ b/Package.swift @@ -1887,6 +1887,8 @@ let package = Package( "src/core/lib/transport/batch_builder.h", "src/core/lib/transport/bdp_estimator.cc", "src/core/lib/transport/bdp_estimator.h", + "src/core/lib/transport/call_final_info.cc", + "src/core/lib/transport/call_final_info.h", "src/core/lib/transport/connectivity_state.cc", "src/core/lib/transport/connectivity_state.h", "src/core/lib/transport/custom_metadata.h", diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index aa1179bd3e5..3a956abcf0c 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -1168,6 +1168,7 @@ libs: - src/core/lib/surface/wait_for_cq_end_op.h - src/core/lib/transport/batch_builder.h - src/core/lib/transport/bdp_estimator.h + - src/core/lib/transport/call_final_info.h - src/core/lib/transport/connectivity_state.h - src/core/lib/transport/custom_metadata.h - src/core/lib/transport/error_utils.h @@ -1964,6 +1965,7 @@ libs: - src/core/lib/surface/version.cc - src/core/lib/transport/batch_builder.cc - src/core/lib/transport/bdp_estimator.cc + - src/core/lib/transport/call_final_info.cc - src/core/lib/transport/connectivity_state.cc - src/core/lib/transport/error_utils.cc - src/core/lib/transport/handshaker.cc @@ -2601,6 +2603,7 @@ libs: - src/core/lib/surface/wait_for_cq_end_op.h - src/core/lib/transport/batch_builder.h - src/core/lib/transport/bdp_estimator.h + - src/core/lib/transport/call_final_info.h - src/core/lib/transport/connectivity_state.h - src/core/lib/transport/custom_metadata.h - src/core/lib/transport/error_utils.h @@ -3015,6 +3018,7 @@ libs: - src/core/lib/surface/version.cc - src/core/lib/transport/batch_builder.cc - src/core/lib/transport/bdp_estimator.cc + - src/core/lib/transport/call_final_info.cc - src/core/lib/transport/connectivity_state.cc - src/core/lib/transport/error_utils.cc - src/core/lib/transport/handshaker.cc @@ -4738,6 +4742,7 @@ libs: - src/core/lib/surface/validate_metadata.h - src/core/lib/surface/wait_for_cq_end_op.h - src/core/lib/transport/batch_builder.h + - src/core/lib/transport/call_final_info.h - src/core/lib/transport/connectivity_state.h - src/core/lib/transport/custom_metadata.h - src/core/lib/transport/error_utils.h @@ -5061,6 +5066,7 @@ libs: - src/core/lib/surface/validate_metadata.cc - src/core/lib/surface/version.cc - src/core/lib/transport/batch_builder.cc + - src/core/lib/transport/call_final_info.cc - src/core/lib/transport/connectivity_state.cc - src/core/lib/transport/error_utils.cc - src/core/lib/transport/handshaker.cc diff --git a/config.m4 b/config.m4 index eaafbe168f0..157bc2a173d 100644 --- a/config.m4 +++ b/config.m4 @@ -833,6 +833,7 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/surface/version.cc \ src/core/lib/transport/batch_builder.cc \ src/core/lib/transport/bdp_estimator.cc \ + src/core/lib/transport/call_final_info.cc \ src/core/lib/transport/connectivity_state.cc \ src/core/lib/transport/error_utils.cc \ src/core/lib/transport/handshaker.cc \ diff --git a/config.w32 b/config.w32 index 787f9184edd..d36b3beb2fb 100644 --- a/config.w32 +++ b/config.w32 @@ -798,6 +798,7 @@ if (PHP_GRPC != "no") { "src\\core\\lib\\surface\\version.cc " + "src\\core\\lib\\transport\\batch_builder.cc " + "src\\core\\lib\\transport\\bdp_estimator.cc " + + "src\\core\\lib\\transport\\call_final_info.cc " + "src\\core\\lib\\transport\\connectivity_state.cc " + "src\\core\\lib\\transport\\error_utils.cc " + "src\\core\\lib\\transport\\handshaker.cc " + diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 3cae944ab45..4b54894cee7 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -1263,6 +1263,7 @@ Pod::Spec.new do |s| 'src/core/lib/surface/wait_for_cq_end_op.h', 'src/core/lib/transport/batch_builder.h', 'src/core/lib/transport/bdp_estimator.h', + 'src/core/lib/transport/call_final_info.h', 'src/core/lib/transport/connectivity_state.h', 'src/core/lib/transport/custom_metadata.h', 'src/core/lib/transport/error_utils.h', @@ -2508,6 +2509,7 @@ Pod::Spec.new do |s| 'src/core/lib/surface/wait_for_cq_end_op.h', 'src/core/lib/transport/batch_builder.h', 'src/core/lib/transport/bdp_estimator.h', + 'src/core/lib/transport/call_final_info.h', 'src/core/lib/transport/connectivity_state.h', 'src/core/lib/transport/custom_metadata.h', 'src/core/lib/transport/error_utils.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 64a9a422c20..f6e9adef455 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -1986,6 +1986,8 @@ Pod::Spec.new do |s| 'src/core/lib/transport/batch_builder.h', 'src/core/lib/transport/bdp_estimator.cc', 'src/core/lib/transport/bdp_estimator.h', + 'src/core/lib/transport/call_final_info.cc', + 'src/core/lib/transport/call_final_info.h', 'src/core/lib/transport/connectivity_state.cc', 'src/core/lib/transport/connectivity_state.h', 'src/core/lib/transport/custom_metadata.h', @@ -3277,6 +3279,7 @@ Pod::Spec.new do |s| 'src/core/lib/surface/wait_for_cq_end_op.h', 'src/core/lib/transport/batch_builder.h', 'src/core/lib/transport/bdp_estimator.h', + 'src/core/lib/transport/call_final_info.h', 'src/core/lib/transport/connectivity_state.h', 'src/core/lib/transport/custom_metadata.h', 'src/core/lib/transport/error_utils.h', diff --git a/grpc.gemspec b/grpc.gemspec index 7c770a8a534..88f659135d9 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -1889,6 +1889,8 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/transport/batch_builder.h ) s.files += %w( src/core/lib/transport/bdp_estimator.cc ) s.files += %w( src/core/lib/transport/bdp_estimator.h ) + s.files += %w( src/core/lib/transport/call_final_info.cc ) + s.files += %w( src/core/lib/transport/call_final_info.h ) s.files += %w( src/core/lib/transport/connectivity_state.cc ) s.files += %w( src/core/lib/transport/connectivity_state.h ) s.files += %w( src/core/lib/transport/custom_metadata.h ) diff --git a/grpc.gyp b/grpc.gyp index 37f7bb50dd0..c528adf8120 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -1020,6 +1020,7 @@ 'src/core/lib/surface/version.cc', 'src/core/lib/transport/batch_builder.cc', 'src/core/lib/transport/bdp_estimator.cc', + 'src/core/lib/transport/call_final_info.cc', 'src/core/lib/transport/connectivity_state.cc', 'src/core/lib/transport/error_utils.cc', 'src/core/lib/transport/handshaker.cc', @@ -1504,6 +1505,7 @@ 'src/core/lib/surface/version.cc', 'src/core/lib/transport/batch_builder.cc', 'src/core/lib/transport/bdp_estimator.cc', + 'src/core/lib/transport/call_final_info.cc', 'src/core/lib/transport/connectivity_state.cc', 'src/core/lib/transport/error_utils.cc', 'src/core/lib/transport/handshaker.cc', @@ -2280,6 +2282,7 @@ 'src/core/lib/surface/validate_metadata.cc', 'src/core/lib/surface/version.cc', 'src/core/lib/transport/batch_builder.cc', + 'src/core/lib/transport/call_final_info.cc', 'src/core/lib/transport/connectivity_state.cc', 'src/core/lib/transport/error_utils.cc', 'src/core/lib/transport/handshaker.cc', diff --git a/package.xml b/package.xml index 9df45c5f2ea..8bfc9459ed8 100644 --- a/package.xml +++ b/package.xml @@ -1871,6 +1871,8 @@ + + diff --git a/src/core/BUILD b/src/core/BUILD index aea45544adb..daf063a5daf 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -6624,6 +6624,20 @@ grpc_cc_library( ], ) +grpc_cc_library( + name = "call_final_info", + srcs = [ + "lib/transport/call_final_info.cc", + ], + hdrs = [ + "lib/transport/call_final_info.h", + ], + deps = [ + "//:gpr", + "//:grpc_public_hdrs", + ], +) + grpc_cc_library( name = "parsed_metadata", srcs = [ diff --git a/src/core/lib/channel/channel_stack.h b/src/core/lib/channel/channel_stack.h index 1a17bb90847..32c67017b3c 100644 --- a/src/core/lib/channel/channel_stack.h +++ b/src/core/lib/channel/channel_stack.h @@ -72,6 +72,7 @@ #include "src/core/lib/iomgr/polling_entity.h" #include "src/core/lib/promise/arena_promise.h" #include "src/core/lib/resource_quota/arena.h" +#include "src/core/lib/transport/call_final_info.h" #include "src/core/lib/transport/transport.h" struct grpc_channel_element_args { @@ -90,16 +91,6 @@ struct grpc_call_element_args { grpc_core::Arena* arena; grpc_core::CallCombiner* call_combiner; }; -struct grpc_call_stats { - grpc_transport_stream_stats transport_stream_stats; - gpr_timespec latency; // From call creating to enqueing of received status -}; -/// Information about the call upon completion. -struct grpc_call_final_info { - grpc_call_stats stats; - grpc_status_code final_status = GRPC_STATUS_OK; - const char* error_string = nullptr; -}; // Channel filters specify: // 1. the amount of memory needed in the channel & call (via the sizeof_XXX diff --git a/src/core/lib/transport/call_final_info.cc b/src/core/lib/transport/call_final_info.cc new file mode 100644 index 00000000000..88be823abf5 --- /dev/null +++ b/src/core/lib/transport/call_final_info.cc @@ -0,0 +1,38 @@ +// 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 + +#include "src/core/lib/transport/call_final_info.h" + +#include + +static void move64bits(uint64_t* from, uint64_t* to) { + *to += *from; + *from = 0; +} + +void grpc_transport_move_one_way_stats(grpc_transport_one_way_stats* from, + grpc_transport_one_way_stats* to) { + move64bits(&from->framing_bytes, &to->framing_bytes); + move64bits(&from->data_bytes, &to->data_bytes); + move64bits(&from->header_bytes, &to->header_bytes); +} + +void grpc_transport_move_stats(grpc_transport_stream_stats* from, + grpc_transport_stream_stats* to) { + grpc_transport_move_one_way_stats(&from->incoming, &to->incoming); + grpc_transport_move_one_way_stats(&from->outgoing, &to->outgoing); + to->latency = std::exchange(from->latency, gpr_inf_future(GPR_TIMESPAN)); +} diff --git a/src/core/lib/transport/call_final_info.h b/src/core/lib/transport/call_final_info.h new file mode 100644 index 00000000000..8f7165f05f7 --- /dev/null +++ b/src/core/lib/transport/call_final_info.h @@ -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. + +#ifndef GRPC_SRC_CORE_LIB_TRANSPORT_CALL_FINAL_INFO_H +#define GRPC_SRC_CORE_LIB_TRANSPORT_CALL_FINAL_INFO_H + +#include + +#include + +#include +#include + +struct grpc_transport_one_way_stats { + uint64_t framing_bytes = 0; + uint64_t data_bytes = 0; + uint64_t header_bytes = 0; +}; + +struct grpc_transport_stream_stats { + grpc_transport_one_way_stats incoming; + grpc_transport_one_way_stats outgoing; + gpr_timespec latency = gpr_inf_future(GPR_TIMESPAN); +}; + +void grpc_transport_move_one_way_stats(grpc_transport_one_way_stats* from, + grpc_transport_one_way_stats* to); + +void grpc_transport_move_stats(grpc_transport_stream_stats* from, + grpc_transport_stream_stats* to); + +struct grpc_call_stats { + grpc_transport_stream_stats transport_stream_stats; + gpr_timespec latency; // From call creating to enqueing of received status +}; +/// Information about the call upon completion. +struct grpc_call_final_info { + grpc_call_stats stats; + grpc_status_code final_status = GRPC_STATUS_OK; + const char* error_string = nullptr; +}; + +#endif // GRPC_SRC_CORE_LIB_TRANSPORT_CALL_FINAL_INFO_H diff --git a/src/core/lib/transport/transport.cc b/src/core/lib/transport/transport.cc index bad5c4b8590..b355644d1ad 100644 --- a/src/core/lib/transport/transport.cc +++ b/src/core/lib/transport/transport.cc @@ -86,25 +86,6 @@ void grpc_stream_ref_init(grpc_stream_refcount* refcount, int /*initial_refs*/, : nullptr); } -static void move64bits(uint64_t* from, uint64_t* to) { - *to += *from; - *from = 0; -} - -void grpc_transport_move_one_way_stats(grpc_transport_one_way_stats* from, - grpc_transport_one_way_stats* to) { - move64bits(&from->framing_bytes, &to->framing_bytes); - move64bits(&from->data_bytes, &to->data_bytes); - move64bits(&from->header_bytes, &to->header_bytes); -} - -void grpc_transport_move_stats(grpc_transport_stream_stats* from, - grpc_transport_stream_stats* to) { - grpc_transport_move_one_way_stats(&from->incoming, &to->incoming); - grpc_transport_move_one_way_stats(&from->outgoing, &to->outgoing); - to->latency = std::exchange(from->latency, gpr_inf_future(GPR_TIMESPAN)); -} - namespace grpc_core { void Transport::SetPollingEntity(grpc_stream* stream, grpc_polling_entity* pollset_or_pollset_set) { diff --git a/src/core/lib/transport/transport.h b/src/core/lib/transport/transport.h index 5a7e09bdb43..62a4085458c 100644 --- a/src/core/lib/transport/transport.h +++ b/src/core/lib/transport/transport.h @@ -61,6 +61,7 @@ #include "src/core/lib/promise/status_flag.h" #include "src/core/lib/resource_quota/arena.h" #include "src/core/lib/slice/slice_buffer.h" +#include "src/core/lib/transport/call_final_info.h" #include "src/core/lib/transport/connectivity_state.h" #include "src/core/lib/transport/metadata_batch.h" #include "src/core/lib/transport/transport_fwd.h" @@ -679,24 +680,6 @@ inline void grpc_stream_unref(grpc_stream_refcount* refcount) { grpc_slice grpc_slice_from_stream_owned_buffer(grpc_stream_refcount* refcount, void* buffer, size_t length); -struct grpc_transport_one_way_stats { - uint64_t framing_bytes = 0; - uint64_t data_bytes = 0; - uint64_t header_bytes = 0; -}; - -struct grpc_transport_stream_stats { - grpc_transport_one_way_stats incoming; - grpc_transport_one_way_stats outgoing; - gpr_timespec latency = gpr_inf_future(GPR_TIMESPAN); -}; - -void grpc_transport_move_one_way_stats(grpc_transport_one_way_stats* from, - grpc_transport_one_way_stats* to); - -void grpc_transport_move_stats(grpc_transport_stream_stats* from, - grpc_transport_stream_stats* to); - // This struct (which is present in both grpc_transport_stream_op_batch // and grpc_transport_op_batch) is a convenience to allow filters or // transports to schedule a closure related to a particular batch without diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index b6f72dccf97..021c7350538 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -807,6 +807,7 @@ CORE_SOURCE_FILES = [ 'src/core/lib/surface/version.cc', 'src/core/lib/transport/batch_builder.cc', 'src/core/lib/transport/bdp_estimator.cc', + 'src/core/lib/transport/call_final_info.cc', 'src/core/lib/transport/connectivity_state.cc', 'src/core/lib/transport/error_utils.cc', 'src/core/lib/transport/handshaker.cc', diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 8d399e8d873..608c24cf634 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -2888,6 +2888,8 @@ src/core/lib/transport/batch_builder.cc \ src/core/lib/transport/batch_builder.h \ src/core/lib/transport/bdp_estimator.cc \ src/core/lib/transport/bdp_estimator.h \ +src/core/lib/transport/call_final_info.cc \ +src/core/lib/transport/call_final_info.h \ src/core/lib/transport/connectivity_state.cc \ src/core/lib/transport/connectivity_state.h \ src/core/lib/transport/custom_metadata.h \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 095b92ed667..fcfa3664029 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -2669,6 +2669,8 @@ src/core/lib/transport/batch_builder.cc \ src/core/lib/transport/batch_builder.h \ src/core/lib/transport/bdp_estimator.cc \ src/core/lib/transport/bdp_estimator.h \ +src/core/lib/transport/call_final_info.cc \ +src/core/lib/transport/call_final_info.h \ src/core/lib/transport/connectivity_state.cc \ src/core/lib/transport/connectivity_state.h \ src/core/lib/transport/custom_metadata.h \