mirror of
https://github.com/facebookincubator/mvfst.git
synced 2025-08-06 22:22:38 +03:00
Control a connections bandwidth utilization factor in QuicTransportBase (background mode)
Summary: The StreamManager monitors can now have a reference to a new observer interface QuicStreamPrioritiesObserver. If the reference is set, the observer is notified whenever streams are created, removed, or change priorities QuicTransportBase implements this observer interface. It uses the event notifications to control a connection's background mode based upon the new background mode parameters: priority level threshold, and target utilization factor. When these parameters are set, and all active streams have a priority lower than the threshold, the connection's congestion controller is set to use only the defined utilization factor of the available bandwidth. Reviewed By: bschlinker Differential Revision: D31562505 fbshipit-source-id: 9c74fa834301f745d97e851741b911795f756023
This commit is contained in:
committed by
Facebook GitHub Bot
parent
4609c8741b
commit
ea2af0fe10
@@ -19,6 +19,7 @@
|
||||
#include <quic/server/state/ServerStateMachine.h>
|
||||
#include <quic/state/DatagramHandlers.h>
|
||||
#include <quic/state/QuicStreamFunctions.h>
|
||||
#include <quic/state/QuicStreamUtilities.h>
|
||||
#include <quic/state/test/Mocks.h>
|
||||
|
||||
#include <folly/io/async/test/MockAsyncUDPSocket.h>
|
||||
@@ -3870,5 +3871,82 @@ TEST_F(QuicTransportImplTest, Cmsgs) {
|
||||
transport->appendCmsgs(cmsgs);
|
||||
}
|
||||
|
||||
TEST_F(QuicTransportImplTest, BackgroundModeChangeWithStreamChanges) {
|
||||
// Verify that background mode is correctly turned on and off
|
||||
// based upon stream creation, priority changes, stream removal.
|
||||
// For different steps try local (uni/bi)directional streams and remote
|
||||
// streams
|
||||
InSequence s;
|
||||
auto& conn = transport->getConnectionState();
|
||||
auto mockCongestionController =
|
||||
std::make_unique<NiceMock<MockCongestionController>>();
|
||||
auto rawCongestionController = mockCongestionController.get();
|
||||
conn.congestionController = std::move(mockCongestionController);
|
||||
auto& manager = *conn.streamManager;
|
||||
EXPECT_CALL(*rawCongestionController, setBandwidthUtilizationFactor(_))
|
||||
.Times(0); // Backgound params not set
|
||||
auto stream = manager.createNextUnidirectionalStream().value();
|
||||
manager.setStreamPriority(stream->id, 1, false);
|
||||
|
||||
EXPECT_CALL(*rawCongestionController, setBandwidthUtilizationFactor(0.5))
|
||||
.Times(1); // On setting the background params
|
||||
transport->setBackgroundModeParameters(1, 0.5);
|
||||
|
||||
EXPECT_CALL(*rawCongestionController, setBandwidthUtilizationFactor(0.5))
|
||||
.Times(1); // On removing a closed stream
|
||||
stream->sendState = StreamSendState::Closed;
|
||||
stream->recvState = StreamRecvState::Closed;
|
||||
manager.removeClosedStream(stream->id);
|
||||
|
||||
EXPECT_CALL(*rawCongestionController, setBandwidthUtilizationFactor(0.5))
|
||||
.Times(2); // On stream creation - create two streams - one bidirectional
|
||||
auto stream2Id = manager.createNextUnidirectionalStream().value()->id;
|
||||
auto stream3id = manager.createNextBidirectionalStream().value()->id;
|
||||
|
||||
EXPECT_CALL(*rawCongestionController, setBandwidthUtilizationFactor(1.0))
|
||||
.Times(1); // On increasing the priority of one of the streams
|
||||
manager.setStreamPriority(stream3id, 0, false);
|
||||
|
||||
EXPECT_CALL(*rawCongestionController, setBandwidthUtilizationFactor(1.0))
|
||||
.Times(1); // a new lower priority stream does not affect the utlization
|
||||
// factor
|
||||
auto streamLower = manager.createNextBidirectionalStream().value();
|
||||
|
||||
EXPECT_CALL(*rawCongestionController, setBandwidthUtilizationFactor(1.0))
|
||||
.Times(1); // On removing a closed stream
|
||||
streamLower->sendState = StreamSendState::Closed;
|
||||
streamLower->recvState = StreamRecvState::Closed;
|
||||
manager.removeClosedStream(streamLower->id);
|
||||
|
||||
EXPECT_CALL(*rawCongestionController, setBandwidthUtilizationFactor(0.5))
|
||||
.Times(1); // On removing a closed stream
|
||||
CHECK_NOTNULL(manager.getStream(stream3id))->sendState =
|
||||
StreamSendState::Closed;
|
||||
CHECK_NOTNULL(manager.getStream(stream3id))->recvState =
|
||||
StreamRecvState::Closed;
|
||||
manager.removeClosedStream(stream3id);
|
||||
|
||||
EXPECT_CALL(*rawCongestionController, setBandwidthUtilizationFactor(0.5))
|
||||
.Times(1); // On stream creation - remote stream
|
||||
auto peerStreamId = 20;
|
||||
ASSERT_TRUE(isRemoteStream(conn.nodeType, peerStreamId));
|
||||
auto stream4 = manager.getStream(peerStreamId);
|
||||
|
||||
EXPECT_CALL(*rawCongestionController, setBandwidthUtilizationFactor(1.0))
|
||||
.Times(1); // On clearing the background parameters
|
||||
transport->clearBackgroundModeParameters();
|
||||
|
||||
EXPECT_CALL(*rawCongestionController, setBandwidthUtilizationFactor(_))
|
||||
.Times(0); // Background params not set
|
||||
stream4->sendState = StreamSendState::Closed;
|
||||
stream4->recvState = StreamRecvState::Closed;
|
||||
manager.removeClosedStream(stream4->id);
|
||||
CHECK_NOTNULL(manager.getStream(stream2Id))->sendState =
|
||||
StreamSendState::Closed;
|
||||
CHECK_NOTNULL(manager.getStream(stream2Id))->recvState =
|
||||
StreamRecvState::Closed;
|
||||
manager.removeClosedStream(stream2Id);
|
||||
}
|
||||
|
||||
} // namespace test
|
||||
} // namespace quic
|
||||
|
Reference in New Issue
Block a user