You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@karaf.apache.org by "Jean-Baptiste Onofré (JIRA)" <ji...@apache.org> on 2015/08/20 10:03:46 UTC

[jira] [Updated] (KARAF-3933) Features with shared bundles have an install/uninstall issue

     [ https://issues.apache.org/jira/browse/KARAF-3933?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jean-Baptiste Onofré updated KARAF-3933:
----------------------------------------
    Fix Version/s: 3.0.5

> Features with shared bundles have an install/uninstall issue
> ------------------------------------------------------------
>
>                 Key: KARAF-3933
>                 URL: https://issues.apache.org/jira/browse/KARAF-3933
>             Project: Karaf
>          Issue Type: Bug
>          Components: karaf-feature
>    Affects Versions: 3.0.4
>            Reporter: Frank Diebolt
>            Assignee: Jean-Baptiste Onofré
>             Fix For: 3.0.5
>
>   Original Estimate: 0.25h
>  Remaining Estimate: 0.25h
>
> Hi,
> When we use the following features file:
> {noformat}
> <?xml version="1.0" encoding="UTF-8"?>
> <features name="dummy-1.0.0" xmlns="http://karaf.apache.org/xmlns/features/v1.0.0">    
>     <feature name="framework" description="my framework" version="1.0.0" resolver="(obr)">
>         <bundle start-level="60">mvn:com.google.guava/guava/13.0.1</bundle>
>     </feature>    
>     <feature name="app" description="my app" version="1.0.1" resolver="(obr)">
>         <feature version="1.0.0">framework</feature>
>         <bundle start-level="60">mvn:com.google.guava/guava/13.0.1</bundle>
>     </feature>
> </features>
> {noformat}
> first install the "framework" feature, the "guava" bundle is deployed.
> If Karaf is restarted and the "app" feature is deployed, the "guava" is associated to the "app" feature and no longer to the "framework" feature.
> The features persistence at "data/cache/bundle20/data/FeaturesServiceState.properties" contains:
> {noformat}
> features.framework_split_for_name_and_version_1.0.0=
> features.app_split_for_name_and_version_1.0.0=64
> {noformat}
> and should be (since the guava is required by both features):
> {noformat}
> features.framework_split_for_name_and_version_1.0.0=64
> features.app_split_for_name_and_version_1.0.0=64
> {noformat}
> If the "app" feature is now uninstalled, the "guava" bundle is REMOVED! and the remaining "framework" feature is broken.
> FIX proposal:
> It seems the issue is located in "features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java" 
> The following patch doesn't recurse on already installed features, doesn't break internal states of those features and avoids the issue:
> {noformat}
> diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java b/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
> index 0c7982b..127b2eb 100644
> --- a/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
> +++ b/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
> @@ -555,6 +555,14 @@ public class FeaturesServiceImpl implements FeaturesService {
>  
>      protected void doInstallFeature(InstallationState state, Feature feature, boolean verbose) throws Exception {
>          if (feature != null) {
> +            if (isInstalled(feature)) {
> +                String msg = "Found installed feature " + feature.getName() + " " + feature.getVersion();
> +                LOGGER.info(msg);
> +                if (verbose) {
> +                    System.out.println(msg);
> +                }
> +                return;
> +            }
>              String msg = "Installing feature " + feature.getName() + " " + feature.getVersion();
>              LOGGER.info(msg);
>              if (verbose) {
> @@ -576,7 +584,7 @@ public class FeaturesServiceImpl implements FeaturesService {
>                  if (result.isNew) {
>                      state.installed.add(result.bundle);
>                  }
> -                String msg2 = (result.isNew) ? "Found installed bundle: " + result.bundle : "Installing bundle " + bInfo.getLocation();
> +                String msg2 = (!result.isNew) ? "Found installed bundle: " + result.bundle : "Installing bundle " + bInfo.getLocation();
>                  LOGGER.debug(msg2);
>                  if (verbose) {
>                      System.out.println(msg2);
> diff --git a/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java b/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
> index b86565f..d23849e 100644
> --- a/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
> +++ b/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
> @@ -340,8 +340,7 @@ public class FeaturesServiceTest extends TestBase {
>          expect(bundleManager.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
>          expect(bundleManager.getBundleContext()).andReturn(null);
>          expect(bundleManager.installBundleIfNeeded(bundleVer01Uri, 0, null)).andReturn(new BundleInstallerResult(bundleVer01, true));
> -        expect(bundleManager.installBundleIfNeeded(bundleVer01Uri, 0, null)).andReturn(new BundleInstallerResult(bundleVer01, false));
> -        expect(bundleManager.isBundleInstalled("bundle-0.1")).andReturn(bundleVer01).times(2);
> +        expect(bundleManager.isBundleInstalled("bundle-0.1")).andReturn(bundleVer01);
>          expect(bundleManager.getBundleContext()).andReturn(bundleContext);
>          ignoreRefreshes(bundleManager);
>          bundleManager.uninstall(Collections.EMPTY_LIST, true);
> {noformat}
> Michel, Fred & Frank



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)