IGNITE-9704: JDBC: round-rodbin distribution of connections between nodes for 
thin driver.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/99b1e2ae
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/99b1e2ae
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/99b1e2ae

Branch: refs/heads/ignite-gg-14206
Commit: 99b1e2aeb188cdd457b31a24f791a31d4a0abd3b
Parents: fe35a64
Author: devozerov <voze...@gridgain.com>
Authored: Wed Sep 26 18:25:33 2018 +0300
Committer: devozerov <voze...@gridgain.com>
Committed: Wed Sep 26 18:25:33 2018 +0300

----------------------------------------------------------------------
 ...JdbcThinConnectionMultipleAddressesTest.java |  2 +-
 .../internal/jdbc/thin/JdbcThinTcpIo.java       | 41 +++++++++++++++-----
 2 files changed, 33 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/99b1e2ae/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionMultipleAddressesTest.java
----------------------------------------------------------------------
diff --git 
a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionMultipleAddressesTest.java
 
b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionMultipleAddressesTest.java
index 12faed7..4f6651c 100644
--- 
a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionMultipleAddressesTest.java
+++ 
b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionMultipleAddressesTest.java
@@ -534,7 +534,7 @@ public class JdbcThinConnectionMultipleAddressesTest 
extends JdbcThinAbstractSel
         else {
             JdbcThinTcpIo io = GridTestUtils.getFieldValue(conn, "cliIo");
 
-            int idx = GridTestUtils.getFieldValue(io, "srvIdx");
+            int idx = io.serverIndex();
 
             stopGrid(idx);
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/99b1e2ae/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java
index 6155423..b065b7a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java
@@ -27,7 +27,8 @@ import java.net.UnknownHostException;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Random;
+import java.util.concurrent.atomic.AtomicLong;
+
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.binary.BinaryReaderExImpl;
 import org.apache.ignite.internal.binary.BinaryWriterExImpl;
@@ -95,7 +96,7 @@ public class JdbcThinTcpIo {
     private static final int QUERY_CLOSE_MSG_SIZE = 9;
 
     /** Random. */
-    private static final Random RND = new Random(U.currentTimeMillis());
+    private static final AtomicLong IDX_GEN = new AtomicLong();
 
     /** Connection properties. */
     private final ConnectionProperties connProps;
@@ -115,9 +116,6 @@ public class JdbcThinTcpIo {
     /** Ignite server version. */
     private IgniteProductVersion igniteVer;
 
-    /** Address index. */
-    private int srvIdx;
-
     /** Ignite server version. */
     private Thread ownThread;
 
@@ -127,6 +125,9 @@ public class JdbcThinTcpIo {
     /** Current protocol version used to connection to Ignite. */
     private ClientListenerProtocolVersion srvProtocolVer;
 
+    /** Server index. */
+    private volatile int srvIdx;
+
     /**
      * Constructor.
      *
@@ -134,9 +135,6 @@ public class JdbcThinTcpIo {
      */
     public JdbcThinTcpIo(ConnectionProperties connProps) {
         this.connProps = connProps;
-
-        // Try to connect to random address then round robin.
-        srvIdx = RND.nextInt(connProps.getAddresses().length);
     }
 
     /**
@@ -172,7 +170,9 @@ public class JdbcThinTcpIo {
 
             HostAndPortRange[] srvs = connProps.getAddresses();
 
-            for (int i = 0; i < srvs.length; i++, srvIdx = (srvIdx + 1) % 
srvs.length) {
+            for (int i = 0; i < srvs.length; i++) {
+                srvIdx = nextServerIndex(srvs.length);
+
                 HostAndPortRange srv = srvs[srvIdx];
 
                 InetAddress[] addrs = getAllAddressesByHost(srv.host());
@@ -652,4 +652,27 @@ public class JdbcThinTcpIo {
 
         return srvProtocolVer.compareTo(VER_2_5_0) >= 0;
     }
+
+    /**
+     * @return Current server index.
+     */
+    public int serverIndex() {
+        return srvIdx;
+    }
+
+    /**
+     * Get next server index.
+     *
+     * @param len Number of servers.
+     * @return Index of the next server to connect to.
+     */
+    private static int nextServerIndex(int len) {
+        if (len == 1)
+            return 0;
+        else {
+            long nextIdx = IDX_GEN.getAndIncrement();
+
+            return (int)(nextIdx % len);
+        }
+    }
 }

Reply via email to