diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index 931fc17b858..be57bf8d4c7 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -3017,6 +3017,8 @@ void ClientChannel::FilterBasedLoadBalancedCall::RecvInitialMetadataReady( // recv_initial_metadata_flags is not populated for clients self->call_attempt_tracer()->RecordReceivedInitialMetadata( self->recv_initial_metadata_); + auto* peer_string = self->recv_initial_metadata_->get_pointer(PeerString()); + if (peer_string != nullptr) self->peer_string_ = peer_string->Ref(); } Closure::Run(DEBUG_LOCATION, self->original_recv_initial_metadata_ready_, error); @@ -3060,12 +3062,8 @@ void ClientChannel::FilterBasedLoadBalancedCall::RecvTrailingMetadataReady( } } absl::string_view peer_string; - if (self->recv_initial_metadata_ != nullptr) { - Slice* peer_string_slice = - self->recv_initial_metadata_->get_pointer(PeerString()); - if (peer_string_slice != nullptr) { - peer_string = peer_string_slice->as_string_view(); - } + if (self->peer_string_.has_value()) { + peer_string = self->peer_string_->as_string_view(); } self->RecordCallCompletion(status, self->recv_trailing_metadata_, self->transport_stream_stats_, peer_string); diff --git a/src/core/ext/filters/client_channel/client_channel.h b/src/core/ext/filters/client_channel/client_channel.h index 112b274376a..e43b8ce7b97 100644 --- a/src/core/ext/filters/client_channel/client_channel.h +++ b/src/core/ext/filters/client_channel/client_channel.h @@ -65,6 +65,7 @@ #include "src/core/lib/resolver/resolver.h" #include "src/core/lib/resource_quota/arena.h" #include "src/core/lib/service_config/service_config.h" +#include "src/core/lib/slice/slice.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/transport/connectivity_state.h" #include "src/core/lib/transport/metadata_batch.h" @@ -556,6 +557,7 @@ class ClientChannel::FilterBasedLoadBalancedCall CallCombiner* call_combiner_; grpc_polling_entity* pollent_; grpc_closure* on_call_destruction_complete_; + absl::optional peer_string_; // Set when we get a cancel_stream op. grpc_error_handle cancel_error_;