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

clebertsuconic pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/main by this push:
     new 397312080f ARTEMIS-5375 provide fileAlder32 checksum in the status for 
property files
397312080f is described below

commit 397312080fc26beee7664b7679ad715f9c2fcc83
Author: Gary Tully <[email protected]>
AuthorDate: Wed Apr 2 15:06:16 2025 +0100

    ARTEMIS-5375 provide fileAlder32 checksum in the status for property files
---
 .../core/config/impl/ConfigurationImpl.java        | 55 ++++++++++++----------
 .../core/config/impl/ConfigurationImplTest.java    |  5 ++
 2 files changed, 36 insertions(+), 24 deletions(-)

diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
index 76128e6bca..78a7780125 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
@@ -23,9 +23,11 @@ import java.io.BufferedWriter;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
-import java.io.FileReader;
+import java.io.FileInputStream;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.PrintWriter;
@@ -61,6 +63,7 @@ import java.util.function.Consumer;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.zip.Adler32;
+import java.util.zip.CheckedInputStream;
 import java.util.zip.Checksum;
 
 import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration;
@@ -470,7 +473,6 @@ public class ConfigurationImpl implements Configuration, 
Serializable {
     */
    private File artemisInstance;
    private transient JsonObject jsonStatus = 
JsonLoader.createObjectBuilder().build();
-   private transient Checksum transientChecksum = null;
    private final Set<String> keysToRedact = new HashSet<>();
 
    private JsonObject getJsonStatus() {
@@ -480,17 +482,6 @@ public class ConfigurationImpl implements Configuration, 
Serializable {
       return jsonStatus;
    }
 
-   // Checksum would be otherwise final
-   // however some Quorum actiations are using Serialization to make a deep 
copy of ConfigurationImpl and it would become null
-   // for that reason this i making the proper initialization when needed.
-   private Checksum getCheckSun() {
-      if (transientChecksum == null) {
-         transientChecksum = new Adler32();
-      }
-      return transientChecksum;
-   }
-
-
    @Override
    public String getJournalRetentionDirectory() {
       return journalRetentionDirectory;
@@ -599,14 +590,14 @@ public class ConfigurationImpl implements Configuration, 
Serializable {
    public void parseFileProperties(File file) throws Exception {
       final ConfigurationImpl configuration = this;
       InsertionOrderedProperties brokerProperties = new 
InsertionOrderedProperties();
-      try (FileReader fileReader = new FileReader(file);
-           BufferedReader reader = new BufferedReader(fileReader)) {
+      try (CheckedInputStream checkedInputStream = new CheckedInputStream(new 
FileInputStream(file), new Adler32())) {
          try {
             if (file.getName().endsWith(".json")) {
-               brokerProperties.loadJson(configuration, reader);
+               brokerProperties.loadJson(configuration, checkedInputStream);
             } else {
-               brokerProperties.load(reader);
+               brokerProperties.load(checkedInputStream);
             }
+            
brokerProperties.setFileChecksum(checkedInputStream.getChecksum().getValue());
          } catch (Exception readOrParseError) {
             logger.debug("Properties config load error on file {}, {}", 
file.getName(), readOrParseError);
             updateApplyStatus(file.getName(), Map.of("loadError", 
readOrParseError.toString()));
@@ -623,11 +614,8 @@ public class ConfigurationImpl implements Configuration, 
Serializable {
    @Override
    public void parsePrefixedProperties(Object target, String name, Properties 
properties, String prefix) throws Exception {
       Map<String, Object> beanProperties = new LinkedHashMap<>();
-      long alder32Hash = 0;
+      final Checksum checksum = new Adler32();
       synchronized (properties) {
-         Checksum checksum = getCheckSun();
-
-         checksum.reset();
          String key = null;
          for (Map.Entry<Object, Object> entry : properties.entrySet()) {
             key = entry.getKey().toString();
@@ -653,9 +641,12 @@ public class ConfigurationImpl implements Configuration, 
Serializable {
             logger.debug("Property config, {}={}", key, (masked || 
shouldRedact(key)) ? REDACTED : value);
             beanProperties.put(key, value);
          }
-         alder32Hash = checksum.getValue();
       }
-      updateReadPropertiesStatus(name, alder32Hash);
+      long fileAlder32 = 0;
+      if (properties instanceof InsertionOrderedProperties 
insertionOrderedProperties) {
+         fileAlder32 = insertionOrderedProperties.getFileChecksum();
+      }
+      updateReadPropertiesStatus(name, checksum.getValue(), fileAlder32);
 
       if (!beanProperties.isEmpty()) {
          populateWithProperties(target, name, beanProperties);
@@ -1200,9 +1191,10 @@ public class ConfigurationImpl implements Configuration, 
Serializable {
       this.jsonStatus = JsonUtil.mergeAndUpdate(status, 
jsonObjectBuilder.build());
    }
 
-   private synchronized void updateReadPropertiesStatus(String propsId, long 
alder32Hash) {
+   private synchronized void updateReadPropertiesStatus(String propsId, long 
alder32Hash, long fileAlder32) {
       JsonObjectBuilder propertiesReadStatusBuilder = 
JsonLoader.createObjectBuilder();
       propertiesReadStatusBuilder.add("alder32", String.valueOf(alder32Hash));
+      propertiesReadStatusBuilder.add("fileAlder32", 
String.valueOf(fileAlder32));
       JsonObjectBuilder jsonObjectBuilder = 
JsonUtil.objectBuilderWithValueAtPath("properties/" + propsId, 
propertiesReadStatusBuilder.build());
       JsonObject jsonStatus = getJsonStatus();
       this.jsonStatus = JsonUtil.mergeAndUpdate(jsonStatus, 
jsonObjectBuilder.build());
@@ -3906,6 +3898,7 @@ public class ConfigurationImpl implements Configuration, 
Serializable {
    public static class InsertionOrderedProperties extends Properties {
 
       final LinkedHashMap<Object, Object> orderedMap = new LinkedHashMap<>();
+      long fileChecksum = 0;
 
       @Override
       public Object put(Object key, Object value) {
@@ -3922,6 +3915,12 @@ public class ConfigurationImpl implements Configuration, 
Serializable {
          orderedMap.clear();
       }
 
+      public synchronized boolean loadJson(ConfigurationImpl configuration, 
InputStream inputStream) throws IOException {
+         try (Reader reader = new BufferedReader(new 
InputStreamReader(inputStream))) {
+            return loadJson(configuration, reader);
+         }
+      }
+
       public synchronized boolean loadJson(ConfigurationImpl configuration, 
Reader reader) throws IOException {
          JsonObject jsonObject = JsonLoader.readObject(reader);
          final String surroundString = determineSurroundString(configuration, 
jsonObject);
@@ -3974,5 +3973,13 @@ public class ConfigurationImpl implements Configuration, 
Serializable {
          }
          return surroundString;
       }
+
+      public void setFileChecksum(long value) {
+         fileChecksum = value;
+      }
+
+      public long getFileChecksum() {
+         return fileChecksum;
+      }
    }
 }
diff --git 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
index 84b8214af7..1aaf82b060 100644
--- 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
+++ 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
@@ -2059,6 +2059,7 @@ public class ConfigurationImplTest extends 
AbstractConfigurationTestBase {
       configuration.parseProperties(tmpFile.getAbsolutePath());
 
       testSimpleConfig(configuration);
+      
assertTrue(configuration.getStatus().contains("\"fileAlder32\":\"2885074053\""));
    }
 
    @Test
@@ -2075,6 +2076,7 @@ public class ConfigurationImplTest extends 
AbstractConfigurationTestBase {
       configuration.parseProperties(tmpFile.getAbsolutePath());
 
       testSimpleConfig(configuration);
+      
assertTrue(configuration.getStatus().contains("\"fileAlder32\":\"3147794929\""));
    }
 
    @Test
@@ -2277,6 +2279,9 @@ public class ConfigurationImplTest extends 
AbstractConfigurationTestBase {
       assertEquals("cc", 
configuration.getClusterConfigurations().get(0).getName());
       assertEquals(MessageLoadBalancingType.OFF_WITH_REDISTRIBUTION, 
configuration.getClusterConfigurations().get(0).getMessageLoadBalancingType());
       assertEquals(CriticalAnalyzerPolicy.SHUTDOWN, 
configuration.getCriticalAnalyzerPolicy());
+
+      assertTrue(configuration.getStatus().contains("\"alder32"));
+      assertTrue(configuration.getStatus().contains("\"fileAlder32"));
    }
 
    @Test


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact


Reply via email to