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:15:00 UTC

[jira] [Commented] (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 commented on KARAF-6501:
-----------------------------------------

[~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)