From 5111f73da157233df0c8ed17ec89b666aef8f30f Mon Sep 17 00:00:00 2001 From: Wiebe Cazemier Date: Mon, 6 Sep 2021 21:51:41 +0200 Subject: [PATCH] Reduce blocking of threads when saving state --- mainapp.cpp | 30 +++++++++++++++++++++++++++++- mainapp.h | 4 ++++ subscriptionstore.cpp | 2 +- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/mainapp.cpp b/mainapp.cpp index 19c8b52..197f3dc 100644 --- a/mainapp.cpp +++ b/mainapp.cpp @@ -210,7 +210,7 @@ MainApp::MainApp(const std::string &configFilePath) : subscriptionStore->loadSessionsAndSubscriptions(settings->getSessionsDBFile()); } - auto fSaveState = std::bind(&MainApp::saveState, this); + auto fSaveState = std::bind(&MainApp::saveStateInThread, this); timer.addCallback(fSaveState, 900000, "Save state."); } @@ -355,8 +355,31 @@ void MainApp::queuePublishStatsOnDollarTopic() } } +/** + * @brief MainApp::saveStateInThread starts a thread for disk IO, because file IO is not async. + */ +void MainApp::saveStateInThread() +{ + // Prevent queueing it again when it's still running. + std::unique_lock locker(saveStateMutex, std::try_to_lock); + if (!locker.owns_lock()) + return; + + // Join previous instances. + if (saveStateThread.joinable()) + saveStateThread.join(); + + auto f = std::bind(&MainApp::saveState, this); + saveStateThread = std::thread(f); + + pthread_t native = saveStateThread.native_handle(); + pthread_setname_np(native, "SaveState"); +} + void MainApp::saveState() { + std::lock_guard lg(saveStateMutex); + try { if (!settings->storageDir.empty()) @@ -366,6 +389,8 @@ void MainApp::saveState() const std::string sessionsDBPath = settings->getSessionsDBFile(); subscriptionStore->saveSessionsAndSubscriptions(sessionsDBPath); + + logger->logf(LOG_INFO, "Saving states done"); } } catch(std::exception &ex) @@ -669,6 +694,9 @@ void MainApp::start() } saveState(); + + if (saveStateThread.joinable()) + saveStateThread.join(); } void MainApp::quit() diff --git a/mainapp.h b/mainapp.h index 1cb053c..1bd3406 100644 --- a/mainapp.h +++ b/mainapp.h @@ -71,6 +71,9 @@ class MainApp Logger *logger = Logger::getInstance(); + std::thread saveStateThread; + std::mutex saveStateMutex; + void setlimits(); void loadConfig(); void reloadConfig(); @@ -84,6 +87,7 @@ class MainApp void setFuzzFile(const std::string &fuzzFilePath); void queuePublishStatsOnDollarTopic(); void saveState(); + void saveStateInThread(); MainApp(const std::string &configFilePath); public: diff --git a/subscriptionstore.cpp b/subscriptionstore.cpp index 6f62d4b..0fbbde5 100644 --- a/subscriptionstore.cpp +++ b/subscriptionstore.cpp @@ -634,7 +634,7 @@ void SubscriptionStore::saveSessionsAndSubscriptions(const std::string &filePath logger->logf(LOG_INFO, "Saving sessions and subscriptions to '%s'", filePath.c_str()); RWLockGuard lock_guard(&subscriptionsRwlock); - lock_guard.wrlock(); + lock_guard.rdlock(); // First copy the sessions... -- libgit2 0.21.4