[
https://issues.apache.org/jira/browse/FELIX-4656?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14496885#comment-14496885
]
Thomas Watson commented on FELIX-4656:
--------------------------------------
I also appreciate Guillaume's work on this defect. I need to understand the
fix a bit more though. I am the owner of Equinox and before I can assess the
risk of re-consuming the latest felix resolver I would like to understand the
fix. I have spend some more time looking at the fix and have some
questions/suggestions just to make sure I understand the approach. Keep in
mind my suggestions are mostly superficial changes that I think would make the
code more understandable.
You say in an earlier comment "Basically, the path structure is the difference
between the original candidate map and the current one, i.e. it contains
capabilities that have been excluded because they could not be resolved. It is
supposed to identify a Candidates object."
You then do a check in ResolverImpl to ensure multiple Candidates (or
permutations) with the same 'identity' are not processed more than once. This
seems like a very good thing to do. I do not see any reason to process the
'same' Candidate permutation more than once. What threw me off the first time
I glanced at the changes was the term 'path'. You describe it as the
difference from the original Candidates object which is a more accurate
description to me than path. I think we should change the usage of term path
here to be 'delta' (change getPaths -> getDelta()). And the variable
'donePaths' should be changed to something like 'processedDeltas'.
Since you have now optimized the loop in ResolverImpl to avoid processing the
same candidates multiple times I am wondering if the check in
Candidates.permutateIfNeeded(Requirement, List<Candidates>) is still valid or
needed. That check in there always seemed a little fishy to me because it
checks to see if an existing permutation has a different candidate (zero) for
the req as the one currently being processed. If no existing permutation
candidates are found with a different candidate (zero) then the current
candidates is permuted. It seems this potentially will throw some valid
permutations out, but maybe that is not an issue we should address now. I
would probably wait until we get a problem set that proves a valid solution set
was thrown out that would have allowed resolution.
Currently ResolveSession.m_usesPermutations and
ResolveSession.m_importPermutations are both simple List<Candidates> which
seems to imply that the lists could get the 'same' Candidates object added
multiple times to the two lists. Your changes address this concern by keeping
a record of the processed 'deltas' so the duplicates would be ignored. Is this
something that we should also optimize, or would it add more complication that
it is worth?
> Improve memory usage and speed of the resolver
> ----------------------------------------------
>
> Key: FELIX-4656
> URL: https://issues.apache.org/jira/browse/FELIX-4656
> Project: Felix
> Issue Type: Improvement
> Components: Resolver
> Reporter: Guillaume Nodet
> Assignee: Guillaume Nodet
> Fix For: resolver-1.2.0
>
>
> During big resolutions (> 100 bundles), the memory consumption can become
> very huge, mostly by keeping a lot of copies of the Candidates object.
> I want to lower the memory requirements of the resolver without touching the
> algorithm at all (which would be a different improvement).
> This can be done by using :
> * lower memory intensive collections
> * do smart copies of those collections (where they would only actually copy
> the data when modify)
> The second item is slightly more difficult to achieve, as the maps in the
> Candidate objects contains Set and List, which would mean that those must be
> copied too. So it could actually be complementary, if achievable.
> For the first one, the HashMap and HashSet are very memory intensive. I'll
> introduce two new collections which will lower the requirements.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)