1 |
- add the Fedora Extras pushscript lock |
2 |
- change the Repo.py locking and exception handling |
3 |
[and add debug output to investigate a mysterious exception in |
4 |
_update_repo() shutil.copy()] |
5 |
|
6 |
diff -Nur plague-0.4.4.1-orig/server/PackageJob.py plague-0.4.4.1/server/PackageJob.py |
7 |
--- plague-0.4.4.1-orig/server/PackageJob.py 2006-03-13 05:10:49.000000000 +0100 |
8 |
+++ plague-0.4.4.1/server/PackageJob.py 2007-12-30 23:13:50.000000000 +0100 |
9 |
@@ -701,6 +701,7 @@ |
10 |
|
11 |
def _stage_repodone(self): |
12 |
resultstring = " %s (%s): Build on target %s succeeded." % (self.uid, self.name, self._target_str) |
13 |
+ log(resultstring) |
14 |
self.result = 'success' |
15 |
self._set_cur_stage('needsign', resultstring) |
16 |
|
17 |
diff -Nur plague-0.4.4.1-orig/server/Repo.py plague-0.4.4.1/server/Repo.py |
18 |
--- plague-0.4.4.1-orig/server/Repo.py 2005-11-29 07:17:07.000000000 +0100 |
19 |
+++ plague-0.4.4.1/server/Repo.py 2007-12-30 21:55:34.000000000 +0100 |
20 |
@@ -25,6 +25,9 @@ |
21 |
import EmailUtils |
22 |
from plague import DebugUtils |
23 |
|
24 |
+# Lockfile used by external scripts to ensure mutual exclusion |
25 |
+# from concurrent access to the repository's directory |
26 |
+REPO_LOCKFILE_NAME = ".repo-update.lock" |
27 |
|
28 |
class Repo(threading.Thread): |
29 |
""" Represents an on-disk repository of RPMs and manages updates to the repo. """ |
30 |
@@ -41,6 +44,7 @@ |
31 |
self._repodir = os.path.join(repodir, target_str) |
32 |
if not os.path.exists(self._repodir): |
33 |
os.makedirs(self._repodir) |
34 |
+ self._lockfile_path = os.path.join(self._repodir, REPO_LOCKFILE_NAME) |
35 |
|
36 |
self._repo_cache_dir = os.path.join(repodir, "cache", target_str) |
37 |
if not os.path.exists(self._repo_cache_dir): |
38 |
@@ -87,8 +91,29 @@ |
39 |
return True |
40 |
return False |
41 |
|
42 |
+ def _update_repo_with_pushlock(self): |
43 |
+ lockfile = None |
44 |
+ try: |
45 |
+ lockfile = open(self._lockfile_path, 'w') |
46 |
+ rc = fcntl.flock(lockfile, fcntl.LOCK_EX) |
47 |
+ except IOError, (errno, strerr): |
48 |
+ print "Repo Error (%s): opening lockfile %s failed. Output: (errno %d) '%s'" % (target_string, self._lockfile_path, errno, strerr) |
49 |
+ |
50 |
+ try: |
51 |
+ self._update_repo() |
52 |
+ except: |
53 |
+ if lockfile: |
54 |
+ fcntl.flock(lockfile, fcntl.LOCK_UN) |
55 |
+ lockfile.close() |
56 |
+ raise |
57 |
+ if lockfile: |
58 |
+ fcntl.flock(lockfile, fcntl.LOCK_UN) |
59 |
+ lockfile.close() |
60 |
+ |
61 |
def _update_repo(self): |
62 |
""" Copy new RPMS to each repo, and update each repo at the end """ |
63 |
+ target_string = self._target_cfg.target_string() |
64 |
+ |
65 |
for buildjob in self._repo_additions: |
66 |
# Ensure all the files are accessible |
67 |
success = True |
68 |
@@ -97,6 +122,9 @@ |
69 |
if not os.path.exists(src) or not os.access(src, os.R_OK): |
70 |
success = False |
71 |
bad_file = src |
72 |
+ print "Repo: %s is inaccessible." % src |
73 |
+ else: |
74 |
+ print "Repo: %s is accessible." % src |
75 |
|
76 |
if success: |
77 |
for src in buildjob.repofiles.keys(): |
78 |
@@ -199,7 +229,12 @@ |
79 |
if self._lock_count == 2: |
80 |
target_str = self._target_cfg.target_string() |
81 |
print "Repo '%s': updating repository metadata..." % target_str |
82 |
- self._update_repo() |
83 |
+ try: |
84 |
+ self._update_repo_with_pushlock() |
85 |
+ except IOError, (err, strerr): |
86 |
+ print "Repo '%s': %s (%d)" % (target_str, strerr, err) |
87 |
+ except OSError, e: |
88 |
+ print "Repo '%s': %s" % (target_str, e) |
89 |
print "Repo '%s': Done updating." % target_str |
90 |
|
91 |
# If there's a repo script for this target, enter level 3 |