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
5353 auto addressManager = DependencyManager::set<AddressManager>();
5454 auto nodeList = DependencyManager::set<LimitedNodeList>();
5555
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");
5759
5860 // use QProcess to fork off a process for each of the child assignment clients
5961 for (unsigned int i = 0; i < _numAssignmentClientForks; i++) {
@@ -201,63 +203,37 @@ void AssignmentClientMonitor::checkSpares() { · 141 unmodified lines
201203 }
202204 }
203205
206+void AssignmentClientMonitor::handleNodeJsonStatsPacket(QSharedPointer<NLPacket> packet, SharedNodePointer senderNode) {
207+ // update our records about how to reach this child
208+ senderNode->setLocalSocket(senderSockAddr);
204209
205−void AssignmentClientMonitor::readPendingDatagrams() {
206− auto nodeList = DependencyManager::get<NodeList>();
210+ QVariantMap packetVariantMap = JSONBreakableMarshal::fromStringBuffer(packet->getPayload());
211+ QJsonObject unpackedStatsJSON = QJsonObject::fromVariantMap(packetVariantMap);
207212
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());
261220 }
262221
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.";
263234
235+ auto diePacket = NLPacket::create(PacketType::StopNode, 0);
236+ nodeList->sendPacket(std::move(diePacket), senderSockAddr);
237+ }
238+ }
239+}