diff options
author | Stephen Gallagher <sgallagh@redhat.com> | 2009-03-06 19:28:24 -0500 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2009-03-07 09:06:49 -0500 |
commit | ecb8965f030eeb0cadf18394bccf8e760831e400 (patch) | |
tree | 4883be600468a2435a7447ce3d0dc9073b653ae2 | |
parent | 4042b9855a353a5d0727e69ae8957cc7f7e7e9bb (diff) | |
download | sssd-ecb8965f030eeb0cadf18394bccf8e760831e400.tar.gz sssd-ecb8965f030eeb0cadf18394bccf8e760831e400.tar.bz2 sssd-ecb8965f030eeb0cadf18394bccf8e760831e400.zip |
Fix race condition with initial sysdb creation
When the sysdb LDB file does not exist on the system, the first
attempt to connect to it will invoke a creation routine. However,
both the NSS and the InfoPipe are started in parallel by the
monitor, resulting in a race condition as they both try to
initialize the sysdb. The easiest fix for this is to simply have
the monitor create the sysdb before it launches NSS and InfoPipe.
-rw-r--r-- | server/monitor/monitor.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/server/monitor/monitor.c b/server/monitor/monitor.c index 3c393c97..d797ae0e 100644 --- a/server/monitor/monitor.c +++ b/server/monitor/monitor.c @@ -28,6 +28,7 @@ #include "popt.h" #include "tevent.h" #include "confdb/confdb.h" +#include "db/sysdb.h" #include "monitor/monitor.h" #include "dbus/dbus.h" #include "sbus/sssd_dbus.h" @@ -365,6 +366,7 @@ int monitor_process_init(TALLOC_CTX *mem_ctx, { struct mt_ctx *ctx; struct mt_svc *svc; + struct sysdb_ctx *sysdb; const char **doms; int dom_count; char *path; @@ -382,6 +384,18 @@ int monitor_process_init(TALLOC_CTX *mem_ctx, if (ret != EOK) return ret; + /* Avoid a startup race condition between InfoPipe + * and NSS. If the sysdb doesn't exist yet, both + * will try to create it at the same time. So + * we'll have the monitor create it before either of + * those processes start. + */ + ret = sysdb_init(mem_ctx, ctx->ev, ctx->cdb, + NULL, &sysdb); + if (ret != EOK) + return ret; + talloc_free(sysdb); + /* Initialize D-BUS Server * The monitor will act as a D-BUS server for all * SSSD processes */ |