aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2018-04-22 15:22:20 -0700
committerZac Medico <zmedico@gentoo.org>2018-04-23 11:39:47 -0700
commit0a5692bd4f4ab4a54daf2ce09112617cbc21c9ad (patch)
treeb388aaedadc88871d70a029ca0c3a2de44263b4d
parentEbuildFetcher: use _async_uri_map in _start (bug 653810) (diff)
downloadportage-0a5692bd.tar.gz
portage-0a5692bd.tar.bz2
portage-0a5692bd.zip
EbuildFetcher: add async_already_fetched method (bug 653810)
Add an async_already_fetched method to replace the synchronous already_fetched method, and use it to prevent event loop recursion. Bug: https://bugs.gentoo.org/653810 Reviewed-by: Brian Dolbec <dolsen@gentoo.org>
-rw-r--r--pym/_emerge/EbuildBuild.py8
-rw-r--r--pym/_emerge/EbuildFetcher.py30
2 files changed, 31 insertions, 7 deletions
diff --git a/pym/_emerge/EbuildBuild.py b/pym/_emerge/EbuildBuild.py
index 8ad8bcae9..9651bd419 100644
--- a/pym/_emerge/EbuildBuild.py
+++ b/pym/_emerge/EbuildBuild.py
@@ -216,8 +216,14 @@ class EbuildBuild(CompositeTask):
logfile=self.settings.get('PORTAGE_LOG_FILE'),
pkg=self.pkg, scheduler=self.scheduler)
+ self._start_task(AsyncTaskFuture(
+ future=fetcher.async_already_fetched(self.settings)),
+ functools.partial(self._start_fetch, fetcher))
+
+ def _start_fetch(self, fetcher, already_fetched_task):
+ self._assert_current(already_fetched_task)
try:
- already_fetched = fetcher.already_fetched(self.settings)
+ already_fetched = already_fetched_task.future.result()
except portage.exception.InvalidDependString as e:
msg_lines = []
msg = "Fetch failed for '%s' due to invalid SRC_URI: %s" % \
diff --git a/pym/_emerge/EbuildFetcher.py b/pym/_emerge/EbuildFetcher.py
index 8f6cc60fe..589eda85d 100644
--- a/pym/_emerge/EbuildFetcher.py
+++ b/pym/_emerge/EbuildFetcher.py
@@ -28,7 +28,7 @@ class EbuildFetcher(CompositeTask):
CompositeTask.__init__(self, **kwargs)
self._fetcher_proc = _EbuildFetcherProcess(**kwargs)
- def already_fetched(self, settings):
+ def async_already_fetched(self, settings):
"""
Returns True if all files already exist locally and have correct
digests, otherwise return False. When returning True, appropriate
@@ -38,7 +38,7 @@ class EbuildFetcher(CompositeTask):
such messages. This will raise InvalidDependString if SRC_URI is
invalid.
"""
- return self._fetcher_proc.already_fetched(settings)
+ return self._fetcher_proc.async_already_fetched(settings)
def _start(self):
self._start_task(
@@ -68,11 +68,29 @@ class _EbuildFetcherProcess(ForkProcess):
__slots__ = ("config_pool", "ebuild_path", "fetchonly", "fetchall",
"pkg", "prefetch", "_digests", "_manifest", "_settings", "_uri_map")
- def already_fetched(self, settings):
- uri_map = self.scheduler.run_until_complete(self._async_uri_map())
- if not uri_map:
- return True
+ def async_already_fetched(self, settings):
+ result = self.scheduler.create_future()
+
+ def uri_map_done(uri_map_future):
+ if uri_map_future.exception() is not None or result.cancelled():
+ if not result.cancelled():
+ result.set_exception(uri_map_future.exception())
+ return
+
+ uri_map = uri_map_future.result()
+ if uri_map:
+ result.set_result(
+ self._check_already_fetched(settings, uri_map))
+ else:
+ result.set_result(True)
+
+ uri_map_future = self._async_uri_map()
+ result.add_done_callback(lambda result:
+ aux_get_future.cancel() if result.cancelled() else None)
+ uri_map_future.add_done_callback(uri_map_done)
+ return result
+ def _check_already_fetched(self, settings, uri_map):
digests = self._get_digests()
distdir = settings["DISTDIR"]
allow_missing = self._get_manifest().allow_missing