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/06/28 16:03:29 UTC

[pulsar] branch master updated: [improve][broker] Use LinkedHashSet for config items of type Set to preserve elements order (#16138)

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 ca9e4bd6186 [improve][broker] Use LinkedHashSet for config items of type Set to preserve elements order (#16138)
ca9e4bd6186 is described below

commit ca9e4bd6186bdf35280177987ad439492ef5fc55
Author: Yang Yang <yy...@streamnative.io>
AuthorDate: Wed Jun 29 00:03:21 2022 +0800

    [improve][broker] Use LinkedHashSet for config items of type Set to preserve elements order (#16138)
---
 .../src/main/java/org/apache/pulsar/common/util/FieldParser.java    | 6 +++---
 .../org/apache/pulsar/common/util/collections/FieldParserTest.java  | 5 +++++
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/pulsar-common/src/main/java/org/apache/pulsar/common/util/FieldParser.java b/pulsar-common/src/main/java/org/apache/pulsar/common/util/FieldParser.java
index 1968e66a4dc..40450584764 100644
--- a/pulsar-common/src/main/java/org/apache/pulsar/common/util/FieldParser.java
+++ b/pulsar-common/src/main/java/org/apache/pulsar/common/util/FieldParser.java
@@ -31,7 +31,7 @@ import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
-import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -212,7 +212,7 @@ public final class FieldParser {
             if (field.getType().equals(List.class)) {
                 field.set(obj, new ArrayList<>());
             } else if (field.getType().equals(Set.class)) {
-                field.set(obj, new HashSet<>());
+                field.set(obj, new LinkedHashSet<>());
             } else if (field.getType().equals(Optional.class)) {
                 field.set(obj, Optional.empty());
             } else {
@@ -333,7 +333,7 @@ public final class FieldParser {
         String[] tokens = trim(val).split(",");
         return Arrays.stream(tokens).map(t -> {
             return convert(trim(t), type);
-        }).collect(Collectors.toSet());
+        }).collect(Collectors.toCollection(LinkedHashSet::new));
     }
 
     private static <K, V> Map<K, V> stringToMap(String strValue, Class<K> keyType, Class<V> valueType) {
diff --git a/pulsar-common/src/test/java/org/apache/pulsar/common/util/collections/FieldParserTest.java b/pulsar-common/src/test/java/org/apache/pulsar/common/util/collections/FieldParserTest.java
index a614f8a3ef5..59cfb2f5f0d 100644
--- a/pulsar-common/src/test/java/org/apache/pulsar/common/util/collections/FieldParserTest.java
+++ b/pulsar-common/src/test/java/org/apache/pulsar/common/util/collections/FieldParserTest.java
@@ -32,6 +32,7 @@ import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -54,6 +55,10 @@ public class FieldParserTest {
         assertEquals(integerToString(1), String.valueOf(1));
         assertEquals(stringToList("1,2,3", Integer.class).get(2), Integer.valueOf(3));
         assertTrue(stringToSet("1,2,3", Integer.class).contains(3));
+        // the order of values should be preserved for a Set configuration item
+        assertEquals(new ArrayList<>(stringToSet("1,2,3", Integer.class)), Arrays.asList(1, 2, 3));
+        assertEquals(new ArrayList<>(stringToSet("2,3,1", Integer.class)), Arrays.asList(2, 3, 1));
+        assertEquals(new ArrayList<>(stringToSet("3,2,1", Integer.class)), Arrays.asList(3, 2, 1));
         assertEquals(stringToBoolean("true"), Boolean.TRUE);
         assertEquals(stringToDouble("2.2"), Double.valueOf(2.2));
         assertEquals(stringToLong("2"), Long.valueOf(2));