diff --git a/domain-server/src/DomainGatekeeper.cpp b/domain-server/src/DomainGatekeeper.cpp index 6aaa348f6c..09a0446468 100644 --- a/domain-server/src/DomainGatekeeper.cpp +++ b/domain-server/src/DomainGatekeeper.cpp @@ -121,12 +121,13 @@ void DomainGatekeeper::processConnectRequestPacket(QSharedPointersetNodeInterestSet(safeInterestSet); nodeData->setPlaceName(nodeConnection.placeName); + QMetaEnum metaEnum = QMetaEnum::fromType(); qDebug() << "Allowed connection from node" << uuidStringWithoutCurlyBraces(node->getUUID()) << "on" << message->getSenderSockAddr() << "with MAC" << nodeConnection.hardwareAddress << "and machine fingerprint" << nodeConnection.machineFingerprint << "user" << username - << "reason" << QString(nodeConnection.connectReason ? "SilentDomainDisconnect" : "Connect") + << "reason" << QString(metaEnum.valueToKey(nodeConnection.connectReason)) << "previous connection uptime" << nodeConnection.previousConnectionUpTime/USECS_PER_MSEC << "msec" << "sysinfo" << nodeConnection.SystemInfo; diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index c3a4a94c7c..b7c723ab48 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -2498,7 +2498,7 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url return true; } else if (allNodesDeleteRegex.indexIn(url.path()) != -1) { qDebug() << "Received request to kill all nodes."; - nodeList->eraseAllNodes(); + nodeList->eraseAllNodes(url.path()); return true; } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3c37bb6a6f..e86ade0a50 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -548,6 +548,13 @@ public: return true; } + if (message->message == WM_POWERBROADCAST) { + if (message->wParam == PBT_APMRESUMEAUTOMATIC) { + qCInfo(interfaceapp) << "Waking up from sleep or hybernation."; + QMetaObject::invokeMethod(DependencyManager::get().data(), "noteAwakening", Qt::QueuedConnection); + } + } + if (message->message == WM_COPYDATA) { COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)(message->lParam); QUrl url = QUrl((const char*)(pcds->lpData)); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 3519408960..7d2f085d6f 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -584,7 +584,7 @@ SharedNodePointer LimitedNodeList::nodeWithLocalID(Node::LocalID localID) const return idIter == _localIDMap.cend() ? nullptr : idIter->second; } -void LimitedNodeList::eraseAllNodes() { +void LimitedNodeList::eraseAllNodes(QString reason) { std::vector killedNodes; { @@ -593,7 +593,7 @@ void LimitedNodeList::eraseAllNodes() { QWriteLocker writeLocker(&_nodeMutex); if (_nodeHash.size() > 0) { - qCDebug(networking) << "LimitedNodeList::eraseAllNodes() removing all nodes from NodeList."; + qCDebug(networking) << "LimitedNodeList::eraseAllNodes() removing all nodes from NodeList:" << reason; killedNodes.reserve(_nodeHash.size()); for (auto& pair : _nodeHash) { @@ -611,8 +611,8 @@ void LimitedNodeList::eraseAllNodes() { _delayedNodeAdds.clear(); } -void LimitedNodeList::reset() { - eraseAllNodes(); +void LimitedNodeList::reset(QString reason) { + eraseAllNodes(reason); // we need to make sure any socket connections are gone so wait on that here _nodeSocket.clearConnections(); @@ -1258,7 +1258,7 @@ void LimitedNodeList::setLocalSocket(const HifiSockAddr& sockAddr) { qCInfo(networking) << "Local socket has changed from" << _localSockAddr << "to" << sockAddr; _localSockAddr = sockAddr; if (_hasTCPCheckedLocalSocket) { // Force a port change for NAT: - reset(); + reset("local socket change"); _nodeSocket.rebind(0); _localSockAddr.setPort(_nodeSocket.localPort()); qCInfo(networking) << "Local port changed to" << _localSockAddr.getPort(); diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 5f24401b10..a61deeef96 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -111,7 +111,8 @@ public: enum ConnectReason : quint32 { Connect = 0, - SilentDomainDisconnect + SilentDomainDisconnect, + Awake }; Q_ENUM(ConnectReason); @@ -347,8 +348,8 @@ public: }; public slots: - void reset(); - void eraseAllNodes(); + void reset(QString reason); + void eraseAllNodes(QString reason); void removeSilentNodes(); @@ -358,6 +359,7 @@ public slots: virtual void sendSTUNRequest(); bool killNodeWithUUID(const QUuid& nodeUUID, ConnectionID newConnectionID = NULL_CONNECTION_ID); + void noteAwakening() { _connectReason = Awake; } private slots: void sampleConnectionStats(); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 9dd7716823..306e0155d3 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -116,7 +116,11 @@ NodeList::NodeList(char newOwnerType, int socketListenPort, int dtlsListenPort) connect(&_domainHandler, SIGNAL(connectedToDomain(QUrl)), &_keepAlivePingTimer, SLOT(start())); connect(&_domainHandler, &DomainHandler::disconnectedFromDomain, &_keepAlivePingTimer, &QTimer::stop); - connect(&_domainHandler, &DomainHandler::limitOfSilentDomainCheckInsReached, this, [this]() { _connectReason = LimitedNodeList::SilentDomainDisconnect; }); + connect(&_domainHandler, &DomainHandler::limitOfSilentDomainCheckInsReached, this, [this]() { + if (_connectReason != Awake) { + _connectReason = SilentDomainDisconnect; + } + }); // set our sockAddrBelongsToDomainOrNode method as the connection creation filter for the udt::Socket using std::placeholders::_1; @@ -259,8 +263,7 @@ void NodeList::reset(QString reason, bool skipDomainHandlerReset) { Q_ARG(bool, skipDomainHandlerReset)); return; } - - LimitedNodeList::reset(); + LimitedNodeList::reset(reason); // lock and clear our set of ignored IDs _ignoredSetLock.lockForWrite(); @@ -337,7 +340,8 @@ void NodeList::sendDomainServerCheckIn() { if (!domainIsConnected) { auto hostname = _domainHandler.getHostname(); - qCDebug(networking_ice) << "Sending connect request to domain-server at" << hostname; + QMetaEnum metaEnum = QMetaEnum::fromType(); + qCDebug(networking_ice) << "Sending connect request ( REASON:" << QString(metaEnum.valueToKey(_connectReason)) << ") to domain-server at" << hostname; // is this our localhost domain-server? // if so we need to make sure we have an up-to-date local port in case it restarted