lock repos while adding

This commit is contained in:
dave 2018-11-01 22:32:06 -07:00
parent edd0a4a550
commit 65ae1783c1
1 changed files with 13 additions and 9 deletions

View File

@ -4,6 +4,8 @@ import persistent
import BTrees.OOBTree import BTrees.OOBTree
from repobot.provider import providers from repobot.provider import providers
import os import os
from threading import Lock
from collections import defaultdict
from repobot.common import plist, pmap from repobot.common import plist, pmap
@ -37,6 +39,7 @@ class RepoDb(object):
self.storage = ZODB.FileStorage.FileStorage(db_path) self.storage = ZODB.FileStorage.FileStorage(db_path)
self.db = ZODB.DB(self.storage) self.db = ZODB.DB(self.storage)
self.data_root = data_root self.data_root = data_root
self.repolocks = defaultdict(lambda: Lock())
with self.db.transaction() as c: with self.db.transaction() as c:
if "repos" not in c.root(): if "repos" not in c.root():
@ -45,15 +48,16 @@ class RepoDb(object):
c.root.sendqueue = plist() c.root.sendqueue = plist()
def add_package(self, provider, reponame, pkgname, pkgversion, fname, fobj, params): def add_package(self, provider, reponame, pkgname, pkgversion, fname, fobj, params):
with self.db.transaction() as c: with self.repolocks[(provider, reponame)]:
repo = self._get_repo(c, provider, reponame) with self.db.transaction() as c:
datadir = os.path.join(self.data_root, provider, reponame) repo = self._get_repo(c, provider, reponame)
provider = providers[repo.provider](self.db, repo, datadir) datadir = os.path.join(self.data_root, provider, reponame)
# Add the package provider = providers[repo.provider](self.db, repo, datadir)
pkg = repo.get_package(pkgname, pkgversion) # Add the package
provider.add_package(pkg, fname, fobj, params) pkg = repo.get_package(pkgname, pkgversion)
# Pack successfully added, queue the file for replication provider.add_package(pkg, fname, fobj, params)
c.root.sendqueue.append(("package", (repo, pkg, fname, params, ))) # Pack successfully added, queue the file for replication
c.root.sendqueue.append(("package", (repo, pkg, fname, params, )))
def _get_repo(self, c, provider, name): def _get_repo(self, c, provider, name):
if provider not in c.root.repos: if provider not in c.root.repos: