Add explicit signal of coalscing done to QuicConnection.
Protected by FLAGS_quic_reloadable_flag_quic_fix_out_of_order_sending2.
PiperOrigin-RevId: 333530471
Change-Id: I23318531bae11486f7ccab1e8187293e8ad14cd4
diff --git a/quic/core/http/end_to_end_test.cc b/quic/core/http/end_to_end_test.cc
index c834d7b..50b7904 100644
--- a/quic/core/http/end_to_end_test.cc
+++ b/quic/core/http/end_to_end_test.cc
@@ -200,7 +200,7 @@
AddToCache("/bar", 200, kBarResponseBody);
// Enable fixes for bugs found in tests and prod.
SetQuicRestartFlag(quic_enable_zero_rtt_for_tls_v2, true);
- SetQuicReloadableFlag(quic_fix_out_of_order_sending, true);
+ SetQuicReloadableFlag(quic_fix_out_of_order_sending2, true);
}
~EndToEndTest() override { QuicRecyclePort(server_address_.port()); }
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index bb7dd47..876e997 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -2717,6 +2717,7 @@
return true;
case COALESCE:
QUIC_BUG_IF(!version().CanSendCoalescedPackets());
+ QUIC_BUG_IF(fix_out_of_order_sending_ && coalescing_done_);
if (!coalesced_packet_.MaybeCoalescePacket(
*packet, self_address(), send_to_address,
helper_->GetStreamSendBufferAllocator(),
@@ -2764,6 +2765,10 @@
buffered_packets_.emplace_back(*packet, self_address(), send_to_address);
break;
case SEND_TO_WRITER:
+ if (fix_out_of_order_sending_ && !coalescing_done_) {
+ // Stop using coalsecer from now on.
+ coalescing_done_ = true;
+ }
// At this point, packet->release_encrypted_buffer is either nullptr,
// meaning |packet->encrypted_buffer| is a stack buffer, or not-nullptr,
/// meaning it's a writer-allocated buffer. Note that connectivity probing
@@ -3097,7 +3102,14 @@
}
QuicPacketBuffer QuicConnection::GetPacketBuffer() {
- if (version().CanSendCoalescedPackets() && !IsHandshakeConfirmed()) {
+ if (fix_out_of_order_sending_) {
+ if (version().CanSendCoalescedPackets() && !coalescing_done_) {
+ // Do not use writer's packet buffer for coalesced packets which may
+ // contain
+ // multiple QUIC packets.
+ return {nullptr, nullptr};
+ }
+ } else if (version().CanSendCoalescedPackets() && !IsHandshakeConfirmed()) {
// Do not use writer's packet buffer for coalesced packets which may contain
// multiple QUIC packets.
return {nullptr, nullptr};
@@ -4806,14 +4818,15 @@
DCHECK(!is_mtu_discovery);
return LEGACY_VERSION_ENCAPSULATE;
}
- if (version().CanSendCoalescedPackets() && !is_mtu_discovery) {
+ if (version().CanSendCoalescedPackets() && !coalescing_done_ &&
+ !is_mtu_discovery) {
if (!IsHandshakeConfirmed()) {
// Before receiving ACK for any 1-RTT packets, always try to coalesce
// packet (except MTU discovery packet).
return COALESCE;
}
- if (GetQuicReloadableFlag(quic_fix_out_of_order_sending)) {
- QUIC_RELOADABLE_FLAG_COUNT(quic_fix_out_of_order_sending);
+ if (fix_out_of_order_sending_) {
+ QUIC_RELOADABLE_FLAG_COUNT(quic_fix_out_of_order_sending2);
if (coalesced_packet_.length() > 0) {
// If the coalescer is not empty, let this packet go through coalescer
// to avoid potential out of order sending.
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index 994a8df..3eec673 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -1783,8 +1783,14 @@
// True if AckFrequencyFrame is supported.
bool can_receive_ack_frequency_frame_ = false;
+ // Indicate whether coalescing is done.
+ bool coalescing_done_ = false;
+
const bool fix_missing_initial_keys_ =
GetQuicReloadableFlag(quic_fix_missing_initial_keys);
+
+ const bool fix_out_of_order_sending_ =
+ GetQuicReloadableFlag(quic_fix_out_of_order_sending2);
};
} // namespace quic