From 584ed1e84c41c9f2ae2ef4dcdab465084b6d8631 Mon Sep 17 00:00:00 2001 From: HyoungJun Kim Date: Wed, 5 Nov 2014 19:58:38 +0900 Subject: [PATCH] TAJO-1154 - TajoCli doesn't pause while running the non-forwarded query. --- .../tsql/DefaultTajoCliOutputFormatter.java | 6 ++-- .../cli/tsql/commands/DescTableCommand.java | 4 +-- .../org/apache/tajo/client/QueryClient.java | 2 -- .../java/org/apache/tajo/TajoConstants.java | 1 + .../org/apache/tajo/master/GlobalEngine.java | 7 ++-- .../org/apache/tajo/cli/tsql/TestTajoCli.java | 36 +++++++++++++++++++ .../testNonForwardQueryPause.result | 5 +++ 7 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 tajo-core/src/test/resources/results/TestTajoCli/testNonForwardQueryPause.result diff --git a/tajo-client/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java b/tajo-client/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java index 9dd2b1c7e5..8d8c0230ed 100644 --- a/tajo-client/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java +++ b/tajo-client/src/main/java/org/apache/tajo/cli/tsql/DefaultTajoCliOutputFormatter.java @@ -21,9 +21,9 @@ import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.tajo.QueryId; import org.apache.tajo.SessionVars; +import org.apache.tajo.TajoConstants; import org.apache.tajo.catalog.TableDesc; import org.apache.tajo.catalog.statistics.TableStats; -import org.apache.tajo.client.QueryClient; import org.apache.tajo.client.QueryStatus; import org.apache.tajo.util.FileUtil; @@ -56,10 +56,10 @@ private String getQuerySuccessMessage(TableDesc tableDesc, float responseTime, i TableStats stat = tableDesc.getStats(); String volume = stat == null ? (endOfTuple ? "0 B" : "unknown bytes") : FileUtil.humanReadableByteCount(stat.getNumBytes(), false); - long resultRows = stat == null ? QueryClient.UNKNOWN_ROW_NUMBER : stat.getNumRows(); + long resultRows = stat == null ? TajoConstants.UNKNOWN_ROW_NUMBER : stat.getNumRows(); String displayRowNum; - if (resultRows == QueryClient.UNKNOWN_ROW_NUMBER) { + if (resultRows == TajoConstants.UNKNOWN_ROW_NUMBER) { if (endOfTuple) { displayRowNum = totalPrintedRows + " rows"; diff --git a/tajo-client/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java b/tajo-client/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java index 2d4408b4ba..5eebc2be01 100644 --- a/tajo-client/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java +++ b/tajo-client/src/main/java/org/apache/tajo/cli/tsql/commands/DescTableCommand.java @@ -20,11 +20,11 @@ import org.apache.commons.lang.CharUtils; import org.apache.commons.lang.StringEscapeUtils; +import org.apache.tajo.TajoConstants; import org.apache.tajo.catalog.Column; import org.apache.tajo.catalog.TableDesc; import org.apache.tajo.catalog.partition.PartitionMethodDesc; import org.apache.tajo.cli.tsql.TajoCli; -import org.apache.tajo.client.QueryClient; import org.apache.tajo.util.FileUtil; import org.apache.tajo.util.TUtil; @@ -83,7 +83,7 @@ protected String toFormattedString(TableDesc desc) { if (desc.getStats() != null) { long row = desc.getStats().getNumRows(); - String rowText = row == QueryClient.UNKNOWN_ROW_NUMBER ? "unknown" : row + ""; + String rowText = row == TajoConstants.UNKNOWN_ROW_NUMBER ? "unknown" : row + ""; sb.append("number of rows: ").append(rowText).append("\n"); sb.append("volume: ").append( FileUtil.humanReadableByteCount(desc.getStats().getNumBytes(), diff --git a/tajo-client/src/main/java/org/apache/tajo/client/QueryClient.java b/tajo-client/src/main/java/org/apache/tajo/client/QueryClient.java index dbbafb68b7..59ef52b4b7 100644 --- a/tajo-client/src/main/java/org/apache/tajo/client/QueryClient.java +++ b/tajo-client/src/main/java/org/apache/tajo/client/QueryClient.java @@ -34,8 +34,6 @@ public interface QueryClient extends Closeable { - int UNKNOWN_ROW_NUMBER = -1; - public void setSessionId(SessionIdProto sessionId); public boolean isConnected(); diff --git a/tajo-common/src/main/java/org/apache/tajo/TajoConstants.java b/tajo-common/src/main/java/org/apache/tajo/TajoConstants.java index be617830ed..1cc28af662 100644 --- a/tajo-common/src/main/java/org/apache/tajo/TajoConstants.java +++ b/tajo-common/src/main/java/org/apache/tajo/TajoConstants.java @@ -37,6 +37,7 @@ public class TajoConstants { public static final String SYSTEM_HA_DIR_NAME = "ha"; public static final String SYSTEM_HA_ACTIVE_DIR_NAME = "active"; public static final String SYSTEM_HA_BACKUP_DIR_NAME = "backup"; + public static final int UNKNOWN_ROW_NUMBER = -1; private TajoConstants() {} diff --git a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java index f7c7b116cc..9831c0098f 100644 --- a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java +++ b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java @@ -41,7 +41,6 @@ import org.apache.tajo.catalog.partition.PartitionMethodDesc; import org.apache.tajo.catalog.proto.CatalogProtos; import org.apache.tajo.catalog.statistics.TableStats; -import org.apache.tajo.client.QueryClient; import org.apache.tajo.common.TajoDataTypes; import org.apache.tajo.conf.TajoConf; import org.apache.tajo.datum.DatumFactory; @@ -255,6 +254,10 @@ private SubmitQueryResponse executeQueryInternal(QueryContext queryContext, LimitNode limitNode = plan.getRootBlock().getNode(NodeType.LIMIT); maxRow = (int) limitNode.getFetchFirstNum(); } + if (desc.getStats().getNumRows() == 0) { + desc.getStats().setNumRows(TajoConstants.UNKNOWN_ROW_NUMBER); + } + QueryId queryId = QueryIdFactory.newQueryId(context.getResourceManager().getSeedQueryId()); NonForwardQueryResultScanner queryResultScanner = @@ -761,7 +764,7 @@ public TableDesc createTableOnPath(QueryContext queryContext, String tableName, stats.setNumBytes(totalSize); if (isExternal) { // if it is an external table, there is no way to know the exact row number without processing. - stats.setNumRows(QueryClient.UNKNOWN_ROW_NUMBER); + stats.setNumRows(TajoConstants.UNKNOWN_ROW_NUMBER); } TableDesc desc = new TableDesc(CatalogUtil.buildFQName(databaseName, simpleTableName), diff --git a/tajo-core/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java b/tajo-core/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java index c5ff00b4f8..797544f8df 100644 --- a/tajo-core/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java +++ b/tajo-core/src/test/java/org/apache/tajo/cli/tsql/TestTajoCli.java @@ -27,6 +27,7 @@ import org.apache.tajo.SessionVars; import org.apache.tajo.TajoTestingCluster; import org.apache.tajo.TpchTestBase; +import org.apache.tajo.catalog.TableDesc; import org.apache.tajo.cli.tsql.DefaultTajoCliOutputFormatter; import org.apache.tajo.cli.tsql.TajoCli; import org.apache.tajo.client.QueryStatus; @@ -343,6 +344,41 @@ public void testHelpSessionVars() throws Exception { assertOutputResult(new String(out.toByteArray())); } + @Test + public void testNonForwardQueryPause() throws Exception { + final String sql = "select * from default.lineitem"; + try { + TableDesc tableDesc = cluster.getMaster().getCatalog().getTableDesc("default", "lineitem"); + assertNotNull(tableDesc); + assertEquals(0L, tableDesc.getStats().getNumRows().longValue()); + setVar(tajoCli, SessionVars.CLI_PAGE_ROWS, "2"); + setVar(tajoCli, SessionVars.CLI_FORMATTER_CLASS, TajoCliOutputTestFormatter.class.getName()); + Thread t = new Thread() { + public void run() { + try { + tajoCli.executeScript(sql); + } catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } + }; + t.start(); + String consoleResult; + while (true) { + Thread.sleep(3 * 1000); + consoleResult = new String(out.toByteArray()); + if (consoleResult.indexOf("row") >= 0) { + t.interrupt(); + break; + } + } + assertOutputResult(consoleResult); + } finally { + setVar(tajoCli, SessionVars.CLI_PAGE_ROWS, "100"); + } + } + public static class TajoCliOutputTestFormatter extends DefaultTajoCliOutputFormatter { @Override protected String getResponseTimeReadable(float responseTime) { diff --git a/tajo-core/src/test/resources/results/TestTajoCli/testNonForwardQueryPause.result b/tajo-core/src/test/resources/results/TestTajoCli/testNonForwardQueryPause.result new file mode 100644 index 0000000000..e9485d03e9 --- /dev/null +++ b/tajo-core/src/test/resources/results/TestTajoCli/testNonForwardQueryPause.result @@ -0,0 +1,5 @@ +l_orderkey, l_partkey, l_suppkey, l_linenumber, l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate, l_commitdate, l_receiptdate, l_shipinstruct, l_shipmode, l_comment +------------------------------- +1, 1, 7706, 1, 17.0, 21168.23, 0.04, 0.02, N, O, 1996-03-13, 1996-02-12, 1996-03-22, DELIVER IN PERSON, TRUCK, egular courts above the +1, 1, 7311, 2, 36.0, 45983.16, 0.09, 0.06, N, O, 1996-04-12, 1996-02-28, 1996-04-20, TAKE BACK RETURN, MAIL, ly final dependencies: slyly bold +(2 rows, continue... 'q' is quit) \ No newline at end of file