You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by ma...@apache.org on 2022/07/02 03:14:06 UTC

[pulsar] branch branch-2.9 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.

mattisonchao pushed a commit to branch branch-2.9
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/branch-2.9 by this push:
     new 5234be3d4c1 [improve][broker] Use LinkedHashSet for config items of type Set to preserve elements order (#16138)
5234be3d4c1 is described below

commit 5234be3d4c1f05d84bb20b4ab4e651aa14ccde3b
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)
    
    (cherry picked from commit ca9e4bd6186bdf35280177987ad439492ef5fc55)
---
 .../src/main/java/org/apache/pulsar/common/util/FieldParser.java     | 5 +++--
 .../org/apache/pulsar/common/util/collections/FieldParserTest.java   | 5 +++++
 2 files changed, 8 insertions(+), 2 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 0aa19b272a3..3fd82f03c69 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
@@ -32,6 +32,7 @@ import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -212,7 +213,7 @@ public final class FieldParser {
             if (field.getType().equals(List.class)) {
                 field.set(obj, Lists.newArrayList());
             } else if (field.getType().equals(Set.class)) {
-                field.set(obj, Sets.newHashSet());
+                field.set(obj, new LinkedHashSet<>());
             } else if (field.getType().equals(Optional.class)) {
                 field.set(obj, Optional.empty());
             } else {
@@ -333,7 +334,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 c8a46cb0a15..12d579bd8cd 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));