Fix a deadlock and some more work on RethinkDB (for central) integration.

This commit is contained in:
Adam Ierymenko 2017-11-08 11:06:14 -08:00
parent 53e7e950f1
commit 4166d8ca35
7 changed files with 106 additions and 83 deletions

View file

@ -734,12 +734,7 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpPOST(
member["nwid"] = nwids;
_removeMemberNonPersistedFields(member);
if (member != origMember) {
json &revj = member["revision"];
member["revision"] = (revj.is_number() ? ((uint64_t)revj + 1ULL) : 1ULL);
_db->save(member);
}
_db->save(&origMember,member);
_addMemberNonPersistedFields(nwid,address,member,now);
responseBody = OSUtils::jsonDump(member);
responseContentType = "application/json";
@ -986,12 +981,7 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpPOST(
network["nwid"] = nwids; // legacy
_removeNetworkNonPersistedFields(network);
if (network != origNetwork) {
json &revj = network["revision"];
network["revision"] = (revj.is_number() ? ((uint64_t)revj + 1ULL) : 1ULL);
_db->save(network);
}
_db->save(&origNetwork,network);
ControllerDB::NetworkSummaryInfo ns;
_db->summary(nwid,ns);
_addNetworkNonPersistedFields(nwid,network,now,ns);
@ -1116,7 +1106,7 @@ void EmbeddedNetworkController::handleRemoteTrace(const ZT_RemoteTrace &rt)
d["objtype"] = "trace";
d["ts"] = now;
d["nodeId"] = Utils::hex10(rt.origin,tmp);
_db->save(d);
_db->save((nlohmann::json *)0,d);
} catch ( ... ) {
// drop invalid trace messages if an error occurs
}
@ -1185,6 +1175,8 @@ void EmbeddedNetworkController::_request(
ms.lastRequestTime = now;
}
_db->nodeIsOnline(identity.address().toInt());
Utils::hex(nwid,nwids);
_db->get(nwid,network,identity.address().toInt(),member,ns);
if ((!network.is_object())||(network.size() == 0)) {
@ -1299,11 +1291,7 @@ void EmbeddedNetworkController::_request(
} else {
// If they are not authorized, STOP!
_removeMemberNonPersistedFields(member);
if (origMember != member) {
json &revj = member["revision"];
member["revision"] = (revj.is_number() ? ((uint64_t)revj + 1ULL) : 1ULL);
_db->save(member);
}
_db->save(&origMember,member);
_sender->ncSendError(nwid,requestPacketId,identity.address(),NetworkController::NC_ERROR_ACCESS_DENIED);
return;
}
@ -1666,12 +1654,7 @@ void EmbeddedNetworkController::_request(
}
_removeMemberNonPersistedFields(member);
if (member != origMember) {
json &revj = member["revision"];
member["revision"] = (revj.is_number() ? ((uint64_t)revj + 1ULL) : 1ULL);
_db->save(member);
}
_db->save(&origMember,member);
_sender->ncSendConfig(nwid,requestPacketId,identity.address(),*(nc.get()),metaData.getUI(ZT_NETWORKCONFIG_REQUEST_METADATA_KEY_VERSION,0) < 6);
}