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