Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,10 @@ public class ErrorMessageFactory {
*/
public static ErrorMessage createErrorMessage(Exception e, int status) {
if (e instanceof OpenSearchException) {
return new OpenSearchErrorMessage(
(OpenSearchException) e, ((OpenSearchException) e).status().getStatus());
return new OpenSearchErrorMessage((OpenSearchException) e, status);
} else if (unwrapCause(e) instanceof OpenSearchException) {
OpenSearchException exception = (OpenSearchException) unwrapCause(e);
return new OpenSearchErrorMessage(exception, exception.status().getStatus());
return new OpenSearchErrorMessage(exception, status);
}
return new ErrorMessage(e, status);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@

public class OpenSearchErrorMessage extends ErrorMessage<OpenSearchException> {

OpenSearchErrorMessage(OpenSearchException exception, int defaultStatus) {
super(exception, exception.status() != null ? exception.status().getStatus() : defaultStatus);
OpenSearchErrorMessage(OpenSearchException exception, int status) {
super(exception, status);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import java.util.regex.Pattern;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.opensearch.action.search.SearchPhaseExecutionException;
import org.opensearch.action.search.ShardSearchFailure;
import org.opensearch.OpenSearchException;
import org.opensearch.common.inject.Injector;
import org.opensearch.common.settings.Settings;
Expand Down Expand Up @@ -171,7 +173,18 @@ private void handleException(RestChannel restChannel, Exception exception) {
logAndPublishMetrics(exception);
if (exception instanceof OpenSearchException) {
OpenSearchException openSearchException = (OpenSearchException) exception;
reportError(restChannel, openSearchException, openSearchException.status());
RestStatus status = openSearchException.status();
if (exception instanceof SearchPhaseExecutionException) {
for (ShardSearchFailure failure :
((SearchPhaseExecutionException) exception).shardFailures()) {
Throwable cause = failure.getCause();
if (cause instanceof Exception && isClientError((Exception) cause)) {
status = BAD_REQUEST;
break;
}
}
}
reportError(restChannel, openSearchException, status);
} else {
reportError(
restChannel, exception, isClientError(exception) ? BAD_REQUEST : INTERNAL_SERVER_ERROR);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -222,8 +222,12 @@ public void execute(
metric.add(System.nanoTime() - execTime);
listener.onResponse(response);

} catch (SQLException e) {
throw new RuntimeException(e);
} catch (Throwable t) {
if (t instanceof VirtualMachineError) {
throw (VirtualMachineError) t;
}
Exception e = (t instanceof Exception) ? (Exception) t : new RuntimeException(t);
listener.onFailure(e);
}
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@ public class ErrorMessageFactory {
public static ErrorMessage createErrorMessage(Throwable e, int status) {
Throwable cause = unwrapCause(e);
if (cause instanceof OpenSearchException) {
OpenSearchException exception = (OpenSearchException) cause;
return new OpenSearchErrorMessage(exception, exception.status().getStatus());
return new OpenSearchErrorMessage((OpenSearchException) cause, status);
}
return new ErrorMessage(cause, status);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
/** OpenSearch Error Message. */
public class OpenSearchErrorMessage extends ErrorMessage {

OpenSearchErrorMessage(OpenSearchException exception, int defaultStatus) {
super(exception, exception.status() != null ? exception.status().getStatus() : defaultStatus);
OpenSearchErrorMessage(OpenSearchException exception, int status) {
super(exception, status);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import java.util.Set;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.opensearch.action.search.SearchPhaseExecutionException;
import org.opensearch.action.search.ShardSearchFailure;
import org.opensearch.OpenSearchException;
import org.opensearch.core.action.ActionListener;
import org.opensearch.core.rest.RestStatus;
Expand Down Expand Up @@ -50,16 +52,23 @@ public RestPPLQueryAction() {
}

private static boolean isClientError(Exception e) {
return e instanceof NullPointerException
// NPE is hard to differentiate but more likely caused by bad query
|| e instanceof IllegalArgumentException
|| e instanceof IndexNotFoundException
|| e instanceof SemanticCheckException
|| e instanceof ExpressionEvaluationException
|| e instanceof QueryEngineException
|| e instanceof SyntaxCheckException
|| e instanceof DataSourceClientException
|| e instanceof IllegalAccessException;
// NPE is hard to differentiate but more likely caused by bad query
Throwable current = e;
while (current != null) {
if (current instanceof NullPointerException
|| current instanceof IllegalArgumentException
|| current instanceof IndexNotFoundException
|| current instanceof SemanticCheckException
|| current instanceof ExpressionEvaluationException
|| current instanceof QueryEngineException
|| current instanceof SyntaxCheckException
|| current instanceof DataSourceClientException
|| current instanceof IllegalAccessException) {
return true;
}
current = current.getCause();
}
return false;
}

@Override
Expand Down Expand Up @@ -106,11 +115,29 @@ public void onFailure(Exception e) {
reportError(channel, e, INTERNAL_SERVER_ERROR);
}
} else if (e instanceof OpenSearchException) {
Metrics.getInstance()
.getNumericalMetric(MetricName.PPL_FAILED_REQ_COUNT_CUS)
.increment();
OpenSearchException exception = (OpenSearchException) e;
reportError(channel, exception, exception.status());
RestStatus status = exception.status();
if (e instanceof SearchPhaseExecutionException) {
for (ShardSearchFailure failure :
((SearchPhaseExecutionException) e).shardFailures()) {
Throwable cause = failure.getCause();
if (cause instanceof Exception
&& isClientError((Exception) cause)) {
status = BAD_REQUEST;
break;
}
}
}
if (status == BAD_REQUEST) {
Metrics.getInstance()
.getNumericalMetric(MetricName.PPL_FAILED_REQ_COUNT_CUS)
.increment();
} else {
Metrics.getInstance()
.getNumericalMetric(MetricName.PPL_FAILED_REQ_COUNT_SYS)
.increment();
}
reportError(channel, exception, status);
} else {
LOG.error("Error happened during query handling", e);
if (isClientError(e)) {
Expand Down
Loading