Fix pending cache handling logic with write query 62/310462/2
authorIlho Kim <ilho159.kim@samsung.com>
Mon, 29 Apr 2024 08:56:51 +0000 (17:56 +0900)
committerIlho Kim <ilho159.kim@samsung.com>
Tue, 30 Apr 2024 00:09:40 +0000 (09:09 +0900)
There is a problem that the pending package information does not match
the database when the installer performs a write query request
such as writing plugin execution information
When the installer request to update the cache, the value is obtained
from the database and the cache is updated

Change-Id: Ida25b2daff5d3aefb9a2f7323d4f2a3f3650cd8c
Signed-off-by: Ilho Kim <ilho159.kim@samsung.com>
(cherry picked from commit ddfb723bbe91772ead70419f948bda8e3d4ee3df)

src/server/database/db_handle_provider.cc
src/server/database/db_handle_provider.hh
src/server/database/update_pending_cache_handler.cc

index a97f0f5..83a64fe 100644 (file)
@@ -451,75 +451,74 @@ void DBHandleProvider::RegisterPendingPackageInfo(
       std::vector<std::shared_ptr<application_x>> app_list;
       internal::GetAppInfo(db, &tmp_filter, uid_, uid, locale, app_list);
 
-      for (auto& app : app_list) {
+      for (auto& app : app_list)
         app->privileges = pkg_handle->privileges;
-        pending_app_[pkgid].emplace_back(std::move(app));
-      }
 
-      pending_pkg_[pkgid] = std::make_pair(pid, std::move(pkg_handle));
+      pending_pkg_[pkgid] = pid;
     }
 
     g_slist_free(tmp_filter.list);
   } else {
-    pending_pkg_[info->package] = std::make_pair(pid, nullptr);
-    pending_app_.erase(info->package);
+    pending_pkg_[info->package] = pid;
   }
 }
 
-void DBHandleProvider::UpdatePendingPackageInfo(
+void DBHandleProvider::UpdatePendingPackageInfo(const tizen_base::Database& db,
+    uid_t uid, const std::string& locale,
     const std::vector<std::string>& pkgids) {
+  pkgmgrinfo_filter_x tmp_filter = { 0, };
+  pkgmgrinfo_node_x node = { 0, };
+  tmp_filter.cache_flag = true;
+  tmp_filter.list = g_slist_append(tmp_filter.list, (gpointer)&node);
   for (const auto& pkgid : pkgids) {
     auto pkg_it = pending_pkg_.find(pkgid);
     if (pkg_it == pending_pkg_.end())
       continue;
 
+    LOG(WARNING) << "Update package : " << pkgid;
+
     ErasePackage(pkgid);
-    auto app_it = pending_app_.find(pkgid);
-    if (app_it != pending_app_.end()) {
-      for (auto& app : app_it->second)
+    std::map<std::string, std::shared_ptr<package_x>> pkgs;
+
+    node.prop = E_PMINFO_PKGINFO_PROP_PACKAGE_ID;
+    node.value = const_cast<char*>(pkgid.c_str());
+    internal::GetPkgInfo(db, &tmp_filter, uid_, locale, pkgs);
+    node.prop = E_PMINFO_APPINFO_PROP_APP_PACKAGE;
+    for (auto& [pkgid, pkg_handle] : pkgs) {
+      std::vector<std::shared_ptr<application_x>> app_list;
+      internal::GetAppInfo(db, &tmp_filter, uid_, uid, locale, app_list);
+
+      for (auto& app : app_list) {
+        app->privileges = pkg_handle->privileges;
         AddApplication(std::move(app));
-      pending_app_.erase(app_it);
-    }
+      }
 
-    if (pkg_it->second.second)
-      AddPackage(std::move(pkg_it->second.second));
+      AddPackage(std::move(pkg_handle));
+    }
 
-    EraseWriterPID(pkg_it->second.first);
+    EraseWriterPID(pkg_it->second);
     pending_pkg_.erase(pkg_it);
   }
+
+  g_slist_free(tmp_filter.list);
 }
 
 void DBHandleProvider::UpdateCrashedWriterPackageInfo(
+    const tizen_base::Database& db,
+    uid_t uid, const std::string& locale,
     const std::unordered_set<pid_t>& pids) {
+  std::vector<std::string> pkgids;
   for (auto it = pending_pkg_.begin(); it != pending_pkg_.end();) {
-    pid_t pid = it->second.first;
+    pid_t pid = it->second;
     if (pids.find(pid) == pids.end()) {
       it++;
       continue;
     }
 
-    const auto& pkgid = it->first;
-    auto old_app_it = pkg_app_map_.find(pkgid);
-    if (old_app_it != pkg_app_map_.end()) {
-      for (const auto& app : old_app_it->second)
-        app_map_.erase(app);
-
-      pkg_app_map_.erase(old_app_it);
-    }
-
-    auto app_it = pending_app_.find(pkgid);
-    if (app_it != pending_app_.end()) {
-      for (auto& app : app_it->second)
-        AddApplication(std::move(app));
-      pending_app_.erase(app_it);
-    }
-
-    if (it->second.second)
-      AddPackage(std::move(it->second.second));
-
-    EraseWriterPID(it->second.first);
-    it = pending_pkg_.erase(it);
+    pkgids.emplace_back(it->first);
   }
+
+  UpdatePendingPackageInfo(db, uid, locale, pkgids);
 }
 
 bool DBHandleProvider::UpdateCachePkg(const tizen_base::Database& db, uid_t uid,
index 1323957..c08c0c8 100644 (file)
@@ -62,8 +62,12 @@ class EXPORT_API DBHandleProvider {
   void RegisterPendingPackageInfo(const tizen_base::Database& db,
       package_x* info, pid_t pid, uid_t uid, const std::string& locale,
       pkgmgr_common::PkgWriteType write_type);
-  void UpdatePendingPackageInfo(const std::vector<std::string>& pkgids);
-  void UpdateCrashedWriterPackageInfo(const std::unordered_set<pid_t>& pids);
+  void UpdatePendingPackageInfo(const tizen_base::Database& db,
+      uid_t uid, const std::string& locale,
+      const std::vector<std::string>& pkgids);
+  void UpdateCrashedWriterPackageInfo(const tizen_base::Database& db,
+      uid_t uid, const std::string& locale,
+      const std::unordered_set<pid_t>& pids);
   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,
@@ -96,8 +100,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::pair<pid_t, std::shared_ptr<package_x>>> pending_pkg_;
-  std::unordered_map<std::string, std::vector<std::shared_ptr<application_x>>> pending_app_;
+  std::unordered_map<std::string, pid_t> pending_pkg_;
 };
 
 }  // namespace database
index 79e5dfb..ea7d3df 100644 (file)
@@ -45,9 +45,9 @@ int UpdatePendingCacheHandler::Execute() {
   for (const auto& [db, uid] : conn_list) {
     auto& provider = database::DBHandleProvider::GetInst(uid);
     if (!args_.empty())
-      provider.UpdatePendingPackageInfo(args_);
+      provider.UpdatePendingPackageInfo(db, uid, GetLocale(), args_);
     else
-      provider.UpdateCrashedWriterPackageInfo(pids_);
+      provider.UpdateCrashedWriterPackageInfo(db, uid, GetLocale(), pids_);
   }
 
   CacheFlag::SetStatus(CacheFlag::Status::PREPARED);