This is an automated email from the ASF dual-hosted git repository.

brahma pushed a commit to branch branch-2.7
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/branch-2.7 by this push:
     new f2a21c8404 AMBARI-25998: Host uuid is not getting synced to other 
collectors, causing NPE while accessing metric (#3750)
f2a21c8404 is described below

commit f2a21c8404e718ed12cc443345af7b86fc35c5f6
Author: Mohammad Arshad <ars...@apache.org>
AuthorDate: Tue Nov 7 22:59:51 2023 +0530

    AMBARI-25998: Host uuid is not getting synced to other collectors, causing 
NPE while accessing metric (#3750)
    
    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/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java
 
b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java
index 9f17ae86f8..8ff0cc2799 100644
--- 
a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java
+++ 
b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java
@@ -432,6 +432,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/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataSync.java
 
b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataSync.java
index 03bf4ab947..faaeb1a82a 100644
--- 
a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataSync.java
+++ 
b/ambari-metrics/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/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/discovery/TestMetadataSync.java
 
b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/discovery/TestMetadataSync.java
index ff75c5ef96..7a38dc41cc 100644
--- 
a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/discovery/TestMetadataSync.java
+++ 
b/ambari-metrics/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;
@@ -176,4 +178,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

Reply via email to