repairs to NodeList and LimitedNodeList

This commit is contained in:
Stephen Birarda 2014-04-01 13:56:33 -07:00
parent 45c6ae44a6
commit 0be2eb57bf
7 changed files with 42 additions and 43 deletions

View file

@ -52,7 +52,7 @@ DomainServer::DomainServer(int argc, char* argv[]) :
if (optionallySetupDTLS()) {
// we either read a certificate and private key or were not passed one, good to load assignments
// and set up the node list
qDebug() << "Setting up NodeList and assignments.";
qDebug() << "Setting up LimitedNodeList and assignments.";
setupNodeListAndAssignments();
if (_isUsingDTLS) {
@ -542,7 +542,8 @@ void DomainServer::readAvailableDatagrams() {
receivedPacket.resize(nodeList->getNodeSocket().pendingDatagramSize());
nodeList->getNodeSocket().readDatagram(receivedPacket.data(), receivedPacket.size(),
senderSockAddr.getAddressPointer(), senderSockAddr.getPortPointer());
if (packetTypeForPacket(receivedPacket) && nodeList->packetVersionAndHashMatch(receivedPacket)) {
if (packetTypeForPacket(receivedPacket) == PacketTypeRequestAssignment
&& nodeList->packetVersionAndHashMatch(receivedPacket)) {
// construct the requested assignment from the packet data
Assignment requestAssignment(receivedPacket);

View file

@ -43,7 +43,7 @@ LimitedNodeList* LimitedNodeList::createInstance(unsigned short socketListenPort
// register the SharedNodePointer meta-type for signals/slots
qRegisterMetaType<SharedNodePointer>();
} else {
qDebug("NodeList createInstance called with existing instance.");
qDebug("LimitedNodeList createInstance called with existing instance.");
}
return _sharedInstance;
@ -51,7 +51,7 @@ LimitedNodeList* LimitedNodeList::createInstance(unsigned short socketListenPort
LimitedNodeList* LimitedNodeList::getInstance() {
if (!_sharedInstance) {
qDebug("NodeList getInstance called before call to createInstance. Returning NULL pointer.");
qDebug("LimitedNodeList getInstance called before call to createInstance. Returning NULL pointer.");
}
return _sharedInstance;
@ -59,6 +59,7 @@ LimitedNodeList* LimitedNodeList::getInstance() {
LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short dtlsListenPort) :
_sessionUUID(),
_nodeHash(),
_nodeHashMutex(QMutex::Recursive),
_nodeSocket(this),
@ -84,6 +85,17 @@ LimitedNodeList::LimitedNodeList(unsigned short socketListenPort, unsigned short
_packetStatTimer.start();
}
void LimitedNodeList::setSessionUUID(const QUuid& sessionUUID) {
QUuid oldUUID = _sessionUUID;
_sessionUUID = sessionUUID;
if (sessionUUID != oldUUID) {
qDebug() << "NodeList UUID changed from" << uuidStringWithoutCurlyBraces(oldUUID)
<< "to" << uuidStringWithoutCurlyBraces(_sessionUUID);
emit uuidChanged(sessionUUID);
}
}
QUdpSocket& LimitedNodeList::getDTLSSocket() {
if (!_dtlsSocket) {
// DTLS socket getter called but no DTLS socket exists, create it now

View file

@ -56,6 +56,9 @@ public:
static LimitedNodeList* createInstance(unsigned short socketListenPort = 0, unsigned short dtlsPort = 0);
static LimitedNodeList* getInstance();
const QUuid& getSessionUUID() const { return _sessionUUID; }
void setSessionUUID(const QUuid& sessionUUID);
QUdpSocket& getNodeSocket() { return _nodeSocket; }
QUdpSocket& getDTLSSocket();
@ -99,6 +102,7 @@ public slots:
void killNodeWithUUID(const QUuid& nodeUUID);
signals:
void uuidChanged(const QUuid& ownerUUID);
void nodeAdded(SharedNodePointer);
void nodeKilled(SharedNodePointer);
protected:
@ -116,6 +120,7 @@ protected:
void changeSendSocketBufferSize(int numSendBytes);
QUuid _sessionUUID;
NodeHash _nodeHash;
QMutex _nodeHashMutex;
QUdpSocket _nodeSocket;

View file

@ -28,6 +28,7 @@ NodeList* NodeList::createInstance(char ownerType, unsigned short socketListenPo
NodeType::init();
_sharedInstance = new NodeList(ownerType, socketListenPort, dtlsPort);
LimitedNodeList::_sharedInstance = _sharedInstance;
// register the SharedNodePointer meta-type for signals/slots
qRegisterMetaType<SharedNodePointer>();
@ -50,7 +51,6 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned
LimitedNodeList(socketListenPort, dtlsListenPort),
_ownerType(newOwnerType),
_nodeTypesOfInterest(),
_sessionUUID(),
_numNoReplyDomainCheckIns(0),
_assignmentServerSocket(),
_publicSockAddr(),
@ -58,7 +58,7 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned
_stunRequestsSinceSuccess(0)
{
// clear our NodeList when the domain changes
connect(&_DomainHandler, &DomainHandler::hostnameChanged, this, &NodeList::reset);
connect(&_domainHandler, &DomainHandler::hostnameChanged, this, &NodeList::reset);
// clear our NodeList when logout is requested
connect(&AccountManager::getInstance(), &AccountManager::logoutComplete , this, &NodeList::reset);
@ -70,7 +70,7 @@ qint64 NodeList::sendStatsToDomainServer(const QJsonObject& statsObject) {
statsPacketStream << statsObject.toVariantMap();
return writeDatagram(statsPacket, _DomainHandler.getSockAddr(), QUuid());
return writeDatagram(statsPacket, _domainHandler.getSockAddr(), QUuid());
}
void NodeList::timePingReply(const QByteArray& packet, const SharedNodePointer& sendingNode) {
@ -115,7 +115,7 @@ void NodeList::processNodeData(const HifiSockAddr& senderSockAddr, const QByteAr
break;
}
case PacketTypeDomainServerRequireDTLS: {
_DomainHandler.parseDTLSRequirementPacket(packet);
_domainHandler.parseDTLSRequirementPacket(packet);
break;
}
case PacketTypePing: {
@ -165,7 +165,7 @@ void NodeList::reset() {
setSessionUUID(QUuid());
// clear the domain connection information
_DomainHandler.clearConnectionInfo();
_domainHandler.clearConnectionInfo();
}
void NodeList::addNodeTypeToInterestSet(NodeType_t nodeTypeToAdd) {
@ -317,15 +317,11 @@ void NodeList::sendDomainServerCheckIn() {
// we don't know our public socket and we need to send it to the domain server
// send a STUN request to figure it out
sendSTUNRequest();
} else if (!_DomainHandler.getIP().isNull()) {
} else if (!_domainHandler.getIP().isNull()) {
// construct the DS check in packet
QUuid packetUUID = (!_sessionUUID.isNull() ? _sessionUUID : _domainHandler.getAssignmentUUID());
PacketType domainPacketType = _sessionUUID.isNull() ? PacketTypeDomainConnectRequest : PacketTypeDomainListRequest;
QUuid packetUUID = (domainPacketType == PacketTypeDomainListRequest)
? _sessionUUID : _DomainHandler.getAssignmentUUID();
QByteArray domainServerPacket = byteArrayWithPopulatedHeader(domainPacketType, packetUUID);
QByteArray domainServerPacket = byteArrayWithPopulatedHeader(PacketTypeDomainListRequest, packetUUID);
QDataStream packetStream(&domainServerPacket, QIODevice::Append);
// pack our data to send to the domain-server
@ -338,7 +334,7 @@ void NodeList::sendDomainServerCheckIn() {
packetStream << nodeTypeOfInterest;
}
writeDatagram(domainServerPacket, _DomainHandler.getSockAddr(), QUuid());
writeDatagram(domainServerPacket, _domainHandler.getSockAddr(), QUuid());
const int NUM_DOMAIN_SERVER_CHECKINS_PER_STUN_REQUEST = 5;
static unsigned int numDomainCheckins = 0;
@ -358,23 +354,12 @@ void NodeList::sendDomainServerCheckIn() {
}
}
void NodeList::setSessionUUID(const QUuid& sessionUUID) {
QUuid oldUUID = _sessionUUID;
_sessionUUID = sessionUUID;
if (sessionUUID != oldUUID) {
qDebug() << "NodeList UUID changed from" << uuidStringWithoutCurlyBraces(oldUUID)
<< "to" << uuidStringWithoutCurlyBraces(_sessionUUID);
emit uuidChanged(sessionUUID);
}
}
int NodeList::processDomainServerList(const QByteArray& packet) {
// this is a packet from the domain server, reset the count of un-replied check-ins
_numNoReplyDomainCheckIns = 0;
// if this was the first domain-server list from this domain, we've now connected
_DomainHandler.setIsConnected(true);
_domainHandler.setIsConnected(true);
int readNodes = 0;
@ -401,7 +386,7 @@ int NodeList::processDomainServerList(const QByteArray& packet) {
// if the public socket address is 0 then it's reachable at the same IP
// as the domain server
if (nodePublicSocket.getAddress().isNull()) {
nodePublicSocket.setAddress(_DomainHandler.getIP());
nodePublicSocket.setAddress(_domainHandler.getIP());
}
SharedNodePointer node = addOrUpdateNode(nodeUUID, nodeType, nodePublicSocket, nodeLocalSocket);
@ -511,9 +496,9 @@ void NodeList::loadData(QSettings *settings) {
QString domainServerHostname = settings->value(DOMAIN_SERVER_SETTING_KEY).toString();
if (domainServerHostname.size() > 0) {
_DomainHandler.setHostname(domainServerHostname);
_domainHandler.setHostname(domainServerHostname);
} else {
_DomainHandler.setHostname(DEFAULT_DOMAIN_HOSTNAME);
_domainHandler.setHostname(DEFAULT_DOMAIN_HOSTNAME);
}
settings->endGroup();
@ -522,9 +507,9 @@ void NodeList::loadData(QSettings *settings) {
void NodeList::saveData(QSettings* settings) {
settings->beginGroup(DOMAIN_SERVER_SETTING_KEY);
if (_DomainHandler.getHostname() != DEFAULT_DOMAIN_HOSTNAME) {
if (_domainHandler.getHostname() != DEFAULT_DOMAIN_HOSTNAME) {
// the user is using a different hostname, store it
settings->setValue(DOMAIN_SERVER_SETTING_KEY, QVariant(_DomainHandler.getHostname()));
settings->setValue(DOMAIN_SERVER_SETTING_KEY, QVariant(_domainHandler.getHostname()));
} else {
// the user has switched back to default, remove the current setting
settings->remove(DOMAIN_SERVER_SETTING_KEY);

View file

@ -56,13 +56,10 @@ public:
NodeType_t getOwnerType() const { return _ownerType; }
void setOwnerType(NodeType_t ownerType) { _ownerType = ownerType; }
const QUuid& getSessionUUID() const { return _sessionUUID; }
void setSessionUUID(const QUuid& sessionUUID);
qint64 sendStatsToDomainServer(const QJsonObject& statsObject);
int getNumNoReplyDomainCheckIns() const { return _numNoReplyDomainCheckIns; }
DomainHandler& getDomainHandler() { return _DomainHandler; }
DomainHandler& getDomainHandler() { return _domainHandler; }
const NodeSet& getNodeInterestSet() const { return _nodeTypesOfInterest; }
void addNodeTypeToInterestSet(NodeType_t nodeTypeToAdd);
@ -86,7 +83,6 @@ public slots:
void sendDomainServerCheckIn();
void pingInactiveNodes();
signals:
void uuidChanged(const QUuid& ownerUUID);
void limitOfSilentDomainCheckInsReached();
private:
static NodeList* _sharedInstance;
@ -104,8 +100,7 @@ private:
NodeType_t _ownerType;
NodeSet _nodeTypesOfInterest;
DomainHandler _DomainHandler;
QUuid _sessionUUID;
DomainHandler _domainHandler;
int _numNoReplyDomainCheckIns;
HifiSockAddr _assignmentServerSocket;
HifiSockAddr _publicSockAddr;

View file

@ -84,7 +84,7 @@ int populatePacketHeader(char* packet, PacketType type, const QUuid& connectionU
char* position = packet + numTypeBytes + sizeof(PacketVersion);
QUuid packUUID = connectionUUID.isNull() ? NodeList::getInstance()->getSessionUUID() : connectionUUID;
QUuid packUUID = connectionUUID.isNull() ? LimitedNodeList::getInstance()->getSessionUUID() : connectionUUID;
QByteArray rfcUUID = packUUID.toRfc4122();
memcpy(position, rfcUUID.constData(), NUM_BYTES_RFC4122_UUID);

View file

@ -67,7 +67,8 @@ typedef char PacketVersion;
const QSet<PacketType> NON_VERIFIED_PACKETS = QSet<PacketType>()
<< PacketTypeDomainServerRequireDTLS << PacketTypeDomainList << PacketTypeDomainListRequest
<< PacketTypeCreateAssignment << PacketTypeRequestAssignment << PacketTypeStunResponse;
<< PacketTypeCreateAssignment << PacketTypeRequestAssignment << PacketTypeStunResponse
<< PacketTypeNodeJsonStats;
const int NUM_BYTES_MD5_HASH = 16;
const int NUM_STATIC_HEADER_BYTES = sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID;