Gentoo Archives: gentoo-commits

From: Matt Turner <mattst88@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/catalyst:wip/mattst88 commit in: catalyst/targets/, catalyst/, catalyst/base/
Date: Thu, 10 Jun 2021 01:16:28
Message-Id: 1623287735.b5b921f2e0a490d247e56da635d4d93248a19acc.mattst88@gentoo
1 commit: b5b921f2e0a490d247e56da635d4d93248a19acc
2 Author: Matt Turner <mattst88 <AT> gentoo <DOT> org>
3 AuthorDate: Wed Jun 9 06:17:31 2021 +0000
4 Commit: Matt Turner <mattst88 <AT> gentoo <DOT> org>
5 CommitDate: Thu Jun 10 01:15:35 2021 +0000
6 URL: https://gitweb.gentoo.org/proj/catalyst.git/commit/?id=b5b921f2
7
8 catalyst: Replace snakeoil's locks with fasteners
9
10 To no great surprise, the existing locking was broken. For example,
11 clear_chroot() releases the lock. It is called by unpack(), which is
12 part of prepare_sequence. The result is that the whole build could be
13 done without holding the lock.
14
15 Just lock around run(). It's not apparent that finer-grained locking
16 does anything for us.
17
18 Signed-off-by: Matt Turner <mattst88 <AT> gentoo.org>
19
20 catalyst/base/clearbase.py | 2 --
21 catalyst/base/stagebase.py | 9 +++----
22 catalyst/lock.py | 58 --------------------------------------------
23 catalyst/targets/snapshot.py | 6 ++---
24 4 files changed, 6 insertions(+), 69 deletions(-)
25
26 diff --git a/catalyst/base/clearbase.py b/catalyst/base/clearbase.py
27 index dcf6c523..6218330e 100644
28 --- a/catalyst/base/clearbase.py
29 +++ b/catalyst/base/clearbase.py
30 @@ -27,12 +27,10 @@ class ClearBase():
31 self.resume.clear_all(remove=True)
32
33 def clear_chroot(self):
34 - self.chroot_lock.unlock()
35 log.notice('Clearing the chroot path ...')
36 clear_dir(self.settings["chroot_path"], mode=0o755)
37
38 def remove_chroot(self):
39 - self.chroot_lock.unlock()
40 log.notice('Removing the chroot path ...')
41 clear_dir(self.settings["chroot_path"], mode=0o755, remove=True)
42
43
44 diff --git a/catalyst/base/stagebase.py b/catalyst/base/stagebase.py
45 index 448d6265..d15a0df8 100644
46 --- a/catalyst/base/stagebase.py
47 +++ b/catalyst/base/stagebase.py
48 @@ -25,7 +25,6 @@ from catalyst.support import (CatalystError, file_locate, normpath,
49 from catalyst.base.targetbase import TargetBase
50 from catalyst.base.clearbase import ClearBase
51 from catalyst.base.genbase import GenBase
52 -from catalyst.lock import LockDir, LockInUse
53 from catalyst.fileops import ensure_dirs, clear_dir, clear_path
54 from catalyst.base.resume import AutoResume
55
56 @@ -36,9 +35,6 @@ def run_sequence(sequence):
57 sys.stdout.flush()
58 try:
59 func()
60 - except LockInUse:
61 - log.error('Unable to aquire the lock...')
62 - return False
63 except Exception:
64 log.error('Exception running action sequence %s',
65 func.__name__, exc_info=True)
66 @@ -478,7 +474,6 @@ class StageBase(TargetBase, ClearBase, GenBase):
67 """
68 self.settings["chroot_path"] = normpath(self.settings["storedir"] +
69 "/tmp/" + self.settings["target_subpath"].rstrip('/'))
70 - self.chroot_lock = LockDir(self.settings["chroot_path"])
71
72 def set_autoresume_path(self):
73 self.settings["autoresume_path"] = normpath(pjoin(
74 @@ -1366,8 +1361,10 @@ class StageBase(TargetBase, ClearBase, GenBase):
75 pass
76
77 def run(self):
78 - self.chroot_lock.write_lock()
79 + with fasteners.InterProcessLock(self.chroot_path + '.lock'):
80 + return self._run()
81
82 + def _run(self):
83 if "clear-autoresume" in self.settings["options"]:
84 self.clear_autoresume()
85
86
87 diff --git a/catalyst/lock.py b/catalyst/lock.py
88 deleted file mode 100644
89 index e31745b2..00000000
90 --- a/catalyst/lock.py
91 +++ /dev/null
92 @@ -1,58 +0,0 @@
93 -
94 -import os
95 -
96 -from contextlib import contextmanager
97 -
98 -from snakeoil import fileutils
99 -from snakeoil import osutils
100 -from catalyst.fileops import ensure_dirs
101 -
102 -
103 -LockInUse = osutils.LockException
104 -
105 -class Lock:
106 - """
107 - A fnctl-based filesystem lock
108 - """
109 - def __init__(self, lockfile):
110 - fileutils.touch(lockfile, mode=0o664)
111 - os.chown(lockfile, uid=-1, gid=250)
112 - self.lock = osutils.FsLock(lockfile)
113 -
114 - def read_lock(self):
115 - self.lock.acquire_read_lock()
116 -
117 - def write_lock(self):
118 - self.lock.acquire_write_lock()
119 -
120 - def unlock(self):
121 - # Releasing a write lock is the same as a read lock.
122 - self.lock.release_write_lock()
123 -
124 -class LockDir(Lock):
125 - """
126 - A fnctl-based filesystem lock in a directory
127 - """
128 - def __init__(self, lockdir):
129 - ensure_dirs(lockdir)
130 - lockfile = os.path.join(lockdir, '.catalyst_lock')
131 -
132 - Lock.__init__(self, lockfile)
133 -
134 -@contextmanager
135 -def read_lock(filename):
136 - lock = Lock(filename)
137 - lock.read_lock()
138 - try:
139 - yield
140 - finally:
141 - lock.unlock()
142 -
143 -@contextmanager
144 -def write_lock(filename):
145 - lock = Lock(filename)
146 - lock.write_lock()
147 - try:
148 - yield
149 - finally:
150 - lock.unlock()
151
152 diff --git a/catalyst/targets/snapshot.py b/catalyst/targets/snapshot.py
153 index b494575a..ef68765d 100644
154 --- a/catalyst/targets/snapshot.py
155 +++ b/catalyst/targets/snapshot.py
156 @@ -5,11 +5,12 @@ Snapshot target
157 import subprocess
158 import sys
159
160 +import fasteners
161 +
162 from pathlib import Path
163
164 from catalyst import log
165 from catalyst.base.targetbase import TargetBase
166 -from catalyst.lock import write_lock
167 from catalyst.support import CatalystError, command
168
169 class snapshot(TargetBase):
170 @@ -93,8 +94,7 @@ class snapshot(TargetBase):
171 log.notice('>>> ' + ' '.join([*git_cmd, '|']))
172 log.notice(' ' + ' '.join(tar2sqfs_cmd))
173
174 - lockfile = self.snapshot.with_suffix('.lock')
175 - with write_lock(lockfile):
176 + with fasteners.InterProcessLock(self.snapshot.with_suffix('.lock')):
177 git = subprocess.Popen(git_cmd,
178 stdout=subprocess.PIPE,
179 stderr=sys.stderr,