Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 9C2B8200BEB for ; Wed, 14 Dec 2016 00:50:44 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 9ABCD160B31; Tue, 13 Dec 2016 23:50:44 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 740EA160B23 for ; Wed, 14 Dec 2016 00:50:43 +0100 (CET) Received: (qmail 33697 invoked by uid 500); 13 Dec 2016 23:50:37 -0000 Mailing-List: contact commits-help@geode.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@geode.apache.org Delivered-To: mailing list commits@geode.apache.org Received: (qmail 33688 invoked by uid 99); 13 Dec 2016 23:50:37 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 13 Dec 2016 23:50:37 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 8E065E95B8; Tue, 13 Dec 2016 23:50:37 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: jinmeiliao@apache.org To: commits@geode.apache.org Message-Id: <3ad99387246948b3a5bbddc1b886f90e@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: geode git commit: GEODE-2196: restore the system properties correctly in each vm Date: Tue, 13 Dec 2016 23:50:37 +0000 (UTC) archived-at: Tue, 13 Dec 2016 23:50:44 -0000 Repository: geode Updated Branches: refs/heads/develop 41e7352ca -> 292b46545 GEODE-2196: restore the system properties correctly in each vm Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/292b4654 Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/292b4654 Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/292b4654 Branch: refs/heads/develop Commit: 292b465454b1708acaa94545df4c0c0fc51e349d Parents: 41e7352 Author: Jinmei Liao Authored: Mon Dec 12 08:48:50 2016 -0800 Committer: Jinmei Liao Committed: Tue Dec 13 15:50:08 2016 -0800 ---------------------------------------------------------------------- .../internal/DistributionConfig.java | 2 +- .../internal/DistributionConfigImpl.java | 2 +- .../org/apache/geode/internal/JarDeployer.java | 3 +- .../configuration/ClusterConfigDUnitTest.java | 243 +++++++++++++++++++ .../DistributedRestoreSystemProperties.java | 4 +- .../dunit/rules/LocatorServerStartupRule.java | 7 +- 6 files changed, 255 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/292b4654/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfig.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfig.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfig.java index 5eb070d..c2a395d 100644 --- a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfig.java +++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfig.java @@ -384,7 +384,7 @@ public interface DistributionConfig extends Config, LogConfig { * Default will be the current working directory as determined by * System.getProperty("user.dir"). */ - File DEFAULT_DEPLOY_WORKING_DIR = new File("."); + File DEFAULT_DEPLOY_WORKING_DIR = new File(System.getProperty("user.dir")); /** * Returns the value of the {@link ConfigurationProperties#USER_COMMAND_PACKAGES} property http://git-wip-us.apache.org/repos/asf/geode/blob/292b4654/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfigImpl.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfigImpl.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfigImpl.java index 0c6603d..fa6d13f 100644 --- a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfigImpl.java +++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionConfigImpl.java @@ -124,7 +124,7 @@ public class DistributionConfigImpl extends AbstractDistributionConfig implement */ private File logFile = DEFAULT_LOG_FILE; - protected File deployWorkingDir = DEFAULT_DEPLOY_WORKING_DIR; + protected File deployWorkingDir = new File(System.getProperty("user.dir")); /** * The level at which log messages are logged http://git-wip-us.apache.org/repos/asf/geode/blob/292b4654/geode-core/src/main/java/org/apache/geode/internal/JarDeployer.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/JarDeployer.java b/geode-core/src/main/java/org/apache/geode/internal/JarDeployer.java index f6a6e8e..e7afeda 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/JarDeployer.java +++ b/geode-core/src/main/java/org/apache/geode/internal/JarDeployer.java @@ -623,7 +623,8 @@ public class JarDeployer implements Serializable { if (exception != null) { throw new IOException("Unable to write to deploy directory", exception); } - throw new IOException("Unable to write to deploy directory"); + throw new IOException( + "Unable to write to deploy directory: " + this.deployDirectory.getCanonicalPath()); } private byte[] getJarContent(File jarFile) throws IOException { http://git-wip-us.apache.org/repos/asf/geode/blob/292b4654/geode-core/src/test/java/org/apache/geode/management/internal/configuration/ClusterConfigDUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/configuration/ClusterConfigDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/configuration/ClusterConfigDUnitTest.java new file mode 100644 index 0000000..418999a --- /dev/null +++ b/geode-core/src/test/java/org/apache/geode/management/internal/configuration/ClusterConfigDUnitTest.java @@ -0,0 +1,243 @@ +/* + * 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.geode.management.internal.configuration; + +import static org.apache.geode.distributed.ConfigurationProperties.CLUSTER_CONFIGURATION_DIR; +import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_CLUSTER_CONFIGURATION; +import static org.apache.geode.distributed.ConfigurationProperties.GROUPS; +import static org.apache.geode.distributed.ConfigurationProperties.LOAD_CLUSTER_CONFIGURATION_FROM_DIR; +import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS; +import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE_SIZE_LIMIT; +import static org.apache.geode.distributed.ConfigurationProperties.USE_CLUSTER_CONFIGURATION; +import static org.assertj.core.api.Assertions.assertThat; + +import org.apache.geode.cache.Cache; +import org.apache.geode.distributed.internal.InternalLocator; +import org.apache.geode.distributed.internal.SharedConfiguration; +import org.apache.geode.internal.ClassPathLoader; +import org.apache.geode.internal.JarClassLoader; +import org.apache.geode.management.internal.configuration.domain.Configuration; +import org.apache.geode.management.internal.configuration.utils.ZipUtils; +import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase; +import org.apache.geode.test.dunit.rules.LocatorServerStartupRule; +import org.apache.geode.test.dunit.rules.Member; +import org.apache.geode.test.junit.categories.DistributedTest; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +import java.io.File; +import java.io.IOException; +import java.io.Serializable; +import java.util.Collection; +import java.util.Properties; + +@Category(DistributedTest.class) +public class ClusterConfigDUnitTest extends JUnit4DistributedTestCase { + private static final String EXPORTED_CLUSTER_CONFIG_ZIP_FILENAME = "cluster_config.zip"; + private static final String[] CONFIG_NAMES = new String[] {"cluster", "group1", "group2"}; + + private static final ExpectedConfig NO_GROUP = + new ExpectedConfig().maxLogFileSize("5000").regions("regionForCluster").jars("cluster.jar"); + + private static final ExpectedConfig GROUP1 = new ExpectedConfig().maxLogFileSize("6000") + .regions("regionForCluster", "regionForGroup1").jars("cluster.jar", "group1.jar"); + + private static final ExpectedConfig GROUP2 = new ExpectedConfig().maxLogFileSize("7000") + .regions("regionForCluster", "regionForGroup2").jars("cluster.jar", "group2.jar"); + + private static final ExpectedConfig GROUP1_AND_2 = new ExpectedConfig().maxLogFileSize("7000") + .regions("regionForCluster", "regionForGroup1", "regionForGroup2") + .jars("cluster.jar", "group1.jar", "group2.jar"); + + + private String locatorString; + + @Rule + public LocatorServerStartupRule lsRule = new LocatorServerStartupRule(); + + @Before + public void setupFirstLocatorWithClusterConfigFromDirectory() throws Exception { + File locatorDir = lsRule.getRootFolder().newFolder("locator-0"); + + // The unzip should yield a cluster config directory structure like: + // tempFolder/locator-0/cluster_config/cluster/cluster.xml + // tempFolder/locator-0/cluster_config/cluster/cluster.properties + // tempFolder/locator-0/cluster_config/cluster/cluster.jar + // tempFolder/locator-0/cluster_config/group1/ {group1.xml, group1.properties, group1.jar} + // tempFolder/locator-0/cluster_config/group2/ ... + ZipUtils.unzip(getClass().getResource(EXPORTED_CLUSTER_CONFIG_ZIP_FILENAME).getPath(), + locatorDir.getCanonicalPath()); + + Properties locatorProps = new Properties(); + locatorProps.setProperty(ENABLE_CLUSTER_CONFIGURATION, "true"); + locatorProps.setProperty(LOAD_CLUSTER_CONFIGURATION_FROM_DIR, "true"); + locatorProps.setProperty(CLUSTER_CONFIGURATION_DIR, locatorDir.getCanonicalPath()); + + Member firstLocator = lsRule.startLocatorVM(0, locatorProps); + locatorString = "localhost[" + firstLocator.getPort() + "]"; + + verifyLocatorConfigExistsInFileSystem(firstLocator.getWorkingDir()); + firstLocator.invoke(this::verifyLocatorConfigExistsInInternalRegion); + } + + @Test + public void secondLocatorLoadsClusterConfigFromFirstLocator() throws IOException { + Properties secondLocatorProps = new Properties(); + secondLocatorProps.setProperty(LOCATORS, locatorString); + secondLocatorProps.setProperty(ENABLE_CLUSTER_CONFIGURATION, "true"); + Member secondLocator = lsRule.startLocatorVM(1, secondLocatorProps); + + verifyLocatorConfig(secondLocator); + } + + @Test + public void serverWithZeroOrOneGroupsLoadCorrectConfigFromLocator() throws Exception { + Properties serverProps = new Properties(); + serverProps.setProperty(LOCATORS, locatorString); + serverProps.setProperty(USE_CLUSTER_CONFIGURATION, "true"); + + Member serverWithNoGroup = lsRule.startServerVM(1, serverProps); + verifyServerConfig(NO_GROUP, serverWithNoGroup); + + serverProps.setProperty(GROUPS, "group1"); + Member serverForGroup1 = lsRule.startServerVM(2, serverProps); + verifyServerConfig(GROUP1, serverForGroup1); + + serverProps.setProperty(GROUPS, "group2"); + Member serverForGroup2 = lsRule.startServerVM(3, serverProps); + verifyServerConfig(GROUP2, serverForGroup2); + } + + @Test + public void oneServerWithMultipleGroupsLoadsCorrectConfigFromLocator() throws Exception { + Properties serverProps = new Properties(); + serverProps.setProperty(LOCATORS, locatorString); + serverProps.setProperty(USE_CLUSTER_CONFIGURATION, "true"); + serverProps.setProperty(GROUPS, "group1,group2"); + Member serverWithNoGroup = lsRule.startServerVM(1, serverProps); + + serverWithNoGroup.invoke(() -> this.verifyServerConfig(GROUP1_AND_2, serverWithNoGroup)); + } + + private void verifyLocatorConfig(Member locator) { + verifyLocatorConfigExistsInFileSystem(locator.getWorkingDir()); + locator.invoke(this::verifyLocatorConfigExistsInInternalRegion); + } + + private void verifyServerConfig(ExpectedConfig expectedConfig, Member server) + throws ClassNotFoundException { + verifyServerJarFilesExistInFileSystem(server.getWorkingDir(), expectedConfig.jars); + server.invoke(() -> this.verifyServerConfigInMemory(expectedConfig)); + } + + private void verifyLocatorConfigExistsInFileSystem(File workingDir) { + File clusterConfigDir = new File(workingDir, "cluster_config"); + assertThat(clusterConfigDir).exists(); + + for (String configName : CONFIG_NAMES) { + File configDir = new File(clusterConfigDir, configName); + assertThat(configDir).exists(); + + File jar = new File(configDir, configName + ".jar"); + File properties = new File(configDir, configName + ".properties"); + File xml = new File(configDir, configName + ".xml"); + assertThat(configDir.listFiles()).contains(jar, properties, xml); + } + } + + private void verifyLocatorConfigExistsInInternalRegion() throws Exception { + InternalLocator internalLocator = LocatorServerStartupRule.locatorStarter.locator; + SharedConfiguration sc = internalLocator.getSharedConfiguration(); + + for (String configName : CONFIG_NAMES) { + Configuration config = sc.getConfiguration(configName); + assertThat(config).isNotNull(); + } + } + + private void verifyServerConfigInMemory(ExpectedConfig expectedConfig) + throws ClassNotFoundException { + Cache cache = LocatorServerStartupRule.serverStarter.cache; + for (String region : expectedConfig.regions) { + assertThat(cache.getRegion(region)).isNotNull(); + } + Properties props = cache.getDistributedSystem().getProperties(); + assertThat(props.getProperty(LOG_FILE_SIZE_LIMIT)).isEqualTo(expectedConfig.maxLogFileSize); + + for (String jar : expectedConfig.jars) { + JarClassLoader jarClassLoader = findJarClassLoader(jar); + assertThat(jarClassLoader).isNotNull(); + assertThat(jarClassLoader.loadClass(nameOfClassContainedInJar(jar))).isNotNull(); + } + } + + private void verifyServerJarFilesExistInFileSystem(File workingDir, String[] jarNames) { + assertThat(workingDir.listFiles()).isNotEmpty(); + + for (String jarName : jarNames) { + assertThat(workingDir.listFiles()).filteredOn((File file) -> file.getName().contains(jarName)) + .isNotEmpty(); + } + } + + private String nameOfClassContainedInJar(String jarName) { + switch (jarName) { + case "cluster.jar": + return "Cluster"; + case "group1.jar": + return "Group1"; + case "group2.jar": + return "Group2"; + default: + throw new IllegalArgumentException( + EXPORTED_CLUSTER_CONFIG_ZIP_FILENAME + " does not contain a jar named " + jarName); + } + } + + private JarClassLoader findJarClassLoader(final String jarName) { + Collection classLoaders = ClassPathLoader.getLatest().getClassLoaders(); + for (ClassLoader classLoader : classLoaders) { + if (classLoader instanceof JarClassLoader + && ((JarClassLoader) classLoader).getJarName().equals(jarName)) { + return (JarClassLoader) classLoader; + } + } + return null; + } + + private static class ExpectedConfig implements Serializable { + public String maxLogFileSize; + public String[] regions; + public String[] jars; + + public ExpectedConfig maxLogFileSize(String maxLogFileSize) { + this.maxLogFileSize = maxLogFileSize; + return this; + } + + public ExpectedConfig regions(String... regions) { + this.regions = regions; + return this; + } + + public ExpectedConfig jars(String... jars) { + this.jars = jars; + return this; + } + } +} http://git-wip-us.apache.org/repos/asf/geode/blob/292b4654/geode-core/src/test/java/org/apache/geode/test/dunit/rules/DistributedRestoreSystemProperties.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/test/dunit/rules/DistributedRestoreSystemProperties.java b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/DistributedRestoreSystemProperties.java index 221b52a..6b9102e 100755 --- a/geode-core/src/test/java/org/apache/geode/test/dunit/rules/DistributedRestoreSystemProperties.java +++ b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/DistributedRestoreSystemProperties.java @@ -44,7 +44,7 @@ public class DistributedRestoreSystemProperties extends RestoreSystemProperties } @Override - protected void before() throws Throwable { + public void before() throws Throwable { super.before(); this.invoker.remoteInvokeInEveryVMAndLocator(new SerializableRunnable() { @Override @@ -56,7 +56,7 @@ public class DistributedRestoreSystemProperties extends RestoreSystemProperties } @Override - protected void after() { + public void after() { super.after(); this.invoker.remoteInvokeInEveryVMAndLocator(new SerializableRunnable() { @Override http://git-wip-us.apache.org/repos/asf/geode/blob/292b4654/geode-core/src/test/java/org/apache/geode/test/dunit/rules/LocatorServerStartupRule.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/test/dunit/rules/LocatorServerStartupRule.java b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/LocatorServerStartupRule.java index c56f7ab..b096cbb 100644 --- a/geode-core/src/test/java/org/apache/geode/test/dunit/rules/LocatorServerStartupRule.java +++ b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/LocatorServerStartupRule.java @@ -52,11 +52,15 @@ public class LocatorServerStartupRule extends ExternalResource implements Serial */ public static LocatorStarterRule locatorStarter; + private DistributedRestoreSystemProperties restoreSystemProperties = + new DistributedRestoreSystemProperties(); + private TemporaryFolder temporaryFolder = new SerializableTemporaryFolder(); private Member[] members; @Before - public void before() throws IOException { + public void before() throws Throwable { + restoreSystemProperties.before(); temporaryFolder.create(); Invoke.invokeInEveryVM("Stop each VM", this::stop); members = new Member[4]; @@ -64,6 +68,7 @@ public class LocatorServerStartupRule extends ExternalResource implements Serial @After public void after() { + restoreSystemProperties.after(); temporaryFolder.delete(); Invoke.invokeInEveryVM("Stop each VM", this::stop); }