From: Joerg Jaspert Date: Thu, 16 Apr 2009 20:31:56 +0000 (+0200) Subject: process-new X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0d19eda0946e4bb1fd7b2151eceed80390fb8acf;p=dak process-new do a source-package based locking in NEW processing. This means multiple people should be able to work in NEW at the same time (SHOCKING NEWS). Signed-off-by: Joerg Jaspert --- diff --git a/config/debian/dak.conf b/config/debian/dak.conf index 24282855..4638b1c6 100644 --- a/config/debian/dak.conf +++ b/config/debian/dak.conf @@ -173,6 +173,7 @@ Clean-Suites Process-New { AcceptedLockFile "/srv/ftp.debian.org/lock/unchecked.lock"; + LockDir "/srv/ftp.debian.org/lock/new/"; }; Check-Overrides diff --git a/dak/process_new.py b/dak/process_new.py index 02f1b8bc..7d76937f 100755 --- a/dak/process_new.py +++ b/dak/process_new.py @@ -48,6 +48,7 @@ import readline import stat import sys import time +import contextlib import apt_pkg, apt_inst import examine_package from daklib import database @@ -55,7 +56,7 @@ from daklib import logging from daklib import queue from daklib import utils from daklib.regexes import re_no_epoch, re_default_answer, re_isanum -from daklib.dak_exceptions import CantOpenError +from daklib.dak_exceptions import CantOpenError, AlreadyLockedError # Globals Cnf = None #: Configuration, apt_pkg.Configuration @@ -834,6 +835,28 @@ def get_accept_lock(): else: raise + +@contextlib.contextmanager +def lock_package(package): + """ + Lock C{package} so that noone else jumps in processing it. + + @type package: string + @param package: source package name to lock + """ + + path = os.path.join(Cnf["Process-New::LockDir"], package) + try: + fd = os.open(path, os.O_CREAT | os.O_EXCL | os.O_RDONLY) + except OSError, e: + if e.errno == errno.EEXIST or e.errno == errno.EACCES: + raise AlreadyLockedError, e.errno + + try: + yield fd + finally: + os.unlink(path) + def move_to_dir (dest, perms=0660, changesperms=0664): utils.move (Upload.pkg.changes_file, dest, perms=changesperms) file_keys = Upload.pkg.files.keys() @@ -958,19 +981,23 @@ def do_pkg(changes_file): Upload.update_subst() files = Upload.pkg.files - if not recheck(): - return - - (new, byhand) = check_status(files) - if new or byhand: - if new: - do_new() - if byhand: - do_byhand() - (new, byhand) = check_status(files) - - if not new and not byhand: - do_accept() + try: + with lock_package(Upload.pkg.changes["source"]): + if not recheck(): + return + + (new, byhand) = check_status(files) + if new or byhand: + if new: + do_new() + if byhand: + do_byhand() + (new, byhand) = check_status(files) + + if not new and not byhand: + do_accept() + except AlreadyLockedError, e: + print "Seems to be locked already, skipping..." ################################################################################ diff --git a/daklib/dak_exceptions.py b/daklib/dak_exceptions.py index ccd63e50..21fce9be 100755 --- a/daklib/dak_exceptions.py +++ b/daklib/dak_exceptions.py @@ -60,7 +60,8 @@ dakerrors = { "NoSourceFieldError": """Exception raised - we cant find the source - wtf?""", "MissingContents": """Exception raised - we could not determine contents for this deb""", "DBUpdateError": """Exception raised - could not update the database""", - "ChangesUnicodeError": """Exception raised - changes file not properly utf-8 encoded""" + "ChangesUnicodeError": """Exception raised - changes file not properly utf-8 encoded""", + "AlreadyLockedError": """Exception raised - package already locked by someone else""" } #: All dak exceptions def construct_dak_exception(name, description):