gfe-relnote: Let GFE be able to use LIFO write scheduler in QUIC and enable it via a connection option LIFO. Protected by gfe2_reloadable_flag_quic_use_lifo_write_scheduler.
PiperOrigin-RevId: 261741584
Change-Id: I2db660dd8a9e2eb40b70147ea829825a8f45404e
diff --git a/quic/core/crypto/crypto_protocol.h b/quic/core/crypto/crypto_protocol.h
index 0facf00..bbd0b18 100644
--- a/quic/core/crypto/crypto_protocol.h
+++ b/quic/core/crypto/crypto_protocol.h
@@ -201,6 +201,8 @@
const QuicTag kH2PR = TAG('H', '2', 'P', 'R'); // HTTP2 priorities.
const QuicTag kFIFO = TAG('F', 'I', 'F', 'O'); // Stream with the smallest ID
// has the highest priority.
+const QuicTag kLIFO = TAG('L', 'I', 'F', 'O'); // Stream with the largest ID
+ // has the highest priority.
// Proof types (i.e. certificate types)
// NOTE: although it would be silly to do so, specifying both kX509 and kX59R
diff --git a/quic/core/http/end_to_end_test.cc b/quic/core/http/end_to_end_test.cc
index 2e79f78..750f371 100644
--- a/quic/core/http/end_to_end_test.cc
+++ b/quic/core/http/end_to_end_test.cc
@@ -158,7 +158,7 @@
continue;
}
for (const QuicTag priority_tag :
- {/*no tag*/ static_cast<QuicTag>(0), kH2PR, kFIFO}) {
+ {/*no tag*/ static_cast<QuicTag>(0), kH2PR, kFIFO, kLIFO}) {
// Add an entry for server and client supporting all versions.
params.push_back(TestParams(client_versions, all_supported_versions,
client_versions.front(),
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index e39fd41..fe65bc3 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -1014,6 +1014,14 @@
connection_->transport_version())) {
QUIC_RELOADABLE_FLAG_COUNT(quic_enable_fifo_write_scheduler);
}
+ } else if (GetQuicReloadableFlag(quic_enable_lifo_write_scheduler) &&
+ ContainsQuicTag(config_.ReceivedConnectionOptions(), kLIFO)) {
+ // Enable LIFO write scheduler.
+ if (write_blocked_streams_.SwitchWriteScheduler(
+ spdy::WriteSchedulerType::LIFO,
+ connection_->transport_version())) {
+ QUIC_RELOADABLE_FLAG_COUNT(quic_enable_lifo_write_scheduler);
+ }
}
}
diff --git a/quic/core/quic_write_blocked_list.h b/quic/core/quic_write_blocked_list.h
index dd9ddb4..72ebc05 100644
--- a/quic/core/quic_write_blocked_list.h
+++ b/quic/core/quic_write_blocked_list.h
@@ -16,6 +16,7 @@
#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
#include "net/third_party/quiche/src/spdy/core/fifo_write_scheduler.h"
#include "net/third_party/quiche/src/spdy/core/http2_priority_write_scheduler.h"
+#include "net/third_party/quiche/src/spdy/core/lifo_write_scheduler.h"
#include "net/third_party/quiche/src/spdy/core/priority_write_scheduler.h"
namespace quic {
@@ -79,6 +80,10 @@
QUIC_DVLOG(1) << "Switching to scheduler type: "
<< spdy::WriteSchedulerTypeToString(type);
switch (type) {
+ case spdy::WriteSchedulerType::LIFO:
+ priority_write_scheduler_ =
+ QuicMakeUnique<spdy::LifoWriteScheduler<QuicStreamId>>();
+ break;
case spdy::WriteSchedulerType::SPDY:
priority_write_scheduler_ =
QuicMakeUnique<spdy::PriorityWriteScheduler<QuicStreamId>>(
@@ -209,6 +214,8 @@
bool PrecedenceMatchesSchedulerType(
const spdy::SpdyStreamPrecedence& precedence) {
switch (scheduler_type_) {
+ case spdy::WriteSchedulerType::LIFO:
+ break;
case spdy::WriteSchedulerType::SPDY:
return precedence.is_spdy3_priority();
case spdy::WriteSchedulerType::HTTP2: