mirror of
https://github.com/lubosz/overte.git
synced 2025-04-16 15:30:11 +02:00
fix octree server crashes on various shutdown corner cases
This commit is contained in:
parent
220232312d
commit
499c4bd500
6 changed files with 51 additions and 13 deletions
|
@ -194,21 +194,24 @@ void AssignmentClient::handleAuthenticationRequest() {
|
|||
}
|
||||
|
||||
void AssignmentClient::assignmentCompleted() {
|
||||
qDebug() << "START AssignmentClient::assignmentCompleted()... this=" << this << "_currentAssignment=" << _currentAssignment;
|
||||
|
||||
// reset the logging target to the the CHILD_TARGET_NAME
|
||||
Logging::setTargetName(ASSIGNMENT_CLIENT_TARGET_NAME);
|
||||
|
||||
qDebug("Assignment finished or never started - waiting for new assignment.");
|
||||
|
||||
NodeList* nodeList = NodeList::getInstance();
|
||||
|
||||
// reset our NodeList by switching back to unassigned and clearing the list
|
||||
nodeList->reset();
|
||||
nodeList->setOwnerType(NodeType::Unassigned);
|
||||
nodeList->resetNodeInterestSet();
|
||||
|
||||
// have us handle incoming NodeList datagrams again
|
||||
disconnect(&nodeList->getNodeSocket(), 0, _currentAssignment, 0);
|
||||
connect(&nodeList->getNodeSocket(), &QUdpSocket::readyRead, this, &AssignmentClient::readPendingDatagrams);
|
||||
|
||||
qDebug() << "DONE AssignmentClient::assignmentCompleted()... this=" << this << "_currentAssignment was=" << _currentAssignment;
|
||||
_currentAssignment = NULL;
|
||||
|
||||
// reset our NodeList by switching back to unassigned and clearing the list
|
||||
nodeList->setOwnerType(NodeType::Unassigned);
|
||||
nodeList->reset();
|
||||
nodeList->resetNodeInterestSet();
|
||||
}
|
||||
|
|
|
@ -23,12 +23,23 @@ OctreeSendThread::OctreeSendThread(const QUuid& nodeUUID, OctreeServer* myServer
|
|||
_packetData(),
|
||||
_nodeMissingCount(0)
|
||||
{
|
||||
qDebug() << "client connected - starting sending thread";
|
||||
QString safeServerName("Octree");
|
||||
if (_myServer) {
|
||||
safeServerName = _myServer->getMyServerName();
|
||||
}
|
||||
qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client connected "
|
||||
"- starting sending thread [" << this << "]";
|
||||
|
||||
OctreeServer::clientConnected();
|
||||
}
|
||||
|
||||
OctreeSendThread::~OctreeSendThread() {
|
||||
qDebug() << "client disconnected - ending sending thread";
|
||||
QString safeServerName("Octree");
|
||||
if (_myServer) {
|
||||
safeServerName = _myServer->getMyServerName();
|
||||
}
|
||||
qDebug() << qPrintable(safeServerName) << "server [" << _myServer << "]: client disconnected "
|
||||
"- ending sending thread [" << this << "]";
|
||||
OctreeServer::clientDisconnected();
|
||||
}
|
||||
|
||||
|
|
|
@ -195,9 +195,11 @@ OctreeServer::OctreeServer(const QByteArray& packet) :
|
|||
{
|
||||
_instance = this;
|
||||
_averageLoopTime.updateAverage(0);
|
||||
qDebug() << "Octree server starting... [" << this << "]";
|
||||
}
|
||||
|
||||
OctreeServer::~OctreeServer() {
|
||||
qDebug() << qPrintable(_safeServerName) << "server shutting down... [" << this << "]";
|
||||
if (_parsedArgV) {
|
||||
for (int i = 0; i < _argc; i++) {
|
||||
delete[] _parsedArgV[i];
|
||||
|
@ -222,7 +224,7 @@ OctreeServer::~OctreeServer() {
|
|||
|
||||
delete _jurisdiction;
|
||||
_jurisdiction = NULL;
|
||||
qDebug() << "OctreeServer::~OctreeServer()... DONE";
|
||||
qDebug() << qPrintable(_safeServerName) << "server DONE shutting down... [" << this << "]";
|
||||
}
|
||||
|
||||
void OctreeServer::initHTTPManager(int port) {
|
||||
|
@ -808,6 +810,7 @@ void OctreeServer::readPendingDatagrams() {
|
|||
}
|
||||
|
||||
void OctreeServer::run() {
|
||||
_safeServerName = getMyServerName();
|
||||
// Before we do anything else, create our tree...
|
||||
_tree = createTree();
|
||||
|
||||
|
@ -863,6 +866,7 @@ void OctreeServer::run() {
|
|||
connect(nodeList, SIGNAL(nodeAdded(SharedNodePointer)), SLOT(nodeAdded(SharedNodePointer)));
|
||||
connect(nodeList, SIGNAL(nodeKilled(SharedNodePointer)),SLOT(nodeKilled(SharedNodePointer)));
|
||||
|
||||
|
||||
// we need to ask the DS about agents so we can ping/reply with them
|
||||
nodeList->addNodeTypeToInterestSet(NodeType::Agent);
|
||||
|
||||
|
@ -984,13 +988,26 @@ void OctreeServer::run() {
|
|||
|
||||
void OctreeServer::nodeAdded(SharedNodePointer node) {
|
||||
// we might choose to use this notifier to track clients in a pending state
|
||||
qDebug() << "OctreeServer::nodeAdded() node:" << *node;
|
||||
qDebug() << qPrintable(_safeServerName) << "server added node:" << *node;
|
||||
}
|
||||
|
||||
void OctreeServer::nodeKilled(SharedNodePointer node) {
|
||||
qDebug() << qPrintable(_safeServerName) << "server killed node:" << *node;
|
||||
OctreeQueryNode* nodeData = static_cast<OctreeQueryNode*>(node->getLinkedData());
|
||||
if (nodeData) {
|
||||
nodeData->scheduleForDelete();
|
||||
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;
|
||||
delete nodeData;
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
qDebug() << qPrintable(_safeServerName) << "server ENDING about to finish...";
|
||||
}
|
||||
|
||||
|
|
|
@ -98,6 +98,8 @@ public:
|
|||
static float getAveragePacketSendingTime() { return _averagePacketSendingTime.getAverage(); }
|
||||
|
||||
bool handleHTTPRequest(HTTPConnection* connection, const QString& path);
|
||||
|
||||
virtual void aboutToFinish();
|
||||
|
||||
public slots:
|
||||
/// runs the voxel server assignment
|
||||
|
@ -134,6 +136,7 @@ protected:
|
|||
|
||||
time_t _started;
|
||||
quint64 _startedUSecs;
|
||||
QString _safeServerName;
|
||||
|
||||
static int _clientCount;
|
||||
static SimpleMovingAverage _averageLoopTime;
|
||||
|
|
|
@ -29,6 +29,7 @@ void ThreadedAssignment::setFinished(bool isFinished) {
|
|||
_isFinished = isFinished;
|
||||
|
||||
if (_isFinished) {
|
||||
aboutToFinish();
|
||||
emit finished();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,21 +9,24 @@
|
|||
#ifndef __hifi__ThreadedAssignment__
|
||||
#define __hifi__ThreadedAssignment__
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
#include "Assignment.h"
|
||||
|
||||
class ThreadedAssignment : public Assignment {
|
||||
Q_OBJECT
|
||||
public:
|
||||
ThreadedAssignment(const QByteArray& packet);
|
||||
|
||||
void setFinished(bool isFinished);
|
||||
|
||||
virtual void aboutToFinish() { };
|
||||
|
||||
public slots:
|
||||
/// threaded run of assignment
|
||||
virtual void run() = 0;
|
||||
|
||||
virtual void deleteLater();
|
||||
|
||||
virtual void readPendingDatagrams() = 0;
|
||||
|
||||
protected:
|
||||
bool readAvailableDatagram(QByteArray& destinationByteArray, HifiSockAddr& senderSockAddr);
|
||||
|
||||
|
|
Loading…
Reference in a new issue