[NO ISSUE][MISC] Fix unwrap(), consolidate exception utils
- ExceptionUtils.unwrap() is supposed to return only instances of IFormattedException,
but due to a bug was returning the first non-IFormattedException nested exception
Change-Id: Ib26371609d9e1fcd1ff434b8ece04b6d96e4e2f4
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/11563
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Michael Blow <mblow@apache.org>
Reviewed-by: Till Westmann <tillw@apache.org>
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java
index 0b0f262..d6ebdad 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java
@@ -36,7 +36,6 @@
import org.apache.asterix.common.api.IRequestReference;
import org.apache.asterix.common.config.GlobalConfig;
import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.exceptions.ExceptionUtils;
import org.apache.asterix.common.exceptions.RuntimeDataException;
import org.apache.asterix.common.messaging.api.INCMessageBroker;
import org.apache.asterix.common.messaging.api.MessageFuture;
@@ -46,6 +45,7 @@
import org.apache.asterix.translator.SessionOutput;
import org.apache.hyracks.api.application.INCServiceContext;
import org.apache.hyracks.api.exceptions.Warning;
+import org.apache.hyracks.api.util.ExceptionUtils;
import org.apache.hyracks.http.api.IChannelClosedHandler;
import org.apache.hyracks.http.api.IServletRequest;
import org.apache.hyracks.http.server.HttpServer;
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index 754e2b6..7396dcb 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -76,7 +76,6 @@
import org.apache.asterix.common.exceptions.AsterixException;
import org.apache.asterix.common.exceptions.CompilationException;
import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.exceptions.ExceptionUtils;
import org.apache.asterix.common.exceptions.MetadataException;
import org.apache.asterix.common.exceptions.RuntimeDataException;
import org.apache.asterix.common.exceptions.WarningCollector;
@@ -3576,7 +3575,7 @@
printer.print(jobId);
}
} catch (Exception e) {
- if (ExceptionUtils.getRootCause(e) instanceof InterruptedException) {
+ if (org.apache.hyracks.api.util.ExceptionUtils.getRootCause(e) instanceof InterruptedException) {
Thread.currentThread().interrupt();
throw new RuntimeDataException(ErrorCode.REQUEST_CANCELLED, clientRequest.getId());
}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
index 429cda9..ccb73b6 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
@@ -34,7 +34,6 @@
import org.apache.asterix.app.active.ActiveNotificationHandler;
import org.apache.asterix.common.api.IMetadataLockManager;
import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.exceptions.ExceptionUtils;
import org.apache.asterix.common.metadata.DataverseName;
import org.apache.asterix.common.transactions.TxnId;
import org.apache.asterix.common.utils.JobUtils;
@@ -182,7 +181,7 @@
work.run();
done = true;
} catch (Exception e) {
- Throwable rootCause = ExceptionUtils.getRootCause(e);
+ Throwable rootCause = org.apache.hyracks.api.util.ExceptionUtils.getRootCause(e);
if (rootCause instanceof java.lang.InterruptedException) {
interruptedException = (InterruptedException) rootCause;
// clear the interrupted state from the thread
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java
index d4f92fb..db7ca7d 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java
@@ -33,7 +33,6 @@
import java.util.concurrent.Future;
import java.util.function.Predicate;
-import org.apache.asterix.common.exceptions.ExceptionUtils;
import org.apache.asterix.common.utils.Servlets;
import org.apache.asterix.test.runtime.SqlppExecutionWithCancellationTest;
import org.apache.asterix.testframework.context.TestCaseContext;
@@ -43,6 +42,7 @@
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
+import org.apache.hyracks.api.util.ExceptionUtils;
import org.junit.Assert;
public class CancellationTestExecutor extends TestExecutor {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/RebalanceCancellationTestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/RebalanceCancellationTestExecutor.java
index 3318459..d35bfb7 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/RebalanceCancellationTestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/RebalanceCancellationTestExecutor.java
@@ -29,7 +29,6 @@
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
-import org.apache.asterix.common.exceptions.ExceptionUtils;
import org.apache.asterix.common.utils.Servlets;
import org.apache.asterix.testframework.context.TestCaseContext;
import org.apache.asterix.testframework.xml.ComparisonEnum;
@@ -38,6 +37,7 @@
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
+import org.apache.hyracks.api.util.ExceptionUtils;
import org.apache.logging.log4j.Level;
import org.junit.Assert;
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionWithCancellationTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionWithCancellationTest.java
index c5ca66a..eae9d09 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionWithCancellationTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionWithCancellationTest.java
@@ -20,9 +20,9 @@
import java.util.Collection;
-import org.apache.asterix.common.exceptions.ExceptionUtils;
import org.apache.asterix.test.common.CancellationTestExecutor;
import org.apache.asterix.testframework.context.TestCaseContext;
+import org.apache.hyracks.api.util.ExceptionUtils;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/LogManagerTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/LogManagerTest.java
index 685d983..fb08fe3 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/LogManagerTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/LogManagerTest.java
@@ -31,7 +31,6 @@
import org.apache.asterix.common.config.TransactionProperties;
import org.apache.asterix.common.dataflow.DatasetLocalResource;
import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.exceptions.ExceptionUtils;
import org.apache.asterix.common.transactions.DatasetId;
import org.apache.asterix.common.transactions.ILockManager;
import org.apache.asterix.common.transactions.ILogManager;
@@ -113,7 +112,7 @@
logManager.log(logRecord);
}
} catch (ACIDException e) {
- Throwable rootCause = ExceptionUtils.getRootCause(e);
+ Throwable rootCause = org.apache.hyracks.api.util.ExceptionUtils.getRootCause(e);
if (rootCause instanceof java.lang.InterruptedException) {
interrupted.set(true);
}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ExceptionUtils.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ExceptionUtils.java
deleted file mode 100644
index f73848f..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ExceptionUtils.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * 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.asterix.common.exceptions;
-
-import java.util.function.Predicate;
-
-import org.apache.hyracks.api.exceptions.IFormattedException;
-
-public class ExceptionUtils {
- public static final String INCORRECT_PARAMETER = "Incorrect parameter.\n";
- public static final String PARAMETER_NAME = "Parameter name: ";
- public static final String EXPECTED_VALUE = "Expected value: ";
- public static final String PASSED_VALUE = "Passed value: ";
-
- private ExceptionUtils() {
- }
-
- public static String incorrectParameterMessage(String parameterName, String expectedValue, String passedValue) {
- return INCORRECT_PARAMETER + PARAMETER_NAME + parameterName + System.lineSeparator() + EXPECTED_VALUE
- + expectedValue + System.lineSeparator() + PASSED_VALUE + passedValue;
- }
-
- // Gets the error message for the root cause of a given Throwable instance.
- public static String getErrorMessage(Throwable th) {
- Throwable cause = getRootCause(th);
- return cause.getMessage();
- }
-
- // Finds the root cause of a given Throwable instance.
- public static Throwable getRootCause(Throwable e) {
- Throwable current = e;
- Throwable cause = e.getCause();
- while (cause != null && cause != current) {
- current = cause;
- cause = current.getCause();
- }
- return current;
- }
-
- /**
- * Determines whether supplied exception contains a matching cause in its hierarchy, or is itself a match
- */
- public static boolean matchingCause(Throwable e, Predicate<Throwable> test) {
- Throwable current = e;
- Throwable cause = e.getCause();
- while (cause != null && cause != current) {
- if (test.test(cause)) {
- return true;
- }
- Throwable nextCause = current.getCause();
- current = cause;
- cause = nextCause;
- }
- return test.test(e);
- }
-
- /**
- * Unwraps enclosed exceptions until a non-product exception is found, otherwise returns the root production
- * exception
- */
- public static Throwable unwrap(Throwable e) {
- Throwable current = e;
- Throwable cause = e.getCause();
- while (cause != null && cause != current && current instanceof IFormattedException) {
- current = cause;
- cause = current.getCause();
- }
- return current;
- }
-}
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/LocalFSInputStream.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/LocalFSInputStream.java
index f9eade5..ad762bf 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/LocalFSInputStream.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/LocalFSInputStream.java
@@ -26,7 +26,6 @@
import java.io.FileInputStream;
import java.io.IOException;
-import org.apache.asterix.common.exceptions.ExceptionUtils;
import org.apache.asterix.external.dataflow.AbstractFeedDataFlowController;
import org.apache.asterix.external.util.FeedLogManager;
import org.apache.asterix.external.util.FileSystemWatcher;
@@ -129,7 +128,7 @@
if (in == null) {
return false;
}
- Throwable root = ExceptionUtils.getRootCause(th);
+ Throwable root = org.apache.hyracks.api.util.ExceptionUtils.getRootCause(th);
if (root instanceof HyracksDataException) {
HyracksDataException r = (HyracksDataException) root;
boolean advance = false;
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExceptionUtils.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExceptionUtils.java
index d748ed8..7c304b9 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExceptionUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExceptionUtils.java
@@ -23,9 +23,11 @@
import java.util.List;
import java.util.Map;
import java.util.function.Function;
+import java.util.function.Predicate;
import org.apache.hyracks.api.exceptions.ErrorCode;
import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.exceptions.IFormattedException;
import org.apache.hyracks.util.ThrowingFunction;
import com.google.common.util.concurrent.UncheckedExecutionException;
@@ -158,4 +160,41 @@
throw HyracksDataException.create(e.getCause());
}
}
+
+ // Gets the error message for the root cause of a given Throwable instance.
+ public static String getErrorMessage(Throwable th) {
+ Throwable cause = getRootCause(th);
+ return cause.getMessage();
+ }
+
+ /**
+ * Determines whether supplied exception contains a matching cause in its hierarchy, or is itself a match
+ */
+ public static boolean matchingCause(Throwable e, Predicate<Throwable> test) {
+ Throwable current = e;
+ Throwable cause = e.getCause();
+ while (cause != null && cause != current) {
+ if (test.test(cause)) {
+ return true;
+ }
+ Throwable nextCause = current.getCause();
+ current = cause;
+ cause = nextCause;
+ }
+ return test.test(e);
+ }
+
+ /**
+ * Unwraps enclosed exceptions until a non-product exception is found, otherwise returns the root production
+ * exception
+ */
+ public static Throwable unwrap(Throwable e) {
+ Throwable current = e;
+ Throwable cause = e.getCause();
+ while (cause != current && cause instanceof IFormattedException) {
+ current = cause;
+ cause = current.getCause();
+ }
+ return current;
+ }
}