[ 
https://issues.apache.org/jira/browse/DRILL-5015?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15706601#comment-15706601
 ] 

ASF GitHub Bot commented on DRILL-5015:
---------------------------------------

Github user sohami commented on a diff in the pull request:

    https://github.com/apache/drill/pull/648#discussion_r90090906
  
    --- 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 --
    
    fixed


> 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)

Reply via email to