This is an automated email from the ASF dual-hosted git repository.
brahma pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ambari-metrics.git
The following commit(s) were added to refs/heads/master by this push:
new 37dcdb0 AMBARI-25998: Host uuid is not getting synced to other
collectors, causing NPE while accessing metric (#124)
37dcdb0 is described below
commit 37dcdb000c33e891163410351b0d99df559f7f1a
Author: Mohammad Arshad <[email protected]>
AuthorDate: Tue Nov 7 23:01:58 2023 +0530
AMBARI-25998: Host uuid is not getting synced to other collectors, causing
NPE while accessing metric (#124)
Signed-off-by: Brahma Reddy Battula <[email protected]>
---
.../discovery/TimelineMetricMetadataManager.java | 11 +++++++
.../discovery/TimelineMetricMetadataSync.java | 8 +++--
.../core/timeline/discovery/TestMetadataSync.java | 38 ++++++++++++++++++++++
3 files changed, 55 insertions(+), 2 deletions(-)
diff --git
a/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java
b/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java
index 94671c4..1b289c0 100644
---
a/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java
+++
b/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java
@@ -431,6 +431,17 @@ public class TimelineMetricMetadataManager {
uuidKeyMap.put(new TimelineMetricUuid(uuid), metadataKey);
}
+ /**
+ * Add host with uuid into uuidHostMap
+ *
+ * @param hostName host name
+ * @param tmHostMetadata TimelineMetricHostMetadata
+ */
+ public void addHostInUuidHostMap(String hostName, TimelineMetricHostMetadata
tmHostMetadata) {
+ TimelineMetricUuid timelineMetricUuid = new
TimelineMetricUuid(tmHostMetadata.getUuid());
+ uuidHostMap.put(timelineMetricUuid, hostName);
+ }
+
/**
* Returns the UUID gen strategy.
* @param configuration the config
diff --git
a/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataSync.java
b/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataSync.java
index 03bf4ab..faaeb1a 100644
---
a/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataSync.java
+++
b/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataSync.java
@@ -201,8 +201,12 @@ public class TimelineMetricMetadataSync implements
Runnable {
Map<String, TimelineMetricHostMetadata> cachedData =
cacheManager.getHostedAppsCache();
for (Map.Entry<String, TimelineMetricHostMetadata> storeEntry :
hostedAppsDataFromStore.entrySet()) {
- if (!cachedData.containsKey(storeEntry.getKey()) ||
-
!cachedData.get(storeEntry.getKey()).getHostedApps().keySet().containsAll(storeEntry.getValue().getHostedApps().keySet()))
{
+ if (!cachedData.containsKey(storeEntry.getKey())) {
+ // New host is being synced
+ cacheManager.addHostInUuidHostMap(storeEntry.getKey(),
storeEntry.getValue());
+ cachedData.put(storeEntry.getKey(), storeEntry.getValue());
+ } else if
(!cachedData.get(storeEntry.getKey()).getHostedApps().keySet().containsAll(storeEntry.getValue().getHostedApps().keySet()))
{
+ // host apps are being synced
cachedData.put(storeEntry.getKey(), storeEntry.getValue());
}
}
diff --git
a/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/discovery/TestMetadataSync.java
b/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/discovery/TestMetadataSync.java
index 8eb4290..dd5aedf 100644
---
a/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/discovery/TestMetadataSync.java
+++
b/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/discovery/TestMetadataSync.java
@@ -21,11 +21,13 @@ import junit.framework.Assert;
import
org.apache.ambari.metrics.core.timeline.aggregators.TimelineClusterMetric;
import org.apache.ambari.metrics.core.timeline.uuid.MetricUuidGenStrategy;
import org.apache.ambari.metrics.core.timeline.uuid.Murmur3HashUuidGenStrategy;
+import org.apache.ambari.metrics.core.timeline.uuid.TimelineMetricUuid;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric;
import org.apache.hadoop.metrics2.sink.timeline.TimelineMetricMetadata;
import org.apache.ambari.metrics.core.timeline.PhoenixHBaseAccessor;
import org.junit.Test;
+import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
@@ -177,4 +179,40 @@ public class TestMetadataSync {
// After other collector's host app data is synced
Assert.assertEquals("Host app list is not synced properly",3,
hostedApps.get("host1").getHostedApps().size());
}
+
+ @Test
+ public void testSyncHostUuid() throws Exception {
+ Configuration configuration = createNiceMock(Configuration.class);
+ PhoenixHBaseAccessor hBaseAccessor =
createNiceMock(PhoenixHBaseAccessor.class);
+ TimelineMetricHostMetadata hostMeta = new TimelineMetricHostMetadata(new
HashSet<>(Arrays.asList("app1", "app2", "app3")));
+ byte[] hostUuid = uuidGenStrategy.computeUuid("host1",
TimelineMetricMetadataManager.HOSTNAME_UUID_LENGTH);
+ hostMeta.setUuid(hostUuid);
+ Map<String, TimelineMetricHostMetadata> hostedApps = new HashMap<String,
TimelineMetricHostMetadata>() {{
+ put("host1", hostMeta);
+ }};
+
+
expect(configuration.get("timeline.metrics.service.operation.mode")).andReturn("distributed");
+ expect(hBaseAccessor.getHostedAppsMetadata()).andReturn(hostedApps);
+ replay(configuration, hBaseAccessor);
+
+ TimelineMetricMetadataManager metadataManager = new
TimelineMetricMetadataManager(configuration, hBaseAccessor);
+ metadataManager.markSuccessOnSyncHostedAppsMetadata();
+ hostedApps = metadataManager.getHostedAppsCache();
+ // Before other collector's host app data is synced
+ Assert.assertNull(hostedApps.get("host1"));
+
+ metadataManager.metricMetadataSync = new
TimelineMetricMetadataSync(metadataManager);
+ metadataManager.metricMetadataSync.run();
+
+ verify(configuration, hBaseAccessor);
+
+ hostedApps = metadataManager.getHostedAppsCache();
+ Assert.assertEquals(1, hostedApps.size());
+ Field field =
TimelineMetricMetadataManager.class.getDeclaredField("uuidHostMap");
+ field.setAccessible(true);
+
+ Map<TimelineMetricUuid, String> uuidHostMap = (Map<TimelineMetricUuid,
String>) field.get(metadataManager);
+ TimelineMetricUuid timelineMetricUuid = new TimelineMetricUuid(hostUuid);
+ Assert.assertTrue("Host uuid was not
synced",uuidHostMap.containsKey(timelineMetricUuid));
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]