mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-10 18:58:39 +02:00
Update AssignmentClientMonitor to use PacketReceiver
This commit is contained in:
parent
c86e481d4f
commit
ed3b8afbd9
2 changed files with 32 additions and 55 deletions
|
@ -53,7 +53,9 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen
|
||||||
auto addressManager = DependencyManager::set<AddressManager>();
|
auto addressManager = DependencyManager::set<AddressManager>();
|
||||||
auto nodeList = DependencyManager::set<LimitedNodeList>();
|
auto nodeList = DependencyManager::set<LimitedNodeList>();
|
||||||
|
|
||||||
connect(&nodeList->getNodeSocket(), &QUdpSocket::readyRead, this, &AssignmentClientMonitor::readPendingDatagrams);
|
auto packetReceiver = DependencyManager::get<NodeList>()->getPacketReceiver();
|
||||||
|
packetReceiver->registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsPacket");
|
||||||
|
packetReceiver->registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsUnknownNodePacket");
|
||||||
|
|
||||||
// use QProcess to fork off a process for each of the child assignment clients
|
// use QProcess to fork off a process for each of the child assignment clients
|
||||||
for (unsigned int i = 0; i < _numAssignmentClientForks; i++) {
|
for (unsigned int i = 0; i < _numAssignmentClientForks; i++) {
|
||||||
|
@ -201,63 +203,37 @@ void AssignmentClientMonitor::checkSpares() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AssignmentClientMonitor::handleNodeJsonStatsPacket(QSharedPointer<NLPacket> packet, SharedNodePointer senderNode) {
|
||||||
|
// update our records about how to reach this child
|
||||||
|
senderNode->setLocalSocket(senderSockAddr);
|
||||||
|
|
||||||
void AssignmentClientMonitor::readPendingDatagrams() {
|
QVariantMap packetVariantMap = JSONBreakableMarshal::fromStringBuffer(packet->getPayload());
|
||||||
auto nodeList = DependencyManager::get<NodeList>();
|
QJsonObject unpackedStatsJSON = QJsonObject::fromVariantMap(packetVariantMap);
|
||||||
|
|
||||||
QByteArray receivedPacket;
|
// get child's assignment type out of the decoded json
|
||||||
HifiSockAddr senderSockAddr;
|
QString childType = unpackedStatsJSON["assignment_type"].toString();
|
||||||
|
AssignmentClientChildData *childData =
|
||||||
|
static_cast<AssignmentClientChildData*>(matchingNode->getLinkedData());
|
||||||
|
childData->setChildType(childType);
|
||||||
|
// note when this child talked
|
||||||
|
matchingNode->setLastHeardMicrostamp(usecTimestampNow());
|
||||||
|
}
|
||||||
|
|
||||||
while (nodeList->getNodeSocket().hasPendingDatagrams()) {
|
void AssignmentClientMonitor::handleNodeJsonStatsUnknownNodePacket(QSharedPointer<NLPacket> packet, SharedNodePointer senderNode) {
|
||||||
receivedPacket.resize(nodeList->getNodeSocket().pendingDatagramSize());
|
// The parent only expects to be talking with prorams running on this same machine.
|
||||||
nodeList->getNodeSocket().readDatagram(receivedPacket.data(), receivedPacket.size(),
|
if (senderSockAddr.getAddress() == QHostAddress::LocalHost ||
|
||||||
senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer());
|
senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) {
|
||||||
|
if (!packetUUID.isNull()) {
|
||||||
|
matchingNode = DependencyManager::get<LimitedNodeList>()->addOrUpdateNode
|
||||||
|
(packetUUID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false);
|
||||||
|
AssignmentClientChildData *childData = new AssignmentClientChildData("unknown");
|
||||||
|
matchingNode->setLinkedData(childData);
|
||||||
|
} else {
|
||||||
|
// tell unknown assignment-client child to exit.
|
||||||
|
qDebug() << "asking unknown child to exit.";
|
||||||
|
|
||||||
if (nodeList->packetVersionAndHashMatch(receivedPacket)) {
|
auto diePacket = NLPacket::create(PacketType::StopNode, 0);
|
||||||
if (packetTypeForPacket(receivedPacket) == PacketType::NodeJsonStats) {
|
nodeList->sendPacket(std::move(diePacket), senderSockAddr);
|
||||||
QUuid packetUUID = uuidFromPacketHeader(receivedPacket);
|
|
||||||
SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket);
|
|
||||||
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 (!packetUUID.isNull()) {
|
|
||||||
matchingNode = DependencyManager::get<LimitedNodeList>()->addOrUpdateNode
|
|
||||||
(packetUUID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false);
|
|
||||||
AssignmentClientChildData *childData = new AssignmentClientChildData("unknown");
|
|
||||||
matchingNode->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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (matchingNode) {
|
|
||||||
// update our records about how to reach this child
|
|
||||||
matchingNode->setLocalSocket(senderSockAddr);
|
|
||||||
|
|
||||||
QVariantMap packetVariantMap =
|
|
||||||
JSONBreakableMarshal::fromStringBuffer(receivedPacket.mid(numBytesForPacketHeader(receivedPacket)));
|
|
||||||
QJsonObject unpackedStatsJSON = QJsonObject::fromVariantMap(packetVariantMap);
|
|
||||||
|
|
||||||
// get child's assignment type out of the decoded json
|
|
||||||
QString childType = unpackedStatsJSON["assignment_type"].toString();
|
|
||||||
AssignmentClientChildData *childData =
|
|
||||||
static_cast<AssignmentClientChildData*>(matchingNode->getLinkedData());
|
|
||||||
childData->setChildType(childType);
|
|
||||||
// note when this child talked
|
|
||||||
matchingNode->setLastHeardMicrostamp(usecTimestampNow());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// have the NodeList attempt to handle it
|
|
||||||
nodeList->processNodeData(senderSockAddr, receivedPacket);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -35,9 +35,10 @@ public:
|
||||||
|
|
||||||
void stopChildProcesses();
|
void stopChildProcesses();
|
||||||
private slots:
|
private slots:
|
||||||
void readPendingDatagrams();
|
|
||||||
void checkSpares();
|
void checkSpares();
|
||||||
void childProcessFinished();
|
void childProcessFinished();
|
||||||
|
void handleNodeJsonStatsPacket(QSharedPointer<NLPacket> packet, SharedNodePointer senderNode);
|
||||||
|
void handleNodeJsonStatsUnknownNodePacket(QSharedPointer<NLPacket> packet, SharedNodePointer senderNode);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void aboutToQuit();
|
void aboutToQuit();
|
||||||
|
|
Loading…
Reference in a new issue