JSONDB performance improvements, threading fix.
This commit is contained in:
parent
cafbe44dde
commit
4f2a779769
6 changed files with 96 additions and 97 deletions
|
@ -431,6 +431,7 @@ static bool _parseRule(json &r,ZT_VirtualNetworkRule &rule)
|
|||
|
||||
EmbeddedNetworkController::EmbeddedNetworkController(Node *node,const char *dbPath) :
|
||||
_startTime(OSUtils::now()),
|
||||
_running(true),
|
||||
_db(dbPath),
|
||||
_node(node)
|
||||
{
|
||||
|
@ -438,12 +439,19 @@ EmbeddedNetworkController::EmbeddedNetworkController(Node *node,const char *dbPa
|
|||
|
||||
EmbeddedNetworkController::~EmbeddedNetworkController()
|
||||
{
|
||||
Mutex::Lock _l(_threads_m);
|
||||
if (_threads.size() > 0) {
|
||||
for(unsigned long i=0;i<(((unsigned long)_threads.size())*2);++i)
|
||||
_running = false;
|
||||
std::vector<Thread> t;
|
||||
{
|
||||
Mutex::Lock _l(_threads_m);
|
||||
t = _threads;
|
||||
}
|
||||
if (t.size() > 0) {
|
||||
for(unsigned long i=0,j=(unsigned long)(t.size() * 4);i<j;++i)
|
||||
_queue.post((_RQEntry *)0);
|
||||
for(std::vector<Thread>::iterator i(_threads.begin());i!=_threads.end();++i)
|
||||
/*
|
||||
for(std::vector<Thread>::iterator i(t.begin());i!=t.end();++i)
|
||||
Thread::join(*i);
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1111,23 +1119,23 @@ void EmbeddedNetworkController::threadMain()
|
|||
throw()
|
||||
{
|
||||
uint64_t lastCircuitTestCheck = 0;
|
||||
for(;;) {
|
||||
_RQEntry *const qe = _queue.get(); // waits on next request
|
||||
if (!qe) break; // enqueue a NULL to terminate threads
|
||||
_RQEntry *qe = (_RQEntry *)0;
|
||||
while ((_running)&&((qe = _queue.get()))) {
|
||||
try {
|
||||
_request(qe->nwid,qe->fromAddr,qe->requestPacketId,qe->identity,qe->metaData);
|
||||
} catch ( ... ) {}
|
||||
delete qe;
|
||||
|
||||
uint64_t now = OSUtils::now();
|
||||
if ((now - lastCircuitTestCheck) > ZT_EMBEDDEDNETWORKCONTROLLER_CIRCUIT_TEST_EXPIRATION) {
|
||||
lastCircuitTestCheck = now;
|
||||
Mutex::Lock _l(_tests_m);
|
||||
for(std::list< ZT_CircuitTest >::iterator i(_tests.begin());i!=_tests.end();) {
|
||||
if ((now - i->timestamp) > ZT_EMBEDDEDNETWORKCONTROLLER_CIRCUIT_TEST_EXPIRATION) {
|
||||
_node->circuitTestEnd(&(*i));
|
||||
_tests.erase(i++);
|
||||
} else ++i;
|
||||
if (_running) {
|
||||
uint64_t now = OSUtils::now();
|
||||
if ((now - lastCircuitTestCheck) > ZT_EMBEDDEDNETWORKCONTROLLER_CIRCUIT_TEST_EXPIRATION) {
|
||||
lastCircuitTestCheck = now;
|
||||
Mutex::Lock _l(_tests_m);
|
||||
for(std::list< ZT_CircuitTest >::iterator i(_tests.begin());i!=_tests.end();) {
|
||||
if ((now - i->timestamp) > ZT_EMBEDDEDNETWORKCONTROLLER_CIRCUIT_TEST_EXPIRATION) {
|
||||
_node->circuitTestEnd(&(*i));
|
||||
_tests.erase(i++);
|
||||
} else ++i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1723,13 +1731,11 @@ void EmbeddedNetworkController::_getNetworkMemberInfo(uint64_t now,uint64_t nwid
|
|||
char pfx[256];
|
||||
Utils::snprintf(pfx,sizeof(pfx),"network/%.16llx/member",nwid);
|
||||
|
||||
{
|
||||
Mutex::Lock _l(_nmiCache_m);
|
||||
std::map<uint64_t,_NetworkMemberInfo>::iterator c(_nmiCache.find(nwid));
|
||||
if ((c != _nmiCache.end())&&((now - c->second.nmiTimestamp) < 1000)) { // a short duration cache but limits CPU use on big networks
|
||||
nmi = c->second;
|
||||
return;
|
||||
}
|
||||
Mutex::Lock _l(_nmiCache_m);
|
||||
std::map<uint64_t,_NetworkMemberInfo>::iterator c(_nmiCache.find(nwid));
|
||||
if ((c != _nmiCache.end())&&((now - c->second.nmiTimestamp) < 1000)) { // a short duration cache but limits CPU use on big networks
|
||||
nmi = c->second;
|
||||
return;
|
||||
}
|
||||
|
||||
_db.filter(pfx,[&nmi,&now](const std::string &n,const json &member) {
|
||||
|
@ -1770,10 +1776,7 @@ void EmbeddedNetworkController::_getNetworkMemberInfo(uint64_t now,uint64_t nwid
|
|||
});
|
||||
nmi.nmiTimestamp = now;
|
||||
|
||||
{
|
||||
Mutex::Lock _l(_nmiCache_m);
|
||||
_nmiCache[nwid] = nmi;
|
||||
}
|
||||
_nmiCache[nwid] = nmi;
|
||||
}
|
||||
|
||||
void EmbeddedNetworkController::_pushMemberUpdate(uint64_t now,uint64_t nwid,const nlohmann::json &member)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue