[OE-core] [PATCH 1/1] useradd_base.bbclass: fix simultaneous with flock

Kang Kai Kai.Kang at windriver.com
Tue Feb 23 03:35:10 UTC 2016


On 2016年02月23日 11:05, Khem Raj wrote:
> Patch subject is unclear. Patch itself looks ok

How about use the  title of Yocto #9022:

useradd_base.bbclass: replace retry logic with flock


Thanks,
Kai



>
> On Mon, Feb 22, 2016 at 9:45 PM,  <kai.kang at windriver.com> wrote:
>> From: Kai Kang <kai.kang at windriver.com>
>>
>> When perform useradd during populate sysroot, it locks files passwd.lock
>> and group.lock at same time. And then it meets a dead lock issue
>> randomly.
>>
>> Use flock to reslove it by using an universal lock file for all the
>> user and group related operations.
>>
>> [YOCTO #9022]
>>
>> Signed-off-by: Kai Kang <kai.kang at windriver.com>
>> ---
>>   meta/classes/useradd.bbclass      |   6 +-
>>   meta/classes/useradd_base.bbclass | 186 ++++++++------------------------------
>>   2 files changed, 40 insertions(+), 152 deletions(-)
>>
>> diff --git a/meta/classes/useradd.bbclass b/meta/classes/useradd.bbclass
>> index c960656..0a6f2be 100644
>> --- a/meta/classes/useradd.bbclass
>> +++ b/meta/classes/useradd.bbclass
>> @@ -57,7 +57,7 @@ if test "x`echo $GROUPADD_PARAM | tr -d '[:space:]'`" != "x"; then
>>          opts=`echo "$GROUPADD_PARAM" | cut -d ';' -f 1`
>>          remaining=`echo "$GROUPADD_PARAM" | cut -d ';' -f 2-`
>>          while test "x$opts" != "x"; do
>> -               perform_groupadd "$SYSROOT" "$OPT $opts" 10
>> +               perform_groupadd "$SYSROOT" "$OPT $opts"
>>                  if test "x$opts" = "x$remaining"; then
>>                          break
>>                  fi
>> @@ -73,7 +73,7 @@ if test "x`echo $USERADD_PARAM | tr -d '[:space:]'`" != "x"; then
>>          opts=`echo "$USERADD_PARAM" | cut -d ';' -f 1`
>>          remaining=`echo "$USERADD_PARAM" | cut -d ';' -f 2-`
>>          while test "x$opts" != "x"; do
>> -               perform_useradd "$SYSROOT" "$OPT $opts" 10
>> +               perform_useradd "$SYSROOT" "$OPT $opts"
>>                  if test "x$opts" = "x$remaining"; then
>>                          break
>>                  fi
>> @@ -89,7 +89,7 @@ if test "x`echo $GROUPMEMS_PARAM | tr -d '[:space:]'`" != "x"; then
>>          opts=`echo "$GROUPMEMS_PARAM" | cut -d ';' -f 1`
>>          remaining=`echo "$GROUPMEMS_PARAM" | cut -d ';' -f 2-`
>>          while test "x$opts" != "x"; do
>> -               perform_groupmems "$SYSROOT" "$OPT $opts" 10
>> +               perform_groupmems "$SYSROOT" "$OPT $opts"
>>                  if test "x$opts" = "x$remaining"; then
>>                          break
>>                  fi
>> diff --git a/meta/classes/useradd_base.bbclass b/meta/classes/useradd_base.bbclass
>> index ab3cd35..7c1cc13 100644
>> --- a/meta/classes/useradd_base.bbclass
>> +++ b/meta/classes/useradd_base.bbclass
>> @@ -4,7 +4,7 @@
>>
>>   # The following functions basically have similar logic.
>>   # *) Perform necessary checks before invoking the actual command
>> -# *) Invoke the actual command, make retries if necessary
>> +# *) Invoke the actual command with flock
>>   # *) Error out if an error occurs.
>>
>>   # Note that before invoking these functions, make sure the global variable
>> @@ -12,65 +12,32 @@
>>
>>   perform_groupadd () {
>>          local rootdir="$1"
>> -       local opts="$2"
>> -       local retries="$3"
>> -       bbnote "${PN}: Performing groupadd with [$opts] and $retries times of retry"
>> +       local opts=`echo $2 | sed s/\'/\"/g`
>> +       bbnote "${PN}: Performing groupadd with [$opts]"
>> +       eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO groupadd $opts\' || true
>>          local groupname=`echo "$opts" | awk '{ print $NF }'`
>> -       local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
>> +       local group_exists=`grep "^$groupname:" $rootdir/etc/group`
>>          if test "x$group_exists" = "x"; then
>> -               local count=0
>> -               while true; do
>> -                       eval $PSEUDO groupadd $opts || true
>> -                       group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
>> -                       if test "x$group_exists" = "x"; then
>> -                               bbwarn "${PN}: groupadd command did not succeed. Retrying..."
>> -                       else
>> -                               break
>> -                       fi
>> -                       count=`expr $count + 1`
>> -                       if test $count = $retries; then
>> -                               bbfatal "${PN}: Tried running groupadd command $retries times without success, giving up"
>> -                       fi
>> -                        sleep $count
>> -               done
>> -       else
>> -               bbnote "${PN}: group $groupname already exists, not re-creating it"
>> +               bbfatal "${PN}: groupadd command did not succeed."
>>          fi
>>   }
>>
>>   perform_useradd () {
>>          local rootdir="$1"
>> -       local opts="$2"
>> -       local retries="$3"
>> -       bbnote "${PN}: Performing useradd with [$opts] and $retries times of retry"
>> +       local opts=`echo $2 | sed s/\'/\"/g`
>> +       bbnote "${PN}: Performing useradd with [$opts]"
>> +       eval flock -x -w 100 $rootdir${sysconfdir} -c  \'$PSEUDO useradd $opts\' || true
>>          local username=`echo "$opts" | awk '{ print $NF }'`
>> -       local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
>> +       local user_exists=`grep "^$username:" $rootdir/etc/passwd`
>>          if test "x$user_exists" = "x"; then
>> -              local count=0
>> -              while true; do
>> -                      eval $PSEUDO useradd $opts || true
>> -                      user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
>> -                      if test "x$user_exists" = "x"; then
>> -                              bbwarn "${PN}: useradd command did not succeed. Retrying..."
>> -                      else
>> -                              break
>> -                      fi
>> -                      count=`expr $count + 1`
>> -                      if test $count = $retries; then
>> -                               bbfatal "${PN}: Tried running useradd command $retries times without success, giving up"
>> -                      fi
>> -                      sleep $count
>> -              done
>> -       else
>> -               bbnote "${PN}: user $username already exists, not re-creating it"
>> +               bbfatal "${PN}: useradd command did not succeed."
>>          fi
>>   }
>>
>>   perform_groupmems () {
>>          local rootdir="$1"
>>          local opts="$2"
>> -       local retries="$3"
>> -       bbnote "${PN}: Performing groupmems with [$opts] and $retries times of retry"
>> +       bbnote "${PN}: Performing groupmems with [$opts]"
>>          local groupname=`echo "$opts" | awk '{ for (i = 1; i < NF; i++) if ($i == "-g" || $i == "--group") print $(i+1) }'`
>>          local username=`echo "$opts" | awk '{ for (i = 1; i < NF; i++) if ($i == "-a" || $i == "--add") print $(i+1) }'`
>>          bbnote "${PN}: Running groupmems command with group $groupname and user $username"
>> @@ -82,30 +49,13 @@ perform_groupmems () {
>>                  gshadow="no"
>>                  touch $rootdir${sysconfdir}/gshadow
>>          fi
>> -       local mem_exists="`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*" $rootdir/etc/group || true`"
>> +
>> +       eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO groupmems $opts\' || true
>> +       local mem_exists=`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*" $rootdir/etc/group`
>>          if test "x$mem_exists" = "x"; then
>> -               local count=0
>> -               while true; do
>> -                       eval $PSEUDO groupmems $opts || true
>> -                       mem_exists="`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*" $rootdir/etc/group || true`"
>> -                       if test "x$mem_exists" = "x"; then
>> -                               bbwarn "${PN}: groupmems command did not succeed. Retrying..."
>> -                       else
>> -                               break
>> -                       fi
>> -                       count=`expr $count + 1`
>> -                       if test $count = $retries; then
>> -                               if test "x$gshadow" = "xno"; then
>> -                                       rm -f $rootdir${sysconfdir}/gshadow
>> -                                       rm -f $rootdir${sysconfdir}/gshadow-
>> -                               fi
>> -                               bbfatal "${PN}: Tried running groupmems command $retries times without success, giving up"
>> -                       fi
>> -                       sleep $count
>> -               done
>> -       else
>> -               bbnote "${PN}: group $groupname already contains $username, not re-adding it"
>> +               bbfatal "${PN}: groupmems command did not succeed."
>>          fi
>> +
>>          if test "x$gshadow" = "xno"; then
>>                  rm -f $rootdir${sysconfdir}/gshadow
>>                  rm -f $rootdir${sysconfdir}/gshadow-
>> @@ -115,56 +65,24 @@ perform_groupmems () {
>>   perform_groupdel () {
>>          local rootdir="$1"
>>          local opts="$2"
>> -       local retries="$3"
>> -       bbnote "${PN}: Performing groupdel with [$opts] and $retries times of retry"
>> +       bbnote "${PN}: Performing groupdel with [$opts]"
>> +       eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO groupdel $opts\' || true
>>          local groupname=`echo "$opts" | awk '{ print $NF }'`
>> -       local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
>> +       local group_exists=`grep "^$groupname:" $rootdir/etc/group`
>>          if test "x$group_exists" != "x"; then
>> -               local count=0
>> -               while true; do
>> -                       eval $PSEUDO groupdel $opts || true
>> -                       group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
>> -                       if test "x$group_exists" != "x"; then
>> -                               bbwarn "${PN}: groupdel command did not succeed. Retrying..."
>> -                       else
>> -                               break
>> -                       fi
>> -                       count=`expr $count + 1`
>> -                       if test $count = $retries; then
>> -                               bbfatal "${PN}: Tried running groupdel command $retries times without success, giving up"
>> -                       fi
>> -                       sleep $count
>> -               done
>> -       else
>> -               bbnote "${PN}: group $groupname doesn't exist, not removing it"
>> +               bbfatal "${PN}: groupdel command did not succeed."
>>          fi
>>   }
>>
>>   perform_userdel () {
>>          local rootdir="$1"
>>          local opts="$2"
>> -       local retries="$3"
>> -       bbnote "${PN}: Performing userdel with [$opts] and $retries times of retry"
>> +       bbnote "${PN}: Performing userdel with [$opts]"
>> +       eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO userdel $opts\' || true
>>          local username=`echo "$opts" | awk '{ print $NF }'`
>> -       local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
>> +       local user_exists=`grep "^$username:" $rootdir/etc/passwd`
>>          if test "x$user_exists" != "x"; then
>> -              local count=0
>> -              while true; do
>> -                      eval $PSEUDO userdel $opts || true
>> -                      user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
>> -                      if test "x$user_exists" != "x"; then
>> -                              bbwarn "${PN}: userdel command did not succeed. Retrying..."
>> -                      else
>> -                              break
>> -                      fi
>> -                      count=`expr $count + 1`
>> -                      if test $count = $retries; then
>> -                               bbfatal "${PN}: Tried running userdel command $retries times without success, giving up"
>> -                      fi
>> -                      sleep $count
>> -              done
>> -       else
>> -               bbnote "${PN}: user $username doesn't exist, not removing it"
>> +               bbfatal "${PN}: userdel command did not succeed."
>>          fi
>>   }
>>
>> @@ -172,59 +90,29 @@ perform_groupmod () {
>>          # Other than the return value of groupmod, there's no simple way to judge whether the command
>>          # succeeds, so we disable -e option temporarily
>>          set +e
>> +
>>          local rootdir="$1"
>>          local opts="$2"
>> -       local retries="$3"
>> -       bbnote "${PN}: Performing groupmod with [$opts] and $retries times of retry"
>> -       local groupname=`echo "$opts" | awk '{ print $NF }'`
>> -       local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
>> -       if test "x$group_exists" != "x"; then
>> -               local count=0
>> -               while true; do
>> -                       eval $PSEUDO groupmod $opts
>> -                       if test $? != 0; then
>> -                               bbwarn "${PN}: groupmod command did not succeed. Retrying..."
>> -                       else
>> -                               break
>> -                       fi
>> -                       count=`expr $count + 1`
>> -                       if test $count = $retries; then
>> -                               bbfatal "${PN}: Tried running groupmod command $retries times without success, giving up"
>> -                       fi
>> -                       sleep $count
>> -               done
>> -       else
>> -               bbwarn "${PN}: group $groupname doesn't exist, unable to modify it"
>> +       bbnote "${PN}: Performing groupmod with [$opts]"
>> +       eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO groupmod $opts\'
>> +       if test $? != 0; then
>> +               bbwarn "${PN}: groupmod command did not succeed."
>>          fi
>> +
>>          set -e
>>   }
>>
>>   perform_usermod () {
>>          # Same reason with groupmod, temporarily disable -e option
>>          set +e
>> +
>>          local rootdir="$1"
>>          local opts="$2"
>> -       local retries="$3"
>> -       bbnote "${PN}: Performing usermod with [$opts] and $retries times of retry"
>> -       local username=`echo "$opts" | awk '{ print $NF }'`
>> -       local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
>> -       if test "x$user_exists" != "x"; then
>> -              local count=0
>> -              while true; do
>> -                      eval $PSEUDO usermod $opts
>> -                      if test $? != 0; then
>> -                              bbwarn "${PN}: usermod command did not succeed. Retrying..."
>> -                      else
>> -                              break
>> -                      fi
>> -                      count=`expr $count + 1`
>> -                      if test $count = $retries; then
>> -                               bbfatal "${PN}: Tried running usermod command $retries times without success, giving up"
>> -                      fi
>> -                      sleep $count
>> -              done
>> -       else
>> -               bbwarn "${PN}: user $username doesn't exist, unable to modify it"
>> +       bbnote "${PN}: Performing usermod with [$opts]"
>> +       eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO usermod $opts\'
>> +       if test $? != 0; then
>> +               bbfatal "${PN}: usermod command did not succeed."
>>          fi
>> +
>>          set -e
>>   }
>> --
>> 2.6.1
>>
>> --
>> _______________________________________________
>> Openembedded-core mailing list
>> Openembedded-core at lists.openembedded.org
>> http://lists.openembedded.org/mailman/listinfo/openembedded-core


-- 
Regards,
Neil | Kai Kang




More information about the Openembedded-core mailing list