Fix inconsistency between cache and database
[platform/core/appfw/pkgmgr-info.git] / src / server / worker_thread.cc
index ab9b637..b623a2c 100644 (file)
 
 #include "abstract_parcelable.hh"
 #include "cynara_checker.hh"
+#include "db_change_observer.hh"
 #include "request_handler_factory.hh"
 #include "server/database/db_handle_provider.hh"
+#include "server/database/update_pending_cache_handler.hh"
 #include "utils/logging.hh"
 
 #include "pkgmgrinfo_debug.h"
@@ -126,6 +128,8 @@ void WorkerThread::Run() {
       }
 
       pkgmgr_common::ReqType type = req->GetRequestType();
+      if (pkgmgr_common::IsDbWriteRequest(type))
+        StopDbChangeListening();
       std::vector<std::string> privileges = GetPrivileges(type);
       if (!CynaraChecker::GetInst().CheckPrivilege(this, req, privileges))
         continue;
@@ -181,6 +185,14 @@ gboolean WorkerThread::TrimMemory(void* data) {
     h->timer_ = 0;
   }
 
+  auto crashed_writer_pids =
+      database::DBHandleProvider::CrashedWriteRequestPIDs();
+  if (!crashed_writer_pids.empty()) {
+    database::UpdatePendingCacheHandler db(getuid(), std::move(crashed_writer_pids), {});
+    db.SetLocale(h->locale_.GetObject());
+    db.Execute();
+  }
+
   sqlite3_release_memory(-1);
   malloc_trim(0);
   return G_SOURCE_REMOVE;
@@ -200,4 +212,14 @@ void WorkerThread::SendError(const std::shared_ptr<PkgRequest>& req) {
   req->SendData(p);
 }
 
+void WorkerThread::StopDbChangeListening() {
+  auto& db_observer = pkgmgr_common::DbChangeObserver::GetInst();
+
+  if (db_observer.GetDisposed())
+    return;
+
+  LOG(WARNING) << "Try stop listening db change";
+  db_observer.StopListening();
+}
+
 }  // namespace pkgmgr_server