summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2019-08-04 19:55:52 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2019-08-04 19:55:52 -0700
commita77b4ecddb43cd8581c7ebaeb8fcc9b5dac10573 (patch)
treea594e06141299d32a4da746c6d5c214fb484100d
parent818b7e4a2e35adfc241aed38e90b34580e6b5d9d (diff)
downloadinfinitytier-a77b4ecddb43cd8581c7ebaeb8fcc9b5dac10573.tar.gz
infinitytier-a77b4ecddb43cd8581c7ebaeb8fcc9b5dac10573.zip
Add optional function in DB change listener for member online events.
-rw-r--r--controller/DB.hpp1
-rw-r--r--controller/FileDB.cpp15
-rw-r--r--controller/FileDB.hpp1
-rw-r--r--controller/LFDB.cpp25
-rw-r--r--controller/PostgreSQL.cpp17
5 files changed, 38 insertions, 21 deletions
diff --git a/controller/DB.hpp b/controller/DB.hpp
index f499d387..85920eec 100644
--- a/controller/DB.hpp
+++ b/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
diff --git a/controller/FileDB.cpp b/controller/FileDB.cpp
index cda978b8..484aefa5 100644
--- a/controller/FileDB.cpp
+++ b/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
diff --git a/controller/FileDB.hpp b/controller/FileDB.hpp
index 5d55d0a4..33efb725 100644
--- a/controller/FileDB.hpp
+++ b/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;
};
diff --git a/controller/LFDB.cpp b/controller/LFDB.cpp
index f0c8ebfb..999eca72 100644
--- a/controller/LFDB.cpp
+++ b/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
diff --git a/controller/PostgreSQL.cpp b/controller/PostgreSQL.cpp
index e2bcfe58..709712b5 100644
--- a/controller/PostgreSQL.cpp
+++ b/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);
}
}