From ebae921a43a9c1b2c176adb9cc26daa3541c7e2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=91=88=E7=86=B9?= Date: Wed, 22 Dec 2021 14:50:48 +0800 Subject: [PATCH] fix order comparator overflow (#1150) --- .../alipay/sofa/rpc/client/RouterChain.java | 4 +- .../alipay/sofa/rpc/common/RpcConfigs.java | 5 +- .../alipay/sofa/rpc/filter/FilterChain.java | 4 +- .../alipay/sofa/rpc/common/SofaConfigs.java | 7 ++- .../rpc/common/struct/OrderedComparator.java | 8 ++- .../common/struct/OrderedComparatorTest.java | 49 ++++++++++++++++++- 6 files changed, 62 insertions(+), 15 deletions(-) diff --git a/core/api/src/main/java/com/alipay/sofa/rpc/client/RouterChain.java b/core/api/src/main/java/com/alipay/sofa/rpc/client/RouterChain.java index c31f6d4f4..41eeb5a69 100644 --- a/core/api/src/main/java/com/alipay/sofa/rpc/client/RouterChain.java +++ b/core/api/src/main/java/com/alipay/sofa/rpc/client/RouterChain.java @@ -17,7 +17,6 @@ package com.alipay.sofa.rpc.client; import com.alipay.sofa.rpc.bootstrap.ConsumerBootstrap; -import com.alipay.sofa.rpc.common.struct.OrderedComparator; import com.alipay.sofa.rpc.common.utils.CommonUtils; import com.alipay.sofa.rpc.common.utils.StringUtils; import com.alipay.sofa.rpc.config.ConsumerConfig; @@ -31,6 +30,7 @@ import com.alipay.sofa.rpc.log.LoggerFactory; import java.util.ArrayList; +import java.util.Comparator; import java.util.LinkedList; import java.util.Collections; import java.util.HashSet; @@ -165,7 +165,7 @@ public static RouterChain buildConsumerChain(ConsumerBootstrap consumerBootstrap excludes = null; // 不需要了 // 按order从小到大排序 if (extensionRouters.size() > 1) { - Collections.sort(extensionRouters, new OrderedComparator()); + extensionRouters.sort(Comparator.comparingInt(ExtensionClass::getOrder)); } List actualRouters = new ArrayList(); for (ExtensionClass extensionRouter : extensionRouters) { diff --git a/core/api/src/main/java/com/alipay/sofa/rpc/common/RpcConfigs.java b/core/api/src/main/java/com/alipay/sofa/rpc/common/RpcConfigs.java index 697886de7..6ef54ec91 100644 --- a/core/api/src/main/java/com/alipay/sofa/rpc/common/RpcConfigs.java +++ b/core/api/src/main/java/com/alipay/sofa/rpc/common/RpcConfigs.java @@ -19,7 +19,6 @@ import com.alipay.sofa.rpc.base.Sortable; import com.alipay.sofa.rpc.common.annotation.JustForTest; import com.alipay.sofa.rpc.common.json.JSON; -import com.alipay.sofa.rpc.common.struct.OrderedComparator; import com.alipay.sofa.rpc.common.utils.ClassLoaderUtils; import com.alipay.sofa.rpc.common.utils.CommonUtils; import com.alipay.sofa.rpc.common.utils.CompatibleTypeUtils; @@ -32,7 +31,7 @@ import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; -import java.util.Collections; +import java.util.Comparator; import java.util.Enumeration; import java.util.HashMap; import java.util.List; @@ -116,7 +115,7 @@ private static void loadCustom(String fileName) throws IOException { } } } - Collections.sort(allFile, new OrderedComparator()); // 从小到大排下序 + allFile.sort(Comparator.comparingInt(CfgFile::getOrder)); for (CfgFile file : allFile) { CFG.putAll(file.getMap()); // 顺序加载,越大越后加载 } diff --git a/core/api/src/main/java/com/alipay/sofa/rpc/filter/FilterChain.java b/core/api/src/main/java/com/alipay/sofa/rpc/filter/FilterChain.java index 70a54de30..9b0e97c20 100644 --- a/core/api/src/main/java/com/alipay/sofa/rpc/filter/FilterChain.java +++ b/core/api/src/main/java/com/alipay/sofa/rpc/filter/FilterChain.java @@ -16,7 +16,6 @@ */ package com.alipay.sofa.rpc.filter; -import com.alipay.sofa.rpc.common.struct.OrderedComparator; import com.alipay.sofa.rpc.common.utils.CommonUtils; import com.alipay.sofa.rpc.common.utils.StringUtils; import com.alipay.sofa.rpc.config.AbstractInterfaceConfig; @@ -36,6 +35,7 @@ import com.alipay.sofa.rpc.log.LoggerFactory; import java.util.ArrayList; +import java.util.Comparator; import java.util.LinkedList; import java.util.Collections; import java.util.HashSet; @@ -214,7 +214,7 @@ private static List selectActualFilters(AbstractInterfaceConfig config, } // 按order从小到大排序 if (extensionFilters.size() > 1) { - Collections.sort(extensionFilters, new OrderedComparator>()); + extensionFilters.sort(Comparator.comparingInt(ExtensionClass::getOrder)); } List actualFilters = new ArrayList(); for (ExtensionClass extensionFilter : extensionFilters) { diff --git a/core/common/src/main/java/com/alipay/sofa/rpc/common/SofaConfigs.java b/core/common/src/main/java/com/alipay/sofa/rpc/common/SofaConfigs.java index fab168330..42d06b3fd 100644 --- a/core/common/src/main/java/com/alipay/sofa/rpc/common/SofaConfigs.java +++ b/core/common/src/main/java/com/alipay/sofa/rpc/common/SofaConfigs.java @@ -17,13 +17,12 @@ package com.alipay.sofa.rpc.common; import com.alipay.sofa.rpc.base.Sortable; -import com.alipay.sofa.rpc.common.struct.OrderedComparator; import com.alipay.sofa.rpc.common.utils.CommonUtils; import com.alipay.sofa.rpc.common.utils.StringUtils; import java.io.InputStream; import java.util.ArrayList; -import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Properties; import java.util.concurrent.locks.Lock; @@ -198,7 +197,7 @@ public static void registerExternalConfigLoader(ExternalConfigLoader configLoade wLock.lock(); try { CONFIG_LOADERS.add(configLoader); - Collections.sort(CONFIG_LOADERS, new OrderedComparator()); + CONFIG_LOADERS.sort(Comparator.comparingInt(ExternalConfigLoader::getOrder)); } finally { wLock.unlock(); } @@ -213,7 +212,7 @@ public static void unRegisterExternalConfigLoader(ExternalConfigLoader configLoa wLock.lock(); try { CONFIG_LOADERS.remove(configLoader); - Collections.sort(CONFIG_LOADERS, new OrderedComparator()); + CONFIG_LOADERS.sort(Comparator.comparingInt(ExternalConfigLoader::getOrder)); } finally { wLock.unlock(); } diff --git a/core/common/src/main/java/com/alipay/sofa/rpc/common/struct/OrderedComparator.java b/core/common/src/main/java/com/alipay/sofa/rpc/common/struct/OrderedComparator.java index 6858fbb07..037662bb9 100644 --- a/core/common/src/main/java/com/alipay/sofa/rpc/common/struct/OrderedComparator.java +++ b/core/common/src/main/java/com/alipay/sofa/rpc/common/struct/OrderedComparator.java @@ -27,6 +27,7 @@ * @param the type parameter * @author GengZhang */ +@Deprecated public class OrderedComparator implements Comparator, Serializable { /** @@ -53,7 +54,10 @@ public OrderedComparator(boolean smallToLarge) { @Override public int compare(T o1, T o2) { // order一样的情况下,顺序不变 - return order ? o1.getOrder() - o2.getOrder() : - o2.getOrder() - o1.getOrder(); + Comparator comparator = Comparator.comparingInt(Sortable::getOrder); + if (!order) { + comparator = comparator.reversed(); + } + return comparator.compare(o1, o2); } } diff --git a/core/common/src/test/java/com/alipay/sofa/rpc/common/struct/OrderedComparatorTest.java b/core/common/src/test/java/com/alipay/sofa/rpc/common/struct/OrderedComparatorTest.java index 218f1bfa5..4163aa7e6 100644 --- a/core/common/src/test/java/com/alipay/sofa/rpc/common/struct/OrderedComparatorTest.java +++ b/core/common/src/test/java/com/alipay/sofa/rpc/common/struct/OrderedComparatorTest.java @@ -22,11 +22,10 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; /** - * - * * @author GengZhang */ public class OrderedComparatorTest { @@ -57,6 +56,52 @@ public void testCompare() throws Exception { Assert.assertEquals(sb.toString(), "agcdbef"); } + @Test + public void testComparatorInt(){ + List list = new ArrayList(); + list.add(new Obj("a", 10)); + list.add(new Obj("b", 2)); + list.add(new Obj("c", 6)); + list.add(new Obj("d", 6)); + list.add(new Obj("e", 0)); + list.add(new Obj("f", -1)); + list.add(new Obj("g", 10)); + + list.sort(Comparator.comparingInt(Obj::getOrder)); + StringBuilder sb = new StringBuilder(); + for (Obj test : list) { + sb.append(test.getName()); + } + Assert.assertEquals(sb.toString(), "febcdag"); + + + list.sort(Comparator.comparingInt(Obj::getOrder).reversed()); + sb = new StringBuilder(); + for (Obj test : list) { + sb.append(test.getName()); + } + Assert.assertEquals(sb.toString(), "agcdbef"); + } + + @Test + public void testOverflow() { + List list = new ArrayList(); + list.add(new Obj("a", Integer.MAX_VALUE)); + list.add(new Obj("b", -100)); + list.add(new Obj("c", 6)); + list.add(new Obj("d", 6)); + list.add(new Obj("e", 0)); + list.add(new Obj("f", Integer.MAX_VALUE)); + list.add(new Obj("g", -10)); + + Collections.sort(list, new OrderedComparator()); + StringBuilder sb = new StringBuilder(); + for (Obj test : list) { + sb.append(test.getName()); + } + Assert.assertEquals(sb.toString(), "bgecdaf"); + } + private static class Obj implements Sortable { private final String name; private final int order;