mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-04-15 14:56:33 +00:00
Don't write to ztc_network_status table anymore in central controller
This commit is contained in:
parent
d3728d5859
commit
692733fffb
@ -1389,129 +1389,6 @@ void PostgreSQL::onlineNotificationThread()
|
||||
PQclear(res);
|
||||
}
|
||||
|
||||
const int64_t now = OSUtils::now();
|
||||
if ((now - lastUpdatedNetworkStatus) > 10000) {
|
||||
lastUpdatedNetworkStatus = now;
|
||||
|
||||
std::vector<std::pair<uint64_t, std::shared_ptr<_Network>>> networks;
|
||||
{
|
||||
std::lock_guard<std::mutex> l(_networks_l);
|
||||
for (auto i = _networks.begin(); i != _networks.end(); ++i) {
|
||||
networks.push_back(*i);
|
||||
}
|
||||
}
|
||||
|
||||
std::stringstream networkUpdate;
|
||||
networkUpdate << "INSERT INTO ztc_network_status (network_id, bridge_count, authorized_member_count, online_member_count, total_member_count, last_modified) VALUES ";
|
||||
bool nwFirstRun = true;
|
||||
bool networkAdded = false;
|
||||
for (auto i = networks.begin(); i != networks.end(); ++i) {
|
||||
char tmp[64];
|
||||
Utils::hex(i->first, tmp);
|
||||
|
||||
std::string networkId(tmp);
|
||||
|
||||
std::vector<std::string> &_notUsed = updateMap[networkId];
|
||||
(void)_notUsed;
|
||||
|
||||
uint64_t authMemberCount = 0;
|
||||
uint64_t totalMemberCount = 0;
|
||||
uint64_t onlineMemberCount = 0;
|
||||
uint64_t bridgeCount = 0;
|
||||
uint64_t ts = now;
|
||||
{
|
||||
std::lock_guard<std::mutex> l2(i->second->lock);
|
||||
authMemberCount = i->second->authorizedMembers.size();
|
||||
totalMemberCount = i->second->members.size();
|
||||
bridgeCount = i->second->activeBridgeMembers.size();
|
||||
for (auto m=i->second->members.begin(); m != i->second->members.end(); ++m) {
|
||||
auto lo = lastOnlineCumulative.find(std::pair<uint64_t,uint64_t>(i->first, m->first));
|
||||
if (lo != lastOnlineCumulative.end()) {
|
||||
if ((now - lo->second) <= (ZT_NETWORK_AUTOCONF_DELAY * 2)) {
|
||||
++onlineMemberCount;
|
||||
} else {
|
||||
lastOnlineCumulative.erase(lo);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const char *nvals[1] = {
|
||||
networkId.c_str()
|
||||
};
|
||||
|
||||
res = PQexecParams(conn,
|
||||
"SELECT id FROM ztc_network WHERE id = $1",
|
||||
1,
|
||||
NULL,
|
||||
nvals,
|
||||
NULL,
|
||||
NULL,
|
||||
0);
|
||||
|
||||
if (PQresultStatus(res) != PGRES_TUPLES_OK) {
|
||||
fprintf(stderr, "Network lookup failed: %s", PQerrorMessage(conn));
|
||||
PQclear(res);
|
||||
continue;
|
||||
}
|
||||
|
||||
int nrows = PQntuples(res);
|
||||
PQclear(res);
|
||||
|
||||
if (nrows == 1) {
|
||||
std::string bc = std::to_string(bridgeCount);
|
||||
std::string amc = std::to_string(authMemberCount);
|
||||
std::string omc = std::to_string(onlineMemberCount);
|
||||
std::string tmc = std::to_string(totalMemberCount);
|
||||
std::string timestamp = std::to_string(ts);
|
||||
|
||||
if (nwFirstRun) {
|
||||
nwFirstRun = false;
|
||||
} else {
|
||||
networkUpdate << ", ";
|
||||
}
|
||||
|
||||
networkUpdate << "('" << networkId << "', " << bc << ", " << amc << ", " << omc << ", " << tmc << ", "
|
||||
<< "TO_TIMESTAMP(" << timestamp << "::double precision/1000))";
|
||||
|
||||
networkAdded = true;
|
||||
|
||||
} else if (nrows > 1) {
|
||||
fprintf(stderr, "Number of networks > 1?!?!?");
|
||||
continue;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
networkUpdate << " ON CONFLICT (network_id) DO UPDATE SET bridge_count = EXCLUDED.bridge_count, "
|
||||
<< "authorized_member_count = EXCLUDED.authorized_member_count, online_member_count = EXCLUDED.online_member_count, "
|
||||
<< "total_member_count = EXCLUDED.total_member_count, last_modified = EXCLUDED.last_modified";
|
||||
if (networkAdded) {
|
||||
res = PQexec(conn, networkUpdate.str().c_str());
|
||||
if (PQresultStatus(res) != PGRES_COMMAND_OK) {
|
||||
fprintf(stderr, "Error during multiple network upsert: %s", PQresultErrorMessage(res));
|
||||
}
|
||||
PQclear(res);
|
||||
}
|
||||
}
|
||||
|
||||
// for (auto it = updateMap.begin(); it != updateMap.end(); ++it) {
|
||||
// std::string networkId = it->first;
|
||||
// std::vector<std::string> members = it->second;
|
||||
// std::stringstream queryBuilder;
|
||||
|
||||
// std::string membersStr = ::join(members, ",");
|
||||
|
||||
// queryBuilder << "NOTIFY controller, '" << networkId << ":" << membersStr << "'";
|
||||
// std::string query = queryBuilder.str();
|
||||
|
||||
// PGresult *res = PQexec(conn,query.c_str());
|
||||
// if (PQresultStatus(res) != PGRES_COMMAND_OK) {
|
||||
// fprintf(stderr, "ERROR: Error sending NOTIFY: %s\n", PQresultErrorMessage(res));
|
||||
// }
|
||||
// PQclear(res);
|
||||
// }
|
||||
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
||||
}
|
||||
fprintf(stderr, "%s: Fell out of run loop in onlineNotificationThread\n", _myAddressStr.c_str());
|
||||
|
Loading…
x
Reference in New Issue
Block a user