Another performance improvement to controller.

This commit is contained in:
Adam Ierymenko 2017-04-26 10:35:59 -07:00
parent 72def658d0
commit 7c184cf991
2 changed files with 27 additions and 13 deletions

View File

@ -26,7 +26,8 @@ static const nlohmann::json _EMPTY_JSON(nlohmann::json::object());
static const std::map<std::string,std::string> _ZT_JSONDB_GET_HEADERS; static const std::map<std::string,std::string> _ZT_JSONDB_GET_HEADERS;
JSONDB::JSONDB(const std::string &basePath) : JSONDB::JSONDB(const std::string &basePath) :
_basePath(basePath) _basePath(basePath),
_summaryThreadRun(true)
{ {
if ((_basePath.length() > 7)&&(_basePath.substr(0,7) == "http://")) { if ((_basePath.length() > 7)&&(_basePath.substr(0,7) == "http://")) {
// TODO: this doesn't yet support IPv6 since bracketed address notiation isn't supported. // TODO: this doesn't yet support IPv6 since bracketed address notiation isn't supported.
@ -67,14 +68,14 @@ JSONDB::~JSONDB()
Mutex::Lock _l(_networks_m); Mutex::Lock _l(_networks_m);
_networks.clear(); _networks.clear();
} }
Thread t;
{ {
Mutex::Lock _l(_summaryThread_m); Mutex::Lock _l(_summaryThread_m);
if (_summaryThread) { _summaryThreadRun = false;
_updateSummaryInfoQueue.post(0); t = _summaryThread;
_updateSummaryInfoQueue.post(0);
Thread::join(_summaryThread);
}
} }
if (t)
Thread::join(t);
} }
bool JSONDB::writeRaw(const std::string &n,const std::string &obj) bool JSONDB::writeRaw(const std::string &n,const std::string &obj)
@ -197,10 +198,21 @@ nlohmann::json JSONDB::eraseNetworkMember(const uint64_t networkId,const uint64_
void JSONDB::threadMain() void JSONDB::threadMain()
throw() throw()
{ {
uint64_t networkId = 0; std::vector<uint64_t> todo;
while ((networkId = _updateSummaryInfoQueue.get()) != 0) { while (_summaryThreadRun) {
const uint64_t now = OSUtils::now(); Thread::sleep(10);
{ {
Mutex::Lock _l(_summaryThread_m);
if (_summaryThreadToDo.empty())
continue;
else _summaryThreadToDo.swap(todo);
}
const uint64_t now = OSUtils::now();
for(std::vector<uint64_t>::iterator ii(todo.begin());ii!=todo.end();++ii) {
const uint64_t networkId = *ii;
Mutex::Lock _l(_networks_m); Mutex::Lock _l(_networks_m);
std::unordered_map<uint64_t,_NW>::iterator n(_networks.find(networkId)); std::unordered_map<uint64_t,_NW>::iterator n(_networks.find(networkId));
if (n != _networks.end()) { if (n != _networks.end()) {
@ -258,6 +270,8 @@ void JSONDB::threadMain()
n->second.summaryInfoLastComputed = now; n->second.summaryInfoLastComputed = now;
} }
} }
todo.clear();
} }
} }
@ -334,9 +348,10 @@ bool JSONDB::_load(const std::string &p)
void JSONDB::_recomputeSummaryInfo(const uint64_t networkId) void JSONDB::_recomputeSummaryInfo(const uint64_t networkId)
{ {
Mutex::Lock _l(_summaryThread_m); Mutex::Lock _l(_summaryThread_m);
if (std::find(_summaryThreadToDo.begin(),_summaryThreadToDo.end(),networkId) == _summaryThreadToDo.end())
_summaryThreadToDo.push_back(networkId);
if (!_summaryThread) if (!_summaryThread)
_summaryThread = Thread::start(this); _summaryThread = Thread::start(this);
_updateSummaryInfoQueue.post(networkId);
} }
std::string JSONDB::_genPath(const std::string &n,bool create) std::string JSONDB::_genPath(const std::string &n,bool create)

View File

@ -38,7 +38,6 @@
#include "../osdep/OSUtils.hpp" #include "../osdep/OSUtils.hpp"
#include "../osdep/Http.hpp" #include "../osdep/Http.hpp"
#include "../osdep/Thread.hpp" #include "../osdep/Thread.hpp"
#include "../osdep/BlockingQueue.hpp"
namespace ZeroTier { namespace ZeroTier {
@ -171,9 +170,9 @@ private:
std::string _basePath; std::string _basePath;
InetAddress _httpAddr; InetAddress _httpAddr;
BlockingQueue<uint64_t> _updateSummaryInfoQueue;
Thread _summaryThread; Thread _summaryThread;
std::vector<uint64_t> _summaryThreadToDo;
volatile bool _summaryThreadRun;
Mutex _summaryThread_m; Mutex _summaryThread_m;
struct _NW struct _NW