You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@karaf.apache.org by "Grzegorz Grzybek (Jira)" <ji...@apache.org> on 2023/02/20 11:19:00 UTC
[jira] [Comment Edited] (KARAF-6501) Restoring the wiring of fragment bundles with multiple hosts
[ https://issues.apache.org/jira/browse/KARAF-6501?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17691138#comment-17691138 ]
Grzegorz Grzybek edited comment on KARAF-6501 at 2/20/23 11:18 AM:
-------------------------------------------------------------------
[~jbonofre] [~nantunes] I have a problem here...
I have a bundle (pax-web-tomcat) and a fragment (pax-web-tomcat-keycloak18 - work in progress) which adds new {{Import-Package}} headers to pax-web-tomcat.
However even if the host+fragment is fine after installation, the host-fragment relation is gone after restart.
The fragment's requirement being resolved is:
{noformat}
requirement = {org.apache.felix.framework.wiring.BundleRequirementImpl@4233} "[org.ops4j.pax.web.pax-web-tomcat-keycloak18 [97](R 97.0)] osgi.wiring.package; (osgi.wiring.package=javax.security.cert)"
m_attrs: java.util.Map = {java.util.Collections$UnmodifiableMap@4891} size = 0
m_dirs: java.util.Map = {java.util.Collections$UnmodifiableMap@4897} size = 1
m_filter: org.apache.felix.framework.capabilityset.SimpleFilter = {org.apache.felix.framework.capabilityset.SimpleFilter@4256} "(osgi.wiring.package=javax.security.cert)"
m_namespace: java.lang.String = {@4890} "osgi.wiring.package"
m_optional: boolean = false
m_revision: org.osgi.framework.wiring.BundleRevision = {org.apache.felix.framework.BundleRevisionImpl@4189} "org.ops4j.pax.web.pax-web-tomcat-keycloak18 [97](R 97.0)"
{noformat}
The selected candidate in {{org.apache.karaf.features.extension.BundleWires#filterCandidates()}} is fine:
{noformat}
candidates = {org.apache.felix.framework.util.ShrinkableCollection@4294} size = 1
0 = {org.apache.felix.framework.wiring.BundleCapabilityImpl@4262} "[org.apache.felix.framework [0](R 0)] osgi.wiring.package; {bundle-symbolic-name=[Ljava.lang.String;@767e20cf, bundle-version=7.0.5, version=0.0.0, osgi.wiring.package=javax.security.cert}"
m_attrs: java.util.Map = {java.util.Collections$UnmodifiableMap@4892} size = 4
m_dirs: java.util.Map = {java.util.Collections$UnmodifiableMap@4891} size = 0
m_mandatory: java.util.Set = {java.util.Collections$EmptySet@4882} size = 0
m_namespace: java.lang.String = {@4890} "osgi.wiring.package"
m_revision: org.osgi.framework.wiring.BundleRevision = {org.apache.felix.framework.ExtensionManager$ExtensionManagerRevision@1496} "org.apache.felix.framework [0](R 0)"
m_uses: java.util.List = {java.util.Collections$EmptyList@4893} size = 0
{noformat}
However, the candidate is flitered out because {{org.apache.karaf.features.extension.BundleWires#wiring}} doesn't contain a requirement ID {{osgi.wiring.package; (osgi.wiring.package=javax.security.cert)}}...
After refreshing pax-web-tomcat bundle the fragment is attached and this (among others) information is added to {{$KARAF_HOME/data/cache/bundle0/wiring/135}}:
{noformat}
osgi.wiring.package; (osgi.wiring.package=javax.security.cert)
0; version=0.0.0
{noformat}
was (Author: gzres):
[~jbonofre] [~nantunes] I have a problem here...
I have a bundle (pax-web-tomcat) and a fragment (pax-web-tomcat-keycloak18 - work in progress) which adds new {{Import-Package}} headers to pax-web-tomcat.
However even if the host+fragment is fine after installation, the host-fragment relation is gone after restart.
The fragment's requirement being resolved is:
{noformat}
requirement = {org.apache.felix.framework.wiring.BundleRequirementImpl@4233} "[org.ops4j.pax.web.pax-web-tomcat-keycloak18 [97](R 97.0)] osgi.wiring.package; (osgi.wiring.package=javax.security.cert)"
m_attrs: java.util.Map = {java.util.Collections$UnmodifiableMap@4891} size = 0
m_dirs: java.util.Map = {java.util.Collections$UnmodifiableMap@4897} size = 1
m_filter: org.apache.felix.framework.capabilityset.SimpleFilter = {org.apache.felix.framework.capabilityset.SimpleFilter@4256} "(osgi.wiring.package=javax.security.cert)"
m_namespace: java.lang.String = {@4890} "osgi.wiring.package"
m_optional: boolean = false
m_revision: org.osgi.framework.wiring.BundleRevision = {org.apache.felix.framework.BundleRevisionImpl@4189} "org.ops4j.pax.web.pax-web-tomcat-keycloak18 [97](R 97.0)"
{noformat}
The selected candidate in {{org.apache.karaf.features.extension.BundleWires#filterCandidates()}} is fine:
{noformat}
candidates = {org.apache.felix.framework.util.ShrinkableCollection@4294} size = 1
0 = {org.apache.felix.framework.wiring.BundleCapabilityImpl@4262} "[org.apache.felix.framework [0](R 0)] osgi.wiring.package; {bundle-symbolic-name=[Ljava.lang.String;@767e20cf, bundle-version=7.0.5, version=0.0.0, osgi.wiring.package=javax.security.cert}"
m_attrs: java.util.Map = {java.util.Collections$UnmodifiableMap@4892} size = 4
m_dirs: java.util.Map = {java.util.Collections$UnmodifiableMap@4891} size = 0
m_mandatory: java.util.Set = {java.util.Collections$EmptySet@4882} size = 0
m_namespace: java.lang.String = {@4890} "osgi.wiring.package"
m_revision: org.osgi.framework.wiring.BundleRevision = {org.apache.felix.framework.ExtensionManager$ExtensionManagerRevision@1496} "org.apache.felix.framework [0](R 0)"
m_uses: java.util.List = {java.util.Collections$EmptyList@4893} size = 0
{noformat}
However, the candidate is flitered out because {{org.apache.karaf.features.extension.BundleWires#wiring}} doesn't contain a requirement ID {{osgi.wiring.package; (osgi.wiring.package=javax.security.cert)}...
> Restoring the wiring of fragment bundles with multiple hosts
> ------------------------------------------------------------
>
> Key: KARAF-6501
> URL: https://issues.apache.org/jira/browse/KARAF-6501
> Project: Karaf
> Issue Type: Bug
> Components: karaf
> Affects Versions: 4.3.0, 4.2.7
> Reporter: Nelson Antunes
> Assignee: Jean-Baptiste Onofré
> Priority: Major
> Fix For: 4.3.0, 4.2.8
>
> Attachments: example-1.0-SNAPSHOT.kar
>
>
> The {{StoredWiringResolver}}'s bundle wiring cache assumes each requirement is only wired to a single capability. This isn't true for {{osgi.wiring.host}} requirements as fragments can attach to multiple hosts.
> It is storing only the last wiring it comes across, resulting in the loss of the other wirings when booting with hot caches.
> Steps to reproduce:
> *1. Start a clean karaf*
> {noformat}
> $ bin/karaf
> __ __ ____
> / //_/____ __________ _/ __/
> / ,< / __ `/ ___/ __ `/ /_
> / /| |/ /_/ / / / /_/ / __/
> /_/ |_|\__,_/_/ \__,_/_/
> Apache Karaf (4.2.7)
> Hit '<tab>' for a list of available commands
> and '[cmd] --help' for help on a specific command.
> Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown Karaf.
> karaf@root()> list
> START LEVEL 100 , List Threshold: 50
> ID │ State │ Lvl │ Version │ Name
> 22 │ Active │ 80 │ 4.2.7 │ Apache Karaf :: OSGi Services :: Event
> {noformat}
> *2. Install a fragment bundle and install and start two or more bundles that satisfies the fragment's Fragment-Host requirement*
> You can use the attached {{example-1.0-SNAPSHOT.kar}} file. Put it in the {{deploy}} folder and it will install a fragment bundle and three hosts:
> {noformat}
> Starting the host 2
> Starting the host 1
> Starting the host 3
> {noformat}
> *3. Check that the bundles are correctly installed and the fragment is attached to all three hosts*
> {noformat}
> karaf@root()> list
> START LEVEL 100 , List Threshold: 50
> ID │ State │ Lvl │ Version │ Name
> 22 │ Active │ 80 │ 4.2.7 │ Apache Karaf :: OSGi Services :: Event
> 44 │ Resolved │ 80 │ 1.0.0.SNAPSHOT │ fragment Bundle, Hosts: 47, 46, 45
> 45 │ Active │ 80 │ 1.0.0 │ host1 Bundle, Fragments: 44
> 46 │ Active │ 80 │ 1.5.0 │ host2 Bundle, Fragments: 44
> 47 │ Active │ 80 │ 2.0.0 │ host3 Bundle, Fragments: 44
> {noformat}
> *4. However, notice that the wiring cache of the fragment bundle (44) isn't right*
> {noformat}
> $ cat data/cache/bundle0/wiring/44
> osgi.ee; (&(osgi.ee=JavaSE)(version=1.8))
> 0; version=[1.0.0, 1.1.0, 1.2.0, 1.3.0, 1.4.0, 1.5.0, 1.6.0, 1.7.0, 1.8.0]
> osgi.wiring.host; (&(osgi.wiring.host=our-host)(bundle-version>=0.0.0))
> 45
> {noformat}
> *5. Stop karaf*
> {noformat}
> karaf@root()> ^D
> Stopping the host 3
> Stopping the host 2
> Stopping the host 1
> {noformat}
> *6. Start karaf with hot caches*
> {noformat}
> $ bin/karaf
> org.ops4j.pax.url.wrap [org.ops4j.pax.url.commons.handler.HandlerActivator] DEBUG : Handler for protocols [wrap] started
> __ __ ____
> / //_/____ __________ _/ __/
> / ,< / __ `/ ___/ __ `/ /_
> / /| |/ /_/ / / / /_/ / __/
> /_/ |_|\__,_/_/ \__,_/_/
> Apache Karaf (4.2.7)
> Hit '<tab>' for a list of available commands
> and '[cmd] --help' for help on a specific command.
> Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown Karaf.
> Starting the host 1
> Starting the host 2
> Starting the host 3
> {noformat}
> *7. Check that the fragment is no longer correctly attached to all three hosts, but just to one*
> {noformat}
> karaf@root()> list
> START LEVEL 100 , List Threshold: 50
> ID │ State │ Lvl │ Version │ Name
> 22 │ Active │ 80 │ 4.2.7 │ Apache Karaf :: OSGi Services :: Event
> 44 │ Resolved │ 80 │ 1.0.0.SNAPSHOT │ fragment Bundle, Hosts: 45
> 45 │ Active │ 80 │ 1.0.0 │ host1 Bundle, Fragments: 44
> 46 │ Active │ 80 │ 1.5.0 │ host2 Bundle
> 47 │ Active │ 80 │ 2.0.0 │ host3 Bundle
> {noformat}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)