Browse Source

Another performance improvement to controller.

Adam Ierymenko 8 years ago
parent
commit
7c184cf991
2 changed files with 27 additions and 13 deletions
  1. 25 10
      controller/JSONDB.cpp
  2. 2 3
      controller/JSONDB.hpp

+ 25 - 10
controller/JSONDB.cpp

@@ -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)

+ 2 - 3
controller/JSONDB.hpp

@@ -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