mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-05 03:53:44 +02:00
Memo-ize some computed stuff to control CPU utilization.
This commit is contained in:
parent
3d948a930e
commit
1ebfca666d
2 changed files with 52 additions and 29 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue