[PATCH] fix lock for apt package manager

From: Royce Lv <lvroyce@linux.vnet.ibm.com> Tested with: 1.Model test update/add/remove repositories. 2.UI test. Global lock is acquired for kimchi to update/add/remove and list package informations. Signed-off-by: Royce Lv <lvroyce@linux.vnet.ibm.com> --- src/kimchi/repositories.py | 50 ++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/src/kimchi/repositories.py b/src/kimchi/repositories.py index 1c74f04..98fc3de 100644 --- a/src/kimchi/repositories.py +++ b/src/kimchi/repositories.py @@ -310,6 +310,7 @@ class AptRepo(object): getattr(__import__('apt_pkg'), 'init_config')() getattr(__import__('apt_pkg'), 'init_system')() config = getattr(__import__('apt_pkg'), 'config') + self.pkg_lock = getattr(__import__('apt_pkg'), 'SystemLock') module = __import__('aptsources.sourceslist', globals(), locals(), ['SourcesList'], -1) @@ -322,6 +323,16 @@ class AptRepo(object): fd.write("# This file is managed by Kimchi and it must not " "be modified manually\n") + def _get_repos(self): + try: + with self.pkg_lock(): + repos = self._sourceslist() + repos.refresh() + except Exception, e: + raise OperationFailed('KCHREPOS0025E', {'err': e.message}) + + return repos + def _get_repo_id(self, repo): data = urlparse.urlparse(repo.uri) name = data.hostname or data.path @@ -329,8 +340,7 @@ class AptRepo(object): def _get_source_entry(self, repo_id): kimchiLock.acquire() - repos = self._sourceslist() - repos.refresh() + repos = self._get_repos() kimchiLock.release() for r in repos: @@ -354,8 +364,7 @@ class AptRepo(object): _get_repo_id() """ kimchiLock.acquire() - repos = self._sourceslist() - repos.refresh() + repos = self._get_repos() kimchiLock.release() res = [] @@ -400,12 +409,15 @@ class AptRepo(object): dist = config['dist'] comps = config.get('comps', []) - kimchiLock.acquire() - repos = self._sourceslist() - repos.refresh() - source_entry = repos.add('deb', uri, dist, comps, file=self.filename) - repos.save() - kimchiLock.release() + with kimchiLock: + try: + repos = self._get_repos() + source_entry = repos.add('deb', uri, dist, comps, file=self.filename) + with self.pkg_lock(): + repos.save() + except Exception as e: + raise OperationFailed("KCHREPOS0026E", {'err': e.message}) + return self._get_repo_id(source_entry) @@ -430,11 +442,11 @@ class AptRepo(object): kimchiLock.acquire() try: - repos = self._sourceslist() - repos.refresh() - repos.remove(r) - repos.add(line, r.uri, r.dist, r.comps, file=self.filename) - repos.save() + repos = self._get_repos() + with self.pkg_lock(): + repos.remove(r) + repos.add(line, r.uri, r.dist, r.comps, file=self.filename) + repos.save() except: if enable: raise OperationFailed("KCHREPOS0020E", {'repo_id': repo_id}) @@ -476,10 +488,10 @@ class AptRepo(object): kimchiLock.acquire() try: - repos = self._sourceslist() - repos.refresh() - repos.remove(r) - repos.save() + repos = self._get_repos() + with self.pkg_lock(): + repos.remove(r) + repos.save() except: raise OperationFailed("KCHREPOS0017E", {'repo_id': repo_id}) finally: -- 1.8.3.2

Reviewed-by: Aline Manera <alinefm@linux.vnet.ibm.com> On 03/26/2014 02:44 AM, lvroyce@linux.vnet.ibm.com wrote:
From: Royce Lv <lvroyce@linux.vnet.ibm.com>
Tested with: 1.Model test update/add/remove repositories. 2.UI test. Global lock is acquired for kimchi to update/add/remove and list package informations.
Signed-off-by: Royce Lv <lvroyce@linux.vnet.ibm.com> --- src/kimchi/repositories.py | 50 ++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 19 deletions(-)
diff --git a/src/kimchi/repositories.py b/src/kimchi/repositories.py index 1c74f04..98fc3de 100644 --- a/src/kimchi/repositories.py +++ b/src/kimchi/repositories.py @@ -310,6 +310,7 @@ class AptRepo(object): getattr(__import__('apt_pkg'), 'init_config')() getattr(__import__('apt_pkg'), 'init_system')() config = getattr(__import__('apt_pkg'), 'config') + self.pkg_lock = getattr(__import__('apt_pkg'), 'SystemLock') module = __import__('aptsources.sourceslist', globals(), locals(), ['SourcesList'], -1)
@@ -322,6 +323,16 @@ class AptRepo(object): fd.write("# This file is managed by Kimchi and it must not " "be modified manually\n")
+ def _get_repos(self): + try: + with self.pkg_lock(): + repos = self._sourceslist() + repos.refresh() + except Exception, e: + raise OperationFailed('KCHREPOS0025E', {'err': e.message}) + + return repos + def _get_repo_id(self, repo): data = urlparse.urlparse(repo.uri) name = data.hostname or data.path @@ -329,8 +340,7 @@ class AptRepo(object):
def _get_source_entry(self, repo_id): kimchiLock.acquire() - repos = self._sourceslist() - repos.refresh() + repos = self._get_repos() kimchiLock.release()
for r in repos: @@ -354,8 +364,7 @@ class AptRepo(object): _get_repo_id() """ kimchiLock.acquire() - repos = self._sourceslist() - repos.refresh() + repos = self._get_repos() kimchiLock.release()
res = [] @@ -400,12 +409,15 @@ class AptRepo(object): dist = config['dist'] comps = config.get('comps', [])
- kimchiLock.acquire() - repos = self._sourceslist() - repos.refresh() - source_entry = repos.add('deb', uri, dist, comps, file=self.filename) - repos.save() - kimchiLock.release() + with kimchiLock: + try: + repos = self._get_repos() + source_entry = repos.add('deb', uri, dist, comps, file=self.filename) + with self.pkg_lock(): + repos.save() + except Exception as e: + raise OperationFailed("KCHREPOS0026E", {'err': e.message}) +
return self._get_repo_id(source_entry)
@@ -430,11 +442,11 @@ class AptRepo(object):
kimchiLock.acquire() try: - repos = self._sourceslist() - repos.refresh() - repos.remove(r) - repos.add(line, r.uri, r.dist, r.comps, file=self.filename) - repos.save() + repos = self._get_repos() + with self.pkg_lock(): + repos.remove(r) + repos.add(line, r.uri, r.dist, r.comps, file=self.filename) + repos.save() except: if enable: raise OperationFailed("KCHREPOS0020E", {'repo_id': repo_id}) @@ -476,10 +488,10 @@ class AptRepo(object):
kimchiLock.acquire() try: - repos = self._sourceslist() - repos.refresh() - repos.remove(r) - repos.save() + repos = self._get_repos() + with self.pkg_lock(): + repos.remove(r) + repos.save() except: raise OperationFailed("KCHREPOS0017E", {'repo_id': repo_id}) finally:

