summaryrefslogtreecommitdiff
path: root/controller/LFDB.cpp
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2019-08-06 10:42:54 -0500
committerAdam Ierymenko <adam.ierymenko@gmail.com>2019-08-06 10:42:54 -0500
commit00fb9c475e7bd68a12d6d581539862c31aeb2e74 (patch)
tree2f8423fff1914998fd858e1b4214a0394437974c /controller/LFDB.cpp
parent3c776675b3824d4497d913386793efaece2ee7d1 (diff)
downloadinfinitytier-00fb9c475e7bd68a12d6d581539862c31aeb2e74.tar.gz
infinitytier-00fb9c475e7bd68a12d6d581539862c31aeb2e74.zip
More work on DB mirroring.
Diffstat (limited to 'controller/LFDB.cpp')
-rw-r--r--controller/LFDB.cpp37
1 files changed, 17 insertions, 20 deletions
diff --git a/controller/LFDB.cpp b/controller/LFDB.cpp
index 5bf0aaf7..5dd6d082 100644
--- a/controller/LFDB.cpp
+++ b/controller/LFDB.cpp
@@ -38,7 +38,7 @@ namespace ZeroTier
{
LFDB::LFDB(const Identity &myId,const char *path,const char *lfOwnerPrivate,const char *lfOwnerPublic,const char *lfNodeHost,int lfNodePort,bool storeOnlineState) :
- DB(myId,path),
+ DB(),
_myId(myId),
_lfOwnerPrivate((lfOwnerPrivate) ? lfOwnerPrivate : ""),
_lfOwnerPublic((lfOwnerPublic) ? lfOwnerPublic : ""),
@@ -335,8 +335,9 @@ bool LFDB::isReady()
return (_ready.load());
}
-void LFDB::save(nlohmann::json &record)
+bool LFDB::save(nlohmann::json &record,bool notifyListeners)
{
+ bool modified = false;
const std::string objtype = record["objtype"];
if (objtype == "network") {
const uint64_t nwid = OSUtils::jsonIntHex(record["id"],0ULL);
@@ -345,11 +346,12 @@ void LFDB::save(nlohmann::json &record)
get(nwid,old);
if ((!old.is_object())||(old != record)) {
record["revision"] = OSUtils::jsonInt(record["revision"],0ULL) + 1ULL;
- _networkChanged(old,record,true);
+ _networkChanged(old,record,notifyListeners);
{
std::lock_guard<std::mutex> l(_state_l);
_state[nwid].dirty = true;
}
+ modified = true;
}
}
} else if (objtype == "member") {
@@ -360,14 +362,16 @@ void LFDB::save(nlohmann::json &record)
get(nwid,network,id,old);
if ((!old.is_object())||(old != record)) {
record["revision"] = OSUtils::jsonInt(record["revision"],0ULL) + 1ULL;
- _memberChanged(old,record,true);
+ _memberChanged(old,record,notifyListeners);
{
std::lock_guard<std::mutex> l(_state_l);
_state[nwid].members[id].dirty = true;
}
+ modified = true;
}
}
}
+ return modified;
}
void LFDB::eraseNetwork(const uint64_t networkId)
@@ -382,24 +386,17 @@ 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(this,networkId,memberId,physicalAddress);
- }
}
} // namespace ZeroTier