1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-08-08 09:42:06 +03:00

Add open_streams metric

Summary: I want to have visibility in to the current count of streams. There are already callback methods onNew/onClosed, unfortunately, the latter is not called when connections are closed, so I had to fix that to prevent the metric from uncontrolled growth. I am still not positive it's correct and was thinking of hooking into QuicStreamState destructor instead.

Reviewed By: kvtsoy

Differential Revision: D56195487

fbshipit-source-id: 901bce9473327a8f7ef1bc0f70af10899784d681
This commit is contained in:
Vadim Meleshuk
2024-04-24 19:39:14 -07:00
committed by Facebook GitHub Bot
parent 688743070d
commit 16501032fa
6 changed files with 84 additions and 17 deletions

View File

@@ -387,11 +387,6 @@ void QuicTransportBase::closeImpl(
// Clear out all the streams, we don't need them any more. When the peer // Clear out all the streams, we don't need them any more. When the peer
// receives the conn close they will implicitly reset all the streams. // receives the conn close they will implicitly reset all the streams.
QUIC_STATS_FOR_EACH(
conn_->streamManager->streams().cbegin(),
conn_->streamManager->streams().cend(),
conn_->statsCallback,
onQuicStreamClosed);
conn_->streamManager->clearOpenStreams(); conn_->streamManager->clearOpenStreams();
// Clear out all the buffered datagrams // Clear out all the buffered datagrams

View File

@@ -22,6 +22,7 @@
#include <quic/state/QuicStreamUtilities.h> #include <quic/state/QuicStreamUtilities.h>
#include <quic/state/stream/StreamReceiveHandlers.h> #include <quic/state/stream/StreamReceiveHandlers.h>
#include <quic/state/stream/StreamSendHandlers.h> #include <quic/state/stream/StreamSendHandlers.h>
#include <quic/state/test/MockQuicStats.h>
#include <quic/state/test/Mocks.h> #include <quic/state/test/Mocks.h>
#include <quic/common/testutil/MockAsyncUDPSocket.h> #include <quic/common/testutil/MockAsyncUDPSocket.h>
@@ -4289,6 +4290,26 @@ TEST_P(QuicTransportImplTestBase, BackgroundModeChangeWithStreamChanges) {
manager.removeClosedStream(stream2Id); manager.removeClosedStream(stream2Id);
} }
class QuicTransportImplTestCounters : public QuicTransportImplTest {};
TEST_F(QuicTransportImplTestCounters, TransportResetClosesStreams) {
MockQuicStats quicStats;
auto transportSettings = transport->getTransportSettings();
auto& conn = transport->getConnectionState();
conn.statsCallback = &quicStats;
EXPECT_CALL(quicStats, onNewQuicStream()).Times(2);
EXPECT_CALL(quicStats, onQuicStreamClosed()).Times(2);
auto stream1 = transport->createBidirectionalStream().value();
auto stream2 = transport->createBidirectionalStream().value();
EXPECT_EQ(stream1, 1);
EXPECT_EQ(stream2, 5);
EXPECT_EQ(conn.streamManager->streamCount(), 2);
transport.reset();
}
class QuicTransportImplTestWithGroups : public QuicTransportImplTestBase {}; class QuicTransportImplTestWithGroups : public QuicTransportImplTestBase {};
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(

View File

@@ -4757,5 +4757,45 @@ TEST_F(
expectedSignal.maybeBytesToSend, congestionControlWritableBytes(*conn)); expectedSignal.maybeBytesToSend, congestionControlWritableBytes(*conn));
} }
TEST_F(
QuicTransportFunctionsTest,
onQuicStreamClosedNotCalledOnStreamClearing) {
{
auto conn = createConn();
EXPECT_CALL(*quicStats_, onNewQuicStream()).Times(1);
EXPECT_CALL(*quicStats_, onQuicStreamClosed()).Times(1);
auto stream = conn->streamManager->createNextBidirectionalStream().value();
EXPECT_EQ(stream->id, 1);
EXPECT_EQ(conn->streamManager->streamCount(), 1);
conn->streamManager->clearOpenStreams();
EXPECT_EQ(conn->streamManager->streamCount(), 0);
}
}
TEST_F(QuicTransportFunctionsTest, onQuicStreamClosedCalledOnConnClosure) {
{
auto conn = createConn();
EXPECT_CALL(*quicStats_, onNewQuicStream()).Times(1);
EXPECT_CALL(*quicStats_, onQuicStreamClosed()).Times(1);
auto stream = conn->streamManager->createNextBidirectionalStream().value();
EXPECT_EQ(stream->id, 1);
EXPECT_EQ(conn->streamManager->streamCount(), 1);
conn.reset();
}
}
TEST_F(QuicTransportFunctionsTest, onQuicStreamClosed) {
auto conn = createConn();
EXPECT_CALL(*quicStats_, onNewQuicStream()).Times(1);
EXPECT_CALL(*quicStats_, onQuicStreamClosed()).Times(1);
auto stream = conn->streamManager->createNextBidirectionalStream().value();
EXPECT_EQ(stream->id, 1);
EXPECT_EQ(conn->streamManager->streamCount(), 1);
stream->sendState = StreamSendState::Closed;
stream->recvState = StreamRecvState::Closed;
conn->streamManager->removeClosedStream(stream->id);
EXPECT_EQ(conn->streamManager->streamCount(), 0);
}
} // namespace test } // namespace test
} // namespace quic } // namespace quic