Need the same on src/kimchi/swupdate.py On 03/26/2014 02:44 AM, lvroyce@linux.vnet.ibm.com wrote:
From: Royce Lv <lvroyce@linux.vnet.ibm.com>
Tested with: 1.Model test update/add/remove repositories. 2.UI test. Global lock is acquired for kimchi to update/add/remove and list package informations.
Signed-off-by: Royce Lv <lvroyce@linux.vnet.ibm.com> --- src/kimchi/repositories.py | 50 ++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 19 deletions(-)
diff --git a/src/kimchi/repositories.py b/src/kimchi/repositories.py index 1c74f04..98fc3de 100644 --- a/src/kimchi/repositories.py +++ b/src/kimchi/repositories.py @@ -310,6 +310,7 @@ class AptRepo(object): getattr(__import__('apt_pkg'), 'init_config')() getattr(__import__('apt_pkg'), 'init_system')() config = getattr(__import__('apt_pkg'), 'config') + self.pkg_lock = getattr(__import__('apt_pkg'), 'SystemLock') module = __import__('aptsources.sourceslist', globals(), locals(), ['SourcesList'], -1)
@@ -322,6 +323,16 @@ class AptRepo(object): fd.write("# This file is managed by Kimchi and it must not " "be modified manually\n")
+ def _get_repos(self): + try: + with self.pkg_lock(): + repos = self._sourceslist() + repos.refresh() + except Exception, e: + raise OperationFailed('KCHREPOS0025E', {'err': e.message}) + + return repos + def _get_repo_id(self, repo): data = urlparse.urlparse(repo.uri) name = data.hostname or data.path @@ -329,8 +340,7 @@ class AptRepo(object):
def _get_source_entry(self, repo_id): kimchiLock.acquire() - repos = self._sourceslist() - repos.refresh() + repos = self._get_repos() kimchiLock.release()
for r in repos: @@ -354,8 +364,7 @@ class AptRepo(object): _get_repo_id() """ kimchiLock.acquire() - repos = self._sourceslist() - repos.refresh() + repos = self._get_repos() kimchiLock.release()
res = [] @@ -400,12 +409,15 @@ class AptRepo(object): dist = config['dist'] comps = config.get('comps', [])
- kimchiLock.acquire() - repos = self._sourceslist() - repos.refresh() - source_entry = repos.add('deb', uri, dist, comps, file=self.filename) - repos.save() - kimchiLock.release() + with kimchiLock: + try: + repos = self._get_repos() + source_entry = repos.add('deb', uri, dist, comps, file=self.filename) + with self.pkg_lock(): + repos.save() + except Exception as e: + raise OperationFailed("KCHREPOS0026E", {'err': e.message}) +
return self._get_repo_id(source_entry)
@@ -430,11 +442,11 @@ class AptRepo(object):
kimchiLock.acquire() try: - repos = self._sourceslist() - repos.refresh() - repos.remove(r) - repos.add(line, r.uri, r.dist, r.comps, file=self.filename) - repos.save() + repos = self._get_repos() + with self.pkg_lock(): + repos.remove(r) + repos.add(line, r.uri, r.dist, r.comps, file=self.filename) + repos.save() except: if enable: raise OperationFailed("KCHREPOS0020E", {'repo_id': repo_id}) @@ -476,10 +488,10 @@ class AptRepo(object):
kimchiLock.acquire() try: - repos = self._sourceslist() - repos.refresh() - repos.remove(r) - repos.save() + repos = self._get_repos() + with self.pkg_lock(): + repos.remove(r) + repos.save() except: raise OperationFailed("KCHREPOS0017E", {'repo_id': repo_id}) finally:
participants (2)
-
Aline Manera
-
lvroyce@linux.vnet.ibm.com