This is an automated email from the ASF dual-hosted git repository. gjacoby pushed a commit to branch 4.x in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/4.x by this push: new 2359f54 PHOENIX-6185 : Propagate info available in SQLExceptionInfo to SQLTimeoutException (#919) 2359f54 is described below commit 2359f54944dbdcedf16825370626e49c0cd99fc6 Author: Viraj Jasani <vjas...@apache.org> AuthorDate: Fri Oct 16 23:54:06 2020 +0530 PHOENIX-6185 : Propagate info available in SQLExceptionInfo to SQLTimeoutException (#919) PHOENIX-6185 : Propagate info available in SQLExceptionInfo to OPERATION_TIMED_OUT --- .../end2end/OperationTimeoutWithReasonIT.java | 98 ++++++++++++++++++++++ .../apache/phoenix/exception/SQLExceptionCode.java | 8 +- .../apache/phoenix/util/SQLExceptionCodeTest.java | 58 +++++++++++++ 3 files changed, 162 insertions(+), 2 deletions(-) diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/OperationTimeoutWithReasonIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/OperationTimeoutWithReasonIT.java new file mode 100644 index 0000000..a78d5ac --- /dev/null +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/OperationTimeoutWithReasonIT.java @@ -0,0 +1,98 @@ +/* + * 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 org.apache.phoenix.end2end; + +import org.apache.phoenix.util.EnvironmentEdge; +import org.apache.phoenix.util.EnvironmentEdgeManager; +import org.junit.Test; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import static org.apache.phoenix.exception.SQLExceptionCode.OPERATION_TIMED_OUT; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +public class OperationTimeoutWithReasonIT extends ParallelStatsDisabledIT { + + private static final class MyClock extends EnvironmentEdge { + private long time; + private final long delay; + + public MyClock (long time, long delay) { + this.time = time; + this.delay = delay; + } + + @Override + public long currentTime() { + long currentTime = this.time; + this.time += this.delay; + return currentTime; + } + } + + @Test + public void testOperationTimeout() throws SQLException { + final String tableName = generateUniqueName(); + final String ddl = "CREATE TABLE " + tableName + + " (COL1 VARCHAR NOT NULL PRIMARY KEY, COL2 VARCHAR)"; + try (Connection conn = DriverManager.getConnection(getUrl()); + Statement stmt = conn.createStatement()) { + stmt.execute(ddl); + final String dml = String.format("UPSERT INTO %s VALUES (?, ?)", + tableName); + try(PreparedStatement prepStmt = conn.prepareStatement(dml)) { + for (int i = 1; i <= 100; i++) { + prepStmt.setString(1, "key" + i); + prepStmt.setString(2, "value" + i); + prepStmt.executeUpdate(); + } + } + conn.commit(); + } + + try (Connection conn = DriverManager.getConnection(getUrl()); + Statement stmt = conn.createStatement()) { + stmt.setQueryTimeout(5); // 5 sec + ResultSet rs = stmt.executeQuery(String.format("SELECT * FROM %s", + tableName)); + // Use custom EnvironmentEdge to timeout query with a longer delay in ms + MyClock clock = new MyClock(10, 10000); + EnvironmentEdgeManager.injectEdge(clock); + try { + rs.next(); + fail(); + } catch (SQLException e) { + assertEquals(OPERATION_TIMED_OUT.getErrorCode(), + e.getErrorCode()); + assertTrue(e.getMessage().contains("Query couldn't be " + + "completed in the allotted time: 5000 ms")); + } + } finally { + EnvironmentEdgeManager.reset(); + } + } + +} \ No newline at end of file diff --git a/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java b/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java index f50f5cd..1763082 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java @@ -455,8 +455,12 @@ public enum SQLExceptionCode { OPERATION_TIMED_OUT(6000, "TIM01", "Operation timed out.", new Factory() { @Override public SQLException newException(SQLExceptionInfo info) { - return new SQLTimeoutException(OPERATION_TIMED_OUT.getMessage(), - OPERATION_TIMED_OUT.getSQLState(), OPERATION_TIMED_OUT.getErrorCode()); + final String reason = info.getMessage() != null + ? info.getMessage() : OPERATION_TIMED_OUT.getMessage(); + return new SQLTimeoutException(reason, + OPERATION_TIMED_OUT.getSQLState(), + OPERATION_TIMED_OUT.getErrorCode(), + info.getRootCause()); } }), FUNCTION_UNDEFINED(6001, "42F01", "Function undefined.", new Factory() { diff --git a/phoenix-core/src/test/java/org/apache/phoenix/util/SQLExceptionCodeTest.java b/phoenix-core/src/test/java/org/apache/phoenix/util/SQLExceptionCodeTest.java new file mode 100644 index 0000000..87696c4 --- /dev/null +++ b/phoenix-core/src/test/java/org/apache/phoenix/util/SQLExceptionCodeTest.java @@ -0,0 +1,58 @@ +/* + * 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 org.apache.phoenix.util; + +import org.apache.phoenix.exception.SQLExceptionCode; +import org.apache.phoenix.exception.SQLExceptionInfo; +import org.junit.Assert; +import org.junit.Test; + +import java.sql.SQLException; + +public class SQLExceptionCodeTest { + + @Test + public void testOperationTimedOutTest() { + SQLException sqlException = new SQLExceptionInfo + .Builder(SQLExceptionCode.OPERATION_TIMED_OUT) + .setMessage("Test Operation Timedout") + .setRootCause(new IllegalArgumentException("TestOpsTimeout1")) + .build().buildException(); + Assert.assertEquals("Test Operation Timedout", + sqlException.getMessage()); + Assert.assertEquals("TestOpsTimeout1", + sqlException.getCause().getMessage()); + Assert.assertTrue(sqlException.getCause() instanceof + IllegalArgumentException); + Assert.assertEquals(sqlException.getErrorCode(), + SQLExceptionCode.OPERATION_TIMED_OUT.getErrorCode()); + Assert.assertEquals(sqlException.getSQLState(), + SQLExceptionCode.OPERATION_TIMED_OUT.getSQLState()); + sqlException = new SQLExceptionInfo + .Builder(SQLExceptionCode.OPERATION_TIMED_OUT) + .build().buildException(); + Assert.assertEquals(SQLExceptionCode.OPERATION_TIMED_OUT.getMessage(), + sqlException.getMessage()); + Assert.assertNull(sqlException.getCause()); + Assert.assertEquals(sqlException.getErrorCode(), + SQLExceptionCode.OPERATION_TIMED_OUT.getErrorCode()); + Assert.assertEquals(sqlException.getSQLState(), + SQLExceptionCode.OPERATION_TIMED_OUT.getSQLState()); + } + +}