mirror of
https://github.com/overte-org/overte.git
synced 2025-04-20 11:45:36 +02:00
use a specific packet type for AC child status
This commit is contained in:
parent
34f9b1881e
commit
8d38cd5670
7 changed files with 64 additions and 50 deletions
|
@ -160,23 +160,28 @@ void AssignmentClient::aboutToQuit() {
|
|||
}
|
||||
|
||||
|
||||
void AssignmentClient::setUpStatsToMonitor() {
|
||||
void AssignmentClient::setUpStatusToMonitor() {
|
||||
// send a stats packet every 1 seconds
|
||||
connect(&_statsTimerACM, &QTimer::timeout, this, &AssignmentClient::sendStatsPacketToACM);
|
||||
connect(&_statsTimerACM, &QTimer::timeout, this, &AssignmentClient::sendStatusPacketToACM);
|
||||
_statsTimerACM.start(1000);
|
||||
}
|
||||
|
||||
void AssignmentClient::sendStatsPacketToACM() {
|
||||
void AssignmentClient::sendStatusPacketToACM() {
|
||||
// tell the assignment client monitor what this assignment client is doing (if anything)
|
||||
QJsonObject statsObject;
|
||||
auto nodeList = DependencyManager::get<NodeList>();
|
||||
|
||||
auto statusPacket = NLPacket::create(PacketType::AssignmentClientStatus, 1 + NUM_BYTES_RFC4122_UUID);
|
||||
|
||||
quint8 assignmentType = Assignment::Type::AllTypes;
|
||||
|
||||
if (_currentAssignment) {
|
||||
statsObject["assignment_type"] = _currentAssignment->getTypeName();
|
||||
} else {
|
||||
statsObject["assignment_type"] = "none";
|
||||
assignmentType = _currentAssignment->getType();
|
||||
}
|
||||
nodeList->sendStats(statsObject, _assignmentClientMonitorSocket);
|
||||
|
||||
statusPacket->write(nodeList->getSessionUUID().toRfc4122());
|
||||
statusPacket->writePrimitive(assignmentType);
|
||||
|
||||
nodeList->sendPacket(statusPacket, _assignmentClientMonitorSocket);
|
||||
}
|
||||
|
||||
void AssignmentClient::sendAssignmentRequest() {
|
||||
|
|
|
@ -30,7 +30,7 @@ private slots:
|
|||
void sendAssignmentRequest();
|
||||
void assignmentCompleted();
|
||||
void handleAuthenticationRequest();
|
||||
void sendStatsPacketToACM();
|
||||
void sendStatusPacketToACM();
|
||||
void stopAssignmentClient();
|
||||
|
||||
public slots:
|
||||
|
@ -41,7 +41,7 @@ private slots:
|
|||
void handleStopNodePacket(QSharedPointer<NLPacket> packet, SharedNodePointer senderNode, HifiSockAddr senderSockAddr);
|
||||
|
||||
private:
|
||||
void setUpStatsToMonitor();
|
||||
void setUpStatusToMonitor();
|
||||
|
||||
Assignment _requestAssignment;
|
||||
QPointer<ThreadedAssignment> _currentAssignment;
|
||||
|
|
|
@ -19,14 +19,14 @@ class AssignmentClientChildData : public NodeData {
|
|||
public:
|
||||
AssignmentClientChildData(QString childType);
|
||||
|
||||
QString getChildType() { return _childType; }
|
||||
void setChildType(QString childType) { _childType = childType; }
|
||||
Assignment::Type getChildType() { return _childType; }
|
||||
void setChildType(Assignment::Type childType) { _childType = childType; }
|
||||
|
||||
// implement parseData to return 0 so we can be a subclass of NodeData
|
||||
int parseData(NLPacket& packet, QSharedPointer<Node> sendingNode) { return 0; }
|
||||
|
||||
private:
|
||||
QString _childType;
|
||||
Assignment::Type _childType;
|
||||
};
|
||||
|
||||
#endif // hifi_AssignmentClientChildData_h
|
||||
|
|
|
@ -54,8 +54,7 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen
|
|||
auto nodeList = DependencyManager::set<LimitedNodeList>();
|
||||
|
||||
auto& packetReceiver = DependencyManager::get<NodeList>()->getPacketReceiver();
|
||||
packetReceiver.registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsPacket");
|
||||
packetReceiver.registerPacketListener(PacketType::NodeJsonStats, this, "handleNodeJsonStatsUnknownNodePacket");
|
||||
packetReceiver.registerPacketListener(PacketType::AssignmentClientStatus, this, "handleChildStatusPacket");
|
||||
|
||||
// use QProcess to fork off a process for each of the child assignment clients
|
||||
for (unsigned int i = 0; i < _numAssignmentClientForks; i++) {
|
||||
|
@ -203,43 +202,53 @@ void AssignmentClientMonitor::checkSpares() {
|
|||
}
|
||||
}
|
||||
|
||||
void AssignmentClientMonitor::handleNodeJsonStatsPacket(QSharedPointer<NLPacket> packet, SharedNodePointer senderNode) {
|
||||
auto senderSockAddr = packet->getSenderSockAddr();
|
||||
void AssignmentClientMonitor::handleChildStatusPacket(QSharedPointer<NLPacket> packet) {
|
||||
QUuid senderUUID = QUuid::fromRfc4122(packet->read(NUM_BYTES_RFC4122_UUID));
|
||||
|
||||
// update our records about how to reach this child
|
||||
senderNode->setLocalSocket(senderSockAddr);
|
||||
auto nodeList = DependencyManager::get<NodeList>();
|
||||
|
||||
QVariantMap packetVariantMap = JSONBreakableMarshal::fromStringBuffer(packet->getPayload());
|
||||
QJsonObject unpackedStatsJSON = QJsonObject::fromVariantMap(packetVariantMap);
|
||||
SharedNodePointer matchingNode = nodeList->nodeWithUUID(senderUUID);
|
||||
const HifiSockAddr* senderSockAddr = packet->getSendingSockAddr();
|
||||
|
||||
// get child's assignment type out of the decoded json
|
||||
QString childType = unpackedStatsJSON["assignment_type"].toString();
|
||||
AssignmentClientChildData *childData =
|
||||
static_cast<AssignmentClientChildData*>(senderNode->getLinkedData());
|
||||
childData->setChildType(childType);
|
||||
// note when this child talked
|
||||
senderNode->setLastHeardMicrostamp(usecTimestampNow());
|
||||
}
|
||||
AssignmentClientChildData *childData = nullptr;
|
||||
|
||||
void AssignmentClientMonitor::handleNodeJsonStatsUnknownNodePacket(QSharedPointer<NLPacket> packet, SharedNodePointer senderNode) {
|
||||
auto senderSockAddr = packet->getSenderSockAddr();
|
||||
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 (!senderUUID.isNull()) {
|
||||
// We don't have this node yet - we should add it
|
||||
matchingNode = DependencyManager::get<LimitedNodeList>()->addOrUpdateNode
|
||||
(packetUUID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false);
|
||||
|
||||
childData = new AssignmentClientChildData("unknown");
|
||||
senderNode->setLinkedData(childData);
|
||||
} else {
|
||||
// tell unknown assignment-client child to exit.
|
||||
qDebug() << "Asking unknown child at" << senderSockAddr << "to exit.";
|
||||
|
||||
// The parent only expects to be talking with prorams running on this same machine.
|
||||
if (senderSockAddr.getAddress() == QHostAddress::LocalHost ||
|
||||
senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) {
|
||||
QUuid packetUUID = uuidFromPacketHeader(QByteArray::fromRawData(packet->getData(), packet->getSizeWithHeader()));
|
||||
if (!packetUUID.isNull()) {
|
||||
senderNode = DependencyManager::get<LimitedNodeList>()->addOrUpdateNode
|
||||
(packetUUID, NodeType::Unassigned, senderSockAddr, senderSockAddr, false, false);
|
||||
AssignmentClientChildData *childData = new AssignmentClientChildData("unknown");
|
||||
senderNode->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);
|
||||
|
||||
auto diePacket = NLPacket::create(PacketType::StopNode, 0);
|
||||
auto nodeList = DependencyManager::get<NodeList>();
|
||||
nodeList->sendPacket(std::move(diePacket), senderSockAddr);
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
childData = dynamic_cast<AssignmentClientChildData*>(senderNode->getLinkedData());
|
||||
}
|
||||
|
||||
if (childData) {
|
||||
// update our records about how to reach this child
|
||||
matchingNode->setLocalSocket(senderSockAddr);
|
||||
|
||||
// get child's assignment type out of the packet
|
||||
quint8 assignmentType;
|
||||
packet->readPrimitive(&assignmentType);
|
||||
|
||||
childData->setChildType((Assignment::Type) assignmentType);
|
||||
|
||||
// note when this child talked
|
||||
matchingNode->setLastHeardMicrostamp(usecTimestampNow());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,8 +37,7 @@ public:
|
|||
private slots:
|
||||
void checkSpares();
|
||||
void childProcessFinished();
|
||||
void handleNodeJsonStatsPacket(QSharedPointer<NLPacket> packet, SharedNodePointer senderNode);
|
||||
void handleNodeJsonStatsUnknownNodePacket(QSharedPointer<NLPacket> packet, SharedNodePointer senderNode);
|
||||
void handleChildStatusPacket(QSharedPointer<NLPacket> packet);
|
||||
|
||||
public slots:
|
||||
void aboutToQuit();
|
||||
|
|
|
@ -33,7 +33,8 @@ const QSet<PacketType::Value> NON_SOURCED_PACKETS = QSet<PacketType::Value>()
|
|||
<< DomainServerPathQuery << DomainServerPathResponse
|
||||
<< DomainServerAddedNode
|
||||
<< ICEServerPeerInformation << ICEServerQuery << ICEServerHeartbeat
|
||||
<< ICEPing << ICEPingReply;
|
||||
<< ICEPing << ICEPingReply
|
||||
<< AssignmentClientStatus;
|
||||
|
||||
int arithmeticCodingValueFromBuffer(const char* checkValue) {
|
||||
if (((uchar) *checkValue) < 255) {
|
||||
|
|
|
@ -57,7 +57,7 @@ namespace PacketType {
|
|||
OctreeStats,
|
||||
Jurisdiction,
|
||||
JurisdictionRequest,
|
||||
UNUSED_6,
|
||||
AssignmentClientStatus,
|
||||
UNUSED_7, // 30
|
||||
UNUSED_8,
|
||||
UNUSED_9,
|
||||
|
|
Loading…
Reference in a new issue