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 cfb3b11893 IGNITE-17539 Fix error groups initialization on start-up 
(#2507)
cfb3b11893 is described below

commit cfb3b11893b63ba368061d95ba0645d1b6724625
Author: Slava Koptilin <slava.kopti...@gmail.com>
AuthorDate: Wed Aug 30 16:41:47 2023 +0300

    IGNITE-17539 Fix error groups initialization on start-up (#2507)
---
 .../java/org/apache/ignite/lang/ErrorGroup.java    |  80 +-------------
 .../java/org/apache/ignite/lang/ErrorGroups.java   | 119 ++++++++++++++++++---
 .../apache/ignite/lang/IgniteCheckedException.java |   4 +-
 .../org/apache/ignite/lang/IgniteException.java    |   4 +-
 .../ignite/internal/client/TcpIgniteClient.java    |   3 +
 .../lang/IgniteInternalCheckedException.java       |   4 +-
 .../ignite/lang/IgniteInternalException.java       |   4 +-
 .../org/apache/ignite/lang/ErrorGroupTest.java     |  13 +++
 .../ErrorGroupsGenerator.cs                        |   2 +-
 .../dotnet/Apache.Ignite.Tests/ErrorGroupTests.cs  |   4 +-
 .../apache/ignite/internal/app/IgnitionImpl.java   |   3 +
 .../tx/TransactionInternalCheckedException.java    |   4 +-
 12 files changed, 139 insertions(+), 105 deletions(-)

diff --git a/modules/api/src/main/java/org/apache/ignite/lang/ErrorGroup.java 
b/modules/api/src/main/java/org/apache/ignite/lang/ErrorGroup.java
index b76cf37b7f..b564afbd2c 100755
--- a/modules/api/src/main/java/org/apache/ignite/lang/ErrorGroup.java
+++ b/modules/api/src/main/java/org/apache/ignite/lang/ErrorGroup.java
@@ -18,12 +18,10 @@
 package org.apache.ignite.lang;
 
 import static java.util.regex.Pattern.DOTALL;
+import static org.apache.ignite.lang.ErrorGroups.errorGroupByCode;
 
-import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
-import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
 import it.unimi.dsi.fastutil.ints.IntSet;
-import java.util.Locale;
 import java.util.UUID;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -41,9 +39,6 @@ public class ErrorGroup {
     private static final Pattern EXCEPTION_MESSAGE_PATTERN =
             
Pattern.compile("(.*)(IGN)-([A-Z]+)-(\\d+)\\s(TraceId:)([a-f0-9]{8}(?:-[a-f0-9]{4}){4}[a-f0-9]{8})(\\s?)(.*)",
 DOTALL);
 
-    /** List of all registered error groups. */
-    private static final Int2ObjectMap<ErrorGroup> registeredGroups = new 
Int2ObjectOpenHashMap<>();
-
     /** Group name. */
     private final String groupName;
 
@@ -59,7 +54,7 @@ public class ErrorGroup {
      * @param groupName Group name.
      * @param groupCode Group code.
      */
-    private ErrorGroup(String groupName, short groupCode) {
+    ErrorGroup(String groupName, short groupCode) {
         this.groupName = groupName;
         this.groupCode = groupCode;
     }
@@ -99,53 +94,6 @@ public class ErrorGroup {
         return (groupCode() << 16) | (errorCode & 0xFFFF);
     }
 
-    /**
-     * Creates a new error group with the given {@code groupName} and {@code 
groupCode}.
-     *
-     * @param groupName Group name to be created.
-     * @param groupCode Group code to be created.
-     * @return New error group.
-     * @throws IllegalArgumentException If the specified name or group code 
already registered.
-     *      Also, this exception is thrown if the given {@code groupName} is 
{@code null} or empty.
-     */
-    public static synchronized ErrorGroup newGroup(String groupName, short 
groupCode) {
-        if (groupName == null || groupName.isEmpty()) {
-            throw new IllegalArgumentException("Group name is null or empty");
-        }
-
-        String grpName = groupName.toUpperCase(Locale.ENGLISH);
-
-        if (registeredGroups.containsKey(groupCode)) {
-            throw new IllegalArgumentException(
-                    "Error group already registered [groupName=" + groupName + 
", groupCode=" + groupCode
-                            + ", registeredGroup=" + 
registeredGroups.get(groupCode) + ']');
-        }
-
-        for (ErrorGroup group : registeredGroups.values()) {
-            if (group.name().equals(groupName)) {
-                throw new IllegalArgumentException(
-                    "Error group already registered [groupName=" + groupName + 
", groupCode=" + groupCode
-                            + ", registeredGroup=" + group + ']');
-            }
-        }
-
-        ErrorGroup newGroup = new ErrorGroup(grpName, groupCode);
-
-        registeredGroups.put(groupCode, newGroup);
-
-        return newGroup;
-    }
-
-    /**
-     * Returns group code extracted from the given full error code.
-     *
-     * @param code Full error code.
-     * @return Group code.
-     */
-    public static short extractGroupCode(int code) {
-        return (short) (code >>> 16);
-    }
-
     /**
      * Returns error code extracted from the given full error code.
      *
@@ -156,26 +104,6 @@ public class ErrorGroup {
         return (short) (code & 0xFFFF);
     }
 
-    /**
-     * Returns error group identified by the given {@code groupCode}.
-     *
-     * @param groupCode Group code
-     * @return Error Group.
-     */
-    public static ErrorGroup errorGroupByGroupCode(short groupCode) {
-        return registeredGroups.get(groupCode);
-    }
-
-    /**
-     * Returns error group identified by the given error {@code code}.
-     *
-     * @param code Full error code
-     * @return Error Group.
-     */
-    public static ErrorGroup errorGroupByCode(int code) {
-        return registeredGroups.get(extractGroupCode(code));
-    }
-
     /**
      * Creates a new error message with predefined prefix.
      *
@@ -185,7 +113,7 @@ public class ErrorGroup {
      * @return New error message with predefined prefix.
      */
     public static String errorMessage(UUID traceId, int code, String message) {
-        return errorMessage(traceId, 
registeredGroups.get(extractGroupCode(code)).name(), code, message);
+        return errorMessage(traceId, errorGroupByCode(code).name(), code, 
message);
     }
 
     /**
@@ -211,7 +139,7 @@ public class ErrorGroup {
      * @return New error message with predefined prefix.
      */
     public static String errorMessageFromCause(UUID traceId, int code, 
Throwable cause) {
-        return errorMessageFromCause(traceId, 
registeredGroups.get(extractGroupCode(code)).name(), code, cause);
+        return errorMessageFromCause(traceId, errorGroupByCode(code).name(), 
code, cause);
     }
 
     /**
diff --git a/modules/api/src/main/java/org/apache/ignite/lang/ErrorGroups.java 
b/modules/api/src/main/java/org/apache/ignite/lang/ErrorGroups.java
index 50f85f0049..c6a54f049d 100755
--- a/modules/api/src/main/java/org/apache/ignite/lang/ErrorGroups.java
+++ b/modules/api/src/main/java/org/apache/ignite/lang/ErrorGroups.java
@@ -17,15 +17,102 @@
 
 package org.apache.ignite.lang;
 
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import java.util.Locale;
+
 /**
  * Defines error groups and its errors.
  */
 @SuppressWarnings("PublicInnerClass")
 public class ErrorGroups {
+    /** List of all registered error groups. */
+    private static final Int2ObjectMap<ErrorGroup> registeredGroups = new 
Int2ObjectOpenHashMap<>();
+
+    /**
+     * Initializes and register all error groups and error codes.
+     */
+    public static synchronized void initialize() {
+        for (Class<?> cls : ErrorGroups.class.getDeclaredClasses()) {
+            try {
+                cls.getDeclaredConstructor().newInstance();
+            } catch (Exception e) {
+                throw new RuntimeException("Failed to initialize error 
groups", e);
+            }
+        }
+    }
+
+    /**
+     * Creates a new error group with the given {@code groupName} and {@code 
groupCode}.
+     *
+     * @param groupName Group name to be created.
+     * @param groupCode Group code to be created.
+     * @return New error group.
+     * @throws IllegalArgumentException If the specified name or group code 
already registered.
+     *      Also, this exception is thrown if the given {@code groupName} is 
{@code null} or empty.
+     */
+    public static synchronized ErrorGroup registerGroup(String groupName, 
short groupCode) {
+        if (groupName == null || groupName.isEmpty()) {
+            throw new IllegalArgumentException("Group name is null or empty");
+        }
+
+        String grpName = groupName.toUpperCase(Locale.ENGLISH);
+
+        if (registeredGroups.containsKey(groupCode)) {
+            throw new IllegalArgumentException(
+                    "Error group already registered [groupName=" + groupName + 
", groupCode=" + groupCode
+                            + ", registeredGroup=" + 
registeredGroups.get(groupCode) + ']');
+        }
+
+        for (ErrorGroup group : registeredGroups.values()) {
+            if (group.name().equals(groupName)) {
+                throw new IllegalArgumentException(
+                        "Error group already registered [groupName=" + 
groupName + ", groupCode=" + groupCode
+                                + ", registeredGroup=" + group + ']');
+            }
+        }
+
+        ErrorGroup newGroup = new ErrorGroup(grpName, groupCode);
+
+        registeredGroups.put(groupCode, newGroup);
+
+        return newGroup;
+    }
+
+    /**
+     * Returns group code extracted from the given full error code.
+     *
+     * @param code Full error code.
+     * @return Group code.
+     */
+    public static short extractGroupCode(int code) {
+        return (short) (code >>> 16);
+    }
+
+    /**
+     * Returns error group identified by the given {@code groupCode}.
+     *
+     * @param groupCode Group code
+     * @return Error Group.
+     */
+    public static ErrorGroup errorGroupByGroupCode(short groupCode) {
+        return registeredGroups.get(groupCode);
+    }
+
+    /**
+     * Returns error group identified by the given error {@code code}.
+     *
+     * @param code Full error code
+     * @return Error Group.
+     */
+    public static ErrorGroup errorGroupByCode(int code) {
+        return registeredGroups.get(extractGroupCode(code));
+    }
+
     /** Common error group. */
     public static class Common {
         /** Common error group. */
-        public static final ErrorGroup COMMON_ERR_GROUP = 
ErrorGroup.newGroup("CMN", (short) 1);
+        public static final ErrorGroup COMMON_ERR_GROUP = registerGroup("CMN", 
(short) 1);
 
         /** Node stopping error. */
         public static final int NODE_STOPPING_ERR = 
COMMON_ERR_GROUP.registerErrorCode((short) 1);
@@ -52,7 +139,7 @@ public class ErrorGroups {
     /** Tables error group. */
     public static class Table {
         /** Table error group. */
-        public static final ErrorGroup TABLE_ERR_GROUP = 
ErrorGroup.newGroup("TBL", (short) 2);
+        public static final ErrorGroup TABLE_ERR_GROUP = registerGroup("TBL", 
(short) 2);
 
         /** Table already exists. */
         public static final int TABLE_ALREADY_EXISTS_ERR = 
TABLE_ERR_GROUP.registerErrorCode((short) 1);
@@ -79,7 +166,7 @@ public class ErrorGroups {
     /** Client error group. */
     public static class Client {
         /** Client error group. */
-        public static final ErrorGroup CLIENT_ERR_GROUP = 
ErrorGroup.newGroup("CLIENT", (short) 3);
+        public static final ErrorGroup CLIENT_ERR_GROUP = 
registerGroup("CLIENT", (short) 3);
 
         /** Connection failed. */
         public static final int CONNECTION_ERR = 
CLIENT_ERR_GROUP.registerErrorCode((short) 1);
@@ -115,7 +202,7 @@ public class ErrorGroups {
     /** SQL error group. */
     public static class Sql {
         /** SQL error group. */
-        public static final ErrorGroup SQL_ERR_GROUP = 
ErrorGroup.newGroup("SQL", (short) 4);
+        public static final ErrorGroup SQL_ERR_GROUP = registerGroup("SQL", 
(short) 4);
 
         /** No more pages in the cursor error. */
         public static final int CURSOR_NO_MORE_PAGES_ERR = 
SQL_ERR_GROUP.registerErrorCode((short) 1);
@@ -172,7 +259,7 @@ public class ErrorGroups {
     /** Meta storage error group. */
     public static class MetaStorage {
         /** Meta storage error group. */
-        public static final ErrorGroup META_STORAGE_ERR_GROUP = 
ErrorGroup.newGroup("META", (short) 5);
+        public static final ErrorGroup META_STORAGE_ERR_GROUP = 
registerGroup("META", (short) 5);
 
         /** Failed to start the underlying key value storage. */
         public static final int STARTING_STORAGE_ERR = 
META_STORAGE_ERR_GROUP.registerErrorCode((short) 1);
@@ -193,7 +280,7 @@ public class ErrorGroups {
     /** Index error group. */
     public static class Index {
         /** Index error group. */
-        public static final ErrorGroup INDEX_ERR_GROUP = 
ErrorGroup.newGroup("IDX", (short) 6);
+        public static final ErrorGroup INDEX_ERR_GROUP = registerGroup("IDX", 
(short) 6);
 
         /** Invalid index definition. */
         public static final int INVALID_INDEX_DEFINITION_ERR = 
INDEX_ERR_GROUP.registerErrorCode((short) 1);
@@ -208,7 +295,7 @@ public class ErrorGroups {
     /** Transactions error group. */
     public static class Transactions {
         /** Transactions error group. */
-        public static final ErrorGroup TX_ERR_GROUP = 
ErrorGroup.newGroup("TX", (short) 7);
+        public static final ErrorGroup TX_ERR_GROUP = registerGroup("TX", 
(short) 7);
 
         /** Error of tx state storage. */
         public static final int TX_STATE_STORAGE_ERR = 
TX_ERR_GROUP.registerErrorCode((short) 1);
@@ -250,7 +337,7 @@ public class ErrorGroups {
     /** Replicator error group. */
     public static class Replicator {
         /** Replicator error group. */
-        public static final ErrorGroup REPLICATOR_ERR_GROUP = 
ErrorGroup.newGroup("REP", (short) 8);
+        public static final ErrorGroup REPLICATOR_ERR_GROUP = 
registerGroup("REP", (short) 8);
 
         /** Common error for the replication procedure. */
         public static final int REPLICA_COMMON_ERR = 
REPLICATOR_ERR_GROUP.registerErrorCode((short) 1);
@@ -281,7 +368,7 @@ public class ErrorGroups {
     /** Storage error group. */
     public static class Storage {
         /** Storage error group. */
-        public static final ErrorGroup STORAGE_ERR_GROUP = 
ErrorGroup.newGroup("STORAGE", (short) 9);
+        public static final ErrorGroup STORAGE_ERR_GROUP = 
registerGroup("STORAGE", (short) 9);
 
         /** Default error code when nothing else is specified. */
         public static final int GENERIC_ERR = 
STORAGE_ERR_GROUP.registerErrorCode((short) 1);
@@ -299,7 +386,7 @@ public class ErrorGroups {
     /** Distribution zones error group. */
     public static class DistributionZones {
         /** Distribution zones group. */
-        public static final ErrorGroup DISTRIBUTION_ZONES_ERR_GROUP = 
ErrorGroup.newGroup("DISTRZONES", (short) 10);
+        public static final ErrorGroup DISTRIBUTION_ZONES_ERR_GROUP = 
registerGroup("DISTRZONES", (short) 10);
 
         /** Distribution zone already exists. */
         public static final int ZONE_ALREADY_EXISTS_ERR = 
DISTRIBUTION_ZONES_ERR_GROUP.registerErrorCode((short) 1);
@@ -320,7 +407,7 @@ public class ErrorGroups {
     /** Network error group. */
     public static class Network {
         /** Network error group. */
-        public static final ErrorGroup NETWORK_ERR_GROUP = 
ErrorGroup.newGroup("NETWORK", (short) 11);
+        public static final ErrorGroup NETWORK_ERR_GROUP = 
registerGroup("NETWORK", (short) 11);
 
         /** Unresolvable consistent ID. */
         public static final int UNRESOLVABLE_CONSISTENT_ID_ERR = 
NETWORK_ERR_GROUP.registerErrorCode((short) 1);
@@ -332,7 +419,7 @@ public class ErrorGroups {
     /** Node configuration error group. */
     public static class NodeConfiguration {
         /** Node configuration error group. */
-        public static final ErrorGroup NODE_CONFIGURATION_ERR_GROUP = 
ErrorGroup.newGroup("NODECFG", (short) 12);
+        public static final ErrorGroup NODE_CONFIGURATION_ERR_GROUP = 
registerGroup("NODECFG", (short) 12);
 
         /** Config read error. */
         public static final int CONFIG_READ_ERR = 
NODE_CONFIGURATION_ERR_GROUP.registerErrorCode((short) 1);
@@ -350,7 +437,7 @@ public class ErrorGroups {
     /** Code deployment error group. */
     public static class CodeDeployment {
         /** Code deployment error group. */
-        public static final ErrorGroup CODE_DEPLOYMENT_ERR_GROUP = 
ErrorGroup.newGroup("CODEDEPLOY", (short) 13);
+        public static final ErrorGroup CODE_DEPLOYMENT_ERR_GROUP = 
registerGroup("CODEDEPLOY", (short) 13);
 
         /** Access to non-existing deployment unit. */
         public static final int UNIT_NOT_FOUND_ERR = 
CODE_DEPLOYMENT_ERR_GROUP.registerErrorCode((short) 1);
@@ -370,7 +457,7 @@ public class ErrorGroups {
      */
     public static class GarbageCollector {
         /** Garbage collector error group. */
-        public static final ErrorGroup GC_ERR_GROUP = 
ErrorGroup.newGroup("GC", (short) 14);
+        public static final ErrorGroup GC_ERR_GROUP = registerGroup("GC", 
(short) 14);
 
         /** Garbage collector closed error. */
         public static final int CLOSED_ERR = 
GC_ERR_GROUP.registerErrorCode((short) 1);
@@ -381,7 +468,7 @@ public class ErrorGroups {
      */
     public static class Authentication {
         /** Authentication error group. */
-        public static final ErrorGroup AUTHENTICATION_ERR_GROUP = 
ErrorGroup.newGroup("AUTHENTICATION", (short) 15);
+        public static final ErrorGroup AUTHENTICATION_ERR_GROUP = 
registerGroup("AUTHENTICATION", (short) 15);
 
         /** General authentication error. */
         public static final int COMMON_AUTHENTICATION_ERR = 
AUTHENTICATION_ERR_GROUP.registerErrorCode((short) 1);
@@ -392,7 +479,7 @@ public class ErrorGroups {
      */
     public static class Compute {
         /** Compute error group. */
-        public static final ErrorGroup COMPUTE_ERR_GROUP = 
ErrorGroup.newGroup("COMPUTE", (short) 16);
+        public static final ErrorGroup COMPUTE_ERR_GROUP = 
registerGroup("COMPUTE", (short) 16);
 
         /** Classpath error. */
         public static final int CLASS_PATH_ERR = 
COMPUTE_ERR_GROUP.registerErrorCode((short) 1);
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 ed4c9b691a..aaccd9a4cb 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
@@ -18,10 +18,10 @@
 package org.apache.ignite.lang;
 
 import static org.apache.ignite.lang.ErrorGroup.ERR_PREFIX;
-import static org.apache.ignite.lang.ErrorGroup.errorGroupByCode;
 import static org.apache.ignite.lang.ErrorGroup.errorMessage;
 import static org.apache.ignite.lang.ErrorGroup.extractErrorCode;
-import static org.apache.ignite.lang.ErrorGroup.extractGroupCode;
+import static org.apache.ignite.lang.ErrorGroups.errorGroupByCode;
+import static org.apache.ignite.lang.ErrorGroups.extractGroupCode;
 import static org.apache.ignite.lang.util.TraceIdUtils.getOrCreateTraceId;
 
 import java.util.UUID;
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 af8d4cd0f2..5e43c721e0 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
@@ -18,11 +18,11 @@
 package org.apache.ignite.lang;
 
 import static org.apache.ignite.lang.ErrorGroup.ERR_PREFIX;
-import static org.apache.ignite.lang.ErrorGroup.errorGroupByCode;
 import static org.apache.ignite.lang.ErrorGroup.errorMessage;
 import static org.apache.ignite.lang.ErrorGroup.extractErrorCode;
-import static org.apache.ignite.lang.ErrorGroup.extractGroupCode;
 import static org.apache.ignite.lang.ErrorGroups.Common.INTERNAL_ERR;
+import static org.apache.ignite.lang.ErrorGroups.errorGroupByCode;
+import static org.apache.ignite.lang.ErrorGroups.extractGroupCode;
 import static org.apache.ignite.lang.util.TraceIdUtils.getOrCreateTraceId;
 
 import java.util.UUID;
diff --git 
a/modules/client/src/main/java/org/apache/ignite/internal/client/TcpIgniteClient.java
 
b/modules/client/src/main/java/org/apache/ignite/internal/client/TcpIgniteClient.java
index 111f1655ff..8c77eba74d 100644
--- 
a/modules/client/src/main/java/org/apache/ignite/internal/client/TcpIgniteClient.java
+++ 
b/modules/client/src/main/java/org/apache/ignite/internal/client/TcpIgniteClient.java
@@ -34,6 +34,7 @@ import 
org.apache.ignite.internal.client.tx.ClientTransactions;
 import org.apache.ignite.internal.jdbc.proto.ClientMessage;
 import org.apache.ignite.internal.metrics.MetricManager;
 import org.apache.ignite.internal.metrics.exporters.jmx.JmxExporter;
+import org.apache.ignite.lang.ErrorGroups;
 import org.apache.ignite.network.ClusterNode;
 import org.apache.ignite.network.NetworkAddress;
 import org.apache.ignite.sql.IgniteSql;
@@ -131,6 +132,8 @@ public class TcpIgniteClient implements IgniteClient {
      * @return Future representing pending completion of the operation.
      */
     public static CompletableFuture<IgniteClient> 
startAsync(IgniteClientConfiguration cfg) {
+        ErrorGroups.initialize();
+
         //noinspection resource: returned from method
         var client = new TcpIgniteClient(cfg);
 
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 52491241ab..62f2409402 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
@@ -18,11 +18,11 @@
 package org.apache.ignite.lang;
 
 import static org.apache.ignite.lang.ErrorGroup.ERR_PREFIX;
-import static org.apache.ignite.lang.ErrorGroup.errorGroupByCode;
 import static org.apache.ignite.lang.ErrorGroup.errorMessage;
 import static org.apache.ignite.lang.ErrorGroup.extractErrorCode;
-import static org.apache.ignite.lang.ErrorGroup.extractGroupCode;
 import static org.apache.ignite.lang.ErrorGroups.Common.INTERNAL_ERR;
+import static org.apache.ignite.lang.ErrorGroups.errorGroupByCode;
+import static org.apache.ignite.lang.ErrorGroups.extractGroupCode;
 import static org.apache.ignite.lang.util.TraceIdUtils.getOrCreateTraceId;
 
 import java.util.UUID;
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 2610630c46..57181d35f5 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
@@ -18,11 +18,11 @@
 package org.apache.ignite.lang;
 
 import static org.apache.ignite.lang.ErrorGroup.ERR_PREFIX;
-import static org.apache.ignite.lang.ErrorGroup.errorGroupByCode;
 import static org.apache.ignite.lang.ErrorGroup.errorMessage;
 import static org.apache.ignite.lang.ErrorGroup.extractErrorCode;
-import static org.apache.ignite.lang.ErrorGroup.extractGroupCode;
 import static org.apache.ignite.lang.ErrorGroups.Common.INTERNAL_ERR;
+import static org.apache.ignite.lang.ErrorGroups.errorGroupByCode;
+import static org.apache.ignite.lang.ErrorGroups.extractGroupCode;
 import static org.apache.ignite.lang.util.TraceIdUtils.getOrCreateTraceId;
 
 import java.util.UUID;
diff --git 
a/modules/core/src/test/java/org/apache/ignite/lang/ErrorGroupTest.java 
b/modules/core/src/test/java/org/apache/ignite/lang/ErrorGroupTest.java
index db90b14341..7e775429bc 100644
--- a/modules/core/src/test/java/org/apache/ignite/lang/ErrorGroupTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/lang/ErrorGroupTest.java
@@ -19,6 +19,7 @@ package org.apache.ignite.lang;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.notNullValue;
 import static org.junit.jupiter.api.Assertions.fail;
 
 import java.util.Arrays;
@@ -29,6 +30,18 @@ import org.apache.ignite.lang.ErrorGroups.Common;
 import org.junit.jupiter.api.Test;
 
 class ErrorGroupTest {
+    @Test
+    public void testErrorCodeInitialization() throws Exception {
+        ErrorGroups.initialize();
+
+        // Check that all error codes are initialized.
+        int errGroupsCount = ErrorGroups.class.getDeclaredClasses().length;
+        for (int groupCode = 1; groupCode <= errGroupsCount; groupCode++) {
+            ErrorGroup errGroup = ErrorGroups.errorGroupByCode(groupCode << 
16);
+            assertThat("Error group is not initialized for code: " + 
groupCode, errGroup, notNullValue());
+        }
+    }
+
     @Test
     void extractsCauseMessageFromIgniteExceptionMessage() {
         // Given
diff --git 
a/modules/platforms/dotnet/Apache.Ignite.Internal.Generators/ErrorGroupsGenerator.cs
 
b/modules/platforms/dotnet/Apache.Ignite.Internal.Generators/ErrorGroupsGenerator.cs
index 5a7242d241..d1c25d5872 100644
--- 
a/modules/platforms/dotnet/Apache.Ignite.Internal.Generators/ErrorGroupsGenerator.cs
+++ 
b/modules/platforms/dotnet/Apache.Ignite.Internal.Generators/ErrorGroupsGenerator.cs
@@ -58,7 +58,7 @@ namespace Apache.Ignite.Internal.Generators
             // ErrorGroup TX_ERR_GROUP = ErrorGroup.newGroup("TX", 7);
             var javaErrorGroups = Regex.Matches(
                     javaErrorGroupsText,
-                    @"public static class ([A-Za-z]+) {\s+/\*\*.*?\*/\s+public 
static final ErrorGroup ([\w_]+)_ERR_GROUP = ErrorGroup.newGroup\(""([\w_]+)"", 
\(short\)\s*(\d+)",
+                    @"public static class ([A-Za-z]+) {\s+/\*\*.*?\*/\s+public 
static final ErrorGroup ([\w_]+)_ERR_GROUP = registerGroup\(""([\w_]+)"", 
\(short\)\s*(\d+)",
                     RegexOptions.Singleline | RegexOptions.CultureInvariant)
                 .Cast<Match>()
                 .Select(x => (ClassName: x.Groups[1].Value, GroupName: 
x.Groups[2].Value, ShortGroupName: x.Groups[3].Value, Code: 
short.Parse(x.Groups[4].Value, CultureInfo.InvariantCulture)))
diff --git a/modules/platforms/dotnet/Apache.Ignite.Tests/ErrorGroupTests.cs 
b/modules/platforms/dotnet/Apache.Ignite.Tests/ErrorGroupTests.cs
index 5c6b8efbae..c75221b3aa 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Tests/ErrorGroupTests.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Tests/ErrorGroupTests.cs
@@ -97,10 +97,10 @@ namespace Apache.Ignite.Tests
 
             var javaErrorGroupsText = File.ReadAllText(JavaErrorGroupsFile);
 
-            // ErrorGroup TX_ERR_GROUP = ErrorGroup.newGroup("TX", 7);
+            // ErrorGroup TX_ERR_GROUP = registerGroup("TX", 7);
             var javaErrorGroups = Regex.Matches(
                 javaErrorGroupsText,
-                @"ErrorGroup ([\w_]+)_ERR_GROUP = 
ErrorGroup.newGroup\(""(\w+)"", \(short\)\s*(\d+)\);")
+                @"ErrorGroup ([\w_]+)_ERR_GROUP = registerGroup\(""(\w+)"", 
\(short\)\s*(\d+)\);")
                 .Select(x => (Name: x.Groups[1].Value, ShortName: 
x.Groups[2].Value, Code: short.Parse(x.Groups[3].Value, 
CultureInfo.InvariantCulture)))
                 .ToList();
 
diff --git 
a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgnitionImpl.java 
b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgnitionImpl.java
index 9b8dde4969..ff0ccf52c1 100644
--- 
a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgnitionImpl.java
+++ 
b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgnitionImpl.java
@@ -34,6 +34,7 @@ import org.apache.ignite.InitParameters;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.properties.IgniteProductVersion;
+import org.apache.ignite.lang.ErrorGroups;
 import org.apache.ignite.lang.IgniteException;
 import org.apache.ignite.lang.NodeStoppingException;
 import org.jetbrains.annotations.Nullable;
@@ -87,6 +88,8 @@ public class IgnitionImpl implements Ignition {
             Path workDir,
             @Nullable ClassLoader serviceLoaderClassLoader
     ) {
+        ErrorGroups.initialize();
+
         Objects.requireNonNull(cfgPath, "Config path must not be null");
         if (Files.notExists(cfgPath)) {
             throw new IgniteException("Config file doesn't exist");
diff --git 
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/TransactionInternalCheckedException.java
 
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/TransactionInternalCheckedException.java
index 70a848f2a0..6193c33d9b 100755
--- 
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/TransactionInternalCheckedException.java
+++ 
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/TransactionInternalCheckedException.java
@@ -17,9 +17,9 @@
 
 package org.apache.ignite.internal.tx;
 
-import static org.apache.ignite.lang.ErrorGroup.errorGroupByCode;
-import static org.apache.ignite.lang.ErrorGroup.extractGroupCode;
 import static org.apache.ignite.lang.ErrorGroups.Transactions.TX_ERR_GROUP;
+import static org.apache.ignite.lang.ErrorGroups.errorGroupByCode;
+import static org.apache.ignite.lang.ErrorGroups.extractGroupCode;
 
 import java.util.UUID;
 import org.apache.ignite.lang.IgniteInternalCheckedException;

Reply via email to