You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2017/09/19 08:59:17 UTC

karaf git commit: [KARAF-5371] Race condition between FeatureService and Fileinstall

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 <gn...@gmail.com>
Authored: Mon Sep 18 09:28:49 2017 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
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);
     }