You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by pe...@apache.org on 2022/12/09 00:30:16 UTC

[pulsar] branch master updated: [fix][broker] Fix unexpected behaviour by invoke `PulsarConfigurationLoader#convertFrom` (#18816)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new ac7a34fe757 [fix][broker] Fix unexpected behaviour by invoke `PulsarConfigurationLoader#convertFrom` (#18816)
ac7a34fe757 is described below

commit ac7a34fe757fd8acaf7b87aac427b9e515b0aa7c
Author: Qiang Zhao <ma...@apache.org>
AuthorDate: Fri Dec 9 08:30:08 2022 +0800

    [fix][broker] Fix unexpected behaviour by invoke `PulsarConfigurationLoader#convertFrom` (#18816)
---
 .../configuration/PulsarConfigurationLoader.java   | 14 +++++++++-----
 .../proxy/server/ProxyConfigurationTest.java       | 22 ++++++++++++++++++++++
 2 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/common/configuration/PulsarConfigurationLoader.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/common/configuration/PulsarConfigurationLoader.java
index 66b8e042675..cbc6bd692c8 100644
--- a/pulsar-broker-common/src/main/java/org/apache/pulsar/common/configuration/PulsarConfigurationLoader.java
+++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/common/configuration/PulsarConfigurationLoader.java
@@ -182,12 +182,14 @@ public class PulsarConfigurationLoader {
             final ServiceConfiguration convertedConf = ServiceConfiguration.class
                     .getDeclaredConstructor().newInstance();
             Field[] confFields = conf.getClass().getDeclaredFields();
-            Properties properties = new Properties();
+            Properties sourceProperties = conf.getProperties();
+            Properties targetProperties = convertedConf.getProperties();
             Arrays.stream(confFields).forEach(confField -> {
                 try {
                     confField.setAccessible(true);
                     Field convertedConfField = ServiceConfiguration.class.getDeclaredField(confField.getName());
-                    if (!Modifier.isStatic(convertedConfField.getModifiers())) {
+                    if (!Modifier.isStatic(convertedConfField.getModifiers())
+                            && convertedConfField.getDeclaredAnnotation(FieldContext.class) != null) {
                         convertedConfField.setAccessible(true);
                         convertedConfField.set(convertedConf, confField.get(conf));
                     }
@@ -198,8 +200,9 @@ public class PulsarConfigurationLoader {
                     }
                     // add unknown fields to properties
                     try {
-                        if (confField.get(conf) != null) {
-                            properties.put(confField.getName(), confField.get(conf));
+                        String propertyName = confField.getName();
+                        if (!sourceProperties.containsKey(propertyName) && confField.get(conf) != null) {
+                            targetProperties.put(propertyName, confField.get(conf));
                         }
                     } catch (Exception ignoreException) {
                         // should not happen
@@ -208,7 +211,8 @@ public class PulsarConfigurationLoader {
                     throw new RuntimeException("Exception caused while converting configuration: " + e.getMessage());
                 }
             });
-            convertedConf.getProperties().putAll(properties);
+            // Put the rest of properties to new config
+            targetProperties.putAll(sourceProperties);
             return convertedConf;
         } catch (InstantiationException | IllegalAccessException
                 | InvocationTargetException | NoSuchMethodException e) {
diff --git a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyConfigurationTest.java b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyConfigurationTest.java
index 7a2e122c108..ac1078a1a45 100644
--- a/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyConfigurationTest.java
+++ b/pulsar-proxy/src/test/java/org/apache/pulsar/proxy/server/ProxyConfigurationTest.java
@@ -110,4 +110,26 @@ public class ProxyConfigurationTest {
         assertEquals(serviceConfig.getMetadataStoreSessionTimeoutMillis(), 100);
         assertEquals(serviceConfig.getMetadataStoreCacheExpirySeconds(), 300);
     }
+
+
+    @Test
+    public void testConvert() throws IOException {
+        File testConfigFile = new File("tmp." + System.currentTimeMillis() + ".properties");
+        if (testConfigFile.exists()) {
+            testConfigFile.delete();
+        }
+        try (PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(testConfigFile)))) {
+            printWriter.println("proxyAdditionalServlets=a,b,c");
+        }
+        testConfigFile.deleteOnExit();
+        try(InputStream stream = new FileInputStream(testConfigFile)) {
+            ProxyConfiguration proxyConfig = PulsarConfigurationLoader.create(stream, ProxyConfiguration.class);
+            assertEquals(proxyConfig.getProperties().getProperty("proxyAdditionalServlets"), "a,b,c");
+            assertEquals(proxyConfig.getProxyAdditionalServlets().size(), 3);
+            PulsarConfigurationLoader.convertFrom(proxyConfig);
+            assertEquals(proxyConfig.getProperties().getProperty("proxyAdditionalServlets"), "a,b,c");
+            assertEquals(proxyConfig.getProxyAdditionalServlets().size(), 3);
+        }
+    }
+
 }
\ No newline at end of file