public inbox for gentoo-portage-dev@lists.gentoo.org
 help / color / mirror / Atom feed
From: Brian Dolbec <dolsen@gentoo.org>
To: gentoo-portage-dev@lists.gentoo.org
Subject: Re: [gentoo-portage-dev] [PATCH] depgraph._serialize_tasks: improve runtime cycle handling (bug 590514)
Date: Sun, 7 Aug 2016 08:14:50 -0700	[thread overview]
Message-ID: <20160807081450.2d601261.dolsen@gentoo.org> (raw)
In-Reply-To: <1470371639-8324-1-git-send-email-zmedico@gentoo.org>

On Thu,  4 Aug 2016 21:33:59 -0700
Zac Medico <zmedico@gentoo.org> wrote:

> Previously, it was possible for _serialize_tasks to count some
> dependencies of a runtime cycle as part of that cycle, leading to
> sub-optimal merge order for these dependencies because they got
> grouped together with the cycle in the overall merge order. Fix
> it to separate these dependencies from the cycle, and merge them
> earlier.
> 
> X-Gentoo-Bug: 590514
> X-Gentoo-Bug-url: https://bugs.gentoo.org/show_bug.cgi?id=590514
> ---
>  pym/_emerge/depgraph.py                            | 50
> +++++++-------- .../resolver/test_runtime_cycle_merge_order.py     |
> 72 ++++++++++++++++++++++ 2 files changed, 98 insertions(+), 24
> deletions(-) create mode 100644
> pym/portage/tests/resolver/test_runtime_cycle_merge_order.py
> 
> diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
> index fc957f5..26037ad 100644
> --- a/pym/_emerge/depgraph.py
> +++ b/pym/_emerge/depgraph.py
> @@ -7415,36 +7415,38 @@ class depgraph(object):
>  						selected_nodes =
> set() if gather_deps(ignore_priority,
>  							mergeable_nodes,
> selected_nodes, node):
> -							# When
> selecting asap_nodes, we need to ensure
> -							# that we
> haven't selected a large runtime cycle
> -							# that is
> obviously sub-optimal. This will be
> -							# obvious if
> any of the non-asap selected_nodes
> -							# is a leaf
> node when medium_soft deps are
> -							# ignored.
> -							if
> prefer_asap and asap_nodes and \
> -
> len(selected_nodes) > 1:
> -								for
> node in selected_nodes.difference(
> -
> asap_nodes):
> -
> if not mygraph.child_nodes(node,
> -
> ignore_priority =
> -
> DepPriorityNormalRange.ignore_medium_soft):
> -
> selected_nodes = None
> -
> break
> -							if
> selected_nodes:
> -								if
> smallest_cycle is None or \
> -
> len(selected_nodes) < len(smallest_cycle):
> -
> smallest_cycle = selected_nodes
> +							if
> smallest_cycle is None or \
> +
> len(selected_nodes) < len(smallest_cycle):
> +
> smallest_cycle = selected_nodes 
>  					selected_nodes =
> smallest_cycle 
> -					if selected_nodes and debug:
> -						writemsg("\nruntime
> cycle digraph (%s nodes):\n\n" %
> -
> (len(selected_nodes),), noiselevel=-1)
> +					if selected_nodes is not
> None: cycle_digraph = mygraph.copy()
>  						cycle_digraph.difference_update([x
> for x in cycle_digraph if x not in selected_nodes])
> -
> cycle_digraph.debug_print()
> -						writemsg("\n",
> noiselevel=-1) +
> +						leaves =
> cycle_digraph.leaf_nodes()
> +						if leaves:
> +							# NOTE: This
> case should only be triggered when
> +							#
> prefer_asap is True, since otherwise these
> +							# leaves
> would have been selected to merge
> +							# before
> this point. Since these "leaves" may
> +							# actually
> have some low-priority dependencies
> +							# that we
> have intentionally ignored, select
> +							# only one
> node here, so that merge order
> +							# accounts
> for as many dependencies as possible.
> +
> selected_nodes = [leaves[0]] +
> +						if debug:
> +
> writemsg("\nruntime cycle digraph (%s nodes):\n\n" %
> +
> (len(selected_nodes),), noiselevel=-1)
> +
> cycle_digraph.debug_print()
> +
> writemsg("\n", noiselevel=-1) +
> +							if leaves:
> +
> writemsg("runtime cycle leaf: %s\n\n" %
> +
> (selected_nodes[0],), noiselevel=-1) 
>  					if prefer_asap and
> asap_nodes and not selected_nodes: # We failed to find any asap nodes
> to merge, so ignore diff --git

As usual, we are not resolver guru's, but the code changes look decent
enough :)

LGTM

-- 
Brian Dolbec <dolsen>



  reply	other threads:[~2016-08-07 15:14 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-05  4:33 [gentoo-portage-dev] [PATCH] depgraph._serialize_tasks: improve runtime cycle handling (bug 590514) Zac Medico
2016-08-07 15:14 ` Brian Dolbec [this message]
2016-08-07 17:57   ` Zac Medico

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160807081450.2d601261.dolsen@gentoo.org \
    --to=dolsen@gentoo.org \
    --cc=gentoo-portage-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox