From 1666429e07d466e5600a86dab91a9795bbacafb4 Mon Sep 17 00:00:00 2001 From: Alek Rudnik Date: Tue, 2 Nov 2021 15:36:29 +0100 Subject: [PATCH] [EGD-7584] Fix OS factory reset There was an issue that we were deleting files which were still open. Added removed of FI .indexed file. --- .../service-db/ServiceDBCommon.cpp | 3 +++ .../agents/settings/SettingsAgent.cpp | 8 ++++++ .../agents/settings/SettingsAgent.hpp | 1 + .../include/service-db/DatabaseAgent.hpp | 1 + .../service-desktop/ServiceDesktop.cpp | 4 +-- .../SystemManager/SystemManagerCommon.cpp | 6 ++--- .../ServiceFileIndexer.cpp | 8 ++++++ .../service-fileindexer/StartupIndexer.cpp | 26 +++++++++++++++++-- .../ServiceFileIndexer.hpp | 1 + .../service-fileindexer/StartupIndexer.hpp | 4 +++ 10 files changed, 54 insertions(+), 8 deletions(-) diff --git a/module-services/service-db/ServiceDBCommon.cpp b/module-services/service-db/ServiceDBCommon.cpp index c5cb3605dc5291951179535bf667dd5bed23b518..16b5e3bac6ccdb079cc626f2ef7a70d8b1d43610 100644 --- a/module-services/service-db/ServiceDBCommon.cpp +++ b/module-services/service-db/ServiceDBCommon.cpp @@ -67,6 +67,9 @@ sys::ReturnCodes ServiceDBCommon::DeinitHandler() void ServiceDBCommon::ProcessCloseReason(sys::CloseReason closeReason) { if (closeReason == sys::CloseReason::FactoryReset) { + for (auto &dbAgent : databaseAgents) { + dbAgent->unRegisterMessages(); + } factoryReset(); } sendCloseReadyMessage(this); diff --git a/module-services/service-db/agents/settings/SettingsAgent.cpp b/module-services/service-db/agents/settings/SettingsAgent.cpp index e96f9a351343b2058f194b4d2b572035721e14ce..add52011fd183f42af438578eecde805128f17f3 100644 --- a/module-services/service-db/agents/settings/SettingsAgent.cpp +++ b/module-services/service-db/agents/settings/SettingsAgent.cpp @@ -67,6 +67,14 @@ void SettingsAgent::registerMessages() std::bind(&SettingsAgent::handleUnregisterOnVariableChange, this, _1)); } +void SettingsAgent::unRegisterMessages() +{ + parentService->disconnect(typeid(settings::Messages::GetVariable)); + parentService->disconnect(typeid(settings::Messages::SetVariable)); + parentService->disconnect(typeid(settings::Messages::RegisterOnVariableChange)); + parentService->disconnect(typeid(settings::Messages::UnregisterOnVariableChange)); +} + auto SettingsAgent::getDbInitString() -> const std::string { return {}; diff --git a/module-services/service-db/agents/settings/SettingsAgent.hpp b/module-services/service-db/agents/settings/SettingsAgent.hpp index 28926735cbf21913c2e0323e49e64a3f55a715a5..b4eb321fc7c7b9dd35c9fa659292ca816472dab8 100644 --- a/module-services/service-db/agents/settings/SettingsAgent.hpp +++ b/module-services/service-db/agents/settings/SettingsAgent.hpp @@ -32,6 +32,7 @@ class SettingsAgent : public DatabaseAgent void initDb() override; void deinitDb() override; void registerMessages() override; + void unRegisterMessages() override; auto getAgentName() -> const std::string override; auto getDbFilePath() -> const std::string override; diff --git a/module-services/service-db/include/service-db/DatabaseAgent.hpp b/module-services/service-db/include/service-db/DatabaseAgent.hpp index 6e9c5c3d796b76badc284558dc22d6dabcd6d4f5..416f30ce96614c75a615f619c6258e35722f89cb 100644 --- a/module-services/service-db/include/service-db/DatabaseAgent.hpp +++ b/module-services/service-db/include/service-db/DatabaseAgent.hpp @@ -24,6 +24,7 @@ class DatabaseAgent virtual void initDb() = 0; virtual void deinitDb() = 0; virtual void registerMessages() = 0; + virtual void unRegisterMessages() = 0; [[nodiscard]] virtual auto getAgentName() -> const std::string = 0; bool storeIntoFile(const std::filesystem::path &file) { diff --git a/module-services/service-desktop/ServiceDesktop.cpp b/module-services/service-desktop/ServiceDesktop.cpp index 70bb927be120e16d1525aec10375093f21e61b9f..56e646f3ef175fab85a23747eac491e348fe0766 100644 --- a/module-services/service-desktop/ServiceDesktop.cpp +++ b/module-services/service-desktop/ServiceDesktop.cpp @@ -224,7 +224,7 @@ sys::ReturnCodes ServiceDesktop::InitHandler() sys::ReturnCodes ServiceDesktop::DeinitHandler() { - LOG_ERROR(".. deinit .."); + LOG_DEBUG(".. deinit .."); if (initialized) { settings->deinit(); desktopWorker->deinit(); @@ -234,7 +234,7 @@ sys::ReturnCodes ServiceDesktop::DeinitHandler() void ServiceDesktop::ProcessCloseReason(sys::CloseReason closeReason) { - LOG_ERROR(".. close with reason .."); + LOG_DEBUG(".. close with reason .."); DeinitHandler(); sendCloseReadyMessage(this); } diff --git a/module-sys/SystemManager/SystemManagerCommon.cpp b/module-sys/SystemManager/SystemManagerCommon.cpp index f63f0c26c2ba416177dab4fe980a0bf6f2723ceb..b7ff7598c4f2d2f3387d35a03013b32ab4fc0c62 100644 --- a/module-sys/SystemManager/SystemManagerCommon.cpp +++ b/module-sys/SystemManager/SystemManagerCommon.cpp @@ -147,12 +147,10 @@ namespace sys LOG_INFO(" ---> REBOOT <--- "); powerManager->Reboot(); break; - case State::ShutdownReady: { + case State::ShutdownReady: LOG_INFO(" ---> SHUTDOWN <--- "); powerManager->PowerOff(); - } - - break; + break; case State::RebootToUpdate: LOG_INFO(" ---> REBOOT TO UPDATER <--- "); powerManager->RebootToUpdate(updateReason); diff --git a/products/PurePhone/services/service-fileindexer/ServiceFileIndexer.cpp b/products/PurePhone/services/service-fileindexer/ServiceFileIndexer.cpp index 71d099583521f33ae2e5f83fc9a702a53c82e26d..2a195af578fc23fc50bcfd4e0042c15c87bbf417 100644 --- a/products/PurePhone/services/service-fileindexer/ServiceFileIndexer.cpp +++ b/products/PurePhone/services/service-fileindexer/ServiceFileIndexer.cpp @@ -53,4 +53,12 @@ namespace service LOG_DEBUG("Switch to power Mode %s", c_str(mode)); return sys::ReturnCodes::Success; } + + void ServiceFileIndexer::ProcessCloseReason(sys::CloseReason closeReason) + { + if (closeReason == sys::CloseReason::FactoryReset) { + mStartupIndexer.reset(); + } + sendCloseReadyMessage(this); + } } // namespace service diff --git a/products/PurePhone/services/service-fileindexer/StartupIndexer.cpp b/products/PurePhone/services/service-fileindexer/StartupIndexer.cpp index a7fec3e06101ac58101260b161f5b8891ff0ece5..1fd5677970f43a7b0d92454615bb70a76115fbaf 100644 --- a/products/PurePhone/services/service-fileindexer/StartupIndexer.cpp +++ b/products/PurePhone/services/service-fileindexer/StartupIndexer.cpp @@ -51,6 +51,9 @@ namespace service::detail // On timer timeout auto StartupIndexer::onTimerTimeout(std::shared_ptr svc) -> void { + if (mForceStop) { + return; + } if (!mStarted) { mIdxTimer.restart(std::chrono::milliseconds{timer_indexing_delay}); mStarted = true; @@ -89,23 +92,42 @@ namespace service::detail LOG_INFO("Initial startup indexer - Started..."); mTopDirIterator = std::begin(start_dirs); setupTimers(svc, svc_name); + mForceStop = false; } else { LOG_INFO("Initial startup indexer - Not needed..."); } } - // Create lock file + void StartupIndexer::reset() + { + mForceStop = true; + mIdxTimer.stop(); + removeLockFile(); + } + auto StartupIndexer::createLockFile() -> bool { std::ofstream ofs(lock_file_name); ofs << time(nullptr); return ofs.good(); } - // Check if lock file exists + auto StartupIndexer::hasLockFile() -> bool { std::error_code ec; return fs::is_regular_file(lock_file_name, ec); } + + auto StartupIndexer::removeLockFile() -> bool + { + if (hasLockFile()) { + std::error_code ec; + if (!remove(lock_file_name, ec)) { + LOG_ERROR("Failed to remove lock file, error: %d", ec.value()); + return false; + } + } + return true; + } } // namespace service::detail diff --git a/products/PurePhone/services/service-fileindexer/include/service-fileindexer/ServiceFileIndexer.hpp b/products/PurePhone/services/service-fileindexer/include/service-fileindexer/ServiceFileIndexer.hpp index 875b5eab1679c2d9809320ec83f784cc7ebe7746..bdde92b611b40d1d9c1b504241bb30ee5b4957b5 100644 --- a/products/PurePhone/services/service-fileindexer/include/service-fileindexer/ServiceFileIndexer.hpp +++ b/products/PurePhone/services/service-fileindexer/include/service-fileindexer/ServiceFileIndexer.hpp @@ -23,6 +23,7 @@ namespace service sys::ReturnCodes InitHandler() override; sys::ReturnCodes DeinitHandler() override; sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override; + void ProcessCloseReason(sys::CloseReason closeReason) override; private: detail::InotifyHandler mInotifyHandler; diff --git a/products/PurePhone/services/service-fileindexer/include/service-fileindexer/StartupIndexer.hpp b/products/PurePhone/services/service-fileindexer/include/service-fileindexer/StartupIndexer.hpp index 4338d7e6676bb38bb8c78d166fd77956f345a086..79d9e74bb62ea2156a3b8ef5cbfa3deeb27ebe18 100644 --- a/products/PurePhone/services/service-fileindexer/include/service-fileindexer/StartupIndexer.hpp +++ b/products/PurePhone/services/service-fileindexer/include/service-fileindexer/StartupIndexer.hpp @@ -18,6 +18,7 @@ namespace service::detail StartupIndexer(const StartupIndexer &) = delete; StartupIndexer &operator=(StartupIndexer) = delete; auto start(std::shared_ptr svc, std::string_view svc_name) -> void; + void reset(); private: // Process single entry @@ -31,11 +32,14 @@ namespace service::detail static auto createLockFile() -> bool; // Check if lock file exists static auto hasLockFile() -> bool; + // remove lock file exists + static auto removeLockFile() -> bool; private: std::vector::const_iterator mTopDirIterator; std::filesystem::recursive_directory_iterator mSubDirIterator; sys::TimerHandle mIdxTimer; bool mStarted{}; + bool mForceStop{}; }; } // namespace service::detail