gfe-relnote: In QUIC, replaces QuicStream::priority_ with QuicStream::precedence_ and pluming it to write_blocked_list. No functional change expected. Not protected.
This is a preparation for using H2 priority.
PiperOrigin-RevId: 260000909
Change-Id: Ieee790614b259509ad12611e17e99511feedc423
diff --git a/quic/core/http/quic_headers_stream_test.cc b/quic/core/http/quic_headers_stream_test.cc
index ebfa6cc..89338a8 100644
--- a/quic/core/http/quic_headers_stream_test.cc
+++ b/quic/core/http/quic_headers_stream_test.cc
@@ -284,7 +284,8 @@
_, _, NO_FIN))
.WillOnce(WithArgs<2>(Invoke(this, &QuicHeadersStreamTest::SaveIov)));
QuicSpdySessionPeer::WriteHeadersOnHeadersStream(
- &session_, stream_id, headers_.Clone(), fin, priority, nullptr);
+ &session_, stream_id, headers_.Clone(), fin,
+ spdy::SpdyStreamPrecedence(priority), nullptr);
// Parse the outgoing data and check that it matches was was written.
if (is_request) {
@@ -451,7 +452,8 @@
headers_frame.set_has_priority(true);
headers_frame.set_weight(Spdy3PriorityToHttp2Weight(0));
frame = framer_->SerializeFrame(headers_frame);
- EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0));
+ EXPECT_CALL(session_, OnStreamHeadersPriority(
+ stream_id, spdy::SpdyStreamPrecedence(0)));
} else {
SpdyHeadersIR headers_frame(stream_id, headers_.Clone());
headers_frame.set_fin(fin);
@@ -536,7 +538,10 @@
.WillRepeatedly(InvokeWithoutArgs(
this, &QuicHeadersStreamTest::TearDownLocalConnectionState));
} else {
- EXPECT_CALL(session_, OnPriorityFrame(stream_id, priority)).Times(1);
+ EXPECT_CALL(
+ session_,
+ OnPriorityFrame(stream_id, spdy::SpdyStreamPrecedence(priority)))
+ .Times(1);
}
stream_frame_.data_buffer = frame.data();
stream_frame_.data_length = frame.size();
@@ -588,7 +593,8 @@
headers_frame.set_has_priority(true);
headers_frame.set_weight(Spdy3PriorityToHttp2Weight(0));
frame = framer_->SerializeFrame(headers_frame);
- EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0));
+ EXPECT_CALL(session_, OnStreamHeadersPriority(
+ stream_id, spdy::SpdyStreamPrecedence(0)));
} else {
SpdyHeadersIR headers_frame(stream_id, headers_.Clone());
headers_frame.set_fin(fin);
@@ -778,7 +784,8 @@
headers_frame.set_has_priority(true);
headers_frame.set_weight(Spdy3PriorityToHttp2Weight(0));
frame = framer_->SerializeFrame(headers_frame);
- EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0));
+ EXPECT_CALL(session_, OnStreamHeadersPriority(
+ stream_id, spdy::SpdyStreamPrecedence(0)));
} else {
SpdyHeadersIR headers_frame(stream_id, headers_.Clone());
headers_frame.set_fin(fin);
diff --git a/quic/core/http/quic_receive_control_stream.cc b/quic/core/http/quic_receive_control_stream.cc
index 93fae3a..922dc8c 100644
--- a/quic/core/http/quic_receive_control_stream.cc
+++ b/quic/core/http/quic_receive_control_stream.cc
@@ -237,7 +237,7 @@
// that the server is not permitted to open. In that case, simply drop the
// frame.
if (stream) {
- stream->SetPriority(priority.weight);
+ stream->SetPriority(spdy::SpdyStreamPrecedence(priority.weight));
}
return true;
}
diff --git a/quic/core/http/quic_receive_control_stream_test.cc b/quic/core/http/quic_receive_control_stream_test.cc
index aaf60e9..d5a3139 100644
--- a/quic/core/http/quic_receive_control_stream_test.cc
+++ b/quic/core/http/quic_receive_control_stream_test.cc
@@ -223,9 +223,9 @@
QuicStreamFrame data(receive_control_stream_->id(), false, 0,
QuicStringPiece(serialized_frame));
- EXPECT_EQ(3u, stream_->priority());
+ EXPECT_EQ(3u, stream_->precedence().spdy3_priority());
receive_control_stream_->OnStreamFrame(data);
- EXPECT_EQ(1u, stream_->priority());
+ EXPECT_EQ(1u, stream_->precedence().spdy3_priority());
}
TEST_P(QuicReceiveControlStreamTest, PushPromiseOnControlStreamShouldClose) {
diff --git a/quic/core/http/quic_server_session_base_test.cc b/quic/core/http/quic_server_session_base_test.cc
index 0041c85..698193b 100644
--- a/quic/core/http/quic_server_session_base_test.cc
+++ b/quic/core/http/quic_server_session_base_test.cc
@@ -503,7 +503,8 @@
QuicServerSessionBasePeer::SetCryptoStream(session_.get(), crypto_stream);
session_->RegisterStreamPriority(
QuicUtils::GetHeadersStreamId(connection_->transport_version()),
- /*is_static=*/true, QuicStream::kDefaultPriority);
+ /*is_static=*/true,
+ spdy::SpdyStreamPrecedence(QuicStream::kDefaultPriority));
// Set some initial bandwidth values.
QuicSentPacketManager* sent_packet_manager =
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc
index 3a55a34..6352d7b 100644
--- a/quic/core/http/quic_spdy_session.cc
+++ b/quic/core/http/quic_spdy_session.cc
@@ -215,11 +215,10 @@
return;
}
- // TODO(mpw): avoid down-conversion and plumb SpdyStreamPrecedence through
- // QuicHeadersStream.
SpdyPriority priority =
has_priority ? Http2WeightToSpdy3Priority(weight) : 0;
- session_->OnHeaders(stream_id, has_priority, priority, fin);
+ session_->OnHeaders(stream_id, has_priority,
+ spdy::SpdyStreamPrecedence(priority), fin);
}
void OnWindowUpdate(SpdyStreamId /*stream_id*/,
@@ -259,7 +258,7 @@
// TODO (wangyix): implement real HTTP/2 weights and dependencies instead of
// converting to SpdyPriority.
SpdyPriority priority = Http2WeightToSpdy3Priority(weight);
- session_->OnPriority(stream_id, priority);
+ session_->OnPriority(stream_id, spdy::SpdyStreamPrecedence(priority));
}
bool OnUnknownFrame(SpdyStreamId /*stream_id*/,
@@ -412,14 +411,15 @@
QUIC_NOTREACHED();
}
-void QuicSpdySession::OnStreamHeadersPriority(QuicStreamId stream_id,
- SpdyPriority priority) {
+void QuicSpdySession::OnStreamHeadersPriority(
+ QuicStreamId stream_id,
+ const spdy::SpdyStreamPrecedence& precedence) {
QuicSpdyStream* stream = GetSpdyDataStream(stream_id);
if (!stream) {
// It's quite possible to receive headers after a stream has been reset.
return;
}
- stream->OnStreamHeadersPriority(priority);
+ stream->OnStreamHeadersPriority(precedence);
}
void QuicSpdySession::OnStreamHeaderList(QuicStreamId stream_id,
@@ -460,15 +460,16 @@
stream->OnStreamHeaderList(fin, frame_len, header_list);
}
-void QuicSpdySession::OnPriorityFrame(QuicStreamId stream_id,
- SpdyPriority priority) {
+void QuicSpdySession::OnPriorityFrame(
+ QuicStreamId stream_id,
+ const spdy::SpdyStreamPrecedence& precedence) {
QuicSpdyStream* stream = GetSpdyDataStream(stream_id);
if (!stream) {
// It's quite possible to receive a PRIORITY frame after a stream has been
// reset.
return;
}
- stream->OnPriorityFrame(priority);
+ stream->OnPriorityFrame(precedence);
}
size_t QuicSpdySession::ProcessHeaderData(const struct iovec& iov) {
@@ -480,13 +481,14 @@
QuicStreamId id,
SpdyHeaderBlock headers,
bool fin,
- SpdyPriority priority,
+ const spdy::SpdyStreamPrecedence& precedence,
QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener) {
DCHECK(!VersionUsesQpack(connection()->transport_version()));
return WriteHeadersOnHeadersStreamImpl(
id, std::move(headers), fin,
- /* parent_stream_id = */ 0, Spdy3PriorityToHttp2Weight(priority),
+ /* parent_stream_id = */ 0,
+ Spdy3PriorityToHttp2Weight(precedence.spdy3_priority()),
/* exclusive = */ false, std::move(ack_listener));
}
@@ -644,7 +646,7 @@
void QuicSpdySession::OnHeaders(SpdyStreamId stream_id,
bool has_priority,
- SpdyPriority priority,
+ const spdy::SpdyStreamPrecedence& precedence,
bool fin) {
if (has_priority) {
if (perspective() == Perspective::IS_CLIENT) {
@@ -652,7 +654,7 @@
"Server must not send priorities.");
return;
}
- OnStreamHeadersPriority(stream_id, priority);
+ OnStreamHeadersPriority(stream_id, precedence);
} else {
if (perspective() == Perspective::IS_SERVER) {
CloseConnectionWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA,
@@ -681,13 +683,13 @@
// TODO (wangyix): Why is SpdyStreamId used instead of QuicStreamId?
// This occurs in many places in this file.
void QuicSpdySession::OnPriority(SpdyStreamId stream_id,
- SpdyPriority priority) {
+ const spdy::SpdyStreamPrecedence& precedence) {
if (perspective() == Perspective::IS_CLIENT) {
CloseConnectionWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA,
"Server must not send PRIORITY frames.");
return;
}
- OnPriorityFrame(stream_id, priority);
+ OnPriorityFrame(stream_id, precedence);
}
void QuicSpdySession::OnHeaderList(const QuicHeaderList& header_list) {
diff --git a/quic/core/http/quic_spdy_session.h b/quic/core/http/quic_spdy_session.h
index a504e9c..3fe5c66 100644
--- a/quic/core/http/quic_spdy_session.h
+++ b/quic/core/http/quic_spdy_session.h
@@ -76,8 +76,9 @@
// Called by |headers_stream_| when headers with a priority have been
// received for a stream. This method will only be called for server streams.
- virtual void OnStreamHeadersPriority(QuicStreamId stream_id,
- spdy::SpdyPriority priority);
+ virtual void OnStreamHeadersPriority(
+ QuicStreamId stream_id,
+ const spdy::SpdyStreamPrecedence& precedence);
// Called by |headers_stream_| when headers have been completely received
// for a stream. |fin| will be true if the fin flag was set in the headers
@@ -98,7 +99,7 @@
// Called by |headers_stream_| when a PRIORITY frame has been received for a
// stream. This method will only be called for server streams.
virtual void OnPriorityFrame(QuicStreamId stream_id,
- spdy::SpdyPriority priority);
+ const spdy::SpdyStreamPrecedence& precedence);
// Sends contents of |iov| to h2_deframer_, returns number of bytes processed.
size_t ProcessHeaderData(const struct iovec& iov);
@@ -111,7 +112,7 @@
QuicStreamId id,
spdy::SpdyHeaderBlock headers,
bool fin,
- spdy::SpdyPriority priority,
+ const spdy::SpdyStreamPrecedence& precedence,
QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener);
// Writes a PRIORITY frame the to peer. Returns the size in bytes of the
@@ -243,7 +244,7 @@
// Called when a HEADERS frame has been received.
void OnHeaders(spdy::SpdyStreamId stream_id,
bool has_priority,
- spdy::SpdyPriority priority,
+ const spdy::SpdyStreamPrecedence& precedence,
bool fin);
// Called when a PUSH_PROMISE frame has been received.
@@ -251,7 +252,8 @@
spdy::SpdyStreamId promised_stream_id);
// Called when a PRIORITY frame has been received.
- void OnPriority(spdy::SpdyStreamId stream_id, spdy::SpdyPriority priority);
+ void OnPriority(spdy::SpdyStreamId stream_id,
+ const spdy::SpdyStreamPrecedence& precedence);
// Called when the complete list of headers is available.
void OnHeaderList(const QuicHeaderList& header_list);
diff --git a/quic/core/http/quic_spdy_session_test.cc b/quic/core/http/quic_spdy_session_test.cc
index 2042f88..c36cdd7 100644
--- a/quic/core/http/quic_spdy_session_test.cc
+++ b/quic/core/http/quic_spdy_session_test.cc
@@ -654,7 +654,7 @@
// Now let stream 4 do the 2nd of its 3 writes, but add a block for a high
// priority stream 6. 4 should be preempted. 6 will write but *not* block so
// will cede back to 4.
- stream6->SetPriority(kV3HighestPriority);
+ stream6->SetPriority(spdy::SpdyStreamPrecedence(kV3HighestPriority));
EXPECT_CALL(*stream4, OnCanWrite())
.WillOnce(Invoke([this, stream4, stream6]() {
session_.SendLargeFakeData(stream4, 6000);
@@ -1253,14 +1253,15 @@
EXPECT_FALSE(session_.IsStreamFlowControlBlocked());
headers["header"] = QuicStrCat(random.RandUint64(), random.RandUint64(),
random.RandUint64());
- session_.WriteHeadersOnHeadersStream(stream_id, headers.Clone(), true, 0,
+ session_.WriteHeadersOnHeadersStream(stream_id, headers.Clone(), true,
+ spdy::SpdyStreamPrecedence(0),
nullptr);
stream_id += IdDelta();
}
// Write once more to ensure that the headers stream has buffered data. The
// random headers may have exactly filled the flow control window.
- session_.WriteHeadersOnHeadersStream(stream_id, std::move(headers), true, 0,
- nullptr);
+ session_.WriteHeadersOnHeadersStream(stream_id, std::move(headers), true,
+ spdy::SpdyStreamPrecedence(0), nullptr);
EXPECT_TRUE(headers_stream->HasBufferedData());
EXPECT_TRUE(headers_stream->flow_controller()->IsBlocked());
@@ -2006,8 +2007,10 @@
TEST_P(QuicSpdySessionTestServer, OnPriorityFrame) {
QuicStreamId stream_id = GetNthClientInitiatedBidirectionalId(0);
TestStream* stream = session_.CreateIncomingStream(stream_id);
- session_.OnPriorityFrame(stream_id, kV3HighestPriority);
- EXPECT_EQ(kV3HighestPriority, stream->priority());
+ session_.OnPriorityFrame(stream_id,
+ spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ EXPECT_EQ(spdy::SpdyStreamPrecedence(kV3HighestPriority),
+ stream->precedence());
}
TEST_P(QuicSpdySessionTestServer, SimplePendingStreamType) {
diff --git a/quic/core/http/quic_spdy_stream.cc b/quic/core/http/quic_spdy_stream.cc
index aee3ba5..c577225 100644
--- a/quic/core/http/quic_spdy_stream.cc
+++ b/quic/core/http/quic_spdy_stream.cc
@@ -479,9 +479,10 @@
}
}
-void QuicSpdyStream::OnStreamHeadersPriority(SpdyPriority priority) {
+void QuicSpdyStream::OnStreamHeadersPriority(
+ const spdy::SpdyStreamPrecedence& precedence) {
DCHECK_EQ(Perspective::IS_SERVER, session()->connection()->perspective());
- SetPriority(priority);
+ SetPriority(precedence);
}
void QuicSpdyStream::OnStreamHeaderList(bool fin,
@@ -623,9 +624,10 @@
}
}
-void QuicSpdyStream::OnPriorityFrame(SpdyPriority priority) {
+void QuicSpdyStream::OnPriorityFrame(
+ const spdy::SpdyStreamPrecedence& precedence) {
DCHECK_EQ(Perspective::IS_SERVER, session()->connection()->perspective());
- SetPriority(priority);
+ SetPriority(precedence);
}
void QuicSpdyStream::OnStreamReset(const QuicRstStreamFrame& frame) {
@@ -936,7 +938,7 @@
QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener) {
if (!VersionUsesQpack(transport_version())) {
return spdy_session_->WriteHeadersOnHeadersStream(
- id(), std::move(header_block), fin, priority(),
+ id(), std::move(header_block), fin, precedence(),
std::move(ack_listener));
}
@@ -976,7 +978,7 @@
}
void QuicSpdyStream::PopulatePriorityFrame(PriorityFrame* frame) {
- frame->weight = priority();
+ frame->weight = precedence().spdy3_priority();
frame->dependency_type = ROOT_OF_TREE;
frame->prioritized_type = REQUEST_STREAM;
frame->prioritized_element_id = id();
diff --git a/quic/core/http/quic_spdy_stream.h b/quic/core/http/quic_spdy_stream.h
index bdb8752..e030e93 100644
--- a/quic/core/http/quic_spdy_stream.h
+++ b/quic/core/http/quic_spdy_stream.h
@@ -78,7 +78,8 @@
// Called by the session when headers with a priority have been received
// for this stream. This method will only be called for server streams.
- virtual void OnStreamHeadersPriority(spdy::SpdyPriority priority);
+ virtual void OnStreamHeadersPriority(
+ const spdy::SpdyStreamPrecedence& precedence);
// Called by the session when decompressed headers have been completely
// delivered to this stream. If |fin| is true, then this stream
@@ -95,7 +96,7 @@
// Called by the session when a PRIORITY frame has been been received for this
// stream. This method will only be called for server streams.
- void OnPriorityFrame(spdy::SpdyPriority priority);
+ void OnPriorityFrame(const spdy::SpdyStreamPrecedence& precedence);
// Override the base class to not discard response when receiving
// QUIC_STREAM_NO_ERROR.
diff --git a/quic/core/http/quic_spdy_stream_test.cc b/quic/core/http/quic_spdy_stream_test.cc
index ddfb651..20c1b65 100644
--- a/quic/core/http/quic_spdy_stream_test.cc
+++ b/quic/core/http/quic_spdy_stream_test.cc
@@ -108,22 +108,26 @@
class TestMockUpdateStreamSession : public MockQuicSpdySession {
public:
explicit TestMockUpdateStreamSession(QuicConnection* connection)
- : MockQuicSpdySession(connection) {}
+ : MockQuicSpdySession(connection),
+ expected_precedence_(
+ spdy::SpdyStreamPrecedence(QuicStream::kDefaultPriority)) {}
- void UpdateStreamPriority(QuicStreamId id, SpdyPriority priority) override {
+ void UpdateStreamPriority(
+ QuicStreamId id,
+ const spdy::SpdyStreamPrecedence& precedence) override {
EXPECT_EQ(id, expected_stream_->id());
- EXPECT_EQ(expected_priority_, priority);
- EXPECT_EQ(expected_priority_, expected_stream_->priority());
+ EXPECT_EQ(expected_precedence_, precedence);
+ EXPECT_EQ(expected_precedence_, expected_stream_->precedence());
}
void SetExpectedStream(QuicSpdyStream* stream) { expected_stream_ = stream; }
- void SetExpectedPriority(SpdyPriority priority) {
- expected_priority_ = priority;
+ void SetExpectedPriority(const spdy::SpdyStreamPrecedence& precedence) {
+ expected_precedence_ = precedence;
}
private:
QuicSpdyStream* expected_stream_;
- SpdyPriority expected_priority_;
+ spdy::SpdyStreamPrecedence expected_precedence_;
};
class QuicSpdyStreamTest : public QuicTestWithParam<ParsedQuicVersion> {
@@ -245,7 +249,8 @@
TEST_P(QuicSpdyStreamTest, ProcessHeaderList) {
Initialize(kShouldProcessData);
- stream_->OnStreamHeadersPriority(kV3HighestPriority);
+ stream_->OnStreamHeadersPriority(
+ spdy::SpdyStreamPrecedence(kV3HighestPriority));
ProcessHeaders(false, headers_);
EXPECT_EQ("", stream_->data());
EXPECT_FALSE(stream_->header_list().empty());
@@ -256,7 +261,8 @@
Initialize(kShouldProcessData);
QuicHeaderList headers;
- stream_->OnStreamHeadersPriority(kV3HighestPriority);
+ stream_->OnStreamHeadersPriority(
+ spdy::SpdyStreamPrecedence(kV3HighestPriority));
const bool version_uses_qpack =
VersionUsesQpack(GetParam().transport_version);
@@ -288,7 +294,8 @@
headers.OnHeader(p.first, p.second);
total_bytes += p.first.size() + p.second.size();
}
- stream_->OnStreamHeadersPriority(kV3HighestPriority);
+ stream_->OnStreamHeadersPriority(
+ spdy::SpdyStreamPrecedence(kV3HighestPriority));
stream_->OnStreamHeaderList(true, total_bytes, headers);
EXPECT_EQ("", stream_->data());
EXPECT_FALSE(stream_->header_list().empty());
@@ -925,7 +932,8 @@
total_bytes += p.first.size() + p.second.size();
}
- stream_->OnStreamHeadersPriority(kV3HighestPriority);
+ stream_->OnStreamHeadersPriority(
+ spdy::SpdyStreamPrecedence(kV3HighestPriority));
stream_->OnStreamHeaderList(/*fin=*/false, total_bytes, headers);
stream_->ConsumeHeaderList();
@@ -1432,8 +1440,9 @@
TEST_P(QuicSpdyStreamTest, OnPriorityFrame) {
Initialize(kShouldProcessData);
- stream_->OnPriorityFrame(kV3HighestPriority);
- EXPECT_EQ(kV3HighestPriority, stream_->priority());
+ stream_->OnPriorityFrame(spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ EXPECT_EQ(spdy::SpdyStreamPrecedence(kV3HighestPriority),
+ stream_->precedence());
}
TEST_P(QuicSpdyStreamTest, OnPriorityFrameAfterSendingData) {
@@ -1451,8 +1460,9 @@
}
EXPECT_CALL(*session_, WritevData(_, _, 4, _, FIN));
stream_->WriteOrBufferBody("data", true);
- stream_->OnPriorityFrame(kV3HighestPriority);
- EXPECT_EQ(kV3HighestPriority, stream_->priority());
+ stream_->OnPriorityFrame(spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ EXPECT_EQ(spdy::SpdyStreamPrecedence(kV3HighestPriority),
+ stream_->precedence());
}
TEST_P(QuicSpdyStreamTest, SetPriorityBeforeUpdateStreamPriority) {
@@ -1473,11 +1483,11 @@
// if called within UpdateStreamPriority(). This expectation is enforced in
// TestMockUpdateStreamSession::UpdateStreamPriority().
session->SetExpectedStream(stream);
- session->SetExpectedPriority(kV3HighestPriority);
- stream->SetPriority(kV3HighestPriority);
+ session->SetExpectedPriority(spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ stream->SetPriority(spdy::SpdyStreamPrecedence(kV3HighestPriority));
- session->SetExpectedPriority(kV3LowestPriority);
- stream->SetPriority(kV3LowestPriority);
+ session->SetExpectedPriority(spdy::SpdyStreamPrecedence(kV3LowestPriority));
+ stream->SetPriority(spdy::SpdyStreamPrecedence(kV3LowestPriority));
}
TEST_P(QuicSpdyStreamTest, StreamWaitsForAcks) {
@@ -2155,7 +2165,8 @@
QuicStreamFrame frame(stream_->id(), false, 0, buffer.get(), length);
// TODO(lassey): Check for HTTP_WRONG_STREAM error code.
EXPECT_CALL(*connection_, CloseConnection(QUIC_HTTP_DECODER_ERROR, _, _));
- stream_->OnStreamHeadersPriority(kV3HighestPriority);
+ stream_->OnStreamHeadersPriority(
+ spdy::SpdyStreamPrecedence(kV3HighestPriority));
ProcessHeaders(false, headers_);
stream_->ConsumeHeaderList();
stream_->OnStreamFrame(frame);