Repository: karaf Updated Branches: refs/heads/master f78f18142 -> 675bd8fc5
[KARAF-5371] Race condition between FeatureService and Fileinstall Project: http://git-wip-us.apache.org/repos/asf/karaf/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/65bd1fc0 Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/65bd1fc0 Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/65bd1fc0 Branch: refs/heads/master Commit: 65bd1fc0f9c1b3b43e5dc7461092a954af0e7cd8 Parents: f78f181 Author: Guillaume Nodet <[email protected]> Authored: Mon Sep 18 09:28:49 2017 +0200 Committer: Jean-Baptiste Onofré <[email protected]> Committed: Tue Sep 19 09:13:17 2017 +0200 ---------------------------------------------------------------------- .../karaf/features/internal/osgi/Activator.java | 7 ++- .../features/internal/region/DigraphHelper.java | 47 +++++++++++--------- .../service/BundleInstallSupportImpl.java | 3 ++ 3 files changed, 33 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf/blob/65bd1fc0/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java ---------------------------------------------------------------------- diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java index 876ec8e..2bfbb62 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java @@ -58,6 +58,7 @@ import org.eclipse.equinox.internal.region.StandardRegionDigraph; import org.eclipse.equinox.internal.region.management.StandardManageableRegionDigraph; import org.eclipse.equinox.region.RegionDigraph; import org.osgi.framework.BundleContext; +import org.osgi.framework.BundleException; import org.osgi.framework.ServiceReference; import org.osgi.framework.hooks.bundle.CollisionHook; import org.osgi.framework.hooks.resolver.ResolverHookFactory; @@ -132,7 +133,7 @@ public class Activator extends BaseActivator { StandardRegionDigraph dg = DigraphHelper.loadDigraph(bundleContext); registerRegionDiGraph(dg); boolean configCfgStore = getBoolean("configCfgStore", FeaturesService.DEFAULT_CONFIG_CFG_STORE); - FeatureConfigInstaller configInstaller = configurationAdmin != null ? new FeatureConfigInstaller(configurationAdmin, configCfgStore) : null; + FeatureConfigInstaller configInstaller = new FeatureConfigInstaller(configurationAdmin, configCfgStore); installSupport = new BundleInstallSupportImpl( bundleContext.getBundle(), bundleContext, @@ -247,7 +248,7 @@ public class Activator extends BaseActivator { } @SuppressWarnings("deprecation") - private void registerRegionDiGraph(StandardRegionDigraph dg) { + private void registerRegionDiGraph(StandardRegionDigraph dg) throws BundleException { register(ResolverHookFactory.class, dg.getResolverHookFactory()); register(CollisionHook.class, CollisionHookHelper.getCollisionHook(dg)); register(org.osgi.framework.hooks.bundle.FindHook.class, dg.getBundleFindHook()); @@ -260,6 +261,8 @@ public class Activator extends BaseActivator { StandardManageableRegionDigraph dgmb = digraphMBean = new StandardManageableRegionDigraph(dg, "org.apache.karaf", bundleContext); dgmb.registerMBean(); } + + DigraphHelper.verifyUnmanagedBundles(bundleContext, dg); } private ServiceTracker<FeaturesListener, FeaturesListener> createFeatureListenerTracker() { http://git-wip-us.apache.org/repos/asf/karaf/blob/65bd1fc0/features/core/src/main/java/org/apache/karaf/features/internal/region/DigraphHelper.java ---------------------------------------------------------------------- diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/region/DigraphHelper.java b/features/core/src/main/java/org/apache/karaf/features/internal/region/DigraphHelper.java index 944fe6f..265fb94 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/region/DigraphHelper.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/region/DigraphHelper.java @@ -72,28 +72,6 @@ public final class DigraphHelper { digraph = readDigraph(new DataInputStream(in), bundleContext, threadLocal); } } - // Create default region is missing - Region defaultRegion = digraph.getRegion(FeaturesServiceImpl.ROOT_REGION); - if (defaultRegion == null) { - defaultRegion = digraph.createRegion(FeaturesServiceImpl.ROOT_REGION); - } - // Add all unknown bundle to default region - Set<Long> ids = new HashSet<>(); - for (Bundle bundle : bundleContext.getBundles()) { - long id = bundle.getBundleId(); - ids.add(id); - if (digraph.getRegion(id) == null) { - defaultRegion.addBundle(id); - } - } - // Clean stalled bundles - for (Region region : digraph) { - Set<Long> bundleIds = new HashSet<>(region.getBundleIds()); - bundleIds.removeAll(ids); - for (long id : bundleIds) { - region.removeBundle(id); - } - } return digraph; } @@ -191,4 +169,29 @@ public final class DigraphHelper { } return filtersPerRegion; } + + public static void verifyUnmanagedBundles(BundleContext bundleContext, RegionDigraph dg) throws BundleException { + // Create default region is missing + Region defaultRegion = dg.getRegion(FeaturesServiceImpl.ROOT_REGION); + if (defaultRegion == null) { + defaultRegion = dg.createRegion(FeaturesServiceImpl.ROOT_REGION); + } + // Add all unknown bundle to default region + Set<Long> ids = new HashSet<>(); + for (Bundle bundle : bundleContext.getBundles()) { + long id = bundle.getBundleId(); + ids.add(id); + if (dg.getRegion(id) == null) { + defaultRegion.addBundle(id); + } + } + // Clean stalled bundles + for (Region region : dg) { + Set<Long> bundleIds = new HashSet<>(region.getBundleIds()); + bundleIds.removeAll(ids); + for (long id : bundleIds) { + region.removeBundle(id); + } + } + } } http://git-wip-us.apache.org/repos/asf/karaf/blob/65bd1fc0/features/core/src/main/java/org/apache/karaf/features/internal/service/BundleInstallSupportImpl.java ---------------------------------------------------------------------- diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/BundleInstallSupportImpl.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/BundleInstallSupportImpl.java index e4cfa62..4463465 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/service/BundleInstallSupportImpl.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/BundleInstallSupportImpl.java @@ -247,6 +247,9 @@ public class BundleInstallSupportImpl implements BundleInstallSupport { region1.connectRegion(region2, rfb.build()); } } + // Verify that no other bundles have been installed externally in the mean time + DigraphHelper.verifyUnmanagedBundles(systemBundleContext, temp); + // Do replace digraph.replace(temp); }
