Resolver and inefficiencies
Paul Sandoz
paul.sandoz at oracle.com
Thu May 3 08:13:51 PDT 2012
Hi,
This observation may already be known, but i thought i would throw this out here anyway...
When the following modules are installed into a library:
module a @ 1.0 {
requires c @ <= 1.1;
requires b;
class a.A;
}
module b @ 1.0 {
requires c @ 1.0;
class b.B;
}
module c @ 1.0 { }
module c @ 1.1 { }
it results in a heck of a lot of searching through the dependency graph (note that the jdk.base dependency is synthesized so there is more going on than shown above).
Module a at 1.0 will initially select c at 1.1, but module b at 1.0 requires c at 1.0 so the resolution algorithm will backtrack and eventually try a at 1.0 with c at 1.0.
Due to the way the resolver is implemented using the call stack this backtracking is very inefficient when there are optional dependencies. Sub-graphs are re-evaluated multiple times until the call stack eventually unwinds to try a at 1.0 with c at 1.0.
One solution is have the error propagate in the return value so the call stack knows whether it should keep unwinding i.e. for conflict with module c it should unwind to the point where the decision to select c at 1.1 was made so c at 1.0 and it's dependencies can be searched.
Something tells me this is still not particular efficient and there is probably a better way...
Paul.
More information about the jigsaw-dev
mailing list