GEODE-1986: correctly set the flag indicating if cluster configuration service is running or not on a locator.
Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/584337b3 Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/584337b3 Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/584337b3 Branch: refs/heads/feature/GEODE-1874 Commit: 584337b323b3713ec95dbb8934862dc83a65757f Parents: f079f37 Author: Jinmei Liao <jil...@pivotal.io> Authored: Tue Oct 11 14:01:33 2016 -0700 Committer: Jinmei Liao <jil...@pivotal.io> Committed: Wed Oct 12 09:40:26 2016 -0700 ---------------------------------------------------------------------- .../internal/InternalDistributedSystem.java | 68 +++++++++++--------- .../geode/internal/cache/GemFireCacheImpl.java | 6 +- ...lusterConfigWithEmbededLocatorDUnitTest.java | 67 +++++++++++++++++++ 3 files changed, 107 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/584337b3/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java index 17303c1..848a86e 100644 --- a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java +++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java @@ -98,15 +98,13 @@ import org.apache.geode.internal.offheap.MemoryAllocator; import org.apache.geode.internal.offheap.OffHeapStorage; import org.apache.geode.internal.statistics.DummyStatisticsImpl; import org.apache.geode.internal.statistics.GemFireStatSampler; -import org.apache.geode.internal.statistics.platform.LinuxProcFsStatistics; import org.apache.geode.internal.statistics.LocalStatisticsImpl; -import org.apache.geode.internal.statistics.platform.OsStatisticsFactory; import org.apache.geode.internal.statistics.StatisticsImpl; import org.apache.geode.internal.statistics.StatisticsManager; import org.apache.geode.internal.statistics.StatisticsTypeFactoryImpl; +import org.apache.geode.internal.statistics.platform.LinuxProcFsStatistics; +import org.apache.geode.internal.statistics.platform.OsStatisticsFactory; import org.apache.geode.internal.tcp.ConnectionTable; -import org.apache.geode.internal.util.concurrent.StoppableCondition; -import org.apache.geode.internal.util.concurrent.StoppableReentrantLock; import org.apache.geode.management.ManagementException; import org.apache.geode.security.GemFireSecurityException; @@ -733,39 +731,45 @@ public class InternalDistributedSystem extends DistributedSystem implements OsSt */ private void startInitLocator() throws InterruptedException { String locatorString = this.originalConfig.getStartLocator(); - if (locatorString.length() > 0) { - // when reconnecting we don't want to join with a colocated locator unless - // there is a quorum of the old members available - if (attemptingToReconnect && !this.isConnected) { - if (this.quorumChecker != null) { - logger.info("performing a quorum check to see if location services can be started early"); - if (!quorumChecker.checkForQuorum(3 * this.config.getMemberTimeout())) { - logger.info("quorum check failed - not allowing location services to start early"); - return; - } - logger.info("Quorum check passed - allowing location services to start early"); + if (locatorString.length()==0) { + return; + } + + // when reconnecting we don't want to join with a colocated locator unless + // there is a quorum of the old members available + if (attemptingToReconnect && !this.isConnected) { + if (this.quorumChecker != null) { + logger.info("performing a quorum check to see if location services can be started early"); + if (!quorumChecker.checkForQuorum(3 * this.config.getMemberTimeout())) { + logger.info("quorum check failed - not allowing location services to start early"); + return; } + logger.info("Quorum check passed - allowing location services to start early"); } - DistributionLocatorId locId = new DistributionLocatorId(locatorString); - try { - this.startedLocator = InternalLocator.createLocator(locId.getPort(), null, null, this.logWriter, // LOG: this is after IDS has created LogWriterLoggers and Appenders - this.securityLogWriter, // LOG: this is after IDS has created LogWriterLoggers and Appenders - locId.getHost(), locId.getHostnameForClients(), this.originalConfig.toProperties(), false); - if (locId.isPeerLocator()) { - boolean startedPeerLocation = false; - try { - this.startedLocator.startPeerLocation(true); - startedPeerLocation = true; - } finally { - if (!startedPeerLocation) { - this.startedLocator.stop(); - } + } + DistributionLocatorId locId = new DistributionLocatorId(locatorString); + try { + this.startedLocator = InternalLocator.createLocator(locId.getPort(), null, null, this.logWriter, // LOG: this is after IDS has created LogWriterLoggers and Appenders + this.securityLogWriter, // LOG: this is after IDS has created LogWriterLoggers and Appenders + locId.getHost(), locId.getHostnameForClients(), this.originalConfig.toProperties(), false); + + // if locator is started this way, cluster config is not enabled, set the flag correctly + this.startedLocator.getConfig().setEnableClusterConfiguration(false); + + if (locId.isPeerLocator()) { + boolean startedPeerLocation = false; + try { + this.startedLocator.startPeerLocation(true); + startedPeerLocation = true; + } finally { + if (!startedPeerLocation) { + this.startedLocator.stop(); } } - } catch (IOException e) { - throw new GemFireIOException(LocalizedStrings. - InternalDistributedSystem_PROBLEM_STARTING_A_LOCATOR_SERVICE.toLocalizedString(), e); } + } catch (IOException e) { + throw new GemFireIOException(LocalizedStrings. + InternalDistributedSystem_PROBLEM_STARTING_A_LOCATOR_SERVICE.toLocalizedString(), e); } } http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/584337b3/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java b/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java index d166397..6c195e7 100755 --- a/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java +++ b/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java @@ -952,7 +952,6 @@ public class GemFireCacheImpl implements InternalCache, ClientCache, HasCachePer * Request the shared configuration from the locator(s) which have the Cluster config service running */ public ConfigurationResponse requestSharedConfiguration() { - //Request the shared configuration from the locator(s) final DistributionConfig config = this.system.getConfig(); if (!(dm instanceof DistributionManager)) @@ -964,6 +963,9 @@ public class GemFireCacheImpl implements InternalCache, ClientCache, HasCachePer || Locator.getLocator() !=null ) return null; + // can't simply return null if server is not using shared configuration, since we need to find out + // if the locator is running in secure mode or not, if yes, then we need to throw an exception if server is not using cluster config + Map<InternalDistributedMember, Collection<String>> scl = this.getDistributionManager().getAllHostedLocatorsWithSharedConfiguration(); //If there are no locators with Shared configuration, that means the system has been started without shared configuration @@ -973,7 +975,7 @@ public class GemFireCacheImpl implements InternalCache, ClientCache, HasCachePer return null; } - String groupsString = config.getGroups(); + ConfigurationResponse response = null; List<String> locatorConnectionStrings = getSharedConfigLocatorConnectionStringList(); http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/584337b3/geode-core/src/test/java/org/apache/geode/security/ClusterConfigWithEmbededLocatorDUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/security/ClusterConfigWithEmbededLocatorDUnitTest.java b/geode-core/src/test/java/org/apache/geode/security/ClusterConfigWithEmbededLocatorDUnitTest.java new file mode 100644 index 0000000..467caaa --- /dev/null +++ b/geode-core/src/test/java/org/apache/geode/security/ClusterConfigWithEmbededLocatorDUnitTest.java @@ -0,0 +1,67 @@ +/* + * 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.security; + +import org.junit.Before; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +import org.apache.geode.cache.CacheFactory; +import org.apache.geode.internal.AvailablePortHelper; +import org.apache.geode.test.dunit.Host; +import org.apache.geode.test.dunit.VM; +import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase; +import org.apache.geode.test.junit.categories.DistributedTest; +import org.apache.geode.test.junit.categories.SecurityTest; + +@Category({ DistributedTest.class, SecurityTest.class }) +public class ClusterConfigWithEmbededLocatorDUnitTest extends JUnit4DistributedTestCase { + protected VM locator = null; + + @Before + public void before() throws Exception { + final Host host = Host.getHost(0); + this.locator = host.getVM(0); + } + + @Test + public void testEmbeddedLocator() throws Exception{ + int locatorPort = AvailablePortHelper.getRandomAvailableTCPPort(); + + // locator started this way won't have cluster configuration running + locator.invoke(()->{ + new CacheFactory() + .set("name", this.getName()+".server1") + .set("mcast-port", "0") + .set("log-level", "config") + .set("start-locator", "localhost["+locatorPort+"]") + .create(); + }); + + // when this server joins the above locator, it won't request the cluster config from the locator + // since DM.getAllHostedLocatorsWithSharedConfiguration() will return an empty list. This would + // execute without error + + new CacheFactory() + .set("name", this.getName()+".server2") + .set("mcast-port", "0") + .set("log-level", "config") + .set("locators", "localhost["+locatorPort+"]") + .create(); + } +}