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) (From OE-Core rev: fb9f5feaa49b78d03d25d96254a5ce04079ce594) 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> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
b2a0243f05
commit
68cd8deadc
|
@ -45,7 +45,23 @@ if test "x$GROUPADD_PARAM" != "x"; then
|
||||||
groupname=`echo "$opts" | awk '{ print $NF }'`
|
groupname=`echo "$opts" | awk '{ print $NF }'`
|
||||||
group_exists=`grep "^$groupname:" $SYSROOT/etc/group || true`
|
group_exists=`grep "^$groupname:" $SYSROOT/etc/group || true`
|
||||||
if test "x$group_exists" = "x"; then
|
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
|
else
|
||||||
echo "Note: group $groupname already exists, not re-creating it"
|
echo "Note: group $groupname already exists, not re-creating it"
|
||||||
fi
|
fi
|
||||||
|
@ -70,7 +86,23 @@ if test "x$USERADD_PARAM" != "x"; then
|
||||||
username=`echo "$opts" | awk '{ print $NF }'`
|
username=`echo "$opts" | awk '{ print $NF }'`
|
||||||
user_exists=`grep "^$username:" $SYSROOT/etc/passwd || true`
|
user_exists=`grep "^$username:" $SYSROOT/etc/passwd || true`
|
||||||
if test "x$user_exists" = "x"; then
|
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
|
else
|
||||||
echo "Note: username $username already exists, not re-creating it"
|
echo "Note: username $username already exists, not re-creating it"
|
||||||
fi
|
fi
|
||||||
|
|
Loading…
Reference in New Issue