From 8d38cd567091f8290334cb516f5e77e857ba0e39 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 13 Jul 2015 15:58:44 -0700 Subject: [PATCH] use a specific packet type for AC child status --- assignment-client/src/AssignmentClient.cpp | 21 ++++-- assignment-client/src/AssignmentClient.h | 4 +- .../src/AssignmentClientChildData.h | 6 +- .../src/AssignmentClientMonitor.cpp | 75 +++++++++++-------- .../src/AssignmentClientMonitor.h | 3 +- libraries/networking/src/PacketHeaders.cpp | 3 +- libraries/networking/src/PacketHeaders.h | 2 +- 7 files changed, 64 insertions(+), 50 deletions(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index e6934e8b1b..2f5dacc52a 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -160,23 +160,28 @@ void AssignmentClient::aboutToQuit() { } -void AssignmentClient::setUpStatsToMonitor() { +void AssignmentClient::setUpStatusToMonitor() { // send a stats packet every 1 seconds - connect(&_statsTimerACM, &QTimer::timeout, this, &AssignmentClient::sendStatsPacketToACM); + connect(&_statsTimerACM, &QTimer::timeout, this, &AssignmentClient::sendStatusPacketToACM); _statsTimerACM.start(1000); } -void AssignmentClient::sendStatsPacketToACM() { +void AssignmentClient::sendStatusPacketToACM() { // tell the assignment client monitor what this assignment client is doing (if anything) - QJsonObject statsObject; auto nodeList = DependencyManager::get(); + auto statusPacket = NLPacket::create(PacketType::AssignmentClientStatus, 1 + NUM_BYTES_RFC4122_UUID); + + quint8 assignmentType = Assignment::Type::AllTypes; + if (_currentAssignment) { - statsObject["assignment_type"] = _currentAssignment->getTypeName(); - } else { - statsObject["assignment_type"] = "none"; + assignmentType = _currentAssignment->getType(); } - nodeList->sendStats(statsObject, _assignmentClientMonitorSocket); + + statusPacket->write(nodeList->getSessionUUID().toRfc4122()); + statusPacket->writePrimitive(assignmentType); + + nodeList->sendPacket(statusPacket, _assignmentClientMonitorSocket); } void AssignmentClient::sendAssignmentRequest() { diff --git a/assignment-client/src/AssignmentClient.h b/assignment-client/src/AssignmentClient.h index 268683fa3c..23e28968ed 100644 --- a/assignment-client/src/AssignmentClient.h +++ b/assignment-client/src/AssignmentClient.h @@ -30,7 +30,7 @@ private slots: void sendAssignmentRequest(); void assignmentCompleted(); void handleAuthenticationRequest(); - void sendStatsPacketToACM(); + void sendStatusPacketToACM(); void stopAssignmentClient(); public slots: @@ -41,7 +41,7 @@ private slots: void handleStopNodePacket(QSharedPointer packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr); private: - void setUpStatsToMonitor(); + void setUpStatusToMonitor(); Assignment _requestAssignment; QPointer _currentAssignment; diff --git a/assignment-client/src/AssignmentClientChildData.h b/assignment-client/src/AssignmentClientChildData.h index c8116a9959..77d8bd7e31 100644 --- a/assignment-client/src/AssignmentClientChildData.h +++ b/assignment-client/src/AssignmentClientChildData.h @@ -19,14 +19,14 @@ class AssignmentClientChildData : public NodeData { public: AssignmentClientChildData(QString childType); - QString getChildType() { return _childType; } - void setChildType(QString childType) { _childType = childType; } + Assignment::Type getChildType() { return _childType; } + void setChildType(Assignment::Type childType) { _childType = childType; } // implement parseData to return 0 so we can be a subclass of NodeData int parseData(NLPacket& packet, QSharedPointer sendingNode) { return 0; } private: - QString _childType; + Assignment::Type _childType; }; #endif // hifi_AssignmentClientChildData_h diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 5498322f58..6cc1577dea 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -54,8 +54,7 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen auto nodeList = DependencyManager::set(); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); - packetReceiver.registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsPacket"); - packetReceiver.registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsUnknownNodePacket"); + packetReceiver.registerPacketListener(PacketType::AssignmentClientStatus, this, "handleChildStatusPacket"); // use QProcess to fork off a process for each of the child assignment clients for (unsigned int i = 0; i < _numAssignmentClientForks; i++) { @@ -203,43 +202,53 @@ void AssignmentClientMonitor::checkSpares() { } } -void AssignmentClientMonitor::handleNodeJsonStatsPacket(QSharedPointer packet, SharedNodePointer senderNode) { - auto senderSockAddr = packet->getSenderSockAddr(); +void AssignmentClientMonitor::handleChildStatusPacket(QSharedPointer packet) { + QUuid senderUUID = QUuid::fromRfc4122(packet->read(NUM_BYTES_RFC4122_UUID)); - // update our records about how to reach this child - senderNode->setLocalSocket(senderSockAddr); + auto nodeList = DependencyManager::get(); - QVariantMap packetVariantMap = JSONBreakableMarshal::fromStringBuffer(packet->getPayload()); - QJsonObject unpackedStatsJSON = QJsonObject::fromVariantMap(packetVariantMap); + SharedNodePointer matchingNode = nodeList->nodeWithUUID(senderUUID); + const HifiSockAddr* senderSockAddr = packet->getSendingSockAddr(); - // get child's assignment type out of the decoded json - QString childType = unpackedStatsJSON["assignment_type"].toString(); - AssignmentClientChildData *childData = - static_cast(senderNode->getLinkedData()); - childData->setChildType(childType); - // note when this child talked - senderNode->setLastHeardMicrostamp(usecTimestampNow()); -} + AssignmentClientChildData *childData = nullptr; -void AssignmentClientMonitor::handleNodeJsonStatsUnknownNodePacket(QSharedPointer packet, SharedNodePointer senderNode) { - auto senderSockAddr = packet->getSenderSockAddr(); + if (!matchingNode) { + // The parent only expects to be talking with prorams running on this same machine. + if (senderSockAddr.getAddress() == QHostAddress::LocalHost || + senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { + + if (!senderUUID.isNull()) { + // We don't have this node yet - we should add it + matchingNode = DependencyManager::get()->addOrUpdateNode + (packetUUID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false); + + childData = new AssignmentClientChildData("unknown"); + senderNode->setLinkedData(childData); + } else { + // tell unknown assignment-client child to exit. + qDebug() << "Asking unknown child at" << senderSockAddr << "to exit."; - // The parent only expects to be talking with prorams running on this same machine. - if (senderSockAddr.getAddress() == QHostAddress::LocalHost || - senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { - QUuid packetUUID = uuidFromPacketHeader(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader())); - if (!packetUUID.isNull()) { - senderNode = DependencyManager::get()->addOrUpdateNode - (packetUUID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false); - AssignmentClientChildData *childData = new AssignmentClientChildData("unknown"); - senderNode->setLinkedData(childData); - } else { - // tell unknown assignment-client child to exit. - qDebug() << "asking unknown child to exit."; + auto diePacket = NLPacket::create(PacketType::StopNode, 0); + nodeList->sendPacket(std::move(diePacket), senderSockAddr); - auto diePacket = NLPacket::create(PacketType::StopNode, 0); - auto nodeList = DependencyManager::get(); - nodeList->sendPacket(std::move(diePacket), senderSockAddr); + return; + } } + } else { + childData = dynamic_cast(senderNode->getLinkedData()); + } + + if (childData) { + // update our records about how to reach this child + matchingNode->setLocalSocket(senderSockAddr); + + // get child's assignment type out of the packet + quint8 assignmentType; + packet->readPrimitive(&assignmentType); + + childData->setChildType((Assignment::Type) assignmentType); + + // note when this child talked + matchingNode->setLastHeardMicrostamp(usecTimestampNow()); } } diff --git a/assignment-client/src/AssignmentClientMonitor.h b/assignment-client/src/AssignmentClientMonitor.h index 0c2b958f5c..895e0defb2 100644 --- a/assignment-client/src/AssignmentClientMonitor.h +++ b/assignment-client/src/AssignmentClientMonitor.h @@ -37,8 +37,7 @@ public: private slots: void checkSpares(); void childProcessFinished(); - void handleNodeJsonStatsPacket(QSharedPointer packet, SharedNodePointer senderNode); - void handleNodeJsonStatsUnknownNodePacket(QSharedPointer packet, SharedNodePointer senderNode); + void handleChildStatusPacket(QSharedPointer packet); public slots: void aboutToQuit(); diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 6fdd421ea0..cb5f1c312d 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -33,7 +33,8 @@ const QSet NON_SOURCED_PACKETS = QSet() << DomainServerPathQuery << DomainServerPathResponse << DomainServerAddedNode << ICEServerPeerInformation << ICEServerQuery << ICEServerHeartbeat - << ICEPing << ICEPingReply; + << ICEPing << ICEPingReply + << AssignmentClientStatus; int arithmeticCodingValueFromBuffer(const char* checkValue) { if (((uchar) *checkValue) < 255) { diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 2f7eac3a63..bc7f0fe3df 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -57,7 +57,7 @@ namespace PacketType { OctreeStats, Jurisdiction, JurisdictionRequest, - UNUSED_6, + AssignmentClientStatus, UNUSED_7, // 30 UNUSED_8, UNUSED_9,