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

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


The following commit(s) were added to refs/heads/master by this push:
     new 17de673753 [INLONG-11717][SDK] Add out-of-bounds check when in 
getClientByRoundRobin() (#11718)
17de673753 is described below

commit 17de673753e184af146e02aa2279e7663676c609
Author: Goson Zhang <4675...@qq.com>
AuthorDate: Fri Feb 7 11:23:34 2025 +0800

    [INLONG-11717][SDK] Add out-of-bounds check when in getClientByRoundRobin() 
(#11718)
    
    * [INLONG-11717][SDK] Add out-of-bounds check when in 
getClientByRoundRobin()
    
    * [INLONG-11717][SDK] Add out-of-bounds check when in 
getClientByRoundRobin()
    
    ---------
    
    Co-authored-by: gosonzhang <gosonzh...@tencent.com>
---
 .../apache/inlong/sdk/dataproxy/network/DefClientMgr.java   | 13 ++++++++++++-
 .../inlong/sdk/dataproxy/network/tcp/TcpClientMgr.java      | 13 ++++++++++++-
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git 
a/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/network/DefClientMgr.java
 
b/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/network/DefClientMgr.java
index 21167e13cc..cbf63546a0 100644
--- 
a/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/network/DefClientMgr.java
+++ 
b/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/network/DefClientMgr.java
@@ -58,6 +58,7 @@ public class DefClientMgr implements ConfigHolder {
     private static final Logger logger = 
LoggerFactory.getLogger(DefClientMgr.class);
     private static final LogCounter logCounter = new LogCounter(10, 100000, 60 
* 1000L);
     private static final LogCounter updConExptCnt = new LogCounter(10, 100000, 
60 * 1000L);
+    private static final LogCounter indexExptCnt = new LogCounter(10, 100000, 
60 * 1000L);
     private static final LogCounter exptCounter = new LogCounter(10, 100000, 
60 * 1000L);
     private static final byte[] hbMsgBody = 
ProxyUtils.getLocalIp().getBytes(StandardCharsets.UTF_8);
 
@@ -197,6 +198,7 @@ public class DefClientMgr implements ConfigHolder {
         if (curNodeSize == 0) {
             return new Tuple2<>(SendResult.EMPTY_ACTIVE_NODE_SET, null);
         }
+        int indexPos;
         String curNode;
         NettyClient client;
         NettyClient backClient = null;
@@ -204,7 +206,16 @@ public class DefClientMgr implements ConfigHolder {
         int incFlightFailCnt = 0;
         int startPos = reqSendIndex.getAndIncrement();
         for (int step = 0; step < curNodeSize; step++) {
-            curNode = curNodes.get(Math.abs(startPos++) % curNodeSize);
+            startPos = Math.abs(startPos + 1);
+            indexPos = startPos % curNodeSize;
+            if (indexPos >= curNodes.size()) {
+                if (indexExptCnt.shouldPrint()) {
+                    logger.warn("IndexOutOfBounds, startPos={}, 
curNodeSize={}, indexPos={}, realSize={}",
+                            startPos, curNodeSize, indexPos, curNodes.size());
+                }
+                continue;
+            }
+            curNode = curNodes.get(indexPos);
             client = usingClientMaps.get(curNode);
             if (client == null) {
                 nullClientCnt++;
diff --git 
a/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/network/tcp/TcpClientMgr.java
 
b/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/network/tcp/TcpClientMgr.java
index 210b2b109e..5b4bf601c0 100644
--- 
a/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/network/tcp/TcpClientMgr.java
+++ 
b/inlong-sdk/dataproxy-sdk/src/main/java/org/apache/inlong/sdk/dataproxy/network/tcp/TcpClientMgr.java
@@ -67,6 +67,7 @@ public class TcpClientMgr implements ClientMgr {
     private static final Logger logger = 
LoggerFactory.getLogger(TcpClientMgr.class);
     private static final LogCounter sendExceptCnt = new LogCounter(10, 100000, 
60 * 1000L);
     private static final LogCounter updConExptCnt = new LogCounter(10, 100000, 
60 * 1000L);
+    private static final LogCounter indexExptCnt = new LogCounter(10, 100000, 
60 * 1000L);
     private static final LogCounter exptCounter = new LogCounter(10, 100000, 
60 * 1000L);
     private static final LogCounter callbackExceptCnt = new LogCounter(10, 
100000, 60 * 1000L);
     private static final AtomicLong timerRefCnt = new AtomicLong(0);
@@ -326,6 +327,7 @@ public class TcpClientMgr implements ClientMgr {
         if (curNodeSize == 0) {
             return procResult.setFailResult(ErrorCode.EMPTY_ACTIVE_NODE_SET);
         }
+        int indexPos;
         String curNode;
         TcpNettyClient client;
         TcpNettyClient back1thClient = null;
@@ -333,7 +335,16 @@ public class TcpClientMgr implements ClientMgr {
         int unWritableCnt = 0;
         int startPos = reqSendIndex.getAndIncrement();
         for (int step = 0; step < curNodeSize; step++) {
-            curNode = curNodes.get(Math.abs(startPos++) % curNodeSize);
+            startPos = Math.abs(startPos + 1);
+            indexPos = startPos % curNodeSize;
+            if (indexPos >= curNodes.size()) {
+                if (indexExptCnt.shouldPrint()) {
+                    logger.warn("IndexOutOfBounds, startPos={}, 
curNodeSize={}, indexPos={}, realSize={}",
+                            startPos, curNodeSize, indexPos, curNodes.size());
+                }
+                continue;
+            }
+            curNode = curNodes.get(indexPos);
             client = usingClientMaps.get(curNode);
             if (client == null) {
                 nullClientCnt++;

Reply via email to