This is an automated email from the ASF dual-hosted git repository.

ibessonov 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 ec9d41671fb IGNITE-25451 Enhance RootKey with a new type parameter and 
constructor (#5876)
ec9d41671fb is described below

commit ec9d41671fb061c73d2889d802f668e5888c852a
Author: Ivan Bessonov <[email protected]>
AuthorDate: Mon Jun 16 11:14:19 2025 +0300

    IGNITE-25451 Enhance RootKey with a new type parameter and constructor 
(#5876)
---
 .../config/Ignite3ConfigurationUtils.java          |  2 +-
 .../config/registry/CombinedConfigRegistry.java    |  2 +-
 .../registry/ConfigurationRegistryInterface.java   |  2 +-
 .../processor/ConfigurationProcessor.java          | 27 ++++++++++++++++-----
 .../ignite/configuration/ConfigurationModule.java  |  2 +-
 .../org/apache/ignite/configuration/RootKey.java   | 28 +++++++---------------
 .../ignite/configuration/SuperRootChange.java      |  4 ++--
 .../validation/ValidationContext.java              |  4 ++--
 .../configuration/ClusterConfigurationModule.java  |  2 +-
 .../configuration/NodeConfigurationModule.java     |  2 +-
 .../SystemDistributedConfigurationModule.java      |  4 ++--
 .../SystemLocalConfigurationModule.java            |  4 ++--
 .../configuration/ConfigurationChanger.java        | 12 +++++-----
 .../configuration/ConfigurationManager.java        |  4 ++--
 .../internal/configuration/ConfigurationNode.java  |  4 ++--
 .../configuration/ConfigurationRegistry.java       |  8 +++----
 .../configuration/ConfigurationTreeGenerator.java  | 16 ++++++-------
 .../configuration/DynamicConfiguration.java        |  2 +-
 .../configuration/DynamicConfigurationChanger.java |  2 +-
 .../internal/configuration/DynamicProperty.java    |  2 +-
 .../configuration/NamedListConfiguration.java      |  2 +-
 .../internal/configuration/RootInnerNode.java      |  2 +-
 .../ignite/internal/configuration/SuperRoot.java   |  8 +++----
 .../configuration/SuperRootChangeImpl.java         |  5 ++--
 .../asm/ConfigurationAsmGenerator.java             |  2 +-
 .../configuration/util/ConfigurationUtil.java      |  4 ++--
 .../validation/ValidationContextImpl.java          |  4 ++--
 .../configuration/ConfigurationChangerTest.java    |  5 ++--
 .../configuration/DeletedConfigurationTest.java    |  2 +-
 .../InjectedValueConfigurationTest.java            |  2 +-
 .../configuration/RenamedConfigurationTest.java    |  2 +-
 .../configuration/TestConfigurationModule.java     |  2 +-
 .../asm/ConfigurationTreeGeneratorTest.java        |  2 +-
 .../deprecation/DeprecatedConfigurationTest.java   |  2 +-
 .../configuration/util/ConfigurationUtilTest.java  | 10 ++++----
 .../configuration/TestConfigurationChanger.java    |  6 ++---
 .../testframework/ConfigurationExtension.java      | 17 ++++++-------
 .../ReplicationConfigurationModule.java            |  4 ++--
 .../configuration/generator/DefaultsGenerator.java |  2 +-
 .../internal/configuration/CompoundModule.java     |  2 +-
 .../internal/configuration/CompoundModuleTest.java |  4 ++--
 .../configuration/ConfigurationModulesTest.java    |  8 +++----
 .../storage/LocalFileConfigurationModule.java      |  2 +-
 .../SecurityConfigurationModule.java               |  4 ++--
 .../AuthenticationProvidersValidatorImpl.java      |  3 +--
 .../SecurityConfigurationModuleTest.java           |  6 ++---
 ...emoryStorageEngineLocalConfigurationModule.java |  2 +-
 47 files changed, 122 insertions(+), 125 deletions(-)

diff --git 
a/migration-tools/modules/migration-tools-commons/src/main/java/org/apache/ignite/migrationtools/config/Ignite3ConfigurationUtils.java
 
b/migration-tools/modules/migration-tools-commons/src/main/java/org/apache/ignite/migrationtools/config/Ignite3ConfigurationUtils.java
index 0a768742a54..5de29921550 100644
--- 
a/migration-tools/modules/migration-tools-commons/src/main/java/org/apache/ignite/migrationtools/config/Ignite3ConfigurationUtils.java
+++ 
b/migration-tools/modules/migration-tools-commons/src/main/java/org/apache/ignite/migrationtools/config/Ignite3ConfigurationUtils.java
@@ -81,7 +81,7 @@ public class Ignite3ConfigurationUtils {
         // Hack so that it passes the validation
         // TODO: This is another hack that needs to be cleaned. We don't 
really need the ConfigurationRegistry.
         var distributedModule = loadConfigurationModules().distributed();
-        for (RootKey<?, ?> key : distributedModule.rootKeys()) {
+        for (RootKey<?, ?, ?> key : distributedModule.rootKeys()) {
             try {
                 FieldUtils.writeDeclaredField(key, "storageType", 
ConfigurationType.LOCAL, true);
             } catch (IllegalAccessException e) {
diff --git 
a/migration-tools/modules/migration-tools-commons/src/main/java/org/apache/ignite/migrationtools/config/registry/CombinedConfigRegistry.java
 
b/migration-tools/modules/migration-tools-commons/src/main/java/org/apache/ignite/migrationtools/config/registry/CombinedConfigRegistry.java
index 2d44fe0021f..fc78307db0c 100644
--- 
a/migration-tools/modules/migration-tools-commons/src/main/java/org/apache/ignite/migrationtools/config/registry/CombinedConfigRegistry.java
+++ 
b/migration-tools/modules/migration-tools-commons/src/main/java/org/apache/ignite/migrationtools/config/registry/CombinedConfigRegistry.java
@@ -49,7 +49,7 @@ public class CombinedConfigRegistry implements 
ConfigurationRegistryInterface {
         return IgniteUtils.stopAsync(context, localRegistry, 
distributedRegistry);
     }
 
-    @Override public <V, C, T extends ConfigurationTree<V, C>> T 
getConfiguration(RootKey<T, V> rootKey) {
+    @Override public <V, C extends V, T extends ConfigurationTree<? super V, ? 
super C>> T getConfiguration(RootKey<T, V, C> rootKey) {
         return Optional.ofNullable(localRegistry.getConfiguration(rootKey))
                 .orElseGet(() -> 
distributedRegistry.getConfiguration(rootKey));
     }
diff --git 
a/migration-tools/modules/migration-tools-commons/src/main/java/org/apache/ignite/migrationtools/config/registry/ConfigurationRegistryInterface.java
 
b/migration-tools/modules/migration-tools-commons/src/main/java/org/apache/ignite/migrationtools/config/registry/ConfigurationRegistryInterface.java
index 6c6e33c369c..70b02a62024 100644
--- 
a/migration-tools/modules/migration-tools-commons/src/main/java/org/apache/ignite/migrationtools/config/registry/ConfigurationRegistryInterface.java
+++ 
b/migration-tools/modules/migration-tools-commons/src/main/java/org/apache/ignite/migrationtools/config/registry/ConfigurationRegistryInterface.java
@@ -25,5 +25,5 @@ import org.apache.ignite3.internal.manager.IgniteComponent;
  * Custom Configuration Registry Interface.
  */
 public interface ConfigurationRegistryInterface extends IgniteComponent {
-    <V, C, T extends ConfigurationTree<V, C>> T getConfiguration(RootKey<T, V> 
rootKey);
+    <V, C extends V, T extends ConfigurationTree<? super V, ? super C>> T 
getConfiguration(RootKey<T, V, C> rootKey);
 }
diff --git 
a/modules/configuration-annotation-processor/src/main/java/org/apache/ignite/internal/configuration/processor/ConfigurationProcessor.java
 
b/modules/configuration-annotation-processor/src/main/java/org/apache/ignite/internal/configuration/processor/ConfigurationProcessor.java
index 477640b3369..e1189307709 100644
--- 
a/modules/configuration-annotation-processor/src/main/java/org/apache/ignite/internal/configuration/processor/ConfigurationProcessor.java
+++ 
b/modules/configuration-annotation-processor/src/main/java/org/apache/ignite/internal/configuration/processor/ConfigurationProcessor.java
@@ -67,6 +67,7 @@ import org.apache.ignite.configuration.annotation.Config;
 import org.apache.ignite.configuration.annotation.ConfigValue;
 import org.apache.ignite.configuration.annotation.ConfigurationExtension;
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
+import org.apache.ignite.configuration.annotation.ConfigurationType;
 import org.apache.ignite.configuration.annotation.InjectedName;
 import org.apache.ignite.configuration.annotation.InjectedValue;
 import org.apache.ignite.configuration.annotation.InternalId;
@@ -216,7 +217,9 @@ public class ConfigurationProcessor extends 
AbstractProcessor {
                 ClassWrapper superClass = classWrapper.requiredSuperClass();
 
                 if (superClass.getAnnotation(ConfigurationRoot.class) != null) 
{
-                    createExtensionKeyField(configInterface, 
configurationInterfaceBuilder, ClassName.get(superClass.clazz()));
+                    ClassName superClassSchemaClassName = 
ClassName.get(superClass.clazz());
+
+                    createExtensionKeyField(configInterface, 
configurationInterfaceBuilder, schemaClassName, superClassSchemaClassName);
                 }
             }
 
@@ -241,14 +244,23 @@ public class ConfigurationProcessor extends 
AbstractProcessor {
             TypeElement realSchemaClass
     ) {
         ClassName viewClassName = getViewName(schemaClassName);
+        ClassName changeClassName = getChangeName(schemaClassName);
+
+        ConfigurationRoot rootAnnotation = 
realSchemaClass.getAnnotation(ConfigurationRoot.class);
+        ConfigurationExtension extensionAnnotation = 
realSchemaClass.getAnnotation(ConfigurationExtension.class);
 
-        ParameterizedTypeName fieldTypeName = 
ParameterizedTypeName.get(ROOT_KEY_CLASSNAME, configInterface, viewClassName);
+        ParameterizedTypeName fieldTypeName
+                = ParameterizedTypeName.get(ROOT_KEY_CLASSNAME, 
configInterface, viewClassName, changeClassName);
 
         FieldSpec keyField = FieldSpec.builder(fieldTypeName, "KEY", PUBLIC, 
STATIC, FINAL)
                 .initializer(
-                        "new $T($T.class)",
+                        "new $T($S, $T.$L, $T.class, $L)",
                         ROOT_KEY_CLASSNAME,
-                        realSchemaClass
+                        rootAnnotation.rootName(),
+                        ConfigurationType.class,
+                        rootAnnotation.type(),
+                        realSchemaClass,
+                        extensionAnnotation != null && 
extensionAnnotation.internal()
                 )
                 .build();
 
@@ -258,13 +270,16 @@ public class ConfigurationProcessor extends 
AbstractProcessor {
     private static void createExtensionKeyField(
             ClassName configInterface,
             Builder configurationClassBuilder,
+            ClassName schemaClassName,
             ClassName superClassSchemaClassName
     ) {
-        ClassName viewClassName = getViewName(superClassSchemaClassName);
+        ClassName viewClassName = getViewName(schemaClassName);
+        ClassName changeClassName = getChangeName(schemaClassName);
 
         ClassName superConfigInterface = 
getConfigurationInterfaceName(superClassSchemaClassName);
 
-        ParameterizedTypeName fieldTypeName = 
ParameterizedTypeName.get(ROOT_KEY_CLASSNAME, configInterface, viewClassName);
+        ParameterizedTypeName fieldTypeName
+                = ParameterizedTypeName.get(ROOT_KEY_CLASSNAME, 
configInterface, viewClassName, changeClassName);
 
         FieldSpec keyField = FieldSpec.builder(fieldTypeName, "KEY", PUBLIC, 
STATIC, FINAL)
                 .initializer(
diff --git 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/ConfigurationModule.java
 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/ConfigurationModule.java
index 855ac89adc8..fd89d500fd5 100644
--- 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/ConfigurationModule.java
+++ 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/ConfigurationModule.java
@@ -64,7 +64,7 @@ public interface ConfigurationModule {
      *
      * @return root keys
      */
-    default Collection<RootKey<?, ?>> rootKeys() {
+    default Collection<RootKey<?, ?, ?>> rootKeys() {
         return emptySet();
     }
 
diff --git 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/RootKey.java
 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/RootKey.java
index c079c6b02cb..8d592a191a3 100644
--- 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/RootKey.java
+++ 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/RootKey.java
@@ -17,18 +17,19 @@
 
 package org.apache.ignite.configuration;
 
+import java.util.Objects;
 import org.apache.ignite.configuration.annotation.ConfigurationExtension;
-import org.apache.ignite.configuration.annotation.ConfigurationRoot;
 import org.apache.ignite.configuration.annotation.ConfigurationType;
 import org.apache.ignite.internal.tostring.S;
 
 /**
  * Configuration root selector.
  *
- * @param <T>    Type of the configuration tree described by the root key.
+ * @param <T> Type of the configuration tree described by the root key.
  * @param <VIEWT> Type of the immutable snapshot view associated with the tree.
+ * @param <CHANGET> Type of the object that is used to change the 
configuration.
  */
-public class RootKey<T extends ConfigurationTree<VIEWT, ?>, VIEWT> {
+public final class RootKey<T extends ConfigurationTree<? super VIEWT, ? super 
CHANGET>, VIEWT, CHANGET extends VIEWT> {
     /** Name of the configuration root. */
     private final String rootName;
 
@@ -42,24 +43,13 @@ public class RootKey<T extends ConfigurationTree<VIEWT, ?>, 
VIEWT> {
     private final boolean internal;
 
     /**
-     * Constructor.
-     *
-     * @param schemaClass Class of the configuration schema.
+     * Constructor with explicit fields values.
      */
-    public RootKey(Class<?> schemaClass) {
+    public RootKey(String rootName, ConfigurationType storageType, Class<?> 
schemaClass, boolean internal) {
+        this.rootName = Objects.requireNonNull(rootName, "rootName");
+        this.storageType = storageType;
         this.schemaClass = schemaClass;
-
-        ConfigurationRoot rootAnnotation = 
schemaClass.getAnnotation(ConfigurationRoot.class);
-
-        assert rootAnnotation != null;
-
-        this.rootName = rootAnnotation.rootName();
-        this.storageType = rootAnnotation.type();
-
-        assert rootName != null;
-
-        ConfigurationExtension extension = 
schemaClass.getAnnotation(ConfigurationExtension.class);
-        internal = extension != null && extension.internal();
+        this.internal = internal;
     }
 
     /**
diff --git 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/SuperRootChange.java
 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/SuperRootChange.java
index b55e6dda2e6..5afca3c2957 100644
--- 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/SuperRootChange.java
+++ 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/SuperRootChange.java
@@ -24,10 +24,10 @@ public interface SuperRootChange {
     /**
      * Returns a root view for the root key.
      */
-    <V> V viewRoot(RootKey<? extends ConfigurationTree<V, ?>, V> rootKey);
+    <V> V viewRoot(RootKey<?, V, ?> rootKey);
 
     /**
      * Returns a root change for the root key.
      */
-    <C> C changeRoot(RootKey<? extends ConfigurationTree<?, C>, ?> rootKey);
+    <C> C changeRoot(RootKey<?, ? super C, C> rootKey);
 }
diff --git 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/ValidationContext.java
 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/ValidationContext.java
index 86b716c26aa..2f2ff434d96 100644
--- 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/ValidationContext.java
+++ 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/ValidationContext.java
@@ -55,7 +55,7 @@ public interface ValidationContext<VIEWT> {
      * @param rootKey Root key.
      * @param <ROOT>  Root view type derived from the root key.
      */
-    <ROOT> @Nullable ROOT getOldRoot(RootKey<?, ROOT> rootKey);
+    <ROOT> @Nullable ROOT getOldRoot(RootKey<?, ROOT, ?> rootKey);
 
     /**
      * Returns updated value of the configuration root.
@@ -63,7 +63,7 @@ public interface ValidationContext<VIEWT> {
      * @param rootKey Root key.
      * @param <ROOT>  Root view type derived from the root key.
      */
-    <ROOT> @Nullable ROOT getNewRoot(RootKey<?, ROOT> rootKey);
+    <ROOT> @Nullable ROOT getNewRoot(RootKey<?, ROOT, ?> rootKey);
 
     /**
      * Signifies that there's something wrong. Values will be accumulated and 
passed to the user later.
diff --git 
a/modules/configuration-root/src/main/java/org/apache/ignite/internal/configuration/ClusterConfigurationModule.java
 
b/modules/configuration-root/src/main/java/org/apache/ignite/internal/configuration/ClusterConfigurationModule.java
index 5844e754c23..2c1dc8f9818 100644
--- 
a/modules/configuration-root/src/main/java/org/apache/ignite/internal/configuration/ClusterConfigurationModule.java
+++ 
b/modules/configuration-root/src/main/java/org/apache/ignite/internal/configuration/ClusterConfigurationModule.java
@@ -36,7 +36,7 @@ public class ClusterConfigurationModule implements 
ConfigurationModule {
     }
 
     @Override
-    public Collection<RootKey<?, ?>> rootKeys() {
+    public Collection<RootKey<?, ?, ?>> rootKeys() {
         return List.of(ClusterConfiguration.KEY);
     }
 }
diff --git 
a/modules/configuration-root/src/main/java/org/apache/ignite/internal/configuration/NodeConfigurationModule.java
 
b/modules/configuration-root/src/main/java/org/apache/ignite/internal/configuration/NodeConfigurationModule.java
index a32a116fa4c..561fcf0b6ad 100644
--- 
a/modules/configuration-root/src/main/java/org/apache/ignite/internal/configuration/NodeConfigurationModule.java
+++ 
b/modules/configuration-root/src/main/java/org/apache/ignite/internal/configuration/NodeConfigurationModule.java
@@ -36,7 +36,7 @@ public class NodeConfigurationModule implements 
ConfigurationModule {
     }
 
     @Override
-    public Collection<RootKey<?, ?>> rootKeys() {
+    public Collection<RootKey<?, ?, ?>> rootKeys() {
         return List.of(NodeConfiguration.KEY);
     }
 }
diff --git 
a/modules/configuration-system/src/main/java/org/apache/ignite/internal/configuration/SystemDistributedConfigurationModule.java
 
b/modules/configuration-system/src/main/java/org/apache/ignite/internal/configuration/SystemDistributedConfigurationModule.java
index 076d34d0d5b..889b6bd3707 100644
--- 
a/modules/configuration-system/src/main/java/org/apache/ignite/internal/configuration/SystemDistributedConfigurationModule.java
+++ 
b/modules/configuration-system/src/main/java/org/apache/ignite/internal/configuration/SystemDistributedConfigurationModule.java
@@ -41,8 +41,8 @@ public class SystemDistributedConfigurationModule implements 
ConfigurationModule
 
     @Override
     public void migrateDeprecatedConfigurations(SuperRootChange 
superRootChange) {
-        var rootView = (SystemDistributedExtensionView) 
superRootChange.viewRoot(SystemDistributedExtensionConfiguration.KEY);
-        var rootChange = (SystemDistributedExtensionChange) 
superRootChange.changeRoot(SystemDistributedExtensionConfiguration.KEY);
+        SystemDistributedExtensionView rootView = 
superRootChange.viewRoot(SystemDistributedExtensionConfiguration.KEY);
+        SystemDistributedExtensionChange rootChange = 
superRootChange.changeRoot(SystemDistributedExtensionConfiguration.KEY);
 
         MetaStorageView metaStorageView = rootView.metaStorage();
 
diff --git 
a/modules/configuration-system/src/main/java/org/apache/ignite/internal/configuration/SystemLocalConfigurationModule.java
 
b/modules/configuration-system/src/main/java/org/apache/ignite/internal/configuration/SystemLocalConfigurationModule.java
index 5ef5bce749a..209786a6eb2 100644
--- 
a/modules/configuration-system/src/main/java/org/apache/ignite/internal/configuration/SystemLocalConfigurationModule.java
+++ 
b/modules/configuration-system/src/main/java/org/apache/ignite/internal/configuration/SystemLocalConfigurationModule.java
@@ -45,8 +45,8 @@ public class SystemLocalConfigurationModule implements 
ConfigurationModule {
 
     @Override
     public void migrateDeprecatedConfigurations(SuperRootChange 
superRootChange) {
-        var rootView = (SystemLocalExtensionView) 
superRootChange.viewRoot(SystemLocalExtensionConfiguration.KEY);
-        var rootChange = (SystemLocalExtensionChange) 
superRootChange.changeRoot(SystemLocalExtensionConfiguration.KEY);
+        SystemLocalExtensionView rootView = 
superRootChange.viewRoot(SystemLocalExtensionConfiguration.KEY);
+        SystemLocalExtensionChange rootChange = 
superRootChange.changeRoot(SystemLocalExtensionConfiguration.KEY);
 
         CriticalWorkersView criticalWorkersView = rootView.criticalWorkers();
         CriticalWorkersChange criticalWorkersChange = 
rootChange.changeSystem().changeCriticalWorkers();
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
index 8e51df632e0..7a38960c96d 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
@@ -91,7 +91,7 @@ public abstract class ConfigurationChanger implements 
DynamicConfigurationChange
     private final ConfigurationUpdateListener configurationUpdateListener;
 
     /** Root keys. Mapping: {@link RootKey#key()} -> identity (itself). */
-    private final Map<String, RootKey<?, ?>> rootKeys;
+    private final Map<String, RootKey<?, ?, ?>> rootKeys;
 
     /** Configuration storage. */
     private final ConfigurationStorage storage;
@@ -233,7 +233,7 @@ public abstract class ConfigurationChanger implements 
DynamicConfigurationChange
      */
     public ConfigurationChanger(
             ConfigurationUpdateListener configurationUpdateListener,
-            Collection<RootKey<?, ?>> rootKeys,
+            Collection<RootKey<?, ?, ?>> rootKeys,
             ConfigurationStorage storage,
             ConfigurationValidator configurationValidator,
             ConfigurationMigrator migrator,
@@ -256,7 +256,7 @@ public abstract class ConfigurationChanger implements 
DynamicConfigurationChange
      * @param rootKey Root key.
      * @return New {@link InnerNode} instance that represents root.
      */
-    public abstract InnerNode createRootNode(RootKey<?, ?> rootKey);
+    public abstract InnerNode createRootNode(RootKey<?, ?, ?> rootKey);
 
     /**
      * Utility method to create {@link SuperRoot} parameter value.
@@ -265,7 +265,7 @@ public abstract class ConfigurationChanger implements 
DynamicConfigurationChange
      */
     private Function<String, RootInnerNode> rootCreator() {
         return key -> {
-            RootKey<?, ?> rootKey = rootKeys.get(key);
+            RootKey<?, ?, ?> rootKey = rootKeys.get(key);
 
             return rootKey == null ? null : new RootInnerNode(rootKey, 
createRootNode(rootKey));
         };
@@ -297,7 +297,7 @@ public abstract class ConfigurationChanger implements 
DynamicConfigurationChange
 
         Map<String, ?> dataValuesPrefixMap = toPrefixMap(storageValues);
 
-        for (RootKey<?, ?> rootKey : rootKeys.values()) {
+        for (RootKey<?, ?, ?> rootKey : rootKeys.values()) {
             Map<String, ?> rootPrefixMap = (Map<String, ?>) 
dataValuesPrefixMap.get(rootKey.key());
 
             InnerNode rootNode = createRootNode(rootKey);
@@ -567,7 +567,7 @@ public abstract class ConfigurationChanger implements 
DynamicConfigurationChange
 
     /** {@inheritDoc} */
     @Override
-    public InnerNode getRootNode(RootKey<?, ?> rootKey) {
+    public InnerNode getRootNode(RootKey<?, ?, ?> rootKey) {
         return storageRoots.roots.getRoot(rootKey);
     }
 
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationManager.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationManager.java
index 1c17d56ff2a..b761b3c3ade 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationManager.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationManager.java
@@ -36,7 +36,7 @@ public class ConfigurationManager implements IgniteComponent {
 
     @TestOnly
     public ConfigurationManager(
-            Collection<RootKey<?, ?>> rootKeys,
+            Collection<RootKey<?, ?, ?>> rootKeys,
             ConfigurationStorage storage,
             ConfigurationTreeGenerator generator,
             ConfigurationValidator configurationValidator
@@ -55,7 +55,7 @@ public class ConfigurationManager implements IgniteComponent {
      *         schema or its extensions are not valid.
      */
     public ConfigurationManager(
-            Collection<RootKey<?, ?>> rootKeys,
+            Collection<RootKey<?, ?, ?>> rootKeys,
             ConfigurationStorage storage,
             ConfigurationTreeGenerator generator,
             ConfigurationValidator configurationValidator,
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationNode.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationNode.java
index cb86000fc9c..733bc01db70 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationNode.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationNode.java
@@ -52,7 +52,7 @@ public abstract class ConfigurationNode<VIEWT> implements 
ConfigurationProperty<
     protected final String key;
 
     /** Root key instance for the current trees root. */
-    protected final RootKey<?, ?> rootKey;
+    protected final RootKey<?, ?, ?> rootKey;
 
     /** Configuration changer instance to get latest value of the root. */
     protected final DynamicConfigurationChanger changer;
@@ -86,7 +86,7 @@ public abstract class ConfigurationNode<VIEWT> implements 
ConfigurationProperty<
     protected ConfigurationNode(
             List<String> keys,
             String key,
-            RootKey<?, ?> rootKey,
+            RootKey<?, ?, ?> rootKey,
             DynamicConfigurationChanger changer,
             boolean listenOnly
     ) {
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationRegistry.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationRegistry.java
index 4cc7b46ac73..6a79ff2bc69 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationRegistry.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationRegistry.java
@@ -73,7 +73,7 @@ public class ConfigurationRegistry implements IgniteComponent 
{
     /** Constructor. */
     @TestOnly
     public ConfigurationRegistry(
-            Collection<RootKey<?, ?>> rootKeys,
+            Collection<RootKey<?, ?, ?>> rootKeys,
             ConfigurationStorage storage,
             ConfigurationTreeGenerator generator,
             ConfigurationValidator configurationValidator
@@ -85,7 +85,7 @@ public class ConfigurationRegistry implements IgniteComponent 
{
      * Constructor.
      */
     public ConfigurationRegistry(
-            Collection<RootKey<?, ?>> rootKeys,
+            Collection<RootKey<?, ?, ?>> rootKeys,
             ConfigurationStorage storage,
             ConfigurationTreeGenerator generator,
             ConfigurationValidator configurationValidator,
@@ -105,7 +105,7 @@ public class ConfigurationRegistry implements 
IgniteComponent {
                 keyIgnorer
         ) {
             @Override
-            public InnerNode createRootNode(RootKey<?, ?> rootKey) {
+            public InnerNode createRootNode(RootKey<?, ?, ?> rootKey) {
                 return generator.instantiateNode(rootKey.schemaClass());
             }
         };
@@ -168,7 +168,7 @@ public class ConfigurationRegistry implements 
IgniteComponent {
      * @param <T> Configuration tree type.
      * @return Public configuration tree.
      */
-    public <V, C, T extends ConfigurationTree<V, C>> T 
getConfiguration(RootKey<T, V> rootKey) {
+    public <V, C extends V, T extends ConfigurationTree<? super V, ? super C>> 
T getConfiguration(RootKey<T, V, C> rootKey) {
         return (T) configs.get(rootKey.key());
     }
 
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationTreeGenerator.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationTreeGenerator.java
index b8447ff8e6c..0c983fe31b8 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationTreeGenerator.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationTreeGenerator.java
@@ -55,7 +55,7 @@ import org.jetbrains.annotations.TestOnly;
 /** Schema-aware configuration generator. */
 public class ConfigurationTreeGenerator implements ManuallyCloseable {
 
-    private final Map<String, RootKey<?, ?>> rootKeys;
+    private final Map<String, RootKey<?, ?, ?>> rootKeys;
 
     @Nullable
     private ConfigurationAsmGenerator generator = new 
ConfigurationAsmGenerator();
@@ -66,7 +66,7 @@ public class ConfigurationTreeGenerator implements 
ManuallyCloseable {
      * @param rootKeys Root keys.
      */
     @TestOnly
-    public ConfigurationTreeGenerator(RootKey<?, ?>... rootKeys) {
+    public ConfigurationTreeGenerator(RootKey<?, ?, ?>... rootKeys) {
         this(List.of(rootKeys), Set.of(), Set.of());
     }
 
@@ -78,7 +78,7 @@ public class ConfigurationTreeGenerator implements 
ManuallyCloseable {
      * @param polymorphicSchemaExtensions Polymorphic schema extensions.
      */
     public ConfigurationTreeGenerator(
-            Collection<RootKey<?, ?>> rootKeys,
+            Collection<RootKey<?, ?, ?>> rootKeys,
             Collection<Class<?>> schemaExtensions,
             Collection<Class<?>> polymorphicSchemaExtensions) {
 
@@ -101,7 +101,7 @@ public class ConfigurationTreeGenerator implements 
ManuallyCloseable {
         assert generator != null : "ConfigurationTreeGenerator is already 
closed";
 
         SuperRoot superRoot = new SuperRoot(rootCreator());
-        for (RootKey<?, ?> rootKey : rootKeys.values()) {
+        for (RootKey<?, ?, ?> rootKey : rootKeys.values()) {
             superRoot.addRoot(rootKey, createRootNode(rootKey));
         }
 
@@ -115,7 +115,7 @@ public class ConfigurationTreeGenerator implements 
ManuallyCloseable {
      * @param changer Configuration changer instance to pass into constructor.
      * @return Configuration instance.
      */
-    public synchronized DynamicConfiguration<?, ?> instantiateCfg(RootKey<?, 
?> rootKey, DynamicConfigurationChanger changer) {
+    public synchronized DynamicConfiguration<?, ?> instantiateCfg(RootKey<?, 
?, ?> rootKey, DynamicConfigurationChanger changer) {
         assert generator != null : "ConfigurationTreeGenerator is already 
closed";
 
         return generator.instantiateCfg(rootKey, changer);
@@ -136,13 +136,13 @@ public class ConfigurationTreeGenerator implements 
ManuallyCloseable {
     /**
      * Creates new instance of root {@code *Node} class corresponding to the 
given root key.
      */
-    public synchronized InnerNode createRootNode(RootKey<?, ?> rootKey) {
+    public synchronized InnerNode createRootNode(RootKey<?, ?, ?> rootKey) {
         return instantiateNode(rootKey.schemaClass());
     }
 
     private Function<String, RootInnerNode> rootCreator() {
         return key -> {
-            RootKey<?, ?> rootKey = rootKeys.get(key);
+            RootKey<?, ?, ?> rootKey = rootKeys.get(key);
 
             return rootKey == null ? null : new RootInnerNode(rootKey, 
createRootNode(rootKey));
         };
@@ -162,7 +162,7 @@ public class ConfigurationTreeGenerator implements 
ManuallyCloseable {
      * @return set of all schema classes
      */
     private static Set<Class<?>> collectAllSchemas(
-            Collection<RootKey<?, ?>> rootKeys,
+            Collection<RootKey<?, ?, ?>> rootKeys,
             Collection<Class<?>> internalSchemaExtensions,
             Collection<Class<?>> polymorphicSchemaExtensions
     ) {
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/DynamicConfiguration.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/DynamicConfiguration.java
index fbb8b732949..5f9ffd5bf4f 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/DynamicConfiguration.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/DynamicConfiguration.java
@@ -59,7 +59,7 @@ public abstract class DynamicConfiguration<VIEWT, CHANGET 
extends VIEWT> extends
     public DynamicConfiguration(
             List<String> prefix,
             String key,
-            RootKey<?, ?> rootKey,
+            RootKey<?, ?, ?> rootKey,
             DynamicConfigurationChanger changer,
             boolean listenOnly
     ) {
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/DynamicConfigurationChanger.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/DynamicConfigurationChanger.java
index f9a1a262245..31bfbe5ed74 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/DynamicConfigurationChanger.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/DynamicConfigurationChanger.java
@@ -43,7 +43,7 @@ public interface DynamicConfigurationChanger {
      *
      * @param rootKey Root key.
      */
-    InnerNode getRootNode(RootKey<?, ?> rootKey);
+    InnerNode getRootNode(RootKey<?, ?, ?> rootKey);
 
     /**
      * Retrieves the latest configuration value for the given path directly 
from the storage.
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/DynamicProperty.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/DynamicProperty.java
index 8b1d515ca8a..1c1d360d779 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/DynamicProperty.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/DynamicProperty.java
@@ -65,7 +65,7 @@ public class DynamicProperty<T extends Serializable> extends 
ConfigurationNode<T
     public DynamicProperty(
             List<String> prefix,
             String key,
-            RootKey<?, ?> rootKey,
+            RootKey<?, ?, ?> rootKey,
             DynamicConfigurationChanger changer,
             boolean listenOnly,
             boolean readOnly
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/NamedListConfiguration.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/NamedListConfiguration.java
index 14c95fd830e..680b5f387f8 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/NamedListConfiguration.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/NamedListConfiguration.java
@@ -74,7 +74,7 @@ public class NamedListConfiguration<T extends 
ConfigurationProperty<VIEWT>, VIEW
     public NamedListConfiguration(
             List<String> prefix,
             String key,
-            RootKey<?, ?> rootKey,
+            RootKey<?, ?, ?> rootKey,
             DynamicConfigurationChanger changer,
             boolean listenOnly,
             BiFunction<List<String>, String, T> cfgCreator,
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/RootInnerNode.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/RootInnerNode.java
index cb01bcdf16a..a5993c0ba48 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/RootInnerNode.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/RootInnerNode.java
@@ -37,7 +37,7 @@ public class RootInnerNode {
      * @param node Root node.
      * @param key  Root key.
      */
-    public RootInnerNode(RootKey<?, ?> key, InnerNode node) {
+    public RootInnerNode(RootKey<?, ?, ?> key, InnerNode node) {
         this.node = node;
 
         internal = key.internal();
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/SuperRoot.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/SuperRoot.java
index 9be764cf2ca..09132d8dba6 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/SuperRoot.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/SuperRoot.java
@@ -62,10 +62,10 @@ public final class SuperRoot extends InnerNode {
      * @param nodeCreator Function that creates root node by root name or 
returns {@code null} if root name is not found.
      * @param roots       Map of roots belonging to this super root.
      */
-    public SuperRoot(Function<String, RootInnerNode> nodeCreator, 
Map<RootKey<?, ?>, InnerNode> roots) {
+    public SuperRoot(Function<String, RootInnerNode> nodeCreator, 
Map<RootKey<?, ?, ?>, InnerNode> roots) {
         this.nodeCreator = nodeCreator;
 
-        for (Map.Entry<RootKey<?, ?>, InnerNode> entry : roots.entrySet()) {
+        for (Map.Entry<RootKey<?, ?, ?>, InnerNode> entry : roots.entrySet()) {
             this.roots.put(entry.getKey().key(), new 
RootInnerNode(entry.getKey(), entry.getValue().copy()));
         }
     }
@@ -76,7 +76,7 @@ public final class SuperRoot extends InnerNode {
      * @param rootKey Root key.
      * @param root    Root node.
      */
-    public void addRoot(RootKey<?, ?> rootKey, InnerNode root) {
+    public void addRoot(RootKey<?, ?, ?> rootKey, InnerNode root) {
         assert !roots.containsKey(rootKey.key()) : rootKey.key() + " : " + 
roots;
 
         assertMutability();
@@ -91,7 +91,7 @@ public final class SuperRoot extends InnerNode {
      * @return Root node.
      */
     @Nullable
-    public InnerNode getRoot(RootKey<?, ?> rootKey) {
+    public InnerNode getRoot(RootKey<?, ?, ?> rootKey) {
         RootInnerNode root = roots.get(rootKey.key());
 
         return root == null ? null : root.node();
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/SuperRootChangeImpl.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/SuperRootChangeImpl.java
index 3479262543a..e00512fe250 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/SuperRootChangeImpl.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/SuperRootChangeImpl.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.configuration;
 
 import java.util.Objects;
-import org.apache.ignite.configuration.ConfigurationTree;
 import org.apache.ignite.configuration.RootKey;
 import org.apache.ignite.configuration.SuperRootChange;
 import org.apache.ignite.internal.configuration.util.ConfigurationUtil;
@@ -39,12 +38,12 @@ public class SuperRootChangeImpl implements SuperRootChange 
{
     }
 
     @Override
-    public <V> V viewRoot(RootKey<? extends ConfigurationTree<V, ?>, V> 
rootKey) {
+    public <V> V viewRoot(RootKey<?, V, ?> rootKey) {
         return 
Objects.requireNonNull(superRoot.getRoot(rootKey)).specificNode();
     }
 
     @Override
-    public <C> C changeRoot(RootKey<? extends ConfigurationTree<?, C>, ?> 
rootKey) {
+    public <C> C changeRoot(RootKey<?, ? super C, C> rootKey) {
         // "construct" does a field copying, which is what we need before 
mutating it.
         superRoot.construct(rootKey.key(), ConfigurationUtil.EMPTY_CFG_SRC, 
true);
 
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/asm/ConfigurationAsmGenerator.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/asm/ConfigurationAsmGenerator.java
index d41ce89e85e..9a70223d7fb 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/asm/ConfigurationAsmGenerator.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/asm/ConfigurationAsmGenerator.java
@@ -135,7 +135,7 @@ public class ConfigurationAsmGenerator {
      * @return Configuration instance.
      */
     public synchronized DynamicConfiguration<?, ?> instantiateCfg(
-            RootKey<?, ?> rootKey,
+            RootKey<?, ?, ?> rootKey,
             DynamicConfigurationChanger changer
     ) {
         SchemaClassesInfo info = schemasInfo.get(rootKey.schemaClass());
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/util/ConfigurationUtil.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/util/ConfigurationUtil.java
index 54fad1800de..03aab3796c3 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/util/ConfigurationUtil.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/util/ConfigurationUtil.java
@@ -431,8 +431,8 @@ public class ConfigurationUtil {
      *
      * @throws IllegalArgumentException If the configuration type of the root 
keys is not equal to the storage type.
      */
-    public static void checkConfigurationType(Collection<RootKey<?, ?>> 
rootKeys, ConfigurationStorage storage) {
-        for (RootKey<?, ?> key : rootKeys) {
+    public static void checkConfigurationType(Collection<RootKey<?, ?, ?>> 
rootKeys, ConfigurationStorage storage) {
+        for (RootKey<?, ?, ?> key : rootKeys) {
             if (key.type() != storage.type()) {
                 throw new IllegalArgumentException("Invalid root key 
configuration type [key=" + key
                         + ", storage=" + storage.getClass().getName() + ", 
storageType=" + storage.type() + "]");
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/ValidationContextImpl.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/ValidationContextImpl.java
index 0301599d5ae..aef29d0acdb 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/ValidationContextImpl.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/ValidationContextImpl.java
@@ -104,13 +104,13 @@ class ValidationContextImpl<VIEWT> implements 
ValidationContext<VIEWT> {
 
     /** {@inheritDoc} */
     @Override
-    public <ROOT> ROOT getOldRoot(RootKey<?, ROOT> rootKey) {
+    public <ROOT> ROOT getOldRoot(RootKey<?, ROOT, ?> rootKey) {
         return (ROOT) oldRoots.getRoot(rootKey);
     }
 
     /** {@inheritDoc} */
     @Override
-    public <ROOT> ROOT getNewRoot(RootKey<?, ROOT> rootKey) {
+    public <ROOT> ROOT getNewRoot(RootKey<?, ROOT, ?> rootKey) {
         return (ROOT) newRoots.getRoot(rootKey);
     }
 
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/ConfigurationChangerTest.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/ConfigurationChangerTest.java
index f868c6f04aa..41f00cfe175 100644
--- 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/ConfigurationChangerTest.java
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/ConfigurationChangerTest.java
@@ -584,7 +584,7 @@ public class ConfigurationChangerTest {
         assertArrayEquals(new String[]{"bar"}, root.child().arr());
     }
 
-    private static <CHANGET> ConfigurationSource source(RootKey<?, ? super 
CHANGET> rootKey, Consumer<CHANGET> changer) {
+    private static <CHANGET> ConfigurationSource source(RootKey<?, ? super 
CHANGET, CHANGET> rootKey, Consumer<CHANGET> changer) {
         return new ConfigurationSource() {
             @Override
             public void descend(ConstructableTreeNode node) {
@@ -600,8 +600,7 @@ public class ConfigurationChangerTest {
         };
     }
 
-    private ConfigurationChanger createChanger(RootKey<?, ?> rootKey) {
-
+    private ConfigurationChanger createChanger(RootKey<?, ?, ?> rootKey) {
         return new TestConfigurationChanger(
                 List.of(rootKey),
                 storage,
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/DeletedConfigurationTest.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/DeletedConfigurationTest.java
index fc6fa6f4004..294d1266a13 100644
--- 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/DeletedConfigurationTest.java
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/DeletedConfigurationTest.java
@@ -162,7 +162,7 @@ class DeletedConfigurationTest extends 
BaseIgniteAbstractTest {
         );
     }
 
-    private ConfigurationChanger createChanger(RootKey<?, ?> rootKey) {
+    private ConfigurationChanger createChanger(RootKey<?, ?, ?> rootKey) {
         return new TestConfigurationChanger(
                 List.of(rootKey),
                 storage,
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/InjectedValueConfigurationTest.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/InjectedValueConfigurationTest.java
index 3d929c30558..576b36acc00 100644
--- 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/InjectedValueConfigurationTest.java
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/InjectedValueConfigurationTest.java
@@ -72,7 +72,7 @@ public class InjectedValueConfigurationTest {
 
     @BeforeEach
     void setUp() {
-        List<RootKey<?, ?>> roots = List.of(
+        List<RootKey<?, ?, ?>> roots = List.of(
                 HoconInjectedValueRootConfiguration.KEY
         );
 
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/RenamedConfigurationTest.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/RenamedConfigurationTest.java
index 7a8542f4d1f..6ec3abb5884 100644
--- 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/RenamedConfigurationTest.java
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/RenamedConfigurationTest.java
@@ -303,7 +303,7 @@ class RenamedConfigurationTest extends 
BaseIgniteAbstractTest {
         assertThat(change, willCompleteSuccessfully());
     }
 
-    private ConfigurationRegistry startRegistry(RootKey<?, ?> rootKey, 
ConfigurationTreeGenerator generator) {
+    private ConfigurationRegistry startRegistry(RootKey<?, ?, ?> rootKey, 
ConfigurationTreeGenerator generator) {
         var registry = new ConfigurationRegistry(Set.of(rootKey), storage, 
generator, new TestConfigurationValidator());
 
         assertThat(registry.startAsync(new ComponentContext()), 
willCompleteSuccessfully());
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/TestConfigurationModule.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/TestConfigurationModule.java
index efbd55948de..33299bac66c 100644
--- 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/TestConfigurationModule.java
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/TestConfigurationModule.java
@@ -34,7 +34,7 @@ public class TestConfigurationModule implements 
ConfigurationModule {
     }
 
     @Override
-    public Collection<RootKey<?, ?>> rootKeys() {
+    public Collection<RootKey<?, ?, ?>> rootKeys() {
         return List.of(TestConfiguration.KEY);
     }
 
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/asm/ConfigurationTreeGeneratorTest.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/asm/ConfigurationTreeGeneratorTest.java
index ace55ac0129..146ddb7df64 100644
--- 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/asm/ConfigurationTreeGeneratorTest.java
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/asm/ConfigurationTreeGeneratorTest.java
@@ -94,7 +94,7 @@ public class ConfigurationTreeGeneratorTest {
             PolyInst1InjectedNameConfigurationSchema.class
     );
 
-    private static Collection<RootKey<?, ?>> rootKeys = List.of(
+    private static Collection<RootKey<?, ?, ?>> rootKeys = List.of(
             TestRootConfiguration.KEY,
             InjectedNameRootConfiguration.KEY,
             RootFromAbstractConfiguration.KEY
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/deprecation/DeprecatedConfigurationTest.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/deprecation/DeprecatedConfigurationTest.java
index 1952efe9c96..4f0e9c63b08 100644
--- 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/deprecation/DeprecatedConfigurationTest.java
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/deprecation/DeprecatedConfigurationTest.java
@@ -519,7 +519,7 @@ public class DeprecatedConfigurationTest extends 
BaseIgniteAbstractTest {
     }
 
     private void withConfigurationChanger(
-            RootKey<?, ?> rootKey,
+            RootKey<?, ?, ?> rootKey,
             boolean init,
             ConfigurationMigrator migrator,
             Consumer<ConfigurationChanger> action
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/util/ConfigurationUtilTest.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/util/ConfigurationUtilTest.java
index 2d2528ff6d7..cbb8b1b29c7 100644
--- 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/util/ConfigurationUtilTest.java
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/util/ConfigurationUtilTest.java
@@ -513,7 +513,7 @@ public class ConfigurationUtilTest {
 
     @Test
     void testCheckConfigurationTypeMixedTypes() {
-        List<RootKey<?, ?>> rootKeys = List.of(LocalFirstConfiguration.KEY, 
DistributedFirstConfiguration.KEY);
+        List<RootKey<?, ?, ?>> rootKeys = List.of(LocalFirstConfiguration.KEY, 
DistributedFirstConfiguration.KEY);
 
         assertThrows(
                 IllegalArgumentException.class,
@@ -913,7 +913,7 @@ public class ConfigurationUtilTest {
         ConfigurationAsmGenerator generator = new ConfigurationAsmGenerator();
 
         Class<?> schemaClass = 
InternalWithoutSuperclassConfigurationSchema.class;
-        RootKey<?, ?> schemaKey = InternalWithoutSuperclassConfiguration.KEY;
+        RootKey<?, ?, ?> schemaKey = 
InternalWithoutSuperclassConfiguration.KEY;
 
         generator.compileRootSchema(schemaClass, Map.of(), Map.of());
 
@@ -1044,7 +1044,7 @@ public class ConfigurationUtilTest {
 
         addDefaults(polymorphicRootInnerNode);
 
-        RootKey<?, ?> rootKey = PolymorphicRootConfiguration.KEY;
+        RootKey<?, ?, ?> rootKey = PolymorphicRootConfiguration.KEY;
 
         SuperRoot superRoot = new SuperRoot(key -> null, Map.of(rootKey, 
polymorphicRootInnerNode));
 
@@ -1079,7 +1079,7 @@ public class ConfigurationUtilTest {
 
         addDefaults(polymorphicRootInnerNode);
 
-        RootKey<?, ?> rootKey = PolymorphicRootConfiguration.KEY;
+        RootKey<?, ?, ?> rootKey = PolymorphicRootConfiguration.KEY;
 
         SuperRoot superRoot = new SuperRoot(key -> null, Map.of(rootKey, 
polymorphicRootInnerNode));
 
@@ -1189,7 +1189,7 @@ public class ConfigurationUtilTest {
      */
     private static Map<String, Serializable> flattenedMap(
             SuperRoot superRoot,
-            RootKey<?, ?> rootKey,
+            RootKey<?, ?, ?> rootKey,
             NavigableMap<String, ? extends Serializable> storageData,
             Consumer<InnerNode> patch
     ) {
diff --git 
a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/TestConfigurationChanger.java
 
b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/TestConfigurationChanger.java
index f7a3ceb94e7..01a5688a7bc 100644
--- 
a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/TestConfigurationChanger.java
+++ 
b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/TestConfigurationChanger.java
@@ -37,7 +37,7 @@ public class TestConfigurationChanger extends 
ConfigurationChanger {
 
     /** Constructor. */
     public TestConfigurationChanger(
-            Collection<RootKey<?, ?>> rootKeys,
+            Collection<RootKey<?, ?, ?>> rootKeys,
             ConfigurationStorage storage,
             ConfigurationTreeGenerator generator,
             ConfigurationValidator validator
@@ -49,7 +49,7 @@ public class TestConfigurationChanger extends 
ConfigurationChanger {
      * Constructor.
      */
     public TestConfigurationChanger(
-            Collection<RootKey<?, ?>> rootKeys,
+            Collection<RootKey<?, ?, ?>> rootKeys,
             ConfigurationStorage storage,
             ConfigurationTreeGenerator generator,
             ConfigurationValidator validator,
@@ -80,7 +80,7 @@ public class TestConfigurationChanger extends 
ConfigurationChanger {
 
     /** {@inheritDoc} */
     @Override
-    public InnerNode createRootNode(RootKey<?, ?> rootKey) {
+    public InnerNode createRootNode(RootKey<?, ?, ?> rootKey) {
         return generator.createRootNode(rootKey);
     }
 }
diff --git 
a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtension.java
 
b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtension.java
index d6104b98f54..f91a36191ce 100644
--- 
a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtension.java
+++ 
b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtension.java
@@ -26,9 +26,6 @@ import static 
org.apache.ignite.internal.configuration.util.ConfigurationUtil.fi
 import static 
org.apache.ignite.internal.configuration.util.ConfigurationUtil.polymorphicSchemaExtensions;
 import static 
org.apache.ignite.internal.configuration.util.ConfigurationUtil.schemaExtensions;
 import static 
org.apache.ignite.internal.configuration.util.ConfigurationUtil.touch;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.withSettings;
 
 import com.typesafe.config.ConfigFactory;
 import com.typesafe.config.ConfigObject;
@@ -241,12 +238,12 @@ public class ConfigurationExtension implements 
BeforeEachCallback, AfterEachCall
         );
 
         // RootKey must be mocked, there's no way to instantiate it using a 
public constructor.
-        RootKey rootKey = mock(RootKey.class, withSettings().lenient());
-
-        when(rootKey.key()).thenReturn(annotation.rootName().isBlank() ? 
"mock" : annotation.rootName());
-        when(rootKey.type()).thenReturn(LOCAL);
-        when(rootKey.schemaClass()).thenReturn(schemaClass);
-        when(rootKey.internal()).thenReturn(false);
+        RootKey<?, ?, ?> rootKey = new RootKey<>(
+                annotation.rootName().isBlank() ? "mock" : 
annotation.rootName(),
+                LOCAL,
+                schemaClass,
+                false
+        );
 
         SuperRoot superRoot = new SuperRoot(s -> new RootInnerNode(rootKey, 
cgen.instantiateNode(schemaClass)));
 
@@ -313,7 +310,7 @@ public class ConfigurationExtension implements 
BeforeEachCallback, AfterEachCall
             }
 
             @Override
-            public InnerNode getRootNode(RootKey<?, ?> rk) {
+            public InnerNode getRootNode(RootKey<?, ?, ?> rk) {
                 return superRootRef.get().getRoot(rk);
             }
 
diff --git 
a/modules/replicator/src/main/java/org/apache/ignite/internal/replicator/configuration/ReplicationConfigurationModule.java
 
b/modules/replicator/src/main/java/org/apache/ignite/internal/replicator/configuration/ReplicationConfigurationModule.java
index 08d042524fc..f26cbeb2392 100644
--- 
a/modules/replicator/src/main/java/org/apache/ignite/internal/replicator/configuration/ReplicationConfigurationModule.java
+++ 
b/modules/replicator/src/main/java/org/apache/ignite/internal/replicator/configuration/ReplicationConfigurationModule.java
@@ -43,8 +43,8 @@ public class ReplicationConfigurationModule implements 
ConfigurationModule {
 
     @Override
     public void migrateDeprecatedConfigurations(SuperRootChange 
superRootChange) {
-        var rootView = (ReplicationExtensionView) 
superRootChange.viewRoot(ReplicationExtensionConfiguration.KEY);
-        var rootChange = (ReplicationExtensionChange) 
superRootChange.changeRoot(ReplicationExtensionConfiguration.KEY);
+        ReplicationExtensionView rootView = 
superRootChange.viewRoot(ReplicationExtensionConfiguration.KEY);
+        ReplicationExtensionChange rootChange = 
superRootChange.changeRoot(ReplicationExtensionConfiguration.KEY);
 
         StorageUpdateView storageUpdateView = rootView.storageUpdate();
 
diff --git 
a/modules/runner/src/defaultsGenerator/java/org/apache/ignite/internal/configuration/generator/DefaultsGenerator.java
 
b/modules/runner/src/defaultsGenerator/java/org/apache/ignite/internal/configuration/generator/DefaultsGenerator.java
index 185b50816e4..332e5575254 100644
--- 
a/modules/runner/src/defaultsGenerator/java/org/apache/ignite/internal/configuration/generator/DefaultsGenerator.java
+++ 
b/modules/runner/src/defaultsGenerator/java/org/apache/ignite/internal/configuration/generator/DefaultsGenerator.java
@@ -105,7 +105,7 @@ public class DefaultsGenerator {
                 
KeyIgnorer.fromDeletedPrefixes(modules.local().deletedPrefixes())
         ) {
             @Override
-            public InnerNode createRootNode(RootKey<?, ?> rootKey) {
+            public InnerNode createRootNode(RootKey<?, ?, ?> rootKey) {
                 return 
localConfigurationGenerator.instantiateNode(rootKey.schemaClass());
             }
         };
diff --git 
a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/CompoundModule.java
 
b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/CompoundModule.java
index a87888abf3e..d7bed68b004 100644
--- 
a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/CompoundModule.java
+++ 
b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/CompoundModule.java
@@ -50,7 +50,7 @@ public class CompoundModule implements ConfigurationModule {
 
     /** {@inheritDoc} */
     @Override
-    public Collection<RootKey<?, ?>> rootKeys() {
+    public Collection<RootKey<?, ?, ?>> rootKeys() {
         return unionFromModulesExtractedWith(ConfigurationModule::rootKeys);
     }
 
diff --git 
a/modules/runner/src/test/java/org/apache/ignite/internal/configuration/CompoundModuleTest.java
 
b/modules/runner/src/test/java/org/apache/ignite/internal/configuration/CompoundModuleTest.java
index 42491c58335..cc464236034 100644
--- 
a/modules/runner/src/test/java/org/apache/ignite/internal/configuration/CompoundModuleTest.java
+++ 
b/modules/runner/src/test/java/org/apache/ignite/internal/configuration/CompoundModuleTest.java
@@ -41,9 +41,9 @@ import org.mockito.junit.jupiter.MockitoExtension;
 @ExtendWith(MockitoExtension.class)
 class CompoundModuleTest extends BaseIgniteAbstractTest {
     @Mock
-    private RootKey<?, ?> rootKeyA;
+    private RootKey<?, ?, ?> rootKeyA;
     @Mock
-    private RootKey<?, ?> rootKeyB;
+    private RootKey<?, ?, ?> rootKeyB;
 
     @Mock
     private Validator<AnnotationA, ?> validatorA;
diff --git 
a/modules/runner/src/test/java/org/apache/ignite/internal/configuration/ConfigurationModulesTest.java
 
b/modules/runner/src/test/java/org/apache/ignite/internal/configuration/ConfigurationModulesTest.java
index f0622589d1b..2603db94c0e 100644
--- 
a/modules/runner/src/test/java/org/apache/ignite/internal/configuration/ConfigurationModulesTest.java
+++ 
b/modules/runner/src/test/java/org/apache/ignite/internal/configuration/ConfigurationModulesTest.java
@@ -36,13 +36,13 @@ import org.mockito.junit.jupiter.MockitoExtension;
 @ExtendWith(MockitoExtension.class)
 class ConfigurationModulesTest extends BaseIgniteAbstractTest {
     @Mock
-    private RootKey<?, ?> rootKeyA;
+    private RootKey<?, ?, ?> rootKeyA;
     @Mock
-    private RootKey<?, ?> rootKeyB;
+    private RootKey<?, ?, ?> rootKeyB;
     @Mock
-    private RootKey<?, ?> rootKeyC;
+    private RootKey<?, ?, ?> rootKeyC;
     @Mock
-    private RootKey<?, ?> rootKeyD;
+    private RootKey<?, ?, ?> rootKeyD;
 
     @Mock
     private ConfigurationModule moduleA;
diff --git 
a/modules/runner/src/test/java/org/apache/ignite/internal/configuration/storage/LocalFileConfigurationModule.java
 
b/modules/runner/src/test/java/org/apache/ignite/internal/configuration/storage/LocalFileConfigurationModule.java
index adc1eb705d9..ff11038de5c 100644
--- 
a/modules/runner/src/test/java/org/apache/ignite/internal/configuration/storage/LocalFileConfigurationModule.java
+++ 
b/modules/runner/src/test/java/org/apache/ignite/internal/configuration/storage/LocalFileConfigurationModule.java
@@ -34,7 +34,7 @@ class LocalFileConfigurationModule implements 
ConfigurationModule {
     }
 
     @Override
-    public Collection<RootKey<?, ?>> rootKeys() {
+    public Collection<RootKey<?, ?, ?>> rootKeys() {
         return List.of(TopConfiguration.KEY);
     }
 
diff --git 
a/modules/security/src/main/java/org/apache/ignite/internal/security/authentication/SecurityConfigurationModule.java
 
b/modules/security/src/main/java/org/apache/ignite/internal/security/authentication/SecurityConfigurationModule.java
index c65d990b311..0fa05a6edc0 100644
--- 
a/modules/security/src/main/java/org/apache/ignite/internal/security/authentication/SecurityConfigurationModule.java
+++ 
b/modules/security/src/main/java/org/apache/ignite/internal/security/authentication/SecurityConfigurationModule.java
@@ -26,11 +26,11 @@ import org.apache.ignite.configuration.ConfigurationModule;
 import org.apache.ignite.configuration.SuperRootChange;
 import org.apache.ignite.configuration.annotation.ConfigurationType;
 import org.apache.ignite.configuration.validation.Validator;
-import org.apache.ignite.internal.configuration.ClusterConfiguration;
 import 
org.apache.ignite.internal.security.authentication.basic.BasicAuthenticationProviderChange;
 import 
org.apache.ignite.internal.security.authentication.basic.BasicAuthenticationProviderConfigurationSchema;
 import 
org.apache.ignite.internal.security.authentication.validator.AuthenticationProvidersValidatorImpl;
 import 
org.apache.ignite.internal.security.configuration.SecurityExtensionChange;
+import 
org.apache.ignite.internal.security.configuration.SecurityExtensionConfiguration;
 import 
org.apache.ignite.internal.security.configuration.SecurityExtensionConfigurationSchema;
 
 /**
@@ -66,7 +66,7 @@ public class SecurityConfigurationModule implements 
ConfigurationModule {
 
     @Override
     public void patchConfigurationWithDynamicDefaults(SuperRootChange 
rootChange) {
-        SecurityExtensionChange securityExtensionChange = 
(SecurityExtensionChange) rootChange.changeRoot(ClusterConfiguration.KEY);
+        SecurityExtensionChange securityExtensionChange = 
rootChange.changeRoot(SecurityExtensionConfiguration.KEY);
         
securityExtensionChange.changeSecurity().changeAuthentication().changeProviders(providersChange
 -> {
             if (providersChange.isEmpty()) {
                 providersChange.create(DEFAULT_PROVIDER_NAME, change ->
diff --git 
a/modules/security/src/main/java/org/apache/ignite/internal/security/authentication/validator/AuthenticationProvidersValidatorImpl.java
 
b/modules/security/src/main/java/org/apache/ignite/internal/security/authentication/validator/AuthenticationProvidersValidatorImpl.java
index 1b2dc1e7a29..030d8702d9d 100644
--- 
a/modules/security/src/main/java/org/apache/ignite/internal/security/authentication/validator/AuthenticationProvidersValidatorImpl.java
+++ 
b/modules/security/src/main/java/org/apache/ignite/internal/security/authentication/validator/AuthenticationProvidersValidatorImpl.java
@@ -27,7 +27,6 @@ import 
org.apache.ignite.internal.security.authentication.basic.BasicAuthenticat
 import 
org.apache.ignite.internal.security.authentication.configuration.AuthenticationProviderView;
 import 
org.apache.ignite.internal.security.authentication.configuration.validator.AuthenticationProvidersValidator;
 import 
org.apache.ignite.internal.security.configuration.SecurityExtensionConfiguration;
-import org.apache.ignite.internal.security.configuration.SecurityExtensionView;
 
 /**
  * Implementation of {@link AuthenticationProvidersValidator}.
@@ -63,7 +62,7 @@ public class AuthenticationProvidersValidatorImpl implements
             return;
         }
 
-        boolean enabled = ((SecurityExtensionView) 
ctx.getNewRoot(SecurityExtensionConfiguration.KEY)).security().enabled();
+        boolean enabled = 
ctx.getNewRoot(SecurityExtensionConfiguration.KEY).security().enabled();
         if (enabled && basicProviders.get(0).users().isEmpty()) {
             ctx.addIssue(new ValidationIssue(ctx.currentKey(), "Basic provider 
must have at least one user."));
         }
diff --git 
a/modules/security/src/test/java/org/apache/ignite/internal/security/authentication/SecurityConfigurationModuleTest.java
 
b/modules/security/src/test/java/org/apache/ignite/internal/security/authentication/SecurityConfigurationModuleTest.java
index 0e4fe1fb17a..7a8913eada5 100644
--- 
a/modules/security/src/test/java/org/apache/ignite/internal/security/authentication/SecurityConfigurationModuleTest.java
+++ 
b/modules/security/src/test/java/org/apache/ignite/internal/security/authentication/SecurityConfigurationModuleTest.java
@@ -39,7 +39,6 @@ import 
org.apache.ignite.internal.security.authentication.basic.BasicAuthenticat
 import 
org.apache.ignite.internal.security.authentication.basic.BasicAuthenticationProviderView;
 import 
org.apache.ignite.internal.security.authentication.validator.AuthenticationProvidersValidatorImpl;
 import org.apache.ignite.internal.security.configuration.SecurityChange;
-import 
org.apache.ignite.internal.security.configuration.SecurityExtensionChange;
 import 
org.apache.ignite.internal.security.configuration.SecurityExtensionConfiguration;
 import 
org.apache.ignite.internal.security.configuration.SecurityExtensionConfigurationSchema;
 import org.apache.ignite.internal.security.configuration.SecurityExtensionView;
@@ -122,8 +121,7 @@ class SecurityConfigurationModuleTest {
 
     @Test
     void doNotSetDefaultUserIfProvidersIsNotEmpty() {
-        SecurityChange securityChange =
-                ((SecurityExtensionChange) 
rootChange.changeRoot(SecurityExtensionConfiguration.KEY)).changeSecurity();
+        SecurityChange securityChange = 
rootChange.changeRoot(SecurityExtensionConfiguration.KEY).changeSecurity();
         
securityChange.changeAuthentication().changeProviders().create("basic", change 
-> {
             change.convert(BasicAuthenticationProviderChange.class)
                     .changeUsers(users -> users.create("admin", user -> 
user.changePassword("password")));
@@ -131,7 +129,7 @@ class SecurityConfigurationModuleTest {
 
         module.patchConfigurationWithDynamicDefaults(rootChange);
 
-        SecurityView securityView = ((SecurityExtensionView) 
rootChange.viewRoot(SecurityExtensionConfiguration.KEY)).security();
+        SecurityView securityView = 
rootChange.viewRoot(SecurityExtensionConfiguration.KEY).security();
 
         assertThat(securityView.authentication().providers().size(), is(1));
 
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/configuration/PageMemoryStorageEngineLocalConfigurationModule.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/configuration/PageMemoryStorageEngineLocalConfigurationModule.java
index e7f9a1e08ea..54aab76cd93 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/configuration/PageMemoryStorageEngineLocalConfigurationModule.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/configuration/PageMemoryStorageEngineLocalConfigurationModule.java
@@ -64,7 +64,7 @@ public class PageMemoryStorageEngineLocalConfigurationModule 
implements Configur
 
     @Override
     public void patchConfigurationWithDynamicDefaults(SuperRootChange 
rootChange) {
-        StorageExtensionChange storageExtensionChange = 
(StorageExtensionChange) 
rootChange.changeRoot(StorageExtensionConfiguration.KEY);
+        StorageExtensionChange storageExtensionChange = 
rootChange.changeRoot(StorageExtensionConfiguration.KEY);
         NamedListChange<StorageProfileView, StorageProfileChange> profiles = 
storageExtensionChange.changeStorage().changeProfiles();
 
         if (profiles.get(DEFAULT_PROFILE_NAME) == null) {

Reply via email to