]> git.decadent.org.uk Git - dak.git/commitdiff
process-new
authorJoerg Jaspert <joerg@debian.org>
Thu, 16 Apr 2009 20:31:56 +0000 (22:31 +0200)
committerJoerg Jaspert <joerg@debian.org>
Thu, 16 Apr 2009 20:31:56 +0000 (22:31 +0200)
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 <joerg@debian.org>
config/debian/dak.conf
dak/process_new.py
daklib/dak_exceptions.py

index 24282855466fc334e6177303fed695192d82ed91..4638b1c6aa6bfa2c96a95c476e21a27ac716568c 100644 (file)
@@ -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
index 02f1b8bcd7e73145e13ccf846c274e981fcdbb03..7d76937f760a34f57c39901cef5fd42102acac0c 100755 (executable)
@@ -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..."
 
 ################################################################################
 
index ccd63e5055e28df08af620008e08e1457acddf2d..21fce9be57665a87d870b4ecacc433c4742daa89 100755 (executable)
@@ -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):