Handle abnormally terminated installer process 76/299976/2
authorilho kim <ilho159.kim@samsung.com>
Fri, 13 Oct 2023 06:02:38 +0000 (15:02 +0900)
committerilho kim <ilho159.kim@samsung.com>
Mon, 16 Oct 2023 02:18:06 +0000 (11:18 +0900)
If there is an abnormally terminated installer process
apply the pending package info written by the process to the cache

Change-Id: Idc128d9dcddec3ba209996e2a09eea3ea687c0ce
Signed-off-by: ilho kim <ilho159.kim@samsung.com>
src/server/database/db_handle_provider.cc
src/server/database/db_handle_provider.hh
src/server/database/pkg_set_db_handler.cc
src/server/database/remove_cache_db_handler.cc
src/server/database/remove_cache_db_handler.hh
src/server/request_handler/command_request_handler.cc
src/server/worker_thread.cc

index 626a88e..516f3b0 100644 (file)
@@ -126,13 +126,12 @@ DBHandleProvider& DBHandleProvider::GetInst(uid_t uid) {
   return *prov;
 }
 
   return *prov;
 }
 
-bool DBHandleProvider::IsCrashedWriteRequest() {
+std::vector<pid_t> DBHandleProvider::CrashedWriteRequestPIDs() {
   std::unique_lock<std::shared_mutex> u(pid_list_lock_);
 
   if (writer_pid_list_.empty())
   std::unique_lock<std::shared_mutex> u(pid_list_lock_);
 
   if (writer_pid_list_.empty())
-    return false;
+    return {};
 
 
-  bool ret = true;
   LOG(DEBUG) << "Check process count : " << writer_pid_list_.size();
   std::vector<pid_t> remove_pids;
   for (pid_t pid : writer_pid_list_) {
   LOG(DEBUG) << "Check process count : " << writer_pid_list_.size();
   std::vector<pid_t> remove_pids;
   for (pid_t pid : writer_pid_list_) {
@@ -143,7 +142,6 @@ bool DBHandleProvider::IsCrashedWriteRequest() {
       LOG(ERROR) << "Process is crashed : " << pid;
       remove_pids.push_back(pid);
     } else {
       LOG(ERROR) << "Process is crashed : " << pid;
       remove_pids.push_back(pid);
     } else {
-      ret = false;
       close(fd);
     }
   }
       close(fd);
     }
   }
@@ -151,7 +149,7 @@ bool DBHandleProvider::IsCrashedWriteRequest() {
   for (pid_t pid : remove_pids)
     writer_pid_list_.erase(pid);
 
   for (pid_t pid : remove_pids)
     writer_pid_list_.erase(pid);
 
-  return ret;
+  return remove_pids;
 }
 
 std::vector<std::pair<std::string, uid_t>> DBHandleProvider::GetParserDBPath() {
 }
 
 std::vector<std::pair<std::string, uid_t>> DBHandleProvider::GetParserDBPath() {
@@ -425,15 +423,17 @@ bool DBHandleProvider::ErasePID(pid_t pid) {
   return writer_pid_list_.erase(pid) == 1;
 }
 
   return writer_pid_list_.erase(pid) == 1;
 }
 
-void DBHandleProvider::RegisterPendingPackageInfo(package_x* info) {
+void DBHandleProvider::RegisterPendingPackageInfo(package_x* info, pid_t pid) {
   if (!info || !info->package)
     return;
 
   if (!info || !info->package)
     return;
 
-  pending_pkg_.emplace(info->package);
+  InsertPID(pid);
+
+  pending_pkg_[pid].emplace(info->package);
 }
 
 void DBHandleProvider::UpdatePendingPackageInfo(const tizen_base::Database& db,
 }
 
 void DBHandleProvider::UpdatePendingPackageInfo(const tizen_base::Database& db,
-    pid_t pid, uid_t uid, const std::string& locale) {
+    const std::vector<pid_t>& pids, uid_t uid, const std::string& locale) {
   pkgmgrinfo_filter_x tmp_filter = { 0, };
   pkgmgrinfo_node_x node = {
     .prop = E_PMINFO_PKGINFO_PROP_PACKAGE_ID
   pkgmgrinfo_filter_x tmp_filter = { 0, };
   pkgmgrinfo_node_x node = {
     .prop = E_PMINFO_PKGINFO_PROP_PACKAGE_ID
@@ -441,15 +441,19 @@ void DBHandleProvider::UpdatePendingPackageInfo(const tizen_base::Database& db,
   tmp_filter.cache_flag = true;
   tmp_filter.list = g_slist_append(tmp_filter.list, (gpointer)&node);
   std::map<std::string, std::shared_ptr<package_x>> pkgs;
   tmp_filter.cache_flag = true;
   tmp_filter.list = g_slist_append(tmp_filter.list, (gpointer)&node);
   std::map<std::string, std::shared_ptr<package_x>> pkgs;
-  for (const auto& pkg : pending_pkg_) {
-    pkg_map_.erase(pkg);
-    for (auto& appid : pkg_app_map_[pkg]) {
-      app_map_.erase(appid);
+  for (const pid_t& pid : pids) {
+    for (const auto& pkg : pending_pkg_[pid]) {
+      pkg_map_.erase(pkg);
+      for (auto& appid : pkg_app_map_[pkg]) {
+        app_map_.erase(appid);
+      }
+
+      pkg_app_map_.erase(pkg);
+      node.value = const_cast<char*>(pkg.c_str());
+      internal::GetPkgInfo(db, &tmp_filter, uid_, locale, pkgs);
     }
 
     }
 
-    pkg_app_map_.erase(pkg);
-    node.value = const_cast<char*>(pkg.c_str());
-    internal::GetPkgInfo(db, &tmp_filter, uid_, locale, pkgs);
+    pending_pkg_.erase(pid);
   }
 
   for (auto& [key, val] : pkgs)
   }
 
   for (auto& [key, val] : pkgs)
@@ -469,7 +473,6 @@ void DBHandleProvider::UpdatePendingPackageInfo(const tizen_base::Database& db,
   }
 
   g_slist_free(tmp_filter.list);
   }
 
   g_slist_free(tmp_filter.list);
-  pending_pkg_.clear();
 }
 
 bool DBHandleProvider::UpdateCachePkg(const tizen_base::Database& db, uid_t uid,
 }
 
 bool DBHandleProvider::UpdateCachePkg(const tizen_base::Database& db, uid_t uid,
index e1a470b..e99e1c7 100644 (file)
@@ -45,7 +45,7 @@ class EXPORT_API DBHandleProvider {
  public:
   ~DBHandleProvider() = default;
   static DBHandleProvider& GetInst(uid_t uid);
  public:
   ~DBHandleProvider() = default;
   static DBHandleProvider& GetInst(uid_t uid);
-  static bool IsCrashedWriteRequest();
+  static std::vector<pid_t> CrashedWriteRequestPIDs();
   static bool IsWriter(pid_t pid);
   std::vector<std::pair<std::string, uid_t>> GetParserDBPath();
   std::string GetCertDBPath();
   static bool IsWriter(pid_t pid);
   std::vector<std::pair<std::string, uid_t>> GetParserDBPath();
   std::string GetCertDBPath();
@@ -58,9 +58,9 @@ class EXPORT_API DBHandleProvider {
       pid_t pid, pkgmgrinfo_filter_x* filter,
       const std::string& app);
   void TrimCache();
       pid_t pid, pkgmgrinfo_filter_x* filter,
       const std::string& app);
   void TrimCache();
-  void RegisterPendingPackageInfo(package_x* info);
+  void RegisterPendingPackageInfo(package_x* info, pid_t pid);
   void UpdatePendingPackageInfo(const tizen_base::Database& db,
   void UpdatePendingPackageInfo(const tizen_base::Database& db,
-      pid_t pid, uid_t uid, const std::string& locale);
+      const std::vector<pid_t>& pids, uid_t uid, const std::string& locale);
   bool UpdateCachePkg(const tizen_base::Database& db, uid_t uid,
       const std::string& pkgid, const std::string& locale);
   bool UpdateCacheApp(const tizen_base::Database& db, uid_t uid,
   bool UpdateCachePkg(const tizen_base::Database& db, uid_t uid,
       const std::string& pkgid, const std::string& locale);
   bool UpdateCacheApp(const tizen_base::Database& db, uid_t uid,
@@ -92,7 +92,7 @@ class EXPORT_API DBHandleProvider {
   std::unordered_map<std::string, std::shared_ptr<package_x>> pkg_map_;
   std::unordered_map<std::string, std::shared_ptr<application_x>> app_map_;
   std::unordered_map<std::string, std::unordered_set<std::string>> pkg_app_map_;
   std::unordered_map<std::string, std::shared_ptr<package_x>> pkg_map_;
   std::unordered_map<std::string, std::shared_ptr<application_x>> app_map_;
   std::unordered_map<std::string, std::unordered_set<std::string>> pkg_app_map_;
-  std::unordered_set<std::string> pending_pkg_;
+  std::unordered_map<pid_t, std::unordered_set<std::string>> pending_pkg_;
 };
 
 }  // namespace database
 };
 
 }  // namespace database
index 445828d..90aa2ae 100644 (file)
@@ -74,7 +74,8 @@ int PkgSetDBHandler::Execute() {
 
   auto lock = CacheFlag::GetWriterLock();
   if (CacheFlag::GetStatus() == CacheFlag::Status::PREPARED)
 
   auto lock = CacheFlag::GetWriterLock();
   if (CacheFlag::GetStatus() == CacheFlag::Status::PREPARED)
-    DBHandleProvider::GetInst(uid_).RegisterPendingPackageInfo(package_);
+    DBHandleProvider::GetInst(uid_)
+        .RegisterPendingPackageInfo(package_, GetPID());
 
   return ret;
 }
 
   return ret;
 }
index c37e410..ab3279a 100644 (file)
@@ -22,8 +22,8 @@
 namespace pkgmgr_server {
 namespace database {
 
 namespace pkgmgr_server {
 namespace database {
 
-RemoveCacheDBHandler::RemoveCacheDBHandler(uid_t uid, int pid)
-    : AbstractDBHandler(uid, pid), uid_(uid) {}
+RemoveCacheDBHandler::RemoveCacheDBHandler(uid_t uid, std::vector<pid_t> pids)
+    : AbstractDBHandler(uid, 0), uid_(uid), pids_(std::move(pids)) {}
 
 int RemoveCacheDBHandler::Execute() {
   std::unique_lock<std::shared_mutex> u(lock_);
 
 int RemoveCacheDBHandler::Execute() {
   std::unique_lock<std::shared_mutex> u(lock_);
@@ -43,7 +43,7 @@ int RemoveCacheDBHandler::Execute() {
   CacheFlag::SetStatus(CacheFlag::Status::PREPARING);
   for (const auto& [db, uid] : conn_list) {
     auto& provider = database::DBHandleProvider::GetInst(uid);
   CacheFlag::SetStatus(CacheFlag::Status::PREPARING);
   for (const auto& [db, uid] : conn_list) {
     auto& provider = database::DBHandleProvider::GetInst(uid);
-    provider.UpdatePendingPackageInfo(db, GetPID(), uid_, GetLocale());
+    provider.UpdatePendingPackageInfo(db, pids_, uid_, GetLocale());
   }
 
   CacheFlag::SetStatus(CacheFlag::Status::PREPARED);
   }
 
   CacheFlag::SetStatus(CacheFlag::Status::PREPARED);
index b33dcea..1019755 100644 (file)
@@ -19,6 +19,8 @@
 
 #include <sys/types.h>
 
 
 #include <sys/types.h>
 
+#include <vector>
+
 #include "abstract_db_handler.hh"
 
 namespace pkgmgr_server {
 #include "abstract_db_handler.hh"
 
 namespace pkgmgr_server {
@@ -30,11 +32,12 @@ namespace database {
 
 class EXPORT_API RemoveCacheDBHandler : public AbstractDBHandler {
  public:
 
 class EXPORT_API RemoveCacheDBHandler : public AbstractDBHandler {
  public:
-  RemoveCacheDBHandler(uid_t uid, int pid);
+  RemoveCacheDBHandler(uid_t uid, std::vector<pid_t> pids);
   int Execute() override;
 
  private:
   uid_t uid_;
   int Execute() override;
 
  private:
   uid_t uid_;
+  std::vector<pid_t> pids_;
 };
 
 }  // namespace database
 };
 
 }  // namespace database
index 458b3a8..1577349 100644 (file)
@@ -42,7 +42,7 @@ bool CommandRequestHandler::HandleRequest(unsigned char* data, size_t size,
   }
 
   if (parcel->GetCmd() == CommandType::RemoveCache) {
   }
 
   if (parcel->GetCmd() == CommandType::RemoveCache) {
-    database::RemoveCacheDBHandler db(parcel->GetUid(), GetPID());
+    database::RemoveCacheDBHandler db(parcel->GetUid(), {GetPID()});
     db.SetLocale(locale);
     int ret = db.Execute();
     result_ = std::make_shared<pcp::ResultParcelable>(
     db.SetLocale(locale);
     int ret = db.Execute();
     result_ = std::make_shared<pcp::ResultParcelable>(
index ab9b637..129ff1d 100644 (file)
@@ -26,6 +26,7 @@
 #include "cynara_checker.hh"
 #include "request_handler_factory.hh"
 #include "server/database/db_handle_provider.hh"
 #include "cynara_checker.hh"
 #include "request_handler_factory.hh"
 #include "server/database/db_handle_provider.hh"
+#include "server/database/remove_cache_db_handler.hh"
 #include "utils/logging.hh"
 
 #include "pkgmgrinfo_debug.h"
 #include "utils/logging.hh"
 
 #include "pkgmgrinfo_debug.h"
@@ -181,6 +182,14 @@ gboolean WorkerThread::TrimMemory(void* data) {
     h->timer_ = 0;
   }
 
     h->timer_ = 0;
   }
 
+  auto crashed_writer_pids =
+      database::DBHandleProvider::CrashedWriteRequestPIDs();
+  if (!crashed_writer_pids.empty()) {
+    database::RemoveCacheDBHandler 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;
   sqlite3_release_memory(-1);
   malloc_trim(0);
   return G_SOURCE_REMOVE;