History

Update AssignmentClientMonitor to use PacketReceiver

Ryan Huffman committed 11 years ago

Commit ed3b8af1 parent c86e4812 files · +34 −57Browse files

Showing the changes to assignment-client/src/AssignmentClientMonitor.cpp (1 of 2 files). Show all

Unified · Split

assignment-client/src/AssignmentClientMonitor.cpp+32−56
@@ -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 clients60 // 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
206void AssignmentClientMonitor::handleNodeJsonStatsPacket(QSharedPointer<NLPacket> packet, SharedNodePointer senderNode) {
207 // update our records about how to reach this child
208 senderNode->setLocalSocket(senderSockAddr);
204 209
205void 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
222void 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}