Merge pull request #8363 from birarda/no-temp-ice-update

Avoid DS heartbeats with non-metaverse domain ID
This commit is contained in:
Brad Hefta-Gaub 2016-08-05 16:48:00 -07:00 committed by GitHub
commit 652bea8cd0
2 changed files with 98 additions and 58 deletions

View file

@ -117,9 +117,18 @@ DomainServer::DomainServer(int argc, char* argv[]) :
_settingsManager.apiRefreshGroupInformation(); _settingsManager.apiRefreshGroupInformation();
setupNodeListAndAssignments(); setupNodeListAndAssignments();
if (_type == MetaverseDomain) {
// if we have a metaverse domain, we'll need an access token to heartbeat handle auto-networking
resetAccountManagerAccessToken();
}
setupAutomaticNetworking(); setupAutomaticNetworking();
if (!getID().isNull()) {
if (!getID().isNull() && _type != NonMetaverse) {
// setup periodic heartbeats to metaverse API
setupHeartbeatToMetaverse(); setupHeartbeatToMetaverse();
// send the first heartbeat immediately // send the first heartbeat immediately
sendHeartbeatToMetaverse(); sendHeartbeatToMetaverse();
} }
@ -301,16 +310,22 @@ void DomainServer::handleTempDomainSuccess(QNetworkReply& requestReply) {
// store the new ID and auto networking setting on disk // store the new ID and auto networking setting on disk
_settingsManager.persistToFile(); _settingsManager.persistToFile();
// change our domain ID immediately
DependencyManager::get<LimitedNodeList>()->setSessionUUID(QUuid { id });
// store the new token to the account info // store the new token to the account info
auto accountManager = DependencyManager::get<AccountManager>(); auto accountManager = DependencyManager::get<AccountManager>();
accountManager->setTemporaryDomain(id, key); accountManager->setTemporaryDomain(id, key);
// change our domain ID immediately
DependencyManager::get<LimitedNodeList>()->setSessionUUID(QUuid { id });
// change our type to reflect that we are a temporary domain now
_type = MetaverseTemporaryDomain;
// update our heartbeats to use the correct id // update our heartbeats to use the correct id
setupICEHeartbeatForFullNetworking(); setupICEHeartbeatForFullNetworking();
setupHeartbeatToMetaverse(); setupHeartbeatToMetaverse();
// if we have a current ICE server address, update it in the API for the new temporary domain
sendICEServerAddressToMetaverseAPI();
} else { } else {
qWarning() << "There were problems parsing the API response containing a temporary domain name. Please try again" qWarning() << "There were problems parsing the API response containing a temporary domain name. Please try again"
<< "via domain-server relaunch or from the domain-server settings."; << "via domain-server relaunch or from the domain-server settings.";
@ -394,6 +409,16 @@ void DomainServer::setupNodeListAndAssignments() {
const QVariant* idValueVariant = valueForKeyPath(settingsMap, METAVERSE_DOMAIN_ID_KEY_PATH); const QVariant* idValueVariant = valueForKeyPath(settingsMap, METAVERSE_DOMAIN_ID_KEY_PATH);
if (idValueVariant) { if (idValueVariant) {
nodeList->setSessionUUID(idValueVariant->toString()); nodeList->setSessionUUID(idValueVariant->toString());
// if we have an ID, we'll assume we're a metaverse domain
// now see if we think we're a temp domain (we have an API key) or a full domain
const auto& temporaryDomainKey = DependencyManager::get<AccountManager>()->getTemporaryDomainKey(getID());
if (temporaryDomainKey.isEmpty()) {
_type = MetaverseDomain;
} else {
_type = MetaverseTemporaryDomain;
}
} else { } else {
nodeList->setSessionUUID(QUuid::createUuid()); // Use random UUID nodeList->setSessionUUID(QUuid::createUuid()); // Use random UUID
} }
@ -477,14 +502,13 @@ bool DomainServer::resetAccountManagerAccessToken() {
} }
void DomainServer::setupAutomaticNetworking() { void DomainServer::setupAutomaticNetworking() {
qDebug() << "Updating automatic networking setting in domain-server to" << _automaticNetworkingSetting;
resetAccountManagerAccessToken();
_automaticNetworkingSetting = _automaticNetworkingSetting =
_settingsManager.valueOrDefaultValueForKeyPath(METAVERSE_AUTOMATIC_NETWORKING_KEY_PATH).toString(); _settingsManager.valueOrDefaultValueForKeyPath(METAVERSE_AUTOMATIC_NETWORKING_KEY_PATH).toString();
auto nodeList = DependencyManager::get<LimitedNodeList>(); qDebug() << "Configuring automatic networking in domain-server as" << _automaticNetworkingSetting;
if (_automaticNetworkingSetting != DISABLED_AUTOMATIC_NETWORKING_VALUE) {
const QUuid& domainID = getID(); const QUuid& domainID = getID();
if (_automaticNetworkingSetting == FULL_AUTOMATIC_NETWORKING_VALUE) { if (_automaticNetworkingSetting == FULL_AUTOMATIC_NETWORKING_VALUE) {
@ -499,6 +523,9 @@ void DomainServer::setupAutomaticNetworking() {
<< uuidStringWithoutCurlyBraces(domainID) << "via" << _oauthProviderURL.toString(); << uuidStringWithoutCurlyBraces(domainID) << "via" << _oauthProviderURL.toString();
if (_automaticNetworkingSetting == IP_ONLY_AUTOMATIC_NETWORKING_VALUE) { if (_automaticNetworkingSetting == IP_ONLY_AUTOMATIC_NETWORKING_VALUE) {
auto nodeList = DependencyManager::get<LimitedNodeList>();
// send any public socket changes to the data server so nodes can find us at our new IP // send any public socket changes to the data server so nodes can find us at our new IP
connect(nodeList.data(), &LimitedNodeList::publicSockAddrChanged, connect(nodeList.data(), &LimitedNodeList::publicSockAddrChanged,
this, &DomainServer::performIPAddressUpdate); this, &DomainServer::performIPAddressUpdate);
@ -515,6 +542,8 @@ void DomainServer::setupAutomaticNetworking() {
} }
} }
}
void DomainServer::setupHeartbeatToMetaverse() { void DomainServer::setupHeartbeatToMetaverse() {
// heartbeat to the data-server every 15s // heartbeat to the data-server every 15s
const int DOMAIN_SERVER_DATA_WEB_HEARTBEAT_MSECS = 15 * 1000; const int DOMAIN_SERVER_DATA_WEB_HEARTBEAT_MSECS = 15 * 1000;
@ -1139,6 +1168,8 @@ void DomainServer::handleMetaverseHeartbeatError(QNetworkReply& requestReply) {
return; return;
} }
// only attempt to grab a new temporary name if we're already a temporary domain server
if (_type == MetaverseTemporaryDomain) {
// check if we need to force a new temporary domain name // check if we need to force a new temporary domain name
switch (requestReply.error()) { switch (requestReply.error()) {
// if we have a temporary domain with a bad token, we get a 401 // if we have a temporary domain with a bad token, we get a 401
@ -1177,6 +1208,7 @@ void DomainServer::handleMetaverseHeartbeatError(QNetworkReply& requestReply) {
qWarning() << "Already attempted too many temporary domain requests. Please set a domain ID manually or restart."; qWarning() << "Already attempted too many temporary domain requests. Please set a domain ID manually or restart.";
} }
} }
}
void DomainServer::sendICEServerAddressToMetaverseAPI() { void DomainServer::sendICEServerAddressToMetaverseAPI() {
if (!_iceServerSocket.isNull()) { if (!_iceServerSocket.isNull()) {

View file

@ -42,6 +42,12 @@ public:
DomainServer(int argc, char* argv[]); DomainServer(int argc, char* argv[]);
~DomainServer(); ~DomainServer();
enum DomainType {
NonMetaverse,
MetaverseDomain,
MetaverseTemporaryDomain
};
static int const EXIT_CODE_REBOOT; static int const EXIT_CODE_REBOOT;
bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false); bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false);
@ -195,6 +201,8 @@ private:
int _numHeartbeatDenials { 0 }; int _numHeartbeatDenials { 0 };
bool _connectedToICEServer { false }; bool _connectedToICEServer { false };
DomainType _type { DomainType::NonMetaverse };
friend class DomainGatekeeper; friend class DomainGatekeeper;
friend class DomainMetadata; friend class DomainMetadata;
}; };