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 <ars...@apache.org> 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 <bra...@apache.org> --- .../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: commits-unsubscr...@ambari.apache.org For additional commands, e-mail: commits-h...@ambari.apache.org