Showing the changes to assignment-client/src/AssignmentClientMonitor.cpp (1 of 2 files). Show all
Unified · Split
| @@ -53,7 +53,9 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen · 52 unmodified lines | ||
| 53 | 53 | auto addressManager = DependencyManager::set<AddressManager>(); |
| 54 | 54 | auto nodeList = DependencyManager::set<LimitedNodeList>(); |
| 55 | 55 | |
| 56 | − connect(&nodeList->getNodeSocket(), &QUdpSocket::readyRead, this, &AssignmentClientMonitor::readPendingDatagrams); | |
| 56 | + auto packetReceiver = DependencyManager::get<NodeList>()->getPacketReceiver(); | |
| 57 | + packetReceiver->registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsPacket"); | |
| 58 | + packetReceiver->registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsUnknownNodePacket"); | |
| 57 | 59 | |
| 58 | 60 | // use QProcess to fork off a process for each of the child assignment clients |
| 59 | 61 | for (unsigned int i = 0; i < _numAssignmentClientForks; i++) { |
| @@ -201,63 +203,37 @@ void AssignmentClientMonitor::checkSpares() { · 141 unmodified lines | ||
| 201 | 203 | } |
| 202 | 204 | } |
| 203 | 205 | |
| 206 | +void AssignmentClientMonitor::handleNodeJsonStatsPacket(QSharedPointer<NLPacket> packet, SharedNodePointer senderNode) { | |
| 207 | + // update our records about how to reach this child | |
| 208 | + senderNode->setLocalSocket(senderSockAddr); | |
| 204 | 209 | |
| 205 | −void AssignmentClientMonitor::readPendingDatagrams() { | |
| 206 | − auto nodeList = DependencyManager::get<NodeList>(); | |
| 210 | + QVariantMap packetVariantMap = JSONBreakableMarshal::fromStringBuffer(packet->getPayload()); | |
| 211 | + QJsonObject unpackedStatsJSON = QJsonObject::fromVariantMap(packetVariantMap); | |
| 207 | 212 | |
| 208 | − QByteArray receivedPacket; | |
| 209 | − HifiSockAddr senderSockAddr; | |
| 210 | − | |
| 211 | − while (nodeList->getNodeSocket().hasPendingDatagrams()) { | |
| 212 | − receivedPacket.resize(nodeList->getNodeSocket().pendingDatagramSize()); | |
| 213 | − nodeList->getNodeSocket().readDatagram(receivedPacket.data(), receivedPacket.size(), | |
| 214 | − senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); | |
| 215 | − | |
| 216 | − if (nodeList->packetVersionAndHashMatch(receivedPacket)) { | |
| 217 | − if (packetTypeForPacket(receivedPacket) == PacketType::NodeJsonStats) { | |
| 218 | − QUuid packetUUID = uuidFromPacketHeader(receivedPacket); | |
| 219 | − SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); | |
| 220 | − if (!matchingNode) { | |
| 221 | − // The parent only expects to be talking with prorams running on this same machine. | |
| 222 | − if (senderSockAddr.getAddress() == QHostAddress::LocalHost || | |
| 223 | − senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { | |
| 224 | − if (!packetUUID.isNull()) { | |
| 225 | − matchingNode = DependencyManager::get<LimitedNodeList>()->addOrUpdateNode | |
| 226 | − (packetUUID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false); | |
| 227 | − AssignmentClientChildData *childData = new AssignmentClientChildData("unknown"); | |
| 228 | − matchingNode->setLinkedData(childData); | |
| 229 | − } else { | |
| 230 | − // tell unknown assignment-client child to exit. | |
| 231 | − qDebug() << "asking unknown child to exit."; | |
| 232 | − | |
| 233 | − auto diePacket = NLPacket::create(PacketType::StopNode, 0); | |
| 234 | − nodeList->sendPacket(std::move(diePacket), senderSockAddr); | |
| 235 | − } | |
| 236 | − } | |
| 237 | − } | |
| 238 | − | |
| 239 | − if (matchingNode) { | |
| 240 | − // update our records about how to reach this child | |
| 241 | − matchingNode->setLocalSocket(senderSockAddr); | |
| 242 | − | |
| 243 | − QVariantMap packetVariantMap = | |
| 244 | − JSONBreakableMarshal::fromStringBuffer(receivedPacket.mid(numBytesForPacketHeader(receivedPacket))); | |
| 245 | − QJsonObject unpackedStatsJSON = QJsonObject::fromVariantMap(packetVariantMap); | |
| 246 | − | |
| 247 | − // get child's assignment type out of the decoded json | |
| 248 | − QString childType = unpackedStatsJSON["assignment_type"].toString(); | |
| 249 | − AssignmentClientChildData *childData = | |
| 250 | − static_cast<AssignmentClientChildData*>(matchingNode->getLinkedData()); | |
| 251 | − childData->setChildType(childType); | |
| 252 | − // note when this child talked | |
| 253 | − matchingNode->setLastHeardMicrostamp(usecTimestampNow()); | |
| 254 | − } | |
| 255 | − } else { | |
| 256 | − // have the NodeList attempt to handle it | |
| 257 | − nodeList->processNodeData(senderSockAddr, receivedPacket); | |
| 258 | − } | |
| 259 | − } | |
| 260 | − } | |
| 213 | + // get child's assignment type out of the decoded json | |
| 214 | + QString childType = unpackedStatsJSON["assignment_type"].toString(); | |
| 215 | + AssignmentClientChildData *childData = | |
| 216 | + static_cast<AssignmentClientChildData*>(matchingNode->getLinkedData()); | |
| 217 | + childData->setChildType(childType); | |
| 218 | + // note when this child talked | |
| 219 | + matchingNode->setLastHeardMicrostamp(usecTimestampNow()); | |
| 261 | 220 | } |
| 262 | 221 | |
| 222 | +void AssignmentClientMonitor::handleNodeJsonStatsUnknownNodePacket(QSharedPointer<NLPacket> packet, SharedNodePointer senderNode) { | |
| 223 | + // The parent only expects to be talking with prorams running on this same machine. | |
| 224 | + if (senderSockAddr.getAddress() == QHostAddress::LocalHost || | |
| 225 | + senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { | |
| 226 | + if (!packetUUID.isNull()) { | |
| 227 | + matchingNode = DependencyManager::get<LimitedNodeList>()->addOrUpdateNode | |
| 228 | + (packetUUID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false); | |
| 229 | + AssignmentClientChildData *childData = new AssignmentClientChildData("unknown"); | |
| 230 | + matchingNode->setLinkedData(childData); | |
| 231 | + } else { | |
| 232 | + // tell unknown assignment-client child to exit. | |
| 233 | + qDebug() << "asking unknown child to exit."; | |
| 263 | 234 | |
| 235 | + auto diePacket = NLPacket::create(PacketType::StopNode, 0); | |
| 236 | + nodeList->sendPacket(std::move(diePacket), senderSockAddr); | |
| 237 | + } | |
| 238 | + } | |
| 239 | +} | |