Fix inconsistency between cache and database
[platform/core/appfw/pkgmgr-info.git] / src / server / runner.cc
index f1092d4..2d29a93 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd All Rights Reserved
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -27,6 +27,7 @@
 #include "create_cache_request.hh"
 #include "cynara_checker.hh"
 #include "pkg_request.hh"
+#include "remove_all_cache_request.hh"
 #include "runner.hh"
 #include "utils/logging.hh"
 
@@ -57,21 +58,25 @@ Runner::Runner(unsigned int thread_num) {
   SetCPUInheritance();
   auto condition = static_cast<GIOCondition>(G_IO_IN);
   sid_ = g_unix_fd_add(server_->GetFd(), condition, OnReceiveRequest, this);
+  default_uid_ = tzplatform_getuid(TZ_SYS_DEFAULT_USER);
   pkgmgr_common::SystemLocale::GetInst().RegisterEvent(this);
+  pkgmgr_common::DbChangeObserver::GetInst().Listen();
+  pkgmgr_common::DbChangeObserver::GetInst().RegisterEvent(this);
   thread_pool_->SetLocale(pkgmgr_common::SystemLocale::GetInst().Get());
 
-  if (CacheFlag::SetPreparing()) {
-    QueueRequest(
-        std::make_shared<CreateCacheRequest>(
-            tzplatform_getuid(TZ_SYS_DEFAULT_USER)));
-  }
+  if (CacheFlag::SetPreparing())
+    QueueRequest(std::make_shared<CreateCacheRequest>(default_uid_, this));
+
   LOGI("Start Runner");
 }
 
 Runner::~Runner() {
   g_source_remove(sid_);
+  if (timer_ > 0)
+    g_source_remove(timer_);
   CynaraChecker::GetInst().Fini();
   pkgmgr_common::SystemLocale::GetInst().UnRegisterEvent();
+  pkgmgr_common::DbChangeObserver::GetInst().UnRegisterEvent();
 }
 
 int Runner::OnReceiveRequest(int fd, GIOCondition cond, void* user_data) {
@@ -86,7 +91,7 @@ int Runner::OnReceiveRequest(int fd, GIOCondition cond, void* user_data) {
 
   if (CacheFlag::SetPreparing()) {
     runner->QueueRequest(
-        std::make_shared<CreateCacheRequest>(req->GetSenderUID()));
+        std::make_shared<CreateCacheRequest>(runner->default_uid_, runner));
   }
   runner->QueueRequest(std::move(req));
 
@@ -95,6 +100,12 @@ int Runner::OnReceiveRequest(int fd, GIOCondition cond, void* user_data) {
 
 void Runner::OnChanged(const std::string& locale) {
   thread_pool_->SetLocale(locale);
+  QueueRequest(std::make_shared<RemoveAllCacheRequest>(default_uid_));
+}
+
+void Runner::OnDbChanged() {
+  QueueRequest(std::make_shared<RemoveAllCacheRequest>(default_uid_));
+  SetCreateCacheTimer();
 }
 
 bool Runner::QueueRequest(std::shared_ptr<PkgRequest> req) {
@@ -102,6 +113,30 @@ bool Runner::QueueRequest(std::shared_ptr<PkgRequest> req) {
   return true;
 }
 
+void Runner::OnCreateCacheDone(bool success) {
+  static bool ready = false;
+  if (ready)
+    return;
+
+  if (success) {
+    ready = true;
+    LOG(WARNING) << "pkginfo-server is ready";
+    g_idle_add(
+        [](gpointer data) -> gboolean {
+          int fd = creat("/run/.pkginfo_server_ready",
+                         S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+          if (fd != -1)
+            close(fd);
+
+          return G_SOURCE_REMOVE;
+        },
+        nullptr);
+  } else {
+    LOG(WARNING) << "Fail to create cache";
+    SetCreateCacheTimer();
+  }
+}
+
 void Runner::SetCPUInheritance() {
   int ret;
   resource_pid_t resource_st = { 0, };
@@ -113,4 +148,27 @@ void Runner::SetCPUInheritance() {
     LOG(ERROR) << "Fail to register cpu inheritance destination ret : " << ret;
 }
 
+void Runner::SetCreateCacheTimer() {
+  if (timer_ > 0)
+    g_source_remove(timer_);
+
+  timer_ = g_timeout_add_seconds_full(G_PRIORITY_LOW, 10,
+      RetryCreateCache, this, NULL);
+}
+
+gboolean Runner::RetryCreateCache(void* data) {
+  LOG(WARNING) << "Retry to create cache";
+  auto* runner = static_cast<Runner*>(data);
+  runner->timer_ = 0;
+
+  pkgmgr_common::DbChangeObserver::GetInst().SetChanged(false);
+  pkgmgr_common::DbChangeObserver::GetInst().Listen();
+
+  if (CacheFlag::SetPreparing()) {
+    runner->QueueRequest(
+        std::make_shared<CreateCacheRequest>(runner->default_uid_, runner));
+  }
+  return G_SOURCE_REMOVE;
+}
+
 }  // namespace pkgmgr_server