1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-11-25 15:43:13 +03:00

Remove open stream sorting.

Summary:
The idea of having a sorted deque to do this makes some sense, but it ends up extremely inefficient for workloads that churn through a lot of streams.

Mitigate this by instead tracking the open streams with a `FastSet`. For a very small number of streams this will probably be slightly less efficient, but not measurably.

Reviewed By: kvtsoy

Differential Revision: D18409885

fbshipit-source-id: 2214640682926b4b4525700df85627f6125cabe8
This commit is contained in:
Matt Joras
2019-11-18 10:27:38 -08:00
committed by Facebook Github Bot
parent 61004ba72c
commit 038b9a2d67
3 changed files with 155 additions and 79 deletions

View File

@@ -991,10 +991,16 @@ TEST_F(QuicServerStreamFunctionsTest, CreateQuicStreamServerOutOfOrder) {
StreamId outOfOrderStream2 = 49;
conn.streamManager->createStream(outOfOrderStream1).value();
EXPECT_EQ(conn.streamManager->streamCount(), 1);
EXPECT_EQ(conn.streamManager->openLocalStreams().size(), 26);
EXPECT_EQ(
conn.streamManager->openUnidirectionalLocalStreams().size() +
conn.streamManager->openBidirectionalLocalStreams().size(),
26);
conn.streamManager->createStream(outOfOrderStream2).value();
EXPECT_EQ(conn.streamManager->streamCount(), 2);
EXPECT_EQ(conn.streamManager->openLocalStreams().size(), 26);
EXPECT_EQ(
conn.streamManager->openUnidirectionalLocalStreams().size() +
conn.streamManager->openBidirectionalLocalStreams().size(),
26);
}
TEST_F(QuicStreamFunctionsTest, CreateQuicStreamClientOutOfOrder) {
@@ -1002,19 +1008,25 @@ TEST_F(QuicStreamFunctionsTest, CreateQuicStreamClientOutOfOrder) {
StreamId outOfOrderStream2 = 48;
conn.streamManager->createStream(outOfOrderStream1);
EXPECT_EQ(conn.streamManager->streamCount(), 1);
EXPECT_EQ(conn.streamManager->openLocalStreams().size(), 25);
EXPECT_EQ(
conn.streamManager->openUnidirectionalLocalStreams().size() +
conn.streamManager->openBidirectionalLocalStreams().size(),
25);
conn.streamManager->createStream(outOfOrderStream2).value();
EXPECT_EQ(conn.streamManager->streamCount(), 2);
EXPECT_EQ(conn.streamManager->openLocalStreams().size(), 25);
EXPECT_EQ(
conn.streamManager->openUnidirectionalLocalStreams().size() +
conn.streamManager->openBidirectionalLocalStreams().size(),
25);
}
TEST_F(QuicServerStreamFunctionsTest, CreateClosedServerStream) {
StreamId outOfOrderStream1 = 101;
StreamId outOfOrderStream2 = 49;
conn.streamManager->createStream(outOfOrderStream1);
conn.streamManager->openLocalStreams().erase(std::find(
conn.streamManager->openLocalStreams().begin(),
conn.streamManager->openLocalStreams().end(),
conn.streamManager->openBidirectionalLocalStreams().erase(std::find(
conn.streamManager->openBidirectionalLocalStreams().begin(),
conn.streamManager->openBidirectionalLocalStreams().end(),
outOfOrderStream2));
EXPECT_FALSE(conn.streamManager->createStream(outOfOrderStream2));
}
@@ -1023,9 +1035,9 @@ TEST_F(QuicStreamFunctionsTest, CreateClosedClientStream) {
StreamId outOfOrderStream1 = 96;
StreamId outOfOrderStream2 = 48;
conn.streamManager->createStream(outOfOrderStream1).value();
conn.streamManager->openLocalStreams().erase(std::find(
conn.streamManager->openLocalStreams().begin(),
conn.streamManager->openLocalStreams().end(),
conn.streamManager->openBidirectionalLocalStreams().erase(std::find(
conn.streamManager->openBidirectionalLocalStreams().begin(),
conn.streamManager->openBidirectionalLocalStreams().end(),
outOfOrderStream2));
EXPECT_FALSE(conn.streamManager->createStream(outOfOrderStream2));
}
@@ -1569,12 +1581,18 @@ TEST_F(QuicServerStreamFunctionsTest, ServerGetServerQuicStream) {
conn.streamManager->createStream(serverStream).value();
EXPECT_EQ(conn.streamManager->getStream(serverStream)->id, serverStream);
EXPECT_EQ(conn.streamManager->streamCount(), 1);
EXPECT_EQ(conn.streamManager->openLocalStreams().size(), 3);
EXPECT_EQ(
conn.streamManager->openUnidirectionalLocalStreams().size() +
conn.streamManager->openBidirectionalLocalStreams().size(),
3);
StreamId serverStream2 = 0x05;
EXPECT_EQ(conn.streamManager->getStream(serverStream2)->id, serverStream2);
EXPECT_EQ(conn.streamManager->streamCount(), 2);
EXPECT_EQ(conn.streamManager->openLocalStreams().size(), 3);
EXPECT_EQ(
conn.streamManager->openUnidirectionalLocalStreams().size() +
conn.streamManager->openBidirectionalLocalStreams().size(),
3);
StreamId serverStream3 = 0x0D;
EXPECT_THROW(
@@ -1586,14 +1604,20 @@ TEST_F(QuicServerStreamFunctionsTest, ServerGetBothDirections) {
conn.streamManager->createStream(serverBiStream).value();
EXPECT_EQ(conn.streamManager->getStream(serverBiStream)->id, serverBiStream);
EXPECT_EQ(conn.streamManager->streamCount(), 1);
EXPECT_EQ(conn.streamManager->openLocalStreams().size(), 3);
EXPECT_EQ(
conn.streamManager->openUnidirectionalLocalStreams().size() +
conn.streamManager->openBidirectionalLocalStreams().size(),
3);
StreamId serverUniStream = 0x0B;
conn.streamManager->createStream(serverUniStream).value();
EXPECT_EQ(
conn.streamManager->getStream(serverUniStream)->id, serverUniStream);
EXPECT_EQ(conn.streamManager->streamCount(), 2);
EXPECT_EQ(conn.streamManager->openLocalStreams().size(), 6);
EXPECT_EQ(
conn.streamManager->openUnidirectionalLocalStreams().size() +
conn.streamManager->openBidirectionalLocalStreams().size(),
6);
}
TEST_F(QuicServerStreamFunctionsTest, ServerGetCloseBothDirections) {
@@ -1626,12 +1650,18 @@ TEST_F(QuicServerStreamFunctionsTest, ServerGetServerUnidirectionalQuicStream) {
conn.streamManager->createStream(serverStream).value();
EXPECT_EQ(conn.streamManager->getStream(serverStream)->id, serverStream);
EXPECT_EQ(conn.streamManager->streamCount(), 1);
EXPECT_EQ(conn.streamManager->openLocalStreams().size(), 4);
EXPECT_EQ(
conn.streamManager->openUnidirectionalLocalStreams().size() +
conn.streamManager->openBidirectionalLocalStreams().size(),
4);
StreamId serverStream2 = 0x0B;
EXPECT_EQ(conn.streamManager->getStream(serverStream2)->id, serverStream2);
EXPECT_EQ(conn.streamManager->streamCount(), 2);
EXPECT_EQ(conn.streamManager->openLocalStreams().size(), 4);
EXPECT_EQ(
conn.streamManager->openUnidirectionalLocalStreams().size() +
conn.streamManager->openBidirectionalLocalStreams().size(),
4);
StreamId serverStream3 = 0x1F;
EXPECT_THROW(
@@ -1656,12 +1686,18 @@ TEST_F(QuicStreamFunctionsTest, ClientGetClientQuicStream) {
EXPECT_EQ(conn.streamManager->getStream(clientStream)->id, clientStream);
EXPECT_EQ(conn.streamManager->streamCount(), 1);
EXPECT_EQ(conn.streamManager->openLocalStreams().size(), 4);
EXPECT_EQ(
conn.streamManager->openUnidirectionalLocalStreams().size() +
conn.streamManager->openBidirectionalLocalStreams().size(),
4);
StreamId clientStream2 = 0x08;
EXPECT_EQ(conn.streamManager->getStream(clientStream2)->id, clientStream2);
EXPECT_EQ(conn.streamManager->streamCount(), 2);
EXPECT_EQ(conn.streamManager->openLocalStreams().size(), 4);
EXPECT_EQ(
conn.streamManager->openUnidirectionalLocalStreams().size() +
conn.streamManager->openBidirectionalLocalStreams().size(),
4);
StreamId clientStream3 = 0x10;
EXPECT_THROW(