[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[dak/master] 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 <joerg@debian.org>
---
 config/debian/dak.conf   |    1 +
 dak/process_new.py       |   55 ++++++++++++++++++++++++++++++++++-----------
 daklib/dak_exceptions.py |    3 +-
 3 files changed, 44 insertions(+), 15 deletions(-)

diff --git a/config/debian/dak.conf b/config/debian/dak.conf
index 2428285..4638b1c 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 02f1b8b..7d76937 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 ccd63e5..21fce9b 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):
-- 
1.5.6.5


Reply to: