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