Deprecate gfe2_reloadable_flag_quic_deprecate_http2_priority_experiment.
PiperOrigin-RevId: 354306841
Change-Id: I5ba23aaa35b5a375c5028d33f6baf4df01a4fd12
diff --git a/quic/core/crypto/crypto_protocol.h b/quic/core/crypto/crypto_protocol.h
index 4704c4c..99f5372 100644
--- a/quic/core/crypto/crypto_protocol.h
+++ b/quic/core/crypto/crypto_protocol.h
@@ -28,7 +28,7 @@
// The following tags have been deprecated and should not be reused:
// "1CON", "BBQ4", "NCON", "RCID", "SREJ", "TBKP", "TB10", "SCLS", "SMHL",
-// "QNZR", "B2HI"
+// "QNZR", "B2HI", "H2PR", "FIFO", "LIFO", "RRWS"
// clang-format off
const QuicTag kCHLO = TAG('C', 'H', 'L', 'O'); // Client hello
@@ -337,14 +337,6 @@
const QuicTag kMTUH = TAG('M', 'T', 'U', 'H'); // High-target MTU discovery.
const QuicTag kMTUL = TAG('M', 'T', 'U', 'L'); // Low-target MTU discovery.
-// Enable Priority scheme experiment.
-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.
-const QuicTag kRRWS = TAG('R', 'R', 'W', 'S'); // Round robin write scheduling.
-
const QuicTag kNSLC = TAG('N', 'S', 'L', 'C'); // Always send connection close
// for idle timeout.
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc
index e35d622..8026ac2 100644
--- a/quic/core/http/quic_spdy_session.cc
+++ b/quic/core/http/quic_spdy_session.cc
@@ -324,8 +324,8 @@
void OnHeaders(SpdyStreamId stream_id,
bool has_priority,
int weight,
- SpdyStreamId parent_stream_id,
- bool exclusive,
+ SpdyStreamId /* parent_stream_id */,
+ bool /* exclusive */,
bool fin,
bool /*end*/) override {
if (!session_->IsConnected()) {
@@ -342,13 +342,6 @@
<< "QuicSpdyStream use after free. "
<< session_->destruction_indicator() << QuicStackTrace();
- if (session_->use_http2_priority_write_scheduler()) {
- session_->OnHeaders(
- stream_id, has_priority,
- spdy::SpdyStreamPrecedence(parent_stream_id, weight, exclusive), fin);
- return;
- }
-
SpdyPriority priority =
has_priority ? Http2WeightToSpdy3Priority(weight) : 0;
session_->OnHeaders(stream_id, has_priority,
@@ -379,18 +372,13 @@
void OnContinuation(SpdyStreamId /*stream_id*/, bool /*end*/) override {}
void OnPriority(SpdyStreamId stream_id,
- SpdyStreamId parent_id,
+ SpdyStreamId /* parent_id */,
int weight,
- bool exclusive) override {
+ bool /* exclusive */) override {
DCHECK(!VersionUsesHttp3(session_->transport_version()));
if (!session_->IsConnected()) {
return;
}
- if (session_->use_http2_priority_write_scheduler()) {
- session_->OnPriority(
- stream_id, spdy::SpdyStreamPrecedence(parent_id, weight, exclusive));
- return;
- }
SpdyPriority priority = Http2WeightToSpdy3Priority(weight);
session_->OnPriority(stream_id, spdy::SpdyStreamPrecedence(priority));
}
diff --git a/quic/core/quic_flags_list.h b/quic/core/quic_flags_list.h
index 53b4e40..b30410b 100644
--- a/quic/core/quic_flags_list.h
+++ b/quic/core/quic_flags_list.h
@@ -28,7 +28,6 @@
QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_default_to_bbr, false)
QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_default_to_bbr_v2, false)
QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_delay_initial_ack, true)
-QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_deprecate_http2_priority_experiment, true)
QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_disable_server_blackhole_detection, false)
QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_disable_version_draft_29, false)
QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_disable_version_q043, false)
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index a50d7a6..5c308f0 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -111,9 +111,7 @@
datagram_queue_(this, std::move(datagram_observer)),
closed_streams_clean_up_alarm_(nullptr),
supported_versions_(supported_versions),
- use_http2_priority_write_scheduler_(false),
is_configured_(false),
- enable_round_robin_scheduling_(false),
was_zero_rtt_rejected_(false),
liveness_testing_in_progress_(false) {
closed_streams_clean_up_alarm_ =
@@ -613,9 +611,7 @@
<< ", finished_writes: " << i
<< ", connected: " << connection_->connected()
<< ", connection level flow control blocked: "
- << flow_controller_.IsBlocked() << ", scheduler type: "
- << spdy::WriteSchedulerTypeToString(
- write_blocked_streams_.scheduler_type());
+ << flow_controller_.IsBlocked();
for (QuicStreamId id : last_writing_stream_ids) {
QUIC_LOG(WARNING) << "last_writing_stream_id: " << id;
}
@@ -1271,32 +1267,6 @@
if (ContainsQuicTag(config_.ReceivedConnectionOptions(), kIFWA)) {
AdjustInitialFlowControlWindows(1024 * 1024);
}
- if (GetQuicReloadableFlag(quic_deprecate_http2_priority_experiment)) {
- QUIC_CODE_COUNT(quic_deprecate_http2_priority_experiment);
- } else {
- if (ContainsQuicTag(config_.ReceivedConnectionOptions(), kH2PR) &&
- !VersionHasIetfQuicFrames(transport_version())) {
- // Enable HTTP2 (tree-style) priority write scheduler.
- use_http2_priority_write_scheduler_ =
- write_blocked_streams_.SwitchWriteScheduler(
- spdy::WriteSchedulerType::HTTP2, transport_version());
- } else if (ContainsQuicTag(config_.ReceivedConnectionOptions(),
- kFIFO)) {
- // Enable FIFO write scheduler.
- write_blocked_streams_.SwitchWriteScheduler(
- spdy::WriteSchedulerType::FIFO, transport_version());
- } else if (ContainsQuicTag(config_.ReceivedConnectionOptions(),
- kLIFO)) {
- // Enable LIFO write scheduler.
- write_blocked_streams_.SwitchWriteScheduler(
- spdy::WriteSchedulerType::LIFO, transport_version());
- } else if (ContainsQuicTag(config_.ReceivedConnectionOptions(),
- kRRWS) &&
- write_blocked_streams_.scheduler_type() ==
- spdy::WriteSchedulerType::SPDY) {
- enable_round_robin_scheduling_ = true;
- }
- }
}
config_.SetStatelessResetTokenToSend(GetStatelessResetToken());
@@ -1807,13 +1777,6 @@
QuicStreamId id,
bool is_static,
const spdy::SpdyStreamPrecedence& precedence) {
- if (enable_round_robin_scheduling_) {
- // Ignore provided precedence, instead, put all streams at the same priority
- // bucket.
- write_blocked_streams()->RegisterStream(
- id, is_static, spdy::SpdyStreamPrecedence(spdy::kV3LowestPriority));
- return;
- }
write_blocked_streams()->RegisterStream(id, is_static, precedence);
}
@@ -1824,10 +1787,6 @@
void QuicSession::UpdateStreamPriority(
QuicStreamId id,
const spdy::SpdyStreamPrecedence& new_precedence) {
- if (enable_round_robin_scheduling_) {
- // Ignore updated precedence.
- return;
- }
write_blocked_streams()->UpdateStreamPriority(id, new_precedence);
}
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h
index 2101c28..b995c5d 100644
--- a/quic/core/quic_session.h
+++ b/quic/core/quic_session.h
@@ -543,10 +543,6 @@
inline ParsedQuicVersion version() const { return connection_->version(); }
- bool use_http2_priority_write_scheduler() const {
- return use_http2_priority_write_scheduler_;
- }
-
bool is_configured() const { return is_configured_; }
// Called to neuter crypto data of encryption |level|.
@@ -941,17 +937,10 @@
absl::optional<std::string> user_agent_id_;
- // If true, write_blocked_streams_ uses HTTP2 (tree-style) priority write
- // scheduler.
- bool use_http2_priority_write_scheduler_;
-
// Initialized to false. Set to true when the session has been properly
// configured and is ready for general operation.
bool is_configured_;
- // If true, enables round robin scheduling.
- bool enable_round_robin_scheduling_;
-
// Whether the session has received a 0-RTT rejection (QUIC+TLS only).
bool was_zero_rtt_rejected_;
diff --git a/quic/core/quic_session_test.cc b/quic/core/quic_session_test.cc
index 3288047..7c5d9bb 100644
--- a/quic/core/quic_session_test.cc
+++ b/quic/core/quic_session_test.cc
@@ -1045,142 +1045,6 @@
session_.OnCanWrite();
}
-TEST_P(QuicSessionTestServer, Http2Priority) {
- if (GetQuicReloadableFlag(quic_deprecate_http2_priority_experiment)) {
- return;
- }
-
- if (VersionHasIetfQuicFrames(GetParam().transport_version)) {
- // The test is using HTTP/2 priority which is not supported in IETF QUIC.
- return;
- }
- QuicTagVector copt;
- copt.push_back(kH2PR);
- QuicConfigPeer::SetReceivedConnectionOptions(session_.config(), copt);
- connection_->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
- session_.OnConfigNegotiated();
- ASSERT_TRUE(session_.use_http2_priority_write_scheduler());
-
- session_.set_writev_consumes_all_data(true);
- TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
- TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
- TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
-
- session_.set_writev_consumes_all_data(true);
- /*
- 0
- /|\
- 2 4 6
- */
- session_.MarkConnectionLevelWriteBlocked(stream2->id());
- session_.MarkConnectionLevelWriteBlocked(stream4->id());
- session_.MarkConnectionLevelWriteBlocked(stream6->id());
-
- // Verify streams are scheduled round robin.
- InSequence s;
- EXPECT_CALL(*stream2, OnCanWrite());
- EXPECT_CALL(*stream4, OnCanWrite());
- EXPECT_CALL(*stream6, OnCanWrite());
- session_.OnCanWrite();
-
- /*
- 0
- |
- 4
- / \
- 2 6
- */
- // Update stream 4's priority.
- stream4->SetPriority(
- spdy::SpdyStreamPrecedence(0, spdy::kHttp2DefaultStreamWeight, true));
- session_.MarkConnectionLevelWriteBlocked(stream2->id());
- session_.MarkConnectionLevelWriteBlocked(stream4->id());
- session_.MarkConnectionLevelWriteBlocked(stream6->id());
-
- EXPECT_CALL(*stream4, OnCanWrite()).WillOnce(Invoke([this, stream4]() {
- session_.MarkConnectionLevelWriteBlocked(stream4->id());
- }));
- EXPECT_CALL(*stream4, OnCanWrite());
- EXPECT_CALL(*stream2, OnCanWrite());
- session_.OnCanWrite();
- EXPECT_CALL(*stream6, OnCanWrite());
- session_.OnCanWrite();
-
- /*
- 0
- |
- 6
- |
- 4
- |
- 2
- */
- // Update stream 6's priority.
- stream6->SetPriority(
- spdy::SpdyStreamPrecedence(0, spdy::kHttp2DefaultStreamWeight, true));
- session_.MarkConnectionLevelWriteBlocked(stream2->id());
- session_.MarkConnectionLevelWriteBlocked(stream4->id());
- session_.MarkConnectionLevelWriteBlocked(stream6->id());
-
- EXPECT_CALL(*stream6, OnCanWrite()).WillOnce(Invoke([this, stream6]() {
- session_.MarkConnectionLevelWriteBlocked(stream6->id());
- }));
- EXPECT_CALL(*stream6, OnCanWrite());
- EXPECT_CALL(*stream4, OnCanWrite());
- session_.OnCanWrite();
- EXPECT_CALL(*stream2, OnCanWrite());
- session_.OnCanWrite();
-}
-
-TEST_P(QuicSessionTestServer, RoundRobinScheduling) {
- if (GetQuicReloadableFlag(quic_deprecate_http2_priority_experiment)) {
- return;
- }
-
- if (VersionHasIetfQuicFrames(GetParam().transport_version)) {
- // IETF QUIC currently doesn't support PRIORITY.
- return;
- }
- QuicTagVector copt;
- copt.push_back(kRRWS);
- QuicConfigPeer::SetReceivedConnectionOptions(session_.config(), copt);
- connection_->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
- session_.OnConfigNegotiated();
-
- session_.set_writev_consumes_all_data(true);
- TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
- TestStream* stream4 = session_.CreateOutgoingBidirectionalStream();
- TestStream* stream6 = session_.CreateOutgoingBidirectionalStream();
-
- session_.set_writev_consumes_all_data(true);
- session_.MarkConnectionLevelWriteBlocked(stream2->id());
- session_.MarkConnectionLevelWriteBlocked(stream4->id());
- session_.MarkConnectionLevelWriteBlocked(stream6->id());
-
- // Verify streams are scheduled round robin.
- InSequence s;
- EXPECT_CALL(*stream2, OnCanWrite());
- EXPECT_CALL(*stream4, OnCanWrite());
- EXPECT_CALL(*stream6, OnCanWrite());
- session_.OnCanWrite();
-
- /* 2, 4, 6, 8 */
- TestStream* stream8 = session_.CreateOutgoingBidirectionalStream();
-
- // Verify updated priority is ignored.
- stream4->SetPriority(spdy::SpdyStreamPrecedence(spdy::kV3HighestPriority));
- session_.MarkConnectionLevelWriteBlocked(stream8->id());
- session_.MarkConnectionLevelWriteBlocked(stream4->id());
- session_.MarkConnectionLevelWriteBlocked(stream2->id());
- session_.MarkConnectionLevelWriteBlocked(stream6->id());
-
- EXPECT_CALL(*stream8, OnCanWrite());
- EXPECT_CALL(*stream4, OnCanWrite());
- EXPECT_CALL(*stream2, OnCanWrite());
- EXPECT_CALL(*stream6, OnCanWrite());
- session_.OnCanWrite();
-}
-
TEST_P(QuicSessionTestServer, OnCanWriteBundlesStreams) {
// Encryption needs to be established before data can be sent.
CompleteHandshake();
diff --git a/quic/core/quic_stream.cc b/quic/core/quic_stream.cc
index 5aa7150..b5cdd31 100644
--- a/quic/core/quic_stream.cc
+++ b/quic/core/quic_stream.cc
@@ -1458,16 +1458,10 @@
// static
spdy::SpdyStreamPrecedence QuicStream::CalculateDefaultPriority(
const QuicSession* session) {
- if (VersionUsesHttp3(session->transport_version())) {
- return spdy::SpdyStreamPrecedence(kDefaultUrgency);
- }
-
- if (session->use_http2_priority_write_scheduler()) {
- return spdy::SpdyStreamPrecedence(0, spdy::kHttp2DefaultStreamWeight,
- false);
- }
-
- return spdy::SpdyStreamPrecedence(QuicStream::kDefaultPriority);
+ return spdy::SpdyStreamPrecedence(
+ VersionUsesHttp3(session->transport_version())
+ ? kDefaultUrgency
+ : QuicStream::kDefaultPriority);
}
} // namespace quic
diff --git a/quic/core/quic_write_blocked_list.cc b/quic/core/quic_write_blocked_list.cc
index 21e4fde..02b72e3 100644
--- a/quic/core/quic_write_blocked_list.cc
+++ b/quic/core/quic_write_blocked_list.cc
@@ -10,13 +10,10 @@
namespace quic {
QuicWriteBlockedList::QuicWriteBlockedList(QuicTransportVersion version)
- : priority_write_scheduler_(
- std::make_unique<spdy::PriorityWriteScheduler<QuicStreamId>>(
- QuicVersionUsesCryptoFrames(version)
- ? std::numeric_limits<QuicStreamId>::max()
- : 0)),
- last_priority_popped_(0),
- scheduler_type_(spdy::WriteSchedulerType::SPDY) {
+ : priority_write_scheduler_(QuicVersionUsesCryptoFrames(version)
+ ? std::numeric_limits<QuicStreamId>::max()
+ : 0),
+ last_priority_popped_(0) {
memset(batch_write_stream_id_, 0, sizeof(batch_write_stream_id_));
memset(bytes_left_for_batch_write_, 0, sizeof(bytes_left_for_batch_write_));
}
@@ -35,47 +32,7 @@
}
}
- return priority_write_scheduler_->ShouldYield(id);
-}
-
-bool QuicWriteBlockedList::SwitchWriteScheduler(spdy::WriteSchedulerType type,
- QuicTransportVersion version) {
- if (scheduler_type_ == type) {
- return true;
- }
- if (priority_write_scheduler_->NumRegisteredStreams() != 0) {
- QUIC_BUG << "Cannot switch scheduler with registered streams";
- return false;
- }
- QUIC_DVLOG(1) << "Switching to scheduler type: "
- << spdy::WriteSchedulerTypeToString(type);
- switch (type) {
- case spdy::WriteSchedulerType::LIFO:
- priority_write_scheduler_ =
- std::make_unique<spdy::LifoWriteScheduler<QuicStreamId>>();
- break;
- case spdy::WriteSchedulerType::SPDY:
- priority_write_scheduler_ =
- std::make_unique<spdy::PriorityWriteScheduler<QuicStreamId>>(
- QuicVersionUsesCryptoFrames(version)
- ? std::numeric_limits<QuicStreamId>::max()
- : 0);
- break;
- case spdy::WriteSchedulerType::HTTP2:
- priority_write_scheduler_ =
- std::make_unique<spdy::Http2PriorityWriteScheduler<QuicStreamId>>();
- break;
- case spdy::WriteSchedulerType::FIFO:
- priority_write_scheduler_ =
- std::make_unique<spdy::FifoWriteScheduler<QuicStreamId>>();
- break;
- default:
- QUIC_BUG << "Scheduler is not supported for type: "
- << spdy::WriteSchedulerTypeToString(type);
- return false;
- }
- scheduler_type_ = type;
- return true;
+ return priority_write_scheduler_.ShouldYield(id);
}
QuicStreamId QuicWriteBlockedList::PopFront() {
@@ -85,16 +42,12 @@
}
const auto id_and_precedence =
- priority_write_scheduler_->PopNextReadyStreamAndPrecedence();
+ priority_write_scheduler_.PopNextReadyStreamAndPrecedence();
const QuicStreamId id = std::get<0>(id_and_precedence);
- if (scheduler_type_ != spdy::WriteSchedulerType::SPDY) {
- // No batch writing logic for non-SPDY priority write scheduler.
- return id;
- }
const spdy::SpdyPriority priority =
std::get<1>(id_and_precedence).spdy3_priority();
- if (!priority_write_scheduler_->HasReadyStreams()) {
+ if (!priority_write_scheduler_.HasReadyStreams()) {
// If no streams are blocked, don't bother latching. This stream will be
// the first popped for its priority anyway.
batch_write_stream_id_[priority] = 0;
@@ -113,15 +66,15 @@
QuicStreamId stream_id,
bool is_static_stream,
const spdy::SpdyStreamPrecedence& precedence) {
- DCHECK(!priority_write_scheduler_->StreamRegistered(stream_id))
+ DCHECK(!priority_write_scheduler_.StreamRegistered(stream_id))
<< "stream " << stream_id << " already registered";
- DCHECK(PrecedenceMatchesSchedulerType(precedence));
+ DCHECK(precedence.is_spdy3_priority());
if (is_static_stream) {
static_stream_collection_.Register(stream_id);
return;
}
- priority_write_scheduler_->RegisterStream(stream_id, precedence);
+ priority_write_scheduler_.RegisterStream(stream_id, precedence);
}
void QuicWriteBlockedList::UnregisterStream(QuicStreamId stream_id,
@@ -130,22 +83,19 @@
static_stream_collection_.Unregister(stream_id);
return;
}
- priority_write_scheduler_->UnregisterStream(stream_id);
+ priority_write_scheduler_.UnregisterStream(stream_id);
}
void QuicWriteBlockedList::UpdateStreamPriority(
QuicStreamId stream_id,
const spdy::SpdyStreamPrecedence& new_precedence) {
DCHECK(!static_stream_collection_.IsRegistered(stream_id));
- DCHECK(PrecedenceMatchesSchedulerType(new_precedence));
- priority_write_scheduler_->UpdateStreamPrecedence(stream_id, new_precedence);
+ DCHECK(new_precedence.is_spdy3_priority());
+ priority_write_scheduler_.UpdateStreamPrecedence(stream_id, new_precedence);
}
void QuicWriteBlockedList::UpdateBytesForStream(QuicStreamId stream_id,
size_t bytes) {
- if (scheduler_type_ != spdy::WriteSchedulerType::SPDY) {
- return;
- }
if (batch_write_stream_id_[last_priority_popped_] == stream_id) {
// If this was the last data stream popped by PopFront, update the
// bytes remaining in its batch write.
@@ -160,10 +110,9 @@
}
bool push_front =
- scheduler_type_ == spdy::WriteSchedulerType::SPDY &&
stream_id == batch_write_stream_id_[last_priority_popped_] &&
bytes_left_for_batch_write_[last_priority_popped_] > 0;
- priority_write_scheduler_->MarkStreamReady(stream_id, push_front);
+ priority_write_scheduler_.MarkStreamReady(stream_id, push_front);
}
bool QuicWriteBlockedList::IsStreamBlocked(QuicStreamId stream_id) const {
@@ -173,25 +122,7 @@
}
}
- return priority_write_scheduler_->IsStreamReady(stream_id);
-}
-
-bool QuicWriteBlockedList::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:
- return !precedence.is_spdy3_priority();
- case spdy::WriteSchedulerType::FIFO:
- break;
- default:
- DCHECK(false);
- return false;
- }
- return true;
+ return priority_write_scheduler_.IsStreamReady(stream_id);
}
void QuicWriteBlockedList::StaticStreamCollection::Register(QuicStreamId id) {
diff --git a/quic/core/quic_write_blocked_list.h b/quic/core/quic_write_blocked_list.h
index 7b5f29f..2d87847 100644
--- a/quic/core/quic_write_blocked_list.h
+++ b/quic/core/quic_write_blocked_list.h
@@ -26,9 +26,6 @@
// priority. QUIC stream priority order is:
// Crypto stream > Headers stream > Data streams by requested priority.
class QUIC_EXPORT_PRIVATE QuicWriteBlockedList {
- private:
- using QuicPriorityWriteScheduler = spdy::WriteScheduler<QuicStreamId>;
-
public:
explicit QuicWriteBlockedList(QuicTransportVersion version);
QuicWriteBlockedList(const QuicWriteBlockedList&) = delete;
@@ -36,7 +33,7 @@
~QuicWriteBlockedList();
bool HasWriteBlockedDataStreams() const {
- return priority_write_scheduler_->HasReadyStreams();
+ return priority_write_scheduler_.HasReadyStreams();
}
bool HasWriteBlockedSpecialStream() const {
@@ -49,20 +46,15 @@
size_t NumBlockedStreams() const {
return NumBlockedSpecialStreams() +
- priority_write_scheduler_->NumReadyStreams();
+ priority_write_scheduler_.NumReadyStreams();
}
bool ShouldYield(QuicStreamId id) const;
spdy::SpdyPriority GetSpdyPriorityofStream(QuicStreamId id) const {
- return priority_write_scheduler_->GetStreamPrecedence(id).spdy3_priority();
+ return priority_write_scheduler_.GetStreamPrecedence(id).spdy3_priority();
}
- // Switches write scheduler. This can only be called before any stream is
- // registered.
- bool SwitchWriteScheduler(spdy::WriteSchedulerType type,
- QuicTransportVersion version);
-
// Pops the highest priority stream, special casing crypto and headers
// streams. Latches the most recently popped data stream for batch writing
// purposes.
@@ -88,13 +80,8 @@
// Returns true if stream with |stream_id| is write blocked.
bool IsStreamBlocked(QuicStreamId stream_id) const;
- spdy::WriteSchedulerType scheduler_type() const { return scheduler_type_; }
-
private:
- bool PrecedenceMatchesSchedulerType(
- const spdy::SpdyStreamPrecedence& precedence);
-
- std::unique_ptr<QuicPriorityWriteScheduler> priority_write_scheduler_;
+ spdy::PriorityWriteScheduler<QuicStreamId> priority_write_scheduler_;
// If performing batch writes, this will be the stream ID of the stream doing
// batch writes for this priority level. We will allow this stream to write
@@ -152,8 +139,6 @@
};
StaticStreamCollection static_stream_collection_;
-
- spdy::WriteSchedulerType scheduler_type_;
};
} // namespace quic
diff --git a/quic/core/quic_write_blocked_list_test.cc b/quic/core/quic_write_blocked_list_test.cc
index 9ce822d..7cf7797 100644
--- a/quic/core/quic_write_blocked_list_test.cc
+++ b/quic/core/quic_write_blocked_list_test.cc
@@ -15,73 +15,37 @@
namespace test {
namespace {
-const bool kExclusiveBit = true;
-
class QuicWriteBlockedListTest : public QuicTestWithParam<bool> {
public:
QuicWriteBlockedListTest()
- : write_blocked_list_(AllSupportedVersions()[0].transport_version) {
- if (GetParam()) {
- write_blocked_list_.SwitchWriteScheduler(
- spdy::WriteSchedulerType::HTTP2,
- AllSupportedVersions()[0].transport_version);
- }
- }
+ : write_blocked_list_(AllSupportedVersions()[0].transport_version) {}
protected:
QuicWriteBlockedList write_blocked_list_;
};
-INSTANTIATE_TEST_SUITE_P(Tests,
- QuicWriteBlockedListTest,
- ::testing::Bool(),
- ::testing::PrintToStringParamName());
-
-TEST_P(QuicWriteBlockedListTest, PriorityOrder) {
- if (GetParam()) {
- /*
- 0
- |
- 23
- |
- 17
- |
- 40
- */
- write_blocked_list_.RegisterStream(
- 17, false,
- spdy::SpdyStreamPrecedence(0, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- write_blocked_list_.RegisterStream(
- 40, false,
- spdy::SpdyStreamPrecedence(17, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- write_blocked_list_.RegisterStream(
- 23, false,
- spdy::SpdyStreamPrecedence(0, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- write_blocked_list_.RegisterStream(
- 1, true,
- spdy::SpdyStreamPrecedence(0, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- write_blocked_list_.RegisterStream(
- 3, true,
- spdy::SpdyStreamPrecedence(0, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- } else {
- // Mark streams blocked in roughly reverse priority order, and
- // verify that streams are sorted.
- write_blocked_list_.RegisterStream(
- 40, false, spdy::SpdyStreamPrecedence(kV3LowestPriority));
- write_blocked_list_.RegisterStream(
- 23, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
- write_blocked_list_.RegisterStream(
- 17, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
- write_blocked_list_.RegisterStream(
- 1, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
- write_blocked_list_.RegisterStream(
- 3, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
- }
+TEST_F(QuicWriteBlockedListTest, PriorityOrder) {
+ /*
+ 0
+ |
+ 23
+ |
+ 17
+ |
+ 40
+ */
+ // Mark streams blocked in roughly reverse priority order, and
+ // verify that streams are sorted.
+ write_blocked_list_.RegisterStream(
+ 40, false, spdy::SpdyStreamPrecedence(kV3LowestPriority));
+ write_blocked_list_.RegisterStream(
+ 23, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ write_blocked_list_.RegisterStream(
+ 17, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ write_blocked_list_.RegisterStream(
+ 1, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ write_blocked_list_.RegisterStream(
+ 3, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
write_blocked_list_.AddStream(40);
EXPECT_TRUE(write_blocked_list_.IsStreamBlocked(40));
@@ -120,16 +84,9 @@
EXPECT_FALSE(write_blocked_list_.HasWriteBlockedDataStreams());
}
-TEST_P(QuicWriteBlockedListTest, CryptoStream) {
- if (GetParam()) {
- write_blocked_list_.RegisterStream(
- 1, true,
- spdy::SpdyStreamPrecedence(0, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- } else {
- write_blocked_list_.RegisterStream(
- 1, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
- }
+TEST_F(QuicWriteBlockedListTest, CryptoStream) {
+ write_blocked_list_.RegisterStream(
+ 1, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
write_blocked_list_.AddStream(1);
EXPECT_EQ(1u, write_blocked_list_.NumBlockedStreams());
@@ -139,16 +96,9 @@
EXPECT_FALSE(write_blocked_list_.HasWriteBlockedSpecialStream());
}
-TEST_P(QuicWriteBlockedListTest, HeadersStream) {
- if (GetParam()) {
- write_blocked_list_.RegisterStream(
- 3, true,
- spdy::SpdyStreamPrecedence(0, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- } else {
- write_blocked_list_.RegisterStream(
- 3, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
- }
+TEST_F(QuicWriteBlockedListTest, HeadersStream) {
+ write_blocked_list_.RegisterStream(
+ 3, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
write_blocked_list_.AddStream(3);
EXPECT_EQ(1u, write_blocked_list_.NumBlockedStreams());
@@ -158,22 +108,11 @@
EXPECT_FALSE(write_blocked_list_.HasWriteBlockedSpecialStream());
}
-TEST_P(QuicWriteBlockedListTest, VerifyHeadersStream) {
- if (GetParam()) {
- write_blocked_list_.RegisterStream(
- 5, false,
- spdy::SpdyStreamPrecedence(0, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- write_blocked_list_.RegisterStream(
- 3, true,
- spdy::SpdyStreamPrecedence(0, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- } else {
- write_blocked_list_.RegisterStream(
- 5, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
- write_blocked_list_.RegisterStream(
- 3, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
- }
+TEST_F(QuicWriteBlockedListTest, VerifyHeadersStream) {
+ write_blocked_list_.RegisterStream(
+ 5, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ write_blocked_list_.RegisterStream(
+ 3, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
write_blocked_list_.AddStream(5);
write_blocked_list_.AddStream(3);
@@ -189,20 +128,13 @@
EXPECT_FALSE(write_blocked_list_.HasWriteBlockedDataStreams());
}
-TEST_P(QuicWriteBlockedListTest, NoDuplicateEntries) {
+TEST_F(QuicWriteBlockedListTest, NoDuplicateEntries) {
// Test that QuicWriteBlockedList doesn't allow duplicate entries.
// Try to add a stream to the write blocked list multiple times at the same
// priority.
const QuicStreamId kBlockedId = 3 + 2;
- if (GetParam()) {
- write_blocked_list_.RegisterStream(
- kBlockedId, false,
- spdy::SpdyStreamPrecedence(0, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- } else {
write_blocked_list_.RegisterStream(
kBlockedId, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
- }
write_blocked_list_.AddStream(kBlockedId);
write_blocked_list_.AddStream(kBlockedId);
write_blocked_list_.AddStream(kBlockedId);
@@ -217,10 +149,7 @@
EXPECT_FALSE(write_blocked_list_.HasWriteBlockedDataStreams());
}
-TEST_P(QuicWriteBlockedListTest, BatchingWrites) {
- if (GetParam()) {
- return;
- }
+TEST_F(QuicWriteBlockedListTest, BatchingWrites) {
const QuicStreamId id1 = 3 + 2;
const QuicStreamId id2 = id1 + 2;
const QuicStreamId id3 = id2 + 2;
@@ -273,62 +202,31 @@
EXPECT_EQ(id1, write_blocked_list_.PopFront());
}
-TEST_P(QuicWriteBlockedListTest, Ceding) {
- if (GetParam()) {
- /*
- 0
- |
- 15
- |
- 16
- |
- 5
- |
- 4
- |
- 7
- */
- write_blocked_list_.RegisterStream(
- 15, false,
- spdy::SpdyStreamPrecedence(0, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- write_blocked_list_.RegisterStream(
- 16, false,
- spdy::SpdyStreamPrecedence(15, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- write_blocked_list_.RegisterStream(
- 4, false,
- spdy::SpdyStreamPrecedence(16, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- write_blocked_list_.RegisterStream(
- 5, false,
- spdy::SpdyStreamPrecedence(16, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- write_blocked_list_.RegisterStream(
- 7, false,
- spdy::SpdyStreamPrecedence(4, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- write_blocked_list_.RegisterStream(
- 1, true,
- spdy::SpdyStreamPrecedence(0, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- write_blocked_list_.RegisterStream(
- 3, true,
- spdy::SpdyStreamPrecedence(0, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- } else {
- write_blocked_list_.RegisterStream(
- 15, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
- write_blocked_list_.RegisterStream(
- 16, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
- write_blocked_list_.RegisterStream(5, false, spdy::SpdyStreamPrecedence(5));
- write_blocked_list_.RegisterStream(4, false, spdy::SpdyStreamPrecedence(5));
- write_blocked_list_.RegisterStream(7, false, spdy::SpdyStreamPrecedence(7));
- write_blocked_list_.RegisterStream(
- 1, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
- write_blocked_list_.RegisterStream(
- 3, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
- }
+TEST_F(QuicWriteBlockedListTest, Ceding) {
+ /*
+ 0
+ |
+ 15
+ |
+ 16
+ |
+ 5
+ |
+ 4
+ |
+ 7
+ */
+ write_blocked_list_.RegisterStream(
+ 15, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ write_blocked_list_.RegisterStream(
+ 16, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ write_blocked_list_.RegisterStream(5, false, spdy::SpdyStreamPrecedence(5));
+ write_blocked_list_.RegisterStream(4, false, spdy::SpdyStreamPrecedence(5));
+ write_blocked_list_.RegisterStream(7, false, spdy::SpdyStreamPrecedence(7));
+ write_blocked_list_.RegisterStream(
+ 1, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ write_blocked_list_.RegisterStream(
+ 3, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
// When nothing is on the list, nothing yields.
EXPECT_FALSE(write_blocked_list_.ShouldYield(5));
@@ -366,66 +264,6 @@
EXPECT_FALSE(write_blocked_list_.ShouldYield(1));
}
-TEST_P(QuicWriteBlockedListTest, UpdateStreamPriority) {
- if (!GetParam()) {
- return;
- }
- /*
- 0
- |
- 5
- |
- 7
- |
- 9
- |
- 11
- */
- write_blocked_list_.RegisterStream(
- 5, false,
- spdy::SpdyStreamPrecedence(0, kHttp2DefaultStreamWeight, kExclusiveBit));
- write_blocked_list_.RegisterStream(
- 7, false,
- spdy::SpdyStreamPrecedence(5, kHttp2DefaultStreamWeight, kExclusiveBit));
- write_blocked_list_.RegisterStream(
- 9, false,
- spdy::SpdyStreamPrecedence(7, kHttp2DefaultStreamWeight, kExclusiveBit));
- write_blocked_list_.RegisterStream(
- 11, false,
- spdy::SpdyStreamPrecedence(9, kHttp2DefaultStreamWeight, kExclusiveBit));
-
- write_blocked_list_.AddStream(7);
- EXPECT_FALSE(write_blocked_list_.ShouldYield(5));
- EXPECT_TRUE(write_blocked_list_.ShouldYield(9));
- EXPECT_TRUE(write_blocked_list_.ShouldYield(11));
-
- // Update 9's priority.
- if (GetParam()) {
- /*
- 0
- |
- 5
- / \
- 7 9
- |
- 11
- */
- write_blocked_list_.UpdateStreamPriority(
- 9, spdy::SpdyStreamPrecedence(5, kHttp2DefaultStreamWeight,
- kExclusiveBit));
- } else {
- write_blocked_list_.UpdateStreamPriority(9, spdy::SpdyStreamPrecedence(1));
- }
- EXPECT_FALSE(write_blocked_list_.ShouldYield(5));
- // Verify 9 now does not yield to 7.
- EXPECT_FALSE(write_blocked_list_.ShouldYield(9));
- EXPECT_FALSE(write_blocked_list_.ShouldYield(11));
-
- write_blocked_list_.AddStream(9);
- // Verify 11 yield to 9.
- EXPECT_TRUE(write_blocked_list_.ShouldYield(11));
-}
-
} // namespace
} // namespace test
} // namespace quic
diff --git a/quic/tools/quic_simple_server_session.cc b/quic/tools/quic_simple_server_session.cc
index 33bad6b..740b591 100644
--- a/quic/tools/quic_simple_server_session.cc
+++ b/quic/tools/quic_simple_server_session.cc
@@ -65,7 +65,7 @@
const std::string& request_url,
const std::list<QuicBackendResponse::ServerPushInfo>& resources,
QuicStreamId original_stream_id,
- const spdy::SpdyStreamPrecedence& original_precedence,
+ const spdy::SpdyStreamPrecedence& /* original_precedence */,
const spdy::Http2HeaderBlock& original_request_headers) {
if (!server_push_enabled()) {
return;
@@ -85,11 +85,9 @@
highest_promised_stream_id_ = new_highest_promised_stream_id;
SendPushPromise(original_stream_id, highest_promised_stream_id_,
headers.Clone());
- promised_streams_.push_back(PromisedStreamInfo(
- std::move(headers), highest_promised_stream_id_,
- use_http2_priority_write_scheduler()
- ? original_precedence
- : spdy::SpdyStreamPrecedence(resource.priority)));
+ promised_streams_.push_back(
+ PromisedStreamInfo(std::move(headers), highest_promised_stream_id_,
+ spdy::SpdyStreamPrecedence(resource.priority)));
}
// Procese promised push request as many as possible.