View File

@@ -89,7 +89,9 @@ struct MaxPacingRateKnobState {
}; };
struct QuicServerConnectionState : public QuicConnectionStateBase { struct QuicServerConnectionState : public QuicConnectionStateBase {
~QuicServerConnectionState() override = default; ~QuicServerConnectionState() override {
streamManager->clearOpenStreams();
}
ServerState state; ServerState state;

View File

@@ -7,6 +7,7 @@
#include <quic/state/QuicStreamManager.h> #include <quic/state/QuicStreamManager.h>
#include <quic/state/QuicStreamUtilities.h> #include <quic/state/QuicStreamUtilities.h>
#include <quic/state/QuicTransportStatsCallback.h>
#include <quic/state/StateData.h> #include <quic/state/StateData.h>
namespace quic { namespace quic {
@@ -779,4 +780,22 @@ void QuicStreamManager::addToStreamPriorityMap(
notifyStreamPriorityChanges(); notifyStreamPriorityChanges();
} }
void QuicStreamManager::clearOpenStreams() {
QUIC_STATS_FOR_EACH(
streams().cbegin(),
streams().cend(),
conn_.statsCallback,
onQuicStreamClosed);
openBidirectionalLocalStreams_.clear();
openUnidirectionalLocalStreams_.clear();
openBidirectionalPeerStreams_.clear();
openUnidirectionalPeerStreams_.clear();
openBidirectionalLocalStreamGroups_.clear();
openUnidirectionalLocalStreamGroups_.clear();
peerUnidirectionalStreamGroupsSeen_.clear();
peerBidirectionalStreamGroupsSeen_.clear();
streams_.clear();
}
} // namespace quic } // namespace quic

View File

@@ -406,17 +406,7 @@ class QuicStreamManager {
/* /*
* Clear all the currently open streams. * Clear all the currently open streams.
*/ */
void clearOpenStreams() { void clearOpenStreams();
openBidirectionalLocalStreams_.clear();
openUnidirectionalLocalStreams_.clear();
openBidirectionalPeerStreams_.clear();
openUnidirectionalPeerStreams_.clear();
openBidirectionalLocalStreamGroups_.clear();
openUnidirectionalLocalStreamGroups_.clear();
peerUnidirectionalStreamGroupsSeen_.clear();
peerBidirectionalStreamGroupsSeen_.clear();
streams_.clear();
}
/* /*
* Return a const reference to the underlying container holding the stream * Return a const reference to the underlying container holding the stream