gfe-relnote: Add an IsAckFrameEmpty const method to received_packet_manager and make sure GetUpdatedAckFrame is only called to retrieve nonempty ACK frame. Refactoring only, not protected.

PiperOrigin-RevId: 296026015
Change-Id: I41976873d68db37b5c276befd3330c9cbda00108
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 0bfb6ea..0420637 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -67,7 +67,6 @@
     if (connection_->SupportsMultiplePacketNumberSpaces()) {
       connection_->SendAllPendingAcks();
     } else {
-      DCHECK(!connection_->GetUpdatedAckFrame().ack_frame->packets.Empty());
       connection_->SendAck();
     }
   }
@@ -1515,6 +1514,9 @@
 }
 
 const QuicFrame QuicConnection::GetUpdatedAckFrame() {
+  DCHECK(!uber_received_packet_manager_.IsAckFrameEmpty(
+      QuicUtils::GetPacketNumberSpace(encryption_level_)))
+      << "Try to retrieve an empty ACK frame";
   return uber_received_packet_manager_.GetUpdatedAckFrame(
       QuicUtils::GetPacketNumberSpace(encryption_level_),
       clock_->ApproximateNow());
@@ -2919,7 +2921,8 @@
     ScopedPacketFlusher flusher(this);
     // Always bundle an ACK with connection close for debugging purpose.
     if (error != QUIC_PACKET_WRITE_ERROR &&
-        !GetUpdatedAckFrame().ack_frame->packets.Empty()) {
+        !uber_received_packet_manager_.IsAckFrameEmpty(
+            QuicUtils::GetPacketNumberSpace(encryption_level_))) {
       SendAck();
     }
     QuicConnectionCloseFrame* frame;
@@ -2955,13 +2958,12 @@
     SetDefaultEncryptionLevel(level);
     // Bundle an ACK of the corresponding packet number space for debugging
     // purpose.
-    if (error != QUIC_PACKET_WRITE_ERROR) {
-      const QuicFrame ack_frame = GetUpdatedAckFrame();
-      if (!ack_frame.ack_frame->packets.Empty()) {
-        QuicFrames frames;
-        frames.push_back(ack_frame);
-        packet_creator_.FlushAckFrame(frames);
-      }
+    if (error != QUIC_PACKET_WRITE_ERROR &&
+        !uber_received_packet_manager_.IsAckFrameEmpty(
+            QuicUtils::GetPacketNumberSpace(encryption_level_))) {
+      QuicFrames frames;
+      frames.push_back(GetUpdatedAckFrame());
+      packet_creator_.FlushAckFrame(frames);
     }
 
     auto* frame =
diff --git a/quic/core/quic_received_packet_manager.cc b/quic/core/quic_received_packet_manager.cc
index 4333323..6298dcd 100644
--- a/quic/core/quic_received_packet_manager.cc
+++ b/quic/core/quic_received_packet_manager.cc
@@ -346,4 +346,8 @@
   return least_received_packet_number_;
 }
 
+bool QuicReceivedPacketManager::IsAckFrameEmpty() const {
+  return ack_frame_.packets.Empty();
+}
+
 }  // namespace quic
diff --git a/quic/core/quic_received_packet_manager.h b/quic/core/quic_received_packet_manager.h
index 92a9e2f..b01390d 100644
--- a/quic/core/quic_received_packet_manager.h
+++ b/quic/core/quic_received_packet_manager.h
@@ -90,6 +90,9 @@
   // received.
   QuicPacketNumber PeerFirstSendingPacketNumber() const;
 
+  // Returns true if ack frame is empty.
+  bool IsAckFrameEmpty() const;
+
   void set_connection_stats(QuicConnectionStats* stats) { stats_ = stats; }
 
   // For logging purposes.
diff --git a/quic/core/uber_received_packet_manager.cc b/quic/core/uber_received_packet_manager.cc
index f62e1ea..723ac30 100644
--- a/quic/core/uber_received_packet_manager.cc
+++ b/quic/core/uber_received_packet_manager.cc
@@ -168,6 +168,14 @@
   return ack_timeout;
 }
 
+bool UberReceivedPacketManager::IsAckFrameEmpty(
+    PacketNumberSpace packet_number_space) const {
+  if (!supports_multiple_packet_number_spaces_) {
+    return received_packet_managers_[0].IsAckFrameEmpty();
+  }
+  return received_packet_managers_[packet_number_space].IsAckFrameEmpty();
+}
+
 QuicPacketNumber UberReceivedPacketManager::peer_least_packet_awaiting_ack()
     const {
   DCHECK(!supports_multiple_packet_number_spaces_);
diff --git a/quic/core/uber_received_packet_manager.h b/quic/core/uber_received_packet_manager.h
index 14ba868..d76ce13 100644
--- a/quic/core/uber_received_packet_manager.h
+++ b/quic/core/uber_received_packet_manager.h
@@ -70,6 +70,9 @@
   // Get the earliest ack_timeout of all packet number spaces.
   QuicTime GetEarliestAckTimeout() const;
 
+  // Return true if ack frame of |packet_number_space| is empty.
+  bool IsAckFrameEmpty(PacketNumberSpace packet_number_space) const;
+
   QuicPacketNumber peer_least_packet_awaiting_ack() const;
 
   size_t min_received_before_ack_decimation() const;
diff --git a/quic/core/uber_received_packet_manager_test.cc b/quic/core/uber_received_packet_manager_test.cc
index b1e7140..a2fb640 100644
--- a/quic/core/uber_received_packet_manager_test.cc
+++ b/quic/core/uber_received_packet_manager_test.cc
@@ -134,7 +134,9 @@
 };
 
 TEST_F(UberReceivedPacketManagerTest, DontWaitForPacketsBefore) {
+  EXPECT_TRUE(manager_->IsAckFrameEmpty(APPLICATION_DATA));
   RecordPacketReceipt(2);
+  EXPECT_FALSE(manager_->IsAckFrameEmpty(APPLICATION_DATA));
   RecordPacketReceipt(7);
   EXPECT_TRUE(manager_->IsAwaitingPacket(ENCRYPTION_FORWARD_SECURE,
                                          QuicPacketNumber(3u)));