gfe-relnote: Add NumRegisteredStreams interface to WriteScheduler and implements it in subclasses. No used in prod yet, not protected.
Also move WriteSchedulerType to third_party/spdy/spdy_protocol.h to allow it be used by QUIC.
PiperOrigin-RevId: 259786320
Change-Id: I71fd5b68be9c10bf47f576c3020af17f80212178
diff --git a/spdy/core/http2_priority_write_scheduler.h b/spdy/core/http2_priority_write_scheduler.h
index 1f72fdb..d08d125 100644
--- a/spdy/core/http2_priority_write_scheduler.h
+++ b/spdy/core/http2_priority_write_scheduler.h
@@ -76,11 +76,9 @@
PopNextReadyStreamAndPrecedence() override;
size_t NumReadyStreams() const override;
bool IsStreamReady(StreamIdType stream_id) const override;
+ size_t NumRegisteredStreams() const override;
SpdyString DebugString() const override;
- // Return the number of streams currently in the tree.
- int num_streams() const;
-
private:
friend class test::Http2PriorityWriteSchedulerPeer<StreamIdType>;
@@ -201,11 +199,6 @@
}
template <typename StreamIdType>
-int Http2PriorityWriteScheduler<StreamIdType>::num_streams() const {
- return all_stream_infos_.size();
-}
-
-template <typename StreamIdType>
bool Http2PriorityWriteScheduler<StreamIdType>::StreamRegistered(
StreamIdType stream_id) const {
return SpdyContainsKey(all_stream_infos_, stream_id);
@@ -696,8 +689,14 @@
}
template <typename StreamIdType>
+size_t Http2PriorityWriteScheduler<StreamIdType>::NumRegisteredStreams() const {
+ return all_stream_infos_.size();
+}
+
+template <typename StreamIdType>
SpdyString Http2PriorityWriteScheduler<StreamIdType>::DebugString() const {
- return SpdyStrCat("Http2PriorityWriteScheduler {num_streams=", num_streams(),
+ return SpdyStrCat("Http2PriorityWriteScheduler {num_registered_streams=",
+ NumRegisteredStreams(),
" num_ready_streams=", NumReadyStreams(), "}");
}
@@ -757,15 +756,15 @@
}
}
- // Make sure num_streams reflects the total number of streams the map
- // contains.
- if (total_streams != num_streams()) {
+ // Make sure NumRegisteredStreams() reflects the total number of streams the
+ // map contains.
+ if (total_streams != NumRegisteredStreams()) {
SPDY_DLOG(INFO) << "Map contains incorrect number of streams.";
return false;
}
// Validate the validation function; we should have visited each stream twice
// (except for the root)
- DCHECK(streams_visited == 2 * num_streams() - 1);
+ DCHECK(streams_visited == 2 * NumRegisteredStreams() - 1);
return true;
}
diff --git a/spdy/core/http2_priority_write_scheduler_test.cc b/spdy/core/http2_priority_write_scheduler_test.cc
index 17b7721..484e59a 100644
--- a/spdy/core/http2_priority_write_scheduler_test.cc
+++ b/spdy/core/http2_priority_write_scheduler_test.cc
@@ -46,12 +46,12 @@
};
TEST_F(Http2PriorityWriteSchedulerTest, RegisterAndUnregisterStreams) {
- EXPECT_EQ(1, scheduler_.num_streams());
+ EXPECT_EQ(1u, scheduler_.NumRegisteredStreams());
EXPECT_TRUE(scheduler_.StreamRegistered(0));
EXPECT_FALSE(scheduler_.StreamRegistered(1));
scheduler_.RegisterStream(1, SpdyStreamPrecedence(0, 100, false));
- EXPECT_EQ(2, scheduler_.num_streams());
+ EXPECT_EQ(2u, scheduler_.NumRegisteredStreams());
ASSERT_TRUE(scheduler_.StreamRegistered(1));
EXPECT_EQ(100, scheduler_.GetStreamPrecedence(1).weight());
EXPECT_FALSE(scheduler_.StreamRegistered(5));
@@ -62,14 +62,14 @@
EXPECT_SPDY_BUG(
scheduler_.RegisterStream(5, SpdyStreamPrecedence(1, 50, false)),
"Stream 5 already registered");
- EXPECT_EQ(3, scheduler_.num_streams());
+ EXPECT_EQ(3u, scheduler_.NumRegisteredStreams());
EXPECT_TRUE(scheduler_.StreamRegistered(1));
ASSERT_TRUE(scheduler_.StreamRegistered(5));
EXPECT_EQ(50, scheduler_.GetStreamPrecedence(5).weight());
EXPECT_FALSE(scheduler_.StreamRegistered(13));
scheduler_.RegisterStream(13, SpdyStreamPrecedence(5, 130, true));
- EXPECT_EQ(4, scheduler_.num_streams());
+ EXPECT_EQ(4u, scheduler_.NumRegisteredStreams());
EXPECT_TRUE(scheduler_.StreamRegistered(1));
EXPECT_TRUE(scheduler_.StreamRegistered(5));
ASSERT_TRUE(scheduler_.StreamRegistered(13));
@@ -79,7 +79,7 @@
scheduler_.UnregisterStream(5);
// Cannot remove a stream that has already been removed.
EXPECT_SPDY_BUG(scheduler_.UnregisterStream(5), "Stream 5 not registered");
- EXPECT_EQ(3, scheduler_.num_streams());
+ EXPECT_EQ(3u, scheduler_.NumRegisteredStreams());
EXPECT_TRUE(scheduler_.StreamRegistered(1));
EXPECT_FALSE(scheduler_.StreamRegistered(5));
EXPECT_TRUE(scheduler_.StreamRegistered(13));
diff --git a/spdy/core/priority_write_scheduler.h b/spdy/core/priority_write_scheduler.h
index bcacb25..e438583 100644
--- a/spdy/core/priority_write_scheduler.h
+++ b/spdy/core/priority_write_scheduler.h
@@ -258,6 +258,8 @@
// Returns the number of ready streams.
size_t NumReadyStreams() const override { return num_ready_streams_; }
+ size_t NumRegisteredStreams() const override { return stream_infos_.size(); }
+
SpdyString DebugString() const override {
return SpdyStrCat(
"PriorityWriteScheduler {num_streams=", stream_infos_.size(),
diff --git a/spdy/core/priority_write_scheduler_test.cc b/spdy/core/priority_write_scheduler_test.cc
index ae348be..7488820 100644
--- a/spdy/core/priority_write_scheduler_test.cc
+++ b/spdy/core/priority_write_scheduler_test.cc
@@ -40,8 +40,10 @@
TEST_F(PriorityWriteSchedulerTest, RegisterUnregisterStreams) {
EXPECT_FALSE(scheduler_.HasReadyStreams());
EXPECT_FALSE(scheduler_.StreamRegistered(1));
+ EXPECT_EQ(0u, scheduler_.NumRegisteredStreams());
scheduler_.RegisterStream(1, SpdyStreamPrecedence(1));
EXPECT_TRUE(scheduler_.StreamRegistered(1));
+ EXPECT_EQ(1u, scheduler_.NumRegisteredStreams());
// Root stream counts as already registered.
EXPECT_SPDY_BUG(
@@ -55,12 +57,15 @@
"Stream 1 already registered");
scheduler_.RegisterStream(2, SpdyStreamPrecedence(3));
+ EXPECT_EQ(2u, scheduler_.NumRegisteredStreams());
// Verify registration != ready.
EXPECT_FALSE(scheduler_.HasReadyStreams());
scheduler_.UnregisterStream(1);
+ EXPECT_EQ(1u, scheduler_.NumRegisteredStreams());
scheduler_.UnregisterStream(2);
+ EXPECT_EQ(0u, scheduler_.NumRegisteredStreams());
// Try redundant unregistration.
EXPECT_SPDY_BUG(scheduler_.UnregisterStream(1), "Stream 1 not registered");
diff --git a/spdy/core/spdy_protocol.h b/spdy/core/spdy_protocol.h
index 92893d2..2d2ce96 100644
--- a/spdy/core/spdy_protocol.h
+++ b/spdy/core/spdy_protocol.h
@@ -196,6 +196,15 @@
ERROR_CODE_MAX = ERROR_CODE_HTTP_1_1_REQUIRED
};
+// Type of priority write scheduler.
+enum class WriteSchedulerType {
+ LIFO, // Last added stream has the highest priority.
+ SPDY, // Uses SPDY priorities described in
+ // https://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3-1#TOC-2.3.3-Stream-priority.
+ HTTP2, // Uses HTTP2 (tree-style) priority described in
+ // https://tools.ietf.org/html/rfc7540#section-5.3.
+};
+
// A SPDY priority is a number between 0 and 7 (inclusive).
typedef uint8_t SpdyPriority;
diff --git a/spdy/core/write_scheduler.h b/spdy/core/write_scheduler.h
index 7906ad7..98db442 100644
--- a/spdy/core/write_scheduler.h
+++ b/spdy/core/write_scheduler.h
@@ -150,6 +150,9 @@
// Returns true if stream with |stream_id| is ready.
virtual bool IsStreamReady(StreamIdType stream_id) const = 0;
+ // Returns the number of registered streams.
+ virtual size_t NumRegisteredStreams() const = 0;
+
// Returns summary of internal state, for logging/debugging.
virtual SpdyString DebugString() const = 0;
};