From b42e005cdbc3b205e460967493fd93e438d4555b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 20 May 2014 15:28:45 -0700 Subject: [PATCH] add pending assignment purgatory for assignees --- domain-server/src/DomainServer.cpp | 48 ++++++++++++++----- domain-server/src/DomainServer.h | 3 ++ domain-server/src/PendingAssignedNodeData.cpp | 19 ++++++++ domain-server/src/PendingAssignedNodeData.h | 33 +++++++++++++ 4 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 domain-server/src/PendingAssignedNodeData.cpp create mode 100644 domain-server/src/PendingAssignedNodeData.h diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index bcce081d94..816e014c23 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -35,6 +35,7 @@ DomainServer::DomainServer(int argc, char* argv[]) : _httpsManager(NULL), _allAssignments(), _unfulfilledAssignments(), + _pendingAssignedNodes(), _isUsingDTLS(false), _oauthProviderURL(), _oauthClientID(), @@ -339,9 +340,9 @@ void DomainServer::handleConnectRequest(const QByteArray& packet, const HifiSock QUuid packetUUID = uuidFromPacketHeader(packet); // check if this connect request matches an assignment in the queue - bool isFulfilledOrUnfulfilledAssignment = _allAssignments.contains(packetUUID); + bool isAssignment = _pendingAssignedNodes.contains(packetUUID); SharedAssignmentPointer matchingQueuedAssignment = SharedAssignmentPointer(); - if (isFulfilledOrUnfulfilledAssignment) { + if (isAssignment) { matchingQueuedAssignment = matchingQueuedAssignmentForCheckIn(packetUUID, nodeType); } @@ -371,8 +372,8 @@ void DomainServer::handleConnectRequest(const QByteArray& packet, const HifiSock } } - if ((!isFulfilledOrUnfulfilledAssignment && !STATICALLY_ASSIGNED_NODES.contains(nodeType)) - || (isFulfilledOrUnfulfilledAssignment && matchingQueuedAssignment)) { + if ((!isAssignment && !STATICALLY_ASSIGNED_NODES.contains(nodeType)) + || (isAssignment && matchingQueuedAssignment)) { // this was either not a static assignment or it was and we had a matching one in the queue // create a new session UUID for this node @@ -384,8 +385,8 @@ void DomainServer::handleConnectRequest(const QByteArray& packet, const HifiSock // if this was a static assignment set the UUID, set the sendingSockAddr DomainServerNodeData* nodeData = reinterpret_cast(newNode->getLinkedData()); - if (isFulfilledOrUnfulfilledAssignment) { - nodeData->setAssignmentUUID(packetUUID); + if (isAssignment) { + nodeData->setAssignmentUUID(matchingQueuedAssignment->getUUID()); } nodeData->setSendingSockAddr(senderSockAddr); @@ -589,12 +590,21 @@ void DomainServer::readAvailableDatagrams() { // give this assignment out, either the type matches or the requestor said they will take any assignmentPacket.resize(numAssignmentPacketHeaderBytes); + // setup a copy of this assignment that will have a unique UUID, for packaging purposes + Assignment uniqueAssignment(*assignmentToDeploy.data()); + uniqueAssignment.setUUID(QUuid::createUuid()); + QDataStream assignmentStream(&assignmentPacket, QIODevice::Append); - assignmentStream << *assignmentToDeploy.data(); + assignmentStream << uniqueAssignment; nodeList->getNodeSocket().writeDatagram(assignmentPacket, senderSockAddr.getAddress(), senderSockAddr.getPort()); + + // add the information for that deployed assignment to the hash of pending assigned nodes + PendingAssignedNodeData* pendingNodeData = new PendingAssignedNodeData(assignmentToDeploy->getUUID(), + requestAssignment.getWalletUUID()); + _pendingAssignedNodes.insert(uniqueAssignment.getUUID(), pendingNodeData); } else { if (requestAssignment.getType() != Assignment::AgentType || noisyMessageTimer.elapsed() > NOISY_MESSAGE_INTERVAL_MSECS) { @@ -1069,11 +1079,25 @@ void DomainServer::nodeKilled(SharedNodePointer node) { SharedAssignmentPointer DomainServer::matchingQueuedAssignmentForCheckIn(const QUuid& checkInUUID, NodeType_t nodeType) { QQueue::iterator i = _unfulfilledAssignments.begin(); - while (i != _unfulfilledAssignments.end()) { - if (i->data()->getType() == Assignment::typeForNodeType(nodeType) && i->data()->getUUID() == checkInUUID) { - return _unfulfilledAssignments.takeAt(i - _unfulfilledAssignments.begin()); - } else { - ++i; + PendingAssignedNodeData* pendingAssigneeData = _pendingAssignedNodes.take(checkInUUID); + + if (pendingAssigneeData) { + while (i != _unfulfilledAssignments.end()) { + if (i->data()->getType() == Assignment::typeForNodeType(nodeType) + && i->data()->getUUID() == pendingAssigneeData->getAssignmentUUID()) { + // we have an unfulfilled assignment to return + qDebug() << "Assignment deployed with" << uuidStringWithoutCurlyBraces(checkInUUID) + << "matches unfulfilled assignment" + << uuidStringWithoutCurlyBraces(pendingAssigneeData->getAssignmentUUID()); + + // first clear the pending assignee data + delete pendingAssigneeData; + + // return the matching assignment + return _unfulfilledAssignments.takeAt(i - _unfulfilledAssignments.begin()); + } else { + ++i; + } } } diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index 71809d9e16..63a3afa13d 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -24,6 +24,8 @@ #include #include +#include "PendingAssignedNodeData.h" + typedef QSharedPointer SharedAssignmentPointer; class DomainServer : public QCoreApplication, public HTTPSRequestHandler { @@ -85,6 +87,7 @@ private: QHash _allAssignments; QQueue _unfulfilledAssignments; + QHash _pendingAssignedNodes; QVariantMap _argumentVariantMap; diff --git a/domain-server/src/PendingAssignedNodeData.cpp b/domain-server/src/PendingAssignedNodeData.cpp new file mode 100644 index 0000000000..21b3aa4ca4 --- /dev/null +++ b/domain-server/src/PendingAssignedNodeData.cpp @@ -0,0 +1,19 @@ +// +// PendingAssignedNodeData.cpp +// domain-server/src +// +// Created by Stephen Birarda on 2014-05-20. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "PendingAssignedNodeData.h" + +PendingAssignedNodeData::PendingAssignedNodeData(const QUuid& assignmentUUID, const QUuid& walletUUID) : + _assignmentUUID(assignmentUUID), + _walletUUID(walletUUID) +{ + +} \ No newline at end of file diff --git a/domain-server/src/PendingAssignedNodeData.h b/domain-server/src/PendingAssignedNodeData.h new file mode 100644 index 0000000000..93d99a6f8f --- /dev/null +++ b/domain-server/src/PendingAssignedNodeData.h @@ -0,0 +1,33 @@ +// +// PendingAssignedNodeData.h +// domain-server/src +// +// Created by Stephen Birarda on 2014-05-20. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_PendingAssignedNodeData_h +#define hifi_PendingAssignedNodeData_h + +#include +#include + +class PendingAssignedNodeData : public QObject { + Q_OBJECT +public: + PendingAssignedNodeData(const QUuid& assignmentUUID, const QUuid& walletUUID); + + void setAssignmentUUID(const QUuid& assignmentUUID) { _assignmentUUID = assignmentUUID; } + const QUuid& getAssignmentUUID() const { return _assignmentUUID; } + + void setWalletUUID(const QUuid& walletUUID) { _walletUUID = walletUUID; } + const QUuid& getWalletUUID() const { return _walletUUID; } +private: + QUuid _assignmentUUID; + QUuid _walletUUID; +}; + +#endif // hifi_PendingAssignedNodeData_h \ No newline at end of file