This is an automated email from the ASF dual-hosted git repository. sk0x50 pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push: new 6145deb7d9 IGNITE-19864 Introduce TraceableException (#2287) 6145deb7d9 is described below commit 6145deb7d99ebde954e5d2b2f46609a9c521c209 Author: Slava Koptilin <slava.kopti...@gmail.com> AuthorDate: Wed Jul 5 18:20:51 2023 +0300 IGNITE-19864 Introduce TraceableException (#2287) --- .../apache/ignite/lang/IgniteCheckedException.java | 6 ++- .../org/apache/ignite/lang/IgniteException.java | 6 ++- .../apache/ignite/lang/IgniteExceptionUtils.java | 25 ++-------- .../handler/ClientInboundMessageHandler.java | 10 ++-- .../lang/IgniteInternalCheckedException.java | 6 ++- .../ignite/lang/IgniteInternalException.java | 6 ++- .../org/apache/ignite/lang/TraceableException.java | 57 ++++++++++++++++++++++ 7 files changed, 85 insertions(+), 31 deletions(-) diff --git a/modules/api/src/main/java/org/apache/ignite/lang/IgniteCheckedException.java b/modules/api/src/main/java/org/apache/ignite/lang/IgniteCheckedException.java index c8a3b94277..9c736cb4fb 100755 --- a/modules/api/src/main/java/org/apache/ignite/lang/IgniteCheckedException.java +++ b/modules/api/src/main/java/org/apache/ignite/lang/IgniteCheckedException.java @@ -28,7 +28,7 @@ import java.util.UUID; /** * General Ignite exception. Used to indicate any error condition within a node. */ -public class IgniteCheckedException extends Exception { +public class IgniteCheckedException extends Exception implements TraceableException { /** Serial version UID. */ private static final long serialVersionUID = 0L; @@ -165,6 +165,7 @@ public class IgniteCheckedException extends Exception { * * @return Full error code. */ + @Override public int code() { return code; } @@ -185,6 +186,7 @@ public class IgniteCheckedException extends Exception { * @see #code() * @return Error group. */ + @Override public int groupCode() { return extractGroupCode(code); } @@ -196,6 +198,7 @@ public class IgniteCheckedException extends Exception { * @see #groupCode() * @return Error code. */ + @Override public int errorCode() { return extractErrorCode(code); } @@ -205,6 +208,7 @@ public class IgniteCheckedException extends Exception { * * @return Unique identifier of the exception. */ + @Override public UUID traceId() { return traceId; } diff --git a/modules/api/src/main/java/org/apache/ignite/lang/IgniteException.java b/modules/api/src/main/java/org/apache/ignite/lang/IgniteException.java index 130f2afc87..64a06ac5c9 100644 --- a/modules/api/src/main/java/org/apache/ignite/lang/IgniteException.java +++ b/modules/api/src/main/java/org/apache/ignite/lang/IgniteException.java @@ -30,7 +30,7 @@ import org.jetbrains.annotations.Nullable; /** * General Ignite exception. Used to indicate any error condition within a node. */ -public class IgniteException extends RuntimeException { +public class IgniteException extends RuntimeException implements TraceableException { /** Serial version UID. */ private static final long serialVersionUID = 0L; @@ -205,6 +205,7 @@ public class IgniteException extends RuntimeException { * * @return Full error code. */ + @Override public int code() { return code; } @@ -225,6 +226,7 @@ public class IgniteException extends RuntimeException { * @see #code() * @return Error group. */ + @Override public int groupCode() { return extractGroupCode(code); } @@ -236,6 +238,7 @@ public class IgniteException extends RuntimeException { * @see #groupCode() * @return Error code. */ + @Override public int errorCode() { return extractErrorCode(code); } @@ -245,6 +248,7 @@ public class IgniteException extends RuntimeException { * * @return Unique identifier of the exception. */ + @Override public UUID traceId() { return traceId; } diff --git a/modules/api/src/main/java/org/apache/ignite/lang/IgniteExceptionUtils.java b/modules/api/src/main/java/org/apache/ignite/lang/IgniteExceptionUtils.java index 7b447bd70c..b80700356d 100755 --- a/modules/api/src/main/java/org/apache/ignite/lang/IgniteExceptionUtils.java +++ b/modules/api/src/main/java/org/apache/ignite/lang/IgniteExceptionUtils.java @@ -142,15 +142,8 @@ public class IgniteExceptionUtils { * @return Trace identifier. */ public static @Nullable UUID extractTraceIdFrom(Throwable t) { - // Perhaps, it would be nice to introduce a new interface IgniteTraceableException to overcome if else statements. - if (t instanceof IgniteException) { - return ((IgniteException) t).traceId(); - } else if (t instanceof IgniteCheckedException) { - return ((IgniteCheckedException) t).traceId(); - } else if (t instanceof IgniteInternalException) { - return ((IgniteInternalException) t).traceId(); - } else if (t instanceof IgniteInternalCheckedException) { - return ((IgniteInternalCheckedException) t).traceId(); + if (t instanceof TraceableException) { + return ((TraceableException) t).traceId(); } return null; @@ -163,15 +156,8 @@ public class IgniteExceptionUtils { * @return Trace identifier. */ public static int extractCodeFrom(Throwable t) { - // Perhaps, it would be nice to introduce a new interface IgniteTraceableException to overcome if else statements. - if (t instanceof IgniteException) { - return ((IgniteException) t).code(); - } else if (t instanceof IgniteCheckedException) { - return ((IgniteCheckedException) t).code(); - } else if (t instanceof IgniteInternalException) { - return ((IgniteInternalException) t).code(); - } else if (t instanceof IgniteInternalCheckedException) { - return ((IgniteInternalCheckedException) t).code(); + if (t instanceof TraceableException) { + return ((TraceableException) t).code(); } return INTERNAL_ERR; @@ -298,8 +284,7 @@ public class IgniteExceptionUtils { T exc = copy(constructor, traceId, code, message, cause); // Make sure that error code and trace id are the same. - if (exc instanceof IgniteException || exc instanceof IgniteCheckedException || exc instanceof IgniteInternalException - || exc instanceof IgniteInternalCheckedException) { + if (exc instanceof TraceableException) { // Error code should be the same assert code == extractCodeFrom(exc) : "Unexpected error code [originCode=" + code + ", code=" + extractCodeFrom(exc) + ", err=" + exc + ']'; diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java index 392a3f707f..bb4790ee49 100644 --- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java +++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientInboundMessageHandler.java @@ -103,9 +103,9 @@ import org.apache.ignite.internal.security.authentication.UsernamePasswordReques import org.apache.ignite.internal.sql.engine.QueryProcessor; import org.apache.ignite.internal.table.IgniteTablesInternal; import org.apache.ignite.internal.util.ExceptionUtils; -import org.apache.ignite.lang.IgniteCheckedException; import org.apache.ignite.lang.IgniteException; import org.apache.ignite.lang.IgniteInternalCheckedException; +import org.apache.ignite.lang.TraceableException; import org.apache.ignite.network.ClusterNode; import org.apache.ignite.network.ClusterService; import org.apache.ignite.security.AuthenticationException; @@ -395,12 +395,8 @@ public class ClientInboundMessageHandler extends ChannelInboundHandlerAdapter im private void writeErrorCore(Throwable err, ClientMessagePacker packer) { err = ExceptionUtils.unwrapCause(err); - if (err instanceof IgniteException) { - IgniteException iex = (IgniteException) err; - packer.packUuid(iex.traceId()); - packer.packInt(iex.code()); - } else if (err instanceof IgniteCheckedException) { - IgniteCheckedException iex = (IgniteCheckedException) err; + if (err instanceof TraceableException) { + TraceableException iex = (TraceableException) err; packer.packUuid(iex.traceId()); packer.packInt(iex.code()); } else { diff --git a/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalCheckedException.java b/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalCheckedException.java index 8778031b80..a96286ef63 100644 --- a/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalCheckedException.java +++ b/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalCheckedException.java @@ -30,7 +30,7 @@ import org.jetbrains.annotations.Nullable; /** * General internal checked exception. This exception is used to indicate any error condition within the node. */ -public class IgniteInternalCheckedException extends Exception { +public class IgniteInternalCheckedException extends Exception implements TraceableException { /** Serial version uid. */ private static final long serialVersionUID = 0L; @@ -241,6 +241,7 @@ public class IgniteInternalCheckedException extends Exception { * * @return Full error code. */ + @Override public int code() { return code; } @@ -261,6 +262,7 @@ public class IgniteInternalCheckedException extends Exception { * @see #code() * @return Error group. */ + @Override public int groupCode() { return extractGroupCode(code); } @@ -272,6 +274,7 @@ public class IgniteInternalCheckedException extends Exception { * @see #groupCode() * @return Error code. */ + @Override public int errorCode() { return extractErrorCode(code); } @@ -281,6 +284,7 @@ public class IgniteInternalCheckedException extends Exception { * * @return Unique identifier of this exception. */ + @Override public UUID traceId() { return traceId; } diff --git a/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalException.java b/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalException.java index 33d108c19a..af904e9380 100644 --- a/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalException.java +++ b/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalException.java @@ -30,7 +30,7 @@ import org.jetbrains.annotations.Nullable; /** * General internal exception. This exception is used to indicate any error condition within the node. */ -public class IgniteInternalException extends RuntimeException { +public class IgniteInternalException extends RuntimeException implements TraceableException { /** Serial version uid. */ private static final long serialVersionUID = 0L; @@ -218,6 +218,7 @@ public class IgniteInternalException extends RuntimeException { * * @return Full error code. */ + @Override public int code() { return code; } @@ -238,6 +239,7 @@ public class IgniteInternalException extends RuntimeException { * @see #code() * @return Error group. */ + @Override public int groupCode() { return extractGroupCode(code); } @@ -249,6 +251,7 @@ public class IgniteInternalException extends RuntimeException { * @see #groupCode() * @return Error code. */ + @Override public int errorCode() { return extractErrorCode(code); } @@ -258,6 +261,7 @@ public class IgniteInternalException extends RuntimeException { * * @return Unique identifier of this exception. */ + @Override public UUID traceId() { return traceId; } diff --git a/modules/core/src/main/java/org/apache/ignite/lang/TraceableException.java b/modules/core/src/main/java/org/apache/ignite/lang/TraceableException.java new file mode 100755 index 0000000000..1dee962d51 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/lang/TraceableException.java @@ -0,0 +1,57 @@ +/* + * 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.ignite.lang; + +import java.util.UUID; + +/** + * Interface representing an exception that can be identified with trace identifier and provides an error code. + */ +public interface TraceableException { + /** + * Returns a unique identifier of the exception. + * + * @return Unique identifier of the exception. + */ + UUID traceId(); + + /** + * Returns a full error code that includes the error's group and code, which uniquely identifies the problem within the group. This is a + * combination of two most-significant bytes for the error group and two least-significant bytes for the error code. + * + * @return Full error code. + */ + public int code(); + + /** + * Returns an error group. + * + * @see #code() + * @return Error group. + */ + public int groupCode(); + + /** + * Returns an error code that uniquely identifies the problem within a group. + * + * @see #code() + * @see #groupCode() + * @return Error code. + */ + public int errorCode(); +}