[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gentoo-portage-dev
Subject:    [gentoo-portage-dev] [PATCH 3/5] EbuildFetcher: add _async_uri_map method (bug 653810)
From:       Zac Medico <zmedico () gentoo ! org>
Date:       2018-04-22 22:30:12
Message-ID: 20180422223014.24341-4-zmedico () gentoo ! org
[Download RAW message or body]

Add an _async_uri_map method to replace the synchronous _get_uri_map
method. This will be used to prevent event loop recursion.

Bug: https://bugs.gentoo.org/653810
---
 pym/_emerge/EbuildFetcher.py | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/pym/_emerge/EbuildFetcher.py b/pym/_emerge/EbuildFetcher.py
index 81eeb6dcd..1f574740b 100644
--- a/pym/_emerge/EbuildFetcher.py
+++ b/pym/_emerge/EbuildFetcher.py
@@ -49,7 +49,7 @@ class _EbuildFetcherProcess(ForkProcess):
 		"pkg", "prefetch", "_digests", "_manifest", "_settings", "_uri_map")
 
 	def already_fetched(self, settings):
-		uri_map = self._get_uri_map()
+		uri_map = self.scheduler.run_until_complete(self._async_uri_map())
 		if not uri_map:
 			return True
 
@@ -125,7 +125,7 @@ class _EbuildFetcherProcess(ForkProcess):
 		ebuild_path = self._get_ebuild_path()
 
 		try:
-			uri_map = self._get_uri_map()
+			uri_map = self.scheduler.run_until_complete(self._async_uri_map())
 		except portage.exception.InvalidDependString as e:
 			msg_lines = []
 			msg = "Fetch failed for '%s' due to invalid SRC_URI: %s" % \
@@ -210,21 +210,34 @@ class _EbuildFetcherProcess(ForkProcess):
 			self._digests = self._get_manifest().getTypeDigests("DIST")
 		return self._digests
 
-	def _get_uri_map(self):
+	def _async_uri_map(self):
 		"""
-		This can raise InvalidDependString from portdbapi.getFetchMap().
+		This calls the portdbapi.async_fetch_map method and returns the
+		resulting Future (may contain InvalidDependString exception).
 		"""
 		if self._uri_map is not None:
-			return self._uri_map
+			result = self.scheduler.create_future()
+			result.set_result(self._uri_map)
+			return result
+
 		pkgdir = os.path.dirname(self._get_ebuild_path())
 		mytree = os.path.dirname(os.path.dirname(pkgdir))
 		use = None
 		if not self.fetchall:
 			use = self.pkg.use.enabled
 		portdb = self.pkg.root_config.trees["porttree"].dbapi
-		self._uri_map = portdb.getFetchMap(self.pkg.cpv,
+
+		def cache_result(result):
+			try:
+				self._uri_map = result.result()
+			except Exception:
+				# The caller handles this when it retrieves the result.
+				pass
+
+		result = portdb.async_fetch_map(self.pkg.cpv,
 			useflags=use, mytree=mytree)
-		return self._uri_map
+		result.add_done_callback(cache_result)
+		return result
 
 	def _prefetch_size_ok(self, uri_map, settings, ebuild_path):
 		distdir = settings["DISTDIR"]
-- 
2.13.6


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic