Re: [gentoo-portage-dev] [PATCH] emerge: use asyncio interfaces for spinner during owner lookup (bug 591760)

2017-03-26 Thread Zac Medico
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)

2017-03-26 Thread Zac Medico
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)

2017-03-26 Thread Brian Dolbec
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)

2017-03-26 Thread Zac Medico
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