use a specific packet type for AC child status

This commit is contained in:
Stephen Birarda 2015-07-13 15:58:44 -07:00
parent 34f9b1881e
commit 8d38cd5670
7 changed files with 64 additions and 50 deletions

View file

@ -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() {

View file

@ -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;

View file

@ -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

View file

@ -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());
}
}

View file

@ -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();

View file

@ -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) {

View file

@ -57,7 +57,7 @@ namespace PacketType {
OctreeStats,
Jurisdiction,
JurisdictionRequest,
UNUSED_6,
AssignmentClientStatus,
UNUSED_7, // 30
UNUSED_8,
UNUSED_9,