Add retry logic at calling gum api 36/97236/2 accepted/tizen/3.0/common/20161114.143408 accepted/tizen/3.0/ivi/20161114.002558 accepted/tizen/3.0/mobile/20161114.002435 accepted/tizen/3.0/tv/20161114.002508 accepted/tizen/3.0/wearable/20161114.002531 submit/tizen_3.0/20161111.080112 submit/tizen_3.0_common/20161114.081136
authorSangyoon Jang <s89.jang@samsung.com>
Fri, 11 Nov 2016 12:28:06 +0000 (21:28 +0900)
committerSangyoon Jang <s89.jang@samsung.com>
Fri, 11 Nov 2016 12:35:34 +0000 (21:35 +0900)
This is temporary fix. It should be removed.

Change-Id: Ibcb27a18f2c14c1d9126fb2dfeeac8697cb0d09e
Signed-off-by: Sangyoon Jang <s89.jang@samsung.com>
src/common/utils/user_util.cc

index 64de2bd..3296cf8 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <boost/filesystem/path.hpp>
 
+#include <glib.h>
 #include <grp.h>
 #include <gum/gum-user.h>
 #include <gum/gum-user-service.h>
@@ -24,18 +25,44 @@ namespace {
 const int32_t kPWBufSize = sysconf(_SC_GETPW_R_SIZE_MAX);
 const int32_t kGRBufSize = sysconf(_SC_GETGR_R_SIZE_MAX);
 
+const int kRetryMax = 5;
+const int kRetryDelay = 1000000 / 2;
+
 }
 
 namespace common_installer {
 
 UserList GetUserList() {
-  GumUserService* service =
-      gum_user_service_create_sync((getuid() == 0) ? TRUE : FALSE);
   gchar** user_type_strv = gum_user_type_to_strv(
       GUM_USERTYPE_ADMIN | GUM_USERTYPE_GUEST | GUM_USERTYPE_NORMAL |
       GUM_USERTYPE_SECURITY);
-  GumUserList* gum_user_list =
-      gum_user_service_get_user_list_sync(service, user_type_strv);
+  GumUserService* service = nullptr;
+  GumUserList* gum_user_list = nullptr;
+  int count = 0;
+  // FIXME: Temporary retry logic, this should be removed
+  while (count < kRetryMax) {
+    service = gum_user_service_create_sync((getuid() == 0) ? TRUE : FALSE);
+    if (service == nullptr) {
+      count++;
+      LOG(WARNING) << "Failed to create gum user service! ("
+                   << count << "/" << kRetryMax << ")";
+      usleep(kRetryDelay);
+      continue;
+    }
+
+    gum_user_list =
+        gum_user_service_get_user_list_sync(service, user_type_strv);
+    if (gum_user_list == nullptr) {
+      g_object_unref(service);
+      count++;
+      LOG(WARNING) << "Failed to get gum user list! ("
+                   << count << "/" << kRetryMax << ")";
+      usleep(kRetryDelay);
+      continue;
+    } else {
+      break;
+    }
+  };
   UserList list;
   for (GumUser* guser : GListRange<GumUser*>(gum_user_list)) {
     uid_t uid;
@@ -52,6 +79,7 @@ UserList GetUserList() {
   }
   g_strfreev(user_type_strv);
   gum_user_service_list_free(gum_user_list);
+  g_object_unref(service);
   return list;
 }