aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorScott Garman <scott.a.garman@intel.com>2012-03-22 21:43:42 -0700
committerJoshua Lock <josh@linux.intel.com>2012-05-21 22:13:48 -0700
commitfb9f5feaa49b78d03d25d96254a5ce04079ce594 (patch)
tree361b68e860ac7de3cb5ebc236b8fb8f8c6d0bde9
parent8a8b1a49e3c7f96d76f6457a1f9a14e1eb4d5302 (diff)
downloadopenembedded-core-fb9f5feaa49b78d03d25d96254a5ce04079ce594.tar.gz
openembedded-core-fb9f5feaa49b78d03d25d96254a5ce04079ce594.tar.bz2
openembedded-core-fb9f5feaa49b78d03d25d96254a5ce04079ce594.zip
useradd.bbclass: retry useradd/groupadd commands to avoid lock race issues
A race condition can occur when adding users and groups to the passwd and group files, causing errors like the following: ERROR: Function 'useradd_sysroot' failed Tried to access "/etc/group" but this was locked. This fix will cause the useradd code to retry the useradd and groupadd commands up to 10 times (with a 1s sleep in between attempts) before failing. This fixes [YOCTO #1794] (From OE-Core rev: 68c589f1b5ee36f0aff151b728447ffdae14622c) Signed-off-by: Scott Garman <scott.a.garman@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> Signed-off-by: Joshua Lock <josh@linux.intel.com>
-rw-r--r--meta/classes/useradd.bbclass36
1 files changed, 34 insertions, 2 deletions
diff --git a/meta/classes/useradd.bbclass b/meta/classes/useradd.bbclass
index 6f2c2dfb86..6ecfa16a5f 100644
--- a/meta/classes/useradd.bbclass
+++ b/meta/classes/useradd.bbclass
@@ -45,7 +45,23 @@ if test "x$GROUPADD_PARAM" != "x"; then
groupname=`echo "$opts" | awk '{ print $NF }'`
group_exists=`grep "^$groupname:" $SYSROOT/etc/group || true`
if test "x$group_exists" = "x"; then
- eval $PSEUDO groupadd $OPT $opts
+ count=1
+ while true; do
+ eval $PSEUDO groupadd $OPT $opts || true
+ group_exists=`grep "^$groupname:" $SYSROOT/etc/group || true`
+ if test "x$group_exists" = "x"; then
+ # File locking issues can require us to retry the command
+ echo "WARNING: groupadd command did not succeed. Retrying..."
+ sleep 1
+ else
+ break
+ fi
+ count=`expr $count + 1`
+ if test $count = 11; then
+ echo "ERROR: tried running groupadd command 10 times without success, giving up"
+ exit 1
+ fi
+ done
else
echo "Note: group $groupname already exists, not re-creating it"
fi
@@ -70,7 +86,23 @@ if test "x$USERADD_PARAM" != "x"; then
username=`echo "$opts" | awk '{ print $NF }'`
user_exists=`grep "^$username:" $SYSROOT/etc/passwd || true`
if test "x$user_exists" = "x"; then
- eval $PSEUDO useradd $OPT $opts
+ count=1
+ while true; do
+ eval $PSEUDO useradd $OPT $opts || true
+ user_exists=`grep "^$username:" $SYSROOT/etc/passwd || true`
+ if test "x$user_exists" = "x"; then
+ # File locking issues can require us to retry the command
+ echo "WARNING: useradd command did not succeed. Retrying..."
+ sleep 1
+ else
+ break
+ fi
+ count=`expr $count + 1`
+ if test $count = 11; then
+ echo "ERROR: tried running useradd command 10 times without success, giving up"
+ exit 1
+ fi
+ done
else
echo "Note: username $username already exists, not re-creating it"
fi