You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by sm...@apache.org on 2024/03/19 18:10:48 UTC

(knox) branch master updated: KNOX-3022 - Handling the case when previously persisted CM cluster config file is empty (#890)

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

smolnar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git


The following commit(s) were added to refs/heads/master by this push:
     new 3fed1e060 KNOX-3022 - Handling the case when previously persisted CM cluster config file is empty (#890)
3fed1e060 is described below

commit 3fed1e06041f8756dd50179f9764ac73da28ac01
Author: Sandor Molnar <sm...@apache.org>
AuthorDate: Tue Mar 19 19:10:42 2024 +0100

    KNOX-3022 - Handling the case when previously persisted CM cluster config file is empty (#890)
---
 .../ClouderaManagerServiceDiscoveryMessages.java   |  3 +++
 .../cm/monitor/ClusterConfigurationFileStore.java  | 17 ++++++++----
 .../monitor/ClusterConfigurationFileStoreTest.java | 31 ++++++++++++++++++++++
 3 files changed, 46 insertions(+), 5 deletions(-)

diff --git a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java
index 3bed0b53a..fd77c3552 100644
--- a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java
+++ b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java
@@ -184,6 +184,9 @@ public interface ClouderaManagerServiceDiscoveryMessages {
   void failedToLoadClusterMonitorServiceConfigurations(String monitor,
                                                        @StackTrace(level = MessageLevel.DEBUG) Exception e);
 
+  @Message(level = MessageLevel.WARN, text = "Previously saved cluster configuration file {0} is empty.")
+  void emptyClusterConfiguration(String clusterConfigurationFile);
+
   @Message(level = MessageLevel.ERROR,
       text = "Failed to remove persisted data for cluster configuration monitor {0} {1}")
   void failedToRemovPersistedClusterMonitorData(String monitor, String filename);
diff --git a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/ClusterConfigurationFileStore.java b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/ClusterConfigurationFileStore.java
index 92bea8a74..b72f90373 100644
--- a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/ClusterConfigurationFileStore.java
+++ b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/ClusterConfigurationFileStore.java
@@ -79,7 +79,10 @@ public class ClusterConfigurationFileStore extends AbstractConfigurationStore
     if (persistenceDir != null && Files.exists(persistenceDir)) {
       Collection<File> persistedConfigs = FileUtils.listFiles(persistenceDir.toFile(), new String[]{"ver"}, false);
       for (File persisted : persistedConfigs) {
-        result.add(get(persisted));
+        ServiceConfigurationRecord serviceConfiguration = get(persisted);
+        if (serviceConfiguration != null) {
+          result.add(serviceConfiguration);
+        }
       }
     }
 
@@ -100,10 +103,14 @@ public class ClusterConfigurationFileStore extends AbstractConfigurationStore
     ServiceConfigurationRecord result = null;
 
     if (persisted != null && persisted.exists()) {
-      try (InputStream in = Files.newInputStream(persisted.toPath())) {
-        result = mapper.readValue(in, ServiceConfigurationRecord.class);
-      } catch (Exception e) {
-        log.failedToLoadClusterMonitorServiceConfigurations(getMonitorType(), e);
+      if (persisted.length() == 0) {
+        log.emptyClusterConfiguration(persisted.getAbsolutePath());
+      } else {
+        try (InputStream in = Files.newInputStream(persisted.toPath())) {
+          result = mapper.readValue(in, ServiceConfigurationRecord.class);
+        } catch (Exception e) {
+          log.failedToLoadClusterMonitorServiceConfigurations(getMonitorType(), e);
+        }
       }
     }
 
diff --git a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/monitor/ClusterConfigurationFileStoreTest.java b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/monitor/ClusterConfigurationFileStoreTest.java
index f93898f50..ead707533 100644
--- a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/monitor/ClusterConfigurationFileStoreTest.java
+++ b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/monitor/ClusterConfigurationFileStoreTest.java
@@ -18,6 +18,11 @@ package org.apache.knox.gateway.topology.discovery.cm.monitor;
 
 import org.junit.Test;
 
+import java.io.File;
+import java.io.IOException;
+import java.nio.channels.FileChannel;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -105,6 +110,32 @@ public class ClusterConfigurationFileStoreTest extends AbstractConfigurationStor
     assertEquals("Expected no files in the data directory.", 0, listFiles(DATA_DIR).size());
   }
 
+  @Test
+  public void testLoadingEmptyFile() throws IOException {
+    final ClusterConfigurationFileStore configStore = new ClusterConfigurationFileStore(createGatewayConfig());
+    final String address = "http://cmhost:1234/";
+    final String cluster = "Cluster XY";
+
+    final Map<String, ServiceConfigurationModel> configModels = new HashMap<>();
+    ServiceConfigurationModel model = new ServiceConfigurationModel();
+    model.addServiceProperty("s_prop_1", "s_prop_1-value");
+    model.addRoleProperty("ROLE_1", "r_prop_1", "r_prop_1-value");
+    configModels.put("MY_SERVICE", model);
+
+    try {
+      configStore.store(address, cluster, configModels);
+      final File persistenceFile = configStore.getPersistenceFile(address, cluster);
+      assertTrue(persistenceFile.length() > 0);
+      //truncate file content
+      FileChannel.open(Paths.get(persistenceFile.getAbsolutePath()), StandardOpenOption.WRITE).truncate(0).close();
+      assertEquals(0, persistenceFile.length());
+      final Set<ServiceConfigurationRecord> persistedConfigs = configStore.getAll();
+      assertTrue(persistedConfigs.isEmpty());
+    } finally {
+      configStore.remove(address, cluster);
+      assertEquals(0, listFiles(DATA_DIR).size());
+    }
+  }
 
   private void validateModel(final ServiceConfigurationModel original, final ServiceConfigurationModel candidate) {
     assertNotNull(candidate);