Remove processed packets from undecryptable_packets_.
Protected by FLAGS_quic_reloadable_flag_quic_fix_undecryptable_packets2.
PiperOrigin-RevId: 331861686
Change-Id: I4f09e6961393980814d84c743f45356d3c648edb
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 6b694a0..fc72c59 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -3416,6 +3416,11 @@
encryption_level_ == ENCRYPTION_INITIAL) {
return;
}
+ const bool fix_undecryptable_packets =
+ GetQuicReloadableFlag(quic_fix_undecryptable_packets2);
+ if (fix_undecryptable_packets) {
+ QUIC_RELOADABLE_FLAG_COUNT(quic_fix_undecryptable_packets2);
+ }
auto iter = undecryptable_packets_.begin();
while (connected_ && iter != undecryptable_packets_.end()) {
@@ -3426,9 +3431,11 @@
return;
}
UndecryptablePacket* undecryptable_packet = &*iter;
- ++iter;
- if (undecryptable_packet->processed) {
- continue;
+ if (!fix_undecryptable_packets) {
+ ++iter;
+ if (undecryptable_packet->processed) {
+ continue;
+ }
}
QUIC_DVLOG(1) << ENDPOINT << "Attempting to process undecryptable packet";
if (debug_visitor_ != nullptr) {
@@ -3437,7 +3444,11 @@
}
if (framer_.ProcessPacket(*undecryptable_packet->packet)) {
QUIC_DVLOG(1) << ENDPOINT << "Processed undecryptable packet!";
- undecryptable_packet->processed = true;
+ if (fix_undecryptable_packets) {
+ iter = undecryptable_packets_.erase(iter);
+ } else {
+ undecryptable_packet->processed = true;
+ }
++stats_.packets_processed;
continue;
}
@@ -3450,14 +3461,21 @@
QUIC_DVLOG(1)
<< ENDPOINT
<< "Need to attempt to process this undecryptable packet later";
+ if (fix_undecryptable_packets) {
+ ++iter;
+ }
continue;
}
- undecryptable_packet->processed = true;
+ if (fix_undecryptable_packets) {
+ iter = undecryptable_packets_.erase(iter);
+ } else {
+ undecryptable_packet->processed = true;
+ }
}
// Remove processed packets. We cannot remove elements in the while loop
// above because currently QuicCircularDeque does not support removing
// mid elements.
- while (!undecryptable_packets_.empty()) {
+ while (!fix_undecryptable_packets && !undecryptable_packets_.empty()) {
if (!undecryptable_packets_.front().processed) {
break;
}
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index f748e9c..dcd655b 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -1149,6 +1149,8 @@
// This gets set to true if 1) connection sucessfully processed the packet
// or 2) connection failed to process the packet and will not try to process
// it later.
+ // TODO(fayang): Remove this when deprecating
+ // quic_fix_undecryptable_packets2.
bool processed;
};
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index 7b9ece2..fdc4d7a 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -10934,7 +10934,11 @@
// Verify all ENCRYPTION_HANDSHAKE packets get processed.
EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(6);
connection_.GetProcessUndecryptablePacketsAlarm()->Fire();
- EXPECT_EQ(4u, QuicConnectionPeer::NumUndecryptablePackets(&connection_));
+ if (GetQuicReloadableFlag(quic_fix_undecryptable_packets2)) {
+ EXPECT_EQ(1u, QuicConnectionPeer::NumUndecryptablePackets(&connection_));
+ } else {
+ EXPECT_EQ(4u, QuicConnectionPeer::NumUndecryptablePackets(&connection_));
+ }
SetDecrypter(ENCRYPTION_FORWARD_SECURE,
std::make_unique<StrictTaggingDecrypter>(0x02));