Internal QUICHE change PiperOrigin-RevId: 332932032 Change-Id: I91d7b4b3163926b15e797bded737e30ab652d97c
diff --git a/quic/core/quic_packet_creator.cc b/quic/core/quic_packet_creator.cc index 3160b67..177f2b7 100644 --- a/quic/core/quic_packet_creator.cc +++ b/quic/core/quic_packet_creator.cc
@@ -505,6 +505,7 @@ packet_.encrypted_buffer = nullptr; packet_.encrypted_length = 0; packet_.has_ack_frequency = false; + packet_.has_message = false; packet_.fate = SEND_TO_WRITER; QUIC_BUG_IF(packet_.release_encrypted_buffer != nullptr) << "packet_.release_encrypted_buffer should be empty"; @@ -1768,6 +1769,8 @@ packet_.has_stop_waiting = true; } else if (frame.type == ACK_FREQUENCY_FRAME) { packet_.has_ack_frequency = true; + } else if (frame.type == MESSAGE_FRAME) { + packet_.has_message = true; } if (debug_delegate_ != nullptr) { debug_delegate_->OnFrameAddedToPacket(frame);
diff --git a/quic/core/quic_packets.cc b/quic/core/quic_packets.cc index c975fe7..f54cf00 100644 --- a/quic/core/quic_packets.cc +++ b/quic/core/quic_packets.cc
@@ -464,6 +464,7 @@ transmission_type(NOT_RETRANSMISSION), has_ack_frame_copy(false), has_ack_frequency(false), + has_message(false), fate(SEND_TO_WRITER) {} SerializedPacket::SerializedPacket(SerializedPacket&& other) @@ -477,6 +478,7 @@ largest_acked(other.largest_acked), has_ack_frame_copy(other.has_ack_frame_copy), has_ack_frequency(other.has_ack_frequency), + has_message(other.has_message), fate(other.fate), peer_address(other.peer_address) { if (this != &other) { @@ -522,6 +524,7 @@ copy->transmission_type = serialized.transmission_type; copy->largest_acked = serialized.largest_acked; copy->has_ack_frequency = serialized.has_ack_frequency; + copy->has_message = serialized.has_message; copy->fate = serialized.fate; copy->peer_address = serialized.peer_address;
diff --git a/quic/core/quic_packets.h b/quic/core/quic_packets.h index 5941c39..e9c811c 100644 --- a/quic/core/quic_packets.h +++ b/quic/core/quic_packets.h
@@ -404,6 +404,7 @@ // nonretransmittable_frames. bool has_ack_frame_copy; bool has_ack_frequency; + bool has_message; SerializedPacketFate fate; QuicSocketAddress peer_address; };
diff --git a/quic/core/quic_sent_packet_manager.cc b/quic/core/quic_sent_packet_manager.cc index 1a730e6..ab43af3 100644 --- a/quic/core/quic_sent_packet_manager.cc +++ b/quic/core/quic_sent_packet_manager.cc
@@ -729,6 +729,20 @@ one_rtt_packet_sent_ = true; } + if (GetQuicReloadableFlag(quic_deallocate_message_right_after_sent)) { + QUIC_RELOADABLE_FLAG_COUNT(quic_deallocate_message_right_after_sent); + // Deallocate message data in QuicMessageFrame immediately after packet + // sent. + if (packet.has_message) { + for (auto& frame : mutable_packet->retransmittable_frames) { + if (frame.type == MESSAGE_FRAME) { + frame.message_frame->message_data.clear(); + frame.message_frame->message_length = 0; + } + } + } + } + if (packet.has_ack_frequency) { for (const auto& frame : packet.retransmittable_frames) { if (frame.type == ACK_FREQUENCY_FRAME) {
diff --git a/quic/core/quic_sent_packet_manager_test.cc b/quic/core/quic_sent_packet_manager_test.cc index 05da9df..dfc5b86 100644 --- a/quic/core/quic_sent_packet_manager_test.cc +++ b/quic/core/quic_sent_packet_manager_test.cc
@@ -335,6 +335,7 @@ EXPECT_TRUE(manager_.pto_enabled()); } + SimpleBufferAllocator allocator_; QuicSentPacketManager manager_; MockClock clock_; QuicConnectionStats stats_; @@ -4410,6 +4411,34 @@ EXPECT_EQ(manager_.peer_max_ack_delay(), extra_1_ms); } +TEST_F(QuicSentPacketManagerTest, ClearDataInMessageFrameAfterPacketSent) { + SetQuicReloadableFlag(quic_deallocate_message_right_after_sent, true); + + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); + + QuicMessageFrame* message_frame = nullptr; + { + QuicMemSlice slice(MakeUniqueBuffer(&allocator_, 1024), 1024); + message_frame = + new QuicMessageFrame(/*message_id=*/1, QuicMemSliceSpan(&slice)); + EXPECT_FALSE(message_frame->message_data.empty()); + EXPECT_EQ(message_frame->message_length, 1024); + + SerializedPacket packet(QuicPacketNumber(1), PACKET_4BYTE_PACKET_NUMBER, + /*encrypted_buffer=*/nullptr, kDefaultLength, + /*has_ack=*/false, + /*has_stop_waiting*/ false); + packet.encryption_level = ENCRYPTION_FORWARD_SECURE; + packet.retransmittable_frames.push_back(QuicFrame(message_frame)); + packet.has_message = true; + manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION, + HAS_RETRANSMITTABLE_DATA, /*measure_rtt=*/true); + } + + EXPECT_TRUE(message_frame->message_data.empty()); + EXPECT_EQ(message_frame->message_length, 0); +} + } // namespace } // namespace test } // namespace quic