1 |
slords |
1.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 |