From b6620f128bfdafc1f10ec5a0730ecfee727efd46 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 11 Aug 2016 11:06:36 -0700 Subject: [PATCH 1/3] Add asset server bandwidth to stats --- interface/resources/qml/Stats.qml | 6 ++++++ interface/src/ui/Stats.cpp | 3 +++ interface/src/ui/Stats.h | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/interface/resources/qml/Stats.qml b/interface/resources/qml/Stats.qml index fe88899658..180e5e1bcc 100644 --- a/interface/resources/qml/Stats.qml +++ b/interface/resources/qml/Stats.qml @@ -99,6 +99,12 @@ Item { font.pixelSize: root.fontSize text: "Mbps In/Out: " + root.mbpsIn.toFixed(2) + "/" + root.mbpsOut.toFixed(2) } + Text { + color: root.fontColor; + font.pixelSize: root.fontSize + visible: root.expanded + text: "Asset Mbps In/Out: " + root.assetMbpsIn.toFixed(2) + "/" + root.assetMbpsOut.toFixed(2) + } } } diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index ec4b2280b6..7fdf5cd57d 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -136,6 +136,9 @@ void Stats::updateStats(bool force) { STAT_UPDATE_FLOAT(mbpsIn, (float)bandwidthRecorder->getCachedTotalAverageInputKilobitsPerSecond() / 1000.0f, 0.01f); STAT_UPDATE_FLOAT(mbpsOut, (float)bandwidthRecorder->getCachedTotalAverageOutputKilobitsPerSecond() / 1000.0f, 0.01f); + STAT_UPDATE_FLOAT(assetMbpsIn, (float)bandwidthRecorder->getAverageInputKilobitsPerSecond(NodeType::AssetServer) / 1000.0f, 0.01f); + STAT_UPDATE_FLOAT(assetMbpsOut, (float)bandwidthRecorder->getAverageOutputKilobitsPerSecond(NodeType::AssetServer) / 1000.0f, 0.01f); + // Second column: ping SharedNodePointer audioMixerNode = nodeList->soloNodeOfType(NodeType::AudioMixer); SharedNodePointer avatarMixerNode = nodeList->soloNodeOfType(NodeType::AvatarMixer); diff --git a/interface/src/ui/Stats.h b/interface/src/ui/Stats.h index f6643a1a7a..4be2d88d9e 100644 --- a/interface/src/ui/Stats.h +++ b/interface/src/ui/Stats.h @@ -43,6 +43,8 @@ class Stats : public QQuickItem { STATS_PROPERTY(int, packetOutCount, 0) STATS_PROPERTY(float, mbpsIn, 0) STATS_PROPERTY(float, mbpsOut, 0) + STATS_PROPERTY(float, assetMbpsIn, 0) + STATS_PROPERTY(float, assetMbpsOut, 0) STATS_PROPERTY(int, audioPing, 0) STATS_PROPERTY(int, avatarPing, 0) STATS_PROPERTY(int, entitiesPing, 0) @@ -128,6 +130,8 @@ signals: void packetOutCountChanged(); void mbpsInChanged(); void mbpsOutChanged(); + void assetMbpsInChanged(); + void assetMbpsOutChanged(); void audioPingChanged(); void avatarPingChanged(); void entitiesPingChanged(); From 473a7e95934e6e13cddce46ba99d9348aef86407 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 11 Aug 2016 15:17:36 -0700 Subject: [PATCH 2/3] Fix bandwidth calculations not including the full size of reliable ordered messages For reliable ordered messages, we were: * only tracking bandwidth for the first few packets of a message IF a message handler opted in to receiving pending (unfinished) messages. * tracking the entire thing all at once, when the entire messages was received. --- libraries/networking/src/PacketReceiver.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index 530efc5fb3..df38a68515 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -215,6 +215,15 @@ void PacketReceiver::handleVerifiedPacket(std::unique_ptr packet) { _inPacketCount += 1; _inByteCount += nlPacket->size(); + SharedNodePointer matchingNode; + NodeType_t nodeType = NodeType::Unassigned; + if (!nlPacket->getSourceID().isNull()) { + auto nodeList = DependencyManager::get(); + matchingNode = nodeList->nodeWithUUID(nlPacket->getSourceID()); + nodeType = matchingNode->getType(); + } + emit dataReceived(nodeType, nlPacket->getPayloadSize()); + handleVerifiedMessage(receivedMessage, true); } @@ -224,6 +233,15 @@ void PacketReceiver::handleVerifiedMessagePacket(std::unique_ptr pa _inPacketCount += 1; _inByteCount += nlPacket->size(); + SharedNodePointer matchingNode; + NodeType_t nodeType = NodeType::Unassigned; + if (!nlPacket->getSourceID().isNull()) { + auto nodeList = DependencyManager::get(); + matchingNode = nodeList->nodeWithUUID(nlPacket->getSourceID()); + nodeType = matchingNode->getType(); + } + emit dataReceived(nodeType, nlPacket->getPayloadSize()); + auto key = std::pair(nlPacket->getSenderSockAddr(), nlPacket->getMessageNumber()); auto it = _pendingMessages.find(key); QSharedPointer message; @@ -294,7 +312,6 @@ void PacketReceiver::handleVerifiedMessage(QSharedPointer recei PacketType packetType = receivedMessage->getType(); if (matchingNode) { - emit dataReceived(matchingNode->getType(), receivedMessage->getSize()); matchingNode->recordBytesReceived(receivedMessage->getSize()); QMetaMethod metaMethod = listener.method; @@ -326,7 +343,6 @@ void PacketReceiver::handleVerifiedMessage(QSharedPointer recei } } else { // qDebug() << "Got verified unsourced packet list: " << QString(nlPacketList->getMessage()); - emit dataReceived(NodeType::Unassigned, receivedMessage->getSize()); // one final check on the QPointer before we invoke if (listener.object) { From b5e2913eb90bea2b1ee36bbb67dc7f94ad0b02b1 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 15 Aug 2016 09:22:56 -0700 Subject: [PATCH 3/3] Move node received bandwidth tracking to LimitedNodeList --- interface/src/Application.cpp | 2 +- libraries/networking/src/LimitedNodeList.cpp | 11 +++++++++-- libraries/networking/src/LimitedNodeList.h | 3 ++- libraries/networking/src/PacketReceiver.cpp | 18 ------------------ libraries/networking/src/PacketReceiver.h | 3 --- 5 files changed, 12 insertions(+), 25 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3d519d1790..71bb7fbb66 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -845,7 +845,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : QSharedPointer bandwidthRecorder = DependencyManager::get(); connect(nodeList.data(), &LimitedNodeList::dataSent, bandwidthRecorder.data(), &BandwidthRecorder::updateOutboundData); - connect(&nodeList->getPacketReceiver(), &PacketReceiver::dataReceived, + connect(nodeList.data(), &LimitedNodeList::dataReceived, bandwidthRecorder.data(), &BandwidthRecorder::updateInboundData); // FIXME -- I'm a little concerned about this. diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 431d372089..6d9de2dbc1 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -175,7 +175,11 @@ QUdpSocket& LimitedNodeList::getDTLSSocket() { } bool LimitedNodeList::isPacketVerified(const udt::Packet& packet) { - return packetVersionMatch(packet) && packetSourceAndHashMatch(packet); + // We track bandwidth when doing packet verification to avoid needing to do a node lookup + // later when we already do it in packetSourceAndHashMatchAndTrackBandwidth. A node lookup + // incurs a lock, so it is ideal to avoid needing to do it 2+ times for each packet + // received. + return packetVersionMatch(packet) && packetSourceAndHashMatchAndTrackBandwidth(packet); } bool LimitedNodeList::packetVersionMatch(const udt::Packet& packet) { @@ -224,11 +228,12 @@ bool LimitedNodeList::packetVersionMatch(const udt::Packet& packet) { } } -bool LimitedNodeList::packetSourceAndHashMatch(const udt::Packet& packet) { +bool LimitedNodeList::packetSourceAndHashMatchAndTrackBandwidth(const udt::Packet& packet) { PacketType headerType = NLPacket::typeInHeader(packet); if (NON_SOURCED_PACKETS.contains(headerType)) { + emit dataReceived(NodeType::Unassigned, packet.getPayloadSize()); return true; } else { QUuid sourceID = NLPacket::sourceIDInHeader(packet); @@ -260,6 +265,8 @@ bool LimitedNodeList::packetSourceAndHashMatch(const udt::Packet& packet) { // from this sending node matchingNode->setLastHeardMicrostamp(usecTimestampNow()); + emit dataReceived(matchingNode->getType(), packet.getPayloadSize()); + return true; } else { diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 48379b5e39..49a3a155a2 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -243,6 +243,7 @@ public slots: signals: void dataSent(quint8 channelType, int bytes); + void dataReceived(quint8 channelType, int bytes); // QUuid might be zero for non-sourced packet types. void packetVersionMismatch(PacketType type, const HifiSockAddr& senderSockAddr, const QUuid& senderUUID); @@ -279,7 +280,7 @@ protected: void setLocalSocket(const HifiSockAddr& sockAddr); - bool packetSourceAndHashMatch(const udt::Packet& packet); + bool packetSourceAndHashMatchAndTrackBandwidth(const udt::Packet& packet); void processSTUNResponse(std::unique_ptr packet); void handleNodeKill(const SharedNodePointer& node); diff --git a/libraries/networking/src/PacketReceiver.cpp b/libraries/networking/src/PacketReceiver.cpp index df38a68515..21ba7129d4 100644 --- a/libraries/networking/src/PacketReceiver.cpp +++ b/libraries/networking/src/PacketReceiver.cpp @@ -215,15 +215,6 @@ void PacketReceiver::handleVerifiedPacket(std::unique_ptr packet) { _inPacketCount += 1; _inByteCount += nlPacket->size(); - SharedNodePointer matchingNode; - NodeType_t nodeType = NodeType::Unassigned; - if (!nlPacket->getSourceID().isNull()) { - auto nodeList = DependencyManager::get(); - matchingNode = nodeList->nodeWithUUID(nlPacket->getSourceID()); - nodeType = matchingNode->getType(); - } - emit dataReceived(nodeType, nlPacket->getPayloadSize()); - handleVerifiedMessage(receivedMessage, true); } @@ -233,15 +224,6 @@ void PacketReceiver::handleVerifiedMessagePacket(std::unique_ptr pa _inPacketCount += 1; _inByteCount += nlPacket->size(); - SharedNodePointer matchingNode; - NodeType_t nodeType = NodeType::Unassigned; - if (!nlPacket->getSourceID().isNull()) { - auto nodeList = DependencyManager::get(); - matchingNode = nodeList->nodeWithUUID(nlPacket->getSourceID()); - nodeType = matchingNode->getType(); - } - emit dataReceived(nodeType, nlPacket->getPayloadSize()); - auto key = std::pair(nlPacket->getSenderSockAddr(), nlPacket->getMessageNumber()); auto it = _pendingMessages.find(key); QSharedPointer message; diff --git a/libraries/networking/src/PacketReceiver.h b/libraries/networking/src/PacketReceiver.h index ff4ab3e15c..4b4d260409 100644 --- a/libraries/networking/src/PacketReceiver.h +++ b/libraries/networking/src/PacketReceiver.h @@ -67,9 +67,6 @@ public: void handleVerifiedPacket(std::unique_ptr packet); void handleVerifiedMessagePacket(std::unique_ptr message); void handleMessageFailure(HifiSockAddr from, udt::Packet::MessageNumber messageNumber); - -signals: - void dataReceived(quint8 channelType, int bytes); private: struct Listener {