diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 32ffd626e8..7907d8679f 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -2267,6 +2267,7 @@ void DomainServer::updateDownstreamNodes() { // manually add the downstream node to our node list auto node = nodeList->addOrUpdateNode(QUuid::createUuid(), downstreamNodeType, downstreamServerAddr, downstreamServerAddr); + node->setIsForcedAlive(true); qDebug() << "Adding downstream node:" << node->getUUID() << downstreamServerAddr; diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 9c0754cf26..994b5305e6 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -749,7 +749,7 @@ void LimitedNodeList::removeSilentNodes() { SharedNodePointer node = it->second; node->getMutex().lock(); - if (!NodeType::isDownstream(node->getType()) + if (!node->isForcedAlive() && (usecTimestampNow() - node->getLastHeardMicrostamp()) > (NODE_SILENCE_THRESHOLD_MSECS * USECS_PER_MSEC)) { // call the NodeHash erase to get rid of this node it = _nodeHash.unsafe_erase(it); diff --git a/libraries/networking/src/NetworkPeer.h b/libraries/networking/src/NetworkPeer.h index 7185ffef29..ad7076285f 100644 --- a/libraries/networking/src/NetworkPeer.h +++ b/libraries/networking/src/NetworkPeer.h @@ -76,6 +76,9 @@ public: float getOutboundBandwidth() const; // in kbps float getInboundBandwidth() const; // in kbps + bool isForcedAlive() const { return _isForcedAlive; } + void setIsForcedAlive(bool isForcedAlive) { _isForcedAlive = isForcedAlive; } + friend QDataStream& operator<<(QDataStream& out, const NetworkPeer& peer); friend QDataStream& operator>>(QDataStream& in, NetworkPeer& peer); public slots: @@ -103,6 +106,8 @@ protected: QTimer* _pingTimer = NULL; int _connectionAttempts; + + bool _isForcedAlive { false }; }; QDebug operator<<(QDebug debug, const NetworkPeer &peer); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 80576f473a..179b6e202d 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -668,6 +668,11 @@ void NodeList::parseNodeFromPacketStream(QDataStream& packetStream) { SharedNodePointer node = addOrUpdateNode(nodeUUID, nodeType, nodePublicSocket, nodeLocalSocket, permissions, isReplicated, connectionUUID); + + // nodes that are downstream of our own type are kept alive when we hear about them from the domain server + if (node->getType() == NodeType::downstreamType(_ownerType)) { + node->setLastHeardMicrostamp(usecTimestampNow()); + } } void NodeList::sendAssignment(Assignment& assignment) {