The synchronous lock method can trigger event loop recursion if the event loop is already running, which is incompatible with asyncio's default event loop. Therefore, migrate the last consumers to use the async_lock method, and remove the synchronous lock method.
Bug: https://bugs.gentoo.org/614112 Bug: https://bugs.gentoo.org/649588 --- pym/_emerge/EbuildBuildDir.py | 47 ----------------------------- pym/_emerge/Scheduler.py | 2 +- pym/portage/dbapi/vartree.py | 2 +- pym/portage/package/ebuild/doebuild.py | 9 ++++-- pym/portage/tests/ebuild/test_ipc_daemon.py | 2 +- 5 files changed, 9 insertions(+), 53 deletions(-) diff --git a/pym/_emerge/EbuildBuildDir.py b/pym/_emerge/EbuildBuildDir.py index 9163deacf..477113db8 100644 --- a/pym/_emerge/EbuildBuildDir.py +++ b/pym/_emerge/EbuildBuildDir.py @@ -19,53 +19,6 @@ class EbuildBuildDir(SlotObject): SlotObject.__init__(self, **kwargs) self.locked = False - def lock(self): - """ - This raises an AlreadyLocked exception if lock() is called - while a lock is already held. In order to avoid this, call - unlock() or check whether the "locked" attribute is True - or False before calling lock(). - """ - if self._lock_obj is not None: - raise self.AlreadyLocked((self._lock_obj,)) - - dir_path = self.settings.get('PORTAGE_BUILDDIR') - if not dir_path: - raise AssertionError('PORTAGE_BUILDDIR is unset') - catdir = os.path.dirname(dir_path) - self._catdir = catdir - - try: - portage.util.ensure_dirs(os.path.dirname(catdir), - gid=portage.portage_gid, - mode=0o70, mask=0) - except PortageException: - if not os.path.isdir(os.path.dirname(catdir)): - raise - catdir_lock = AsynchronousLock(path=catdir, scheduler=self.scheduler) - catdir_lock.start() - catdir_lock.wait() - self._assert_lock(catdir_lock) - - try: - try: - portage.util.ensure_dirs(catdir, - gid=portage.portage_gid, - mode=0o70, mask=0) - except PortageException: - if not os.path.isdir(catdir): - raise - builddir_lock = AsynchronousLock(path=dir_path, - scheduler=self.scheduler) - builddir_lock.start() - builddir_lock.wait() - self._assert_lock(builddir_lock) - self._lock_obj = builddir_lock - self.settings['PORTAGE_BUILDDIR_LOCKED'] = '1' - finally: - self.locked = self._lock_obj is not None - catdir_lock.unlock() - def _assert_lock(self, async_lock): if async_lock.returncode != os.EX_OK: # TODO: create a better way to propagate this error to the caller diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py index a248f5974..71fe3e07d 100644 --- a/pym/_emerge/Scheduler.py +++ b/pym/_emerge/Scheduler.py @@ -799,7 +799,7 @@ class Scheduler(PollScheduler): settings["PORTAGE_BUILDDIR"] = build_dir_path build_dir = EbuildBuildDir(scheduler=sched_iface, settings=settings) - build_dir.lock() + sched_iface.run_until_complete(build_dir.async_lock()) current_task = None try: diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index 8ad6957a3..1a86940f1 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -2081,7 +2081,7 @@ class dblink(object): builddir_lock = EbuildBuildDir( scheduler=scheduler, settings=self.settings) - builddir_lock.lock() + scheduler.run_until_complete(builddir_lock.async_lock()) prepare_build_dirs(settings=self.settings, cleanup=True) log_path = self.settings.get("PORTAGE_LOG_FILE") diff --git a/pym/portage/package/ebuild/doebuild.py b/pym/portage/package/ebuild/doebuild.py index bdcdfbe87..3c8414387 100644 --- a/pym/portage/package/ebuild/doebuild.py +++ b/pym/portage/package/ebuild/doebuild.py @@ -813,7 +813,8 @@ def doebuild(myebuild, mydo, _unused=DeprecationWarning, settings=None, debug=0, scheduler=(portage._internal_caller and global_event_loop() or EventLoop(main=False)), settings=mysettings) - builddir_lock.lock() + builddir_lock.scheduler.run_until_complete( + builddir_lock.async_lock()) try: return _spawn_phase(mydo, mysettings, fd_pipes=fd_pipes, returnpid=returnpid) @@ -939,7 +940,8 @@ def doebuild(myebuild, mydo, _unused=DeprecationWarning, settings=None, debug=0, scheduler=(portage._internal_caller and global_event_loop() or EventLoop(main=False)), settings=mysettings) - builddir_lock.lock() + builddir_lock.scheduler.run_until_complete( + builddir_lock.async_lock()) try: _spawn_phase("clean", mysettings) finally: @@ -963,7 +965,8 @@ def doebuild(myebuild, mydo, _unused=DeprecationWarning, settings=None, debug=0, scheduler=(portage._internal_caller and global_event_loop() or EventLoop(main=False)), settings=mysettings) - builddir_lock.lock() + builddir_lock.scheduler.run_until_complete( + builddir_lock.async_lock()) mystatus = prepare_build_dirs(myroot, mysettings, cleanup) if mystatus: return mystatus diff --git a/pym/portage/tests/ebuild/test_ipc_daemon.py b/pym/portage/tests/ebuild/test_ipc_daemon.py index b45177f7e..bc18cdf64 100644 --- a/pym/portage/tests/ebuild/test_ipc_daemon.py +++ b/pym/portage/tests/ebuild/test_ipc_daemon.py @@ -60,7 +60,7 @@ class IpcDaemonTestCase(TestCase): build_dir = EbuildBuildDir( scheduler=event_loop, settings=env) - build_dir.lock() + event_loop.run_until_complete(build_dir.async_lock()) ensure_dirs(env['PORTAGE_BUILDDIR']) input_fifo = os.path.join(env['PORTAGE_BUILDDIR'], '.ipc_in') -- 2.13.6