[accountsservice/f15/master] more stab at fixing empty user
Ray Strode
rstrode at fedoraproject.org
Mon Apr 25 21:13:04 UTC 2011
commit 912b47f72e6b5b704b81bf56e36f1eec140c63a7
Author: Ray Strode <rstrode at redhat.com>
Date: Mon Apr 25 17:06:26 2011 -0400
more stab at fixing empty user
accountsservice.spec | 8 ++-
empty-user-list.patch | 272 +++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 279 insertions(+), 1 deletions(-)
---
diff --git a/accountsservice.spec b/accountsservice.spec
index 10422ea..b9cc5f3 100644
--- a/accountsservice.spec
+++ b/accountsservice.spec
@@ -1,7 +1,7 @@
Name: accountsservice
Version: 0.6.9
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: D-Bus interfaces for querying and manipulating user account information
Group: System Environment/Daemons
@@ -21,6 +21,8 @@ Requires: polkit
Requires: ConsoleKit
Requires: shadow-utils
+Patch0: empty-user-list.patch
+
%package libs
Summary: Client-side library to talk to accountservice
Group: Development/Libraries
@@ -50,6 +52,7 @@ of these interfaces, based on the useradd, usermod and userdel commands.
%prep
%setup -q
+%patch0 -p1 -b .empty-user-list
%build
%configure
@@ -88,6 +91,9 @@ rm $RPM_BUILD_ROOT%{_libdir}/*.a
%{_datadir}/gir-1.0/AccountsService-1.0.gir
%changelog
+* Mon Apr 25 2011 Ray Strode <rstrode at redhat.com> 0.6.9-2
+- More stabs at fixing empty user list problems (bug 678236)
+
* Fri Apr 15 2011 Matthias Clasen <mclasen at redhat.com> 0.6.9-1
- Update to 0.6.9
diff --git a/empty-user-list.patch b/empty-user-list.patch
new file mode 100644
index 0000000..5fd6931
--- /dev/null
+++ b/empty-user-list.patch
@@ -0,0 +1,272 @@
+From 0b093b3cfbda8a2d75608b338d04c3bdc30b6b3a Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Mon, 25 Apr 2011 15:52:36 -0400
+Subject: [PATCH 1/3] lib: always set is-loaded through maybe_set_is_loaded
+
+maybe_set_is_loaded checks the various asynchronous things that
+happen at startup and delays setting is-loaded until all those
+initial start up tasks are finished.
+
+We had one place in the code that was bypassing maybe_set_is_loaded
+and settings is-loaded directly. This could mean the user manager
+in some scenarios reports its loaded before it actually is.
+---
+ src/libaccountsservice/act-user-manager.c | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/src/libaccountsservice/act-user-manager.c b/src/libaccountsservice/act-user-manager.c
+index 7202b07..2af6808 100644
+--- a/src/libaccountsservice/act-user-manager.c
++++ b/src/libaccountsservice/act-user-manager.c
+@@ -801,7 +801,7 @@ on_new_user_loaded (ActUser *user,
+ g_object_unref (user);
+
+ if (manager->priv->new_users == NULL) {
+- set_is_loaded (manager, TRUE);
++ maybe_set_is_loaded (manager);
+ }
+ }
+
+--
+1.7.4.4
+
+
+From 07f05cd823bb52bee449996a16b90eaa1b57f80f Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Mon, 25 Apr 2011 16:38:28 -0400
+Subject: [PATCH 2/3] lib: add some additional debugging statements
+
+The current debug logs leave a lot of guessing,
+this commit tries to be a little more chatty.
+---
+ src/libaccountsservice/act-user-manager.c | 46 ++++++++++++++++++++++++++--
+ 1 files changed, 42 insertions(+), 4 deletions(-)
+
+diff --git a/src/libaccountsservice/act-user-manager.c b/src/libaccountsservice/act-user-manager.c
+index 2af6808..3e463e6 100644
+--- a/src/libaccountsservice/act-user-manager.c
++++ b/src/libaccountsservice/act-user-manager.c
+@@ -533,7 +533,8 @@ on_user_changed (ActUser *user,
+ ActUserManager *manager)
+ {
+ if (manager->priv->is_loaded) {
+- g_debug ("ActUserManager: user changed");
++ g_debug ("ActUserManager: user %s changed",
++ act_user_get_user_name (user));
+ g_signal_emit (manager, signals[USER_CHANGED], 0, user);
+ }
+ }
+@@ -571,6 +572,8 @@ on_get_seat_id_finished (DBusGProxy *proxy,
+ "current session");
+ }
+ unload_seat (manager);
++
++ g_debug ("ActUserManager: GetSeatId call failed, so trying to set loaded property");
+ maybe_set_is_loaded (manager);
+ return;
+ }
+@@ -692,6 +695,7 @@ add_user (ActUserManager *manager,
+ {
+ const char *object_path;
+
++ g_debug ("ActUserManager: tracking user '%s'", act_user_get_user_name (user));
+ g_hash_table_insert (manager->priv->users_by_name,
+ g_strdup (act_user_get_user_name (user)),
+ g_object_ref (user));
+@@ -713,7 +717,10 @@ add_user (ActUserManager *manager,
+ manager);
+
+ if (manager->priv->is_loaded) {
++ g_debug ("ActUserManager: loaded, so emitting user-added signal");
+ g_signal_emit (manager, signals[USER_ADDED], 0, user);
++ } else {
++ g_debug ("ActUserManager: not yet loaded, so not emitting user-added signal");
+ }
+
+ if (g_hash_table_size (manager->priv->users_by_name) > 1) {
+@@ -725,6 +732,10 @@ static void
+ remove_user (ActUserManager *manager,
+ ActUser *user)
+ {
++ g_debug ("ActUserManager: no longer tracking user '%s' (with object path %s)",
++ act_user_get_user_name (user),
++ act_user_get_object_path (user));
++
+ g_object_ref (user);
+
+ g_signal_handlers_disconnect_by_func (user, on_user_changed, manager);
+@@ -738,7 +749,10 @@ remove_user (ActUserManager *manager,
+ }
+
+ if (manager->priv->is_loaded) {
++ g_debug ("ActUserManager: loaded, so emitting user-removed signal");
+ g_signal_emit (manager, signals[USER_REMOVED], 0, user);
++ } else {
++ g_debug ("ActUserManager: not yet loaded, so not emitting user-removed signal");
+ }
+
+ g_object_unref (user);
+@@ -759,7 +773,6 @@ on_new_user_loaded (ActUser *user,
+ if (!act_user_is_loaded (user)) {
+ return;
+ }
+-
+ g_signal_handlers_disconnect_by_func (user, on_new_user_loaded, manager);
+ manager->priv->new_users = g_slist_remove (manager->priv->new_users,
+ user);
+@@ -783,6 +796,8 @@ on_new_user_loaded (ActUser *user,
+ return;
+ }
+
++ g_debug ("ActUserManager: user '%s' is now loaded", username);
++
+ if (username_in_exclude_list (manager, username)) {
+ g_debug ("ActUserManager: excluding user '%s'", username);
+ g_object_unref (user);
+@@ -794,6 +809,8 @@ on_new_user_loaded (ActUser *user,
+ /* If username got added earlier by a different means, trump it now.
+ */
+ if (old_user != NULL) {
++ g_debug ("ActUserManager: user '%s' was already known, "
++ "replacing with freshly loaded object", username);
+ remove_user (manager, old_user);
+ }
+
+@@ -801,6 +818,7 @@ on_new_user_loaded (ActUser *user,
+ g_object_unref (user);
+
+ if (manager->priv->new_users == NULL) {
++ g_debug ("ActUserManager: no pending users, trying to set loaded property");
+ maybe_set_is_loaded (manager);
+ }
+ }
+@@ -814,8 +832,13 @@ add_new_user_for_object_path (const char *object_path,
+ user = g_hash_table_lookup (manager->priv->users_by_object_path, object_path);
+
+ if (user != NULL) {
++ g_debug ("ActUserManager: tracking existing user %s with object path %s",
++ act_user_get_user_name (user), object_path);
+ return user;
+ }
++
++ g_debug ("ActUserManager: tracking new user with object path %s", object_path);
++
+ user = create_new_user (manager);
+ _act_user_update_from_object_path (user, object_path);
+
+@@ -829,6 +852,7 @@ on_new_user_in_accounts_service (DBusGProxy *proxy,
+ {
+ ActUserManager *manager = ACT_USER_MANAGER (user_data);
+
++ g_debug ("ActUserManager: new user in accounts service with object path %s", object_path);
+ add_new_user_for_object_path (object_path, manager);
+ }
+
+@@ -840,6 +864,8 @@ on_user_removed_in_accounts_service (DBusGProxy *proxy,
+ ActUserManager *manager = ACT_USER_MANAGER (user_data);
+ ActUser *user;
+
++ g_debug ("ActUserManager: user removed from accounts service with object path %s", object_path);
++
+ user = g_hash_table_lookup (manager->priv->users_by_object_path, object_path);
+
+ manager->priv->new_users = g_slist_remove (manager->priv->new_users, user);
+@@ -879,6 +905,7 @@ on_get_current_session_finished (DBusGProxy *proxy,
+ g_debug ("Failed to identify the current session");
+ }
+ unload_seat (manager);
++ g_debug ("ActUserManager: no current session, so trying to set loaded property");
+ maybe_set_is_loaded (manager);
+ return;
+ }
+@@ -1155,6 +1182,7 @@ on_list_cached_users_finished (DBusGProxy *proxy,
+ return;
+ }
+
++ g_debug ("ActUserManager: ListCachedUsers finished, so trying to set loaded property");
+ maybe_set_is_loaded (manager);
+ g_ptr_array_foreach (paths, (GFunc)add_new_user_for_object_path, manager);
+
+@@ -1721,22 +1749,29 @@ static void
+ maybe_set_is_loaded (ActUserManager *manager)
+ {
+ if (manager->priv->is_loaded) {
++ g_debug ("ActUserManager: already loaded, so not setting loaded property");
+ return;
+ }
+
+ if (manager->priv->get_sessions_call != NULL) {
++ g_debug ("ActUserManager: GetSessions call pending, so not setting loaded property");
+ return;
+ }
+
+ if (manager->priv->listing_cached_users) {
++ g_debug ("ActUserManager: Listing cached users, so not setting loaded property");
+ return;
+ }
+
+ /* Don't set is_loaded yet unless the seat is already loaded
+ * or failed to load.
+ */
+- if (manager->priv->seat.state != ACT_USER_MANAGER_SEAT_STATE_LOADED
+- && manager->priv->seat.state != ACT_USER_MANAGER_SEAT_STATE_UNLOADED) {
++ if (manager->priv->seat.state == ACT_USER_MANAGER_SEAT_STATE_LOADED) {
++ g_debug ("ActUserManager: Seat loaded, so now setting loaded property");
++ } else if (manager->priv->seat.state == ACT_USER_MANAGER_SEAT_STATE_UNLOADED) {
++ g_debug ("ActUserManager: Seat wouldn't load, so giving up on it and setting loaded property");
++ } else {
++ g_debug ("ActUserManager: Seat still actively loading, so not setting loaded property");
+ return;
+ }
+
+@@ -1811,6 +1846,8 @@ on_get_sessions_finished (DBusGProxy *proxy,
+ (int) sessions->len);
+ g_ptr_array_foreach (sessions, (GFunc) g_free, NULL);
+ g_ptr_array_free (sessions, TRUE);
++
++ g_debug ("ActUserManager: GetSessions call finished, so trying to set loaded property");
+ maybe_set_is_loaded (manager);
+ }
+
+@@ -1880,6 +1917,7 @@ load_seat_incrementally (ActUserManager *manager)
+ load_sessions (manager);
+ }
+
++ g_debug ("ActUserManager: Seat loading sequence complete, so trying to set loaded property");
+ maybe_set_is_loaded (manager);
+ }
+
+--
+1.7.4.4
+
+
+From f938e70e4c71b63235702a48ab6d2400488c3ea6 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Mon, 25 Apr 2011 16:58:58 -0400
+Subject: [PATCH 3/3] lib: ignore new users before ListCachedUsers finishes
+
+We're going to be loading any users that come in shortly afterward
+anyway, so don't bother handling it yet.
+---
+ src/libaccountsservice/act-user-manager.c | 5 +++++
+ 1 files changed, 5 insertions(+), 0 deletions(-)
+
+diff --git a/src/libaccountsservice/act-user-manager.c b/src/libaccountsservice/act-user-manager.c
+index 3e463e6..07c8e34 100644
+--- a/src/libaccountsservice/act-user-manager.c
++++ b/src/libaccountsservice/act-user-manager.c
+@@ -852,6 +852,11 @@ on_new_user_in_accounts_service (DBusGProxy *proxy,
+ {
+ ActUserManager *manager = ACT_USER_MANAGER (user_data);
+
++ if (!manager->priv->is_loaded) {
++ g_debug ("ActUserManager: ignoring new user in accounts service with object path %s since not loaded yet", object_path);
++ return;
++ }
++
+ g_debug ("ActUserManager: new user in accounts service with object path %s", object_path);
+ add_new_user_for_object_path (object_path, manager);
+ }
+--
+1.7.4.4
+
More information about the scm-commits
mailing list