[Kimchi-devel] [PATCH] bug fix: Lock YUM operations

Paulo Ricardo Paz Vital pvital at linux.vnet.ibm.com
Tue Mar 25 18:43:23 UTC 2014


-- 
Reviewed-by: Paulo Vital <pvital at linux.vnet.ibm.com>


On Tue, 2014-03-25 at 15:32 -0300, Aline Manera wrote:
> From: Aline Manera <alinefm at br.ibm.com>
> 
> In addition to cherrypy lock - that avoids concurrent requests - we also
> need to use the yum.doLock() to avoid different applications running
> YUM, example, Kimchi and Package Kit.
> 
> Signed-off-by: Aline Manera <alinefm at br.ibm.com>
> ---
>  src/kimchi/i18n.py         |    4 ++++
>  src/kimchi/repositories.py |   27 ++++++++++++++++++++-------
>  src/kimchi/swupdate.py     |    9 +++++++--
>  3 files changed, 31 insertions(+), 9 deletions(-)
> 
> diff --git a/src/kimchi/i18n.py b/src/kimchi/i18n.py
> index c084e21..398d49a 100644
> --- a/src/kimchi/i18n.py
> +++ b/src/kimchi/i18n.py
> @@ -249,4 +249,8 @@ messages = {
>      "KCHREPOS0021E": _("Could not disable repository %(repo_id)s."),
>      "KCHREPOS0022E": _("YUM Repository ID already exists"),
>      "KCHREPOS0023E": _("YUM Repository name must be a string"),
> +    "KCHREPOS0024E": _("Unable to list repositories. Details: '%(err)s'"),
> +    "KCHREPOS0025E": _("Unable to retrieve repository information. Details: '%(err)s'"),
> +    "KCHREPOS0026E": _("Unable to add repository. Details: '%(err)s'"),
> +    "KCHREPOS0027E": _("Unable to remove repository. Details: '%(err)s'"),
>  }
> diff --git a/src/kimchi/repositories.py b/src/kimchi/repositories.py
> index bdf5df5..1c74f04 100644
> --- a/src/kimchi/repositories.py
> +++ b/src/kimchi/repositories.py
> @@ -115,14 +115,26 @@ class YumRepo(object):
>                  self._confdir = d
>                  break
> 
> +    def _get_repos(self, errcode):
> +        try:
> +            yb = self._yb()
> +            yb.doLock()
> +            repos = yb.repos
> +            yb.doUnlock()
> +        except Exception, e:
> +            kimchiLock.release()
> +            raise OperationFailed(errcode, {'err': e.message})
> +
> +        return repos
> +
>      def getRepositoriesList(self):
>          """
>          Return a list of repositories IDs
>          """
>          kimchiLock.acquire()
> -        repos = self._yb().repos.repos.keys()
> +        repos = self._get_repos('KCHREPOS0024E')
>          kimchiLock.release()
> -        return repos
> +        return repos.repos.keys()
> 
>      def getRepo(self, repo_id):
>          """
> @@ -130,8 +142,9 @@ class YumRepo(object):
>          repository ID format with the information of a YumRepository object.
>          """
>          kimchiLock.acquire()
> -        repos = self._yb().repos
> +        repos = self._get_repos('KCHREPOS0025E')
>          kimchiLock.release()
> +
>          if repo_id not in repos.repos.keys():
>              raise NotFoundError("KCHREPOS0012E", {'repo_id': repo_id})
> 
> @@ -169,7 +182,7 @@ class YumRepo(object):
>              repo_id = "kimchi_repo_%s" % str(int(time.time() * 1000))
> 
>          kimchiLock.acquire()
> -        repos = self._yb().repos
> +        repos = self._get_repos('KCHREPOS0026E')
>          kimchiLock.release()
>          if repo_id in repos.repos.keys():
>              raise InvalidOperation("KCHREPOS0022E", {'repo_id': repo_id})
> @@ -199,7 +212,7 @@ class YumRepo(object):
> 
>      def toggleRepo(self, repo_id, enable):
>          kimchiLock.acquire()
> -        repos = self._yb().repos
> +        repos = self._get_repos('KCHREPOS0011E')
>          kimchiLock.release()
>          if repo_id not in repos.repos.keys():
>              raise NotFoundError("KCHREPOS0012E", {'repo_id': repo_id})
> @@ -234,7 +247,7 @@ class YumRepo(object):
>          Update a given repository in repositories.Repositories() format
>          """
>          kimchiLock.acquire()
> -        repos = self._yb().repos
> +        repos = self._get_repos('KCHREPOS0011E')
>          kimchiLock.release()
>          if repo_id not in repos.repos.keys():
>              raise NotFoundError("KCHREPOS0012E", {'repo_id': repo_id})
> @@ -265,7 +278,7 @@ class YumRepo(object):
>          Remove a given repository
>          """
>          kimchiLock.acquire()
> -        repos = self._yb().repos
> +        repos = self._get_repos('KCHREPOS0027E')
>          kimchiLock.release()
>          if repo_id not in repos.repos.keys():
>              raise NotFoundError("KCHREPOS0012E", {'repo_id': repo_id})
> diff --git a/src/kimchi/swupdate.py b/src/kimchi/swupdate.py
> index 625b091..9489900 100644
> --- a/src/kimchi/swupdate.py
> +++ b/src/kimchi/swupdate.py
> @@ -149,8 +149,13 @@ class YumUpdate(object):
>          """
>          Update the list of packages to be updated in the system.
>          """
> -        self._yb = getattr(__import__('yum'), 'YumBase')()
> -        self._pkgs = self._yb.doPackageLists('updates')
> +        try:
> +            yb = getattr(__import__('yum'), 'YumBase')()
> +            yb.doLock()
> +            self._pkgs = yb.doPackageLists('updates')
> +            yb.doUnlock()
> +        except Exception, e:
> +            raise OperationFailed('KCHPKGUPD0003E', {'err': e.message})
> 
>      def getPackagesList(self):
>          """




More information about the Kimchi-devel mailing list