mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-01-19 03:06:26 +00:00
Another performance improvement to controller.
This commit is contained in:
parent
72def658d0
commit
7c184cf991
@ -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)
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user