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 | auto addressManager = DependencyManager::set<AddressManager>(); | 53 | auto addressManager = DependencyManager::set<AddressManager>(); |
| 54 | auto nodeList = DependencyManager::set<LimitedNodeList>(); | 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 | // use QProcess to fork off a process for each of the child assignment clients | 60 | // use QProcess to fork off a process for each of the child assignment clients |
| 59 | for (unsigned int i = 0; i < _numAssignmentClientForks; i++) { | 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() { | 210 | QVariantMap packetVariantMap = JSONBreakableMarshal::fromStringBuffer(packet->getPayload()); |
| 206 | auto nodeList = DependencyManager::get<NodeList>(); | 211 | QJsonObject unpackedStatsJSON = QJsonObject::fromVariantMap(packetVariantMap); |
| 207 | 212 | ||
| 208 | QByteArray receivedPacket; | 213 | // get child's assignment type out of the decoded json |
| 209 | HifiSockAddr senderSockAddr; | 214 | QString childType = unpackedStatsJSON["assignment_type"].toString(); |
| 210 | 215 | AssignmentClientChildData *childData = | |
| 211 | while (nodeList->getNodeSocket().hasPendingDatagrams()) { | 216 | static_cast<AssignmentClientChildData*>(matchingNode->getLinkedData()); |
| 212 | receivedPacket.resize(nodeList->getNodeSocket().pendingDatagramSize()); | 217 | childData->setChildType(childType); |
| 213 | nodeList->getNodeSocket().readDatagram(receivedPacket.data(), receivedPacket.size(), | 218 | // note when this child talked |
| 214 | senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer()); | 219 | matchingNode->setLastHeardMicrostamp(usecTimestampNow()); |
| 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 | } | ||
| 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 | } | ||