You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2016/09/21 13:29:24 UTC

[02/21] ambari git commit: AMBARI-18416. Optimize stack manager initialization for Ambari Server Unit Tests (aonishuk)

AMBARI-18416. Optimize stack manager initialization for Ambari Server Unit Tests (aonishuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/536bf049
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/536bf049
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/536bf049

Branch: refs/heads/branch-dev-patch-upgrade
Commit: 536bf049a52a3433a2a990286d9e5c3d387c3224
Parents: 0c6c141
Author: Andrew Onishuk <ao...@hortonworks.com>
Authored: Mon Sep 19 19:14:25 2016 +0300
Committer: Andrew Onishuk <ao...@hortonworks.com>
Committed: Mon Sep 19 19:14:25 2016 +0300

----------------------------------------------------------------------
 .../ambari/server/stack/StackManager.java       |  17 +-
 .../server/api/services/AmbariMetaInfoTest.java |  41 +++--
 .../AmbariManagementControllerTest.java         |   4 +
 ...ClusterStackVersionResourceProviderTest.java |   1 +
 .../server/orm/InMemoryDefaultTestModule.java   |  14 +-
 .../ambari/server/stack/StackManagerMock.java   | 166 +++++++++++++++++++
 .../ambari/server/state/UpgradeHelperTest.java  |  26 +++
 7 files changed, 251 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/536bf049/ambari-server/src/main/java/org/apache/ambari/server/stack/StackManager.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackManager.java b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackManager.java
index 6c0d5e4..0e2e0d8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/stack/StackManager.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/stack/StackManager.java
@@ -99,7 +99,10 @@ public class StackManager {
   /**
    * Map of stack id to stack info
    */
-  private Map<String, StackInfo> stackMap = new HashMap<String, StackInfo>();
+  protected Map<String, StackInfo> stackMap = new HashMap<String, StackInfo>();
+  protected Map<String, ServiceModule> commonServiceModules;
+  protected Map<String, StackModule> stackModules;
+  protected Map<String, ExtensionModule> extensionModules;
 
   /**
    * Map of extension id to extension info
@@ -152,11 +155,7 @@ public class StackManager {
     stackContext = new StackContext(metaInfoDAO, actionMetadata, osFamily);
     extensionMap = new HashMap<String, ExtensionInfo>();
 
-    Map<String, ServiceModule> commonServiceModules = parseCommonServicesDirectory(commonServicesRoot);
-    Map<String, StackModule> stackModules = parseStackDirectory(stackRoot);
-    LOG.info("About to parse extension directories");
-    Map<String, ExtensionModule> extensionModules = null;
-    extensionModules = parseExtensionDirectory(extensionRoot);
+    parseDirectories(stackRoot, commonServicesRoot, extensionRoot);
 
     //Read the extension links from the DB
     for (StackModule module : stackModules.values()) {
@@ -183,6 +182,12 @@ public class StackManager {
     populateDB(stackDao, extensionDao);
   }
 
+  protected void parseDirectories(File stackRoot, File commonServicesRoot, File extensionRoot) throws AmbariException {
+    commonServiceModules = parseCommonServicesDirectory(commonServicesRoot);
+    stackModules = parseStackDirectory(stackRoot);
+    LOG.info("About to parse extension directories");
+    extensionModules = parseExtensionDirectory(extensionRoot);
+  }
   private void populateDB(StackDAO stackDao, ExtensionDAO extensionDao) throws AmbariException {
     // for every stack read in, ensure that we have a database entry for it;
     // don't put try/catch logic around this since a failure here will

http://git-wip-us.apache.org/repos/asf/ambari/blob/536bf049/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java
index 5dfc094..4b7826e 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java
@@ -248,7 +248,7 @@ public class AmbariMetaInfoTest {
     // Scenario: user has no internet and does nothing to repos via api
     // use the default
     String buildDir = tmpFolder.getRoot().getAbsolutePath();
-    AmbariMetaInfo ambariMetaInfo = setupTempAmbariMetaInfo(buildDir);
+    setupTempAmbariMetaInfoDirs(buildDir);
     // The current stack already has (HDP, 2.1.1, redhat6).
 
     // Deleting the json file referenced by the latestBaseUrl to simulate No
@@ -261,7 +261,7 @@ public class AmbariMetaInfoTest {
       FileUtils.deleteQuietly(latestUrlFile);
       assertTrue(!latestUrlFile.exists());
     }
-    ambariMetaInfo.init();
+    AmbariMetaInfo ambariMetaInfo = setupTempAmbariMetaInfoExistingDirs(buildDir);
 
     List<RepositoryInfo> redhat6Repo = ambariMetaInfo.getRepositories(
         STACK_NAME_HDP, "2.1.1", "redhat6");
@@ -643,9 +643,9 @@ public class AmbariMetaInfoTest {
       stackRoot = new File(ClassLoader.getSystemClassLoader().getResource("stacks").getPath());
       version = new File(new File(ClassLoader.getSystemClassLoader().getResource("").getPath()).getParent(), "version");
     }
-    File stackRootTmp = new File(buildDir + "/ambari-metaInfo"); stackRootTmp.mkdir();
+    File stackRootTmp = getStackRootTmp(buildDir);
+    stackRootTmp.mkdir();
     FileUtils.copyDirectory(stackRoot, stackRootTmp);
-    AmbariMetaInfo ambariMetaInfo = createAmbariMetaInfo(stackRootTmp, version);
     //todo
     //ambariMetaInfo.injector = injector;
     File f1, f2, f3;
@@ -656,7 +656,7 @@ public class AmbariMetaInfoTest {
       f3.createNewFile();
     }
 
-    ambariMetaInfo.init();
+    AmbariMetaInfo ambariMetaInfo = createAmbariMetaInfo(stackRootTmp, version);
 
     // Tests the stack is loaded as expected
     getServices();
@@ -2044,21 +2044,42 @@ public class AmbariMetaInfoTest {
     Assert.assertNotNull(descriptor.getService("HDFS"));
   }
 
+  private File getStackRootTmp(String buildDir) {
+    return new File(buildDir + "/ambari-metaInfo");
+  }
 
-  private TestAmbariMetaInfo setupTempAmbariMetaInfo(String buildDir) throws Exception {
-    File stackRootTmp = new File(buildDir + "/ambari-metaInfo");
-    File stackRoot = new File("src/test/resources/stacks");
+  private File getVersion() {
     File version = new File("src/test/resources/version");
 
     if (System.getProperty("os.name").contains("Windows")) {
-      stackRoot = new File(ClassLoader.getSystemClassLoader().getResource("stacks").getPath());
       version = new File(new File(ClassLoader.getSystemClassLoader().getResource("").getPath()).getParent(), "version");
     }
 
+    return version;
+  }
+
+  private void setupTempAmbariMetaInfoDirs(String buildDir) throws Exception {
+    File stackRootTmp = getStackRootTmp(buildDir);
+    File stackRoot = new File("src/test/resources/stacks");
+
+    if (System.getProperty("os.name").contains("Windows")) {
+      stackRoot = new File(ClassLoader.getSystemClassLoader().getResource("stacks").getPath());
+    }
+
     stackRootTmp.mkdir();
     FileUtils.copyDirectory(stackRoot, stackRootTmp);
-    TestAmbariMetaInfo ambariMetaInfo = createAmbariMetaInfo(stackRootTmp, version);
+  }
+
+  private TestAmbariMetaInfo setupTempAmbariMetaInfo(String buildDir) throws Exception {
+    setupTempAmbariMetaInfoDirs(buildDir);
+    TestAmbariMetaInfo ambariMetaInfo = setupTempAmbariMetaInfoExistingDirs(buildDir);
+    return ambariMetaInfo;
+  }
 
+  private TestAmbariMetaInfo setupTempAmbariMetaInfoExistingDirs(String buildDir) throws Exception {
+    File version = getVersion();
+    File stackRootTmp = getStackRootTmp(buildDir);
+    TestAmbariMetaInfo ambariMetaInfo = createAmbariMetaInfo(stackRootTmp, version);
     return ambariMetaInfo;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/536bf049/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
index a33a412..db5adff 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java
@@ -117,6 +117,7 @@ import org.apache.ambari.server.orm.entities.WidgetLayoutUserWidgetEntity;
 import org.apache.ambari.server.security.TestAuthenticationFactory;
 import org.apache.ambari.server.security.authorization.AuthorizationException;
 import org.apache.ambari.server.serveraction.ServerAction;
+import org.apache.ambari.server.stack.StackManagerMock;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
@@ -233,6 +234,7 @@ public class AmbariManagementControllerTest {
   private HostDAO hostDAO;
   private TopologyHostInfoDAO topologyHostInfoDAO;
   private HostRoleCommandDAO hostRoleCommandDAO;
+  private StackManagerMock stackManagerMock;
 
   @Rule
   public ExpectedException expectedException = ExpectedException.none();
@@ -273,6 +275,7 @@ public class AmbariManagementControllerTest {
     hostDAO = injector.getInstance(HostDAO.class);
     topologyHostInfoDAO = injector.getInstance(TopologyHostInfoDAO.class);
     hostRoleCommandDAO = injector.getInstance(HostRoleCommandDAO.class);
+    stackManagerMock = (StackManagerMock) ambariMetaInfo.getStackManager();
     EasyMock.replay(injector.getInstance(AuditLogger.class));
   }
 
@@ -8653,6 +8656,7 @@ public class AmbariManagementControllerTest {
       assertTrue(INCORRECT_BASE_URL.equals(repositoryInfo.getBaseUrl()));
     }
 
+    stackManagerMock.invalidateCurrentPaths();
     controller.updateStacks();
 
     stackInfo = ambariMetaInfo.getStack(STACK_NAME, STACK_VERSION);

http://git-wip-us.apache.org/repos/asf/ambari/blob/536bf049/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java
index dd2feb4..9837b0f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java
@@ -1544,6 +1544,7 @@ public class ClusterStackVersionResourceProviderTest {
 
     TopologyManager topologyManager = injector.getInstance(TopologyManager.class);
     StageUtils.setTopologyManager(topologyManager);
+    StageUtils.setConfiguration(injector.getInstance(Configuration.class));
 
 
     // !!! make it look like there is already a versioned installed that is less than the one being installed

http://git-wip-us.apache.org/repos/asf/ambari/blob/536bf049/ambari-server/src/test/java/org/apache/ambari/server/orm/InMemoryDefaultTestModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/InMemoryDefaultTestModule.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/InMemoryDefaultTestModule.java
index e327a04..7f5842f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/orm/InMemoryDefaultTestModule.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/InMemoryDefaultTestModule.java
@@ -23,10 +23,14 @@ import java.util.Collections;
 import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicReference;
-
+import com.google.inject.assistedinject.FactoryModuleBuilder;
+import com.google.inject.util.Modules;
 import org.apache.ambari.server.audit.AuditLogger;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.ControllerModule;
+import org.apache.ambari.server.stack.StackManager;
+import org.apache.ambari.server.stack.StackManagerFactory;
+import org.apache.ambari.server.stack.StackManagerMock;
 import org.easymock.EasyMock;
 import org.springframework.beans.factory.config.BeanDefinition;
 
@@ -92,7 +96,13 @@ public class InMemoryDefaultTestModule extends AbstractModule {
     }
 
     try {
-      install(new BeanDefinitionsCachingTestControllerModule(properties));
+      install(Modules.override(new BeanDefinitionsCachingTestControllerModule(properties)).with(new AbstractModule() {
+        @Override
+        protected void configure() {
+          // Cache parsed stacks.
+          install(new FactoryModuleBuilder().implement(StackManager.class, StackManagerMock.class).build(StackManagerFactory.class));
+        }
+      }));
       AuditLogger al = EasyMock.createNiceMock(AuditLogger.class);
       EasyMock.expect(al.isEnabled()).andReturn(false).anyTimes();
       bind(AuditLogger.class).toInstance(al);

http://git-wip-us.apache.org/repos/asf/ambari/blob/536bf049/ambari-server/src/test/java/org/apache/ambari/server/stack/StackManagerMock.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/stack/StackManagerMock.java b/ambari-server/src/test/java/org/apache/ambari/server/stack/StackManagerMock.java
new file mode 100644
index 0000000..1b9e15f
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/stack/StackManagerMock.java
@@ -0,0 +1,166 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.stack;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+import javax.annotation.Nullable;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.metadata.ActionMetadata;
+import org.apache.ambari.server.orm.dao.ExtensionDAO;
+import org.apache.ambari.server.orm.dao.ExtensionLinkDAO;
+import org.apache.ambari.server.orm.dao.MetainfoDAO;
+import org.apache.ambari.server.orm.dao.StackDAO;
+import org.apache.ambari.server.state.StackInfo;
+import org.apache.ambari.server.state.stack.OsFamily;
+
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+/**
+ * Directory tree rescans and stack modules parsing take much time on every module init.
+ * This class enhances {@code}StackManager{@code} to reuse already parsed modules.
+ */
+public class StackManagerMock extends StackManager {
+
+  // Ensure correct behavior during the parallel test execution.
+  private static final Lock lock = new ReentrantLock();
+
+  // Some tests use different stack locations.
+  private static final Map<ModulesPathsKey, CachedModules> pathsToCachedModulesMap = new HashMap<>();
+
+  public static void invalidateKey(File stackRoot, File commonServicesRoot, File extensionRoot) {
+    ModulesPathsKey pathsKey = new ModulesPathsKey(stackRoot, commonServicesRoot, extensionRoot);
+    pathsToCachedModulesMap.remove(pathsKey);
+  }
+
+  // Paths for this instance.
+  private File currentStackRoot;
+  private File currentCommonServicesRoot;
+  private File currentExtensionRoot;
+
+  public void invalidateCurrentPaths() {
+    invalidateKey(currentStackRoot, currentCommonServicesRoot, currentExtensionRoot);
+  }
+
+  private static class ModulesPathsKey {
+    private String stackRoot;
+    private String commonServicesRoot;
+    private String extensionRoot;
+
+    public ModulesPathsKey(File stackRoot, File commonServicesRoot, File extensionRoot) {
+      this.stackRoot = stackRoot == null ? "" : stackRoot.getPath();
+      this.commonServicesRoot = commonServicesRoot == null ? "" : commonServicesRoot.getPath();
+      this.extensionRoot = extensionRoot == null ? "" : extensionRoot.getPath();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      if (this == o) return true;
+      if (o == null || getClass() != o.getClass()) return false;
+
+      ModulesPathsKey that = (ModulesPathsKey) o;
+
+      if (stackRoot != null ? !stackRoot.equals(that.stackRoot) : that.stackRoot != null) return false;
+      if (commonServicesRoot != null ? !commonServicesRoot.equals(that.commonServicesRoot) : that.commonServicesRoot != null)
+        return false;
+      return !(extensionRoot != null ? !extensionRoot.equals(that.extensionRoot) : that.extensionRoot != null);
+
+    }
+
+    @Override
+    public int hashCode() {
+      int result = stackRoot != null ? stackRoot.hashCode() : 0;
+      result = 31 * result + (commonServicesRoot != null ? commonServicesRoot.hashCode() : 0);
+      result = 31 * result + (extensionRoot != null ? extensionRoot.hashCode() : 0);
+      return result;
+    }
+  }
+
+  private static class CachedModules {
+    private Map<String, ServiceModule> cachedCommonServiceModules;
+    private Map<String, StackModule> cachedStackModules;
+    private Map<String, ExtensionModule> cachedExtensionModules;
+    private Map<String, StackInfo> cachedStackMap;
+
+    public CachedModules(Map<String, ServiceModule> cachedCommonServiceModules, Map<String, StackModule> cachedStackModules,
+                         Map<String, ExtensionModule> cachedExtensionModules, Map<String, StackInfo> cachedStackMap) {
+      this.cachedCommonServiceModules = cachedCommonServiceModules;
+      this.cachedStackModules = cachedStackModules;
+      this.cachedExtensionModules = cachedExtensionModules;
+      this.cachedStackMap = cachedStackMap;
+    }
+
+    public Map<String, ServiceModule> getCachedCommonServiceModules() {
+      return cachedCommonServiceModules;
+    }
+
+    public Map<String, StackModule> getCachedStackModules() {
+      return cachedStackModules;
+    }
+
+    public Map<String, ExtensionModule> getCachedExtensionModules() {
+      return cachedExtensionModules;
+    }
+
+    public Map<String, StackInfo> getCachedStackMap() {
+      return cachedStackMap;
+    }
+  }
+
+  @Inject
+  public StackManagerMock(@Assisted("stackRoot") File stackRoot, @Nullable @Assisted("commonServicesRoot")
+      File commonServicesRoot, @Assisted("extensionRoot") @Nullable File extensionRoot,
+                          @Assisted OsFamily osFamily, @Assisted boolean validate, MetainfoDAO metaInfoDAO,
+                          ActionMetadata actionMetadata, StackDAO stackDao, ExtensionDAO extensionDao,
+                          ExtensionLinkDAO linkDao) throws AmbariException {
+    super(stackRoot, commonServicesRoot, extensionRoot, osFamily, validate, metaInfoDAO, actionMetadata, stackDao, extensionDao, linkDao);
+    currentStackRoot = stackRoot;
+    currentCommonServicesRoot = commonServicesRoot;
+    currentExtensionRoot = extensionRoot;
+  }
+
+  @Override
+  protected void parseDirectories(File stackRoot, File commonServicesRoot, File extensionRoot) throws AmbariException {
+    try {
+      // Ensure correct behavior during the parallel test execution.
+      lock.lock();
+
+      ModulesPathsKey pathsKey = new ModulesPathsKey(stackRoot, commonServicesRoot, extensionRoot);
+      CachedModules cachedModules = pathsToCachedModulesMap.get(pathsKey);
+
+      if (cachedModules == null) {
+        super.parseDirectories(stackRoot, commonServicesRoot, extensionRoot);
+        CachedModules newEntry = new CachedModules(commonServiceModules, stackModules, extensionModules, stackMap);
+        pathsToCachedModulesMap.put(pathsKey, newEntry);
+      } else {
+        commonServiceModules = cachedModules.getCachedCommonServiceModules();
+        stackModules = cachedModules.getCachedStackModules();
+        extensionModules = cachedModules.getCachedExtensionModules();
+        stackMap = cachedModules.getCachedStackMap();
+      }
+    } finally {
+      lock.unlock();
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/536bf049/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
index 34bac2a..c2e1f75 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/UpgradeHelperTest.java
@@ -48,6 +48,7 @@ import org.apache.ambari.server.security.TestAuthenticationFactory;
 import org.apache.ambari.server.security.authorization.AuthorizationException;
 import org.apache.ambari.server.stack.HostsType;
 import org.apache.ambari.server.stack.MasterHostResolver;
+import org.apache.ambari.server.stack.StackManagerMock;
 import org.apache.ambari.server.state.UpgradeHelper.UpgradeGroupHolder;
 import org.apache.ambari.server.state.stack.ConfigUpgradePack;
 import org.apache.ambari.server.state.stack.UpgradePack;
@@ -92,6 +93,7 @@ public class UpgradeHelperTest {
 
   private Injector injector;
   private AmbariMetaInfo ambariMetaInfo;
+  private StackManagerMock stackManagerMock;
   private OrmTestHelper helper;
   private MasterHostResolver m_masterHostResolver;
   private UpgradeHelper m_upgradeHelper;
@@ -134,6 +136,7 @@ public class UpgradeHelperTest {
 
     helper = injector.getInstance(OrmTestHelper.class);
     ambariMetaInfo = injector.getInstance(AmbariMetaInfo.class);
+    stackManagerMock = (StackManagerMock) ambariMetaInfo.getStackManager();
     m_upgradeHelper = injector.getInstance(UpgradeHelper.class);
     m_masterHostResolver = EasyMock.createMock(MasterHostResolver.class);
     m_managementController = injector.getInstance(AmbariManagementController.class);
@@ -242,6 +245,10 @@ public class UpgradeHelperTest {
     assertEquals(6, groups.get(1).items.size());
     assertEquals(9, groups.get(2).items.size());
     assertEquals(8, groups.get(3).items.size());
+
+    // Do stacks cleanup
+    stackManagerMock.invalidateCurrentPaths();
+    ambariMetaInfo.init();
   }
 
   @Test
@@ -295,6 +302,10 @@ public class UpgradeHelperTest {
     assertEquals(3, groups.get(0).items.size());
     assertEquals(7, groups.get(1).items.size());
     assertEquals(2, groups.get(2).items.size());
+
+    // Do stacks cleanup
+    stackManagerMock.invalidateCurrentPaths();
+    ambariMetaInfo.init();
   }
 
   @Test
@@ -349,6 +360,10 @@ public class UpgradeHelperTest {
     assertEquals(3, groups.get(0).items.size());
     assertEquals(6, groups.get(1).items.size());
     assertEquals(1, groups.get(2).items.size());
+
+    // Do stacks cleanup
+    stackManagerMock.invalidateCurrentPaths();
+    ambariMetaInfo.init();
   }
 
   @Test
@@ -383,6 +398,9 @@ public class UpgradeHelperTest {
     assertEquals("Calculating Properties", stageWrappers.get(4).getText());
     assertEquals("Calculating HDFS Properties", stageWrappers.get(5).getText());
 
+    // Do stacks cleanup
+    stackManagerMock.invalidateCurrentPaths();
+    ambariMetaInfo.init();
   }
 
   /**
@@ -427,6 +445,10 @@ public class UpgradeHelperTest {
         assertFalse(hosts.contains(hostInMaintenanceMode.getHostName()));
       }
     }
+
+    // Do stacks cleanup
+    stackManagerMock.invalidateCurrentPaths();
+    ambariMetaInfo.init();
   }
 
   /**
@@ -1156,6 +1178,10 @@ public class UpgradeHelperTest {
     assertEquals(5, groups.get(1).items.size());
     assertEquals(9, groups.get(2).items.size());
     assertEquals(8, groups.get(3).items.size());
+
+    // Do stacks cleanup
+    stackManagerMock.invalidateCurrentPaths();
+    ambariMetaInfo.init();
   }