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;
JSONDB::JSONDB(const std::string &basePath) :
_basePath(basePath)
_basePath(basePath),
_summaryThreadRun(true)
{
if ((_basePath.length() > 7)&&(_basePath.substr(0,7) == "http://")) {
// 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);
_networks.clear();
}
Thread t;
{
Mutex::Lock _l(_summaryThread_m);
if (_summaryThread) {
_updateSummaryInfoQueue.post(0);
_updateSummaryInfoQueue.post(0);
Thread::join(_summaryThread);
}
_summaryThreadRun = false;
t = _summaryThread;
}
if (t)
Thread::join(t);
}
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()
throw()
{
uint64_t networkId = 0;
while ((networkId = _updateSummaryInfoQueue.get()) != 0) {
const uint64_t now = OSUtils::now();
std::vector<uint64_t> todo;
while (_summaryThreadRun) {
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);
std::unordered_map<uint64_t,_NW>::iterator n(_networks.find(networkId));
if (n != _networks.end()) {
@ -258,6 +270,8 @@ void JSONDB::threadMain()
n->second.summaryInfoLastComputed = now;
}
}
todo.clear();
}
}
@ -334,9 +348,10 @@ bool JSONDB::_load(const std::string &p)
void JSONDB::_recomputeSummaryInfo(const uint64_t networkId)
{
Mutex::Lock _l(_summaryThread_m);
if (std::find(_summaryThreadToDo.begin(),_summaryThreadToDo.end(),networkId) == _summaryThreadToDo.end())
_summaryThreadToDo.push_back(networkId);
if (!_summaryThread)
_summaryThread = Thread::start(this);
_updateSummaryInfoQueue.post(networkId);
}
std::string JSONDB::_genPath(const std::string &n,bool create)

View File

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