[ 
https://issues.apache.org/jira/browse/KARAF-6501?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17691143#comment-17691143
 ] 

Grzegorz Grzybek commented on KARAF-6501:
-----------------------------------------

The problem is that when Karaf restarts again ({{main}} thread):
{noformat}
"main@1" prio=5 tid=0x1 nid=NA runnable
  java.lang.Thread.State: RUNNABLE
          at 
org.apache.karaf.features.extension.StoredWiringResolver.filterMatches(StoredWiringResolver.java:89)
          at 
org.apache.felix.framework.util.SecureAction.invokeResolverHookMatches(SecureAction.java:1630)
          at 
org.apache.felix.framework.StatefulResolver.findProvidersInternal(StatefulResolver.java:339)
          - locked <0x60e> (a org.apache.felix.framework.StatefulResolver)
          at 
org.apache.felix.framework.ResolveContextImpl.findProviders(ResolveContextImpl.java:114)
          at org.apache.felix.resolver.Candidates.populate(Candidates.java:208)
          at 
org.apache.felix.resolver.ResolverImpl.getInitialCandidates(ResolverImpl.java:542)
          at 
org.apache.felix.resolver.ResolverImpl.doResolve(ResolverImpl.java:431)
          at 
org.apache.felix.resolver.ResolverImpl.resolve(ResolverImpl.java:420)
          at 
org.apache.felix.resolver.ResolverImpl.resolve(ResolverImpl.java:374)
          at 
org.apache.felix.framework.StatefulResolver.resolve(StatefulResolver.java:488)
          at org.apache.felix.framework.Felix.resolveBundles(Felix.java:4357)
          at 
org.apache.felix.framework.FrameworkWiringImpl.resolveBundles(FrameworkWiringImpl.java:130)
          at 
org.apache.karaf.features.extension.Activator.resolveAll(Activator.java:62)
          at 
org.apache.karaf.features.extension.Activator.bundleChanged(Activator.java:49)
          at 
org.apache.felix.framework.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:915)
          at 
org.apache.felix.framework.EventDispatcher.fireEventImmediately(EventDispatcher.java:834)
          at 
org.apache.felix.framework.EventDispatcher.fireBundleEvent(EventDispatcher.java:516)
          at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4847)
          at org.apache.felix.framework.Felix.start(Felix.java:1143)
          at org.apache.karaf.main.Main.launch(Main.java:297)
          at org.apache.karaf.main.Main.main(Main.java:183)
{noformat}

there's an attempt to process this requirement:
{noformat}
requirement = {org.apache.felix.framework.wiring.BundleRequirementImpl@4712} 
"[org.ops4j.pax.web.pax-web-tomcat-keycloak18 [97](R 97.0)] 
osgi.wiring.package; 
(&(osgi.wiring.package=org.keycloak.adapters.tomcat)(version>=18.0.0)(!(version>=19.0.0)))"
 m_attrs: java.util.Map  = {java.util.Collections$UnmodifiableMap@4733}  size = 0
 m_dirs: java.util.Map  = {java.util.Collections$UnmodifiableMap@4732}  size = 1
 m_filter: org.apache.felix.framework.capabilityset.SimpleFilter  = 
{org.apache.felix.framework.capabilityset.SimpleFilter@4731} 
"(&(osgi.wiring.package=org.keycloak.adapters.tomcat)(version>=18.0.0)(!(version>=19.0.0)))"
 m_namespace: java.lang.String  = {@4723} "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}

with found capability:
{noformat}
result = {org.apache.felix.framework.util.ShrinkableCollection@4715}  size = 1
 0 = {org.apache.felix.framework.wiring.BundleCapabilityImpl@4721} 
"[org.ops4j.pax.web.pax-web-tomcat-keycloak18 [97](R 97.0)] 
osgi.wiring.package; 
{bundle-symbolic-name=org.ops4j.pax.web.pax-web-tomcat-keycloak18, 
bundle-version=8.0.15, osgi.wiring.package=org.keycloak.adapters.tomcat, 
version=18.0.3}"
  m_attrs: java.util.Map  = {java.util.Collections$UnmodifiableMap@4725}  size 
= 4
  m_dirs: java.util.Map  = {java.util.Collections$UnmodifiableMap@4724}  size = 
1
  m_mandatory: java.util.Set  = {java.util.Collections$EmptySet@4727}  size = 0
  m_namespace: java.lang.String  = {@4723} "osgi.wiring.package"
  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)"
  m_uses: java.util.List  = {java.util.ArrayList@4726}  size = 8
{noformat}

when there's no {{org.apache.karaf.features.extension.BundleWires#wiring}} for 
host bundle for this requirement:
{noformat}
(&(osgi.wiring.package=org.keycloak.adapters.tomcat)(version>=18.0.0)(!(version>=19.0.0)))
{noformat}

This comes from the fragment itself, where the same package is exported and 
imported ({{org.keycloak.adapters.osgi.tomcat}}):
{noformat}
karaf@root()> headers 97

OPS4J Pax Web - Keycloak 18.x support - Tomcat (97)
---------------------------------------------------
Bnd-LastModified = 1676300516142
Build-Jdk-Spec = 1.8
Created-By = Apache Maven Bundle Plugin 5.1.8
Fragment-Host = org.ops4j.pax.web.pax-web-tomcat
Manifest-Version = 1.0
Tool = Bnd-6.3.1.202206071316

Bundle-Description = Pax Web - OPS4J implementation of OSGi HTTP service and 
OSGi HTTP Whiteboard service
Bundle-DocURL = http://www.ops4j.org/
Bundle-License = http://www.apache.org/licenses/LICENSE-2.0.html
Bundle-ManifestVersion = 2
Bundle-Name = OPS4J Pax Web - Keycloak 18.x support - Tomcat
Bundle-SymbolicName = org.ops4j.pax.web.pax-web-tomcat-keycloak18
Bundle-Vendor = OPS4J - Open Participation Software for Java
Bundle-Version = 8.0.15

Require-Capability = 
        osgi.ee;filter:=(&(osgi.ee=JavaSE)(version=1.8))

Export-Package = 
        org.keycloak.adapters.osgi.tomcat;version=18.0.3,
        
org.keycloak.adapters.tomcat;uses:="javax.security.auth,javax.security.cert,javax.servlet,javax.servlet.http,org.keycloak,org.keycloak.adapters,org.keycloak.adapters.spi,org.keycloak.common.util";version=18.0.3
Import-Package = 
        javax.security.auth,
        javax.security.auth.login,
        javax.security.cert,
        javax.servlet,
        javax.servlet.http,
        org.apache.tomcat.util.descriptor.web,
        org.jboss.logging;version="[3.4,4)",
        org.keycloak;version="[18.0,19)",
        org.keycloak.adapters;version="[18.0,19)",
        org.keycloak.adapters.spi;version="[18.0,19)",
        org.keycloak.adapters.tomcat;version="[18.0,19)",
        org.keycloak.common.util;version="[18.0,19)",
        org.keycloak.enums;version="[18.0,19)",
        org.keycloak.representations;version="[18.0,19)"
{noformat}

Finally, because the fragment was rejected, the wiring information is stored 
back without the fragment-added headers.

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

Reply via email to