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/base/, catalyst/, catalyst/targets/
Date: Thu, 10 Jun 2021 01:35:45
Message-Id: 1623288932.8a9780b8bef53d427fa7d68b7df85e2d34f4dd57.mattst88@gentoo
1 commit: 8a9780b8bef53d427fa7d68b7df85e2d34f4dd57
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:35:32 2021 +0000
6 URL: https://gitweb.gentoo.org/proj/catalyst.git/commit/?id=8a9780b8
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 | 10 +++-----
22 catalyst/lock.py | 58 --------------------------------------------
23 catalyst/targets/snapshot.py | 6 ++---
24 4 files changed, 7 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..34d10389 100644
46 --- a/catalyst/base/stagebase.py
47 +++ b/catalyst/base/stagebase.py
48 @@ -8,6 +8,7 @@ import sys
49
50 from pathlib import Path
51
52 +import fasteners
53 import libmount
54 import toml
55
56 @@ -25,7 +26,6 @@ from catalyst.support import (CatalystError, file_locate, normpath,
57 from catalyst.base.targetbase import TargetBase
58 from catalyst.base.clearbase import ClearBase
59 from catalyst.base.genbase import GenBase
60 -from catalyst.lock import LockDir, LockInUse
61 from catalyst.fileops import ensure_dirs, clear_dir, clear_path
62 from catalyst.base.resume import AutoResume
63
64 @@ -36,9 +36,6 @@ def run_sequence(sequence):
65 sys.stdout.flush()
66 try:
67 func()
68 - except LockInUse:
69 - log.error('Unable to aquire the lock...')
70 - return False
71 except Exception:
72 log.error('Exception running action sequence %s',
73 func.__name__, exc_info=True)
74 @@ -478,7 +475,6 @@ class StageBase(TargetBase, ClearBase, GenBase):
75 """
76 self.settings["chroot_path"] = normpath(self.settings["storedir"] +
77 "/tmp/" + self.settings["target_subpath"].rstrip('/'))
78 - self.chroot_lock = LockDir(self.settings["chroot_path"])
79
80 def set_autoresume_path(self):
81 self.settings["autoresume_path"] = normpath(pjoin(
82 @@ -1366,8 +1362,10 @@ class StageBase(TargetBase, ClearBase, GenBase):
83 pass
84
85 def run(self):
86 - self.chroot_lock.write_lock()
87 + with fasteners.InterProcessLock(self.chroot_path + '.lock'):
88 + return self._run()
89
90 + def _run(self):
91 if "clear-autoresume" in self.settings["options"]:
92 self.clear_autoresume()
93
94
95 diff --git a/catalyst/lock.py b/catalyst/lock.py
96 deleted file mode 100644
97 index e31745b2..00000000
98 --- a/catalyst/lock.py
99 +++ /dev/null
100 @@ -1,58 +0,0 @@
101 -
102 -import os
103 -
104 -from contextlib import contextmanager
105 -
106 -from snakeoil import fileutils
107 -from snakeoil import osutils
108 -from catalyst.fileops import ensure_dirs
109 -
110 -
111 -LockInUse = osutils.LockException
112 -
113 -class Lock:
114 - """
115 - A fnctl-based filesystem lock
116 - """
117 - def __init__(self, lockfile):
118 - fileutils.touch(lockfile, mode=0o664)
119 - os.chown(lockfile, uid=-1, gid=250)
120 - self.lock = osutils.FsLock(lockfile)
121 -
122 - def read_lock(self):
123 - self.lock.acquire_read_lock()
124 -
125 - def write_lock(self):
126 - self.lock.acquire_write_lock()
127 -
128 - def unlock(self):
129 - # Releasing a write lock is the same as a read lock.
130 - self.lock.release_write_lock()
131 -
132 -class LockDir(Lock):
133 - """
134 - A fnctl-based filesystem lock in a directory
135 - """
136 - def __init__(self, lockdir):
137 - ensure_dirs(lockdir)
138 - lockfile = os.path.join(lockdir, '.catalyst_lock')
139 -
140 - Lock.__init__(self, lockfile)
141 -
142 -@contextmanager
143 -def read_lock(filename):
144 - lock = Lock(filename)
145 - lock.read_lock()
146 - try:
147 - yield
148 - finally:
149 - lock.unlock()
150 -
151 -@contextmanager
152 -def write_lock(filename):
153 - lock = Lock(filename)
154 - lock.write_lock()
155 - try:
156 - yield
157 - finally:
158 - lock.unlock()
159
160 diff --git a/catalyst/targets/snapshot.py b/catalyst/targets/snapshot.py
161 index b494575a..ef68765d 100644
162 --- a/catalyst/targets/snapshot.py
163 +++ b/catalyst/targets/snapshot.py
164 @@ -5,11 +5,12 @@ Snapshot target
165 import subprocess
166 import sys
167
168 +import fasteners
169 +
170 from pathlib import Path
171
172 from catalyst import log
173 from catalyst.base.targetbase import TargetBase
174 -from catalyst.lock import write_lock
175 from catalyst.support import CatalystError, command
176
177 class snapshot(TargetBase):
178 @@ -93,8 +94,7 @@ class snapshot(TargetBase):
179 log.notice('>>> ' + ' '.join([*git_cmd, '|']))
180 log.notice(' ' + ' '.join(tar2sqfs_cmd))
181
182 - lockfile = self.snapshot.with_suffix('.lock')
183 - with write_lock(lockfile):
184 + with fasteners.InterProcessLock(self.snapshot.with_suffix('.lock')):
185 git = subprocess.Popen(git_cmd,
186 stdout=subprocess.PIPE,
187 stderr=sys.stderr,