Jelajahi Sumber

Add optional function in DB change listener for member online events.

Adam Ierymenko 6 tahun lalu
induk
melakukan
a77b4ecddb
5 mengubah file dengan 38 tambahan dan 21 penghapusan
  1. 1 0
      controller/DB.hpp
  2. 9 6
      controller/FileDB.cpp
  3. 0 1
      controller/FileDB.hpp
  4. 16 9
      controller/LFDB.cpp
  5. 12 5
      controller/PostgreSQL.cpp

+ 1 - 0
controller/DB.hpp

@@ -61,6 +61,7 @@ public:
 		virtual void onNetworkUpdate(uint64_t networkId,const nlohmann::json &network) {}
 		virtual void onNetworkMemberUpdate(uint64_t networkId,uint64_t memberId,const nlohmann::json &member) {}
 		virtual void onNetworkMemberDeauthorize(uint64_t networkId,uint64_t memberId) {}
+		virtual void onNetworkMemberOnline(uint64_t networkId,uint64_t memberId,const InetAddress &physicalAddress) {}
 	};
 
 	struct NetworkSummaryInfo

+ 9 - 6
controller/FileDB.cpp

@@ -33,7 +33,6 @@ FileDB::FileDB(const Identity &myId,const char *path) :
 	DB(myId,path),
 	_networksPath(_path + ZT_PATH_SEPARATOR_S + "network"),
 	_tracePath(_path + ZT_PATH_SEPARATOR_S + "trace"),
-	_onlineChanged(false),
 	_running(true)
 {
 	OSUtils::mkdir(_path.c_str());
@@ -152,7 +151,6 @@ void FileDB::eraseNetwork(const uint64_t networkId)
 	_networkChanged(network,nullJson,true);
 	std::lock_guard<std::mutex> l(this->_online_l);
 	this->_online.erase(networkId);
-	this->_onlineChanged = true;
 }
 
 void FileDB::eraseMember(const uint64_t networkId,const uint64_t memberId)
@@ -166,7 +164,6 @@ void FileDB::eraseMember(const uint64_t networkId,const uint64_t memberId)
 	_memberChanged(member,nullJson,true);
 	std::lock_guard<std::mutex> l(this->_online_l);
 	this->_online[networkId].erase(memberId);
-	this->_onlineChanged = true;
 }
 
 void FileDB::nodeIsOnline(const uint64_t networkId,const uint64_t memberId,const InetAddress &physicalAddress)
@@ -174,9 +171,15 @@ void FileDB::nodeIsOnline(const uint64_t networkId,const uint64_t memberId,const
 	char mid[32],atmp[64];
 	OSUtils::ztsnprintf(mid,sizeof(mid),"%.10llx",(unsigned long long)memberId);
 	physicalAddress.toString(atmp);
-	std::lock_guard<std::mutex> l(this->_online_l);
-	this->_online[networkId][memberId][OSUtils::now()] = physicalAddress;
-	this->_onlineChanged = true;
+	{
+		std::lock_guard<std::mutex> l(this->_online_l);
+		this->_online[networkId][memberId][OSUtils::now()] = physicalAddress;
+	}
+	{
+		std::lock_guard<std::mutex> l2(_changeListeners_l);
+		for(auto i=_changeListeners.begin();i!=_changeListeners.end();++i)
+			(*i)->onNetworkMemberOnline(networkId,memberId,physicalAddress);
+	}
 }
 
 } // namespace ZeroTier

+ 0 - 1
controller/FileDB.hpp

@@ -51,7 +51,6 @@ protected:
 	std::thread _onlineUpdateThread;
 	std::map< uint64_t,std::map<uint64_t,std::map<int64_t,InetAddress> > > _online;
 	std::mutex _online_l;
-	bool _onlineChanged;
 	bool _running;
 };
 

+ 16 - 9
controller/LFDB.cpp

@@ -384,17 +384,24 @@ void LFDB::eraseMember(const uint64_t networkId,const uint64_t memberId)
 
 void LFDB::nodeIsOnline(const uint64_t networkId,const uint64_t memberId,const InetAddress &physicalAddress)
 {
-	std::lock_guard<std::mutex> l(_state_l);
-	auto nw = _state.find(networkId);
-	if (nw != _state.end()) {
-		auto m = nw->second.members.find(memberId);
-		if (m != nw->second.members.end()) {
-			m->second.lastOnlineTime = OSUtils::now();
-			if (physicalAddress)
-				m->second.lastOnlineAddress = physicalAddress;
-			m->second.lastOnlineDirty = true;
+	{
+		std::lock_guard<std::mutex> l(_state_l);
+		auto nw = _state.find(networkId);
+		if (nw != _state.end()) {
+			auto m = nw->second.members.find(memberId);
+			if (m != nw->second.members.end()) {
+				m->second.lastOnlineTime = OSUtils::now();
+				if (physicalAddress)
+					m->second.lastOnlineAddress = physicalAddress;
+				m->second.lastOnlineDirty = true;
+			}
 		}
 	}
+	{
+		std::lock_guard<std::mutex> l2(_changeListeners_l);
+		for(auto i=_changeListeners.begin();i!=_changeListeners.end();++i)
+			(*i)->onNetworkMemberOnline(networkId,memberId,physicalAddress);
+	}
 }
 
 } // namespace ZeroTier

+ 12 - 5
controller/PostgreSQL.cpp

@@ -210,11 +210,18 @@ void PostgreSQL::eraseMember(const uint64_t networkId, const uint64_t memberId)
 
 void PostgreSQL::nodeIsOnline(const uint64_t networkId, const uint64_t memberId, const InetAddress &physicalAddress)
 {
-	std::lock_guard<std::mutex> l(_lastOnline_l);
-	std::pair<int64_t, InetAddress> &i = _lastOnline[std::pair<uint64_t,uint64_t>(networkId, memberId)];
-	i.first = OSUtils::now();
-	if (physicalAddress) {
-		i.second = physicalAddress;
+	{
+		std::lock_guard<std::mutex> l(_lastOnline_l);
+		std::pair<int64_t, InetAddress> &i = _lastOnline[std::pair<uint64_t,uint64_t>(networkId, memberId)];
+		i.first = OSUtils::now();
+		if (physicalAddress) {
+			i.second = physicalAddress;
+		}
+	}
+	{
+		std::lock_guard<std::mutex> l2(_changeListeners_l);
+		for(auto i=_changeListeners.begin();i!=_changeListeners.end();++i)
+			(*i)->onNetworkMemberOnline(networkId,memberId,physicalAddress);
 	}
 }