AMBARI-18518 : Sinks should not try to read collector hosts from Zk if AMS is in embedded mode. (avijayan)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/8e212903 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/8e212903 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/8e212903 Branch: refs/heads/branch-2.5 Commit: 8e212903f5c650ef153b34afd5498b60b5088e80 Parents: 8431557 Author: Aravindan Vijayan <[email protected]> Authored: Mon Nov 14 21:48:45 2016 -0800 Committer: Aravindan Vijayan <[email protected]> Committed: Tue Nov 15 11:06:40 2016 -0800 ---------------------------------------------------------------------- .../availability/MetricCollectorHAHelper.java | 10 +++++- .../availability/MetricCollectorHATest.java | 34 +++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/8e212903/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/availability/MetricCollectorHAHelper.java ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/availability/MetricCollectorHAHelper.java b/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/availability/MetricCollectorHAHelper.java index 2254362..e7f7cfd 100644 --- a/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/availability/MetricCollectorHAHelper.java +++ b/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/availability/MetricCollectorHAHelper.java @@ -25,6 +25,7 @@ import org.apache.curator.RetryPolicy; import org.apache.curator.retry.BoundedExponentialBackoffRetry; import org.apache.curator.retry.RetryUntilElapsed; import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.data.Stat; import java.util.Collection; import java.util.HashSet; @@ -44,7 +45,8 @@ public class MetricCollectorHAHelper { private static final int CONNECTION_TIMEOUT = 2000; private static final int SESSION_TIMEOUT = 10000; - private static final String ZK_PATH = "/ambari-metrics-cluster/LIVEINSTANCES"; + private static final String ZNODE = "/ambari-metrics-cluster"; + private static final String ZK_PATH = ZNODE + "/LIVEINSTANCES"; private static final String INSTANCE_NAME_DELIMITER = "_"; @@ -72,6 +74,12 @@ public class MetricCollectorHAHelper { try { client.start(); + //Check if Znode exists + Stat stat = client.getZooKeeper().exists(ZNODE, false); + if (stat == null) { + LOG.info("/ambari-metrics-cluster znode does not exist. Skipping requesting live instances from zookeeper"); + return collectors; + } liveInstances = RetryLoop.callWithRetry(client, new Callable<List<String>>() { @Override public List<String> call() throws Exception { http://git-wip-us.apache.org/repos/asf/ambari/blob/8e212903/ambari-metrics/ambari-metrics-common/src/test/java/org/apache/hadoop/metrics2/sink/timeline/availability/MetricCollectorHATest.java ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-common/src/test/java/org/apache/hadoop/metrics2/sink/timeline/availability/MetricCollectorHATest.java b/ambari-metrics/ambari-metrics-common/src/test/java/org/apache/hadoop/metrics2/sink/timeline/availability/MetricCollectorHATest.java index ac1f52d..3d00270 100644 --- a/ambari-metrics/ambari-metrics-common/src/test/java/org/apache/hadoop/metrics2/sink/timeline/availability/MetricCollectorHATest.java +++ b/ambari-metrics/ambari-metrics-common/src/test/java/org/apache/hadoop/metrics2/sink/timeline/availability/MetricCollectorHATest.java @@ -20,9 +20,13 @@ package org.apache.hadoop.metrics2.sink.timeline.availability; import com.google.gson.Gson; import junit.framework.Assert; import org.apache.commons.io.IOUtils; +import org.apache.curator.CuratorZookeeperClient; +import org.apache.curator.retry.BoundedExponentialBackoffRetry; import org.apache.hadoop.metrics2.sink.timeline.AbstractTimelineMetricsSink; +import org.apache.zookeeper.ZooKeeper; import org.junit.Test; import org.junit.runner.RunWith; +import org.powermock.api.easymock.PowerMock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import java.io.IOException; @@ -34,13 +38,14 @@ import java.util.Arrays; import java.util.Collection; import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.expectLastCall; import static org.powermock.api.easymock.PowerMock.createNiceMock; import static org.powermock.api.easymock.PowerMock.expectNew; import static org.powermock.api.easymock.PowerMock.replayAll; import static org.powermock.api.easymock.PowerMock.verifyAll; @RunWith(PowerMockRunner.class) -@PrepareForTest({AbstractTimelineMetricsSink.class, URL.class, HttpURLConnection.class}) +@PrepareForTest({AbstractTimelineMetricsSink.class, URL.class, HttpURLConnection.class, MetricCollectorHAHelper.class}) public class MetricCollectorHATest { @Test @@ -71,6 +76,33 @@ public class MetricCollectorHATest { } + + @Test + public void testEmbeddedModeCollectorZK() throws Exception { + + + BoundedExponentialBackoffRetry retryPolicyMock = PowerMock.createMock(BoundedExponentialBackoffRetry.class); + expectNew(BoundedExponentialBackoffRetry.class, 1000, 10000, 1).andReturn(retryPolicyMock); + + CuratorZookeeperClient clientMock = PowerMock.createMock(CuratorZookeeperClient.class); + expectNew(CuratorZookeeperClient.class, "zkQ", 10000, 2000, null, retryPolicyMock) + .andReturn(clientMock); + + clientMock.start(); + expectLastCall().once(); + + ZooKeeper zkMock = PowerMock.createMock(ZooKeeper.class); + expect(clientMock.getZooKeeper()).andReturn(zkMock).once(); + + expect(zkMock.exists("/ambari-metrics-cluster", false)).andReturn(null).once(); + + replayAll(); + MetricCollectorHAHelper metricCollectorHAHelper = new MetricCollectorHAHelper("zkQ", 1, 1000); + Collection<String> liveInstances = metricCollectorHAHelper.findLiveCollectorHostsFromZNode(); + verifyAll(); + Assert.assertTrue(liveInstances.isEmpty()); + } + @Test public void findCollectorUsingKnownCollectorTest() throws Exception { HttpURLConnection connection = createNiceMock(HttpURLConnection.class);
