Openembedded Core Discussions
 help / color / mirror / Atom feed
From: Kang Kai <Kai.Kang@windriver.com>
To: Khem Raj <raj.khem@gmail.com>
Cc: Patches and discussions about the oe-core layer
	<openembedded-core@lists.openembedded.org>
Subject: Re: [PATCH 1/1] useradd_base.bbclass: fix simultaneous with flock
Date: Tue, 23 Feb 2016 11:35:10 +0800	[thread overview]
Message-ID: <56CBD36E.8020908@windriver.com> (raw)
In-Reply-To: <CAMKF1spcmUmc-FA1e9wdwki4=Dm14xY5Dw=+thvZAAkZe10fsA@mail.gmail.com>

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@windriver.com> wrote:
>> From: Kai Kang <kai.kang@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@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@lists.openembedded.org
>> http://lists.openembedded.org/mailman/listinfo/openembedded-core


-- 
Regards,
Neil | Kai Kang



  reply	other threads:[~2016-02-23  3:35 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-23  2:45 [PATCH 0/1] V3: Replace retry logic in useradd with flock kai.kang
2016-02-23  2:45 ` [PATCH 1/1] useradd_base.bbclass: fix simultaneous " kai.kang
2016-02-23  3:05   ` Khem Raj
2016-02-23  3:35     ` Kang Kai [this message]
2016-02-23  7:25       ` Richard Purdie
2016-02-23  7:31         ` Kang Kai
2016-02-23 16:29   ` Burton, Ross
2016-02-23 17:01     ` Burton, Ross
2016-02-23 17:10       ` Burton, Ross
2016-02-24  8:51         ` Kang Kai
  -- strict thread matches above, loose matches on Subject: below --
2016-02-16  7:14 [PATCH 0/1] V2: Replace retry logic in useradd " kai.kang
2016-02-16  7:14 ` [PATCH 1/1] useradd_base.bbclass: fix simultaneous " kai.kang
2016-02-16 12:09   ` Burton, Ross
2016-02-17  5:40     ` Kang Kai
2016-02-17 23:49       ` Burton, Ross
2016-02-22  8:41         ` Kang Kai
2016-02-15  1:59 [PATCH 0/1] Replace retry logic in useradd " kai.kang
2016-02-15  1:59 ` [PATCH 1/1] useradd_base.bbclass: fix simultaneous " kai.kang
2016-02-15 12:31   ` Burton, Ross
2016-02-16  2:14     ` Kang Kai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56CBD36E.8020908@windriver.com \
    --to=kai.kang@windriver.com \
    --cc=openembedded-core@lists.openembedded.org \
    --cc=raj.khem@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox