http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-common/src/main/proto/errors.proto ---------------------------------------------------------------------- diff --git a/tajo-common/src/main/proto/errors.proto b/tajo-common/src/main/proto/errors.proto new file mode 100644 index 0000000..1ad9c85 --- /dev/null +++ b/tajo-common/src/main/proto/errors.proto @@ -0,0 +1,330 @@ +/** + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 tajo.error; +option java_package = "org.apache.tajo.error"; + +import "stacktrace.proto"; + +// Unstable - this is still evolving. + + +// SQLState Class values that begin with 0, 1, 2, 3, 4, A, B, C, D, E, F, G or H +// are called "standard-defined classes". This is borrowed from PostgreSQL and IBM DB2. + +// 00 - Successful Completion +// 01 - Warning +// 02 - No Data +// 07 - Dynamic SQL Error +// 08 - Connection Exception +// 09 - Triggered Action Exception +// 0A - Feature Not Supported +// 0D - Invalid Target Type Specification +// 0F - Invalid Token +// 0K - Invalid RESIGNAL Statement +// 0N - SQL/XML mapping error +// 20 - Case Not Found for CASE Statement +// 21 - Cardinality Violation +// 22 - Data Exception +// 23 - Constraint Violation +// 24 - Invalid Cursor State +// 25 - Invalid Transaction State +// 26 - Invalid SQL Statement Identifier +// 28 - Invalid Authorization Specification +// 2D - Invalid Transaction Termination +// 2E - Invalid Connection Name +// 34 - Invalid Cursor Name +// 36 - Cursor Sensitivity Exception +// 38 - External Function Exception +// 39 - External Function Call Exception +// 3B - Invalid SAVEPOINT +// 40 - Transaction Rollback +// 42 - Syntax Error or Access Rule Violation +// 44 - WITH CHECK OPTION Violation +// 46 - Java DDL +// 51 - Invalid Application State +// 53 - Invalid Operand or Inconsistent Specification +// 54 - SQL or Product Limit Exceeded +// 55 - Object Not in Prerequisite State +// 56 - Miscellaneous SQL or Product Error +// 57 - Resource Not Available or Operator Intervention +// 58 - System Error + +enum ResultCode { + // Class + // 00 - Successful Completion + OK = 0; + + WARNING = 100; // Warning + + // General Errors + INTERNAL_ERROR = 201; // Error caused by internal bugs (See also TajoInternalException.java) + NOT_IMPLEMENTED = 202; // Planned, but not implemented yet. + FEATURE_NOT_SUPPORTED = 203; // SQLState: 0A000 - Unsupported feature (usually for unreasonable feature) + INVALID_RPC_CALL = 204; // When invalid RPC call is invoked (e.g., wrong message and absent fields) + + // Query Management and Scheduler + NO_SUCH_QUERYID = 301; // No query id in TajoMaster + NO_DATA = 302; // No data due to query fail or error + INCOMPLETE_QUERY = 303; // It occurs when a client requests something of a completed query. + + // Session + INVALID_SESSION = 401; // Session already was invalid + NO_SUCH_SESSION_VARIABLE = 402; // Session variable not found + INVALID_SESSION_VARIABLE = 403; // Session variable is invalid (type mismatch or out of range) + + // Data Exception (SQLState Class - 22) + DIVISION_BY_ZERO = 451; // SQLState: 22012 - Division by zero + + + // Section: Class 42 - Syntax Error or Access Rule Violation + SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION = 501; // SQLState: 42000 + SYNTAX_ERROR = 502; // SQLState: 42601 + INSUFFICIENT_PRIVILEGE = 503; // SQLState: 42501 + + UNDEFINED_TABLESPACE = 511; // ? + UNDEFINED_DATABASE = 512; // ? + UNDEFINED_SCHEMA = 513; // ? + UNDEFINED_TABLE = 514; // ? + UNDEFINED_COLUMN = 515; // SQLState: 42703 + UNDEFINED_FUNCTION = 516; // SQLState: 42883 + UNDEFINED_INDEX = 517; // ? + UNDEFINED_INDEX_NAME = 518; // ? + UNDEFINED_PARTITION = 519; // ? + UNDEFINED_PARTITION_METHOD = 520; // ? + UNDEFINED_OPERATOR = 521; // SQLState: 42883 (=UNDEFINED_FUNCTION) + + DUPLICATE_TABLESPACE = 531; + DUPLICATE_DATABASE = 532; // SQLState: 42P04 + DUPLICATE_SCHEMA = 533; // SQLState: 42P06 + DUPLICATE_TABLE = 534; // SQLState: 42P07 + DUPLICATE_COLUMN = 535; // SQLState: 42701 + DUPLICATE_ALIAS = 536; // SQLState: 42712 + DUPLICATE_FUNCTION = 537; // SQLState: 42723 + DUPLICATE_INDEX = 538; // SQLState: ? + DUPLICATE_PARTITION = 539; // SQLState: ? + + AMBIGUOUS_TABLE = 541; // ? + AMBIGUOUS_COLUMN = 542; // SQLState: 42702; + AMBIGUOUS_FUNCTION = 543; // SQLState: 42725; + + CANNOT_CAST = 601; // SQLState: 42846 - Cast from source type to target type is not supported. + GROUPING_ERROR = 602; // SQLState: 42803 + WINDOWING_ERROR = 603; // SQLState: 42P20 - PgSQL implementation-defined + INVALID_RECURSION = 604; // SQLState: 42P19 - PgSQL implementation-defined + SET_OPERATION_SCHEMA_MISMATCH = 605; // SQLState: 42601 (=SYNTAX_ERROR) + SET_OPERATION_DATATYPE_MISMATCH = 606; // SQLState: 42601 (=SYNTAX_ERROR) + INVALID_FOREIGN_KEY = 621; // SQLState: 42830 + INVALID_NAME = 622; // SQLState: 42602 + INVALID_COLUMN_DEFINITION = 623; // SQLState: 42611 + NAME_TOO_LONG = 624; // SQLState: 42622 + RESERVED_NAME = 625; // SQLState: 42939 + DATATYPE_MISMATCH = 626; // SQLState: 42804 + INDETERMINATE_DATATYPE = 627; // SQLState: 42P18 - PgSQL implementation -defined + + + + // Expressions + INVALID_EXPRESSION = 701; + INVALID_CAST = 702; + INVALID_DATATYPE = 703; + + NUMERIC_OVERFLOW = 803; // Numeric value overflow + VALUE_LARGER_THAN_PRECISION = 804; // Value larger than column precision + + // Meta Catalog + CAT_UPGRADE_REQUIRED = 901; // Migration + CAT_CANNOT_CONNECT = 902; // Cannot connect metadata server + + // MetaData Connector (MDC) + MDC_NO_MATCHED_DATATYPE = 910; // No matched data type between Tajo and connector + + // Storage and Data Format + UNKNOWN_DATAFORMAT = 1001; // Unknown Data Format + + + CLIENT_CONNECTION_EXCEPTION = 1101; // SQLState: 08000 - Client connection error + CLIENT_UNABLE_TO_ESTABLISH_CONNECTION = 1102; // SQLState: 08001 - + CLIENT_PROTOCOL_PROTOCOL_VIOLATION = 1103; // SQLState: ? + + // 53 - Invalid Operand or Inconsistent Specification + INSUFFICIENT_RESOURCE = 53000; + DISK_FULL = 53100; + OUT_OF_MEMORY = 53200; + + // 54 - SQL or Product Limit Exceeded + PROGRAM_LIMIT_EXCEEDED = 54000; + STATEMENT_TOO_COMPLEX = 54001; + STRING_CONSTANT_TOOL_LONG = 54002; + + TOO_MANY_TABLES = 54004; + TOO_MANY_COLUMNS = 54011; + TOO_MANY_ARGUMENTS = 54023; + + // 55 - Object Not in Prerequisite State + // 56 - Miscellaneous SQL or Product Error + // 57 - Resource Not Available or Operator Intervention + + // 58 - System Error + IO_ERROR = 58030; + + + // underlying system errors based on errno.h. + EPERM = 10001; // Operation not permitted + ENOENT = 10002; // No such file or directory + ESRCH = 10003; // No such process + EINTR = 10004; // Interrupted system call + EIO = 10005; // I/O error + ENXIO = 10006; // No such device or address + E2BIG = 10007; // Argument list too long + ENOEXEC = 10008; // Exec format error + EBADF = 10009; // Bad file number + ECHILD = 10010; // No child processes + EAGAIN = 10011; // Try again + ENOMEM = 10012; // Out of memory + EACCES = 10013; // Permission denied + EFAULT = 10014; // Bad address + ENOTBLK = 10015; // Block device required + EBUSY = 10016; // Device or resource busy + EEXIST = 10017; // File exists + EXDEV = 10018; // Cross-device link + ENODEV = 10019; // No such device + ENOTDIR = 10020; // Not a directory + EISDIR = 10021; // Is a directory + EINVAL = 10022; // Invalid argument + ENFILE = 10023; // File table overflow + EMFILE = 10024; // Too many open files + ENOTTY = 10025; // Not a typewriter + ETXTBSY = 10026; // Text file busy + EFBIG = 10027; // File too large + ENOSPC = 10028; // No space left on device + ESPIPE = 10029; // Illegal seek + EROFS = 10030; // Read-only file system + EMLINK = 10031; // Too many links + EPIPE = 10032; // Broken pipe + EDOM = 10033; // Math argument out of domain of func + ERANGE = 10034; // Math result not representable +; + EDEADLK = 10035; // Resource deadlock would occur + ENAMETOOLONG = 10036; // File name too long + ENOLCK = 10037; // No record locks available + ENOSYS = 10038; // Function not implemented + ENOTEMPTY = 10039; // Directory not empty + ELOOP = 10040; // Too many symbolic links encountered + // EWOULDBLOCK = EAGAIN // Operation would block + ENOMSG = 10042; // No message of desired type + EIDRM = 10043; // Identifier removed + ECHRNG = 10044; // Channel number out of range + EL2NSYNC = 10045; // Level 2 not synchronized + EL3HLT = 10046; // Level 3 halted + EL3RST = 10047; // Level 3 reset + ELNRNG = 10048; // Link number out of range + EUNATCH = 10049; // Protocol driver not attached + ENOCSI = 10050; // No CSI structure available + EL2HLT = 10051; // Level 2 halted + EBADE = 10052; // Invalid exchange + EBADR = 10053; // Invalid request descriptor + EXFULL = 10054; // Exchange full + ENOANO = 10055; // No anode + EBADRQC = 10056; // Invalid request code + EBADSLT = 10057; // Invalid slot + // EDEADLOCK = EDEADLK + EBFONT = 10059; // Bad font file format + ENOSTR = 10060; // Device not a stream + ENODATA = 10061; // No data available + ETIME = 10062; // Timer expired + ENOSR = 10063; // Out of streams resources + ENONET = 10064; // Machine is not on the network + ENOPKG = 10065; // Package not installed + EREMOTE = 10066; // Object is remote + ENOLINK = 10067; // Link has been severed + EADV = 10068; // Advertise error + ESRMNT = 10069; // Srmount error + ECOMM = 10070; // Communication error on send + EPROTO = 10071; // Protocol error + EMULTIHOP = 10072; // Multihop attempted + EDOTDOT = 10073; // RFS specific error + EBADMSG = 10074; // Not a data message + EOVERFLOW = 10075; // Value too large for defined data type + ENOTUNIQ = 10076; // Name not unique on network + EBADFD = 10077; // File descriptor in bad state + EREMCHG = 10078; // Remote address changed + ELIBACC = 10079; // Can not access a needed shared library + ELIBBAD = 10080; // Accessing a corrupted shared library + ELIBSCN = 10081; // .lib section in a.out corrupted + ELIBMAX = 10082; // Attempting to link in too many shared libraries + ELIBEXEC = 10083; // Cannot exec a shared library directly + EILSEQ = 10084; // Illegal byte sequence + ERESTART = 10085; // Interrupted system call should be restarted + ESTRPIPE = 10086; // Streams pipe error + EUSERS = 10087; // Too many users + ENOTSOCK = 10088; // Socket operation on non-socket + EDESTADDRREQ = 10089; // Destination address required + EMSGSIZE = 10090; // Message too long + EPROTOTYPE = 10091; // Protocol wrong type for socket + ENOPROTOOPT = 10092; // Protocol not available + EPROTONOSUPPORT = 10093; // Protocol not supported + ESOCKTNOSUPPORT = 10094; // Socket type not supported + EOPNOTSUPP = 10095; // Operation not supported on transport endpoint + EPFNOSUPPORT = 10096; // Protocol family not supported + EAFNOSUPPORT = 10097; // Address family not supported by protocol + EADDRINUSE = 10098; // Address already in use + EADDRNOTAVAIL = 10099; // Cannot assign requested address + ENETDOWN = 10100; // Network is down + ENETUNREACH = 10101; // Network is unreachable + ENETRESET = 10102; // Network dropped connection because of reset + ECONNABORTED = 10103; // Software caused connection abort + ECONNRESET = 10104; // Connection reset by peer + ENOBUFS = 10105; // No buffer space available + EISCONN = 10106; // Transport endpoint is already connected + ENOTCONN = 10107; // Transport endpoint is not connected + ESHUTDOWN = 10108; // Cannot send after transport endpoint shutdown + ETOOMANYREFS = 10109; // Too many references: cannot splice + ETIMEDOUT = 10110; // Connection timed out + ECONNREFUSED = 10111; // Connection refused + EHOSTDOWN = 10112; // Host is down + EHOSTUNREACH = 10113; // No route to host + EALREADY = 10114; // Operation already in progress + EINPROGRESS = 10115; // Operation now in progress + ESTALE = 10116; // Stale NFS file handle + EUCLEAN = 10117; // Structure needs cleaning + ENOTNAM = 10118; // Not a XENIX named type file + ENAVAIL = 10119; // No XENIX semaphores available + EISNAM = 10120; // Is a named type file + EREMOTEIO = 10121; // Remote I/O error + EDQUOT = 10122; // Quota exceeded + ENOMEDIUM = 10123; // No medium found + EMEDIUMTYPE = 10124; // Wrong medium type + ECANCELED = 10125; // Operation Canceled + ENOKEY = 10126; // Required key not available + EKEYEXPIRED = 10127; // Key has expired + EKEYREVOKED = 10128; // Key has been revoked + EKEYREJECTED = 10129; // Key was rejected by service + + // for robust mutexes + EOWNERDEAD = 10130; // Owner died + ENOTRECOVERABLE = 10131; // State not recoverable +} + +message SerializedException { + required int64 timestamp = 1; // Microseconds since Epoch. + required ResultCode return_code = 2; + required string message = 3; + + optional StackTrace stack_trace = 4; +} \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-common/src/main/proto/stacktrace.proto ---------------------------------------------------------------------- diff --git a/tajo-common/src/main/proto/stacktrace.proto b/tajo-common/src/main/proto/stacktrace.proto new file mode 100644 index 0000000..04dca13 --- /dev/null +++ b/tajo-common/src/main/proto/stacktrace.proto @@ -0,0 +1,33 @@ +/** + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +// Copyright 2011 Google Inc. All Rights Reserved. +// Support for serializing stack traces. + +package tajo.error; +option java_package = "org.apache.tajo.error"; + +message StackTrace { + message Element { + optional string function = 1; + optional string filename = 2; + optional int32 line = 3 [default = -1]; + optional string context = 4; + } + repeated Element element = 1; +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java ---------------------------------------------------------------------- diff --git a/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java b/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java index 884ad8f..baac91c 100644 --- a/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java +++ b/tajo-common/src/test/java/org/apache/tajo/common/type/TestIPv4.java @@ -19,7 +19,7 @@ package org.apache.tajo.common.type; import org.junit.Test; -import org.apache.tajo.common.exception.InvalidAddressException; +import org.apache.tajo.exception.InvalidAddressException; import static org.junit.Assert.*; http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/benchmark/BenchmarkSet.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/benchmark/BenchmarkSet.java b/tajo-core/src/main/java/org/apache/tajo/benchmark/BenchmarkSet.java index 6c02dc5..b4a28db 100644 --- a/tajo-core/src/main/java/org/apache/tajo/benchmark/BenchmarkSet.java +++ b/tajo-core/src/main/java/org/apache/tajo/benchmark/BenchmarkSet.java @@ -35,6 +35,7 @@ import org.apache.tajo.util.FileUtil; import java.io.File; import java.io.IOException; import java.net.InetSocketAddress; +import java.sql.SQLException; import java.util.HashMap; import java.util.Map; @@ -45,7 +46,7 @@ public abstract class BenchmarkSet { protected Map<String, String> queries = new HashMap<String, String>(); protected String dataDir; - public void init(TajoConf conf, String dataDir) throws IOException { + public void init(TajoConf conf, String dataDir) throws SQLException { this.dataDir = dataDir; if (System.getProperty(ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS.varname) != null) { @@ -90,7 +91,7 @@ public abstract class BenchmarkSet { public abstract void loadQueries() throws IOException; - public abstract void loadTables() throws ServiceException; + public abstract void loadTables() throws SQLException; public String [] getTableNames() { return schemas.keySet().toArray(new String[schemas.size()]); @@ -112,7 +113,7 @@ public abstract class BenchmarkSet { return outSchemas.get(name); } - public void perform(String queryName) throws IOException, ServiceException { + public void perform(String queryName) throws SQLException { String query = getQuery(queryName); if (query == null) { throw new IllegalArgumentException("#{queryName} does not exists"); http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/benchmark/TPCH.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/benchmark/TPCH.java b/tajo-core/src/main/java/org/apache/tajo/benchmark/TPCH.java index 9994634..dd3a43b 100644 --- a/tajo-core/src/main/java/org/apache/tajo/benchmark/TPCH.java +++ b/tajo-core/src/main/java/org/apache/tajo/benchmark/TPCH.java @@ -192,7 +192,7 @@ public class TPCH extends BenchmarkSet { loadQueries(BENCHMARK_DIR); } - public void loadTables() throws ServiceException { + public void loadTables() throws SQLException { loadTable(LINEITEM); loadTable(CUSTOMER); loadTable(CUSTOMER_PARTS); @@ -206,7 +206,7 @@ public class TPCH extends BenchmarkSet { } - public void loadTable(String tableName) throws ServiceException { + public void loadTable(String tableName) throws SQLException { TableMeta meta = CatalogUtil.newTableMeta("CSV"); meta.putOption(StorageConstants.TEXT_DELIMITER, StorageConstants.DEFAULT_FIELD_DELIMITER); @@ -221,12 +221,9 @@ public class TPCH extends BenchmarkSet { "c_nationkey", expressionSchema); } - try { - tajo.createExternalTable(tableName, getSchema(tableName), - new Path(dataDir, tableName).toUri(), meta, partitionMethodDesc); - } catch (SQLException s) { - throw new ServiceException(s); - } + + tajo.createExternalTable(tableName, getSchema(tableName), + new Path(dataDir, tableName).toUri(), meta, partitionMethodDesc); } public static List<String> getDataFilePaths(String... tables) { http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java b/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java index 5c62654..e433e4f 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java @@ -60,7 +60,6 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> { parser.addErrorListener(new SQLErrorListener()); context = parser.sql(); } catch (SQLParseError e) { - e.printStackTrace(); throw new SQLSyntaxError(e); } return visitSql(context); http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLSyntaxError.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLSyntaxError.java b/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLSyntaxError.java index 4c3b0fd..0b50d4b 100644 --- a/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLSyntaxError.java +++ b/tajo-core/src/main/java/org/apache/tajo/engine/parser/SQLSyntaxError.java @@ -19,19 +19,22 @@ package org.apache.tajo.engine.parser; -import org.apache.tajo.plan.InvalidQueryException; +import org.apache.tajo.error.Errors; +import org.apache.tajo.exception.TajoRuntimeException; +import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos; +import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.ReturnState; -public class SQLSyntaxError extends InvalidQueryException { +public class SQLSyntaxError extends TajoRuntimeException { private static final long serialVersionUID = 5388279335175632067L; private transient String detailedMessage; public SQLSyntaxError(String errorMessage) { - super(errorMessage); + super(Errors.ResultCode.SYNTAX_ERROR, errorMessage); } public SQLSyntaxError(SQLParseError e) { - super(e.getMessageHeader(), e); + super(Errors.ResultCode.SYNTAX_ERROR, e.getMessageHeader()); } @Override http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java ---------------------------------------------------------------------- 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 37b497c..00d346a 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 @@ -26,7 +26,6 @@ import com.google.common.cache.Weigher; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.service.AbstractService; -import org.apache.hadoop.util.StringUtils; import org.apache.tajo.QueryId; import org.apache.tajo.QueryIdFactory; import org.apache.tajo.SessionVars; @@ -35,24 +34,22 @@ import org.apache.tajo.algebra.JsonHelper; import org.apache.tajo.catalog.CatalogService; import org.apache.tajo.catalog.Schema; import org.apache.tajo.catalog.TableDesc; +import org.apache.tajo.exception.ReturnStateUtil; import org.apache.tajo.conf.TajoConf; import org.apache.tajo.engine.parser.SQLAnalyzer; import org.apache.tajo.engine.parser.SQLSyntaxError; import org.apache.tajo.engine.query.QueryContext; -import org.apache.tajo.ipc.ClientProtos; +import org.apache.tajo.exception.ExceptionUtil; import org.apache.tajo.master.TajoMaster.MasterContext; import org.apache.tajo.master.exec.DDLExecutor; import org.apache.tajo.master.exec.QueryExecutor; -import org.apache.tajo.session.Session; import org.apache.tajo.plan.*; import org.apache.tajo.plan.logical.InsertNode; import org.apache.tajo.plan.logical.LogicalRootNode; import org.apache.tajo.plan.logical.NodeType; import org.apache.tajo.plan.util.PlannerUtil; -import org.apache.tajo.plan.verifier.LogicalPlanVerifier; -import org.apache.tajo.plan.verifier.PreLogicalPlanVerifier; -import org.apache.tajo.plan.verifier.VerificationState; -import org.apache.tajo.plan.verifier.VerifyException; +import org.apache.tajo.plan.verifier.*; +import org.apache.tajo.session.Session; import org.apache.tajo.storage.TablespaceManager; import org.apache.tajo.util.CommonTestingUtil; @@ -60,6 +57,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.concurrent.TimeUnit; +import static org.apache.tajo.exception.ReturnStateUtil.returnError; import static org.apache.tajo.ipc.ClientProtos.SubmitQueryResponse; public class GlobalEngine extends AbstractService { @@ -187,20 +185,17 @@ public class GlobalEngine extends AbstractService { LogicalPlan plan = createLogicalPlan(queryContext, planningContext); SubmitQueryResponse response = queryExecutor.execute(queryContext, session, query, jsonExpr, plan); return response; + + } catch (Throwable t) { + ExceptionUtil.printStackTraceIfError(LOG, t); + context.getSystemMetrics().counter("Query", "errorQuery").inc(); - LOG.error("\nStack Trace:\n" + StringUtils.stringifyException(t)); SubmitQueryResponse.Builder responseBuilder = SubmitQueryResponse.newBuilder(); responseBuilder.setUserName(queryContext.get(SessionVars.USERNAME)); responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto()); responseBuilder.setIsForwarded(true); - responseBuilder.setResultCode(ClientProtos.ResultCode.ERROR); - String errorMessage = t.getMessage(); - if (t.getMessage() == null) { - errorMessage = t.getClass().getName(); - } - responseBuilder.setErrorMessage(errorMessage); - responseBuilder.setErrorTrace(StringUtils.stringifyException(t)); + responseBuilder.setState(ReturnStateUtil.returnError(t)); return responseBuilder.build(); } } @@ -227,8 +222,7 @@ public class GlobalEngine extends AbstractService { } } - public QueryId updateQuery(QueryContext queryContext, String sql, boolean isJson) throws IOException, - SQLException, PlanningException { + public QueryId updateQuery(QueryContext queryContext, String sql, boolean isJson) throws Throwable { try { LOG.info("SQL: " + sql); @@ -249,22 +243,22 @@ public class GlobalEngine extends AbstractService { ddlExecutor.execute(queryContext, plan); return QueryIdFactory.NULL_QUERY_ID; } - } catch (Exception e) { - LOG.error(e.getMessage(), e); - throw new IOException(e.getMessage(), e); + } catch (Throwable e) { + ExceptionUtil.printStackTraceIfError(LOG, e); + throw e; } } - private LogicalPlan createLogicalPlan(QueryContext queryContext, Expr expression) throws PlanningException { + private LogicalPlan createLogicalPlan(QueryContext queryContext, Expr expression) throws Throwable { VerificationState state = new VerificationState(); preVerifier.verify(queryContext, state, expression); if (!state.verified()) { StringBuilder sb = new StringBuilder(); - for (String error : state.getErrorMessages()) { - sb.append(error).append("\n"); + + for (Throwable error : state.getErrors()) { + throw error; } - throw new VerifyException(sb.toString()); } LogicalPlan plan = planner.createPlan(queryContext, expression); @@ -283,11 +277,9 @@ public class GlobalEngine extends AbstractService { verifyInsertTableSchema(queryContext, state, plan); if (!state.verified()) { - StringBuilder sb = new StringBuilder(); - for (String error : state.getErrorMessages()) { - sb.append(error).append("\n"); + for (Throwable error : state.getErrors()) { + throw error; } - throw new VerifyException(sb.toString()); } return plan; @@ -306,7 +298,7 @@ public class GlobalEngine extends AbstractService { TablespaceManager.get(tableDesc.getUri()).get().verifySchemaToWrite(tableDesc, outSchema); } catch (Throwable t) { - state.addVerification(t.getMessage()); + state.addVerification(SyntaxErrorUtil.makeSyntaxError(t.getMessage())); } } } http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java b/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java index e0332d5..6fbe968 100644 --- a/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java +++ b/tajo-core/src/main/java/org/apache/tajo/master/TajoMasterClientService.java @@ -22,7 +22,6 @@ import com.google.common.base.Preconditions; import com.google.protobuf.ByteString; import com.google.protobuf.RpcController; import com.google.protobuf.ServiceException; -import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.fs.FileSystem; @@ -32,11 +31,13 @@ import org.apache.hadoop.service.AbstractService; import org.apache.tajo.QueryId; import org.apache.tajo.QueryIdFactory; import org.apache.tajo.TajoIdProtos; -import org.apache.tajo.TajoProtos; +import org.apache.tajo.TajoProtos.QueryState; import org.apache.tajo.catalog.*; -import org.apache.tajo.catalog.exception.NoSuchDatabaseException; +import org.apache.tajo.catalog.exception.UndefinedDatabaseException; import org.apache.tajo.catalog.partition.PartitionMethodDesc; import org.apache.tajo.catalog.proto.CatalogProtos; +import org.apache.tajo.catalog.proto.CatalogProtos.FunctionListResponse; +import org.apache.tajo.catalog.proto.CatalogProtos.TableResponse; import org.apache.tajo.conf.TajoConf; import org.apache.tajo.conf.TajoConf.ConfVars; import org.apache.tajo.engine.query.QueryContext; @@ -53,11 +54,7 @@ import org.apache.tajo.plan.logical.PartitionedTableScanNode; import org.apache.tajo.plan.logical.ScanNode; import org.apache.tajo.querymaster.QueryJobEvent; import org.apache.tajo.rpc.BlockingRpcServer; -import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.BoolProto; -import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.StringListProto; -import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.StringProto; -import org.apache.tajo.session.InvalidSessionException; -import org.apache.tajo.session.NoSuchSessionVariableException; +import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.*; import org.apache.tajo.session.Session; import org.apache.tajo.util.KeyValueSet; import org.apache.tajo.util.NetUtils; @@ -68,8 +65,7 @@ import java.net.InetSocketAddress; import java.util.*; import static org.apache.tajo.TajoConstants.DEFAULT_DATABASE_NAME; -import static org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.KeyValueProto; -import static org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.KeyValueSetProto; +import static org.apache.tajo.exception.ReturnStateUtil.*; public class TajoMasterClientService extends AbstractService { private final static Log LOG = LogFactory.getLog(TajoMasterClientService.class); @@ -82,8 +78,6 @@ public class TajoMasterClientService extends AbstractService { private final BoolProto BOOL_TRUE = BoolProto.newBuilder().setValue(true).build(); - private final BoolProto BOOL_FALSE = - BoolProto.newBuilder().setValue(false).build(); public TajoMasterClientService(MasterContext context) { super(TajoMasterClientService.class.getName()); @@ -134,57 +128,42 @@ public class TajoMasterClientService extends AbstractService { if (!context.getCatalog().existDatabase(databaseName)) { LOG.info("Session creation is canceled due to absent base database \"" + databaseName + "\"."); - throw new NoSuchDatabaseException(databaseName); + throw new UndefinedDatabaseException(databaseName); } String sessionId = context.getSessionManager().createSession(request.getUsername(), databaseName); CreateSessionResponse.Builder builder = CreateSessionResponse.newBuilder(); - builder.setResultCode(ResultCode.OK); + builder.setState(OK); builder.setSessionId(TajoIdProtos.SessionIdProto.newBuilder().setId(sessionId).build()); builder.setSessionVars(ProtoUtil.convertFromMap(context.getSessionManager().getAllVariables(sessionId))); return builder.build(); - } catch (NoSuchDatabaseException nsde) { - CreateSessionResponse.Builder builder = CreateSessionResponse.newBuilder(); - builder.setResultCode(ResultCode.ERROR); - builder.setMessage(nsde.getMessage()); - return builder.build(); - } catch (InvalidSessionException e) { + + } catch (Throwable t) { CreateSessionResponse.Builder builder = CreateSessionResponse.newBuilder(); - builder.setResultCode(ResultCode.ERROR); - builder.setMessage(e.getMessage()); + builder.setState(returnError(t)); return builder.build(); } } @Override - public BoolProto removeSession(RpcController controller, TajoIdProtos.SessionIdProto request) + public ReturnState removeSession(RpcController controller, TajoIdProtos.SessionIdProto request) throws ServiceException { if (request != null) { context.getSessionManager().removeSession(request.getId()); } - return BOOL_TRUE; + return OK; } - public SessionUpdateResponse buildSessionUpdateOnSuccess(Map<String, String> variables) { - SessionUpdateResponse.Builder builder = SessionUpdateResponse.newBuilder(); - builder.setResultCode(ResultCode.OK); - builder.setSessionVars(new KeyValueSet(variables).getProto()); - return builder.build(); - } + @Override + public SessionUpdateResponse updateSessionVariables(RpcController controller, + UpdateSessionVariableRequest request) + throws ServiceException { - public SessionUpdateResponse buildSessionUpdateOnError(String message) { SessionUpdateResponse.Builder builder = SessionUpdateResponse.newBuilder(); - builder.setResultCode(ResultCode.ERROR); - builder.setMessage(message); - return builder.build(); - } - @Override - public SessionUpdateResponse updateSessionVariables(RpcController controller, UpdateSessionVariableRequest request) - throws ServiceException { try { String sessionId = request.getSessionId().getId(); for (KeyValueProto kv : request.getSessionVars().getKeyvalList()) { @@ -193,9 +172,15 @@ public class TajoMasterClientService extends AbstractService { for (String unsetVariable : request.getUnsetVariablesList()) { context.getSessionManager().removeVariable(sessionId, unsetVariable); } - return buildSessionUpdateOnSuccess(context.getSessionManager().getAllVariables(sessionId)); + + + builder.setState(OK); + builder.setSessionVars(new KeyValueSet(context.getSessionManager().getAllVariables(sessionId)).getProto()); + return builder.build(); + } catch (Throwable t) { - return buildSessionUpdateOnError("Invalid Session Id" + request.getSessionId()); + builder.setState(returnError(t)); + return builder.build(); } } @@ -212,61 +197,72 @@ public class TajoMasterClientService extends AbstractService { } @Override - public BoolProto existSessionVariable(RpcController controller, SessionedStringProto request) + public ReturnState existSessionVariable(RpcController controller, SessionedStringProto request) throws ServiceException { try { String value = context.getSessionManager().getVariable(request.getSessionId().getId(), request.getValue()); if (value != null) { - return ProtoUtil.TRUE; + return OK; } else { - return ProtoUtil.FALSE; + return errNoSessionVar(request.getValue()); } - } catch (NoSuchSessionVariableException nssv) { - return ProtoUtil.FALSE; } catch (Throwable t) { - throw new ServiceException(t); + return returnError(t); } } @Override - public KeyValueSetProto getAllSessionVariables(RpcController controller, + public KeyValueSetResponse getAllSessionVariables(RpcController controller, TajoIdProtos.SessionIdProto request) throws ServiceException { + try { String sessionId = request.getId(); KeyValueSet keyValueSet = new KeyValueSet(); keyValueSet.putAll(context.getSessionManager().getAllVariables(sessionId)); - return keyValueSet.getProto(); + + return KeyValueSetResponse.newBuilder() + .setState(OK) + .setValue(keyValueSet.getProto()) + .build(); + } catch (Throwable t) { - throw new ServiceException(t); + return KeyValueSetResponse.newBuilder() + .setState(returnError(t)) + .build(); } } @Override - public StringProto getCurrentDatabase(RpcController controller, TajoIdProtos.SessionIdProto request) + public StringResponse getCurrentDatabase(RpcController controller, TajoIdProtos.SessionIdProto request) throws ServiceException { try { - String sessionId = request.getId(); - return ProtoUtil.convertString(context.getSessionManager().getSession(sessionId).getCurrentDatabase()); + return StringResponse.newBuilder() + .setState(OK) + .setValue(context.getSessionManager().getSession(request.getId()).getCurrentDatabase()) + .build(); + } catch (Throwable t) { - throw new ServiceException(t); + return StringResponse.newBuilder() + .setState(returnError(t)) + .build(); } } @Override - public BoolProto selectDatabase(RpcController controller, SessionedStringProto request) throws ServiceException { + public ReturnState selectDatabase(RpcController controller, SessionedStringProto request) throws ServiceException { try { String sessionId = request.getSessionId().getId(); String databaseName = request.getValue(); if (context.getCatalog().existDatabase(databaseName)) { context.getSessionManager().getSession(sessionId).selectDatabase(databaseName); - return ProtoUtil.TRUE; + return OK; } else { - throw new ServiceException(new NoSuchDatabaseException(databaseName)); + return errUndefinedDatabase(databaseName); } } catch (Throwable t) { - throw new ServiceException(t); + return returnError(t); } } @@ -278,50 +274,43 @@ public class TajoMasterClientService extends AbstractService { if(LOG.isDebugEnabled()) { LOG.debug("Query [" + request.getQuery() + "] is submitted"); } + return context.getGlobalEngine().executeQuery(session, request.getQuery(), request.getIsJson()); + } catch (Exception e) { - LOG.error(e.getMessage(), e); - SubmitQueryResponse.Builder responseBuilder = ClientProtos.SubmitQueryResponse.newBuilder(); - responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto()); - responseBuilder.setIsForwarded(true); - responseBuilder.setUserName(context.getConf().getVar(ConfVars.USERNAME)); - responseBuilder.setResultCode(ResultCode.ERROR); - if (e.getMessage() != null) { - responseBuilder.setErrorMessage(ExceptionUtils.getStackTrace(e)); - } else { - responseBuilder.setErrorMessage("Internal Error"); - } - return responseBuilder.build(); + + return ClientProtos.SubmitQueryResponse.newBuilder() + .setState(returnError(e)) + .setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto()) + .setIsForwarded(true) + .setUserName(context.getConf().getVar(ConfVars.USERNAME)) + .build(); + } } @Override public UpdateQueryResponse updateQuery(RpcController controller, QueryRequest request) throws ServiceException { + UpdateQueryResponse.Builder builder = UpdateQueryResponse.newBuilder(); try { Session session = context.getSessionManager().getSession(request.getSessionId().getId()); QueryContext queryContext = new QueryContext(conf, session); + context.getGlobalEngine().updateQuery(queryContext, request.getQuery(), request.getIsJson()); + builder.setState(OK); - UpdateQueryResponse.Builder builder = UpdateQueryResponse.newBuilder(); - try { - context.getGlobalEngine().updateQuery(queryContext, request.getQuery(), request.getIsJson()); - builder.setResultCode(ResultCode.OK); - return builder.build(); - } catch (Exception e) { - builder.setResultCode(ResultCode.ERROR); - if (e.getMessage() == null) { - builder.setErrorMessage(ExceptionUtils.getStackTrace(e)); - } - return builder.build(); - } } catch (Throwable t) { - throw new ServiceException(t); + builder.setState(returnError(t)); } + return builder.build(); } @Override public GetQueryResultResponse getQueryResult(RpcController controller, GetQueryResultRequest request) throws ServiceException { + + GetQueryResultResponse.Builder builder = GetQueryResultResponse.newBuilder(); + try { context.getSessionManager().touch(request.getSessionId().getId()); QueryId queryId = new QueryId(request.getQueryId()); @@ -336,29 +325,30 @@ public class TajoMasterClientService extends AbstractService { queryInfo = queryInProgress.getQueryInfo(); } - GetQueryResultResponse.Builder builder = GetQueryResultResponse.newBuilder(); builder.setTajoUserName(UserGroupInformation.getCurrentUser().getUserName()); // If we cannot the QueryInfo instance from the finished list, // the query result was expired due to timeout. // In this case, we will result in error. if (queryInfo == null) { - builder.setErrorMessage("No such query: " + queryId.toString()); + builder.setState(errNoSuchQueryId(queryId)); return builder.build(); } switch (queryInfo.getQueryState()) { case QUERY_SUCCEEDED: if (queryInfo.hasResultdesc()) { + builder.setState(OK); builder.setTableDesc(queryInfo.getResultDesc().getProto()); } break; case QUERY_FAILED: case QUERY_ERROR: - builder.setErrorMessage("Query " + queryId + " is failed"); + builder.setState(errNoData(queryId)); break; + default: - builder.setErrorMessage("Query " + queryId + " is still running"); + builder.setState(errIncompleteQuery(queryId)); } return builder.build(); @@ -408,9 +398,10 @@ public class TajoMasterClientService extends AbstractService { public GetQueryListResponse getFinishedQueryList(RpcController controller, TajoIdProtos.SessionIdProto request) throws ServiceException { + GetQueryListResponse.Builder builder = GetQueryListResponse.newBuilder(); + try { context.getSessionManager().touch(request.getId()); - GetQueryListResponse.Builder builder = GetQueryListResponse.newBuilder(); Collection<QueryInfo> queries = context.getQueryJobManager().getFinishedQueries(); @@ -432,16 +423,16 @@ public class TajoMasterClientService extends AbstractService { builder.addQueryList(infoBuilder.build()); } - GetQueryListResponse result = builder.build(); - return result; + builder.setState(OK); } catch (Throwable t) { - throw new ServiceException(t); + builder.setState(returnError(t)); } + + return builder.build(); } @Override - public GetQueryStatusResponse getQueryStatus(RpcController controller, - GetQueryStatusRequest request) + public GetQueryStatusResponse getQueryStatus(RpcController controller, GetQueryStatusRequest request) throws ServiceException { try { @@ -452,8 +443,8 @@ public class TajoMasterClientService extends AbstractService { builder.setQueryId(request.getQueryId()); if (queryId.equals(QueryIdFactory.NULL_QUERY_ID)) { - builder.setResultCode(ResultCode.OK); - builder.setState(TajoProtos.QueryState.QUERY_SUCCEEDED); + builder.setState(OK); + builder.setQueryState(QueryState.QUERY_SUCCEEDED); } else { QueryInProgress queryInProgress = context.getQueryJobManager().getQueryInProgress(queryId); @@ -466,8 +457,8 @@ public class TajoMasterClientService extends AbstractService { } if (queryInfo != null) { - builder.setResultCode(ResultCode.OK); - builder.setState(queryInfo.getQueryState()); + builder.setState(OK); + builder.setQueryState(queryInfo.getQueryState()); boolean isCreateTable = queryInfo.getQueryContext().isCreateTable(); boolean isInsert = queryInfo.getQueryContext().isInsert(); @@ -479,7 +470,7 @@ public class TajoMasterClientService extends AbstractService { builder.setQueryMasterHost(queryInfo.getQueryMasterHost()); builder.setQueryMasterPort(queryInfo.getQueryMasterClientPort()); } - if (queryInfo.getQueryState() == TajoProtos.QueryState.QUERY_SUCCEEDED) { + if (queryInfo.getQueryState() == QueryState.QUERY_SUCCEEDED) { builder.setFinishTime(queryInfo.getFinishTime()); } else { builder.setFinishTime(System.currentTimeMillis()); @@ -487,11 +478,10 @@ public class TajoMasterClientService extends AbstractService { } else { Session session = context.getSessionManager().getSession(request.getSessionId().getId()); if (session.getNonForwardQueryResultScanner(queryId) != null) { - builder.setResultCode(ResultCode.OK); - builder.setState(TajoProtos.QueryState.QUERY_SUCCEEDED); + builder.setState(OK); + builder.setQueryState(QueryState.QUERY_SUCCEEDED); } else { - builder.setResultCode(ResultCode.ERROR); - builder.setErrorMessage("No such query: " + queryId.toString()); + builder.setState(errNoSuchQueryId(queryId)); } } } @@ -543,33 +533,33 @@ public class TajoMasterClientService extends AbstractService { resultSetBuilder.addAllSerializedTuples(rows); builder.setResultSet(resultSetBuilder.build()); - builder.setResultCode(ResultCode.OK); + builder.setState(OK); LOG.info("Send result to client for " + request.getSessionId().getId() + "," + queryId + ", " + rows.size() + " rows"); } catch (Throwable t) { - LOG.error(t.getMessage(), t); builder.setResultSet(resultSetBuilder.build()); // required field - builder.setResultCode(ResultCode.ERROR); - String errorMessage = t.getMessage() == null ? t.getClass().getName() : t.getMessage(); - builder.setErrorMessage(errorMessage); - builder.setErrorTrace(org.apache.hadoop.util.StringUtils.stringifyException(t)); + builder.setState(returnError(t)); } + return builder.build(); } @Override - public BoolProto closeNonForwardQuery(RpcController controller, QueryIdRequest request) throws ServiceException { + public ReturnState closeNonForwardQuery(RpcController controller, QueryIdRequest request) + throws ServiceException { + try { context.getSessionManager().touch(request.getSessionId().getId()); Session session = context.getSessionManager().getSession(request.getSessionId().getId()); QueryId queryId = new QueryId(request.getQueryId()); session.closeNonForwardQueryResultScanner(queryId); - return BOOL_TRUE; + return OK; + } catch (Throwable t) { - throw new ServiceException(t); + return returnError(t); } } @@ -594,34 +584,34 @@ public class TajoMasterClientService extends AbstractService { if (queryInfo != null) { builder.setQueryInfo(queryInfo.getProto()); } - builder.setResultCode(ResultCode.OK); + builder.setState(OK); + } catch (Throwable t) { - LOG.warn(t.getMessage(), t); - builder.setResultCode(ResultCode.ERROR); - builder.setErrorMessage(org.apache.hadoop.util.StringUtils.stringifyException(t)); + builder.setState(returnError(t)); } return builder.build(); } @Override - public BoolProto killQuery(RpcController controller, QueryIdRequest request) throws ServiceException { + public ReturnState killQuery(RpcController controller, QueryIdRequest request) throws ServiceException { try { context.getSessionManager().touch(request.getSessionId().getId()); QueryId queryId = new QueryId(request.getQueryId()); QueryInProgress progress = context.getQueryJobManager().getQueryInProgress(queryId); if (progress == null || progress.isFinishState() || progress.isKillWait()) { - return BOOL_TRUE; + return OK; } QueryManager queryManager = context.getQueryJobManager(); queryManager.getEventHandler().handle(new QueryJobEvent(QueryJobEvent.Type.QUERY_JOB_KILL, new QueryInfo(queryId))); - return BOOL_TRUE; + + return OK; + } catch (Throwable t) { - LOG.error(t.getMessage(), t); - throw new ServiceException(t); + return returnError(t); } } @@ -629,9 +619,11 @@ public class TajoMasterClientService extends AbstractService { public GetClusterInfoResponse getClusterInfo(RpcController controller, GetClusterInfoRequest request) throws ServiceException { + + GetClusterInfoResponse.Builder builder = GetClusterInfoResponse.newBuilder(); + try { context.getSessionManager().touch(request.getSessionId().getId()); - GetClusterInfoResponse.Builder builder= GetClusterInfoResponse.newBuilder(); List<NodeStatus> nodeStatusList = new ArrayList<NodeStatus>(context.getResourceManager().getRMContext().getNodes().values()); Collections.sort(nodeStatusList); @@ -651,71 +643,86 @@ public class TajoMasterClientService extends AbstractService { builder.addWorkerList(workerBuilder.build()); } - return builder.build(); + builder.setState(OK); + } catch (Throwable t) { - throw new ServiceException(t); + builder.setState(returnError(t)); } + + return builder.build(); } @Override - public BoolProto createDatabase(RpcController controller, SessionedStringProto request) throws ServiceException { + public ReturnState createDatabase(RpcController controller, SessionedStringProto request) throws ServiceException { try { Session session = context.getSessionManager().getSession(request.getSessionId().getId()); QueryContext queryContext = new QueryContext(conf, session); if (context.getGlobalEngine().getDDLExecutor().createDatabase(queryContext, request.getValue(), null, false)) { - return BOOL_TRUE; + return OK; } else { - return BOOL_FALSE; + return errDuplicateDatabase(request.getValue()); } - } catch (Throwable e) { - throw new ServiceException(e); + + } catch (Throwable t) { + return returnError(t); } } @Override - public BoolProto existDatabase(RpcController controller, SessionedStringProto request) throws ServiceException { + public ReturnState existDatabase(RpcController controller, SessionedStringProto request) throws ServiceException { try { context.getSessionManager().touch(request.getSessionId().getId()); if (catalog.existDatabase(request.getValue())) { - return BOOL_TRUE; + return OK; } else { - return BOOL_FALSE; + return errUndefinedDatabase(request.getValue()); } - } catch (Throwable e) { - throw new ServiceException(e); + + } catch (Throwable t) { + return returnError(t); } } @Override - public BoolProto dropDatabase(RpcController controller, SessionedStringProto request) throws ServiceException { + public ReturnState dropDatabase(RpcController controller, SessionedStringProto request) throws ServiceException { try { Session session = context.getSessionManager().getSession(request.getSessionId().getId()); QueryContext queryContext = new QueryContext(conf, session); if (context.getGlobalEngine().getDDLExecutor().dropDatabase(queryContext, request.getValue(), false)) { - return BOOL_TRUE; + return OK; } else { - return BOOL_FALSE; + return errUndefinedDatabase(request.getValue()); } - } catch (Throwable e) { - throw new ServiceException(e); + + } catch (Throwable t) { + return returnError(t); } } @Override - public StringListProto getAllDatabases(RpcController controller, TajoIdProtos.SessionIdProto + public StringListResponse getAllDatabases(RpcController controller, TajoIdProtos.SessionIdProto request) throws ServiceException { + try { context.getSessionManager().touch(request.getId()); - return ProtoUtil.convertStrings(catalog.getAllDatabaseNames()); - } catch (Throwable e) { - throw new ServiceException(e); + + return StringListResponse.newBuilder() + .setState(OK) + .addAllValues(catalog.getAllDatabaseNames()) + .build(); + + } catch (Throwable t) { + return StringListResponse.newBuilder() + .setState(returnError(t)) + .build(); } } @Override - public BoolProto existTable(RpcController controller, SessionedStringProto request) throws ServiceException { + public ReturnState existTable(RpcController controller, SessionedStringProto request) throws ServiceException { + try { Session session = context.getSessionManager().getSession(request.getSessionId().getId()); @@ -731,17 +738,18 @@ public class TajoMasterClientService extends AbstractService { } if (catalog.existsTable(databaseName, tableName)) { - return BOOL_TRUE; + return OK; } else { - return BOOL_FALSE; + return errUndefinedTable(tableName); } - } catch (Throwable e) { - throw new ServiceException(e); + + } catch (Throwable t) { + return returnError(t); } } @Override - public StringListProto getTableList(RpcController controller, + public StringListResponse getTableList(RpcController controller, SessionedStringProto request) throws ServiceException { try { Session session = context.getSessionManager().getSession(request.getSessionId().getId()); @@ -752,11 +760,16 @@ public class TajoMasterClientService extends AbstractService { databaseName = session.getCurrentDatabase(); } Collection<String> tableNames = catalog.getAllTableNames(databaseName); - StringListProto.Builder builder = StringListProto.newBuilder(); - builder.addAllValues(tableNames); - return builder.build(); + + return StringListResponse.newBuilder() + .setState(OK) + .addAllValues(tableNames) + .build(); + } catch (Throwable t) { - throw new ServiceException(t); + return StringListResponse.newBuilder() + .setState(returnError(t)) + .build(); } } @@ -766,8 +779,7 @@ public class TajoMasterClientService extends AbstractService { if (!request.hasValue()) { return TableResponse.newBuilder() - .setResultCode(ResultCode.ERROR) - .setErrorMessage("table name is required.") + .setState(errInvalidRpcCall("Table name is required")) .build(); } @@ -786,13 +798,12 @@ public class TajoMasterClientService extends AbstractService { if (catalog.existsTable(databaseName, tableName)) { return TableResponse.newBuilder() - .setResultCode(ResultCode.OK) - .setTableDesc(catalog.getTableDesc(databaseName, tableName).getProto()) + .setState(OK) + .setTable(catalog.getTableDesc(databaseName, tableName).getProto()) .build(); } else { return TableResponse.newBuilder() - .setResultCode(ResultCode.ERROR) - .setErrorMessage("ERROR: no such a table: " + request.getValue()) + .setState(errUndefinedTable(request.getValue())) .build(); } } catch (Throwable t) { @@ -821,46 +832,47 @@ public class TajoMasterClientService extends AbstractService { partitionDesc = new PartitionMethodDesc(request.getPartition()); } - TableDesc desc; - try { - desc = context.getGlobalEngine().getDDLExecutor().createTable(queryContext, request.getName(), - null, meta.getStoreType(), schema, meta, path.toUri(), true, partitionDesc, false); - } catch (Exception e) { - return TableResponse.newBuilder() - .setResultCode(ResultCode.ERROR) - .setErrorMessage(e.getMessage()).build(); - } + TableDesc desc = context.getGlobalEngine().getDDLExecutor().createTable( + queryContext, + request.getName(), + null, + meta.getStoreType(), + schema, + meta, + path.toUri(), + true, + partitionDesc, + false + ); return TableResponse.newBuilder() - .setResultCode(ResultCode.OK) - .setTableDesc(desc.getProto()).build(); - } catch (InvalidSessionException ise) { - return TableResponse.newBuilder() - .setResultCode(ResultCode.ERROR) - .setErrorMessage(ise.getMessage()).build(); - } catch (IOException ioe) { + .setState(OK) + .setTable(desc.getProto()).build(); + + } catch (Throwable t) { return TableResponse.newBuilder() - .setResultCode(ResultCode.ERROR) - .setErrorMessage(ioe.getMessage()).build(); + .setState(returnError(t)) + .build(); } } @Override - public BoolProto dropTable(RpcController controller, DropTableRequest dropTable) throws ServiceException { + public ReturnState dropTable(RpcController controller, DropTableRequest dropTable) throws ServiceException { try { Session session = context.getSessionManager().getSession(dropTable.getSessionId().getId()); QueryContext queryContext = new QueryContext(conf, session); context.getGlobalEngine().getDDLExecutor().dropTable(queryContext, dropTable.getName(), false, dropTable.getPurge()); - return BOOL_TRUE; + return OK; + } catch (Throwable t) { - throw new ServiceException(t); + return returnError(t); } } @Override - public FunctionResponse getFunctionList(RpcController controller, SessionedStringProto request) + public FunctionListResponse getFunctionList(RpcController controller, SessionedStringProto request) throws ServiceException { try { @@ -880,12 +892,13 @@ public class TajoMasterClientService extends AbstractService { } } } - return FunctionResponse.newBuilder() - .setResultCode(ResultCode.OK) - .addAllFunctions(functionProtos) + return FunctionListResponse.newBuilder() + .setState(OK) + .addAllFunction(functionProtos) .build(); + } catch (Throwable t) { - throw new ServiceException(t); + return FunctionListResponse.newBuilder().setState(returnError(t)).build(); } } } http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/master/exec/DDLExecutor.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/DDLExecutor.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/DDLExecutor.java index b9814eb..b0024dc 100644 --- a/tajo-core/src/main/java/org/apache/tajo/master/exec/DDLExecutor.java +++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/DDLExecutor.java @@ -35,6 +35,7 @@ import org.apache.tajo.catalog.proto.CatalogProtos.AlterTablespaceProto; import org.apache.tajo.catalog.proto.CatalogProtos.PartitionKeyProto; import org.apache.tajo.conf.TajoConf; import org.apache.tajo.engine.query.QueryContext; +import org.apache.tajo.exception.TajoInternalError; import org.apache.tajo.master.TajoMaster; import org.apache.tajo.plan.LogicalPlan; import org.apache.tajo.plan.logical.*; @@ -156,7 +157,7 @@ public class DDLExecutor { LOG.info("database \"" + databaseName + "\" is already exists." ); return true; } else { - throw new AlreadyExistsDatabaseException(databaseName); + throw new DuplicateDatabaseException(databaseName); } } @@ -177,7 +178,7 @@ public class DDLExecutor { LOG.info("database \"" + databaseName + "\" does not exists." ); return true; } else { // Otherwise, it causes an exception. - throw new NoSuchDatabaseException(databaseName); + throw new UndefinedDatabaseException(databaseName); } } @@ -196,8 +197,8 @@ public class DDLExecutor { //-------------------------------------------------------------------------- private TableDesc createTable(QueryContext queryContext, CreateTableNode createTable, boolean ifNotExists) throws IOException { - TableMeta meta; + TableMeta meta; if (createTable.hasOptions()) { meta = CatalogUtil.newTableMeta(createTable.getStorageType(), createTable.getOptions()); } else { @@ -230,6 +231,7 @@ public class DDLExecutor { boolean isExternal, @Nullable PartitionMethodDesc partitionDesc, boolean ifNotExists) throws IOException { + String databaseName; String simpleTableName; if (CatalogUtil.isFQTableName(tableName)) { @@ -249,7 +251,7 @@ public class DDLExecutor { LOG.info("relation \"" + qualifiedName + "\" is already exists." ); return catalog.getTableDesc(databaseName, simpleTableName); } else { - throw new AlreadyExistsTableException(qualifiedName); + throw new DuplicateTableException(qualifiedName); } } @@ -277,7 +279,7 @@ public class DDLExecutor { return desc; } else { LOG.info("Table creation " + tableName + " is failed."); - throw new CatalogException("Cannot create table \"" + tableName + "\"."); + throw new TajoInternalError("Cannot create table \"" + tableName + "\""); } } @@ -307,7 +309,7 @@ public class DDLExecutor { LOG.info("relation \"" + qualifiedName + "\" is already exists." ); return true; } else { // Otherwise, it causes an exception. - throw new NoSuchTableException(qualifiedName); + throw new UndefinedTableException(qualifiedName); } } @@ -350,7 +352,7 @@ public class DDLExecutor { final String qualifiedName = CatalogUtil.buildFQName(databaseName, simpleTableName); if (!catalog.existsTable(databaseName, simpleTableName)) { - throw new NoSuchTableException(qualifiedName); + throw new UndefinedTableException(qualifiedName); } Path warehousePath = new Path(TajoConf.getWarehouseDir(context.getConf()), databaseName); @@ -405,7 +407,7 @@ public class DDLExecutor { final String qualifiedName = CatalogUtil.buildFQName(databaseName, simpleTableName); if (!catalog.existsTable(databaseName, simpleTableName)) { - throw new NoSuchTableException(qualifiedName); + throw new UndefinedTableException(qualifiedName); } Path partitionPath = null; @@ -419,21 +421,13 @@ public class DDLExecutor { desc = catalog.getTableDesc(databaseName, simpleTableName); } - // When adding a partition or dropping a partition, check existing partition column information. - if (alterTable.getAlterTableOpType() == AlterTableOpType.ADD_PARTITION - || alterTable.getAlterTableOpType() == AlterTableOpType.DROP_PARTITION) { - pair = CatalogUtil.getPartitionKeyNamePair(alterTable.getPartitionColumns(), alterTable.getPartitionValues()); - partitionDescProto = catalog.getPartition(databaseName, simpleTableName, pair.getSecond()); - existPartitionColumnNames(qualifiedName, alterTable.getPartitionColumns()); - } - switch (alterTable.getAlterTableOpType()) { case RENAME_TABLE: if (!catalog.existsTable(databaseName, simpleTableName)) { - throw new NoSuchTableException(alterTable.getTableName()); + throw new UndefinedTableException(alterTable.getTableName()); } if (catalog.existsTable(databaseName, alterTable.getNewTableName())) { - throw new AlreadyExistsTableException(alterTable.getNewTableName()); + throw new DuplicateTableException(alterTable.getNewTableName()); } if (!desc.isExternal()) { // if the table is the managed table @@ -456,15 +450,15 @@ public class DDLExecutor { AlterTableType.RENAME_TABLE)); break; case RENAME_COLUMN: - if (existColumnName(qualifiedName, alterTable.getNewColumnName())) { - throw new ColumnNameAlreadyExistException(alterTable.getNewColumnName()); + if (ensureColumnExistance(qualifiedName, alterTable.getNewColumnName())) { + throw new DuplicateColumnException(alterTable.getNewColumnName()); } catalog.alterTable(CatalogUtil.renameColumn(qualifiedName, alterTable.getColumnName(), alterTable.getNewColumnName(), AlterTableType.RENAME_COLUMN)); break; case ADD_COLUMN: - if (existColumnName(qualifiedName, alterTable.getAddNewColumn().getSimpleName())) { - throw new ColumnNameAlreadyExistException(alterTable.getAddNewColumn().getSimpleName()); + if (ensureColumnExistance(qualifiedName, alterTable.getAddNewColumn().getSimpleName())) { + throw new DuplicateColumnException(alterTable.getAddNewColumn().getSimpleName()); } catalog.alterTable(CatalogUtil.addNewColumn(qualifiedName, alterTable.getAddNewColumn(), AlterTableType.ADD_COLUMN)); break; @@ -472,8 +466,18 @@ public class DDLExecutor { catalog.alterTable(CatalogUtil.setProperty(qualifiedName, alterTable.getProperties(), AlterTableType.SET_PROPERTY)); break; case ADD_PARTITION: - if (partitionDescProto != null) { - throw new AlreadyExistsPartitionException(tableName, pair.getSecond()); + pair = CatalogUtil.getPartitionKeyNamePair(alterTable.getPartitionColumns(), alterTable.getPartitionValues()); + ensureColumnPartitionKeys(qualifiedName, alterTable.getPartitionColumns()); + + // checking a duplicated partition + boolean duplicatedPartition = true; + try { + catalog.getPartition(databaseName, simpleTableName, pair.getSecond()); + } catch (UndefinedPartitionException npe) { + duplicatedPartition = false; + } + if (duplicatedPartition) { + throw new DuplicatePartitionException(pair.getSecond()); } if (alterTable.getLocation() != null) { @@ -489,8 +493,7 @@ public class DDLExecutor { // If there is a directory which was assumed to be a partitioned directory and users don't input another // location, this will throw exception. Path assumedDirectory = new Path(desc.getUri().toString(), pair.getSecond()); - boolean result1 = fs.exists(assumedDirectory); - boolean result2 = fs.exists(partitionPath); + if (fs.exists(assumedDirectory) && !assumedDirectory.equals(partitionPath)) { throw new AlreadyExistsAssumedPartitionDirectoryException(assumedDirectory.toString()); } @@ -504,6 +507,10 @@ public class DDLExecutor { } break; case DROP_PARTITION: + ensureColumnPartitionKeys(qualifiedName, alterTable.getPartitionColumns()); + pair = CatalogUtil.getPartitionKeyNamePair(alterTable.getPartitionColumns(), alterTable.getPartitionValues()); + partitionDescProto = catalog.getPartition(databaseName, simpleTableName, pair.getSecond()); + if (partitionDescProto == null) { throw new NoSuchPartitionException(tableName, pair.getSecond()); } @@ -535,16 +542,16 @@ public class DDLExecutor { } } - private boolean existPartitionColumnNames(String tableName, String[] columnNames) { + private boolean ensureColumnPartitionKeys(String tableName, String[] columnNames) { for(String columnName : columnNames) { - if (!existPartitionColumnName(tableName, columnName)) { + if (!ensureColumnPartitionKeys(tableName, columnName)) { throw new NoSuchPartitionKeyException(tableName, columnName); } } return true; } - private boolean existPartitionColumnName(String tableName, String columnName) { + private boolean ensureColumnPartitionKeys(String tableName, String columnName) { final TableDesc tableDesc = catalog.getTableDesc(tableName); if (tableDesc.getPartitionMethod().getExpressionSchema().contains(columnName)) { return true; @@ -553,8 +560,8 @@ public class DDLExecutor { } } - private boolean existColumnName(String tableName, String columnName) { + private boolean ensureColumnExistance(String tableName, String columnName) { final TableDesc tableDesc = catalog.getTableDesc(tableName); - return tableDesc.getSchema().containsByName(columnName) ? true : false; + return tableDesc.getSchema().containsByName(columnName); } } http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java index 5d42157..d3530a0 100644 --- a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java +++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java @@ -71,6 +71,9 @@ import java.net.URI; import java.util.ArrayList; import java.util.List; +import static org.apache.tajo.exception.ReturnStateUtil.errUndefinedDatabase; +import static org.apache.tajo.exception.ReturnStateUtil.OK; + public class QueryExecutor { private static final Log LOG = LogFactory.getLog(QueryExecutor.class); @@ -106,7 +109,7 @@ public class QueryExecutor { context.getSystemMetrics().counter("Query", "numDDLQuery").inc(); ddlExecutor.execute(queryContext, plan); response.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto()); - response.setResultCode(ClientProtos.ResultCode.OK); + response.setState(OK); } else if (plan.isExplain()) { // explain query @@ -146,8 +149,7 @@ public class QueryExecutor { session.selectDatabase(setSessionNode.getValue()); } else { response.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto()); - response.setResultCode(ClientProtos.ResultCode.ERROR); - response.setErrorMessage("database \"" + databaseName + "\" does not exists."); + response.setState(errUndefinedDatabase(databaseName)); } // others @@ -161,7 +163,7 @@ public class QueryExecutor { context.getSystemMetrics().counter("Query", "numDDLQuery").inc(); response.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto()); - response.setResultCode(ClientProtos.ResultCode.OK); + response.setState(OK); } public void execExplain(LogicalPlan plan, QueryContext queryContext, boolean isGlobal, @@ -204,9 +206,9 @@ public class QueryExecutor { serializedResBuilder.setSchema(schema.getProto()); serializedResBuilder.setBytesNum(bytesNum); + response.setState(OK); response.setResultSet(serializedResBuilder.build()); response.setMaxRowNum(lines.length); - response.setResultCode(ClientProtos.ResultCode.OK); response.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto()); } @@ -225,10 +227,10 @@ public class QueryExecutor { queryResultScanner.init(); session.addNonForwardQueryResultScanner(queryResultScanner); + response.setState(OK); response.setQueryId(queryId.getProto()); response.setMaxRowNum(maxRow); response.setTableDesc(queryResultScanner.getTableDesc().getProto()); - response.setResultCode(ClientProtos.ResultCode.OK); } public void execSimpleQuery(QueryContext queryContext, Session session, String query, LogicalPlan plan, @@ -261,10 +263,10 @@ public class QueryExecutor { queryResultScanner.init(); session.addNonForwardQueryResultScanner(queryResultScanner); + response.setState(OK); response.setQueryId(queryInfo.getQueryId().getProto()); response.setMaxRowNum(maxRow); response.setTableDesc(desc.getProto()); - response.setResultCode(ClientProtos.ResultCode.OK); } public void execNonFromQuery(QueryContext queryContext, LogicalPlan plan, SubmitQueryResponse.Builder responseBuilder) @@ -298,10 +300,10 @@ public class QueryExecutor { serializedResBuilder.setSchema(schema.getProto()); serializedResBuilder.setBytesNum(serializedBytes.length); + responseBuilder.setState(OK); responseBuilder.setResultSet(serializedResBuilder); responseBuilder.setMaxRowNum(1); responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto()); - responseBuilder.setResultCode(ClientProtos.ResultCode.OK); } } finally { // stop script executor @@ -463,7 +465,7 @@ public class QueryExecutor { // If queryId == NULL_QUERY_ID and MaxRowNum == -1, TajoCli prints only number of inserted rows. responseBuilder.setMaxRowNum(-1); responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto()); - responseBuilder.setResultCode(ClientProtos.ResultCode.OK); + responseBuilder.setState(OK); } catch (Throwable t) { throw new RuntimeException(t); } @@ -497,22 +499,15 @@ public class QueryExecutor { queryInfo = queryManager.scheduleQuery(session, queryContext, sql, jsonExpr, rootNode); - if(queryInfo == null) { - responseBuilder.setQueryId(QueryIdFactory.NULL_QUERY_ID.getProto()); - responseBuilder.setResultCode(ClientProtos.ResultCode.ERROR); - responseBuilder.setErrorMessage("Fail starting QueryMaster."); - LOG.error("Fail starting QueryMaster: " + sql); - } else { - responseBuilder.setIsForwarded(true); - responseBuilder.setQueryId(queryInfo.getQueryId().getProto()); - responseBuilder.setResultCode(ClientProtos.ResultCode.OK); - if(queryInfo.getQueryMasterHost() != null) { - responseBuilder.setQueryMasterHost(queryInfo.getQueryMasterHost()); - } - responseBuilder.setQueryMasterPort(queryInfo.getQueryMasterClientPort()); - LOG.info("Query " + queryInfo.getQueryId().toString() + "," + queryInfo.getSql() + "," + - " is forwarded to " + queryInfo.getQueryMasterHost() + ":" + queryInfo.getQueryMasterPort()); + responseBuilder.setIsForwarded(true); + responseBuilder.setQueryId(queryInfo.getQueryId().getProto()); + responseBuilder.setState(OK); + if (queryInfo.getQueryMasterHost() != null) { + responseBuilder.setQueryMasterHost(queryInfo.getQueryMasterHost()); } + responseBuilder.setQueryMasterPort(queryInfo.getQueryMasterClientPort()); + LOG.info("Query " + queryInfo.getQueryId().toString() + "," + queryInfo.getSql() + "," + + " is forwarded to " + queryInfo.getQueryMasterHost() + ":" + queryInfo.getQueryMasterPort()); } public MasterPlan compileMasterPlan(LogicalPlan plan, QueryContext context, GlobalPlanner planner) http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/session/NoSuchSessionVariableException.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/session/NoSuchSessionVariableException.java b/tajo-core/src/main/java/org/apache/tajo/session/NoSuchSessionVariableException.java index be90449..a941b55 100644 --- a/tajo-core/src/main/java/org/apache/tajo/session/NoSuchSessionVariableException.java +++ b/tajo-core/src/main/java/org/apache/tajo/session/NoSuchSessionVariableException.java @@ -18,8 +18,12 @@ package org.apache.tajo.session; -public class NoSuchSessionVariableException extends Exception { +import org.apache.tajo.error.Errors; +import org.apache.tajo.exception.TajoException; + +public class NoSuchSessionVariableException extends TajoException { + public NoSuchSessionVariableException(String varname) { - super("No such session variable \"" + varname + "\""); + super(Errors.ResultCode.NO_SUCH_SESSION_VARIABLE, varname); } } http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/webapp/QueryExecutorServlet.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/webapp/QueryExecutorServlet.java b/tajo-core/src/main/java/org/apache/tajo/webapp/QueryExecutorServlet.java index ae22d0d..1df8e7a 100644 --- a/tajo-core/src/main/java/org/apache/tajo/webapp/QueryExecutorServlet.java +++ b/tajo-core/src/main/java/org/apache/tajo/webapp/QueryExecutorServlet.java @@ -1,6 +1,5 @@ package org.apache.tajo.webapp; -import com.google.protobuf.ServiceException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.util.StringUtils; @@ -9,10 +8,7 @@ import org.apache.tajo.QueryIdFactory; import org.apache.tajo.TajoProtos; import org.apache.tajo.catalog.CatalogUtil; import org.apache.tajo.catalog.TableDesc; -import org.apache.tajo.client.QueryStatus; -import org.apache.tajo.client.TajoClient; -import org.apache.tajo.client.TajoClientImpl; -import org.apache.tajo.client.TajoClientUtil; +import org.apache.tajo.client.*; import org.apache.tajo.conf.TajoConf; import org.apache.tajo.ipc.ClientProtos; import org.apache.tajo.jdbc.FetchResultSet; @@ -43,6 +39,9 @@ import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import static org.apache.tajo.exception.ReturnStateUtil.isError; +import static org.apache.tajo.exception.ReturnStateUtil.isSuccess; + /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -94,7 +93,7 @@ public class QueryExecutorServlet extends HttpServlet { tajoClient = new TajoClientImpl(ServiceTrackerFactory.get(tajoConf)); new QueryRunnerCleaner().start(); - } catch (IOException e) { + } catch (Throwable e) { LOG.error(e.getMessage(), e); } } @@ -320,7 +319,7 @@ public class QueryExecutorServlet extends HttpServlet { LOG.error("Internal Error: SubmissionResponse is NULL"); error = new Exception("Internal Error: SubmissionResponse is NULL"); - } else if (response.getResultCode() == ClientProtos.ResultCode.OK) { + } else if (isSuccess(response.getState())) { if (response.getIsForwarded()) { queryId = new QueryId(response.getQueryId()); getQueryResult(queryId); @@ -332,22 +331,20 @@ public class QueryExecutorServlet extends HttpServlet { progress.set(100); } - } else if (response.getResultCode() == ClientProtos.ResultCode.ERROR) { - if (response.hasErrorMessage()) { - StringBuffer errorMessage = new StringBuffer(response.getErrorMessage()); - String modifiedMessage; + } else if (isError(response.getState())) { + StringBuffer errorMessage = new StringBuffer(response.getState().getMessage()); + String modifiedMessage; - if (errorMessage.length() > 200) { - modifiedMessage = errorMessage.substring(0, 200); - } else { - modifiedMessage = errorMessage.toString(); - } - - String lineSeparator = System.getProperty("line.separator"); - modifiedMessage = modifiedMessage.replaceAll(lineSeparator, "<br/>"); - - error = new Exception(modifiedMessage); + if (errorMessage.length() > 200) { + modifiedMessage = errorMessage.substring(0, 200); + } else { + modifiedMessage = errorMessage.toString(); } + + String lineSeparator = System.getProperty("line.separator"); + modifiedMessage = modifiedMessage.replaceAll(lineSeparator, "<br/>"); + + error = new Exception(modifiedMessage); } } catch (Exception e) { LOG.error(e.getMessage(), e); @@ -358,7 +355,11 @@ public class QueryExecutorServlet extends HttpServlet { finishTime = System.currentTimeMillis(); if (queryId != null) { - tajoClient.closeQuery(queryId); + try { + tajoClient.closeQuery(queryId); + } catch (SQLException e) { + LOG.warn(e); + } } } } @@ -390,7 +391,7 @@ public class QueryExecutorServlet extends HttpServlet { } } - private QueryStatus waitForComplete(QueryId queryid) throws ServiceException { + private QueryStatus waitForComplete(QueryId queryid) throws SQLException { QueryStatus status = null; while (!stop.get()) { http://git-wip-us.apache.org/repos/asf/tajo/blob/5d62c409/tajo-core/src/main/java/org/apache/tajo/worker/TajoWorkerClientService.java ---------------------------------------------------------------------- diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/TajoWorkerClientService.java b/tajo-core/src/main/java/org/apache/tajo/worker/TajoWorkerClientService.java index c0a6453..edb5703 100644 --- a/tajo-core/src/main/java/org/apache/tajo/worker/TajoWorkerClientService.java +++ b/tajo-core/src/main/java/org/apache/tajo/worker/TajoWorkerClientService.java @@ -26,10 +26,10 @@ import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.service.AbstractService; import org.apache.tajo.QueryId; +import org.apache.tajo.exception.ReturnStateUtil; import org.apache.tajo.conf.TajoConf; import org.apache.tajo.ipc.ClientProtos.GetQueryHistoryResponse; import org.apache.tajo.ipc.ClientProtos.QueryIdRequest; -import org.apache.tajo.ipc.ClientProtos.ResultCode; import org.apache.tajo.ipc.QueryMasterClientProtocol; import org.apache.tajo.querymaster.QueryMasterTask; import org.apache.tajo.rpc.BlockingRpcServer; @@ -129,11 +129,10 @@ public class TajoWorkerClientService extends AbstractService { if (queryHistory != null) { builder.setQueryHistory(queryHistory.getProto()); } - builder.setResultCode(ResultCode.OK); + builder.setState(ReturnStateUtil.OK); } catch (Throwable t) { - LOG.warn(t.getMessage(), t); - builder.setResultCode(ResultCode.ERROR); - builder.setErrorMessage(org.apache.hadoop.util.StringUtils.stringifyException(t)); + LOG.error(t.getMessage(), t); + builder.setState(ReturnStateUtil.returnError(t)); } return builder.build();
