Memo-ize some computed stuff to control CPU utilization.

This commit is contained in:
Adam Ierymenko 2016-11-09 12:34:20 -08:00
parent 3d948a930e
commit 1ebfca666d
2 changed files with 52 additions and 29 deletions

View file

@ -1535,6 +1535,9 @@ unsigned int EmbeddedNetworkController::handleControlPlaneHttpDELETE(
return false; // delete return false; // delete
}); });
Mutex::Lock _l2(_nmiCache_m);
_nmiCache.erase(nwid);
responseBody = network.dump(2); responseBody = network.dump(2);
responseContentType = "application/json"; responseContentType = "application/json";
return 200; return 200;
@ -1614,43 +1617,60 @@ void EmbeddedNetworkController::_getNetworkMemberInfo(uint64_t now,uint64_t nwid
char pfx[256]; char pfx[256];
Utils::snprintf(pfx,sizeof(pfx),"network/%.16llx/member",nwid); Utils::snprintf(pfx,sizeof(pfx),"network/%.16llx/member",nwid);
Mutex::Lock _l(_db_m); {
_db.filter(pfx,120000,[&nmi,&now](const std::string &n,const json &member) { Mutex::Lock _l(_nmiCache_m);
try { std::map<uint64_t,_NetworkMemberInfo>::iterator c(_nmiCache.find(nwid));
if (_jB(member["authorized"],false)) { if ((c != _nmiCache.end())&&((now - c->second.nmiTimestamp) < 1000)) { // a short duration cache but limits CPU use on big networks
++nmi.authorizedMemberCount; nmi = c->second;
return;
}
}
if (member.count("recentLog")) { {
const json &mlog = member["recentLog"]; Mutex::Lock _l(_db_m);
if ((mlog.is_array())&&(mlog.size() > 0)) { _db.filter(pfx,120000,[&nmi,&now](const std::string &n,const json &member) {
const json &mlog1 = mlog[0]; try {
if (mlog1.is_object()) { if (_jB(member["authorized"],false)) {
if ((now - _jI(mlog1["ts"],0ULL)) < ZT_NETCONF_NODE_ACTIVE_THRESHOLD) ++nmi.authorizedMemberCount;
++nmi.activeMemberCount;
if (member.count("recentLog")) {
const json &mlog = member["recentLog"];
if ((mlog.is_array())&&(mlog.size() > 0)) {
const json &mlog1 = mlog[0];
if (mlog1.is_object()) {
if ((now - _jI(mlog1["ts"],0ULL)) < ZT_NETCONF_NODE_ACTIVE_THRESHOLD)
++nmi.activeMemberCount;
}
} }
} }
}
if (_jB(member["activeBridge"],false)) { if (_jB(member["activeBridge"],false)) {
nmi.activeBridges.insert(_jS(member["id"],"0000000000")); nmi.activeBridges.insert(_jS(member["id"],"0000000000"));
} }
if (member.count("ipAssignments")) { if (member.count("ipAssignments")) {
const json &mips = member["ipAssignments"]; const json &mips = member["ipAssignments"];
if (mips.is_array()) { if (mips.is_array()) {
for(unsigned long i=0;i<mips.size();++i) { for(unsigned long i=0;i<mips.size();++i) {
InetAddress mip(_jS(mips[i],"")); InetAddress mip(_jS(mips[i],""));
if ((mip.ss_family == AF_INET)||(mip.ss_family == AF_INET6)) if ((mip.ss_family == AF_INET)||(mip.ss_family == AF_INET6))
nmi.allocatedIps.insert(mip); nmi.allocatedIps.insert(mip);
}
} }
} }
} else {
nmi.mostRecentDeauthTime = std::max(nmi.mostRecentDeauthTime,_jI(member["lastDeauthorizedTime"],0ULL));
} }
} else { } catch ( ... ) {}
nmi.mostRecentDeauthTime = std::max(nmi.mostRecentDeauthTime,_jI(member["lastDeauthorizedTime"],0ULL)); return true;
} });
} catch ( ... ) {} }
return true; nmi.nmiTimestamp = now;
});
{
Mutex::Lock _l(_nmiCache_m);
_nmiCache[nwid] = nmi;
}
} }
} // namespace ZeroTier } // namespace ZeroTier

View file

@ -96,7 +96,10 @@ private:
unsigned long activeMemberCount; unsigned long activeMemberCount;
unsigned long totalMemberCount; unsigned long totalMemberCount;
uint64_t mostRecentDeauthTime; uint64_t mostRecentDeauthTime;
uint64_t nmiTimestamp; // time this NMI structure was computed
}; };
std::map<uint64_t,_NetworkMemberInfo> _nmiCache;
Mutex _nmiCache_m;
void _getNetworkMemberInfo(uint64_t now,uint64_t nwid,_NetworkMemberInfo &nmi); void _getNetworkMemberInfo(uint64_t now,uint64_t nwid,_NetworkMemberInfo &nmi);
// These init objects with default and static/informational fields // These init objects with default and static/informational fields