mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-04-28 03:37:49 +02:00
moved save/delete profile disk oprations to separate threads
This commit is contained in:
parent
648a884a18
commit
733a4a2869
4 changed files with 72 additions and 27 deletions
|
@ -260,7 +260,13 @@ namespace data
|
|||
g_ProfilesStorage.Init(i2p::data::GetBase64SubstitutionTable(), 64);
|
||||
}
|
||||
|
||||
void PersistProfiles ()
|
||||
static void SaveProfilesToDisk (std::list<std::pair<i2p::data::IdentHash, std::shared_ptr<RouterProfile> > >&& profiles)
|
||||
{
|
||||
for (auto& it: profiles)
|
||||
if (it.second) it.second->Save (it.first);
|
||||
}
|
||||
|
||||
std::future<void> PersistProfiles ()
|
||||
{
|
||||
auto ts = GetTime ();
|
||||
std::list<std::pair<i2p::data::IdentHash, std::shared_ptr<RouterProfile> > > tmp;
|
||||
|
@ -278,8 +284,9 @@ namespace data
|
|||
it++;
|
||||
}
|
||||
}
|
||||
for (auto& it: tmp)
|
||||
if (it.second) it.second->Save (it.first);
|
||||
if (!tmp.empty ())
|
||||
return std::async (std::launch::async, SaveProfilesToDisk, std::move (tmp));
|
||||
return std::future<void>();
|
||||
}
|
||||
|
||||
void SaveProfiles ()
|
||||
|
@ -287,8 +294,7 @@ namespace data
|
|||
std::unordered_map<i2p::data::IdentHash, std::shared_ptr<RouterProfile> > tmp;
|
||||
{
|
||||
std::unique_lock<std::mutex> l(g_ProfilesMutex);
|
||||
tmp = g_Profiles;
|
||||
g_Profiles.clear ();
|
||||
std::swap (tmp, g_Profiles);
|
||||
}
|
||||
auto ts = GetTime ();
|
||||
for (auto& it: tmp)
|
||||
|
@ -296,7 +302,26 @@ namespace data
|
|||
it.second->Save (it.first);
|
||||
}
|
||||
|
||||
void DeleteObsoleteProfiles ()
|
||||
static void DeleteFilesFromDisk (std::vector<std::string>&& files)
|
||||
{
|
||||
struct stat st;
|
||||
std::time_t now = std::time(nullptr);
|
||||
for (const auto& path: files)
|
||||
{
|
||||
if (stat(path.c_str(), &st) != 0)
|
||||
{
|
||||
LogPrint(eLogWarning, "Profiling: Can't stat(): ", path);
|
||||
continue;
|
||||
}
|
||||
if (now - st.st_mtime >= PEER_PROFILE_EXPIRATION_TIMEOUT*3600)
|
||||
{
|
||||
LogPrint(eLogDebug, "Profiling: Removing expired peer profile: ", path);
|
||||
i2p::fs::Remove(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::future<void> DeleteObsoleteProfiles ()
|
||||
{
|
||||
{
|
||||
auto ts = GetTime ();
|
||||
|
@ -310,21 +335,9 @@ namespace data
|
|||
}
|
||||
}
|
||||
|
||||
struct stat st;
|
||||
std::time_t now = std::time(nullptr);
|
||||
|
||||
std::vector<std::string> files;
|
||||
g_ProfilesStorage.Traverse(files);
|
||||
for (const auto& path: files) {
|
||||
if (stat(path.c_str(), &st) != 0) {
|
||||
LogPrint(eLogWarning, "Profiling: Can't stat(): ", path);
|
||||
continue;
|
||||
}
|
||||
if (now - st.st_mtime >= PEER_PROFILE_EXPIRATION_TIMEOUT*3600) {
|
||||
LogPrint(eLogDebug, "Profiling: Removing expired peer profile: ", path);
|
||||
i2p::fs::Remove(path);
|
||||
}
|
||||
}
|
||||
return std::async (std::launch::async, DeleteFilesFromDisk, std::move (files));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue