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);