Add a GFE_BUG that logs pending frames to write and current/previous frame types in read. PiperOrigin-RevId: 388439023
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc index bbdaf9b..02a903b 100644 --- a/quic/core/quic_connection.cc +++ b/quic/core/quic_connection.cc
@@ -5339,6 +5339,15 @@ << "EffectivePeerMigration started without address change."; return; } + if (packet_creator_.HasPendingFrames()) { + QUIC_BUG(bug_731_2) + << "Starts effective peer migration with pending frame types: " + << packet_creator_.GetPendingFramesInfo() << ". Address change type is " + << AddressChangeTypeToString(type) + << ". Current frame type: " << framer_.current_received_frame_type() + << ". Previous frame type: " + << framer_.previously_received_frame_type(); + } // Action items: // 1. Switch congestion controller; @@ -5396,6 +5405,15 @@ } // Update to the new peer address. + if (packet_creator_.HasPendingFrames()) { + QUIC_BUG(bug_731_1) + << "Starts effective peer migration with pending frame types: " + << packet_creator_.GetPendingFramesInfo() << ". Address change type is " + << AddressChangeTypeToString(type) + << ". Current frame type: " << framer_.current_received_frame_type() + << ". Previous frame type: " + << framer_.previously_received_frame_type(); + } UpdatePeerAddress(last_received_packet_info_.source_address); // Update the default path. if (IsAlternativePath(last_received_packet_info_.destination_address,
diff --git a/quic/core/quic_framer.cc b/quic/core/quic_framer.cc index bc10b50..24b2be8 100644 --- a/quic/core/quic_framer.cc +++ b/quic/core/quic_framer.cc
@@ -398,8 +398,7 @@ } // namespace QuicFramer::QuicFramer(const ParsedQuicVersionVector& supported_versions, - QuicTime creation_time, - Perspective perspective, + QuicTime creation_time, Perspective perspective, uint8_t expected_server_connection_id_length) : visitor_(nullptr), error_(QUIC_NO_ERROR), @@ -429,7 +428,8 @@ last_written_packet_number_length_(0), peer_ack_delay_exponent_(kDefaultAckDelayExponent), local_ack_delay_exponent_(kDefaultAckDelayExponent), - current_received_frame_type_(0) { + current_received_frame_type_(0), + previously_received_frame_type_(0) { QUICHE_DCHECK(!supported_versions.empty()); version_ = supported_versions_[0]; QUICHE_DCHECK(version_.IsKnown()) @@ -1964,8 +1964,10 @@ // Handle the payload. if (VersionHasIetfQuicFrames(version_.transport_version)) { current_received_frame_type_ = 0; + previously_received_frame_type_ = 0; if (!ProcessIetfFrameData(&reader, *header, decrypted_level)) { current_received_frame_type_ = 0; + previously_received_frame_type_ = 0; QUICHE_DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessIetfFrameData sets the error. QUICHE_DCHECK_NE("", detailed_error_); @@ -1974,6 +1976,7 @@ return false; } current_received_frame_type_ = 0; + previously_received_frame_type_ = 0; } else { if (!ProcessFrameData(&reader, *header)) { QUICHE_DCHECK_NE(QUIC_NO_ERROR, @@ -3215,6 +3218,7 @@ EncryptionLevelToString(decrypted_level))); return RaiseError(IETF_QUIC_PROTOCOL_VIOLATION); } + previously_received_frame_type_ = current_received_frame_type_; current_received_frame_type_ = frame_type; // Is now the number of bytes into which the frame type was encoded.
diff --git a/quic/core/quic_framer.h b/quic/core/quic_framer.h index 2920db3..31cc756 100644 --- a/quic/core/quic_framer.h +++ b/quic/core/quic_framer.h
@@ -650,6 +650,10 @@ return current_received_frame_type_; } + uint64_t previously_received_frame_type() const { + return previously_received_frame_type_; + } + // The connection ID length the framer expects on incoming IETF short headers // on the server. uint8_t GetExpectedServerConnectionIdLength() { @@ -1190,6 +1194,11 @@ // the Transport Connection Close when there is an error during frame // processing. uint64_t current_received_frame_type_; + + // TODO(haoyuewang) Remove this debug utility. + // The type of the IETF frame preceding the frame currently being processed. 0 + // when not processing a frame or only 1 frame has been processed. + uint64_t previously_received_frame_type_; }; // Look for and parse the error code from the "<quic_error_code>:" text that
diff --git a/quic/core/quic_packet_creator.cc b/quic/core/quic_packet_creator.cc index 3be1067..94cf48a 100644 --- a/quic/core/quic_packet_creator.cc +++ b/quic/core/quic_packet_creator.cc
@@ -697,6 +697,10 @@ return !queued_frames_.empty(); } +std::string QuicPacketCreator::GetPendingFramesInfo() const { + return QuicFramesToString(queued_frames_); +} + bool QuicPacketCreator::HasPendingRetransmittableFrames() const { return !packet_.retransmittable_frames.empty(); }
diff --git a/quic/core/quic_packet_creator.h b/quic/core/quic_packet_creator.h index abf24f6..9cc4bca 100644 --- a/quic/core/quic_packet_creator.h +++ b/quic/core/quic_packet_creator.h
@@ -205,6 +205,10 @@ // Returns true if there are frames pending to be serialized. bool HasPendingFrames() const; + // TODO(haoyuewang) Remove this debug utility. + // Returns the information of pending frames as a string. + std::string GetPendingFramesInfo() const; + // Returns true if there are retransmittable frames pending to be serialized. bool HasPendingRetransmittableFrames() const;
diff --git a/quic/core/quic_packet_creator_test.cc b/quic/core/quic_packet_creator_test.cc index a4e7a0a..3dc1a4b 100644 --- a/quic/core/quic_packet_creator_test.cc +++ b/quic/core/quic_packet_creator_test.cc
@@ -423,6 +423,8 @@ EXPECT_EQ(0u, consumed); CheckStreamFrame(frame, stream_id, std::string(), 0u, true); EXPECT_TRUE(creator_.HasPendingFrames()); + EXPECT_TRUE(absl::StartsWith(creator_.GetPendingFramesInfo(), + "type { STREAM_FRAME }")); } TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) {