You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2015/03/12 14:24:34 UTC
[1/4] tajo git commit: TAJO-1380: Update JDBC documentation for new
JDBC driver. (Contributed by Dongjoon Hyun, Committed by hyunsik)
Repository: tajo
Updated Branches:
refs/heads/index_support 347571584 -> 292cd9e41
TAJO-1380: Update JDBC documentation for new JDBC driver. (Contributed by Dongjoon Hyun, Committed by hyunsik)
Closes #405
Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/607fdea4
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/607fdea4
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/607fdea4
Branch: refs/heads/index_support
Commit: 607fdea458a0763325727b99ee2a0687b29b5160
Parents: 513a8c3
Author: Hyunsik Choi <hy...@apache.org>
Authored: Wed Mar 11 17:31:11 2015 -0700
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Wed Mar 11 18:07:10 2015 -0700
----------------------------------------------------------------------
CHANGES | 3 +++
tajo-docs/src/main/sphinx/jdbc_driver.rst | 34 +++++++-------------------
2 files changed, 12 insertions(+), 25 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/607fdea4/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 68aabf5..f330a0a 100644
--- a/CHANGES
+++ b/CHANGES
@@ -43,6 +43,9 @@ Release 0.11.0 - unreleased
TASKS
+ TAJO-1380: Update JDBC documentation for new JDBC driver.
+ (Contributed by Dongjoon Hyun, Committed by hyunsik)
+
TAJO-1335: Bump up 0.10.0-SNAPSHOT to 0.11.0-SNAPSHOT in master branch.
(hyunsik)
http://git-wip-us.apache.org/repos/asf/tajo/blob/607fdea4/tajo-docs/src/main/sphinx/jdbc_driver.rst
----------------------------------------------------------------------
diff --git a/tajo-docs/src/main/sphinx/jdbc_driver.rst b/tajo-docs/src/main/sphinx/jdbc_driver.rst
index a2a9a23..6c7371b 100644
--- a/tajo-docs/src/main/sphinx/jdbc_driver.rst
+++ b/tajo-docs/src/main/sphinx/jdbc_driver.rst
@@ -9,11 +9,15 @@ In this section, we explain how to get JDBC driver and an example code.
How to get JDBC driver
=======================
+Direct Download
+--------------------------------
+
+You can directly download a JDBC driver jar file (``tajo-jdbc-x.y.z.jar``) from `Downloads <http://tajo.apache.org/downloads.html>`_.
+
From Binary Distribution
--------------------------------
-Tajo binary distribution provides JDBC jar file and its dependent JAR files.
-Those files are located in ``${TAJO_HOME}/share/jdbc-dist/``.
+Tajo binary distribution provides JDBC jar file located in ``${TAJO_HOME}/share/jdbc-dist/tajo-jdbc-x.y.z.jar``.
From Building Source Code
@@ -25,25 +29,17 @@ You can build Tajo from the source code and then get JAR files as follows:
$ tar xzvf tajo-x.y.z-src.tar.gz
$ mvn clean package -DskipTests -Pdist -Dtar
- $ ls -l tajo-dist/target/tajo-x.y.z/share/jdbc-dist
+ $ ls -l tajo-dist/target/tajo-x.y.z/share/jdbc-dist/tajo-jdbc-x.y.z.jar
Setting the CLASSPATH
=======================
-In order to use the JDBC driver, you should set the jar files included in
-``tajo-dist/target/tajo-x.y.z/share/jdbc-dist`` to your ``CLASSPATH``.
-In addition, you should add hadoop clsspath into your ``CLASSPATH``.
-So, ``CLASSPATH`` will be set as follows:
+In order to use the JDBC driver, you should add ``tajo-jdbc-x.y.z.jar`` in your ``CLASSPATH``.
.. code-block:: bash
- CLASSPATH=path/to/tajo-jdbc/*:path/to/tajo-site.xml:path/to/core-site.xml:path/to/hdfs-site.xml
-
-.. note::
-
- You must add the locations which include Tajo config files (i.e., ``tajo-site.xml``) and
- Hadoop config files (i.e., ``core-site.xml`` and ``hdfs-site.xml``) to your ``CLASSPATH``.
+ CLASSPATH=path/to/tajo-jdbc-x.y.z.jar:$CLASSPATH
An Example JDBC Client
@@ -99,15 +95,3 @@ The following shows an example of JDBC Client.
}
}
-
-FAQ
-===========================================
-
-java.nio.channels.UnresolvedAddressException
---------------------------------------------
-
-When retriving the final result, Tajo JDBC Driver tries to access HDFS data nodes.
-So, the network access between JDBC client and HDFS data nodes must be available.
-In many cases, a HDFS cluster is built in a private network which use private hostnames.
-So, the host names must be shared with the JDBC client side.
-
[3/4] tajo git commit: Merge branch 'master' of
https://git-wip-us.apache.org/repos/asf/tajo into index_support
Posted by ji...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/tajo into index_support
Conflicts:
tajo-cli/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java
Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/9bce0513
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/9bce0513
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/9bce0513
Branch: refs/heads/index_support
Commit: 9bce051354f14be8abc7c3f25f9fdd38766b1523
Parents: e38c48a 4a9da73
Author: Jihoon Son <ji...@apache.org>
Authored: Thu Mar 12 22:23:10 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Thu Mar 12 22:23:10 2015 +0900
----------------------------------------------------------------------
CHANGES | 25 ++
.../apache/tajo/algebra/ExistsPredicate.java | 2 +-
.../tajo/catalog/AbstractCatalogClient.java | 4 +-
.../org/apache/tajo/catalog/CatalogServer.java | 6 +-
.../dictionary/ClusterTableDescriptor.java | 56 +++
.../InfoSchemaMetadataDictionary.java | 5 +-
.../tajo/catalog/store/AbstractDBStore.java | 18 +-
.../java/org/apache/tajo/cli/tsql/TajoCli.java | 61 +--
.../apache/tajo/client/SessionConnection.java | 60 +++
.../main/java/org/apache/tajo/util/TUtil.java | 6 +-
.../org/apache/tajo/engine/parser/SQLParser.g4 | 1 +
.../engine/codegen/ExecutorPreCompiler.java | 2 +-
.../tajo/engine/function/FunctionLoader.java | 2 +-
.../apache/tajo/engine/parser/SQLAnalyzer.java | 4 +-
.../tajo/engine/parser/SQLSyntaxError.java | 17 +-
.../engine/planner/global/GlobalPlanner.java | 2 +-
.../tajo/master/QueryCoordinatorService.java | 2 +-
.../org/apache/tajo/master/QueryInProgress.java | 2 +-
.../org/apache/tajo/master/QueryManager.java | 2 +-
.../java/org/apache/tajo/master/TajoMaster.java | 4 +-
.../NonForwardQueryResultSystemScanner.java | 142 +++++++
.../master/rm/TajoWorkerResourceManager.java | 4 +-
.../apache/tajo/querymaster/QueryMaster.java | 4 +-
.../java/org/apache/tajo/querymaster/Task.java | 2 +-
.../org/apache/tajo/session/SessionManager.java | 2 +-
.../apache/tajo/util/history/HistoryWriter.java | 2 +-
.../tajo/webapp/QueryExecutorServlet.java | 4 +-
.../org/apache/tajo/worker/DeletionService.java | 4 +-
.../tajo/worker/ExecutionBlockContext.java | 2 +-
.../worker/ExecutionBlockSharedResource.java | 2 +-
.../java/org/apache/tajo/worker/Fetcher.java | 6 +-
.../tajo/worker/TajoResourceAllocator.java | 2 +-
.../main/java/org/apache/tajo/worker/Task.java | 2 +-
.../java/org/apache/tajo/worker/TaskRunner.java | 2 +-
.../tajo/worker/WorkerHeartbeatService.java | 2 +-
.../tajo/worker/rule/WorkerRuleProvider.java | 2 +-
.../engine/function/TestDateTimeFunctions.java | 5 +
.../TestNonForwardQueryResultSystemScanner.java | 18 +
tajo-docs/src/main/sphinx/conf.py | 4 +-
tajo-docs/src/main/sphinx/jdbc_driver.rst | 34 +-
.../org/apache/tajo/jdbc/JdbcConnection.java | 4 +-
.../apache/tajo/plan/InvalidQueryException.java | 4 +-
.../org/apache/tajo/plan/LogicalPlanner.java | 2 +-
.../plan/exprrewrite/EvalTreeOptimizer.java | 2 +-
tajo-project/src/site/apt/index.apt | 4 +-
tajo-project/src/site/markdown/downloads.md | 14 +-
.../markdown/releases/0.10.0/announcement.md | 57 +++
.../resources/releases/0.10.0/relnotes.html | 388 +++++++++++++++++++
tajo-project/src/site/site.xml | 45 ++-
.../tajo/pullserver/PullServerAuxService.java | 4 +-
.../apache/tajo/pullserver/PullServerUtil.java | 2 +-
.../tajo/pullserver/TajoPullServerService.java | 4 +-
.../org/apache/tajo/rpc/NettyServerBase.java | 2 +-
.../org/apache/tajo/rpc/RpcConnectionPool.java | 2 +-
.../org/apache/tajo/storage/StorageUtil.java | 30 +-
.../apache/tajo/storage/TestStorageUtil.java | 58 +++
56 files changed, 988 insertions(+), 160 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/9bce0513/tajo-catalog/tajo-catalog-client/src/main/java/org/apache/tajo/catalog/AbstractCatalogClient.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/9bce0513/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
----------------------------------------------------------------------
diff --cc tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
index a2b8eaf,c34b4d2..f31efda
--- a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
+++ b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
@@@ -913,28 -913,10 +913,28 @@@ public class CatalogServer extends Abst
rlock.lock();
try {
- return store.existIndexByColumn(databaseName, tableName, columnName) ?
+ return store.existIndexByColumns(databaseName, tableName,
+ columnNames.toArray(new String[columnNames.size()])) ?
+ ProtoUtil.TRUE : ProtoUtil.FALSE;
+ } catch (Exception e) {
+ LOG.error(e);
+ return BoolProto.newBuilder().setValue(false).build();
+ } finally {
+ rlock.unlock();
+ }
+ }
+
+ @Override
+ public BoolProto existIndexesByTable(RpcController controller, TableIdentifierProto request) throws ServiceException {
+ String databaseName = request.getDatabaseName();
+ String tableName = request.getTableName();
+
+ rlock.lock();
+ try {
+ return store.existIndexesByTable(databaseName, tableName) ?
ProtoUtil.TRUE : ProtoUtil.FALSE;
} catch (Exception e) {
- LOG.error(e);
+ LOG.error(e, e);
return BoolProto.newBuilder().setValue(false).build();
} finally {
rlock.unlock();
http://git-wip-us.apache.org/repos/asf/tajo/blob/9bce0513/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/store/AbstractDBStore.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/9bce0513/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java
----------------------------------------------------------------------
diff --cc tajo-cli/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java
index 1d3682c,354f60d..77d4a9c
--- a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java
+++ b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java
@@@ -492,9 -489,8 +489,8 @@@ public class TajoCli
long startTime = System.currentTimeMillis();
ClientProtos.SubmitQueryResponse response = client.executeQueryWithJson(json);
if (response == null) {
- displayFormatter.printErrorMessage(sout, "response is null");
- wasError = true;
+ onError("response is null", null);
- } else if (response.getResultCode() == ClientProtos.ResultCode.OK) {
+ } else if (response.getResult().getResultCode() == ClientProtos.ResultCode.OK) {
if (response.getIsForwarded()) {
QueryId queryId = new QueryId(response.getQueryId());
waitForQueryCompleted(queryId);
@@@ -507,9 -503,8 +503,8 @@@
}
}
} else {
- if (response.hasErrorMessage()) {
- onError(response.getErrorMessage(), null);
+ if (response.getResult().hasErrorMessage()) {
- displayFormatter.printErrorMessage(sout, response.getResult().getErrorMessage());
- wasError = true;
++ onError(response.getResult().getErrorMessage(), null);
}
}
}
@@@ -529,9 -520,8 +520,8 @@@
}
if (response == null) {
- displayFormatter.printErrorMessage(sout, "response is null");
- wasError = true;
+ onError("response is null", null);
- } else if (response.getResultCode() == ClientProtos.ResultCode.OK) {
+ } else if (response.getResult().getResultCode() == ClientProtos.ResultCode.OK) {
if (response.getIsForwarded()) {
QueryId queryId = new QueryId(response.getQueryId());
waitForQueryCompleted(queryId);
@@@ -543,9 -533,8 +533,8 @@@
}
}
} else {
- if (response.hasErrorMessage()) {
- onError(response.getErrorMessage(), null);
+ if (response.getResult().hasErrorMessage()) {
- displayFormatter.printErrorMessage(sout, response.getResult().getErrorMessage());
- wasError = true;
++ onError(response.getResult().getErrorMessage(), null);
}
}
http://git-wip-us.apache.org/repos/asf/tajo/blob/9bce0513/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
----------------------------------------------------------------------
diff --cc tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
index 4710397,d05d3b1..6052244
--- a/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
@@@ -319,6 -320,65 +320,65 @@@ public class SessionConnection implemen
}
}
+ public boolean reconnect() throws Exception {
+ return new ServerCallable<Boolean>(connPool, getTajoMasterAddr(), TajoMasterClientProtocol.class, false, true) {
+
+ public Boolean call(NettyClientBase client) throws ServiceException {
+ CreateSessionRequest.Builder builder = CreateSessionRequest.newBuilder();
+ builder.setUsername(userInfo.getUserName()).build();
+ if (baseDatabase != null) {
+ builder.setBaseDatabaseName(baseDatabase);
+ }
+
+
+ // create new session
+ TajoMasterClientProtocolService.BlockingInterface tajoMasterService = client.getStub();
+ CreateSessionResponse response = tajoMasterService.createSession(null, builder.build());
- if (response.getResultCode() != ResultCode.OK) {
++ if (response.getResult().getResultCode() != ResultCode.OK) {
+ return false;
+ }
+
+ // Invalidate some session variables in client cache
+ sessionId = response.getSessionId();
+ Map<String, String> sessionVars = ProtoUtil.convertToMap(response.getSessionVars());
+ synchronized (sessionVarsCache) {
+ for (SessionVars var : UPDATE_ON_RECONNECT) {
+ String value = sessionVars.get(var.keyname());
+ if (value != null) {
+ sessionVarsCache.put(var.keyname(), value);
+ }
+ }
+ }
+
+ // Update the session variables in server side
+ try {
+ KeyValueSet keyValueSet = new KeyValueSet();
+ keyValueSet.putAll(sessionVarsCache);
+ ClientProtos.UpdateSessionVariableRequest request = ClientProtos.UpdateSessionVariableRequest.newBuilder()
+ .setSessionId(sessionId)
+ .setSessionVars(keyValueSet.getProto()).build();
+
- if (tajoMasterService.updateSessionVariables(null, request).getResultCode() != ResultCode.OK) {
++ if (tajoMasterService.updateSessionVariables(null, request).getResult().getResultCode() != ResultCode.OK) {
+ tajoMasterService.removeSession(null, sessionId);
+ return false;
+ }
+ LOG.info(String.format("Reconnected to session %s as a user '%s'.", sessionId.getId(), userInfo.getUserName()));
+ return true;
+ } catch (ServiceException e) {
+ tajoMasterService.removeSession(null, sessionId);
+ return false;
+ }
+ }
+ }.withRetries();
+ }
+
+ /**
+ * Session variables which should be updated upon reconnecting
+ */
+ private static final SessionVars[] UPDATE_ON_RECONNECT = new SessionVars[] {
+ SessionVars.SESSION_ID, SessionVars.SESSION_LAST_ACCESS_TIME, SessionVars.CLIENT_HOST
+ };
+
ClientProtos.SessionedStringProto convertSessionedString(String str) {
ClientProtos.SessionedStringProto.Builder builder = ClientProtos.SessionedStringProto.newBuilder();
builder.setSessionId(sessionId);
http://git-wip-us.apache.org/repos/asf/tajo/blob/9bce0513/tajo-common/src/main/java/org/apache/tajo/util/TUtil.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/9bce0513/tajo-core/src/main/antlr4/org/apache/tajo/engine/parser/SQLParser.g4
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/9bce0513/tajo-core/src/main/java/org/apache/tajo/engine/codegen/ExecutorPreCompiler.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/9bce0513/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/9bce0513/tajo-core/src/main/java/org/apache/tajo/engine/planner/global/GlobalPlanner.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/9bce0513/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultSystemScanner.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/9bce0513/tajo-core/src/main/java/org/apache/tajo/webapp/QueryExecutorServlet.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/9bce0513/tajo-core/src/main/java/org/apache/tajo/worker/Task.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/9bce0513/tajo-plan/src/main/java/org/apache/tajo/plan/LogicalPlanner.java
----------------------------------------------------------------------
[4/4] tajo git commit: Merge branch 'index_support' of
https://git-wip-us.apache.org/repos/asf/tajo into index_support
Posted by ji...@apache.org.
Merge branch 'index_support' of https://git-wip-us.apache.org/repos/asf/tajo into index_support
Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/292cd9e4
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/292cd9e4
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/292cd9e4
Branch: refs/heads/index_support
Commit: 292cd9e41e12f5514b4570d2a3bf495ba115ff15
Parents: 9bce051 3475715
Author: Jihoon Son <ji...@apache.org>
Authored: Thu Mar 12 22:24:16 2015 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Thu Mar 12 22:24:16 2015 +0900
----------------------------------------------------------------------
----------------------------------------------------------------------
[2/4] tajo git commit: TAJO-1394 Support reconnect on tsql.
Posted by ji...@apache.org.
TAJO-1394 Support reconnect on tsql.
closes #414
Signed-off-by: Hyunsik Choi <hy...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/4a9da73c
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/4a9da73c
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/4a9da73c
Branch: refs/heads/index_support
Commit: 4a9da73c6cc6ff670f867c13d60dd951bf8190bc
Parents: 607fdea
Author: navis.ryu <na...@apache.org>
Authored: Thu Mar 12 10:57:53 2015 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Thu Mar 12 02:46:09 2015 -0700
----------------------------------------------------------------------
CHANGES | 3 +
.../java/org/apache/tajo/cli/tsql/TajoCli.java | 61 +++++++++++---------
.../apache/tajo/client/SessionConnection.java | 60 +++++++++++++++++++
3 files changed, 97 insertions(+), 27 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tajo/blob/4a9da73c/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index f330a0a..39f0fc4 100644
--- a/CHANGES
+++ b/CHANGES
@@ -9,6 +9,9 @@ Release 0.11.0 - unreleased
IMPROVEMENT
+ TAJO-1394: Support reconnect on tsql.
+ (Contributed by navis, Committed by hyunsik)
+
TAJO-527: Upgrade to Netty 4. (jihun)
TAJO-1369: Some stack trace information is missed in error/fail logging.
http://git-wip-us.apache.org/repos/asf/tajo/blob/4a9da73c/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java
----------------------------------------------------------------------
diff --git a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java
index 7d7d0bd..354f60d 100644
--- a/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java
+++ b/tajo-cli/src/main/java/org/apache/tajo/cli/tsql/TajoCli.java
@@ -41,10 +41,7 @@ import java.io.*;
import java.lang.reflect.Constructor;
import java.sql.ResultSet;
import java.sql.SQLException;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
+import java.util.*;
public class TajoCli {
public static final String ERROR_PREFIX = "ERROR: ";
@@ -60,6 +57,8 @@ public class TajoCli {
private final PrintWriter sout;
private TajoFileHistory history;
+ private final boolean reconnect; // reconnect on invalid session
+
// Current States
private String currentDatabase;
@@ -99,6 +98,7 @@ public class TajoCli {
options.addOption("B", "background", false, "execute as background process");
options.addOption("conf", "conf", true, "configuration value");
options.addOption("param", "param", true, "parameter value in SQL file");
+ options.addOption("reconnect", "reconnect", false, "reconnect on invalid session");
options.addOption("help", "help", false, "help");
}
@@ -208,6 +208,8 @@ public class TajoCli {
processConfVarCommand(cmd.getOptionValues("conf"));
}
+ this.reconnect = cmd.hasOption("reconnect");
+
// if there is no "-h" option,
if(hostName == null) {
if (conf.getVar(ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS) != null) {
@@ -467,13 +469,8 @@ public class TajoCli {
try {
invoked.invoke(arguments);
- } catch (IllegalArgumentException ige) {
- displayFormatter.printErrorMessage(sout, ige);
- wasError = true;
- return -1;
} catch (Exception e) {
- displayFormatter.printErrorMessage(sout, e);
- wasError = true;
+ onError(null, e);
return -1;
} finally {
context.getOutput().flush();
@@ -492,8 +489,7 @@ public class TajoCli {
long startTime = System.currentTimeMillis();
ClientProtos.SubmitQueryResponse response = client.executeQueryWithJson(json);
if (response == null) {
- displayFormatter.printErrorMessage(sout, "response is null");
- wasError = true;
+ onError("response is null", null);
} else if (response.getResultCode() == ClientProtos.ResultCode.OK) {
if (response.getIsForwarded()) {
QueryId queryId = new QueryId(response.getQueryId());
@@ -508,8 +504,7 @@ public class TajoCli {
}
} else {
if (response.hasErrorMessage()) {
- displayFormatter.printErrorMessage(sout, response.getErrorMessage());
- wasError = true;
+ onError(response.getErrorMessage(), null);
}
}
}
@@ -520,17 +515,12 @@ public class TajoCli {
ClientProtos.SubmitQueryResponse response = null;
try{
response = client.executeQuery(statement);
- } catch (ServiceException e){
- displayFormatter.printErrorMessage(sout, e.getMessage());
- wasError = true;
} catch(Throwable te){
- displayFormatter.printErrorMessage(sout, te);
- wasError = true;
+ onError(null, te);
}
if (response == null) {
- displayFormatter.printErrorMessage(sout, "response is null");
- wasError = true;
+ onError("response is null", null);
} else if (response.getResultCode() == ClientProtos.ResultCode.OK) {
if (response.getIsForwarded()) {
QueryId queryId = new QueryId(response.getQueryId());
@@ -544,8 +534,7 @@ public class TajoCli {
}
} else {
if (response.hasErrorMessage()) {
- displayFormatter.printErrorMessage(sout, response.getErrorMessage());
- wasError = true;
+ onError(response.getErrorMessage(), null);
}
}
@@ -569,13 +558,13 @@ public class TajoCli {
displayFormatter.printResult(sout, sin, desc, responseTime, res);
}
} catch (Throwable t) {
- displayFormatter.printErrorMessage(sout, t);
- wasError = true;
+ onError(null, t);
} finally {
if (res != null) {
try {
res.close();
} catch (SQLException e) {
+ // ignore
}
}
}
@@ -637,8 +626,7 @@ public class TajoCli {
}
}
} catch (Throwable t) {
- displayFormatter.printErrorMessage(sout, t);
- wasError = true;
+ onError(null, t);
} finally {
if (res != null) {
try {
@@ -668,6 +656,25 @@ public class TajoCli {
sout.println("Invalid command " + command + ". Try \\? for help.");
}
+ private void onError(String message, Throwable t) {
+ wasError = true;
+ if (t == null) {
+ displayFormatter.printErrorMessage(sout, message);
+ } else {
+ displayFormatter.printErrorMessage(sout, t);
+ }
+ if (reconnect && (t instanceof InvalidClientSessionException ||
+ (message != null && message.startsWith("org.apache.tajo.session.InvalidSessionException")))) {
+ if (client instanceof SessionConnection) {
+ try {
+ ((SessionConnection)client).reconnect();
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+ }
+ }
+
@VisibleForTesting
public void close() {
//for testcase
http://git-wip-us.apache.org/repos/asf/tajo/blob/4a9da73c/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java b/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
index bcf6d8b..d05d3b1 100644
--- a/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
+++ b/tajo-client/src/main/java/org/apache/tajo/client/SessionConnection.java
@@ -21,6 +21,7 @@ package org.apache.tajo.client;
import com.google.protobuf.ServiceException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.tajo.SessionVars;
import org.apache.tajo.TajoIdProtos;
import org.apache.tajo.annotation.Nullable;
import org.apache.tajo.auth.UserRoleInfo;
@@ -319,6 +320,65 @@ public class SessionConnection implements Closeable {
}
}
+ public boolean reconnect() throws Exception {
+ return new ServerCallable<Boolean>(connPool, getTajoMasterAddr(), TajoMasterClientProtocol.class, false, true) {
+
+ public Boolean call(NettyClientBase client) throws ServiceException {
+ CreateSessionRequest.Builder builder = CreateSessionRequest.newBuilder();
+ builder.setUsername(userInfo.getUserName()).build();
+ if (baseDatabase != null) {
+ builder.setBaseDatabaseName(baseDatabase);
+ }
+
+
+ // create new session
+ TajoMasterClientProtocolService.BlockingInterface tajoMasterService = client.getStub();
+ CreateSessionResponse response = tajoMasterService.createSession(null, builder.build());
+ if (response.getResultCode() != ResultCode.OK) {
+ return false;
+ }
+
+ // Invalidate some session variables in client cache
+ sessionId = response.getSessionId();
+ Map<String, String> sessionVars = ProtoUtil.convertToMap(response.getSessionVars());
+ synchronized (sessionVarsCache) {
+ for (SessionVars var : UPDATE_ON_RECONNECT) {
+ String value = sessionVars.get(var.keyname());
+ if (value != null) {
+ sessionVarsCache.put(var.keyname(), value);
+ }
+ }
+ }
+
+ // Update the session variables in server side
+ try {
+ KeyValueSet keyValueSet = new KeyValueSet();
+ keyValueSet.putAll(sessionVarsCache);
+ ClientProtos.UpdateSessionVariableRequest request = ClientProtos.UpdateSessionVariableRequest.newBuilder()
+ .setSessionId(sessionId)
+ .setSessionVars(keyValueSet.getProto()).build();
+
+ if (tajoMasterService.updateSessionVariables(null, request).getResultCode() != ResultCode.OK) {
+ tajoMasterService.removeSession(null, sessionId);
+ return false;
+ }
+ LOG.info(String.format("Reconnected to session %s as a user '%s'.", sessionId.getId(), userInfo.getUserName()));
+ return true;
+ } catch (ServiceException e) {
+ tajoMasterService.removeSession(null, sessionId);
+ return false;
+ }
+ }
+ }.withRetries();
+ }
+
+ /**
+ * Session variables which should be updated upon reconnecting
+ */
+ private static final SessionVars[] UPDATE_ON_RECONNECT = new SessionVars[] {
+ SessionVars.SESSION_ID, SessionVars.SESSION_LAST_ACCESS_TIME, SessionVars.CLIENT_HOST
+ };
+
ClientProtos.SessionedStringProto convertSessionedString(String str) {
ClientProtos.SessionedStringProto.Builder builder = ClientProtos.SessionedStringProto.newBuilder();
builder.setSessionId(sessionId);