From c9537c52f4a7faef9aa2d23b33bc452aa872068d Mon Sep 17 00:00:00 2001 From: Scott Garman Date: Thu, 22 Mar 2012 21:43:42 -0700 Subject: 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 Signed-off-by: Richard Purdie --- meta/classes/useradd.bbclass | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) (limited to 'meta/classes/useradd.bbclass') diff --git a/meta/classes/useradd.bbclass b/meta/classes/useradd.bbclass index 7981a68dff..0bbb371b2a 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 -- cgit v1.2.3-54-g00ecf