gfe-relnote: Don't queue packets when closing a QUIC connection

This is a fix for crbug.com/979507

PiperOrigin-RevId: 256236902
Change-Id: Icc2a9050e138b83fb9409a0099ad983e2e2a2526
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 3940dfb..f86466e 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -2653,6 +2653,10 @@
   }
   packet_generator_.ConsumeRetransmittableControlFrame(QuicFrame(frame));
   packet_generator_.FlushAllQueuedFrames();
+  if (GetQuicReloadableFlag(quic_clear_queued_packets_on_connection_close)) {
+    QUIC_RELOADABLE_FLAG_COUNT(quic_clear_queued_packets_on_connection_close);
+    ClearQueuedPackets();
+  }
 }
 
 void QuicConnection::TearDownLocalConnectionState(
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index 3c5daa9..fdf366a 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -7551,6 +7551,34 @@
   TestConnectionCloseQuicErrorCode(QUIC_PACKET_WRITE_ERROR);
 }
 
+TEST_P(QuicConnectionTest, CloseConnectionOnQueuedWriteError) {
+  SetQuicReloadableFlag(quic_clear_queued_packets_on_connection_close, true);
+  // Regression test for crbug.com/979507.
+  //
+  // If we get a write error when writing queued packets, we should attempt to
+  // send a connection close packet, but if sending that fails, it shouldn't get
+  // queued.
+
+  // Queue a packet to write.
+  BlockOnNextWrite();
+  connection_.SendStreamDataWithString(3, "foo", 0, NO_FIN);
+  EXPECT_EQ(1u, connection_.NumQueuedPackets());
+
+  // Configure writer to always fail.
+  AlwaysGetPacketTooLarge();
+
+  // Expect that we attempt to close the connection exactly once.
+  EXPECT_CALL(visitor_, OnConnectionClosed(_, ConnectionCloseSource::FROM_SELF))
+      .Times(1);
+
+  // Unblock the writes and actually send.
+  writer_->SetWritable();
+  connection_.OnCanWrite();
+  EXPECT_EQ(0u, connection_.NumQueuedPackets());
+
+  TestConnectionCloseQuicErrorCode(QUIC_PACKET_WRITE_ERROR);
+}
+
 // Verify that if connection has no outstanding data, it notifies the send
 // algorithm after the write.
 TEST_P(QuicConnectionTest, SendDataAndBecomeApplicationLimited) {