[
https://issues.apache.org/jira/browse/DRILL-5015?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15703382#comment-15703382
]
ASF GitHub Bot commented on DRILL-5015:
---------------------------------------
Github user sudheeshkatkam commented on a diff in the pull request:
https://github.com/apache/drill/pull/648#discussion_r89902384
--- Diff:
exec/java-exec/src/test/java/org/apache/drill/exec/client/DrillClientTest.java
---
@@ -0,0 +1,258 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.drill.exec.client;
+
+import org.apache.drill.common.config.DrillConfig;
+import org.apache.drill.exec.DrillSystemTestBase;
+import org.apache.drill.exec.ExecConstants;
+import org.apache.drill.exec.proto.CoordinationProtos;
+import org.apache.drill.exec.rpc.InvalidConnectionInfoException;
+import org.junit.Test;
+import java.util.List;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+
+/**
+ * The unit test case will read a physical plan in json format. The
physical plan contains a "trace" operator,
+ * which will produce a dump file. The dump file will be input into
DumpCat to test query mode and batch mode.
+ */
+
+public class DrillClientTest extends DrillSystemTestBase {
+
+ private final DrillConfig config = DrillConfig.create();
+
+ @Test
+ public void testParseAndVerifyEndpointsSingleDrillbitIp() throws
Exception {
+
+ // Test with single drillbit ip
+ final String drillBitConnection = "10.10.100.161";
+ final List<CoordinationProtos.DrillbitEndpoint> endpointsList =
DrillClient.parseAndVerifyEndpoints
+ (drillBitConnection,
config.getString(ExecConstants.INITIAL_USER_PORT));
+ final CoordinationProtos.DrillbitEndpoint endpoint =
endpointsList.get(0);
+ assertEquals(endpointsList.size(), 1);
+ assertEquals(endpoint.getAddress(), drillBitConnection);
+ assertEquals(endpoint.getUserPort(),
config.getInt(ExecConstants.INITIAL_USER_PORT));
+ }
+
+ @Test
+ public void testParseAndVerifyEndpointsSingleDrillbitIpPort() throws
Exception {
+
+ // Test with single drillbit ip:port
+ final String drillBitConnection = "10.10.100.161:5000";
+ final String[] ipAndPort = drillBitConnection.split(":");
+ final List<CoordinationProtos.DrillbitEndpoint> endpointsList =
DrillClient.parseAndVerifyEndpoints
+ (drillBitConnection,
config.getString(ExecConstants.INITIAL_USER_PORT));
+ assertEquals(endpointsList.size(), 1);
+
+ final CoordinationProtos.DrillbitEndpoint endpoint =
endpointsList.get(0);
+ assertEquals(endpoint.getAddress(), ipAndPort[0]);
+ assertEquals(endpoint.getUserPort(), Integer.parseInt(ipAndPort[1]));
+ }
+
+ @Test
+ public void testParseAndVerifyEndpointsMultipleDrillbitIp() throws
Exception {
+
+ // Test with multiple drillbit ip
+ final String drillBitConnection = "10.10.100.161,10.10.100.162";
+ final List<CoordinationProtos.DrillbitEndpoint> endpointsList =
DrillClient.parseAndVerifyEndpoints
+ (drillBitConnection,
config.getString(ExecConstants.INITIAL_USER_PORT));
+ assertEquals(endpointsList.size(), 2);
+
+ CoordinationProtos.DrillbitEndpoint endpoint = endpointsList.get(0);
+ assertEquals(endpoint.getAddress(), "10.10.100.161");
+ assertEquals(endpoint.getUserPort(),
config.getInt(ExecConstants.INITIAL_USER_PORT));
+
+ endpoint = endpointsList.get(1);
+ assertEquals(endpoint.getAddress(), "10.10.100.162");
+ assertEquals(endpoint.getUserPort(),
config.getInt(ExecConstants.INITIAL_USER_PORT));
+ }
+
+ @Test
+ public void testParseAndVerifyEndpointsMultipleDrillbitIpPort() throws
Exception {
+
+ // Test with multiple drillbit ip:port
+ final String drillBitConnection =
"10.10.100.161:5000,10.10.100.162:5000";
+ final List<CoordinationProtos.DrillbitEndpoint> endpointsList =
DrillClient.parseAndVerifyEndpoints
+ (drillBitConnection,
config.getString(ExecConstants.INITIAL_USER_PORT));
+ assertEquals(endpointsList.size(), 2);
+
+ CoordinationProtos.DrillbitEndpoint endpoint = endpointsList.get(0);
+ assertEquals(endpoint.getAddress(), "10.10.100.161");
+ assertEquals(endpoint.getUserPort(), 5000);
+
+ endpoint = endpointsList.get(1);
+ assertEquals(endpoint.getAddress(), "10.10.100.162");
+ assertEquals(endpoint.getUserPort(), 5000);
+ }
+
+ @Test
+ public void testParseAndVerifyEndpointsMultipleDrillbitIpPortIp() throws
Exception {
+
+ // Test with multiple drillbit with mix of ip:port and ip
+ final String drillBitConnection = "10.10.100.161:5000,10.10.100.162";
+ final List<CoordinationProtos.DrillbitEndpoint> endpointsList =
DrillClient.parseAndVerifyEndpoints
+ (drillBitConnection,
config.getString(ExecConstants.INITIAL_USER_PORT));
+ assertEquals(endpointsList.size(), 2);
+
+ CoordinationProtos.DrillbitEndpoint endpoint = endpointsList.get(0);
+ assertEquals(endpoint.getAddress(), "10.10.100.161");
+ assertEquals(endpoint.getUserPort(), 5000);
+
+ endpoint = endpointsList.get(1);
+ assertEquals(endpoint.getAddress(), "10.10.100.162");
+ assertEquals(endpoint.getUserPort(),
config.getInt(ExecConstants.INITIAL_USER_PORT));
+ }
+
+ @Test
+ public void testParseAndVerifyEndpointsEmptyString() throws Exception {
+
+ // Test with empty string
+ final String drillBitConnection = "";
+ try {
+ final List<CoordinationProtos.DrillbitEndpoint> endpointsList =
DrillClient.parseAndVerifyEndpoints
+ (drillBitConnection,
config.getString(ExecConstants.INITIAL_USER_PORT));
+ fail();
+ }catch (InvalidConnectionInfoException e) {
+ System.out.println(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testParseAndVerifyEndpointsOnlyPortDelim() throws Exception{
+ // Test to check when connection string only has delimiter
+ final String drillBitConnection = ":";
+
+ try {
+ final List<CoordinationProtos.DrillbitEndpoint> endpointsList =
DrillClient.parseAndVerifyEndpoints
+ (drillBitConnection,
config.getString(ExecConstants.INITIAL_USER_PORT));
+ fail();
+ }catch (InvalidConnectionInfoException e) {
+ System.out.println(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testParseAndVerifyEndpointsWithOnlyPort() throws Exception{
+ // Test to check when connection string has port with no ip
+ final String drillBitConnection = ":5000";
+
+ try {
+ final List<CoordinationProtos.DrillbitEndpoint> endpointsList =
DrillClient.parseAndVerifyEndpoints
+ (drillBitConnection,
config.getString(ExecConstants.INITIAL_USER_PORT));
+ fail();
+ }catch (InvalidConnectionInfoException e) {
+ System.out.println(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testParseAndVerifyEndpointsWithMultiplePort() throws
Exception{
+ // Test to check when connection string has multiple port with one ip
+ final String drillBitConnection = "10.10.100.161:5000:6000";
+
+ try {
+ final List<CoordinationProtos.DrillbitEndpoint> endpointsList =
DrillClient.parseAndVerifyEndpoints
+ (drillBitConnection,
config.getString(ExecConstants.INITIAL_USER_PORT));
+ fail();
+ }catch (InvalidConnectionInfoException e) {
+ System.out.println(e.getMessage());
+ }
+ }
+
+ @Test
+ public void testParseAndVerifyEndpointsIpWithDelim() throws Exception{
+ // Test to check when connection string has ip with delimiter
+ final String drillBitConnection = "10.10.100.161:";
+ final List<CoordinationProtos.DrillbitEndpoint> endpointsList =
DrillClient.parseAndVerifyEndpoints
+ (drillBitConnection,
config.getString(ExecConstants.INITIAL_USER_PORT));
+ final CoordinationProtos.DrillbitEndpoint endpoint =
endpointsList.get(0);
+ assertEquals(endpointsList.size(), 1);
+ assertEquals(endpoint.getAddress(), "10.10.100.161");
+ assertEquals(endpoint.getUserPort(),
config.getInt(ExecConstants.INITIAL_USER_PORT));
+ }
+
+ @Test
+ public void testParseAndVerifyEndpointsIpWithEmptyPort() throws
Exception{
+ // Test to check when connection string has ip with delimiter
+ final String drillBitConnection = "10.10.100.161: ";
+ final List<CoordinationProtos.DrillbitEndpoint> endpointsList =
DrillClient.parseAndVerifyEndpoints
+ (drillBitConnection,
config.getString(ExecConstants.INITIAL_USER_PORT));
+ final CoordinationProtos.DrillbitEndpoint endpoint =
endpointsList.get(0);
+ assertEquals(endpointsList.size(), 1);
+ assertEquals(endpoint.getAddress(), "10.10.100.161");
+ assertEquals(endpoint.getUserPort(),
config.getInt(ExecConstants.INITIAL_USER_PORT));
+ }
+
+ @Test
+ public void testParseAndVerifyEndpointsIpWithSpaces() throws Exception{
+ // Test to check when connection string has spaces in between
+ final String drillBitConnection = "10.10.100.161 : 5000,
10.10.100.162:6000 ";
+ final List<CoordinationProtos.DrillbitEndpoint> endpointsList =
DrillClient.parseAndVerifyEndpoints
+ (drillBitConnection,
config.getString(ExecConstants.INITIAL_USER_PORT));
+
+ CoordinationProtos.DrillbitEndpoint endpoint = endpointsList.get(0);
+ assertEquals(endpointsList.size(), 2);
+ assertEquals(endpoint.getAddress(), "10.10.100.161");
+ assertEquals(endpoint.getUserPort(), 5000);
+
+ endpoint = endpointsList.get(1);
+ assertEquals(endpoint.getAddress(), "10.10.100.162");
+ assertEquals(endpoint.getUserPort(), 6000);
+ }
+
+ @Test
+ public void testParseAndVerifyEndpointsStringWithSpaces() throws
Exception{
+ // Test to check when connection string has ip with delimiter
+ final String drillBitConnection = "10.10.100.161 : 5000";
+ final List<CoordinationProtos.DrillbitEndpoint> endpointsList =
DrillClient.parseAndVerifyEndpoints
+ (drillBitConnection,
config.getString(ExecConstants.INITIAL_USER_PORT));
+ final CoordinationProtos.DrillbitEndpoint endpoint =
endpointsList.get(0);
+ assertEquals(endpointsList.size(), 1);
+ assertEquals(endpoint.getAddress(), "10.10.100.161");
+ assertEquals(endpoint.getUserPort(), 5000);
+ }
+
+ @Test
+ public void testParseAndVerifyEndpointsNonNumericPort() throws Exception{
+ // Test to check when connection string has non-numeric port
+ final String drillBitConnection = "10.10.100.161:5ab0";
+
+ try{
+ final List<CoordinationProtos.DrillbitEndpoint> endpointsList =
DrillClient.parseAndVerifyEndpoints
+ (drillBitConnection,
config.getString(ExecConstants.INITIAL_USER_PORT));
+ fail();
+ }catch(InvalidConnectionInfoException e){
--- End diff --
spacing fix (all try catch blocks)
> As per documentation, when issuing a list of drillbits in the connection
> string, we always attempt to connect only to the first one
> -----------------------------------------------------------------------------------------------------------------------------------
>
> Key: DRILL-5015
> URL: https://issues.apache.org/jira/browse/DRILL-5015
> Project: Apache Drill
> Issue Type: Bug
> Components: Client - JDBC
> Affects Versions: 1.8.0, 1.9.0
> Reporter: Sorabh Hamirwasia
> Assignee: Sudheesh Katkam
> Labels: ready-to-commit
>
> When trying to connect to a Drill cluster by specifying more than 1 drillbits
> to connect to, we always attempt to connect to only the first drillbit.
> As an example, we tested against a pair of drillbits, but we always connect
> to the first entry in the CSV list by querying for the 'current' drillbit.
> The remaining entries are never attempted.
> [root@pssc-60 agileSqlPerfTests]# /opt/mapr/drill/drill-1.8.0/bin/sqlline -u
> "jdbc:drill:schema=dfs.tmp;drillbit=pssc-61:31010,pssc-62:31010" -f
> whereAmI.q | grep -v logback
> 1/1 select * from sys.drillbits where `current`;
> +-----------------+------------+---------------+------------+----------+
> | hostname | user_port | control_port | data_port | current |
> +-----------------+------------+---------------+------------+----------+
> | pssc-61.qa.lab | 31010 | 31011 | 31012 | true |
> +-----------------+------------+---------------+------------+----------+
> 1 row selected (0.265 seconds)
> Closing: org.apache.drill.jdbc.impl.DrillConnectionImpl
> apache drill 1.8.0
> "a little sql for your nosql"
> This property is meant for use by clients when not wanting to overload the ZK
> for fetching a list of existing Drillbits, but the behaviour doesn't match
> the documentation.
> [Making a Direct Drillbit Connection |
> https://drill.apache.org/docs/using-the-jdbc-driver/#using-the-jdbc-url-format-for-a-direct-drillbit-connection
> ]
> We need to randomly shuffle between this list and If an entry in the shuffled
> list is unreachable, we need to try for the next entry in the list.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)