[
https://issues.apache.org/jira/browse/DRILL-5015?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15703384#comment-15703384
]
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_r89902789
--- Diff:
exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java ---
@@ -223,19 +224,100 @@ public void connect(Properties props) throws
RpcException {
connect(null, props);
}
+ /**
+ * Populates the endpointlist with drillbits information provided in the
connection string by client.
+ * For direct connection we can have connection string with drillbit
property as below:
+ * <dl>
+ * <dt>drillbit=ip</dt>
+ * <dd>use the ip specified as the Foreman ip with default port in
config file</dd>
+ * <dt>drillbit=ip:port</dt>
+ * <dd>use the ip and port specified as the Foreman ip and port</dd>
+ * <dt>drillbit=ip1:port1,ip2:port2,...</dt>
+ * <dd>randomly select the ip and port pair from the specified list as
the Foreman ip and port.</dd>
+ * </dl>
+ *
+ * @param drillbits string with drillbit value provided in connection
string
+ * @param defaultUserPort string with default userport of drillbit
specified in config file
+ * @return list of drillbit endpoints parsed from connection string
+ * @throws InvalidConnectionInfoException if the connection string has
invalid or no drillbit information
+ */
+ static List<DrillbitEndpoint> parseAndVerifyEndpoints(String drillbits,
String defaultUserPort)
+ throws InvalidConnectionInfoException {
+ // If no drillbits is provided then throw exception
+ drillbits = drillbits.trim();
+ if (drillbits.isEmpty()) {
+ throw new InvalidConnectionInfoException("No drillbit information
specified in the connection string");
+ }
+
+ ArrayList<DrillbitEndpoint> endpointList = new ArrayList<>();
+ final String[] connectInfo = drillbits.split(",");
+
+ // Fetch ip address and port information for each drillbit and
populate the list
+ for (String drillbit : connectInfo) {
+
+ // Trim all the empty spaces and check if the entry is empty string.
+ // Ignore the empty ones.
+ drillbit = drillbit.trim();
+
+ if (!drillbit.isEmpty()) {
+ // Verify if we have only ":" or only ":port" pattern
+ if (drillbit.charAt(0) == ':') {
+ // Invalid drillbit information
+ throw new InvalidConnectionInfoException("Malformed connection
string with drillbit hostname or " +
+ "hostaddress missing
for an entry: " + drillbit);
+ }
+
+ // We are now sure that each ip:port entry will have both the
values atleast once.
+ // Split each drillbit connection string to get ip address and
port value
+ final String[] drillbitInfo = drillbit.split(":");
+
+ // Check if we have more than one port
+ if (drillbitInfo.length > 2) {
+ throw new InvalidConnectionInfoException("Malformed connection
string with more than one port in a " +
+ "drillbit entry: " +
drillbit);
+ }
+
+ // At this point we are sure that drillbitInfo has atleast
hostname or host address
+ // trim all the empty spaces which might be present in front of
hostname or
+ // host address information
+ final String ipAddress = drillbitInfo[0].trim();
+ String port = defaultUserPort;
+
+ if (drillbitInfo.length == 2) {
+ // We have a port value also given by user. trim all the empty
spaces between : and port value before
+ // validating the correctness of value.
+ port = drillbitInfo[1].trim();
+ }
+
+ try {
+ final DrillbitEndpoint endpoint = DrillbitEndpoint.newBuilder()
+ .setAddress(ipAddress)
+
.setUserPort(Integer.parseInt(port))
+ .build();
+
+ endpointList.add(endpoint);
+ } catch (NumberFormatException e) {
+ throw new InvalidConnectionInfoException("Malformed port value
in entry: " + ipAddress + ":" + port + " " +
+ "passed in connection
string");
+ }
+ }
+ }
+ if(endpointList.size() == 0){
--- End diff --
spacing fix
> 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)