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)));