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; };