Repository: karaf Updated Branches: refs/heads/karaf-4.1.x 15c578e88 -> 16bdd6446
[KARAF-5371] Race condition between FeatureService and Fileinstall # Conflicts: # features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java # features/core/src/main/java/org/apache/karaf/features/internal/region/DigraphHelper.java # features/core/src/main/java/org/apache/karaf/features/internal/service/BundleInstallSupportImpl.java Project: http://git-wip-us.apache.org/repos/asf/karaf/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/16bdd644 Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/16bdd644 Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/16bdd644 Branch: refs/heads/karaf-4.1.x Commit: 16bdd6446e5ebde92781a38e8a859aa33785fd2f Parents: 15c578e Author: Guillaume Nodet <[email protected]> Authored: Mon Sep 18 09:28:49 2017 +0200 Committer: Guillaume Nodet <[email protected]> Committed: Tue Sep 19 10:51:54 2017 +0200 ---------------------------------------------------------------------- .../karaf/features/internal/osgi/Activator.java | 1 + .../features/internal/region/DigraphHelper.java | 47 +++++++++++--------- .../internal/service/FeaturesServiceImpl.java | 3 ++ 3 files changed, 29 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf/blob/16bdd644/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 de439d4..e591c12 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 @@ -135,6 +135,7 @@ public class Activator extends BaseActivator { register(org.osgi.framework.hooks.service.EventHook.class, dg.getServiceEventHook()); register(RegionDigraph.class, dg); register(RegionDigraphPersistence.class, this::doPersistRegionDigraph); + DigraphHelper.verifyUnmanagedBundles(bundleContext, dg); if (getBoolean("digraphMBean", FeaturesService.DEFAULT_DIGRAPH_MBEAN)) { StandardManageableRegionDigraph dgmb = digraphMBean = new StandardManageableRegionDigraph(dg, "org.apache.karaf", bundleContext); http://git-wip-us.apache.org/repos/asf/karaf/blob/16bdd644/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 71c77e2..a24649f 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 @@ -70,28 +70,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; } @@ -157,4 +135,29 @@ public final class DigraphHelper { JsonWriter.write(out, json); } + 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/16bdd644/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java ---------------------------------------------------------------------- diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java index 507f2aa..39a31d4 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java @@ -1458,6 +1458,9 @@ public class FeaturesServiceImpl implements FeaturesService, Deployer.DeployCall 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); }
