[ https://issues.apache.org/jira/browse/FELIX-4337?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Davy Meers updated FELIX-4337: ------------------------------ Description: The comment of the method {{private void selectSingleton(ResolverHookRecord record, List<BundleRevision> singletons)}} of the {{StatefulResolver}}[1] explains that the highest bundle revision is selected but it seems that the lowest singleton bundle revision is selected. Given the following bundles: // Bundle-SymbolicName: exporter; singleton:=true // Bundle-Version: 1.0.0 // Export-Package: a // Bundle-SymbolicName: exporter; singleton:=true // Bundle-Version: 2.0.0 // Export-Package: b // Bundle-SymbolicName: importer // Bundle-Version: 1.0.0 // Import-Package: a // Bundle-SymbolicName: importer // Bundle-Version: 2.0.0 // Import-Package: b When bundle importer-2.0.0 is started, a bundle exception is thrown (missing requirement), although the required package is provided by the highest singleton bundle revision (exporter-2.0.0). When bundle importer-1.0.0 is started,it resolves, although the required package is provided by the lowest singleton bundle revision (exporter-1.0.0). This is the output from the console that shows the above: g! lb START LEVEL 1 ID|State |Level|Name 0|Active | 0|System Bundle (4.2.1) 1|Active | 1|Apache Felix Bundle Repository (1.6.6) 2|Active | 1|Apache Felix Gogo Command (0.12.0) 3|Active | 1|Apache Felix Gogo Runtime (0.10.0) 4|Active | 1|Apache Felix Gogo Shell (0.10.0) 5|Installed | 1|importer (1.0.0) 6|Installed | 1|importer (2.0.0) 7|Installed | 1|exporter (1.0.0) 8|Installed | 1|exporter (2.0.0) g! start 6 org.osgi.framework.BundleException: Unresolved constraint in bundle importer [6]: Unable to resolve 6.0: missing requirement [6.0] osgi.wiring.package; (osgi.wiring.package=b) g! start 5 g! lb START LEVEL 1 ID|State |Level|Name 0|Active | 0|System Bundle (4.2.1) 1|Active | 1|Apache Felix Bundle Repository (1.6.6) 2|Active | 1|Apache Felix Gogo Command (0.12.0) 3|Active | 1|Apache Felix Gogo Runtime (0.10.0) 4|Active | 1|Apache Felix Gogo Shell (0.10.0) 5|Active | 1|importer (1.0.0) 6|Installed | 1|importer (2.0.0) 7|Resolved | 1|exporter (1.0.0) 8|Installed | 1|exporter (2.0.0) I am not sure about the desired behavior, but there is a discrepancy between the code and the comment. If the comment describes the wanted behavior it can be achieved by replacing {{(selected.getVersion().compareTo(singleton.getVersion()) > 0}}[2] with {{(singleton.getVersion().compareTo(selected.getVersion()) > 0}}, or with {{(selected.getVersion().compareTo(singleton.getVersion()) < 0}} [1] http://svn.apache.org/viewvc/felix/releases/org.apache.felix.framework-4.2.1/src/main/java/org/apache/felix/framework/StatefulResolver.java?view=markup#l1361 [2] http://svn.apache.org/viewvc/felix/releases/org.apache.felix.framework-4.2.1/src/main/java/org/apache/felix/framework/StatefulResolver.java?view=markup#l1385 was: The comment of the method {{private void selectSingleton(ResolverHookRecord record, List<BundleRevision> singletons)}} of the {{StatefulResolver}} [[1]|http://svn.apache.org/viewvc/felix/releases/org.apache.felix.framework-4.2.1/src/main/java/org/apache/felix/framework/StatefulResolver.java?view=markup#l1361] explains that the highest bundle revision is selected but it seems that the lowest singleton bundle revision is selected. Given the following bundles: // Bundle-SymbolicName: exporter; singleton:=true // Bundle-Version: 1.0.0 // Export-Package: a // Bundle-SymbolicName: exporter; singleton:=true // Bundle-Version: 2.0.0 // Export-Package: b // Bundle-SymbolicName: importer // Bundle-Version: 1.0.0 // Import-Package: a // Bundle-SymbolicName: importer // Bundle-Version: 2.0.0 // Import-Package: b When bundle importer-2.0.0 is started, a bundle exception is thrown (missing requirement), although the required package is provided by the highest singleton bundle revision (exporter-2.0.0). When bundle importer-1.0.0 is started,it resolves, although the required package is provided by the lowest singleton bundle revision (exporter-1.0.0). This is the output from the console that shows the above: g! lb START LEVEL 1 ID|State |Level|Name 0|Active | 0|System Bundle (4.2.1) 1|Active | 1|Apache Felix Bundle Repository (1.6.6) 2|Active | 1|Apache Felix Gogo Command (0.12.0) 3|Active | 1|Apache Felix Gogo Runtime (0.10.0) 4|Active | 1|Apache Felix Gogo Shell (0.10.0) 5|Installed | 1|importer (1.0.0) 6|Installed | 1|importer (2.0.0) 7|Installed | 1|exporter (1.0.0) 8|Installed | 1|exporter (2.0.0) g! start 6 org.osgi.framework.BundleException: Unresolved constraint in bundle importer [6]: Unable to resolve 6.0: missing requirement [6.0] osgi.wiring.package; (osgi.wiring.package=b) g! start 5 g! lb START LEVEL 1 ID|State |Level|Name 0|Active | 0|System Bundle (4.2.1) 1|Active | 1|Apache Felix Bundle Repository (1.6.6) 2|Active | 1|Apache Felix Gogo Command (0.12.0) 3|Active | 1|Apache Felix Gogo Runtime (0.10.0) 4|Active | 1|Apache Felix Gogo Shell (0.10.0) 5|Active | 1|importer (1.0.0) 6|Installed | 1|importer (2.0.0) 7|Resolved | 1|exporter (1.0.0) 8|Installed | 1|exporter (2.0.0) I am not sure about the desired behavior, but there is a discrepancy between the code and the comment. If the comment describes the wanted behavior it can be achieved by replacing {{(selected.getVersion().compareTo(singleton.getVersion()) > 0}} [[2]|http://svn.apache.org/viewvc/felix/releases/org.apache.felix.framework-4.2.1/src/main/java/org/apache/felix/framework/StatefulResolver.java?view=markup#l1385] with {{(singleton.getVersion().compareTo(selected.getVersion()) > 0}}, or with {{(selected.getVersion().compareTo(singleton.getVersion()) < 0}} [1] [http://svn.apache.org/viewvc/felix/releases/org.apache.felix.framework-4.2.1/src/main/java/org/apache/felix/framework/StatefulResolver.java?view=markup#l1361] [2] [http://svn.apache.org/viewvc/felix/releases/org.apache.felix.framework-4.2.1/src/main/java/org/apache/felix/framework/StatefulResolver.java?view=markup#l1385] > Lowest singleton bundle revision selected > ----------------------------------------- > > Key: FELIX-4337 > URL: https://issues.apache.org/jira/browse/FELIX-4337 > Project: Felix > Issue Type: Bug > Components: Framework > Affects Versions: framework-4.2.1 > Environment: n/a > Reporter: Davy Meers > Priority: Minor > Labels: framework, resolver, singleton > > The comment of the method {{private void selectSingleton(ResolverHookRecord > record, List<BundleRevision> singletons)}} of the {{StatefulResolver}}[1] > explains that the highest bundle revision is selected but it seems that the > lowest singleton bundle revision is selected. > Given the following bundles: > // Bundle-SymbolicName: exporter; singleton:=true > // Bundle-Version: 1.0.0 > // Export-Package: a > // Bundle-SymbolicName: exporter; singleton:=true > // Bundle-Version: 2.0.0 > // Export-Package: b > // Bundle-SymbolicName: importer > // Bundle-Version: 1.0.0 > // Import-Package: a > // Bundle-SymbolicName: importer > // Bundle-Version: 2.0.0 > // Import-Package: b > When bundle importer-2.0.0 is started, a bundle exception is thrown (missing > requirement), although the required package is provided by the highest > singleton bundle revision (exporter-2.0.0). > When bundle importer-1.0.0 is started,it resolves, although the required > package is provided by the lowest singleton bundle revision (exporter-1.0.0). > This is the output from the console that shows the above: > g! lb > START LEVEL 1 > ID|State |Level|Name > 0|Active | 0|System Bundle (4.2.1) > 1|Active | 1|Apache Felix Bundle Repository (1.6.6) > 2|Active | 1|Apache Felix Gogo Command (0.12.0) > 3|Active | 1|Apache Felix Gogo Runtime (0.10.0) > 4|Active | 1|Apache Felix Gogo Shell (0.10.0) > 5|Installed | 1|importer (1.0.0) > 6|Installed | 1|importer (2.0.0) > 7|Installed | 1|exporter (1.0.0) > 8|Installed | 1|exporter (2.0.0) > g! start 6 > org.osgi.framework.BundleException: Unresolved constraint in bundle importer > [6]: Unable to resolve 6.0: missing requirement [6.0] osgi.wiring.package; > (osgi.wiring.package=b) > g! start 5 > g! lb > START LEVEL 1 > ID|State |Level|Name > 0|Active | 0|System Bundle (4.2.1) > 1|Active | 1|Apache Felix Bundle Repository (1.6.6) > 2|Active | 1|Apache Felix Gogo Command (0.12.0) > 3|Active | 1|Apache Felix Gogo Runtime (0.10.0) > 4|Active | 1|Apache Felix Gogo Shell (0.10.0) > 5|Active | 1|importer (1.0.0) > 6|Installed | 1|importer (2.0.0) > 7|Resolved | 1|exporter (1.0.0) > 8|Installed | 1|exporter (2.0.0) > I am not sure about the desired behavior, but there is a discrepancy between > the code and the comment. > If the comment describes the wanted behavior it can be achieved by replacing > {{(selected.getVersion().compareTo(singleton.getVersion()) > 0}}[2] with > {{(singleton.getVersion().compareTo(selected.getVersion()) > 0}}, or with > {{(selected.getVersion().compareTo(singleton.getVersion()) < 0}} > [1] > http://svn.apache.org/viewvc/felix/releases/org.apache.felix.framework-4.2.1/src/main/java/org/apache/felix/framework/StatefulResolver.java?view=markup#l1361 > [2] > http://svn.apache.org/viewvc/felix/releases/org.apache.felix.framework-4.2.1/src/main/java/org/apache/felix/framework/StatefulResolver.java?view=markup#l1385 -- This message was sent by Atlassian JIRA (v6.1#6144)