From e50e75cba74ce4bdbb2dd77c13efda8f4d1d3f6e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 27 Jan 2016 11:41:23 -0800 Subject: [PATCH] drop assignment even if DDOS locks NL thread --- libraries/networking/src/NodeList.cpp | 3 +++ libraries/networking/src/NodeList.h | 1 + libraries/networking/src/ThreadedAssignment.cpp | 13 ++++++++++++- libraries/networking/src/ThreadedAssignment.h | 2 ++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index b0cd8cce39..16277caace 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -490,6 +490,9 @@ void NodeList::processDomainServerList(QSharedPointer message) // this is a packet from the domain server, reset the count of un-replied check-ins _numNoReplyDomainCheckIns = 0; + // emit our signal so listeners know we just heard from the DS + emit receivedDomainServerList(); + DependencyManager::get()->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::ReceiveDSList); QDataStream packetStream(message->getMessage()); diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 171ea0c6a7..4b196d5f7b 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -87,6 +87,7 @@ public slots: signals: void limitOfSilentDomainCheckInsReached(); + void receivedDomainServerList(); private slots: void stopKeepalivePingTimer(); void sendPendingDSPathQuery(); diff --git a/libraries/networking/src/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index 303755c8f3..10f9c03cab 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -30,6 +30,10 @@ ThreadedAssignment::ThreadedAssignment(ReceivedMessage& message) : connect(&_domainServerTimer, &QTimer::timeout, this, &ThreadedAssignment::checkInWithDomainServerOrExit); _domainServerTimer.setInterval(DOMAIN_SERVER_CHECK_IN_MSECS); + + // if the NL tells us we got a DS response, clear our member variable of queued check-ins + auto nodeList = DependencyManager::get(); + connect(nodeList.data(), &NodeList::receivedDomainServerList, this, &ThreadedAssignment::clearQueuedCheckIns); } void ThreadedAssignment::setFinished(bool isFinished) { @@ -103,11 +107,18 @@ void ThreadedAssignment::sendStatsPacket() { } void ThreadedAssignment::checkInWithDomainServerOrExit() { - if (DependencyManager::get()->getNumNoReplyDomainCheckIns() == MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { + qDebug() << "WE ARE AT" << _numQueuedCheckIns << "queued check-ins"; + + // verify that the number of queued check-ins is not >= our max + // the number of queued check-ins is cleared anytime we get a response from the domain-server + if (_numQueuedCheckIns >= MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { setFinished(true); } else { auto nodeList = DependencyManager::get(); QMetaObject::invokeMethod(nodeList.data(), "sendDomainServerCheckIn"); + + // increase the number of queued check ins + _numQueuedCheckIns++; } } diff --git a/libraries/networking/src/ThreadedAssignment.h b/libraries/networking/src/ThreadedAssignment.h index 42d4903c2f..13b9b5bf79 100644 --- a/libraries/networking/src/ThreadedAssignment.h +++ b/libraries/networking/src/ThreadedAssignment.h @@ -33,6 +33,7 @@ public slots: virtual void run() = 0; Q_INVOKABLE virtual void stop() { setFinished(true); } virtual void sendStatsPacket(); + void clearQueuedCheckIns() { _numQueuedCheckIns = 0; } signals: void finished(); @@ -42,6 +43,7 @@ protected: bool _isFinished; QTimer _domainServerTimer; QTimer _statsTimer; + int _numQueuedCheckIns { 0 }; protected slots: void domainSettingsRequestFailed();