Delay server ready timing until creating cache 14/279914/6
authorChanggyu Choi <changyu.choi@samsung.com>
Fri, 19 Aug 2022 04:54:17 +0000 (13:54 +0900)
committerChanggyu Choi <changyu.choi@samsung.com>
Fri, 19 Aug 2022 05:35:14 +0000 (14:35 +0900)
Change-Id: I3ee85c5c6cff1cbb5455df25b363cc0768da6e1c
Signed-off-by: Changgyu Choi <changyu.choi@samsung.com>
src/server/create_cache_request.cc
src/server/create_cache_request.hh
src/server/main.cc
src/server/request_handler/create_cache_request_handler.cc
src/server/request_handler/create_cache_request_handler.hh
src/server/runner.cc
src/server/runner.hh

index 2ad143a..d0a4faa 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.
@@ -42,6 +42,10 @@ pkgmgr_common::ReqType CreateCacheRequest::GetRequestType() {
 }
 
 bool CreateCacheRequest::SendData(unsigned char* data, int size) {
+  bool ret = static_cast<bool>(data[0]);
+  if (listener_ != nullptr)
+    listener_->OnCreateCacheDone(ret);
+
   return true;
 }
 
index 88e6372..b36ce05 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.
@@ -30,7 +30,14 @@ namespace pkgmgr_server {
 
 class EXPORT_API CreateCacheRequest : public PkgRequest {
  public:
-  CreateCacheRequest(uid_t uid) : uid_(uid) {}
+  class IEvent {
+   public:
+    virtual ~IEvent() {}
+    virtual void OnCreateCacheDone(bool success) = 0;
+  };
+
+  CreateCacheRequest(uid_t uid, IEvent* listener)
+      : uid_(uid), listener_(listener) {}
   const unsigned char* GetData() override;
   int GetSize() override;
   pid_t GetSenderPID() override;
@@ -41,6 +48,7 @@ class EXPORT_API CreateCacheRequest : public PkgRequest {
 
  private:
   uid_t uid_;
+  IEvent* listener_;
 };
 
 }  // namespace pkgmgr_server
index fc6af21..3061bcf 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.
  * limitations under the License.
  */
 
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/signalfd.h>
-#include <signal.h>
 #include <gio/gio.h>
 #include <glib-unix.h>
+#include <signal.h>
+#include <sys/signalfd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
 #include <systemd/sd-daemon.h>
+#include <unistd.h>
 
 #include <glib.h>
 #include <dlog.h>
@@ -117,16 +117,7 @@ static void __finish(void) {
 
 static void __pkgmgr_init() {
   runner = new pkgmgr_server::Runner(5);
-
-  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);
-
-    sd_notify(0, "READY=1");
-    return G_SOURCE_REMOVE;
-  }, nullptr);
+  sd_notify(0, "READY=1");
 }
 
 int main() {
index 012d746..f70cf2d 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
+// Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd All Rights Reserved
 // Use of this source code is governed by an apache-2.0 license that can be
 // found in the LICENSE file.
 
@@ -69,13 +69,12 @@ bool CreateCacheRequestHandler::HandleRequest(const unsigned char* data, int siz
   psd::CacheDBHandler db(GetUID(), GetPID());
   db.SetLocale(locale);
 
-  int ret = db.Execute();
-
-  return ret == PMINFO_R_OK;
+  success_ = (db.Execute() == PMINFO_R_OK);
+  return success_;
 }
 
 std::vector<uint8_t> CreateCacheRequestHandler::ExtractResult() {
-  return {};
+  return { static_cast<uint8_t>(success_) };
 }
 
 void CreateCacheRequestHandler::PreExec() {
index f92ec4c..0ec4eba 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
+// Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd All Rights Reserved
 // Use of this source code is governed by an apache-2.0 license that can be
 // found in the LICENSE file.
 
@@ -45,6 +45,7 @@ class EXPORT_API CreateCacheRequestHandler : public AbstractRequestHandler {
   };
 
  private:
+  bool success_ = false;
   std::shared_ptr<pkgmgr_common::parcel::ResultParcelable> result_;
   Scheduler scheduler_;
 };
index d8f8b76..85d3acf 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.
@@ -62,7 +62,7 @@ Runner::Runner(unsigned int thread_num) {
   thread_pool_->SetLocale(pkgmgr_common::SystemLocale::GetInst().Get());
 
   if (CacheFlag::SetPreparing())
-    QueueRequest(std::make_shared<CreateCacheRequest>(default_uid_));
+    QueueRequest(std::make_shared<CreateCacheRequest>(default_uid_, this));
 
   LOGI("Start Runner");
 }
@@ -85,7 +85,7 @@ int Runner::OnReceiveRequest(int fd, GIOCondition cond, void* user_data) {
 
   if (CacheFlag::SetPreparing()) {
     runner->QueueRequest(
-        std::make_shared<CreateCacheRequest>(runner->default_uid_));
+        std::make_shared<CreateCacheRequest>(runner->default_uid_, runner));
   }
   runner->QueueRequest(std::move(req));
 
@@ -101,6 +101,24 @@ bool Runner::QueueRequest(std::shared_ptr<PkgRequest> req) {
   return true;
 }
 
+void Runner::OnCreateCacheDone(bool success) {
+  static bool ready = false;
+  if (success && !ready) {
+    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);
+  }
+}
+
 void Runner::SetCPUInheritance() {
   int ret;
   resource_pid_t resource_st = { 0, };
index 8702a6a..157531c 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.
 #include <memory>
 #include <unordered_map>
 
+#include "create_cache_request.hh"
 #include "server_socket.hh"
-#include "worker_thread.hh"
 #include "system_locale.hh"
+#include "worker_thread.hh"
 
 namespace pkgmgr_server {
 
@@ -34,14 +35,15 @@ namespace pkgmgr_server {
 #define EXPORT_API __attribute__((visibility("default")))
 #endif
 
-class EXPORT_API Runner
-    : public pkgmgr_common::SystemLocale::IEvent {
+class EXPORT_API Runner : public pkgmgr_common::SystemLocale::IEvent,
+                          public CreateCacheRequest::IEvent {
  public:
-  Runner(unsigned int thread_num);
+  explicit Runner(unsigned int thread_num);
   ~Runner();
   bool QueueRequest(std::shared_ptr<PkgRequest> req);
 
   void OnChanged(const std::string& locale) override;
+  void OnCreateCacheDone(bool success) override;
 
  private:
   static int OnReceiveRequest(int fd, GIOCondition cond, void* user_data);