Re: [gentoo-portage-dev] [PATCH] emerge: use asyncio interfaces for spinner during owner lookup (bug 591760)
On Sun, Mar 26, 2017 at 7:25 PM, Zac Medico wrote: > On Sun, Mar 26, 2017 at 6:58 PM, Brian Dolbec wrote: >> On Sun, 26 Mar 2017 18:01:01 -0700 >> Zac Medico wrote: >> >>> X-Gentoo-bug: 591760 >>> X-Gentoo-bug-url: https://bugs.gentoo.org/show_bug.cgi?id=591760 >>> --- >>> pym/_emerge/depgraph.py | 13 - >>> pym/portage/dbapi/vartree.py | 22 +- >>> 2 files changed, 17 insertions(+), 18 deletions(-) >>> >> looks fine. > > Thanks, pushed: > > https://gitweb.gentoo.org/proj/portage.git/commit/?id=dfa317d0b8572a6c463ad5e778a8ca4633086f1b > >> Question, will this help make the spinner more consistent with spin? > > Well, that problem was already solved for the case where emerge is > looking up owners of files, which is the case that this code affects. > > I'm sure there are plenty of other places where the spinner does not > update consistently. This occurs when the main (and only) thread goes > for a long time without calling depgraph._spinner_update(). For > example, some of the code called via the > depgraph._process_slot_conflicts method might we consuming a lot of > time without calling the _spinner_update method. When the spinner appears to be stuck, you can send a SIGUSR1 signal to the emerge process, and then use 'bt' to get a backtrace so that we can see what it's doing. -- Thanks, Zac
Re: [gentoo-portage-dev] [PATCH] emerge: use asyncio interfaces for spinner during owner lookup (bug 591760)
On Sun, Mar 26, 2017 at 6:58 PM, Brian Dolbec wrote: > On Sun, 26 Mar 2017 18:01:01 -0700 > Zac Medico wrote: > >> X-Gentoo-bug: 591760 >> X-Gentoo-bug-url: https://bugs.gentoo.org/show_bug.cgi?id=591760 >> --- >> pym/_emerge/depgraph.py | 13 - >> pym/portage/dbapi/vartree.py | 22 +- >> 2 files changed, 17 insertions(+), 18 deletions(-) >> > looks fine. Thanks, pushed: https://gitweb.gentoo.org/proj/portage.git/commit/?id=dfa317d0b8572a6c463ad5e778a8ca4633086f1b > Question, will this help make the spinner more consistent with spin? Well, that problem was already solved for the case where emerge is looking up owners of files, which is the case that this code affects. I'm sure there are plenty of other places where the spinner does not update consistently. This occurs when the main (and only) thread goes for a long time without calling depgraph._spinner_update(). For example, some of the code called via the depgraph._process_slot_conflicts method might we consuming a lot of time without calling the _spinner_update method. -- Thanks, Zac
Re: [gentoo-portage-dev] [PATCH] emerge: use asyncio interfaces for spinner during owner lookup (bug 591760)
On Sun, 26 Mar 2017 18:01:01 -0700 Zac Medico wrote: > X-Gentoo-bug: 591760 > X-Gentoo-bug-url: https://bugs.gentoo.org/show_bug.cgi?id=591760 > --- > pym/_emerge/depgraph.py | 13 - > pym/portage/dbapi/vartree.py | 22 +- > 2 files changed, 17 insertions(+), 18 deletions(-) > > diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py > index 7c9130b..04e724d 100644 > --- a/pym/_emerge/depgraph.py > +++ b/pym/_emerge/depgraph.py > @@ -3668,17 +3668,20 @@ class depgraph(object): > def select_files(self, args): > # Use the global event loop for spinner progress > # indication during file owner lookups (bug #461412). > - spinner_id = None > + def spinner_cb(): > + self._frozen_config.spinner.update() > + spinner_cb.handle = > self._event_loop.call_soon(spinner_cb) + > + spinner_cb.handle = None > try: > spinner = self._frozen_config.spinner > if spinner is not None and \ > spinner.update is not > spinner.update_quiet: > - spinner_id = > self._event_loop.idle_add( > - > self._frozen_config.spinner.update) > + spinner_cb.handle = > self._event_loop.call_soon(spinner_cb) return self._select_files(args) > finally: > - if spinner_id is not None: > - > self._event_loop.source_remove(spinner_id) > + if spinner_cb.handle is not None: > + spinner_cb.handle.cancel() > > def _select_files(self, myfiles): > """Given a list of .tbz2s, .ebuilds sets, and deps, > populate diff --git a/pym/portage/dbapi/vartree.py > b/pym/portage/dbapi/vartree.py index c421dc5..7c8f150 100644 > --- a/pym/portage/dbapi/vartree.py > +++ b/pym/portage/dbapi/vartree.py > @@ -1369,32 +1369,28 @@ class vardbapi(dbapi): > global_event_loop() or > EventLoop(main=False)) root = self._vardb._eroot > > - def search_pkg(cpv): > + def search_pkg(cpv, search_future): > dblnk = self._vardb._dblink(cpv) > + results = [] > for path, name, is_basename in > path_info_list: if is_basename: > for p in > dblnk._contents.keys(): if os.path.basename(p) == name: > - > search_pkg.results.append((dblnk, > + > results.append((dblnk, dblnk._contents.unmap_key( > > p)[len(root):])) > else: > key = > dblnk._match_contents(path) if key is not False: > - > search_pkg.results.append( > + > results.append( (dblnk, key[len(root):])) > - search_pkg.complete = True > - return False > - > - search_pkg.results = [] > + search_future.set_result(results) > > for cpv in self._vardb.cpv_all(): > - del search_pkg.results[:] > - search_pkg.complete = False > - event_loop.idle_add(search_pkg, cpv) > - while not search_pkg.complete: > - event_loop.iteration() > - for result in search_pkg.results: > + search_future = > event_loop.create_future() > + event_loop.call_soon(search_pkg, > cpv, search_future) > + > event_loop.run_until_complete(search_future) > + for result in search_future.result(): > yield result > > class vartree(object): looks fine. Question, will this help make the spinner more consistent with spin? -- Brian Dolbec
[gentoo-portage-dev] [PATCH] emerge: use asyncio interfaces for spinner during owner lookup (bug 591760)
X-Gentoo-bug: 591760 X-Gentoo-bug-url: https://bugs.gentoo.org/show_bug.cgi?id=591760 --- pym/_emerge/depgraph.py | 13 - pym/portage/dbapi/vartree.py | 22 +- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index 7c9130b..04e724d 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -3668,17 +3668,20 @@ class depgraph(object): def select_files(self, args): # Use the global event loop for spinner progress # indication during file owner lookups (bug #461412). - spinner_id = None + def spinner_cb(): + self._frozen_config.spinner.update() + spinner_cb.handle = self._event_loop.call_soon(spinner_cb) + + spinner_cb.handle = None try: spinner = self._frozen_config.spinner if spinner is not None and \ spinner.update is not spinner.update_quiet: - spinner_id = self._event_loop.idle_add( - self._frozen_config.spinner.update) + spinner_cb.handle = self._event_loop.call_soon(spinner_cb) return self._select_files(args) finally: - if spinner_id is not None: - self._event_loop.source_remove(spinner_id) + if spinner_cb.handle is not None: + spinner_cb.handle.cancel() def _select_files(self, myfiles): """Given a list of .tbz2s, .ebuilds sets, and deps, populate diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index c421dc5..7c8f150 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -1369,32 +1369,28 @@ class vardbapi(dbapi): global_event_loop() or EventLoop(main=False)) root = self._vardb._eroot - def search_pkg(cpv): + def search_pkg(cpv, search_future): dblnk = self._vardb._dblink(cpv) + results = [] for path, name, is_basename in path_info_list: if is_basename: for p in dblnk._contents.keys(): if os.path.basename(p) == name: - search_pkg.results.append((dblnk, + results.append((dblnk, dblnk._contents.unmap_key( p)[len(root):])) else: key = dblnk._match_contents(path) if key is not False: - search_pkg.results.append( + results.append( (dblnk, key[len(root):])) - search_pkg.complete = True - return False - - search_pkg.results = [] + search_future.set_result(results) for cpv in self._vardb.cpv_all(): - del search_pkg.results[:] - search_pkg.complete = False - event_loop.idle_add(search_pkg, cpv) - while not search_pkg.complete: - event_loop.iteration() - for result in search_pkg.results: + search_future = event_loop.create_future() + event_loop.call_soon(search_pkg, cpv, search_future) + event_loop.run_until_complete(search_future) + for result in search_future.result(): yield result class vartree(object): -- 2.10.2