2021-03-17 19:07:40 +00:00
|
|
|
#include "core/CNShared.hpp"
|
2020-08-18 20:42:30 +00:00
|
|
|
|
2022-07-31 01:16:07 +00:00
|
|
|
static std::unordered_map<int64_t, LoginMetadata*> logins;
|
2022-07-23 22:16:04 +00:00
|
|
|
static std::mutex mtx;
|
2020-08-18 20:42:30 +00:00
|
|
|
|
2022-07-23 22:16:04 +00:00
|
|
|
void CNShared::storeLoginMetadata(int64_t sk, LoginMetadata *lm) {
|
|
|
|
std::lock_guard<std::mutex> lock(mtx);
|
|
|
|
|
|
|
|
// take ownership of connection data
|
2022-07-31 01:16:07 +00:00
|
|
|
logins[sk] = lm;
|
2020-08-18 20:42:30 +00:00
|
|
|
}
|
|
|
|
|
2022-07-23 22:16:04 +00:00
|
|
|
LoginMetadata* CNShared::getLoginMetadata(int64_t sk) {
|
|
|
|
std::lock_guard<std::mutex> lock(mtx);
|
|
|
|
|
|
|
|
// fail if the key isn't found
|
2022-07-31 01:16:07 +00:00
|
|
|
if (logins.find(sk) == logins.end())
|
2022-07-23 22:16:04 +00:00
|
|
|
return nullptr;
|
|
|
|
|
|
|
|
// transfer ownership of connection data to shard
|
2022-07-31 01:16:07 +00:00
|
|
|
LoginMetadata *lm = logins[sk];
|
|
|
|
logins.erase(sk);
|
2020-08-19 17:22:54 +00:00
|
|
|
|
2022-07-23 22:16:04 +00:00
|
|
|
return lm;
|
2020-08-18 20:42:30 +00:00
|
|
|
}
|
|
|
|
|
2022-07-23 22:16:04 +00:00
|
|
|
void CNShared::pruneLoginMetadata(CNServer *serv, time_t currTime) {
|
|
|
|
std::lock_guard<std::mutex> lock(mtx);
|
|
|
|
|
2022-07-31 01:16:07 +00:00
|
|
|
auto it = logins.begin();
|
|
|
|
while (it != logins.end()) {
|
2022-07-23 22:16:04 +00:00
|
|
|
auto& sk = it->first;
|
|
|
|
auto& lm = it->second;
|
|
|
|
|
|
|
|
if (lm->timestamp + CNSHARED_TIMEOUT > currTime) {
|
|
|
|
std::cout << "[WARN] Pruning hung connection attempt" << std::endl;
|
2020-08-18 20:42:30 +00:00
|
|
|
|
2022-07-23 22:16:04 +00:00
|
|
|
// deallocate object and remove map entry
|
2022-07-31 01:16:07 +00:00
|
|
|
delete logins[sk];
|
|
|
|
it = logins.erase(it); // skip the invalidated iterator
|
2022-07-23 22:16:04 +00:00
|
|
|
} else {
|
|
|
|
it++;
|
|
|
|
}
|
|
|
|
}
|
2020-08-18 20:42:30 +00:00
|
|
|
}
|