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