useradd.bbclass: retry useradd/groupadd commands to avoid lock race issues
authorScott Garman <scott.a.garman@intel.com>
Fri, 23 Mar 2012 04:43:42 +0000 (21:43 -0700)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Fri, 23 Mar 2012 12:13:08 +0000 (12:13 +0000)
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>
meta/classes/useradd.bbclass

index 7981a68..0bbb371 100644 (file)
@@ -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