From 6f9ccac45a832683883f84c1ea1e60194b709404 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 28 Aug 2023 10:48:26 -0700 Subject: [PATCH] [debug] Add some extra information to track down b/291747520 (#34181) --- src/core/lib/surface/call.cc | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc index 89e11684f60..8f25ce457a6 100644 --- a/src/core/lib/surface/call.cc +++ b/src/core/lib/surface/call.cc @@ -1120,7 +1120,10 @@ bool FilterStackCall::PrepareApplicationMetadata(size_t count, namespace { class PublishToAppEncoder { public: - explicit PublishToAppEncoder(grpc_metadata_array* dest) : dest_(dest) {} + explicit PublishToAppEncoder(grpc_metadata_array* dest, + const grpc_metadata_batch* encoding, + bool is_client) + : dest_(dest), encoding_(encoding), is_client_(is_client) {} void Encode(const Slice& key, const Slice& value) { Append(key.c_slice(), value.c_slice()); @@ -1163,12 +1166,20 @@ class PublishToAppEncoder { } void Append(grpc_slice key, grpc_slice value) { + if (dest_->count == dest_->capacity) { + Crash(absl::StrCat( + "Too many metadata entries: capacity=", dest_->capacity, " on ", + is_client_ ? "client" : "server", " encoding ", encoding_->count(), + " elements: ", encoding_->DebugString().c_str())); + } auto* mdusr = &dest_->metadata[dest_->count++]; mdusr->key = key; mdusr->value = value; } grpc_metadata_array* const dest_; + const grpc_metadata_batch* const encoding_; + const bool is_client_; }; } // namespace @@ -1185,7 +1196,7 @@ void FilterStackCall::PublishAppMetadata(grpc_metadata_batch* b, dest->metadata = static_cast( gpr_realloc(dest->metadata, sizeof(grpc_metadata) * dest->capacity)); } - PublishToAppEncoder encoder(dest); + PublishToAppEncoder encoder(dest, b, is_client()); b->Encode(&encoder); } @@ -2652,7 +2663,8 @@ ServerCallContext* CallContext::server_call_context() { // PublishMetadataArray namespace { -void PublishMetadataArray(grpc_metadata_batch* md, grpc_metadata_array* array) { +void PublishMetadataArray(grpc_metadata_batch* md, grpc_metadata_array* array, + bool is_client) { const auto md_count = md->count(); if (md_count > array->capacity) { array->capacity = @@ -2660,7 +2672,7 @@ void PublishMetadataArray(grpc_metadata_batch* md, grpc_metadata_array* array) { array->metadata = static_cast( gpr_realloc(array->metadata, sizeof(grpc_metadata) * array->capacity)); } - PublishToAppEncoder encoder(array); + PublishToAppEncoder encoder(array, md, is_client); md->Encode(&encoder); } } // namespace @@ -2968,7 +2980,7 @@ void ClientPromiseBasedCall::StartRecvInitialMetadata( metadata = arena()->MakePooled(arena()); } ProcessIncomingInitialMetadata(*metadata); - PublishMetadataArray(metadata.get(), array); + PublishMetadataArray(metadata.get(), array, true); recv_initial_metadata_ = std::move(metadata); FinishOpOnCompletion(&completion, PendingOp::kReceiveInitialMetadata); }); @@ -3042,8 +3054,8 @@ void ClientPromiseBasedCall::StartRecvStatusOnClient( *op_args.error_string = gpr_strdup(MakeErrorString(trailing_metadata.get()).c_str()); } - PublishMetadataArray(trailing_metadata.get(), - op_args.trailing_metadata); + PublishMetadataArray(trailing_metadata.get(), op_args.trailing_metadata, + true); recv_trailing_metadata_ = std::move(trailing_metadata); FinishOpOnCompletion(&completion, PendingOp::kReceiveStatusOnClient); }); @@ -3484,7 +3496,7 @@ ServerCallContext::MakeTopOfServerCallPromise( call_->set_send_deadline(call_->deadline()); call_->ProcessIncomingInitialMetadata(*call_->client_initial_metadata_); PublishMetadataArray(call_->client_initial_metadata_.get(), - publish_initial_metadata); + publish_initial_metadata, false); call_->ExternalRef(); publish(call_->c_ptr()); return Seq(call_->server_to_client_messages_->AwaitClosed(),