[Kimchi-devel] [PATCH] fix lock for apt package manager

lvroyce at linux.vnet.ibm.com lvroyce at linux.vnet.ibm.com
Wed Mar 26 05:44:00 UTC 2014


From: Royce Lv <lvroyce at 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 at 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




More information about the Kimchi-devel mailing list