From 0cb9bec1aa372322bfb74d672bf1b5bfbe959bb5 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 27 Mar 2014 19:29:18 -0700 Subject: [PATCH 01/70] keep SharedNodePointer in the OctreeSendThread --- .../src/octree/OctreeSendThread.cpp | 22 +++++-------------- .../src/octree/OctreeSendThread.h | 1 + 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 4105b21eb8..6ee7904c55 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -21,6 +21,7 @@ quint64 endSceneSleepTime = 0; OctreeSendThread::OctreeSendThread(OctreeServer* myServer, SharedNodePointer node) : _myServer(myServer), + _node(node), _nodeUUID(node->getUUID()), _packetData(), _nodeMissingCount(0), @@ -45,6 +46,7 @@ OctreeSendThread::~OctreeSendThread() { qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client disconnected " "- ending sending thread [" << this << "]"; OctreeServer::clientDisconnected(); + _node.clear(); } void OctreeSendThread::setIsShuttingDown() { @@ -74,28 +76,14 @@ bool OctreeSendThread::process() { // don't do any send processing until the initial load of the octree is complete... if (_myServer->isInitialLoadComplete()) { - SharedNodePointer node = NodeList::getInstance()->nodeWithUUID(_nodeUUID, false); - if (node) { + if (!_node.isNull()) { _nodeMissingCount = 0; - OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); + OctreeQueryNode* nodeData = static_cast(_node->getLinkedData()); // Sometimes the node data has not yet been linked, in which case we can't really do anything if (nodeData && !nodeData->isShuttingDown()) { bool viewFrustumChanged = nodeData->updateCurrentViewFrustum(); - packetDistributor(node, nodeData, viewFrustumChanged); - } - } else { - _nodeMissingCount++; - const int MANY_FAILED_LOCKS = 1; - if (_nodeMissingCount >= MANY_FAILED_LOCKS) { - - QString safeServerName("Octree"); - if (_myServer) { - safeServerName = _myServer->getMyServerName(); - } - - qDebug() << qPrintable(safeServerName) << "server: sending thread [" << this << "]" - << "failed to get nodeWithUUID() " << _nodeUUID <<". Failed:" << _nodeMissingCount << "times"; + packetDistributor(_node, nodeData, viewFrustumChanged); } } } diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index 4b1b6d8c92..ef968707f9 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -39,6 +39,7 @@ protected: private: OctreeServer* _myServer; + SharedNodePointer _node; QUuid _nodeUUID; int handlePacketSend(const SharedNodePointer& node, OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent); From 8856a609a4436b55c449708d6031287e97669a7f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 28 Mar 2014 09:46:23 -0700 Subject: [PATCH 02/70] first cut at migrating to SharedOctreeServerPointer for ref count management of OctreeServer --- .../src/octree/OctreeQueryNode.cpp | 2 +- .../src/octree/OctreeQueryNode.h | 3 +- .../src/octree/OctreeSendThread.cpp | 41 ++++++++++--------- .../src/octree/OctreeSendThread.h | 9 ++-- assignment-client/src/octree/OctreeServer.cpp | 13 ++++-- assignment-client/src/octree/OctreeServer.h | 6 ++- 6 files changed, 43 insertions(+), 31 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 984ce42631..ab7b2f65fd 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -76,7 +76,7 @@ void OctreeQueryNode::deleteLater() { } -void OctreeQueryNode::initializeOctreeSendThread(OctreeServer* octreeServer, SharedNodePointer node) { +void OctreeQueryNode::initializeOctreeSendThread(const SharedOctreeServerPointer& octreeServer, SharedNodePointer node) { // Create octree sending thread... _octreeSendThread = new OctreeSendThread(octreeServer, node); _octreeSendThread->initialize(true); diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index 17d6f6337c..ace1235908 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -21,6 +21,7 @@ class OctreeSendThread; class OctreeServer; +typedef QSharedPointer SharedOctreeServerPointer; class OctreeQueryNode : public OctreeQuery { Q_OBJECT @@ -83,7 +84,7 @@ public: OctreeSceneStats stats; - void initializeOctreeSendThread(OctreeServer* octreeServer, SharedNodePointer node); + void initializeOctreeSendThread(const SharedOctreeServerPointer& octreeServer, SharedNodePointer node); bool isOctreeSendThreadInitalized() { return _octreeSendThread; } void dumpOutOfView(); diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 6ee7904c55..ef115167af 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -19,7 +19,7 @@ quint64 startSceneSleepTime = 0; quint64 endSceneSleepTime = 0; -OctreeSendThread::OctreeSendThread(OctreeServer* myServer, SharedNodePointer node) : +OctreeSendThread::OctreeSendThread(const SharedOctreeServerPointer& myServer, SharedNodePointer node) : _myServer(myServer), _node(node), _nodeUUID(node->getUUID()), @@ -29,7 +29,7 @@ OctreeSendThread::OctreeSendThread(OctreeServer* myServer, SharedNodePointer nod _isShuttingDown(false) { QString safeServerName("Octree"); - if (_myServer) { + if (!_myServer.isNull()) { safeServerName = _myServer->getMyServerName(); } qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client connected " @@ -40,7 +40,7 @@ OctreeSendThread::OctreeSendThread(OctreeServer* myServer, SharedNodePointer nod OctreeSendThread::~OctreeSendThread() { QString safeServerName("Octree"); - if (_myServer) { + if (!_myServer.isNull()) { safeServerName = _myServer->getMyServerName(); } qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client disconnected " @@ -63,6 +63,11 @@ bool OctreeSendThread::process() { return false; // exit early if we're shutting down } + // check that our WeakPointer to our server is still valid + if (_myServer.isNull()) { + return false; // exit early if it's not, it means the server is shutting down + } + OctreeServer::didProcess(this); float lockWaitElapsedUsec = OctreeServer::SKIP_TIME; @@ -83,7 +88,7 @@ bool OctreeSendThread::process() { // Sometimes the node data has not yet been linked, in which case we can't really do anything if (nodeData && !nodeData->isShuttingDown()) { bool viewFrustumChanged = nodeData->updateCurrentViewFrustum(); - packetDistributor(_node, nodeData, viewFrustumChanged); + packetDistributor(nodeData, viewFrustumChanged); } } } @@ -119,8 +124,7 @@ quint64 OctreeSendThread::_totalBytes = 0; quint64 OctreeSendThread::_totalWastedBytes = 0; quint64 OctreeSendThread::_totalPackets = 0; -int OctreeSendThread::handlePacketSend(const SharedNodePointer& node, - OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent) { +int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent) { OctreeServer::didHandlePacketSend(this); @@ -180,12 +184,12 @@ int OctreeSendThread::handlePacketSend(const SharedNodePointer& node, // actually send it OctreeServer::didCallWriteDatagram(this); - NodeList::getInstance()->writeDatagram((char*) statsMessage, statsMessageLength, SharedNodePointer(node)); + NodeList::getInstance()->writeDatagram((char*) statsMessage, statsMessageLength, _node); packetSent = true; } else { // not enough room in the packet, send two packets OctreeServer::didCallWriteDatagram(this); - NodeList::getInstance()->writeDatagram((char*) statsMessage, statsMessageLength, SharedNodePointer(node)); + NodeList::getInstance()->writeDatagram((char*) statsMessage, statsMessageLength, _node); // since a stats message is only included on end of scene, don't consider any of these bytes "wasted", since // there was nothing else to send. @@ -204,8 +208,7 @@ int OctreeSendThread::handlePacketSend(const SharedNodePointer& node, packetsSent++; OctreeServer::didCallWriteDatagram(this); - NodeList::getInstance()->writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), - SharedNodePointer(node)); + NodeList::getInstance()->writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), _node); packetSent = true; @@ -225,8 +228,7 @@ int OctreeSendThread::handlePacketSend(const SharedNodePointer& node, if (nodeData->isPacketWaiting() && !nodeData->isShuttingDown()) { // just send the voxel packet OctreeServer::didCallWriteDatagram(this); - NodeList::getInstance()->writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), - SharedNodePointer(node)); + NodeList::getInstance()->writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), _node); packetSent = true; int thisWastedBytes = MAX_PACKET_SIZE - nodeData->getPacketLength(); @@ -253,7 +255,8 @@ int OctreeSendThread::handlePacketSend(const SharedNodePointer& node, } /// Version of voxel distributor that sends the deepest LOD level at once -int OctreeSendThread::packetDistributor(const SharedNodePointer& node, OctreeQueryNode* nodeData, bool viewFrustumChanged) { +int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrustumChanged) { + OctreeServer::didPacketDistributor(this); // if shutting down, exit early @@ -283,7 +286,7 @@ int OctreeSendThread::packetDistributor(const SharedNodePointer& node, OctreeQue // then let's just send that waiting packet. if (!nodeData->getCurrentPacketFormatMatches()) { if (nodeData->isPacketWaiting()) { - packetsSentThisInterval += handlePacketSend(node, nodeData, trueBytesSent, truePacketsSent); + packetsSentThisInterval += handlePacketSend(nodeData, trueBytesSent, truePacketsSent); } else { nodeData->resetOctreePacket(); } @@ -324,7 +327,7 @@ int OctreeSendThread::packetDistributor(const SharedNodePointer& node, OctreeQue //unsigned long encodeTime = nodeData->stats.getTotalEncodeTime(); //unsigned long elapsedTime = nodeData->stats.getElapsedTime(); - int packetsJustSent = handlePacketSend(node, nodeData, trueBytesSent, truePacketsSent); + int packetsJustSent = handlePacketSend(nodeData, trueBytesSent, truePacketsSent); packetsSentThisInterval += packetsJustSent; // If we're starting a full scene, then definitely we want to empty the nodeBag @@ -475,7 +478,7 @@ int OctreeSendThread::packetDistributor(const SharedNodePointer& node, OctreeQue if (writtenSize > nodeData->getAvailable()) { - packetsSentThisInterval += handlePacketSend(node, nodeData, trueBytesSent, truePacketsSent); + packetsSentThisInterval += handlePacketSend(nodeData, trueBytesSent, truePacketsSent); } nodeData->writeToPacket(_packetData.getFinalizedData(), _packetData.getFinalizedSize()); @@ -497,7 +500,7 @@ int OctreeSendThread::packetDistributor(const SharedNodePointer& node, OctreeQue int targetSize = MAX_OCTREE_PACKET_DATA_SIZE; if (sendNow) { quint64 packetSendingStart = usecTimestampNow(); - packetsSentThisInterval += handlePacketSend(node, nodeData, trueBytesSent, truePacketsSent); + packetsSentThisInterval += handlePacketSend(nodeData, trueBytesSent, truePacketsSent); quint64 packetSendingEnd = usecTimestampNow(); packetSendingElapsedUsec = (float)(packetSendingEnd - packetSendingStart); @@ -530,8 +533,8 @@ int OctreeSendThread::packetDistributor(const SharedNodePointer& node, OctreeQue // Here's where we can/should allow the server to send other data... // send the environment packet // TODO: should we turn this into a while loop to better handle sending multiple special packets - if (_myServer->hasSpecialPacketToSend(node) && !nodeData->isShuttingDown()) { - trueBytesSent += _myServer->sendSpecialPacket(node); + if (_myServer->hasSpecialPacketToSend(_node) && !nodeData->isShuttingDown()) { + trueBytesSent += _myServer->sendSpecialPacket(_node); truePacketsSent++; packetsSentThisInterval++; } diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index ef968707f9..bcaa9baf0e 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -16,12 +16,11 @@ #include "OctreeQueryNode.h" #include "OctreeServer.h" - /// Threaded processor for sending voxel packets to a single client class OctreeSendThread : public GenericThread { Q_OBJECT public: - OctreeSendThread(OctreeServer* myServer, SharedNodePointer node); + OctreeSendThread(const SharedOctreeServerPointer& myServer, SharedNodePointer node); virtual ~OctreeSendThread(); void setIsShuttingDown(); @@ -38,12 +37,12 @@ protected: virtual bool process(); private: - OctreeServer* _myServer; + SharedOctreeServerPointer _myServer; SharedNodePointer _node; QUuid _nodeUUID; - int handlePacketSend(const SharedNodePointer& node, OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent); - int packetDistributor(const SharedNodePointer& node, OctreeQueryNode* nodeData, bool viewFrustumChanged); + int handlePacketSend(OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent); + int packetDistributor(OctreeQueryNode* nodeData, bool viewFrustumChanged); OctreePacketData _packetData; diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index fd3f9e6cb7..d711215643 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -19,7 +19,7 @@ #include "OctreeServer.h" #include "OctreeServerConsts.h" -OctreeServer* OctreeServer::_instance = NULL; +SharedOctreeServerPointer OctreeServer::_instance; int OctreeServer::_clientCount = 0; const int MOVING_AVERAGE_SAMPLE_COUNTS = 1000000; @@ -203,7 +203,7 @@ void OctreeServer::trackProcessWaitTime(float time) { } void OctreeServer::attachQueryNodeToNode(Node* newNode) { - if (!newNode->getLinkedData()) { + if (!newNode->getLinkedData() && !_instance.isNull()) { OctreeQueryNode* newQueryNodeData = _instance->createOctreeQueryNode(); newQueryNodeData->init(); newNode->setLinkedData(newQueryNodeData); @@ -231,7 +231,8 @@ OctreeServer::OctreeServer(const QByteArray& packet) : _started(time(0)), _startedUSecs(usecTimestampNow()) { - _instance = this; + assert(_instance.isNull()); // you should only ever have one instance at a time! + _instance = SharedOctreeServerPointer(this); _averageLoopTime.updateAverage(0); qDebug() << "Octree server starting... [" << this << "]"; } @@ -835,7 +836,8 @@ void OctreeServer::readPendingDatagrams() { if (debug) { qDebug() << "calling initializeOctreeSendThread()... node:" << *matchingNode; } - nodeData->initializeOctreeSendThread(this, matchingNode); + SharedOctreeServerPointer myServer(this); + nodeData->initializeOctreeSendThread(myServer, matchingNode); } } } else if (packetType == PacketTypeJurisdictionRequest) { @@ -1058,6 +1060,9 @@ void OctreeServer::aboutToFinish() { nodeKilled(node); } qDebug() << qPrintable(_safeServerName) << "server ENDING about to finish..."; + + // release our reference to the instance, this will allow the shared pointers to properly unwind + _instance.clear(); } QString OctreeServer::getUptime() { diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 63d43b6634..5cf5fda59f 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -26,6 +27,9 @@ const int DEFAULT_PACKETS_PER_INTERVAL = 2000; // some 120,000 packets per second total +class OctreeServer; +typedef QSharedPointer SharedOctreeServerPointer; + /// Handles assignments of type OctreeServer - sending octrees to various clients. class OctreeServer : public ThreadedAssignment, public HTTPRequestHandler { Q_OBJECT @@ -154,7 +158,7 @@ protected: OctreeInboundPacketProcessor* _octreeInboundPacketProcessor; OctreePersistThread* _persistThread; - static OctreeServer* _instance; + static SharedOctreeServerPointer _instance; time_t _started; quint64 _startedUSecs; From ce6af9ecb84a5dd63580fd4f69718f04a48b5521 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 28 Mar 2014 11:04:27 -0700 Subject: [PATCH 03/70] added debug destructor to persist thread --- libraries/octree/src/OctreePersistThread.cpp | 4 ++++ libraries/octree/src/OctreePersistThread.h | 1 + 2 files changed, 5 insertions(+) diff --git a/libraries/octree/src/OctreePersistThread.cpp b/libraries/octree/src/OctreePersistThread.cpp index 29715f9d90..6c0c0d9bfe 100644 --- a/libraries/octree/src/OctreePersistThread.cpp +++ b/libraries/octree/src/OctreePersistThread.cpp @@ -23,6 +23,10 @@ OctreePersistThread::OctreePersistThread(Octree* tree, const QString& filename, { } +OctreePersistThread::~OctreePersistThread() { + qDebug() << "OctreePersistThread::~OctreePersistThread()..."; +} + bool OctreePersistThread::process() { if (!_initialLoadComplete) { diff --git a/libraries/octree/src/OctreePersistThread.h b/libraries/octree/src/OctreePersistThread.h index ce6190b0e6..8e70733192 100644 --- a/libraries/octree/src/OctreePersistThread.h +++ b/libraries/octree/src/OctreePersistThread.h @@ -22,6 +22,7 @@ public: static const int DEFAULT_PERSIST_INTERVAL = 1000 * 30; // every 30 seconds OctreePersistThread(Octree* tree, const QString& filename, int persistInterval = DEFAULT_PERSIST_INTERVAL); + ~OctreePersistThread(); bool isInitialLoadComplete() const { return _initialLoadComplete; } quint64 getLoadElapsedTime() const { return _loadTimeUSecs; } From 640dbaacab83bff79813d8f94981426f663a9c13 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 28 Mar 2014 11:05:54 -0700 Subject: [PATCH 04/70] migration to shared pointers --- .../src/octree/OctreeSendThread.cpp | 31 ++++++++++------- assignment-client/src/octree/OctreeServer.cpp | 33 ++++++++++++++----- assignment-client/src/octree/OctreeServer.h | 2 +- 3 files changed, 45 insertions(+), 21 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index ef115167af..c760963310 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -28,25 +28,34 @@ OctreeSendThread::OctreeSendThread(const SharedOctreeServerPointer& myServer, Sh _processLock(), _isShuttingDown(false) { - QString safeServerName("Octree"); - if (!_myServer.isNull()) { - safeServerName = _myServer->getMyServerName(); - } - qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client connected " + qDebug() << qPrintable(_myServer->getMyServerName()) << "server [" << _myServer.data() << "]: client connected " "- starting sending thread [" << this << "]"; OctreeServer::clientConnected(); } -OctreeSendThread::~OctreeSendThread() { - QString safeServerName("Octree"); - if (!_myServer.isNull()) { - safeServerName = _myServer->getMyServerName(); - } - qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client disconnected " +OctreeSendThread::~OctreeSendThread() { + QString serverName(_myServer->getMyServerName()); + + qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: client disconnected " "- ending sending thread [" << this << "]"; OctreeServer::clientDisconnected(); + + qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: " + "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" + "line: " << __LINE__; + _node.clear(); + + qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: " + "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" + "line: " << __LINE__; + void* serverPtr = _myServer.data(); + _myServer.clear(); + + qDebug() << qPrintable(serverName) << "server [" << serverPtr << "]: " + "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" + "line: " << __LINE__; } void OctreeSendThread::setIsShuttingDown() { diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index d711215643..e5c8cd262c 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -19,7 +19,7 @@ #include "OctreeServer.h" #include "OctreeServerConsts.h" -SharedOctreeServerPointer OctreeServer::_instance; +OctreeServer* OctreeServer::_instance; int OctreeServer::_clientCount = 0; const int MOVING_AVERAGE_SAMPLE_COUNTS = 1000000; @@ -203,7 +203,7 @@ void OctreeServer::trackProcessWaitTime(float time) { } void OctreeServer::attachQueryNodeToNode(Node* newNode) { - if (!newNode->getLinkedData() && !_instance.isNull()) { + if (!newNode->getLinkedData() && _instance) { OctreeQueryNode* newQueryNodeData = _instance->createOctreeQueryNode(); newQueryNodeData->init(); newNode->setLinkedData(newQueryNodeData); @@ -231,8 +231,11 @@ OctreeServer::OctreeServer(const QByteArray& packet) : _started(time(0)), _startedUSecs(usecTimestampNow()) { - assert(_instance.isNull()); // you should only ever have one instance at a time! - _instance = SharedOctreeServerPointer(this); + assert(!_instance); // you should only ever have one instance at a time! + + qDebug() << "Octree Server starting... setting _instance to=[" << this << "]"; + _instance = this; + _averageLoopTime.updateAverage(0); qDebug() << "Octree server starting... [" << this << "]"; } @@ -245,25 +248,40 @@ OctreeServer::~OctreeServer() { } delete[] _parsedArgV; } + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; if (_jurisdictionSender) { _jurisdictionSender->terminate(); _jurisdictionSender->deleteLater(); } + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; + if (_octreeInboundPacketProcessor) { _octreeInboundPacketProcessor->terminate(); _octreeInboundPacketProcessor->deleteLater(); } + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; + if (_persistThread) { + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; _persistThread->terminate(); + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; _persistThread->deleteLater(); + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; } + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; + delete _jurisdiction; _jurisdiction = NULL; qDebug() << qPrintable(_safeServerName) << "server DONE shutting down... [" << this << "]"; + + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; + + _instance = NULL; // we are gone + qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; } void OctreeServer::initHTTPManager(int port) { @@ -836,8 +854,7 @@ void OctreeServer::readPendingDatagrams() { if (debug) { qDebug() << "calling initializeOctreeSendThread()... node:" << *matchingNode; } - SharedOctreeServerPointer myServer(this); - nodeData->initializeOctreeSendThread(myServer, matchingNode); + nodeData->initializeOctreeSendThread(SharedOctreeServerPointer(this), matchingNode); } } } else if (packetType == PacketTypeJurisdictionRequest) { @@ -1059,10 +1076,8 @@ void OctreeServer::aboutToFinish() { qDebug() << qPrintable(_safeServerName) << "server about to finish while node still connected node:" << *node; nodeKilled(node); } + qDebug() << qPrintable(_safeServerName) << "server ENDING about to finish..."; - - // release our reference to the instance, this will allow the shared pointers to properly unwind - _instance.clear(); } QString OctreeServer::getUptime() { diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 5cf5fda59f..ff9452170d 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -158,7 +158,7 @@ protected: OctreeInboundPacketProcessor* _octreeInboundPacketProcessor; OctreePersistThread* _persistThread; - static SharedOctreeServerPointer _instance; + static OctreeServer* _instance; time_t _started; quint64 _startedUSecs; From faa062f8ab4793c520e5f50b752bfca9a76eb8c3 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 14:08:19 -0700 Subject: [PATCH 05/70] use single instance of SharedAssignmentPointer for assignment client so we actually get reference counting --- assignment-client/src/AssignmentClient.cpp | 5 +++-- assignment-client/src/AssignmentClient.h | 6 +++++- .../src/octree/OctreeQueryNode.cpp | 4 ++-- .../src/octree/OctreeQueryNode.h | 6 +++--- .../src/octree/OctreeSendThread.cpp | 20 +++++++++---------- .../src/octree/OctreeSendThread.h | 11 ++++++++-- assignment-client/src/octree/OctreeServer.cpp | 5 ++++- assignment-client/src/octree/OctreeServer.h | 8 ++++++-- libraries/shared/src/ThreadedAssignment.cpp | 1 - libraries/shared/src/ThreadedAssignment.h | 7 +++++-- 10 files changed, 47 insertions(+), 26 deletions(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index aa20f2ff29..8795dc5bc4 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -25,11 +25,12 @@ const QString ASSIGNMENT_CLIENT_TARGET_NAME = "assignment-client"; const long long ASSIGNMENT_REQUEST_INTERVAL_MSECS = 1 * 1000; +SharedAssignmentPointer AssignmentClient::_currentAssignment; + int hifiSockAddrMeta = qRegisterMetaType("HifiSockAddr"); AssignmentClient::AssignmentClient(int &argc, char **argv) : - QCoreApplication(argc, argv), - _currentAssignment() + QCoreApplication(argc, argv) { setOrganizationName("High Fidelity"); setOrganizationDomain("highfidelity.io"); diff --git a/assignment-client/src/AssignmentClient.h b/assignment-client/src/AssignmentClient.h index c267c6238b..1b61fb3efe 100644 --- a/assignment-client/src/AssignmentClient.h +++ b/assignment-client/src/AssignmentClient.h @@ -17,14 +17,18 @@ class AssignmentClient : public QCoreApplication { Q_OBJECT public: AssignmentClient(int &argc, char **argv); + + static const SharedAssignmentPointer& getCurrentAssignment() { return _currentAssignment; } + private slots: void sendAssignmentRequest(); void readPendingDatagrams(); void assignmentCompleted(); void handleAuthenticationRequest(); + private: Assignment _requestAssignment; - SharedAssignmentPointer _currentAssignment; + static SharedAssignmentPointer _currentAssignment; }; #endif /* defined(__hifi__AssignmentClient__) */ diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index ab7b2f65fd..77d36f69fa 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -76,9 +76,9 @@ void OctreeQueryNode::deleteLater() { } -void OctreeQueryNode::initializeOctreeSendThread(const SharedOctreeServerPointer& octreeServer, SharedNodePointer node) { +void OctreeQueryNode::initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node) { // Create octree sending thread... - _octreeSendThread = new OctreeSendThread(octreeServer, node); + _octreeSendThread = new OctreeSendThread(myAssignment, node); _octreeSendThread->initialize(true); } diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index ace1235908..66e4e5b0bb 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -19,9 +19,9 @@ #include #include +#include "OctreeServer.h" + class OctreeSendThread; -class OctreeServer; -typedef QSharedPointer SharedOctreeServerPointer; class OctreeQueryNode : public OctreeQuery { Q_OBJECT @@ -84,7 +84,7 @@ public: OctreeSceneStats stats; - void initializeOctreeSendThread(const SharedOctreeServerPointer& octreeServer, SharedNodePointer node); + void initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node); bool isOctreeSendThreadInitalized() { return _octreeSendThread; } void dumpOutOfView(); diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index c760963310..8fe2fb6f30 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -19,8 +19,9 @@ quint64 startSceneSleepTime = 0; quint64 endSceneSleepTime = 0; -OctreeSendThread::OctreeSendThread(const SharedOctreeServerPointer& myServer, SharedNodePointer node) : - _myServer(myServer), +OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node) : + _myAssignment(myAssignment), + _myServer(static_cast(myAssignment.data())), _node(node), _nodeUUID(node->getUUID()), _packetData(), @@ -28,7 +29,7 @@ OctreeSendThread::OctreeSendThread(const SharedOctreeServerPointer& myServer, Sh _processLock(), _isShuttingDown(false) { - qDebug() << qPrintable(_myServer->getMyServerName()) << "server [" << _myServer.data() << "]: client connected " + qDebug() << qPrintable(_myServer->getMyServerName()) << "server [" << _myServer << "]: client connected " "- starting sending thread [" << this << "]"; OctreeServer::clientConnected(); @@ -37,23 +38,22 @@ OctreeSendThread::OctreeSendThread(const SharedOctreeServerPointer& myServer, Sh OctreeSendThread::~OctreeSendThread() { QString serverName(_myServer->getMyServerName()); - qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: client disconnected " + qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client disconnected " "- ending sending thread [" << this << "]"; OctreeServer::clientDisconnected(); - qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: " + qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: " "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" "line: " << __LINE__; _node.clear(); - qDebug() << qPrintable(serverName) << "server [" << _myServer.data() << "]: " + qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: " "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" "line: " << __LINE__; - void* serverPtr = _myServer.data(); - _myServer.clear(); + _myAssignment.clear(); - qDebug() << qPrintable(serverName) << "server [" << serverPtr << "]: " + qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: " "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" "line: " << __LINE__; } @@ -73,7 +73,7 @@ bool OctreeSendThread::process() { } // check that our WeakPointer to our server is still valid - if (_myServer.isNull()) { + if (!_myServer || _myAssignment.isNull()) { return false; // exit early if it's not, it means the server is shutting down } diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index bcaa9baf0e..a341a5be7d 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -13,6 +13,12 @@ #include #include #include + + +class OctreeServer; +class OctreeQueryNode; + + #include "OctreeQueryNode.h" #include "OctreeServer.h" @@ -20,7 +26,7 @@ class OctreeSendThread : public GenericThread { Q_OBJECT public: - OctreeSendThread(const SharedOctreeServerPointer& myServer, SharedNodePointer node); + OctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node); virtual ~OctreeSendThread(); void setIsShuttingDown(); @@ -37,7 +43,8 @@ protected: virtual bool process(); private: - SharedOctreeServerPointer _myServer; + SharedAssignmentPointer _myAssignment; + OctreeServer* _myServer; SharedNodePointer _node; QUuid _nodeUUID; diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index e5c8cd262c..3134b577ae 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -16,6 +16,8 @@ #include #include +#include "../AssignmentClient.h" + #include "OctreeServer.h" #include "OctreeServerConsts.h" @@ -854,7 +856,8 @@ void OctreeServer::readPendingDatagrams() { if (debug) { qDebug() << "calling initializeOctreeSendThread()... node:" << *matchingNode; } - nodeData->initializeOctreeSendThread(SharedOctreeServerPointer(this), matchingNode); + SharedAssignmentPointer sharedAssignment = AssignmentClient::getCurrentAssignment(); + nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); } } } else if (packetType == PacketTypeJurisdictionRequest) { diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index ff9452170d..6405dc986e 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -20,6 +20,10 @@ #include #include +class OctreeServer; +class OctreeQueryNode; +class OctreeSendThread; + #include "OctreePersistThread.h" #include "OctreeSendThread.h" #include "OctreeServerConsts.h" @@ -27,8 +31,8 @@ const int DEFAULT_PACKETS_PER_INTERVAL = 2000; // some 120,000 packets per second total -class OctreeServer; -typedef QSharedPointer SharedOctreeServerPointer; +//class OctreeServer; +//typedef QSharedPointer SharedOctreeServerPointer; /// Handles assignments of type OctreeServer - sending octrees to various clients. class OctreeServer : public ThreadedAssignment, public HTTPRequestHandler { diff --git a/libraries/shared/src/ThreadedAssignment.cpp b/libraries/shared/src/ThreadedAssignment.cpp index fdf2d91c36..66c0ca750d 100644 --- a/libraries/shared/src/ThreadedAssignment.cpp +++ b/libraries/shared/src/ThreadedAssignment.cpp @@ -17,7 +17,6 @@ ThreadedAssignment::ThreadedAssignment(const QByteArray& packet) : Assignment(packet), _isFinished(false) { - } void ThreadedAssignment::setFinished(bool isFinished) { diff --git a/libraries/shared/src/ThreadedAssignment.h b/libraries/shared/src/ThreadedAssignment.h index f9652dd98d..32118997a9 100644 --- a/libraries/shared/src/ThreadedAssignment.h +++ b/libraries/shared/src/ThreadedAssignment.h @@ -13,6 +13,10 @@ #include "Assignment.h" + +class ThreadedAssignment; +typedef QSharedPointer SharedAssignmentPointer; + class ThreadedAssignment : public Assignment { Q_OBJECT public: @@ -35,8 +39,7 @@ private slots: void checkInWithDomainServerOrExit(); signals: void finished(); -}; + }; -typedef QSharedPointer SharedAssignmentPointer; #endif /* defined(__hifi__ThreadedAssignment__) */ From 0f9df4a8ee4fb9796e226ef95020423dd592a59b Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 14:11:47 -0700 Subject: [PATCH 06/70] clean up includes --- assignment-client/src/octree/OctreeQueryNode.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index 66e4e5b0bb..f5b64627a7 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -10,16 +10,16 @@ #define __hifi__OctreeQueryNode__ #include -#include -#include -#include + #include +#include #include #include +#include +#include #include - -#include "OctreeServer.h" +#include // for SharedAssignmentPointer class OctreeSendThread; From 226274e98b8a4739ae9a179c106eb9a7671285fa Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 14:24:08 -0700 Subject: [PATCH 07/70] cleaning up SharedNodePointer usage --- assignment-client/src/octree/OctreeQueryNode.cpp | 2 +- assignment-client/src/octree/OctreeQueryNode.h | 2 +- assignment-client/src/octree/OctreeSendThread.cpp | 2 +- assignment-client/src/octree/OctreeSendThread.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 77d36f69fa..20a8d5ce4c 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -76,7 +76,7 @@ void OctreeQueryNode::deleteLater() { } -void OctreeQueryNode::initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node) { +void OctreeQueryNode::initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, const SharedNodePointer& node) { // Create octree sending thread... _octreeSendThread = new OctreeSendThread(myAssignment, node); _octreeSendThread->initialize(true); diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index f5b64627a7..fd8d338663 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -84,7 +84,7 @@ public: OctreeSceneStats stats; - void initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node); + void initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, const SharedNodePointer& node); bool isOctreeSendThreadInitalized() { return _octreeSendThread; } void dumpOutOfView(); diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 8fe2fb6f30..14e7086f5c 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -19,7 +19,7 @@ quint64 startSceneSleepTime = 0; quint64 endSceneSleepTime = 0; -OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node) : +OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, const SharedNodePointer& node) : _myAssignment(myAssignment), _myServer(static_cast(myAssignment.data())), _node(node), diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index a341a5be7d..a96a30d617 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -26,7 +26,7 @@ class OctreeQueryNode; class OctreeSendThread : public GenericThread { Q_OBJECT public: - OctreeSendThread(const SharedAssignmentPointer& myAssignment, SharedNodePointer node); + OctreeSendThread(const SharedAssignmentPointer& myAssignment, const SharedNodePointer& node); virtual ~OctreeSendThread(); void setIsShuttingDown(); From 6df3ff57c42503d8238148b9d4a58e3398c97df0 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 14:30:25 -0700 Subject: [PATCH 08/70] cleanup isNull() usage --- assignment-client/src/octree/OctreeSendThread.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 14e7086f5c..b2e292fb12 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -73,7 +73,7 @@ bool OctreeSendThread::process() { } // check that our WeakPointer to our server is still valid - if (!_myServer || _myAssignment.isNull()) { + if (!_myServer || !_myAssignment) { return false; // exit early if it's not, it means the server is shutting down } @@ -90,7 +90,7 @@ bool OctreeSendThread::process() { // don't do any send processing until the initial load of the octree is complete... if (_myServer->isInitialLoadComplete()) { - if (!_node.isNull()) { + if (_node) { _nodeMissingCount = 0; OctreeQueryNode* nodeData = static_cast(_node->getLinkedData()); From 6601a0d4e96140cd6868294f5696560eb35d443d Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 14:54:39 -0700 Subject: [PATCH 09/70] cleaning up nodeKilled() --- .../src/octree/OctreeQueryNode.cpp | 21 ++++++++++++++++++- .../src/octree/OctreeQueryNode.h | 1 + assignment-client/src/octree/OctreeServer.cpp | 8 +++---- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 20a8d5ce4c..57de87c45d 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -44,7 +44,7 @@ OctreeQueryNode::OctreeQueryNode() : OctreeQueryNode::~OctreeQueryNode() { _isShuttingDown = true; - const bool extraDebugging = false; + const bool extraDebugging = true; if (extraDebugging) { qDebug() << "OctreeQueryNode::~OctreeQueryNode()"; } @@ -75,6 +75,25 @@ void OctreeQueryNode::deleteLater() { OctreeQuery::deleteLater(); } +void OctreeQueryNode::nodeKilled() { + _isShuttingDown = true; + const bool extraDebugging = true; + if (extraDebugging) { + qDebug() << "OctreeQueryNode::nodeKilled()"; + } + if (_octreeSendThread) { + if (extraDebugging) { + qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->terminate()"; + } + _octreeSendThread->terminate(); + if (extraDebugging) { + qDebug() << "OctreeQueryNode::nodeKilled()... calling delete _octreeSendThread"; + } + delete _octreeSendThread; + _octreeSendThread = NULL; + } +} + void OctreeQueryNode::initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, const SharedNodePointer& node) { // Create octree sending thread... diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index fd8d338663..c08bdcb2bf 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -94,6 +94,7 @@ public: unsigned int getlastOctreePacketLength() const { return _lastOctreePacketLength; } int getDuplicatePacketCount() const { return _duplicatePacketCount; } + void nodeKilled(); bool isShuttingDown() const { return _isShuttingDown; } private: diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 3134b577ae..6499a2f4a4 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -21,7 +21,7 @@ #include "OctreeServer.h" #include "OctreeServerConsts.h" -OctreeServer* OctreeServer::_instance; +OctreeServer* OctreeServer::_instance = NULL; int OctreeServer::_clientCount = 0; const int MOVING_AVERAGE_SAMPLE_COUNTS = 1000000; @@ -1064,10 +1064,8 @@ void OctreeServer::nodeKilled(SharedNodePointer node) { qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); if (nodeData) { - qDebug() << qPrintable(_safeServerName) << "server resetting Linked Data for node:" << *node; - node->setLinkedData(NULL); // set this first in case another thread comes through and tryes to acces this - qDebug() << qPrintable(_safeServerName) << "server deleting Linked Data for node:" << *node; - nodeData->deleteLater(); + qDebug() << qPrintable(_safeServerName) << "server calling nodeData->nodeKilled() for node:" << *node; + nodeData->nodeKilled(); // tell our node data and sending threads that we'd like to shut down } else { qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; } From a82a583030399c9651062e7db1cc0a21b1c488a0 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 14:59:28 -0700 Subject: [PATCH 10/70] cleanup --- assignment-client/src/octree/OctreeSendThread.cpp | 2 +- assignment-client/src/octree/OctreeServer.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index b2e292fb12..9c0ddbb779 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -72,7 +72,7 @@ bool OctreeSendThread::process() { return false; // exit early if we're shutting down } - // check that our WeakPointer to our server is still valid + // check that our server and assignment is still valid if (!_myServer || !_myAssignment) { return false; // exit early if it's not, it means the server is shutting down } diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 6405dc986e..4ac0339001 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -13,7 +13,6 @@ #include #include #include -#include #include From d2cf898e220f1829f81d5a261cfa0235218983d0 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:06:17 -0700 Subject: [PATCH 11/70] revert tweaks --- libraries/shared/src/ThreadedAssignment.h | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/libraries/shared/src/ThreadedAssignment.h b/libraries/shared/src/ThreadedAssignment.h index 32118997a9..aa2994a2be 100644 --- a/libraries/shared/src/ThreadedAssignment.h +++ b/libraries/shared/src/ThreadedAssignment.h @@ -13,10 +13,6 @@ #include "Assignment.h" - -class ThreadedAssignment; -typedef QSharedPointer SharedAssignmentPointer; - class ThreadedAssignment : public Assignment { Q_OBJECT public: @@ -39,7 +35,9 @@ private slots: void checkInWithDomainServerOrExit(); signals: void finished(); - }; +}; + +typedef QSharedPointer SharedAssignmentPointer; #endif /* defined(__hifi__ThreadedAssignment__) */ From 5ef437da39ee86794dfadb97cc5810fe1f86d3ca Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:07:13 -0700 Subject: [PATCH 12/70] revert tweaks --- libraries/shared/src/ThreadedAssignment.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/shared/src/ThreadedAssignment.h b/libraries/shared/src/ThreadedAssignment.h index aa2994a2be..f9652dd98d 100644 --- a/libraries/shared/src/ThreadedAssignment.h +++ b/libraries/shared/src/ThreadedAssignment.h @@ -39,5 +39,4 @@ signals: typedef QSharedPointer SharedAssignmentPointer; - #endif /* defined(__hifi__ThreadedAssignment__) */ From 6fd1a6f4e44f7bec3f5632cac242a6cc70a9f09f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:07:34 -0700 Subject: [PATCH 13/70] revert tweaks --- libraries/shared/src/ThreadedAssignment.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/shared/src/ThreadedAssignment.cpp b/libraries/shared/src/ThreadedAssignment.cpp index 66c0ca750d..09569dbe81 100644 --- a/libraries/shared/src/ThreadedAssignment.cpp +++ b/libraries/shared/src/ThreadedAssignment.cpp @@ -17,6 +17,7 @@ ThreadedAssignment::ThreadedAssignment(const QByteArray& packet) : Assignment(packet), _isFinished(false) { + } void ThreadedAssignment::setFinished(bool isFinished) { From 989e087701dc7e324b0e2293f5467052a01f7850 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:09:18 -0700 Subject: [PATCH 14/70] revert tweaks --- libraries/shared/src/ThreadedAssignment.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/shared/src/ThreadedAssignment.cpp b/libraries/shared/src/ThreadedAssignment.cpp index 09569dbe81..fdf2d91c36 100644 --- a/libraries/shared/src/ThreadedAssignment.cpp +++ b/libraries/shared/src/ThreadedAssignment.cpp @@ -17,7 +17,7 @@ ThreadedAssignment::ThreadedAssignment(const QByteArray& packet) : Assignment(packet), _isFinished(false) { - + } void ThreadedAssignment::setFinished(bool isFinished) { From 514f43c6cc0dad10b7eb17ee3765c609a7af2fa5 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:10:36 -0700 Subject: [PATCH 15/70] revert tweaks --- assignment-client/src/octree/OctreeServer.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 4ac0339001..63d43b6634 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -19,10 +19,6 @@ #include #include -class OctreeServer; -class OctreeQueryNode; -class OctreeSendThread; - #include "OctreePersistThread.h" #include "OctreeSendThread.h" #include "OctreeServerConsts.h" @@ -30,9 +26,6 @@ class OctreeSendThread; const int DEFAULT_PACKETS_PER_INTERVAL = 2000; // some 120,000 packets per second total -//class OctreeServer; -//typedef QSharedPointer SharedOctreeServerPointer; - /// Handles assignments of type OctreeServer - sending octrees to various clients. class OctreeServer : public ThreadedAssignment, public HTTPRequestHandler { Q_OBJECT From 27f42b5b863f35ba187e2f986fb25c98def3904b Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:15:54 -0700 Subject: [PATCH 16/70] clean up headers --- assignment-client/src/octree/OctreeSendThread.h | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index a96a30d617..85c7c18b19 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -13,14 +13,11 @@ #include #include #include - - -class OctreeServer; -class OctreeQueryNode; - +#include #include "OctreeQueryNode.h" -#include "OctreeServer.h" + +class OctreeServer; /// Threaded processor for sending voxel packets to a single client class OctreeSendThread : public GenericThread { From a9d153054fde6b0def1240f16dbde6caa59e644c Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:28:13 -0700 Subject: [PATCH 17/70] remove _process mutex since it's no longer needed --- assignment-client/src/octree/OctreeSendThread.cpp | 13 ------------- assignment-client/src/octree/OctreeSendThread.h | 1 - 2 files changed, 14 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 9c0ddbb779..b2bb2a8c16 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -26,7 +26,6 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, _nodeUUID(node->getUUID()), _packetData(), _nodeMissingCount(0), - _processLock(), _isShuttingDown(false) { qDebug() << qPrintable(_myServer->getMyServerName()) << "server [" << _myServer << "]: client connected " @@ -61,9 +60,6 @@ OctreeSendThread::~OctreeSendThread() { void OctreeSendThread::setIsShuttingDown() { _isShuttingDown = true; OctreeServer::stopTrackingThread(this); - - // this will cause us to wait till the process loop is complete, we do this after we change _isShuttingDown - QMutexLocker locker(&_processLock); } @@ -79,13 +75,6 @@ bool OctreeSendThread::process() { OctreeServer::didProcess(this); - float lockWaitElapsedUsec = OctreeServer::SKIP_TIME; - quint64 lockWaitStart = usecTimestampNow(); - _processLock.lock(); - quint64 lockWaitEnd = usecTimestampNow(); - lockWaitElapsedUsec = (float)(lockWaitEnd - lockWaitStart); - OctreeServer::trackProcessWaitTime(lockWaitElapsedUsec); - quint64 start = usecTimestampNow(); // don't do any send processing until the initial load of the octree is complete... @@ -102,8 +91,6 @@ bool OctreeSendThread::process() { } } - _processLock.unlock(); - if (_isShuttingDown) { return false; // exit early if we're shutting down } diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index 85c7c18b19..971e27668c 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -51,7 +51,6 @@ private: OctreePacketData _packetData; int _nodeMissingCount; - QMutex _processLock; // don't allow us to have our nodeData, or our thread to be deleted while we're processing bool _isShuttingDown; }; From 1eb15b0d12c230ea9de3dbade8284ece9cc43845 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:37:53 -0700 Subject: [PATCH 18/70] cleanup --- assignment-client/src/octree/OctreeQueryNode.cpp | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 57de87c45d..56fdbb997b 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -44,7 +44,7 @@ OctreeQueryNode::OctreeQueryNode() : OctreeQueryNode::~OctreeQueryNode() { _isShuttingDown = true; - const bool extraDebugging = true; + const bool extraDebugging = false; if (extraDebugging) { qDebug() << "OctreeQueryNode::~OctreeQueryNode()"; } @@ -77,18 +77,8 @@ void OctreeQueryNode::deleteLater() { void OctreeQueryNode::nodeKilled() { _isShuttingDown = true; - const bool extraDebugging = true; - if (extraDebugging) { - qDebug() << "OctreeQueryNode::nodeKilled()"; - } if (_octreeSendThread) { - if (extraDebugging) { - qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->terminate()"; - } _octreeSendThread->terminate(); - if (extraDebugging) { - qDebug() << "OctreeQueryNode::nodeKilled()... calling delete _octreeSendThread"; - } delete _octreeSendThread; _octreeSendThread = NULL; } From b3734d870b31803281c79be2570451d91e9549a5 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:39:12 -0700 Subject: [PATCH 19/70] cleanup --- assignment-client/src/octree/OctreeSendThread.cpp | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index b2bb2a8c16..8bf70c3853 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -40,21 +40,8 @@ OctreeSendThread::~OctreeSendThread() { qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client disconnected " "- ending sending thread [" << this << "]"; OctreeServer::clientDisconnected(); - - qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: " - "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" - "line: " << __LINE__; - _node.clear(); - - qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: " - "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" - "line: " << __LINE__; _myAssignment.clear(); - - qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: " - "- OctreeSendThread::~OctreeSendThread() this=[" << this << "]" - "line: " << __LINE__; } void OctreeSendThread::setIsShuttingDown() { From 5c37a79378c2023c54d400711a6c95fa259d4a6d Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:42:16 -0700 Subject: [PATCH 20/70] cleanup of debuggin --- assignment-client/src/octree/OctreeServer.cpp | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 6499a2f4a4..a79bba44a4 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -250,40 +250,26 @@ OctreeServer::~OctreeServer() { } delete[] _parsedArgV; } - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; if (_jurisdictionSender) { _jurisdictionSender->terminate(); _jurisdictionSender->deleteLater(); } - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; - if (_octreeInboundPacketProcessor) { _octreeInboundPacketProcessor->terminate(); _octreeInboundPacketProcessor->deleteLater(); } - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; - if (_persistThread) { - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; _persistThread->terminate(); - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; _persistThread->deleteLater(); - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; } - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; - delete _jurisdiction; _jurisdiction = NULL; - qDebug() << qPrintable(_safeServerName) << "server DONE shutting down... [" << this << "]"; - - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; - _instance = NULL; // we are gone - qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "] OctreeServer::~OctreeServer() line:" << __LINE__; + qDebug() << qPrintable(_safeServerName) << "server DONE shutting down... [" << this << "]"; } void OctreeServer::initHTTPManager(int port) { From 81fc0bea4dc35da6adaf93b53dafd3019afb9f17 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 15:50:40 -0700 Subject: [PATCH 21/70] revert small tweaks --- libraries/octree/src/OctreePersistThread.cpp | 4 ---- libraries/octree/src/OctreePersistThread.h | 1 - 2 files changed, 5 deletions(-) diff --git a/libraries/octree/src/OctreePersistThread.cpp b/libraries/octree/src/OctreePersistThread.cpp index 6c0c0d9bfe..29715f9d90 100644 --- a/libraries/octree/src/OctreePersistThread.cpp +++ b/libraries/octree/src/OctreePersistThread.cpp @@ -23,10 +23,6 @@ OctreePersistThread::OctreePersistThread(Octree* tree, const QString& filename, { } -OctreePersistThread::~OctreePersistThread() { - qDebug() << "OctreePersistThread::~OctreePersistThread()..."; -} - bool OctreePersistThread::process() { if (!_initialLoadComplete) { diff --git a/libraries/octree/src/OctreePersistThread.h b/libraries/octree/src/OctreePersistThread.h index 8e70733192..ce6190b0e6 100644 --- a/libraries/octree/src/OctreePersistThread.h +++ b/libraries/octree/src/OctreePersistThread.h @@ -22,7 +22,6 @@ public: static const int DEFAULT_PERSIST_INTERVAL = 1000 * 30; // every 30 seconds OctreePersistThread(Octree* tree, const QString& filename, int persistInterval = DEFAULT_PERSIST_INTERVAL); - ~OctreePersistThread(); bool isInitialLoadComplete() const { return _initialLoadComplete; } quint64 getLoadElapsedTime() const { return _loadTimeUSecs; } From 7a683b177da5eb88a1725a9091f08536352c32ad Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 16:43:25 -0700 Subject: [PATCH 22/70] added some debugging, and reordered some shutdown logic --- .../src/octree/OctreeQueryNode.cpp | 17 +++++++++++++++-- .../src/octree/OctreeSendThread.cpp | 17 ++++++++++++++++- assignment-client/src/octree/OctreeServer.cpp | 1 + 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 56fdbb997b..3b73617845 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -44,7 +44,7 @@ OctreeQueryNode::OctreeQueryNode() : OctreeQueryNode::~OctreeQueryNode() { _isShuttingDown = true; - const bool extraDebugging = false; + const bool extraDebugging = true; if (extraDebugging) { qDebug() << "OctreeQueryNode::~OctreeQueryNode()"; } @@ -76,12 +76,25 @@ void OctreeQueryNode::deleteLater() { } void OctreeQueryNode::nodeKilled() { + qDebug() << "OctreeQueryNode::nodeKilled()... "; _isShuttingDown = true; if (_octreeSendThread) { + qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->terminate()"; _octreeSendThread->terminate(); - delete _octreeSendThread; + qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->terminate()"; + + OctreeSendThread* sendThread = _octreeSendThread; + + qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread = NULL"; _octreeSendThread = NULL; + qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread = NULL"; + + qDebug() << "OctreeQueryNode::nodeKilled()... calling delete sendThread"; + delete sendThread; + qDebug() << "OctreeQueryNode::nodeKilled()... AFTER delete sendThread"; + } + qDebug() << "OctreeQueryNode::nodeKilled()... DONE"; } diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 8bf70c3853..b98d17c033 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -35,13 +35,28 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, } OctreeSendThread::~OctreeSendThread() { - QString serverName(_myServer->getMyServerName()); + qDebug() << "OctreeSendThread::~OctreeSendThread()... START"; + QString serverName("Octree"); + if (_myServer) { + serverName = _myServer->getMyServerName(); + } qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client disconnected " "- ending sending thread [" << this << "]"; + + qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE OctreeServer::clientDisconnected();"; OctreeServer::clientDisconnected(); + qDebug() << "OctreeSendThread::~OctreeSendThread()... AFTER OctreeServer::clientDisconnected();"; + + qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _node.clear();"; _node.clear(); + qDebug() << "OctreeSendThread::~OctreeSendThread()... AFTER _node.clear();"; + + qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _myAssignment.clear();"; _myAssignment.clear(); + qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _myAssignment.clear();"; + + qDebug() << "OctreeSendThread::~OctreeSendThread()... DONE"; } void OctreeSendThread::setIsShuttingDown() { diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index a79bba44a4..977c0c25f3 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -1052,6 +1052,7 @@ void OctreeServer::nodeKilled(SharedNodePointer node) { if (nodeData) { qDebug() << qPrintable(_safeServerName) << "server calling nodeData->nodeKilled() for node:" << *node; nodeData->nodeKilled(); // tell our node data and sending threads that we'd like to shut down + qDebug() << qPrintable(_safeServerName) << "server AFTER nodeData->nodeKilled() for node:" << *node; } else { qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; } From dc302e7126cd6e33abc68e444b71144a802b1beb Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 16:51:00 -0700 Subject: [PATCH 23/70] tweak shutdown --- assignment-client/src/octree/OctreeQueryNode.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 3b73617845..d2c1cf281e 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -48,6 +48,8 @@ OctreeQueryNode::~OctreeQueryNode() { if (extraDebugging) { qDebug() << "OctreeQueryNode::~OctreeQueryNode()"; } + + /* if (_octreeSendThread) { if (extraDebugging) { qDebug() << "OctreeQueryNode::~OctreeQueryNode()... calling _octreeSendThread->terminate()"; @@ -58,6 +60,7 @@ OctreeQueryNode::~OctreeQueryNode() { } delete _octreeSendThread; } + */ delete[] _octreePacket; delete[] _lastOctreePacket; @@ -79,16 +82,20 @@ void OctreeQueryNode::nodeKilled() { qDebug() << "OctreeQueryNode::nodeKilled()... "; _isShuttingDown = true; if (_octreeSendThread) { - qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->terminate()"; - _octreeSendThread->terminate(); - qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->terminate()"; - OctreeSendThread* sendThread = _octreeSendThread; qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread = NULL"; _octreeSendThread = NULL; qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread = NULL"; + qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->setIsShuttingDown()"; + sendThread->setIsShuttingDown(); + qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->setIsShuttingDown()"; + + qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->terminate()"; + sendThread->terminate(); + qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->terminate()"; + qDebug() << "OctreeQueryNode::nodeKilled()... calling delete sendThread"; delete sendThread; qDebug() << "OctreeQueryNode::nodeKilled()... AFTER delete sendThread"; From ef68f164c9a7aa1bfd9fe66d6045df196c883dcc Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 17:05:31 -0700 Subject: [PATCH 24/70] tweak shutdown --- assignment-client/src/octree/OctreeQueryNode.cpp | 5 +++++ assignment-client/src/octree/OctreeSendThread.cpp | 11 ++++++++++- assignment-client/src/octree/OctreeServer.cpp | 4 ++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index d2c1cf281e..fe2e271a09 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -107,8 +107,13 @@ void OctreeQueryNode::nodeKilled() { void OctreeQueryNode::initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, const SharedNodePointer& node) { // Create octree sending thread... + qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... BEFORE new OctreeSendThread(myAssignment, node);"; _octreeSendThread = new OctreeSendThread(myAssignment, node); + qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... AFTER new OctreeSendThread(myAssignment, node);"; + + qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... BEFORE _octreeSendThread->initialize(true)"; _octreeSendThread->initialize(true); + qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... AFTER _octreeSendThread->initialize(true)"; } bool OctreeQueryNode::packetIsDuplicate() const { diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index b98d17c033..20a7260737 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -28,10 +28,19 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, _nodeMissingCount(0), _isShuttingDown(false) { - qDebug() << qPrintable(_myServer->getMyServerName()) << "server [" << _myServer << "]: client connected " + qDebug() << "OctreeSendThread::OctreeSendThread()... START"; + + QString serverName("Octree"); + if (_myServer) { + serverName = _myServer->getMyServerName(); + } + qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client connected " "- starting sending thread [" << this << "]"; + qDebug() << "OctreeSendThread::OctreeSendThread()... before OctreeServer::clientConnected()"; OctreeServer::clientConnected(); + qDebug() << "OctreeSendThread::OctreeSendThread()... AFTER OctreeServer::clientConnected()"; + qDebug() << "OctreeSendThread::OctreeSendThread()... DONE"; } OctreeSendThread::~OctreeSendThread() { diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 977c0c25f3..e791b542fc 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -842,8 +842,12 @@ void OctreeServer::readPendingDatagrams() { if (debug) { qDebug() << "calling initializeOctreeSendThread()... node:" << *matchingNode; } + + + qDebug() << "OctreeServer::readPendingDatagrams()... BEFORE nodeData->initializeOctreeSendThread()"; SharedAssignmentPointer sharedAssignment = AssignmentClient::getCurrentAssignment(); nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); + qDebug() << "OctreeServer::readPendingDatagrams()... AFTER nodeData->initializeOctreeSendThread()"; } } } else if (packetType == PacketTypeJurisdictionRequest) { From 4bf7faba7b64f45cc65255796bee828ffd00c893 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 17:55:40 -0700 Subject: [PATCH 25/70] workaround for assert failures when bad view frustum input --- libraries/octree/src/ViewFrustum.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/octree/src/ViewFrustum.cpp b/libraries/octree/src/ViewFrustum.cpp index fa6873b093..dbb6f955f2 100644 --- a/libraries/octree/src/ViewFrustum.cpp +++ b/libraries/octree/src/ViewFrustum.cpp @@ -129,9 +129,11 @@ void ViewFrustum::calculate() { // Also calculate our projection matrix in case people want to project points... // Projection matrix : Field of View, ratio, display range : near to far - glm::mat4 projection = glm::perspective(_fieldOfView, _aspectRatio, _nearClip, _farClip); - glm::vec3 lookAt = _position + _direction; - glm::mat4 view = glm::lookAt(_position, lookAt, _up); + const float CLIP_NUDGE = 1.0f; + float farClip = (_farClip != _nearClip) ? _farClip : _nearClip + CLIP_NUDGE; // don't allow near and far to be equal + glm::mat4 projection = glm::perspective(_fieldOfView, _aspectRatio, _nearClip, farClip); + glm::vec3 lookAt = _position + _direction; + glm::mat4 view = glm::lookAt(_position, lookAt, _up); // Our ModelViewProjection : multiplication of our 3 matrices (note: model is identity, so we can drop it) _ourModelViewProjectionMatrix = projection * view; // Remember, matrix multiplication is the other way around From 9d60be97736f5c9e1b594bb6768cbe9cd74e242e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 17:57:48 -0700 Subject: [PATCH 26/70] cleanup some debugging --- .../src/octree/OctreeQueryNode.cpp | 37 ++++++------------- .../src/octree/OctreeSendThread.cpp | 24 ++++++------ 2 files changed, 24 insertions(+), 37 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index fe2e271a09..3291fb49ba 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -49,19 +49,6 @@ OctreeQueryNode::~OctreeQueryNode() { qDebug() << "OctreeQueryNode::~OctreeQueryNode()"; } - /* - if (_octreeSendThread) { - if (extraDebugging) { - qDebug() << "OctreeQueryNode::~OctreeQueryNode()... calling _octreeSendThread->terminate()"; - } - _octreeSendThread->terminate(); - if (extraDebugging) { - qDebug() << "OctreeQueryNode::~OctreeQueryNode()... calling delete _octreeSendThread"; - } - delete _octreeSendThread; - } - */ - delete[] _octreePacket; delete[] _lastOctreePacket; if (extraDebugging) { @@ -84,21 +71,21 @@ void OctreeQueryNode::nodeKilled() { if (_octreeSendThread) { OctreeSendThread* sendThread = _octreeSendThread; - qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread = NULL"; + //qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread = NULL"; _octreeSendThread = NULL; - qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread = NULL"; + //qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread = NULL"; - qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->setIsShuttingDown()"; + //qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->setIsShuttingDown()"; sendThread->setIsShuttingDown(); - qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->setIsShuttingDown()"; + //qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->setIsShuttingDown()"; - qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->terminate()"; + //qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->terminate()"; sendThread->terminate(); - qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->terminate()"; + //qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->terminate()"; - qDebug() << "OctreeQueryNode::nodeKilled()... calling delete sendThread"; + //qDebug() << "OctreeQueryNode::nodeKilled()... calling delete sendThread"; delete sendThread; - qDebug() << "OctreeQueryNode::nodeKilled()... AFTER delete sendThread"; + //qDebug() << "OctreeQueryNode::nodeKilled()... AFTER delete sendThread"; } qDebug() << "OctreeQueryNode::nodeKilled()... DONE"; @@ -107,13 +94,13 @@ void OctreeQueryNode::nodeKilled() { void OctreeQueryNode::initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, const SharedNodePointer& node) { // Create octree sending thread... - qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... BEFORE new OctreeSendThread(myAssignment, node);"; + //qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... BEFORE new OctreeSendThread(myAssignment, node);"; _octreeSendThread = new OctreeSendThread(myAssignment, node); - qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... AFTER new OctreeSendThread(myAssignment, node);"; + //qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... AFTER new OctreeSendThread(myAssignment, node);"; - qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... BEFORE _octreeSendThread->initialize(true)"; + //qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... BEFORE _octreeSendThread->initialize(true)"; _octreeSendThread->initialize(true); - qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... AFTER _octreeSendThread->initialize(true)"; + //qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... AFTER _octreeSendThread->initialize(true)"; } bool OctreeQueryNode::packetIsDuplicate() const { diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 20a7260737..a748d766c3 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -28,7 +28,7 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, _nodeMissingCount(0), _isShuttingDown(false) { - qDebug() << "OctreeSendThread::OctreeSendThread()... START"; + //qDebug() << "OctreeSendThread::OctreeSendThread()... START"; QString serverName("Octree"); if (_myServer) { @@ -37,14 +37,14 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client connected " "- starting sending thread [" << this << "]"; - qDebug() << "OctreeSendThread::OctreeSendThread()... before OctreeServer::clientConnected()"; + //qDebug() << "OctreeSendThread::OctreeSendThread()... before OctreeServer::clientConnected()"; OctreeServer::clientConnected(); - qDebug() << "OctreeSendThread::OctreeSendThread()... AFTER OctreeServer::clientConnected()"; - qDebug() << "OctreeSendThread::OctreeSendThread()... DONE"; + //qDebug() << "OctreeSendThread::OctreeSendThread()... AFTER OctreeServer::clientConnected()"; + //qDebug() << "OctreeSendThread::OctreeSendThread()... DONE"; } OctreeSendThread::~OctreeSendThread() { - qDebug() << "OctreeSendThread::~OctreeSendThread()... START"; + //qDebug() << "OctreeSendThread::~OctreeSendThread()... START"; QString serverName("Octree"); if (_myServer) { serverName = _myServer->getMyServerName(); @@ -53,19 +53,19 @@ OctreeSendThread::~OctreeSendThread() { qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client disconnected " "- ending sending thread [" << this << "]"; - qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE OctreeServer::clientDisconnected();"; + //qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE OctreeServer::clientDisconnected();"; OctreeServer::clientDisconnected(); - qDebug() << "OctreeSendThread::~OctreeSendThread()... AFTER OctreeServer::clientDisconnected();"; + //qDebug() << "OctreeSendThread::~OctreeSendThread()... AFTER OctreeServer::clientDisconnected();"; - qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _node.clear();"; + //qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _node.clear();"; _node.clear(); - qDebug() << "OctreeSendThread::~OctreeSendThread()... AFTER _node.clear();"; + //qDebug() << "OctreeSendThread::~OctreeSendThread()... AFTER _node.clear();"; - qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _myAssignment.clear();"; + //qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _myAssignment.clear();"; _myAssignment.clear(); - qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _myAssignment.clear();"; + //qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _myAssignment.clear();"; - qDebug() << "OctreeSendThread::~OctreeSendThread()... DONE"; + //qDebug() << "OctreeSendThread::~OctreeSendThread()... DONE"; } void OctreeSendThread::setIsShuttingDown() { From b5c538b05130dff271538c9107363ceba0c5ee24 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 18:22:06 -0700 Subject: [PATCH 27/70] added some debugging --- assignment-client/src/octree/OctreeServer.cpp | 6 ++++++ libraries/shared/src/ThreadedAssignment.cpp | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index e791b542fc..11d0e0ca37 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -1051,6 +1051,8 @@ void OctreeServer::nodeAdded(SharedNodePointer node) { } void OctreeServer::nodeKilled(SharedNodePointer node) { + quint64 start = usecTimestampNow(); + qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); if (nodeData) { @@ -1060,6 +1062,10 @@ void OctreeServer::nodeKilled(SharedNodePointer node) { } else { qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; } + + quint64 end = usecTimestampNow(); + quint64 usecsElapsed = (end - start); + qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node << " took: " << usecsElapsed << " usecs"; } void OctreeServer::aboutToFinish() { diff --git a/libraries/shared/src/ThreadedAssignment.cpp b/libraries/shared/src/ThreadedAssignment.cpp index fdf2d91c36..eed5aa46f6 100644 --- a/libraries/shared/src/ThreadedAssignment.cpp +++ b/libraries/shared/src/ThreadedAssignment.cpp @@ -74,6 +74,10 @@ void ThreadedAssignment::sendStatsPacket() { } void ThreadedAssignment::checkInWithDomainServerOrExit() { + qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit()... " + "Num No Reply Domain Check Ins=" << NodeList::getInstance()->getNumNoReplyDomainCheckIns() + << "MAX_SILENT_DOMAIN_SERVER_CHECK_INS=" << MAX_SILENT_DOMAIN_SERVER_CHECK_INS; + if (NodeList::getInstance()->getNumNoReplyDomainCheckIns() == MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { setFinished(true); } else { From 7cd39d3ef044d77fd3615a27230cc0ae4cea3761 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 20:53:34 -0700 Subject: [PATCH 28/70] add forceNodeShutdown() to handle forced shutdown of nodes in case of server shutdown --- .../src/octree/OctreeQueryNode.cpp | 48 +++++++++---------- .../src/octree/OctreeQueryNode.h | 7 ++- .../src/octree/OctreeSendThread.cpp | 13 +---- assignment-client/src/octree/OctreeServer.cpp | 34 +++++++++++-- assignment-client/src/octree/OctreeServer.h | 1 + libraries/shared/src/ThreadedAssignment.cpp | 4 -- 6 files changed, 60 insertions(+), 47 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 3291fb49ba..642a34edd7 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -49,6 +49,10 @@ OctreeQueryNode::~OctreeQueryNode() { qDebug() << "OctreeQueryNode::~OctreeQueryNode()"; } + if (_octreeSendThread) { + forceNodeShutdown(); + } + delete[] _octreePacket; delete[] _lastOctreePacket; if (extraDebugging) { @@ -56,51 +60,45 @@ OctreeQueryNode::~OctreeQueryNode() { } } - -void OctreeQueryNode::deleteLater() { +void OctreeQueryNode::nodeKilled() { _isShuttingDown = true; if (_octreeSendThread) { + // just tell our thread we want to shutdown, this is asynchronous, and fast, we don't need or want it to block + // while the thread actually shuts down _octreeSendThread->setIsShuttingDown(); } - OctreeQuery::deleteLater(); } -void OctreeQueryNode::nodeKilled() { - qDebug() << "OctreeQueryNode::nodeKilled()... "; +void OctreeQueryNode::forceNodeShutdown() { _isShuttingDown = true; if (_octreeSendThread) { + // we really need to force our thread to shutdown, this is synchronous, we will block while the thread actually + // shuts down because we really need it to shutdown, and it's ok if we wait for it to complete OctreeSendThread* sendThread = _octreeSendThread; - - //qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread = NULL"; _octreeSendThread = NULL; - //qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread = NULL"; - - //qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->setIsShuttingDown()"; sendThread->setIsShuttingDown(); - //qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->setIsShuttingDown()"; - - //qDebug() << "OctreeQueryNode::nodeKilled()... calling _octreeSendThread->terminate()"; sendThread->terminate(); - //qDebug() << "OctreeQueryNode::nodeKilled()... AFTER _octreeSendThread->terminate()"; - - //qDebug() << "OctreeQueryNode::nodeKilled()... calling delete sendThread"; delete sendThread; - //qDebug() << "OctreeQueryNode::nodeKilled()... AFTER delete sendThread"; - } - qDebug() << "OctreeQueryNode::nodeKilled()... DONE"; } +void OctreeQueryNode::sendThreadFinished() { + // We've been notified by our thread that it is shutting down. So we can clean up our reference to it, and + // delete the actual thread object. Cleaning up our thread will correctly unroll all refereces to shared + // pointers to our node as well as the octree server assignment + if (_octreeSendThread) { + OctreeSendThread* sendThread = _octreeSendThread; + _octreeSendThread = NULL; + delete sendThread; + } +} void OctreeQueryNode::initializeOctreeSendThread(const SharedAssignmentPointer& myAssignment, const SharedNodePointer& node) { - // Create octree sending thread... - //qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... BEFORE new OctreeSendThread(myAssignment, node);"; _octreeSendThread = new OctreeSendThread(myAssignment, node); - //qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... AFTER new OctreeSendThread(myAssignment, node);"; - - //qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... BEFORE _octreeSendThread->initialize(true)"; + + // we want to be notified when the thread finishes + connect(_octreeSendThread, &GenericThread::finished, this, &OctreeQueryNode::sendThreadFinished); _octreeSendThread->initialize(true); - //qDebug() << "OctreeQueryNode::initializeOctreeSendThread()... AFTER _octreeSendThread->initialize(true)"; } bool OctreeQueryNode::packetIsDuplicate() const { diff --git a/assignment-client/src/octree/OctreeQueryNode.h b/assignment-client/src/octree/OctreeQueryNode.h index c08bdcb2bf..a3f31ba98b 100644 --- a/assignment-client/src/octree/OctreeQueryNode.h +++ b/assignment-client/src/octree/OctreeQueryNode.h @@ -28,8 +28,7 @@ class OctreeQueryNode : public OctreeQuery { public: OctreeQueryNode(); virtual ~OctreeQueryNode(); - virtual void deleteLater(); - + void init(); // called after creation to set up some virtual items virtual PacketType getMyPacketType() const = 0; @@ -95,8 +94,12 @@ public: int getDuplicatePacketCount() const { return _duplicatePacketCount; } void nodeKilled(); + void forceNodeShutdown(); bool isShuttingDown() const { return _isShuttingDown; } +private slots: + void sendThreadFinished(); + private: OctreeQueryNode(const OctreeQueryNode &); OctreeQueryNode& operator= (const OctreeQueryNode&); diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index a748d766c3..e655acc400 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -44,28 +44,17 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, } OctreeSendThread::~OctreeSendThread() { - //qDebug() << "OctreeSendThread::~OctreeSendThread()... START"; QString serverName("Octree"); if (_myServer) { serverName = _myServer->getMyServerName(); } - + qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client disconnected " "- ending sending thread [" << this << "]"; - //qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE OctreeServer::clientDisconnected();"; OctreeServer::clientDisconnected(); - //qDebug() << "OctreeSendThread::~OctreeSendThread()... AFTER OctreeServer::clientDisconnected();"; - - //qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _node.clear();"; _node.clear(); - //qDebug() << "OctreeSendThread::~OctreeSendThread()... AFTER _node.clear();"; - - //qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _myAssignment.clear();"; _myAssignment.clear(); - //qDebug() << "OctreeSendThread::~OctreeSendThread()... BEFORE _myAssignment.clear();"; - - //qDebug() << "OctreeSendThread::~OctreeSendThread()... DONE"; } void OctreeSendThread::setIsShuttingDown() { diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 11d0e0ca37..567e91157d 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -233,7 +233,10 @@ OctreeServer::OctreeServer(const QByteArray& packet) : _started(time(0)), _startedUSecs(usecTimestampNow()) { - assert(!_instance); // you should only ever have one instance at a time! + //assert(!_instance); // you should only ever have one instance at a time! + if (_instance) { + qDebug() << "Octree Server starting... while old instance still running _instance=["<<_instance<<"] this=[" << this << "]"; + } qDebug() << "Octree Server starting... setting _instance to=[" << this << "]"; _instance = this; @@ -268,7 +271,10 @@ OctreeServer::~OctreeServer() { delete _jurisdiction; _jurisdiction = NULL; - _instance = NULL; // we are gone + + if (_instance == this) { + _instance = NULL; // we are gone + } qDebug() << qPrintable(_safeServerName) << "server DONE shutting down... [" << this << "]"; } @@ -1065,14 +1071,34 @@ void OctreeServer::nodeKilled(SharedNodePointer node) { quint64 end = usecTimestampNow(); quint64 usecsElapsed = (end - start); - qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node << " took: " << usecsElapsed << " usecs"; + qDebug() << qPrintable(_safeServerName) << "server killed took: " << usecsElapsed << " usecs for node:" << *node; } +void OctreeServer::forceNodeShutdown(SharedNodePointer node) { + quint64 start = usecTimestampNow(); + + qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; + OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); + if (nodeData) { + qDebug() << qPrintable(_safeServerName) << "server calling nodeData->forceNodeShutdown() for node:" << *node; + nodeData->forceNodeShutdown(); // tell our node data and sending threads that we'd like to shut down + qDebug() << qPrintable(_safeServerName) << "server AFTER nodeData->forceNodeShutdown() for node:" << *node; + } else { + qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; + } + + quint64 end = usecTimestampNow(); + quint64 usecsElapsed = (end - start); + qDebug() << qPrintable(_safeServerName) << "server killed took: " << usecsElapsed << " usecs for node:" << *node; +} + + void OctreeServer::aboutToFinish() { qDebug() << qPrintable(_safeServerName) << "server STARTING about to finish..."; foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) { qDebug() << qPrintable(_safeServerName) << "server about to finish while node still connected node:" << *node; - nodeKilled(node); + + forceNodeShutdown(node); } qDebug() << qPrintable(_safeServerName) << "server ENDING about to finish..."; diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 63d43b6634..63a3341f55 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -115,6 +115,7 @@ public: bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url); virtual void aboutToFinish(); + void forceNodeShutdown(SharedNodePointer node); public slots: /// runs the voxel server assignment diff --git a/libraries/shared/src/ThreadedAssignment.cpp b/libraries/shared/src/ThreadedAssignment.cpp index eed5aa46f6..fdf2d91c36 100644 --- a/libraries/shared/src/ThreadedAssignment.cpp +++ b/libraries/shared/src/ThreadedAssignment.cpp @@ -74,10 +74,6 @@ void ThreadedAssignment::sendStatsPacket() { } void ThreadedAssignment::checkInWithDomainServerOrExit() { - qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit()... " - "Num No Reply Domain Check Ins=" << NodeList::getInstance()->getNumNoReplyDomainCheckIns() - << "MAX_SILENT_DOMAIN_SERVER_CHECK_INS=" << MAX_SILENT_DOMAIN_SERVER_CHECK_INS; - if (NodeList::getInstance()->getNumNoReplyDomainCheckIns() == MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { setFinished(true); } else { From 9df315d8896e1f2685495f03b3a7aabb16b31c55 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 31 Mar 2014 20:54:58 -0700 Subject: [PATCH 29/70] removed dead debug code --- assignment-client/src/octree/OctreeSendThread.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index e655acc400..48d45bbb55 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -28,8 +28,6 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, _nodeMissingCount(0), _isShuttingDown(false) { - //qDebug() << "OctreeSendThread::OctreeSendThread()... START"; - QString serverName("Octree"); if (_myServer) { serverName = _myServer->getMyServerName(); @@ -37,10 +35,7 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client connected " "- starting sending thread [" << this << "]"; - //qDebug() << "OctreeSendThread::OctreeSendThread()... before OctreeServer::clientConnected()"; OctreeServer::clientConnected(); - //qDebug() << "OctreeSendThread::OctreeSendThread()... AFTER OctreeServer::clientConnected()"; - //qDebug() << "OctreeSendThread::OctreeSendThread()... DONE"; } OctreeSendThread::~OctreeSendThread() { From 6ed9b968b08882fbebf0b2e6c8d5ced6642d6326 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 09:23:19 -0700 Subject: [PATCH 30/70] removed some extra debugging --- assignment-client/src/octree/OctreeQueryNode.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 642a34edd7..a20b3dad01 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -44,20 +44,12 @@ OctreeQueryNode::OctreeQueryNode() : OctreeQueryNode::~OctreeQueryNode() { _isShuttingDown = true; - const bool extraDebugging = true; - if (extraDebugging) { - qDebug() << "OctreeQueryNode::~OctreeQueryNode()"; - } - if (_octreeSendThread) { forceNodeShutdown(); } delete[] _octreePacket; delete[] _lastOctreePacket; - if (extraDebugging) { - qDebug() << "OctreeQueryNode::~OctreeQueryNode()... DONE..."; - } } void OctreeQueryNode::nodeKilled() { From 20d944a43b8ce7101db602589f8c15b0fdc0eee3 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 09:31:40 -0700 Subject: [PATCH 31/70] removed some debug --- assignment-client/src/octree/OctreeServer.cpp | 30 ++----------------- 1 file changed, 3 insertions(+), 27 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 567e91157d..06b3e6eeeb 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -826,34 +826,15 @@ void OctreeServer::readPendingDatagrams() { SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); if (packetType == getMyQueryMessageType()) { - bool debug = false; - if (debug) { - if (matchingNode) { - qDebug() << "Got PacketTypeVoxelQuery at" << usecTimestampNow() << "node:" << *matchingNode; - } else { - qDebug() << "Got PacketTypeVoxelQuery at" << usecTimestampNow() << "node: ??????"; - } - } - // If we got a PacketType_VOXEL_QUERY, then we're talking to an NodeType_t_AVATAR, and we // need to make sure we have it in our nodeList. if (matchingNode) { - if (debug) { - qDebug() << "calling updateNodeWithDataFromPacket()... node:" << *matchingNode; - } nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket); OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { - if (debug) { - qDebug() << "calling initializeOctreeSendThread()... node:" << *matchingNode; - } - - - qDebug() << "OctreeServer::readPendingDatagrams()... BEFORE nodeData->initializeOctreeSendThread()"; SharedAssignmentPointer sharedAssignment = AssignmentClient::getCurrentAssignment(); nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); - qDebug() << "OctreeServer::readPendingDatagrams()... AFTER nodeData->initializeOctreeSendThread()"; } } } else if (packetType == PacketTypeJurisdictionRequest) { @@ -1062,16 +1043,14 @@ void OctreeServer::nodeKilled(SharedNodePointer node) { qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); if (nodeData) { - qDebug() << qPrintable(_safeServerName) << "server calling nodeData->nodeKilled() for node:" << *node; nodeData->nodeKilled(); // tell our node data and sending threads that we'd like to shut down - qDebug() << qPrintable(_safeServerName) << "server AFTER nodeData->nodeKilled() for node:" << *node; } else { qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; } quint64 end = usecTimestampNow(); quint64 usecsElapsed = (end - start); - qDebug() << qPrintable(_safeServerName) << "server killed took: " << usecsElapsed << " usecs for node:" << *node; + qDebug() << qPrintable(_safeServerName) << "server nodeKilled() took: " << usecsElapsed << " usecs for node:" << *node; } void OctreeServer::forceNodeShutdown(SharedNodePointer node) { @@ -1080,16 +1059,15 @@ void OctreeServer::forceNodeShutdown(SharedNodePointer node) { qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); if (nodeData) { - qDebug() << qPrintable(_safeServerName) << "server calling nodeData->forceNodeShutdown() for node:" << *node; nodeData->forceNodeShutdown(); // tell our node data and sending threads that we'd like to shut down - qDebug() << qPrintable(_safeServerName) << "server AFTER nodeData->forceNodeShutdown() for node:" << *node; } else { qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; } quint64 end = usecTimestampNow(); quint64 usecsElapsed = (end - start); - qDebug() << qPrintable(_safeServerName) << "server killed took: " << usecsElapsed << " usecs for node:" << *node; + qDebug() << qPrintable(_safeServerName) << "server forceNodeShutdown() took: " + << usecsElapsed << " usecs for node:" << *node; } @@ -1097,10 +1075,8 @@ void OctreeServer::aboutToFinish() { qDebug() << qPrintable(_safeServerName) << "server STARTING about to finish..."; foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) { qDebug() << qPrintable(_safeServerName) << "server about to finish while node still connected node:" << *node; - forceNodeShutdown(node); } - qDebug() << qPrintable(_safeServerName) << "server ENDING about to finish..."; } From 21e0bc119b414efd0e956e0ac478e37ecc28a171 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 09:50:10 -0700 Subject: [PATCH 32/70] moved OctreeServer::stopTrackingThread() to destructor instead of setIsShuttingDown() --- assignment-client/src/octree/OctreeSendThread.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 48d45bbb55..70d6033e3e 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -48,13 +48,14 @@ OctreeSendThread::~OctreeSendThread() { "- ending sending thread [" << this << "]"; OctreeServer::clientDisconnected(); + OctreeServer::stopTrackingThread(this); + _node.clear(); _myAssignment.clear(); } void OctreeSendThread::setIsShuttingDown() { _isShuttingDown = true; - OctreeServer::stopTrackingThread(this); } From ff17c6a0717c6af6eca712efa965d69d7b1c88df Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 10:08:46 -0700 Subject: [PATCH 33/70] quiet some debugging --- assignment-client/src/octree/OctreeServer.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 06b3e6eeeb..bc823983e0 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -1040,17 +1040,20 @@ void OctreeServer::nodeAdded(SharedNodePointer node) { void OctreeServer::nodeKilled(SharedNodePointer node) { quint64 start = usecTimestampNow(); - qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; + //qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); if (nodeData) { nodeData->nodeKilled(); // tell our node data and sending threads that we'd like to shut down } else { - qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; + //qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; } quint64 end = usecTimestampNow(); quint64 usecsElapsed = (end - start); - qDebug() << qPrintable(_safeServerName) << "server nodeKilled() took: " << usecsElapsed << " usecs for node:" << *node; + if (usecsElapsed > 1000) { + qDebug() << qPrintable(_safeServerName) << "server nodeKilled() took: " << usecsElapsed << "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"; + // << " usecs for node:" << *node; + } } void OctreeServer::forceNodeShutdown(SharedNodePointer node) { From 64c7a6a4400f142166076dbe901c84c5f403237e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 10:25:32 -0700 Subject: [PATCH 34/70] testing, remove create sending thread and processing of query --- assignment-client/src/octree/OctreeServer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index bc823983e0..2a1db54924 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -826,6 +826,8 @@ void OctreeServer::readPendingDatagrams() { SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); if (packetType == getMyQueryMessageType()) { + + /** // If we got a PacketType_VOXEL_QUERY, then we're talking to an NodeType_t_AVATAR, and we // need to make sure we have it in our nodeList. if (matchingNode) { @@ -837,6 +839,7 @@ void OctreeServer::readPendingDatagrams() { nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); } } + **/ } else if (packetType == PacketTypeJurisdictionRequest) { _jurisdictionSender->queueReceivedPacket(matchingNode, receivedPacket); } else if (_octreeInboundPacketProcessor && getOctree()->handlesEditPacketType(packetType)) { @@ -1034,7 +1037,7 @@ void OctreeServer::run() { void OctreeServer::nodeAdded(SharedNodePointer node) { // we might choose to use this notifier to track clients in a pending state - qDebug() << qPrintable(_safeServerName) << "server added node:" << *node; + //qDebug() << qPrintable(_safeServerName) << "server added node:" << *node; } void OctreeServer::nodeKilled(SharedNodePointer node) { From ce8a599b16cd43d041a152d10495a68e890b8ec4 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 10:38:21 -0700 Subject: [PATCH 35/70] tweak --- assignment-client/src/octree/OctreeServer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 2a1db54924..2267f99201 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -827,7 +827,6 @@ void OctreeServer::readPendingDatagrams() { if (packetType == getMyQueryMessageType()) { - /** // If we got a PacketType_VOXEL_QUERY, then we're talking to an NodeType_t_AVATAR, and we // need to make sure we have it in our nodeList. if (matchingNode) { @@ -835,11 +834,12 @@ void OctreeServer::readPendingDatagrams() { OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { + /** SharedAssignmentPointer sharedAssignment = AssignmentClient::getCurrentAssignment(); nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); + **/ } } - **/ } else if (packetType == PacketTypeJurisdictionRequest) { _jurisdictionSender->queueReceivedPacket(matchingNode, receivedPacket); } else if (_octreeInboundPacketProcessor && getOctree()->handlesEditPacketType(packetType)) { From 9d757434ab9c7a719c22d120f726a870be956041 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 10:47:25 -0700 Subject: [PATCH 36/70] testing tweak --- assignment-client/src/octree/OctreeSendThread.cpp | 2 ++ assignment-client/src/octree/OctreeServer.cpp | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 70d6033e3e..ca7e835b8a 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -81,8 +81,10 @@ bool OctreeSendThread::process() { // Sometimes the node data has not yet been linked, in which case we can't really do anything if (nodeData && !nodeData->isShuttingDown()) { + /* bool viewFrustumChanged = nodeData->updateCurrentViewFrustum(); packetDistributor(nodeData, viewFrustumChanged); + */ } } } diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 2267f99201..b0a9a9b4de 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -834,10 +834,8 @@ void OctreeServer::readPendingDatagrams() { OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { - /** SharedAssignmentPointer sharedAssignment = AssignmentClient::getCurrentAssignment(); nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); - **/ } } } else if (packetType == PacketTypeJurisdictionRequest) { From 193e2372855b0baa2043ca8904d2b12c06ecf2ca Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 10:58:20 -0700 Subject: [PATCH 37/70] tweaks --- assignment-client/src/octree/OctreeSendThread.cpp | 2 -- assignment-client/src/octree/OctreeServer.cpp | 7 +++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index ca7e835b8a..70d6033e3e 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -81,10 +81,8 @@ bool OctreeSendThread::process() { // Sometimes the node data has not yet been linked, in which case we can't really do anything if (nodeData && !nodeData->isShuttingDown()) { - /* bool viewFrustumChanged = nodeData->updateCurrentViewFrustum(); packetDistributor(nodeData, viewFrustumChanged); - */ } } } diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index b0a9a9b4de..03f40c5b7b 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -1184,6 +1184,11 @@ QString OctreeServer::getStatusLink() { } void OctreeServer::sendStatsPacket() { + + static QJsonObject statsObject1; + ThreadedAssignment::addPacketStatsAndSendStatsPacket(statsObject1); + + /** // TODO: we have too many stats to fit in a single MTU... so for now, we break it into multiple JSON objects and // send them separately. What we really should do is change the NodeList::sendStatsToDomainServer() to handle the // the following features: @@ -1257,6 +1262,8 @@ void OctreeServer::sendStatsPacket() { (double)_octreeInboundPacketProcessor->getAverageLockWaitTimePerElement(); NodeList::getInstance()->sendStatsToDomainServer(statsObject3); + + **/ } QMap OctreeServer::_threadsDidProcess; From 9e445098f1ab696daabea04e57413acbfb3aa623 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 11:22:44 -0700 Subject: [PATCH 38/70] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 03f40c5b7b..259d9be954 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -813,7 +813,13 @@ void OctreeServer::parsePayload() { } } +quint64 lastReadPendingDatagrams = usecTimestampNow(); +quint64 lastProcessNodeData = usecTimestampNow(); + void OctreeServer::readPendingDatagrams() { + quint64 now = usecTimestampNow(); + qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; + QByteArray receivedPacket; HifiSockAddr senderSockAddr; @@ -843,6 +849,9 @@ void OctreeServer::readPendingDatagrams() { } else if (_octreeInboundPacketProcessor && getOctree()->handlesEditPacketType(packetType)) { _octreeInboundPacketProcessor->queueReceivedPacket(matchingNode, receivedPacket); } else { + quint64 now = usecTimestampNow(); + qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; + // let processNodeData handle it. NodeList::getInstance()->processNodeData(senderSockAddr, receivedPacket); } From 1aa05c4de5526ba3d9efda890b17287b254d17e5 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 11:26:55 -0700 Subject: [PATCH 39/70] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 259d9be954..332ab28807 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -819,6 +819,7 @@ quint64 lastProcessNodeData = usecTimestampNow(); void OctreeServer::readPendingDatagrams() { quint64 now = usecTimestampNow(); qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; + lastReadPendingDatagrams = now; QByteArray receivedPacket; HifiSockAddr senderSockAddr; @@ -851,6 +852,7 @@ void OctreeServer::readPendingDatagrams() { } else { quint64 now = usecTimestampNow(); qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; + lastProcessNodeData = now; // let processNodeData handle it. NodeList::getInstance()->processNodeData(senderSockAddr, receivedPacket); From 30ff4a1d19833f01088c3a3e276d6ca6cffde834 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 11:32:35 -0700 Subject: [PATCH 40/70] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 332ab28807..e598310470 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -818,7 +818,9 @@ quint64 lastProcessNodeData = usecTimestampNow(); void OctreeServer::readPendingDatagrams() { quint64 now = usecTimestampNow(); - qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; + if ((now - lastReadPendingDatagrams) > 100000) { + qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; + } lastReadPendingDatagrams = now; QByteArray receivedPacket; From 58a52cf5e18baeb431d969d8c92514ee4a98163a Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 11:45:29 -0700 Subject: [PATCH 41/70] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index e598310470..b46331e39d 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -832,14 +832,24 @@ void OctreeServer::readPendingDatagrams() { if (nodeList->packetVersionAndHashMatch(receivedPacket)) { PacketType packetType = packetTypeForPacket(receivedPacket); + quint64 startNodeLookup = usecTimestampNow(); SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); + quint64 endNodeLookup = usecTimestampNow(); + if ((endNodeLookup - startNodeLookup) > 100000) { + qDebug() << "OctreeServer::readPendingDatagrams(): sendingNodeForPacket() took" << (endNodeLookup - startNodeLookup) << "usecs"; + } if (packetType == getMyQueryMessageType()) { // If we got a PacketType_VOXEL_QUERY, then we're talking to an NodeType_t_AVATAR, and we // need to make sure we have it in our nodeList. if (matchingNode) { + quint64 startUpdateNode = usecTimestampNow(); nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket); + quint64 endUpdateNode = usecTimestampNow(); + if ((endUpdateNode - startUpdateNode) > 100000) { + qDebug() << "OctreeServer::readPendingDatagrams(): updateNodeWithDataFromPacket() took" << (endUpdateNode - startUpdateNode) << "usecs"; + } OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { @@ -857,7 +867,12 @@ void OctreeServer::readPendingDatagrams() { lastProcessNodeData = now; // let processNodeData handle it. + quint64 startProcessNodeData = usecTimestampNow(); NodeList::getInstance()->processNodeData(senderSockAddr, receivedPacket); + quint64 endProcessNodeData = usecTimestampNow(); + if ((endProcessNodeData - startProcessNodeData) > 100000) { + qDebug() << "OctreeServer::readPendingDatagrams(): processNodeData() took" << (endProcessNodeData - startProcessNodeData) << "usecs"; + } } } } From f5045696555c64c538101ecff4503400e4da855e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 11:49:49 -0700 Subject: [PATCH 42/70] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index b46331e39d..d38a654219 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -863,7 +863,9 @@ void OctreeServer::readPendingDatagrams() { _octreeInboundPacketProcessor->queueReceivedPacket(matchingNode, receivedPacket); } else { quint64 now = usecTimestampNow(); - qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; + if ((now - lastProcessNodeData) > 500000) { + qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; + } lastProcessNodeData = now; // let processNodeData handle it. From 916a5d2da07fb2052a5f5beffa81f35d5f1fd826 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 12:24:03 -0700 Subject: [PATCH 43/70] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index d38a654219..15beafa0c0 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -828,6 +828,7 @@ void OctreeServer::readPendingDatagrams() { NodeList* nodeList = NodeList::getInstance(); + quint64 startReadAvailable = usecTimestampNow(); while (readAvailableDatagram(receivedPacket, senderSockAddr)) { if (nodeList->packetVersionAndHashMatch(receivedPacket)) { PacketType packetType = packetTypeForPacket(receivedPacket); @@ -878,6 +879,9 @@ void OctreeServer::readPendingDatagrams() { } } } + quint64 endReadAvailable = usecTimestampNow(); + qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs"; + } void OctreeServer::run() { From 6cb44a4d0ca13c066fd7b5fea26fded32797697d Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 12:33:59 -0700 Subject: [PATCH 44/70] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 15beafa0c0..c3c6510982 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -880,7 +880,9 @@ void OctreeServer::readPendingDatagrams() { } } quint64 endReadAvailable = usecTimestampNow(); - qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs"; + if (endReadAvailable - startReadAvailable > 1000) { + qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs"; + } } From 124619f8d90fa57ecd52b842522e400f60483f0b Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 12:51:34 -0700 Subject: [PATCH 45/70] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index c3c6510982..0958e2fa20 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -829,7 +829,9 @@ void OctreeServer::readPendingDatagrams() { NodeList* nodeList = NodeList::getInstance(); quint64 startReadAvailable = usecTimestampNow(); + int readDataGrams = 0; while (readAvailableDatagram(receivedPacket, senderSockAddr)) { + readDataGrams++; if (nodeList->packetVersionAndHashMatch(receivedPacket)) { PacketType packetType = packetTypeForPacket(receivedPacket); @@ -881,7 +883,8 @@ void OctreeServer::readPendingDatagrams() { } quint64 endReadAvailable = usecTimestampNow(); if (endReadAvailable - startReadAvailable > 1000) { - qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs"; + qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs" + << " readDataGrams=" << readDataGrams; } } From b7695ba050b007e54b5240d3bc1617d0cd67c459 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 13:55:25 -0700 Subject: [PATCH 46/70] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 0958e2fa20..bb0424c27e 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -830,6 +830,18 @@ void OctreeServer::readPendingDatagrams() { quint64 startReadAvailable = usecTimestampNow(); int readDataGrams = 0; + + int queryPackets = 0; + int jurisdictionRequests = 0; + int editPackets = 0; + int nodeListPackets = 0; + + quint64 queryElapsed = 0; + quint64 jurisdictionElapsed = 0; + quint64 editElapsed = 0; + quint64 nodeListElapsed = 0; + + while (readAvailableDatagram(receivedPacket, senderSockAddr)) { readDataGrams++; if (nodeList->packetVersionAndHashMatch(receivedPacket)) { @@ -843,6 +855,8 @@ void OctreeServer::readPendingDatagrams() { } if (packetType == getMyQueryMessageType()) { + quint64 queryStart = usecTimestampNow(); + queryPackets++; // If we got a PacketType_VOXEL_QUERY, then we're talking to an NodeType_t_AVATAR, and we // need to make sure we have it in our nodeList. @@ -860,11 +874,24 @@ void OctreeServer::readPendingDatagrams() { nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); } } + quint64 queryEnd = usecTimestampNow(); + queryElapsed += (queryEnd - queryStart); } else if (packetType == PacketTypeJurisdictionRequest) { + quint64 jurisdictionStart = usecTimestampNow(); + jurisdictionRequests++; _jurisdictionSender->queueReceivedPacket(matchingNode, receivedPacket); + quint64 jurisdictionEnd = usecTimestampNow(); + jurisdictionElapsed += (jurisdictionEnd - jurisdictionStart); } else if (_octreeInboundPacketProcessor && getOctree()->handlesEditPacketType(packetType)) { + quint64 editStart = usecTimestampNow(); + editPackets++; _octreeInboundPacketProcessor->queueReceivedPacket(matchingNode, receivedPacket); + quint64 editEnd = usecTimestampNow(); + editElapsed += (editEnd - editStart); } else { + quint64 nodeListStart = usecTimestampNow(); + + nodeListPackets++; quint64 now = usecTimestampNow(); if ((now - lastProcessNodeData) > 500000) { qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; @@ -878,13 +905,26 @@ void OctreeServer::readPendingDatagrams() { if ((endProcessNodeData - startProcessNodeData) > 100000) { qDebug() << "OctreeServer::readPendingDatagrams(): processNodeData() took" << (endProcessNodeData - startProcessNodeData) << "usecs"; } + + quint64 nodeListEnd = usecTimestampNow(); + nodeListElapsed += (nodeListEnd - nodeListStart); } } } quint64 endReadAvailable = usecTimestampNow(); if (endReadAvailable - startReadAvailable > 1000) { qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs" - << " readDataGrams=" << readDataGrams; + << " readDataGrams=" << readDataGrams + << " nodeListPackets=" << nodeListPackets + << " editPackets=" << editPackets + << " jurisdictionRequests=" << jurisdictionRequests + << " queryPackets=" << queryPackets; + + qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs" + << " nodeListElapsed=" << nodeListElapsed + << " editElapsed=" << editElapsed + << " jurisdictionElapsed=" << jurisdictionElapsed + << " queryElapsed=" << queryElapsed; } } From 97b2e689881a591658048b6446b749514b3f5f33 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 14:05:05 -0700 Subject: [PATCH 47/70] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index bb0424c27e..4ead1705fa 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -840,16 +840,26 @@ void OctreeServer::readPendingDatagrams() { quint64 jurisdictionElapsed = 0; quint64 editElapsed = 0; quint64 nodeListElapsed = 0; + quint64 versionMatchElapsed = 0; + quint64 matchingElapsed = 0; while (readAvailableDatagram(receivedPacket, senderSockAddr)) { readDataGrams++; - if (nodeList->packetVersionAndHashMatch(receivedPacket)) { + + quint64 versionMatchStart = usecTimestampNow(); + bool matches = nodeList->packetVersionAndHashMatch(receivedPacket); + quint64 versionMatchEnd = usecTimestampNow(); + versionMatchElapsed += (versionMatchEnd - versionMatchStart); + + if (matches) { PacketType packetType = packetTypeForPacket(receivedPacket); quint64 startNodeLookup = usecTimestampNow(); SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); quint64 endNodeLookup = usecTimestampNow(); + matchingElapsed += (endNodeLookup - startNodeLookup); + if ((endNodeLookup - startNodeLookup) > 100000) { qDebug() << "OctreeServer::readPendingDatagrams(): sendingNodeForPacket() took" << (endNodeLookup - startNodeLookup) << "usecs"; } @@ -924,7 +934,9 @@ void OctreeServer::readPendingDatagrams() { << " nodeListElapsed=" << nodeListElapsed << " editElapsed=" << editElapsed << " jurisdictionElapsed=" << jurisdictionElapsed - << " queryElapsed=" << queryElapsed; + << " queryElapsed=" << queryElapsed + << " versionMatchElapsed=" << versionMatchElapsed + << " matchingElapsed=" << matchingElapsed; } } From 5325453c89669dbfff10d36bee7dcb80abb204dd Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 14:39:59 -0700 Subject: [PATCH 48/70] more debugging --- libraries/shared/src/NodeList.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 879377a2fd..ff835771cb 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -135,7 +135,8 @@ bool NodeList::packetVersionAndHashMatch(const QByteArray& packet) { << PacketTypeDomainServerAuthRequest << PacketTypeDomainConnectRequest << PacketTypeStunResponse << PacketTypeDataServerConfirm << PacketTypeDataServerGet << PacketTypeDataServerPut << PacketTypeDataServerSend - << PacketTypeCreateAssignment << PacketTypeRequestAssignment; + << PacketTypeCreateAssignment << PacketTypeRequestAssignment + << PacketTypeVoxelQuery << PacketTypeParticleQuery; if (!NON_VERIFIED_PACKETS.contains(checkType)) { // figure out which node this is from From bef5677e91705c3c5b8b28dcd981b7e715cc5ad2 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 14:51:19 -0700 Subject: [PATCH 49/70] more debugging --- libraries/shared/src/ThreadedAssignment.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libraries/shared/src/ThreadedAssignment.cpp b/libraries/shared/src/ThreadedAssignment.cpp index fdf2d91c36..0269edd193 100644 --- a/libraries/shared/src/ThreadedAssignment.cpp +++ b/libraries/shared/src/ThreadedAssignment.cpp @@ -11,6 +11,7 @@ #include #include "Logging.h" +#include "SharedUtil.h" #include "ThreadedAssignment.h" ThreadedAssignment::ThreadedAssignment(const QByteArray& packet) : @@ -73,7 +74,14 @@ void ThreadedAssignment::sendStatsPacket() { addPacketStatsAndSendStatsPacket(statsObject); } +quint64 lastCheckIn = usecTimestampNow(); void ThreadedAssignment::checkInWithDomainServerOrExit() { + quint64 now = usecTimestampNow(); + if ((now - lastCheckIn) > 100000) { + qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit(): since lastCheckIn=" << (now - lastCheckIn) << "usecs"; + } + lastCheckIn = now; + if (NodeList::getInstance()->getNumNoReplyDomainCheckIns() == MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { setFinished(true); } else { From 5b7ab1e49a20d81699377cdbdb9aff71a7cf07c1 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 1 Apr 2014 14:59:52 -0700 Subject: [PATCH 50/70] more debugging --- libraries/shared/src/NodeList.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index ff835771cb..db625d416a 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -924,6 +924,7 @@ void NodeList::resetPacketStats() { } void NodeList::removeSilentNodes() { + quint64 removeSilentNodesStart = usecTimestampNow(); _nodeHashMutex.lock(); @@ -946,6 +947,12 @@ void NodeList::removeSilentNodes() { } _nodeHashMutex.unlock(); + + quint64 removeSilentNodesEnd = usecTimestampNow(); + quint64 removeSilentNodesElapsed = (removeSilentNodesEnd - removeSilentNodesStart); + if (removeSilentNodesElapsed > 100000) { + qDebug() << "removeSilentNodesElapsed="< Date: Tue, 1 Apr 2014 20:14:38 -0700 Subject: [PATCH 51/70] more debugging --- assignment-client/src/octree/OctreeServer.cpp | 26 ++++++++++++++++++- libraries/shared/src/NodeList.cpp | 3 +++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 4ead1705fa..0a23019bef 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -205,11 +205,16 @@ void OctreeServer::trackProcessWaitTime(float time) { } void OctreeServer::attachQueryNodeToNode(Node* newNode) { + quint64 start = usecTimestampNow(); if (!newNode->getLinkedData() && _instance) { OctreeQueryNode* newQueryNodeData = _instance->createOctreeQueryNode(); newQueryNodeData->init(); newNode->setLinkedData(newQueryNodeData); } + quint64 end = usecTimestampNow(); + if (end - start > 1000) { + qDebug() << "OctreeServer::attachQueryNodeToNode() took:" << (end - start); + } } OctreeServer::OctreeServer(const QByteArray& packet) : @@ -243,6 +248,21 @@ OctreeServer::OctreeServer(const QByteArray& packet) : _averageLoopTime.updateAverage(0); qDebug() << "Octree server starting... [" << this << "]"; + + + QTimer* timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), SLOT(doNothing())); + timer->start(0); + +} + +quint64 lastNothing = usecTimestampNow(); +void OctreeServer::doNothing() { + quint64 now = usecTimestampNow(); + if (now - lastNothing > 100) { + qDebug() << "since last doNothing:" << (now - lastNothing); + } + lastNothing = now; } OctreeServer::~OctreeServer() { @@ -1275,9 +1295,13 @@ QString OctreeServer::getStatusLink() { } void OctreeServer::sendStatsPacket() { - + quint64 start = usecTimestampNow(); static QJsonObject statsObject1; ThreadedAssignment::addPacketStatsAndSendStatsPacket(statsObject1); + quint64 end = usecTimestampNow(); + if (end - start > 1000) { + qDebug() << "OctreeServer::sendStatsPacket() took:" << (end - start); + } /** // TODO: we have too many stats to fit in a single MTU... so for now, we break it into multiple JSON objects and diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index db625d416a..1e93ebf56e 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -923,8 +923,11 @@ void NodeList::resetPacketStats() { _packetStatTimer.restart(); } +quint64 lastSilentNodesStart = usecTimestampNow(); void NodeList::removeSilentNodes() { quint64 removeSilentNodesStart = usecTimestampNow(); + qDebug() << "since last removeSilentNodes()..." << (lastSilentNodesStart - removeSilentNodesStart); + lastSilentNodesStart = removeSilentNodesStart; _nodeHashMutex.lock(); From 50f7db8fe167c07bf01d1a6ff403443d1281f6db Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 18 Apr 2014 15:02:10 -0700 Subject: [PATCH 52/70] quiet some debugging --- assignment-client/src/octree/OctreeServer.cpp | 15 ++++++++++----- assignment-client/src/octree/OctreeServer.h | 1 + libraries/networking/src/ThreadedAssignment.cpp | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index e878959e51..1a593f3be7 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -253,9 +253,11 @@ OctreeServer::OctreeServer(const QByteArray& packet) : qDebug() << "Octree server starting... [" << this << "]"; + /* QTimer* timer = new QTimer(this); connect(timer, SIGNAL(timeout()), SLOT(doNothing())); timer->start(0); + */ } @@ -842,7 +844,7 @@ quint64 lastProcessNodeData = usecTimestampNow(); void OctreeServer::readPendingDatagrams() { quint64 now = usecTimestampNow(); if ((now - lastReadPendingDatagrams) > 100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; + //qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; } lastReadPendingDatagrams = now; @@ -884,10 +886,13 @@ void OctreeServer::readPendingDatagrams() { matchingElapsed += (endNodeLookup - startNodeLookup); if ((endNodeLookup - startNodeLookup) > 100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): sendingNodeForPacket() took" << (endNodeLookup - startNodeLookup) << "usecs"; + //qDebug() << "OctreeServer::readPendingDatagrams(): sendingNodeForPacket() took" << (endNodeLookup - startNodeLookup) << "usecs"; } if (packetType == getMyQueryMessageType()) { + +qDebug() << "got a query..."; + quint64 queryStart = usecTimestampNow(); queryPackets++; @@ -898,7 +903,7 @@ void OctreeServer::readPendingDatagrams() { nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket); quint64 endUpdateNode = usecTimestampNow(); if ((endUpdateNode - startUpdateNode) > 100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): updateNodeWithDataFromPacket() took" << (endUpdateNode - startUpdateNode) << "usecs"; + //qDebug() << "OctreeServer::readPendingDatagrams(): updateNodeWithDataFromPacket() took" << (endUpdateNode - startUpdateNode) << "usecs"; } OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); @@ -927,7 +932,7 @@ void OctreeServer::readPendingDatagrams() { nodeListPackets++; quint64 now = usecTimestampNow(); if ((now - lastProcessNodeData) > 500000) { - qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; + //qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; } lastProcessNodeData = now; @@ -936,7 +941,7 @@ void OctreeServer::readPendingDatagrams() { NodeList::getInstance()->processNodeData(senderSockAddr, receivedPacket); quint64 endProcessNodeData = usecTimestampNow(); if ((endProcessNodeData - startProcessNodeData) > 100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): processNodeData() took" << (endProcessNodeData - startProcessNodeData) << "usecs"; + //qDebug() << "OctreeServer::readPendingDatagrams(): processNodeData() took" << (endProcessNodeData - startProcessNodeData) << "usecs"; } quint64 nodeListEnd = usecTimestampNow(); diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index d7139b5c3d..7427ee0dbe 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -126,6 +126,7 @@ public slots: void nodeAdded(SharedNodePointer node); void nodeKilled(SharedNodePointer node); void sendStatsPacket(); + void doNothing(); protected: void parsePayload(); diff --git a/libraries/networking/src/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index 3b00a6a620..528c0b0ff3 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -81,7 +81,7 @@ quint64 lastCheckIn = usecTimestampNow(); void ThreadedAssignment::checkInWithDomainServerOrExit() { quint64 now = usecTimestampNow(); if ((now - lastCheckIn) > 100000) { - qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit(): since lastCheckIn=" << (now - lastCheckIn) << "usecs"; + //qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit(): since lastCheckIn=" << (now - lastCheckIn) << "usecs"; } lastCheckIn = now; From 334f688e4ee591a58e20618debc447ea9b8d3a40 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 18 Apr 2014 15:30:45 -0700 Subject: [PATCH 53/70] add support for sending unverified datagrams to nodes --- interface/src/Application.cpp | 2 +- libraries/networking/src/LimitedNodeList.cpp | 29 ++++++++++++++++++++ libraries/networking/src/LimitedNodeList.h | 7 +++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b01b694662..a1fffff78f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2205,7 +2205,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node int packetLength = endOfQueryPacket - queryPacket; // make sure we still have an active socket - nodeList->writeDatagram(reinterpret_cast(queryPacket), packetLength, node); + nodeList->writeUnverifiedDatagram(reinterpret_cast(queryPacket), packetLength, node); // Feed number of bytes to corresponding channel of the bandwidth meter _bandwidthMeter.outputStream(BandwidthMeter::VOXELS).updateValue(packetLength); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index db8a689001..2c7ab2f5a8 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -234,6 +234,30 @@ qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const SharedNo return 0; } +qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, + const HifiSockAddr& overridenSockAddr) { + if (destinationNode) { + // if we don't have an ovveriden address, assume they want to send to the node's active socket + const HifiSockAddr* destinationSockAddr = &overridenSockAddr; + if (overridenSockAddr.isNull()) { + if (destinationNode->getActiveSocket()) { + // use the node's active socket as the destination socket + destinationSockAddr = destinationNode->getActiveSocket(); + } else { + // we don't have a socket to send to, return 0 + return 0; + } + } + + + // don't use the node secret! + writeDatagram(datagram, *destinationSockAddr, QUuid()); + } + + // didn't have a destinationNode to send to, return 0 + return 0; +} + qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr) { return writeDatagram(datagram, destinationSockAddr, QUuid()); } @@ -243,6 +267,11 @@ qint64 LimitedNodeList::writeDatagram(const char* data, qint64 size, const Share return writeDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); } +qint64 LimitedNodeList::writeUnverifiedDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, + const HifiSockAddr& overridenSockAddr) { + return writeUnverifiedDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); +} + void LimitedNodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteArray& packet) { // the node decided not to do anything with this packet // if it comes from a known source we should keep that node alive diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index ea9cb42436..2a98dc536f 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -66,10 +66,17 @@ public: qint64 writeDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, const HifiSockAddr& overridenSockAddr = HifiSockAddr()); + + qint64 writeUnverifiedDatagram(const QByteArray& datagram, const SharedNodePointer& destinationNode, + const HifiSockAddr& overridenSockAddr = HifiSockAddr()); + qint64 writeUnverifiedDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr); qint64 writeDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, const HifiSockAddr& overridenSockAddr = HifiSockAddr()); + qint64 writeUnverifiedDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode, + const HifiSockAddr& overridenSockAddr = HifiSockAddr()); + void(*linkedDataCreateCallback)(Node *); NodeHash getNodeHash(); From c2bcb328049fa0fc331fdbd4938f5b5c252d7431 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 18 Apr 2014 15:33:27 -0700 Subject: [PATCH 54/70] add support for sending unverified datagrams to nodes --- libraries/octree/src/OctreeHeadlessViewer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/octree/src/OctreeHeadlessViewer.cpp b/libraries/octree/src/OctreeHeadlessViewer.cpp index b25cb4ff8a..5574b376cb 100644 --- a/libraries/octree/src/OctreeHeadlessViewer.cpp +++ b/libraries/octree/src/OctreeHeadlessViewer.cpp @@ -221,7 +221,7 @@ void OctreeHeadlessViewer::queryOctree() { int packetLength = endOfQueryPacket - queryPacket; // make sure we still have an active socket - nodeList->writeDatagram(reinterpret_cast(queryPacket), packetLength, node); + nodeList->writeUnverifiedDatagram(reinterpret_cast(queryPacket), packetLength, node); } } } From 59cbda20c67432858d837b1b518cb702e8679504 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sun, 20 Apr 2014 19:48:17 -0700 Subject: [PATCH 55/70] added some threading and event debugging --- assignment-client/src/AssignmentClient.cpp | 11 +++++++++++ assignment-client/src/octree/OctreeServer.cpp | 19 +++++++++++++++++++ assignment-client/src/octree/OctreeServer.h | 2 ++ .../networking/src/ThreadedAssignment.cpp | 8 ++++++++ 4 files changed, 40 insertions(+) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index d60885e2a7..e4b38258f0 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -17,11 +17,13 @@ #include #include +#include #include #include #include #include + #include "AssignmentFactory.h" #include "AssignmentThread.h" @@ -144,6 +146,11 @@ void AssignmentClient::readPendingDatagrams() { // start the deployed assignment AssignmentThread* workerThread = new AssignmentThread(_currentAssignment, this); + qDebug() << "workerThread->eventDispatcher()=" << workerThread->eventDispatcher(); + qDebug() << "thread()->eventDispatcher()=" << thread()->eventDispatcher(); + + //DebuggingEventDispatcher* debugDispatcher = new DebuggingEventDispatcher(workerThread); + connect(workerThread, &QThread::started, _currentAssignment.data(), &ThreadedAssignment::run); connect(_currentAssignment.data(), &ThreadedAssignment::finished, workerThread, &QThread::quit); connect(_currentAssignment.data(), &ThreadedAssignment::finished, @@ -162,6 +169,10 @@ void AssignmentClient::readPendingDatagrams() { // Starts an event loop, and emits workerThread->started() workerThread->start(); + + qDebug() << "workerThread->eventDispatcher()=" << workerThread->eventDispatcher(); + qDebug() << "thread()->eventDispatcher()=" << thread()->eventDispatcher(); + } else { qDebug() << "Received an assignment that could not be unpacked. Re-requesting."; } diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 1a593f3be7..24d179b707 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -9,6 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include #include #include #include @@ -842,6 +843,9 @@ quint64 lastReadPendingDatagrams = usecTimestampNow(); quint64 lastProcessNodeData = usecTimestampNow(); void OctreeServer::readPendingDatagrams() { + qDebug() << "OctreeServer::readPendingDatagrams()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); + + quint64 now = usecTimestampNow(); if ((now - lastReadPendingDatagrams) > 100000) { //qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; @@ -969,7 +973,22 @@ qDebug() << "got a query..."; } +void OctreeServer::aboutToBlock() { + qDebug() << "OctreeServer::aboutToBlock()..."; +} + +void OctreeServer::awake() { + qDebug() << "OctreeServer::awake()..."; +} + void OctreeServer::run() { + + QAbstractEventDispatcher* eventDispatcher = thread()->eventDispatcher(); + qDebug() << "OctreeServer::run()... thread()->eventDispatcher()=" << eventDispatcher; + + connect(eventDispatcher, &QAbstractEventDispatcher::aboutToBlock, this, &OctreeServer::aboutToBlock); + connect(eventDispatcher, &QAbstractEventDispatcher::awake, this, &OctreeServer::awake); + _safeServerName = getMyServerName(); // Before we do anything else, create our tree... diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 7427ee0dbe..1b57f3e63d 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -127,6 +127,8 @@ public slots: void nodeKilled(SharedNodePointer node); void sendStatsPacket(); void doNothing(); + void awake(); + void aboutToBlock(); protected: void parsePayload(); diff --git a/libraries/networking/src/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index 528c0b0ff3..d3de3cdd74 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include "Logging.h" #include "SharedUtil.h" @@ -57,6 +58,9 @@ void ThreadedAssignment::commonInit(const QString& targetName, NodeType_t nodeTy connect(statsTimer, &QTimer::timeout, this, &ThreadedAssignment::sendStatsPacket); statsTimer->start(1000); } + + qDebug() << "ThreadedAssignment::commonInit()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); + } void ThreadedAssignment::addPacketStatsAndSendStatsPacket(QJsonObject &statsObject) { @@ -79,6 +83,10 @@ void ThreadedAssignment::sendStatsPacket() { quint64 lastCheckIn = usecTimestampNow(); void ThreadedAssignment::checkInWithDomainServerOrExit() { + + qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); + + quint64 now = usecTimestampNow(); if ((now - lastCheckIn) > 100000) { //qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit(): since lastCheckIn=" << (now - lastCheckIn) << "usecs"; From ffc73e04ebdcbf2638ff56900ffacac1ee4a3e80 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 11:48:42 -0700 Subject: [PATCH 56/70] added new load testing example script --- examples/testingVoxelViewerRestart.js | 93 +++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 examples/testingVoxelViewerRestart.js diff --git a/examples/testingVoxelViewerRestart.js b/examples/testingVoxelViewerRestart.js new file mode 100644 index 0000000000..309f970cd8 --- /dev/null +++ b/examples/testingVoxelViewerRestart.js @@ -0,0 +1,93 @@ +// +// seeingVoxelsExample.js +// hifi +// +// Created by Brad Hefta-Gaub on 2/26/14 +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. +// +// This is an example script +// + +var count = 0; +var yawDirection = -1; +var yaw = 45; +var yawMax = 70; +var yawMin = 20; +var vantagePoint = {x: 5000, y: 500, z: 5000}; + +var isLocal = false; + +// set up our VoxelViewer with a position and orientation +var orientation = Quat.fromPitchYawRollDegrees(0, yaw, 0); + +function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +function init() { + if (isLocal) { + MyAvatar.position = vantagePoint; + MyAvatar.orientation = orientation; + } else { + VoxelViewer.setPosition(vantagePoint); + VoxelViewer.setOrientation(orientation); + VoxelViewer.queryOctree(); + Agent.isAvatar = true; + } +} + +function keepLooking(deltaTime) { + //print("count =" + count); + + if (count == 0) { + init(); + } + count++; + if (count % getRandomInt(5, 15) == 0) { + yaw += yawDirection; + orientation = Quat.fromPitchYawRollDegrees(0, yaw, 0); + if (yaw > yawMax || yaw < yawMin) { + yawDirection = yawDirection * -1; + } + + //if (count % 10000 == 0) { + // print("calling VoxelViewer.queryOctree()... count=" + count + " yaw=" + yaw); + //} + + if (isLocal) { + MyAvatar.orientation = orientation; + } else { + VoxelViewer.setOrientation(orientation); + VoxelViewer.queryOctree(); + + //if (count % 10000 == 0) { + // print("VoxelViewer.getOctreeElementsCount()=" + VoxelViewer.getOctreeElementsCount()); + //} + } + } + + // approximately every second, consider stopping + if (count % 60 == 0) { + print("considering stop.... elementCount:" + VoxelViewer.getOctreeElementsCount()); + var stopProbability = 0.05; // 5% chance of stopping + if (Math.random() < stopProbability) { + print("stopping.... elementCount:" + VoxelViewer.getOctreeElementsCount()); + Script.stop(); + } + } +} + +function scriptEnding() { + print("SCRIPT ENDNG!!!\n"); +} + +// register the call back so it fires before each data send +Script.update.connect(keepLooking); + +// register our scriptEnding callback +Script.scriptEnding.connect(scriptEnding); + + +// test for local... +Menu.isOptionChecked("Voxels"); +isLocal = true; // will only get here on local client From 7798c6eb09f41e5a19482e10a8b0e14c8cf04bcd Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 11:48:58 -0700 Subject: [PATCH 57/70] some debugging --- assignment-client/src/octree/OctreeServer.cpp | 38 +++++++++++-------- .../networking/src/ThreadedAssignment.cpp | 8 ++-- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 24d179b707..a73701d695 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -843,12 +843,14 @@ quint64 lastReadPendingDatagrams = usecTimestampNow(); quint64 lastProcessNodeData = usecTimestampNow(); void OctreeServer::readPendingDatagrams() { - qDebug() << "OctreeServer::readPendingDatagrams()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); + //qDebug() << "OctreeServer::readPendingDatagrams()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); quint64 now = usecTimestampNow(); - if ((now - lastReadPendingDatagrams) > 100000) { - //qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; + + // more than 1.1 second is probably a problem + if ((now - lastReadPendingDatagrams) > 1100000) { + qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; } lastReadPendingDatagrams = now; @@ -890,13 +892,11 @@ void OctreeServer::readPendingDatagrams() { matchingElapsed += (endNodeLookup - startNodeLookup); if ((endNodeLookup - startNodeLookup) > 100000) { - //qDebug() << "OctreeServer::readPendingDatagrams(): sendingNodeForPacket() took" << (endNodeLookup - startNodeLookup) << "usecs"; + qDebug() << "OctreeServer::readPendingDatagrams(): sendingNodeForPacket() took" << (endNodeLookup - startNodeLookup) << "usecs"; } if (packetType == getMyQueryMessageType()) { -qDebug() << "got a query..."; - quint64 queryStart = usecTimestampNow(); queryPackets++; @@ -907,7 +907,7 @@ qDebug() << "got a query..."; nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket); quint64 endUpdateNode = usecTimestampNow(); if ((endUpdateNode - startUpdateNode) > 100000) { - //qDebug() << "OctreeServer::readPendingDatagrams(): updateNodeWithDataFromPacket() took" << (endUpdateNode - startUpdateNode) << "usecs"; + qDebug() << "OctreeServer::readPendingDatagrams(): updateNodeWithDataFromPacket() took" << (endUpdateNode - startUpdateNode) << "usecs"; } OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); @@ -935,8 +935,10 @@ qDebug() << "got a query..."; nodeListPackets++; quint64 now = usecTimestampNow(); - if ((now - lastProcessNodeData) > 500000) { - //qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; + + // more than 1.1 second is probably a problem + if ((now - lastProcessNodeData) > 1100000) { + qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; } lastProcessNodeData = now; @@ -945,7 +947,7 @@ qDebug() << "got a query..."; NodeList::getInstance()->processNodeData(senderSockAddr, receivedPacket); quint64 endProcessNodeData = usecTimestampNow(); if ((endProcessNodeData - startProcessNodeData) > 100000) { - //qDebug() << "OctreeServer::readPendingDatagrams(): processNodeData() took" << (endProcessNodeData - startProcessNodeData) << "usecs"; + qDebug() << "OctreeServer::readPendingDatagrams(): processNodeData() took" << (endProcessNodeData - startProcessNodeData) << "usecs"; } quint64 nodeListEnd = usecTimestampNow(); @@ -974,11 +976,17 @@ qDebug() << "got a query..."; } void OctreeServer::aboutToBlock() { - qDebug() << "OctreeServer::aboutToBlock()..."; + const bool wantDebug = false; + if (wantDebug) { + qDebug() << "OctreeServer::aboutToBlock()..."; + } } void OctreeServer::awake() { - qDebug() << "OctreeServer::awake()..."; + const bool wantDebug = false; + if (wantDebug) { + qDebug() << "OctreeServer::awake()..."; + } } void OctreeServer::run() { @@ -1322,6 +1330,8 @@ QString OctreeServer::getStatusLink() { } void OctreeServer::sendStatsPacket() { + + /* quint64 start = usecTimestampNow(); static QJsonObject statsObject1; ThreadedAssignment::addPacketStatsAndSendStatsPacket(statsObject1); @@ -1329,8 +1339,8 @@ void OctreeServer::sendStatsPacket() { if (end - start > 1000) { qDebug() << "OctreeServer::sendStatsPacket() took:" << (end - start); } + */ - /** // TODO: we have too many stats to fit in a single MTU... so for now, we break it into multiple JSON objects and // send them separately. What we really should do is change the NodeList::sendStatsToDomainServer() to handle the // the following features: @@ -1404,8 +1414,6 @@ void OctreeServer::sendStatsPacket() { (double)_octreeInboundPacketProcessor->getAverageLockWaitTimePerElement(); NodeList::getInstance()->sendStatsToDomainServer(statsObject3); - - **/ } QMap OctreeServer::_threadsDidProcess; diff --git a/libraries/networking/src/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index d3de3cdd74..ebb1435e63 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -59,7 +59,7 @@ void ThreadedAssignment::commonInit(const QString& targetName, NodeType_t nodeTy statsTimer->start(1000); } - qDebug() << "ThreadedAssignment::commonInit()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); + //qDebug() << "ThreadedAssignment::commonInit()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); } @@ -84,12 +84,12 @@ void ThreadedAssignment::sendStatsPacket() { quint64 lastCheckIn = usecTimestampNow(); void ThreadedAssignment::checkInWithDomainServerOrExit() { - qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); + //qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); quint64 now = usecTimestampNow(); - if ((now - lastCheckIn) > 100000) { - //qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit(): since lastCheckIn=" << (now - lastCheckIn) << "usecs"; + if ((now - lastCheckIn) > 1100000) { + qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit(): since lastCheckIn=" << (now - lastCheckIn) << "usecs"; } lastCheckIn = now; From 14e1fa269a78c50454b9b8e3b9eab4d2b7eaeca8 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 13:28:03 -0700 Subject: [PATCH 58/70] cleanup --- assignment-client/src/AssignmentClient.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index e4b38258f0..ff876596b0 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -17,7 +17,6 @@ #include #include -#include #include #include #include @@ -146,11 +145,6 @@ void AssignmentClient::readPendingDatagrams() { // start the deployed assignment AssignmentThread* workerThread = new AssignmentThread(_currentAssignment, this); - qDebug() << "workerThread->eventDispatcher()=" << workerThread->eventDispatcher(); - qDebug() << "thread()->eventDispatcher()=" << thread()->eventDispatcher(); - - //DebuggingEventDispatcher* debugDispatcher = new DebuggingEventDispatcher(workerThread); - connect(workerThread, &QThread::started, _currentAssignment.data(), &ThreadedAssignment::run); connect(_currentAssignment.data(), &ThreadedAssignment::finished, workerThread, &QThread::quit); connect(_currentAssignment.data(), &ThreadedAssignment::finished, @@ -169,10 +163,6 @@ void AssignmentClient::readPendingDatagrams() { // Starts an event loop, and emits workerThread->started() workerThread->start(); - - qDebug() << "workerThread->eventDispatcher()=" << workerThread->eventDispatcher(); - qDebug() << "thread()->eventDispatcher()=" << thread()->eventDispatcher(); - } else { qDebug() << "Received an assignment that could not be unpacked. Re-requesting."; } From 9a63fa7550b168220290d7972d4ab000d588f501 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 13:36:13 -0700 Subject: [PATCH 59/70] some cleanup --- assignment-client/src/octree/OctreeSendThread.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 71dc819844..d8a9f3d1ea 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -32,23 +32,23 @@ OctreeSendThread::OctreeSendThread(const SharedAssignmentPointer& myAssignment, _nodeMissingCount(0), _isShuttingDown(false) { - QString serverName("Octree"); + QString safeServerName("Octree"); if (_myServer) { - serverName = _myServer->getMyServerName(); + safeServerName = _myServer->getMyServerName(); } - qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client connected " + qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client connected " "- starting sending thread [" << this << "]"; OctreeServer::clientConnected(); } OctreeSendThread::~OctreeSendThread() { - QString serverName("Octree"); + QString safeServerName("Octree"); if (_myServer) { - serverName = _myServer->getMyServerName(); + safeServerName = _myServer->getMyServerName(); } - qDebug() << qPrintable(serverName) << "server [" << _myServer << "]: client disconnected " + qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client disconnected " "- ending sending thread [" << this << "]"; OctreeServer::clientDisconnected(); From 75f079e2b37a8162a697c7578d18e4b0e9593c75 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 14:15:13 -0700 Subject: [PATCH 60/70] tweak debugging --- assignment-client/src/octree/OctreeServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index a73701d695..cf0cf725a9 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -956,7 +956,7 @@ void OctreeServer::readPendingDatagrams() { } } quint64 endReadAvailable = usecTimestampNow(); - if (endReadAvailable - startReadAvailable > 1000) { + if (endReadAvailable - startReadAvailable > 500000) { qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs" << " readDataGrams=" << readDataGrams << " nodeListPackets=" << nodeListPackets From 7a8a8e2fac32cf5dfc173f31438f266b1b573f55 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 15:14:06 -0700 Subject: [PATCH 61/70] delete tree on server shutdown --- assignment-client/src/octree/OctreeServer.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index cf0cf725a9..4f435cd371 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -298,6 +298,12 @@ OctreeServer::~OctreeServer() { delete _jurisdiction; _jurisdiction = NULL; + // cleanup our tree here... + qDebug() << qPrintable(_safeServerName) << "server cleaning up octree... [" << this << "]"; + delete _tree; + _tree = NULL; + qDebug() << qPrintable(_safeServerName) << "server DONE cleaning up octree... [" << this << "]"; + if (_instance == this) { _instance = NULL; // we are gone } From a473fe3aee736e0e282e5cd5eb83459d902c81ae Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 15:14:14 -0700 Subject: [PATCH 62/70] fix header --- examples/testingVoxelViewerRestart.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/testingVoxelViewerRestart.js b/examples/testingVoxelViewerRestart.js index 309f970cd8..4fbdee1223 100644 --- a/examples/testingVoxelViewerRestart.js +++ b/examples/testingVoxelViewerRestart.js @@ -1,5 +1,5 @@ // -// seeingVoxelsExample.js +// testingVoxelSeeingRestart.js // hifi // // Created by Brad Hefta-Gaub on 2/26/14 From 779b5a682775131c738e0703eb09a97f50c3c365 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 15:32:44 -0700 Subject: [PATCH 63/70] debug --- libraries/octree/src/OctreeElementBag.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/octree/src/OctreeElementBag.cpp b/libraries/octree/src/OctreeElementBag.cpp index f929980a75..9f63b5b071 100644 --- a/libraries/octree/src/OctreeElementBag.cpp +++ b/libraries/octree/src/OctreeElementBag.cpp @@ -24,6 +24,7 @@ OctreeElementBag::~OctreeElementBag() { } void OctreeElementBag::elementDeleted(OctreeElement* element) { +qDebug() << "OctreeElementBag::elementDeleted()..."; remove(element); // note: remove can safely handle nodes that aren't in it, so we don't need to check contains() } From f3aa9d3b8fad2a1dc6d1a5d0de179c0d5e40c3b1 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 15:45:12 -0700 Subject: [PATCH 64/70] unhook node bag from element notifications on shutdown to speed up cleanup --- assignment-client/src/octree/OctreeQueryNode.cpp | 1 + libraries/octree/src/OctreeElementBag.cpp | 9 ++++++++- libraries/octree/src/OctreeElementBag.h | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 5c882fd032..dfaf641753 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -62,6 +62,7 @@ void OctreeQueryNode::nodeKilled() { // while the thread actually shuts down _octreeSendThread->setIsShuttingDown(); } + nodeBag.unhookNotifications(); // if our node is shutting down, then we no longer need octree element notifications } void OctreeQueryNode::forceNodeShutdown() { diff --git a/libraries/octree/src/OctreeElementBag.cpp b/libraries/octree/src/OctreeElementBag.cpp index 9f63b5b071..d4084101cb 100644 --- a/libraries/octree/src/OctreeElementBag.cpp +++ b/libraries/octree/src/OctreeElementBag.cpp @@ -16,13 +16,20 @@ OctreeElementBag::OctreeElementBag() : _bagElements() { OctreeElement::addDeleteHook(this); + _hooked = true; }; OctreeElementBag::~OctreeElementBag() { - OctreeElement::removeDeleteHook(this); + unhookNotifications(); deleteAll(); } +void OctreeElementBag::unhookNotifications() { + if (_hooked) { + OctreeElement::removeDeleteHook(this); + } +} + void OctreeElementBag::elementDeleted(OctreeElement* element) { qDebug() << "OctreeElementBag::elementDeleted()..."; remove(element); // note: remove can safely handle nodes that aren't in it, so we don't need to check contains() diff --git a/libraries/octree/src/OctreeElementBag.h b/libraries/octree/src/OctreeElementBag.h index afc34bf1a6..8c18ece773 100644 --- a/libraries/octree/src/OctreeElementBag.h +++ b/libraries/octree/src/OctreeElementBag.h @@ -36,8 +36,11 @@ public: void deleteAll(); virtual void elementDeleted(OctreeElement* element); + void unhookNotifications(); + private: QSet _bagElements; + bool _hooked; }; #endif // hifi_OctreeElementBag_h From 003e3ae507d96761b048720e3afc1875e5f4f39e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 16:01:37 -0700 Subject: [PATCH 65/70] properly unhook delete notifications --- assignment-client/src/octree/OctreeQueryNode.cpp | 3 ++- libraries/octree/src/OctreeElementBag.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index dfaf641753..10d30ad1ae 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -57,16 +57,17 @@ OctreeQueryNode::~OctreeQueryNode() { void OctreeQueryNode::nodeKilled() { _isShuttingDown = true; + nodeBag.unhookNotifications(); // if our node is shutting down, then we no longer need octree element notifications if (_octreeSendThread) { // just tell our thread we want to shutdown, this is asynchronous, and fast, we don't need or want it to block // while the thread actually shuts down _octreeSendThread->setIsShuttingDown(); } - nodeBag.unhookNotifications(); // if our node is shutting down, then we no longer need octree element notifications } void OctreeQueryNode::forceNodeShutdown() { _isShuttingDown = true; + nodeBag.unhookNotifications(); // if our node is shutting down, then we no longer need octree element notifications if (_octreeSendThread) { // we really need to force our thread to shutdown, this is synchronous, we will block while the thread actually // shuts down because we really need it to shutdown, and it's ok if we wait for it to complete diff --git a/libraries/octree/src/OctreeElementBag.cpp b/libraries/octree/src/OctreeElementBag.cpp index d4084101cb..92a8fe5bff 100644 --- a/libraries/octree/src/OctreeElementBag.cpp +++ b/libraries/octree/src/OctreeElementBag.cpp @@ -27,11 +27,11 @@ OctreeElementBag::~OctreeElementBag() { void OctreeElementBag::unhookNotifications() { if (_hooked) { OctreeElement::removeDeleteHook(this); + _hooked = false; } } void OctreeElementBag::elementDeleted(OctreeElement* element) { -qDebug() << "OctreeElementBag::elementDeleted()..."; remove(element); // note: remove can safely handle nodes that aren't in it, so we don't need to check contains() } From e55c488964adf79d26283fd4dba33f7c943bc4e0 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 16:17:59 -0700 Subject: [PATCH 66/70] clean up some old debugging --- assignment-client/src/octree/OctreeServer.cpp | 151 +----------------- assignment-client/src/octree/OctreeServer.h | 3 - 2 files changed, 2 insertions(+), 152 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 4f435cd371..04a69ff7e8 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -9,7 +9,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include #include #include #include @@ -209,16 +208,11 @@ void OctreeServer::trackProcessWaitTime(float time) { } void OctreeServer::attachQueryNodeToNode(Node* newNode) { - quint64 start = usecTimestampNow(); if (!newNode->getLinkedData() && _instance) { OctreeQueryNode* newQueryNodeData = _instance->createOctreeQueryNode(); newQueryNodeData->init(); newNode->setLinkedData(newQueryNodeData); } - quint64 end = usecTimestampNow(); - if (end - start > 1000) { - qDebug() << "OctreeServer::attachQueryNodeToNode() took:" << (end - start); - } } OctreeServer::OctreeServer(const QByteArray& packet) : @@ -242,7 +236,6 @@ OctreeServer::OctreeServer(const QByteArray& packet) : _started(time(0)), _startedUSecs(usecTimestampNow()) { - //assert(!_instance); // you should only ever have one instance at a time! if (_instance) { qDebug() << "Octree Server starting... while old instance still running _instance=["<<_instance<<"] this=[" << this << "]"; } @@ -252,23 +245,6 @@ OctreeServer::OctreeServer(const QByteArray& packet) : _averageLoopTime.updateAverage(0); qDebug() << "Octree server starting... [" << this << "]"; - - - /* - QTimer* timer = new QTimer(this); - connect(timer, SIGNAL(timeout()), SLOT(doNothing())); - timer->start(0); - */ - -} - -quint64 lastNothing = usecTimestampNow(); -void OctreeServer::doNothing() { - quint64 now = usecTimestampNow(); - if (now - lastNothing > 100) { - qDebug() << "since last doNothing:" << (now - lastNothing); - } - lastNothing = now; } OctreeServer::~OctreeServer() { @@ -299,7 +275,7 @@ OctreeServer::~OctreeServer() { _jurisdiction = NULL; // cleanup our tree here... - qDebug() << qPrintable(_safeServerName) << "server cleaning up octree... [" << this << "]"; + qDebug() << qPrintable(_safeServerName) << "server START cleaning up octree... [" << this << "]"; delete _tree; _tree = NULL; qDebug() << qPrintable(_safeServerName) << "server DONE cleaning up octree... [" << this << "]"; @@ -845,164 +821,41 @@ void OctreeServer::parsePayload() { } } -quint64 lastReadPendingDatagrams = usecTimestampNow(); -quint64 lastProcessNodeData = usecTimestampNow(); - void OctreeServer::readPendingDatagrams() { - //qDebug() << "OctreeServer::readPendingDatagrams()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); - - - quint64 now = usecTimestampNow(); - - // more than 1.1 second is probably a problem - if ((now - lastReadPendingDatagrams) > 1100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): since lastReadPendingDatagrams=" << (now - lastReadPendingDatagrams) << "usecs"; - } - lastReadPendingDatagrams = now; - QByteArray receivedPacket; HifiSockAddr senderSockAddr; NodeList* nodeList = NodeList::getInstance(); - quint64 startReadAvailable = usecTimestampNow(); - int readDataGrams = 0; - - int queryPackets = 0; - int jurisdictionRequests = 0; - int editPackets = 0; - int nodeListPackets = 0; - - quint64 queryElapsed = 0; - quint64 jurisdictionElapsed = 0; - quint64 editElapsed = 0; - quint64 nodeListElapsed = 0; - quint64 versionMatchElapsed = 0; - quint64 matchingElapsed = 0; - - while (readAvailableDatagram(receivedPacket, senderSockAddr)) { - readDataGrams++; - - quint64 versionMatchStart = usecTimestampNow(); - bool matches = nodeList->packetVersionAndHashMatch(receivedPacket); - quint64 versionMatchEnd = usecTimestampNow(); - versionMatchElapsed += (versionMatchEnd - versionMatchStart); - - if (matches) { + if (nodeList->packetVersionAndHashMatch(receivedPacket)) { PacketType packetType = packetTypeForPacket(receivedPacket); - - quint64 startNodeLookup = usecTimestampNow(); SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); - quint64 endNodeLookup = usecTimestampNow(); - matchingElapsed += (endNodeLookup - startNodeLookup); - - if ((endNodeLookup - startNodeLookup) > 100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): sendingNodeForPacket() took" << (endNodeLookup - startNodeLookup) << "usecs"; - } - if (packetType == getMyQueryMessageType()) { - quint64 queryStart = usecTimestampNow(); - queryPackets++; - // If we got a PacketType_VOXEL_QUERY, then we're talking to an NodeType_t_AVATAR, and we // need to make sure we have it in our nodeList. if (matchingNode) { - quint64 startUpdateNode = usecTimestampNow(); nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket); - quint64 endUpdateNode = usecTimestampNow(); - if ((endUpdateNode - startUpdateNode) > 100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): updateNodeWithDataFromPacket() took" << (endUpdateNode - startUpdateNode) << "usecs"; - } - OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { SharedAssignmentPointer sharedAssignment = AssignmentClient::getCurrentAssignment(); nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); } } - quint64 queryEnd = usecTimestampNow(); - queryElapsed += (queryEnd - queryStart); } else if (packetType == PacketTypeJurisdictionRequest) { - quint64 jurisdictionStart = usecTimestampNow(); - jurisdictionRequests++; _jurisdictionSender->queueReceivedPacket(matchingNode, receivedPacket); - quint64 jurisdictionEnd = usecTimestampNow(); - jurisdictionElapsed += (jurisdictionEnd - jurisdictionStart); } else if (_octreeInboundPacketProcessor && getOctree()->handlesEditPacketType(packetType)) { - quint64 editStart = usecTimestampNow(); - editPackets++; _octreeInboundPacketProcessor->queueReceivedPacket(matchingNode, receivedPacket); - quint64 editEnd = usecTimestampNow(); - editElapsed += (editEnd - editStart); } else { - quint64 nodeListStart = usecTimestampNow(); - - nodeListPackets++; - quint64 now = usecTimestampNow(); - - // more than 1.1 second is probably a problem - if ((now - lastProcessNodeData) > 1100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): since lastProcessNodeData=" << (now - lastProcessNodeData) << "usecs"; - } - lastProcessNodeData = now; - // let processNodeData handle it. - quint64 startProcessNodeData = usecTimestampNow(); NodeList::getInstance()->processNodeData(senderSockAddr, receivedPacket); - quint64 endProcessNodeData = usecTimestampNow(); - if ((endProcessNodeData - startProcessNodeData) > 100000) { - qDebug() << "OctreeServer::readPendingDatagrams(): processNodeData() took" << (endProcessNodeData - startProcessNodeData) << "usecs"; - } - - quint64 nodeListEnd = usecTimestampNow(); - nodeListElapsed += (nodeListEnd - nodeListStart); } } } - quint64 endReadAvailable = usecTimestampNow(); - if (endReadAvailable - startReadAvailable > 500000) { - qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs" - << " readDataGrams=" << readDataGrams - << " nodeListPackets=" << nodeListPackets - << " editPackets=" << editPackets - << " jurisdictionRequests=" << jurisdictionRequests - << " queryPackets=" << queryPackets; - - qDebug() << "OctreeServer::readPendingDatagrams(): while(readAvailable) took" << (endReadAvailable - startReadAvailable) << "usecs" - << " nodeListElapsed=" << nodeListElapsed - << " editElapsed=" << editElapsed - << " jurisdictionElapsed=" << jurisdictionElapsed - << " queryElapsed=" << queryElapsed - << " versionMatchElapsed=" << versionMatchElapsed - << " matchingElapsed=" << matchingElapsed; - } - -} - -void OctreeServer::aboutToBlock() { - const bool wantDebug = false; - if (wantDebug) { - qDebug() << "OctreeServer::aboutToBlock()..."; - } -} - -void OctreeServer::awake() { - const bool wantDebug = false; - if (wantDebug) { - qDebug() << "OctreeServer::awake()..."; - } } void OctreeServer::run() { - - QAbstractEventDispatcher* eventDispatcher = thread()->eventDispatcher(); - qDebug() << "OctreeServer::run()... thread()->eventDispatcher()=" << eventDispatcher; - - connect(eventDispatcher, &QAbstractEventDispatcher::aboutToBlock, this, &OctreeServer::aboutToBlock); - connect(eventDispatcher, &QAbstractEventDispatcher::awake, this, &OctreeServer::awake); - _safeServerName = getMyServerName(); // Before we do anything else, create our tree... diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 1b57f3e63d..d7139b5c3d 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -126,9 +126,6 @@ public slots: void nodeAdded(SharedNodePointer node); void nodeKilled(SharedNodePointer node); void sendStatsPacket(); - void doNothing(); - void awake(); - void aboutToBlock(); protected: void parsePayload(); From 7d18dbdfb8da3e2c31e5827aab2e025690133eed Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 16:35:42 -0700 Subject: [PATCH 67/70] more cleanup --- assignment-client/src/octree/OctreeServer.cpp | 24 +++++-------------- .../networking/src/ThreadedAssignment.cpp | 16 ------------- 2 files changed, 6 insertions(+), 34 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 04a69ff7e8..2b4a1d620d 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -1040,25 +1040,24 @@ void OctreeServer::run() { void OctreeServer::nodeAdded(SharedNodePointer node) { // we might choose to use this notifier to track clients in a pending state - //qDebug() << qPrintable(_safeServerName) << "server added node:" << *node; + qDebug() << qPrintable(_safeServerName) << "server added node:" << *node; } void OctreeServer::nodeKilled(SharedNodePointer node) { quint64 start = usecTimestampNow(); - //qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; + qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node; OctreeQueryNode* nodeData = static_cast(node->getLinkedData()); if (nodeData) { nodeData->nodeKilled(); // tell our node data and sending threads that we'd like to shut down } else { - //qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; + qDebug() << qPrintable(_safeServerName) << "server node missing linked data node:" << *node; } quint64 end = usecTimestampNow(); quint64 usecsElapsed = (end - start); if (usecsElapsed > 1000) { - qDebug() << qPrintable(_safeServerName) << "server nodeKilled() took: " << usecsElapsed << "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"; - // << " usecs for node:" << *node; + qDebug() << qPrintable(_safeServerName) << "server nodeKilled() took: " << usecsElapsed << " usecs for node:" << *node; } } @@ -1075,8 +1074,8 @@ void OctreeServer::forceNodeShutdown(SharedNodePointer node) { quint64 end = usecTimestampNow(); quint64 usecsElapsed = (end - start); - qDebug() << qPrintable(_safeServerName) << "server forceNodeShutdown() took: " - << usecsElapsed << " usecs for node:" << *node; + qDebug() << qPrintable(_safeServerName) << "server forceNodeShutdown() took: " + << usecsElapsed << " usecs for node:" << *node; } @@ -1189,17 +1188,6 @@ QString OctreeServer::getStatusLink() { } void OctreeServer::sendStatsPacket() { - - /* - quint64 start = usecTimestampNow(); - static QJsonObject statsObject1; - ThreadedAssignment::addPacketStatsAndSendStatsPacket(statsObject1); - quint64 end = usecTimestampNow(); - if (end - start > 1000) { - qDebug() << "OctreeServer::sendStatsPacket() took:" << (end - start); - } - */ - // TODO: we have too many stats to fit in a single MTU... so for now, we break it into multiple JSON objects and // send them separately. What we really should do is change the NodeList::sendStatsToDomainServer() to handle the // the following features: diff --git a/libraries/networking/src/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index ebb1435e63..4b92f8ba38 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -12,10 +12,8 @@ #include #include #include -#include #include "Logging.h" -#include "SharedUtil.h" #include "ThreadedAssignment.h" ThreadedAssignment::ThreadedAssignment(const QByteArray& packet) : @@ -58,9 +56,6 @@ void ThreadedAssignment::commonInit(const QString& targetName, NodeType_t nodeTy connect(statsTimer, &QTimer::timeout, this, &ThreadedAssignment::sendStatsPacket); statsTimer->start(1000); } - - //qDebug() << "ThreadedAssignment::commonInit()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); - } void ThreadedAssignment::addPacketStatsAndSendStatsPacket(QJsonObject &statsObject) { @@ -81,18 +76,7 @@ void ThreadedAssignment::sendStatsPacket() { addPacketStatsAndSendStatsPacket(statsObject); } -quint64 lastCheckIn = usecTimestampNow(); void ThreadedAssignment::checkInWithDomainServerOrExit() { - - //qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit()... thread()->eventDispatcher()=" << thread()->eventDispatcher(); - - - quint64 now = usecTimestampNow(); - if ((now - lastCheckIn) > 1100000) { - qDebug() << "ThreadedAssignment::checkInWithDomainServerOrExit(): since lastCheckIn=" << (now - lastCheckIn) << "usecs"; - } - lastCheckIn = now; - if (NodeList::getInstance()->getNumNoReplyDomainCheckIns() == MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { setFinished(true); } else { From a64d3ffc3204901953fb53123adef1bda543e87e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 16:38:45 -0700 Subject: [PATCH 68/70] more cleanup --- assignment-client/src/octree/OctreeSendThread.h | 1 - 1 file changed, 1 deletion(-) diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index 470b707fac..d8eed27802 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -17,7 +17,6 @@ #include #include #include -#include #include "OctreeQueryNode.h" From 91d8e113930942e61084c027b2a1391372c2e436 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 17:34:01 -0700 Subject: [PATCH 69/70] return the bytes sent in writeDatagram() and writeUnverifiedDatagram() --- libraries/networking/src/LimitedNodeList.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 2c7ab2f5a8..ce78ec2d10 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -227,7 +227,7 @@ qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const SharedNo } } - writeDatagram(datagram, *destinationSockAddr, destinationNode->getConnectionSecret()); + return writeDatagram(datagram, *destinationSockAddr, destinationNode->getConnectionSecret()); } // didn't have a destinationNode to send to, return 0 @@ -249,9 +249,8 @@ qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, cons } } - // don't use the node secret! - writeDatagram(datagram, *destinationSockAddr, QUuid()); + return writeDatagram(datagram, *destinationSockAddr, QUuid()); } // didn't have a destinationNode to send to, return 0 From 60b8ab0de5e98c6bb66c45c879603473aa648df0 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 21 Apr 2014 17:45:38 -0700 Subject: [PATCH 70/70] CR feedback --- assignment-client/src/octree/OctreeServer.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 2b4a1d620d..bd04dd85d7 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -839,6 +839,11 @@ void OctreeServer::readPendingDatagrams() { nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket); OctreeQueryNode* nodeData = (OctreeQueryNode*) matchingNode->getLinkedData(); if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { + + // NOTE: this is an important aspect of the proper ref counting. The send threads/node data need to + // know that the OctreeServer/Assignment will not get deleted on it while it's still active. The + // solution is to get the shared pointer for the current assignment. We need to make sure this is the + // same SharedAssignmentPointer that was ref counted by the assignment client. SharedAssignmentPointer sharedAssignment = AssignmentClient::getCurrentAssignment(); nodeData->initializeOctreeSendThread(sharedAssignment, matchingNode); }