Move sso expiry into its own thread

No longer dependent on receiving a network config request
This commit is contained in:
Grant Limberg 2023-05-15 17:52:55 -07:00
commit c82e227d3f
No known key found for this signature in database
GPG key ID: 8F2F97D3BE8D7735
2 changed files with 45 additions and 32 deletions

View file

@ -468,6 +468,8 @@ EmbeddedNetworkController::EmbeddedNetworkController(Node *node,const char *ztPa
_path(dbPath), _path(dbPath),
_sender((NetworkController::Sender *)0), _sender((NetworkController::Sender *)0),
_db(this), _db(this),
_ssoExpiryRunning(true),
_ssoExpiry(std::thread(&EmbeddedNetworkController::_ssoExpiryThread, this)),
_rc(rc) _rc(rc)
{ {
} }
@ -476,9 +478,12 @@ EmbeddedNetworkController::~EmbeddedNetworkController()
{ {
std::lock_guard<std::mutex> l(_threads_l); std::lock_guard<std::mutex> l(_threads_l);
_queue.stop(); _queue.stop();
for(auto t=_threads.begin();t!=_threads.end();++t) for(auto t=_threads.begin();t!=_threads.end();++t) {
t->join(); t->join();
} }
_ssoExpiryRunning = false;
_ssoExpiry.join();
}
void EmbeddedNetworkController::setSSORedirectURL(const std::string &url) { void EmbeddedNetworkController::setSSORedirectURL(const std::string &url) {
_ssoRedirectURL = url; _ssoRedirectURL = url;
@ -1765,10 +1770,7 @@ void EmbeddedNetworkController::_startThreads()
const long hwc = std::max((long)std::thread::hardware_concurrency(),(long)1); const long hwc = std::max((long)std::thread::hardware_concurrency(),(long)1);
for(long t=0;t<hwc;++t) { for(long t=0;t<hwc;++t) {
_threads.emplace_back([this]() { _threads.emplace_back([this]() {
std::vector<_MemberStatusKey> expired;
nlohmann::json network, member;
for(;;) { for(;;) {
expired.clear();
_RQEntry *qe = (_RQEntry *)0; _RQEntry *qe = (_RQEntry *)0;
Metrics::network_config_request_queue_size = _queue.size(); Metrics::network_config_request_queue_size = _queue.size();
auto timedWaitResult = _queue.get(qe, 1000); auto timedWaitResult = _queue.get(qe, 1000);
@ -1787,7 +1789,15 @@ void EmbeddedNetworkController::_startThreads()
qe = nullptr; qe = nullptr;
} }
} }
}
});
}
}
void EmbeddedNetworkController::_ssoExpiryThread() {
while(_ssoExpiryRunning) {
std::vector<_MemberStatusKey> expired;
nlohmann::json network, member;
int64_t now = OSUtils::now(); int64_t now = OSUtils::now();
{ {
std::lock_guard<std::mutex> l(_expiringSoon_l); std::lock_guard<std::mutex> l(_expiringSoon_l);
@ -1815,8 +1825,7 @@ void EmbeddedNetworkController::_startThreads()
Metrics::sso_member_deauth++; Metrics::sso_member_deauth++;
onNetworkMemberDeauthorize(nullptr, e->networkId, e->nodeId); onNetworkMemberDeauthorize(nullptr, e->networkId, e->nodeId);
} }
} std::this_thread::sleep_for(std::chrono::milliseconds(500));
});
} }
} }

View file

@ -81,6 +81,7 @@ public:
private: private:
void _request(uint64_t nwid,const InetAddress &fromAddr,uint64_t requestPacketId,const Identity &identity,const Dictionary<ZT_NETWORKCONFIG_METADATA_DICT_CAPACITY> &metaData); void _request(uint64_t nwid,const InetAddress &fromAddr,uint64_t requestPacketId,const Identity &identity,const Dictionary<ZT_NETWORKCONFIG_METADATA_DICT_CAPACITY> &metaData);
void _startThreads(); void _startThreads();
void _ssoExpiryThread();
std::string networkUpdateFromPostData(uint64_t networkID, const std::string &body); std::string networkUpdateFromPostData(uint64_t networkID, const std::string &body);
@ -138,6 +139,9 @@ private:
std::vector<std::thread> _threads; std::vector<std::thread> _threads;
std::mutex _threads_l; std::mutex _threads_l;
bool _ssoExpiryRunning;
std::thread _ssoExpiry;
std::unordered_map< _MemberStatusKey,_MemberStatus,_MemberStatusHash > _memberStatus; std::unordered_map< _MemberStatusKey,_MemberStatus,_MemberStatusHash > _memberStatus;
std::mutex _memberStatus_l; std::mutex _memberStatus_l;