You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by se...@apache.org on 2021/04/15 11:05:32 UTC

[ignite-3] branch main updated: IGNITE-14476 Explicit specification of Storage class replaced with new ConfigurationType enum (#86)

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

sergeychugunov 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 2b1404d  IGNITE-14476 Explicit specification of Storage class replaced with new ConfigurationType enum (#86)
2b1404d is described below

commit 2b1404da45b7fd60790cdbac0086281f308fe0d6
Author: Semyon Danilov <sa...@yandex.ru>
AuthorDate: Thu Apr 15 14:05:07 2021 +0300

    IGNITE-14476 Explicit specification of Storage class replaced with new ConfigurationType enum (#86)
    
    Signed-off-by: Sergey Chugunov <se...@gmail.com>
---
 .../processor/internal/Processor.java              | 45 ++++++++++++----------
 .../configuration/ConfigurationChangerTest.java    | 11 ++++--
 .../internal/util/ConfigurationUtilTest.java       |  4 +-
 .../internal/validation/ValidationUtilTest.java    |  4 +-
 .../notifications/ConfigurationListenerTest.java   |  9 +++--
 .../sample/LocalConfigurationSchema.java           |  4 +-
 .../sample/NetworkConfigurationSchema.java         |  4 +-
 .../storage/TestConfigurationStorage.java          |  5 +++
 .../ignite/configuration/ConfigurationChanger.java | 27 ++++++-------
 .../configuration/ConfigurationRegistry.java       |  7 ++--
 .../org/apache/ignite/configuration/RootKey.java   |  4 +-
 .../annotation/ConfigurationRoot.java              |  6 +--
 .../ignite/configuration/internal/RootKeyImpl.java |  8 ++--
 .../storage/ConfigurationStorage.java              |  5 +++
 .../configuration/storage/ConfigurationType.java}  | 19 ++++-----
 .../direct/stream/DirectByteBufferStream.java      |  3 ++
 .../InMemoryConfigurationStorage.java              |  6 +++
 .../configuration/RestConfigurationSchema.java     |  3 +-
 .../rest/presentation/json/JsonConverterTest.java  |  3 +-
 .../json/TestConfigurationStorage.java             |  6 +++
 .../extended/LocalConfigurationSchema.java         |  4 +-
 parent/pom.xml                                     |  3 ++
 22 files changed, 115 insertions(+), 75 deletions(-)

diff --git a/modules/configuration-annotation-processor/src/main/java/org/apache/ignite/configuration/processor/internal/Processor.java b/modules/configuration-annotation-processor/src/main/java/org/apache/ignite/configuration/processor/internal/Processor.java
index 9b4f2e0..b683e1a 100644
--- a/modules/configuration-annotation-processor/src/main/java/org/apache/ignite/configuration/processor/internal/Processor.java
+++ b/modules/configuration-annotation-processor/src/main/java/org/apache/ignite/configuration/processor/internal/Processor.java
@@ -29,6 +29,8 @@ import com.squareup.javapoet.TypeSpec;
 import com.squareup.javapoet.TypeVariableName;
 import com.squareup.javapoet.WildcardTypeName;
 import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -47,9 +49,8 @@ import javax.lang.model.element.Modifier;
 import javax.lang.model.element.PackageElement;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.element.VariableElement;
-import javax.lang.model.type.MirroredTypesException;
-import javax.lang.model.type.TypeMirror;
 import javax.lang.model.util.Elements;
+import javax.tools.Diagnostic;
 import org.apache.ignite.configuration.NamedConfigurationTree;
 import org.apache.ignite.configuration.annotation.Config;
 import org.apache.ignite.configuration.annotation.ConfigValue;
@@ -57,6 +58,7 @@ import org.apache.ignite.configuration.annotation.ConfigurationRoot;
 import org.apache.ignite.configuration.annotation.NamedConfigValue;
 import org.apache.ignite.configuration.annotation.Value;
 import org.apache.ignite.configuration.internal.NamedListConfiguration;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 import org.apache.ignite.configuration.tree.ConfigurationSource;
 import org.apache.ignite.configuration.tree.ConfigurationVisitor;
 import org.apache.ignite.configuration.tree.InnerNode;
@@ -96,6 +98,23 @@ public class Processor extends AbstractProcessor {
 
     /** {@inheritDoc} */
     @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnvironment) {
+        try {
+            return process0(roundEnvironment);
+        } catch (Throwable t) {
+            StringWriter sw = new StringWriter();
+            PrintWriter pw = new PrintWriter(sw);
+            t.printStackTrace(pw);
+            processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Failed to process configuration: " + sw.toString());
+        }
+        return false;
+    }
+
+    /**
+     * Processes a set of annotation types on type elements.
+     * @param roundEnvironment Processing environment.
+     * @return Whether or not the set of annotation types are claimed by this processor.
+     */
+    private boolean process0(RoundEnvironment roundEnvironment) {
         final Elements elementUtils = processingEnv.getElementUtils();
 
         Map<TypeName, ConfigurationDescription> props = new HashMap<>();
@@ -259,21 +278,7 @@ public class Processor extends AbstractProcessor {
             createPojoBindings(clazz, fields, schemaClassName, configurationClassBuilder, configurationInterfaceBuilder);
 
             if (isRoot) {
-                TypeMirror storageType = null;
-
-                try {
-                    //  From JavaDocs: The annotation returned by this method could contain an element whose value is of type Class.
-                    //  This value cannot be returned directly: information necessary to locate and load a class
-                    //  (such as the class loader to use) is not available, and the class might not be loadable at all.
-                    //  Attempting to read a Class object by invoking the relevant method on the returned annotation will
-                    //  result in a MirroredTypeException, from which the corresponding TypeMirror may be extracted.
-                    //  Similarly, attempting to read a Class[]-valued element will result in a MirroredTypesException.
-                    rootAnnotation.storage();
-                }
-                catch (MirroredTypesException e) {
-                    storageType = e.getTypeMirrors().get(0);
-                }
-
+                ConfigurationType storageType = rootAnnotation.type();
                 createRootKeyField(configInterface, configurationInterfaceBuilder, configDesc, storageType, schemaClassName);
             }
 
@@ -294,7 +299,7 @@ public class Processor extends AbstractProcessor {
         ClassName configInterface,
         TypeSpec.Builder configurationClassBuilder,
         ConfigurationDescription configDesc,
-        TypeMirror storageType,
+        ConfigurationType storageType,
         ClassName schemaClassName
     ) {
         ClassName viewClassName = Utils.getViewName(schemaClassName);
@@ -307,8 +312,8 @@ public class Processor extends AbstractProcessor {
 
         FieldSpec keyField = FieldSpec.builder(fieldTypeName, "KEY", PUBLIC, STATIC, FINAL)
             .initializer(
-                "$T.newRootKey($S, $T.class, $T::new, $T::new)",
-                cfgRegistryClassName, configDesc.getName(), storageType, nodeClassName,
+                "$T.newRootKey($S, $T.$L, $T::new, $T::new)",
+                cfgRegistryClassName, configDesc.getName(), ConfigurationType.class, storageType, nodeClassName,
                 Utils.getConfigurationName(schemaClassName)
             )
             .build();
diff --git a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/ConfigurationChangerTest.java b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/ConfigurationChangerTest.java
index e621c7a..47ae35a 100644
--- a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/ConfigurationChangerTest.java
+++ b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/ConfigurationChangerTest.java
@@ -29,6 +29,7 @@ import org.apache.ignite.configuration.annotation.ConfigValue;
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
 import org.apache.ignite.configuration.annotation.NamedConfigValue;
 import org.apache.ignite.configuration.annotation.Value;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 import org.apache.ignite.configuration.storage.Data;
 import org.apache.ignite.configuration.storage.TestConfigurationStorage;
 import org.apache.ignite.configuration.validation.ValidationContext;
@@ -56,7 +57,7 @@ public class ConfigurationChangerTest {
     }
 
     /** */
-    @ConfigurationRoot(rootName = "key", storage = TestConfigurationStorage.class)
+    @ConfigurationRoot(rootName = "key", type = ConfigurationType.LOCAL)
     public static class AConfigurationSchema {
         /** */
         @ConfigValue
@@ -235,7 +236,7 @@ public class ConfigurationChangerTest {
     }
 
     /** */
-    @ConfigurationRoot(rootName = "def", storage = TestConfigurationStorage.class)
+    @ConfigurationRoot(rootName = "def", type = ConfigurationType.LOCAL)
     public static class DefaultsConfigurationSchema {
         /** */
         @ConfigValue
@@ -268,9 +269,11 @@ public class ConfigurationChangerTest {
 
         changer.addRootKey(DefaultsConfiguration.KEY);
 
-        changer.register(new TestConfigurationStorage());
+        TestConfigurationStorage storage = new TestConfigurationStorage();
 
-        changer.initialize(TestConfigurationStorage.class);
+        changer.register(storage);
+
+        changer.initialize(storage.type());
 
         DefaultsNode root = (DefaultsNode)changer.getRootNode(DefaultsConfiguration.KEY);
 
diff --git a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/internal/util/ConfigurationUtilTest.java b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/internal/util/ConfigurationUtilTest.java
index 6e8061d..7075090 100644
--- a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/internal/util/ConfigurationUtilTest.java
+++ b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/internal/util/ConfigurationUtilTest.java
@@ -25,7 +25,7 @@ import org.apache.ignite.configuration.annotation.ConfigurationRoot;
 import org.apache.ignite.configuration.annotation.NamedConfigValue;
 import org.apache.ignite.configuration.annotation.Value;
 import org.apache.ignite.configuration.internal.SuperRoot;
-import org.apache.ignite.configuration.storage.TestConfigurationStorage;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 import org.junit.jupiter.api.Test;
 
 import static java.util.Collections.emptyMap;
@@ -76,7 +76,7 @@ public class ConfigurationUtilTest {
     }
 
     /** */
-    @ConfigurationRoot(rootName = "root", storage = TestConfigurationStorage.class)
+    @ConfigurationRoot(rootName = "root", type = ConfigurationType.LOCAL)
     public static class ParentConfigurationSchema {
         /** */
         @NamedConfigValue
diff --git a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/internal/validation/ValidationUtilTest.java b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/internal/validation/ValidationUtilTest.java
index a289bde..b97a3cb 100644
--- a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/internal/validation/ValidationUtilTest.java
+++ b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/internal/validation/ValidationUtilTest.java
@@ -31,7 +31,7 @@ import org.apache.ignite.configuration.annotation.NamedConfigValue;
 import org.apache.ignite.configuration.annotation.Value;
 import org.apache.ignite.configuration.internal.SuperRoot;
 import org.apache.ignite.configuration.internal.util.ConfigurationUtil;
-import org.apache.ignite.configuration.storage.TestConfigurationStorage;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 import org.apache.ignite.configuration.tree.NamedListView;
 import org.apache.ignite.configuration.validation.ValidationContext;
 import org.apache.ignite.configuration.validation.ValidationIssue;
@@ -66,7 +66,7 @@ public class ValidationUtilTest {
     }
 
     /** */
-    @ConfigurationRoot(rootName = "root", storage = TestConfigurationStorage.class)
+    @ConfigurationRoot(rootName = "root", type = ConfigurationType.LOCAL)
     public static class ValidatedRootConfigurationSchema {
         /** */
         @InnerValidation
diff --git a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/notifications/ConfigurationListenerTest.java b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/notifications/ConfigurationListenerTest.java
index 8fa9320..c3dd2b2 100644
--- a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/notifications/ConfigurationListenerTest.java
+++ b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/notifications/ConfigurationListenerTest.java
@@ -26,6 +26,7 @@ import org.apache.ignite.configuration.annotation.ConfigValue;
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
 import org.apache.ignite.configuration.annotation.NamedConfigValue;
 import org.apache.ignite.configuration.annotation.Value;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 import org.apache.ignite.configuration.storage.TestConfigurationStorage;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
@@ -40,7 +41,7 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 /** */
 public class ConfigurationListenerTest {
     /** */
-    @ConfigurationRoot(rootName = "parent", storage = TestConfigurationStorage.class)
+    @ConfigurationRoot(rootName = "parent", type = ConfigurationType.LOCAL)
     public static class ParentConfigurationSchema {
         /** */
         @ConfigValue
@@ -70,9 +71,11 @@ public class ConfigurationListenerTest {
     public void before() {
         registry.registerRootKey(ParentConfiguration.KEY);
 
-        registry.registerStorage(new TestConfigurationStorage());
+        TestConfigurationStorage storage = new TestConfigurationStorage();
 
-        registry.startStorageConfigurations(TestConfigurationStorage.class);
+        registry.registerStorage(storage);
+
+        registry.startStorageConfigurations(storage.type());
 
         configuration = registry.getConfiguration(ParentConfiguration.KEY);
     }
diff --git a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/LocalConfigurationSchema.java b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/LocalConfigurationSchema.java
index fe7c2d7..ebae93e 100644
--- a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/LocalConfigurationSchema.java
+++ b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/LocalConfigurationSchema.java
@@ -19,12 +19,12 @@ package org.apache.ignite.configuration.sample;
 
 import org.apache.ignite.configuration.annotation.ConfigValue;
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
-import org.apache.ignite.configuration.storage.TestConfigurationStorage;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 
 /**
  * Test local configuration schema.
  */
-@ConfigurationRoot(rootName = "local", storage = TestConfigurationStorage.class)
+@ConfigurationRoot(rootName = "local", type = ConfigurationType.LOCAL)
 public class LocalConfigurationSchema {
     /** Baseline. */
     @ConfigValue
diff --git a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/NetworkConfigurationSchema.java b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/NetworkConfigurationSchema.java
index d9a8101..2bd1a55 100644
--- a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/NetworkConfigurationSchema.java
+++ b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/NetworkConfigurationSchema.java
@@ -19,12 +19,12 @@ package org.apache.ignite.configuration.sample;
 
 import org.apache.ignite.configuration.annotation.ConfigValue;
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
-import org.apache.ignite.configuration.storage.TestConfigurationStorage;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 
 /**
  * Test network configuration schema.
  */
-@ConfigurationRoot(rootName = "network", storage = TestConfigurationStorage.class)
+@ConfigurationRoot(rootName = "network", type = ConfigurationType.LOCAL)
 public class NetworkConfigurationSchema {
     /** Discovery. */
     @ConfigValue
diff --git a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/storage/TestConfigurationStorage.java b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/storage/TestConfigurationStorage.java
index f2c2982..82d47f6 100644
--- a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/storage/TestConfigurationStorage.java
+++ b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/storage/TestConfigurationStorage.java
@@ -92,4 +92,9 @@ public class TestConfigurationStorage implements ConfigurationStorage {
     /** {@inheritDoc} */
     @Override public void notifyApplied(long storageRevision) {
     }
+
+    /** {@inheritDoc} */
+    @Override public ConfigurationType type() {
+        return ConfigurationType.LOCAL;
+    }
 }
diff --git a/modules/configuration/src/main/java/org/apache/ignite/configuration/ConfigurationChanger.java b/modules/configuration/src/main/java/org/apache/ignite/configuration/ConfigurationChanger.java
index 8d92cc4..8ee7a8f 100644
--- a/modules/configuration/src/main/java/org/apache/ignite/configuration/ConfigurationChanger.java
+++ b/modules/configuration/src/main/java/org/apache/ignite/configuration/ConfigurationChanger.java
@@ -33,6 +33,7 @@ import org.apache.ignite.configuration.internal.SuperRoot;
 import org.apache.ignite.configuration.internal.validation.MemberKey;
 import org.apache.ignite.configuration.internal.validation.ValidationUtil;
 import org.apache.ignite.configuration.storage.ConfigurationStorage;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 import org.apache.ignite.configuration.storage.Data;
 import org.apache.ignite.configuration.storage.StorageException;
 import org.apache.ignite.configuration.tree.ConfigurationSource;
@@ -61,7 +62,7 @@ public final class ConfigurationChanger {
     private final Map<String, RootKey<?, ?>> rootKeys = new TreeMap<>();
 
     /** Map that has all the trees in accordance to their storages. */
-    private final Map<Class<? extends ConfigurationStorage>, StorageRoots> storagesRootsMap = new ConcurrentHashMap<>();
+    private final Map<ConfigurationType, StorageRoots> storagesRootsMap = new ConcurrentHashMap<>();
 
     /** Annotation classes mapped to validator objects. */
     private Map<Class<? extends Annotation>, Set<Validator<?, ?>>> validators = new HashMap<>();
@@ -107,7 +108,7 @@ public final class ConfigurationChanger {
     private final Map<MemberKey, Annotation[]> cachedAnnotations = new ConcurrentHashMap<>();
 
     /** Storage instances by their classes. Comes in handy when all you have is {@link RootKey}. */
-    private final Map<Class<? extends ConfigurationStorage>, ConfigurationStorage> storageInstances = new HashMap<>();
+    private final Map<ConfigurationType, ConfigurationStorage> storageInstances = new HashMap<>();
 
     /**
      * @param notificator Closure to execute when update from the storage is received.
@@ -125,7 +126,7 @@ public final class ConfigurationChanger {
 
     /** */
     public void addRootKey(RootKey<?, ?> rootKey) {
-        assert !storageInstances.containsKey(rootKey.getStorageType());
+        assert !storageInstances.containsKey(rootKey.type());
 
         rootKeys.put(rootKey.key(), rootKey);
     }
@@ -135,10 +136,10 @@ public final class ConfigurationChanger {
      */
     // ConfigurationChangeException, really?
     public void register(ConfigurationStorage configurationStorage) throws ConfigurationChangeException {
-        storageInstances.put(configurationStorage.getClass(), configurationStorage);
+        storageInstances.put(configurationStorage.type(), configurationStorage);
 
         Set<RootKey<?, ?>> storageRootKeys = rootKeys.values().stream().filter(
-            rootKey -> configurationStorage.getClass() == rootKey.getStorageType()
+            rootKey -> configurationStorage.type() == rootKey.type()
         ).collect(Collectors.toSet());
 
         Data data;
@@ -167,16 +168,16 @@ public final class ConfigurationChanger {
 
         StorageRoots storageRoots = new StorageRoots(superRoot, data.cfgVersion());
 
-        storagesRootsMap.put(configurationStorage.getClass(), storageRoots);
+        storagesRootsMap.put(configurationStorage.type(), storageRoots);
 
         configurationStorage.addListener(changedEntries -> updateFromListener(
-            configurationStorage.getClass(),
+            configurationStorage.type(),
             changedEntries
         ));
     }
 
     /** */
-    public void initialize(Class<? extends ConfigurationStorage> storageType) {
+    public void initialize(ConfigurationType storageType) {
         ConfigurationStorage configurationStorage = storageInstances.get(storageType);
 
         assert configurationStorage != null : storageType;
@@ -235,7 +236,7 @@ public final class ConfigurationChanger {
      * @param rootKey Root key.
      */
     public InnerNode getRootNode(RootKey<?, ?> rootKey) {
-        return storagesRootsMap.get(rootKey.getStorageType()).roots.getRoot(rootKey);
+        return storagesRootsMap.get(rootKey.type()).roots.getRoot(rootKey);
     }
 
     /**
@@ -246,8 +247,8 @@ public final class ConfigurationChanger {
         if (changes.isEmpty())
             return completedFuture(null);
 
-        Set<Class<? extends ConfigurationStorage>> storagesTypes = changes.keySet().stream()
-            .map(RootKey::getStorageType)
+        Set<ConfigurationType> storagesTypes = changes.keySet().stream()
+            .map(RootKey::type)
             .collect(Collectors.toSet());
 
         assert !storagesTypes.isEmpty();
@@ -281,7 +282,7 @@ public final class ConfigurationChanger {
         SuperRoot changes,
         ConfigurationStorage storage
     ) {
-        StorageRoots storageRoots = storagesRootsMap.get(storage.getClass());
+        StorageRoots storageRoots = storagesRootsMap.get(storage.type());
 
         return CompletableFuture
             .supplyAsync(() -> {
@@ -351,7 +352,7 @@ public final class ConfigurationChanger {
      * @param changedEntries Changed data.
      */
     private void updateFromListener(
-        Class<? extends ConfigurationStorage> storageType,
+        ConfigurationType storageType,
         Data changedEntries
     ) {
         StorageRoots oldStorageRoots = this.storagesRootsMap.get(storageType);
diff --git a/modules/configuration/src/main/java/org/apache/ignite/configuration/ConfigurationRegistry.java b/modules/configuration/src/main/java/org/apache/ignite/configuration/ConfigurationRegistry.java
index 73d60df..23b058b 100644
--- a/modules/configuration/src/main/java/org/apache/ignite/configuration/ConfigurationRegistry.java
+++ b/modules/configuration/src/main/java/org/apache/ignite/configuration/ConfigurationRegistry.java
@@ -39,6 +39,7 @@ import org.apache.ignite.configuration.internal.util.KeyNotFoundException;
 import org.apache.ignite.configuration.internal.validation.MaxValidator;
 import org.apache.ignite.configuration.internal.validation.MinValidator;
 import org.apache.ignite.configuration.storage.ConfigurationStorage;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 import org.apache.ignite.configuration.tree.ConfigurationSource;
 import org.apache.ignite.configuration.tree.ConfigurationVisitor;
 import org.apache.ignite.configuration.tree.InnerNode;
@@ -84,7 +85,7 @@ public class ConfigurationRegistry {
     }
 
     /** */
-    public void startStorageConfigurations(Class<? extends ConfigurationStorage> storageType) {
+    public void startStorageConfigurations(ConfigurationType storageType) {
         changer.initialize(storageType);
     }
 
@@ -168,13 +169,13 @@ public class ConfigurationRegistry {
      * Does not register this root anywhere, used for static object initialization only.
      *
      * @param rootName Name of the root as described in {@link ConfigurationRoot#rootName()}.
-     * @param storageType Storage class as described in {@link ConfigurationRoot#storage()}.
+     * @param storageType Storage class as described in {@link ConfigurationRoot#type()}.
      * @param rootSupplier Closure to instantiate internal configuration tree roots.
      * @param publicRootCreator Function to create public user-facing tree instance.
      */
     public static <T extends ConfigurationTree<V, ?>, V> RootKey<T, V> newRootKey(
         String rootName,
-        Class<? extends ConfigurationStorage> storageType,
+        ConfigurationType storageType,
         Supplier<InnerNode> rootSupplier,
         BiFunction<RootKey<T, V>, ConfigurationChanger, T> publicRootCreator
     ) {
diff --git a/modules/configuration/src/main/java/org/apache/ignite/configuration/RootKey.java b/modules/configuration/src/main/java/org/apache/ignite/configuration/RootKey.java
index bd84c16..c4f5bda 100644
--- a/modules/configuration/src/main/java/org/apache/ignite/configuration/RootKey.java
+++ b/modules/configuration/src/main/java/org/apache/ignite/configuration/RootKey.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.configuration;
 
-import org.apache.ignite.configuration.storage.ConfigurationStorage;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 import org.apache.ignite.configuration.tree.InnerNode;
 
 /** */
@@ -26,7 +26,7 @@ public abstract class RootKey<T extends ConfigurationTree<VIEW, ?>, VIEW> {
     public abstract String key();
 
     /** */
-    protected abstract Class<? extends ConfigurationStorage> getStorageType();
+    protected abstract ConfigurationType type();
 
     /** */
     protected abstract InnerNode createRootNode();
diff --git a/modules/configuration/src/main/java/org/apache/ignite/configuration/annotation/ConfigurationRoot.java b/modules/configuration/src/main/java/org/apache/ignite/configuration/annotation/ConfigurationRoot.java
index 6406f6d..f897e0b 100644
--- a/modules/configuration/src/main/java/org/apache/ignite/configuration/annotation/ConfigurationRoot.java
+++ b/modules/configuration/src/main/java/org/apache/ignite/configuration/annotation/ConfigurationRoot.java
@@ -20,7 +20,7 @@ package org.apache.ignite.configuration.annotation;
 import java.lang.annotation.Documented;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
-import org.apache.ignite.configuration.storage.ConfigurationStorage;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 
 import static java.lang.annotation.ElementType.TYPE;
 import static java.lang.annotation.RetentionPolicy.SOURCE;
@@ -38,6 +38,6 @@ public @interface ConfigurationRoot {
     /** @return Unique root name. */
     String rootName();
 
-    /** @return Class of storage where to store configuration of the given root. */
-    Class<? extends ConfigurationStorage> storage() default ConfigurationStorage.class;
+    /** @return Type of the configuration. */
+    ConfigurationType type() default ConfigurationType.LOCAL;
 }
diff --git a/modules/configuration/src/main/java/org/apache/ignite/configuration/internal/RootKeyImpl.java b/modules/configuration/src/main/java/org/apache/ignite/configuration/internal/RootKeyImpl.java
index 8710f4d..7bfae25 100644
--- a/modules/configuration/src/main/java/org/apache/ignite/configuration/internal/RootKeyImpl.java
+++ b/modules/configuration/src/main/java/org/apache/ignite/configuration/internal/RootKeyImpl.java
@@ -22,7 +22,7 @@ import java.util.function.Supplier;
 import org.apache.ignite.configuration.ConfigurationChanger;
 import org.apache.ignite.configuration.ConfigurationTree;
 import org.apache.ignite.configuration.RootKey;
-import org.apache.ignite.configuration.storage.ConfigurationStorage;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 import org.apache.ignite.configuration.tree.InnerNode;
 
 /** */
@@ -31,7 +31,7 @@ public class RootKeyImpl<T extends ConfigurationTree<VIEW, ?>, VIEW> extends Roo
     private final String rootName;
 
     /** */
-    private final Class<? extends ConfigurationStorage> storageType;
+    private final ConfigurationType storageType;
 
     /** */
     private final Supplier<InnerNode> rootSupplier;
@@ -42,7 +42,7 @@ public class RootKeyImpl<T extends ConfigurationTree<VIEW, ?>, VIEW> extends Roo
     /** */
     public RootKeyImpl(
         String rootName,
-        Class<? extends ConfigurationStorage> storageType,
+        ConfigurationType storageType,
         Supplier<InnerNode> rootSupplier,
         BiFunction<RootKey<T, VIEW>, ConfigurationChanger, T> publicRootCreator
     ) {
@@ -58,7 +58,7 @@ public class RootKeyImpl<T extends ConfigurationTree<VIEW, ?>, VIEW> extends Roo
     }
 
     /** {@inheritDoc} */
-    @Override protected Class<? extends ConfigurationStorage> getStorageType() {
+    @Override protected ConfigurationType type() {
         return storageType;
     }
 
diff --git a/modules/configuration/src/main/java/org/apache/ignite/configuration/storage/ConfigurationStorage.java b/modules/configuration/src/main/java/org/apache/ignite/configuration/storage/ConfigurationStorage.java
index edd0edf..1695fb9 100644
--- a/modules/configuration/src/main/java/org/apache/ignite/configuration/storage/ConfigurationStorage.java
+++ b/modules/configuration/src/main/java/org/apache/ignite/configuration/storage/ConfigurationStorage.java
@@ -57,4 +57,9 @@ public interface ConfigurationStorage {
      * notification on node restart.
      */
     void notifyApplied(long storageRevision);
+
+    /**
+     * @return Type of this configuration storage.
+     */
+    ConfigurationType type();
 }
diff --git a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/LocalConfigurationSchema.java b/modules/configuration/src/main/java/org/apache/ignite/configuration/storage/ConfigurationType.java
similarity index 62%
copy from modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/LocalConfigurationSchema.java
copy to modules/configuration/src/main/java/org/apache/ignite/configuration/storage/ConfigurationType.java
index fe7c2d7..6efd5e2 100644
--- a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/LocalConfigurationSchema.java
+++ b/modules/configuration/src/main/java/org/apache/ignite/configuration/storage/ConfigurationType.java
@@ -15,18 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.configuration.sample;
-
-import org.apache.ignite.configuration.annotation.ConfigValue;
-import org.apache.ignite.configuration.annotation.ConfigurationRoot;
-import org.apache.ignite.configuration.storage.TestConfigurationStorage;
+package org.apache.ignite.configuration.storage;
 
 /**
- * Test local configuration schema.
+ * Type of configuration storage.
  */
-@ConfigurationRoot(rootName = "local", storage = TestConfigurationStorage.class)
-public class LocalConfigurationSchema {
-    /** Baseline. */
-    @ConfigValue
-    private BaselineConfigurationSchema baseline;
+public enum ConfigurationType {
+    /** Local configuration. */
+    LOCAL,
+
+    /** Distributed configuration. */
+    DISTRIBUTED;
 }
diff --git a/modules/network/src/main/java/org/apache/ignite/network/internal/direct/stream/DirectByteBufferStream.java b/modules/network/src/main/java/org/apache/ignite/network/internal/direct/stream/DirectByteBufferStream.java
index a0596dc..def5c35 100644
--- a/modules/network/src/main/java/org/apache/ignite/network/internal/direct/stream/DirectByteBufferStream.java
+++ b/modules/network/src/main/java/org/apache/ignite/network/internal/direct/stream/DirectByteBufferStream.java
@@ -28,6 +28,9 @@ import org.apache.ignite.network.internal.MessageWriter;
 import org.apache.ignite.network.message.NetworkMessage;
 import org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType;
 
+/**
+ * Direct marshalling I/O stream.
+ */
 public interface DirectByteBufferStream {
     /**
      * @param buf Buffer.
diff --git a/modules/rest/src/main/java/org/apache/ignite/rest/configuration/InMemoryConfigurationStorage.java b/modules/rest/src/main/java/org/apache/ignite/rest/configuration/InMemoryConfigurationStorage.java
index 00e06c5..b4a3e3e 100644
--- a/modules/rest/src/main/java/org/apache/ignite/rest/configuration/InMemoryConfigurationStorage.java
+++ b/modules/rest/src/main/java/org/apache/ignite/rest/configuration/InMemoryConfigurationStorage.java
@@ -26,6 +26,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.ignite.configuration.storage.ConfigurationStorage;
 import org.apache.ignite.configuration.storage.ConfigurationStorageListener;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 import org.apache.ignite.configuration.storage.Data;
 import org.apache.ignite.configuration.storage.StorageException;
 
@@ -80,4 +81,9 @@ public class InMemoryConfigurationStorage implements ConfigurationStorage {
     @Override public void notifyApplied(long storageRevision) {
         // No-op.
     }
+
+    /** {@inheritDoc} */
+    @Override public ConfigurationType type() {
+        return ConfigurationType.LOCAL;
+    }
 }
diff --git a/modules/rest/src/main/java/org/apache/ignite/rest/configuration/RestConfigurationSchema.java b/modules/rest/src/main/java/org/apache/ignite/rest/configuration/RestConfigurationSchema.java
index 31e7160..66eaa51 100644
--- a/modules/rest/src/main/java/org/apache/ignite/rest/configuration/RestConfigurationSchema.java
+++ b/modules/rest/src/main/java/org/apache/ignite/rest/configuration/RestConfigurationSchema.java
@@ -21,13 +21,14 @@ import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
 import org.apache.ignite.configuration.annotation.Value;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 
 import static org.apache.ignite.rest.RestModule.DFLT_PORT;
 
 /**
  * Configuration schema for REST endpoint subtree.
  */
-@ConfigurationRoot(rootName = "rest", storage = InMemoryConfigurationStorage.class)
+@ConfigurationRoot(rootName = "rest", type = ConfigurationType.LOCAL)
 public class RestConfigurationSchema {
     /** */
     @Min(1024)
diff --git a/modules/rest/src/test/java/org/apache/ignite/rest/presentation/json/JsonConverterTest.java b/modules/rest/src/test/java/org/apache/ignite/rest/presentation/json/JsonConverterTest.java
index 8326a07..128d70f 100644
--- a/modules/rest/src/test/java/org/apache/ignite/rest/presentation/json/JsonConverterTest.java
+++ b/modules/rest/src/test/java/org/apache/ignite/rest/presentation/json/JsonConverterTest.java
@@ -24,6 +24,7 @@ import org.apache.ignite.configuration.annotation.Config;
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
 import org.apache.ignite.configuration.annotation.NamedConfigValue;
 import org.apache.ignite.configuration.annotation.Value;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -38,7 +39,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 /** */
 public class JsonConverterTest {
     /** */
-    @ConfigurationRoot(rootName = "root", storage = TestConfigurationStorage.class)
+    @ConfigurationRoot(rootName = "root", type = ConfigurationType.LOCAL)
     public static class JsonRootConfigurationSchema {
         /** */
         @NamedConfigValue
diff --git a/modules/rest/src/test/java/org/apache/ignite/rest/presentation/json/TestConfigurationStorage.java b/modules/rest/src/test/java/org/apache/ignite/rest/presentation/json/TestConfigurationStorage.java
index 3a6834e..f525b1a 100644
--- a/modules/rest/src/test/java/org/apache/ignite/rest/presentation/json/TestConfigurationStorage.java
+++ b/modules/rest/src/test/java/org/apache/ignite/rest/presentation/json/TestConfigurationStorage.java
@@ -25,6 +25,7 @@ import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.configuration.storage.ConfigurationStorage;
 import org.apache.ignite.configuration.storage.ConfigurationStorageListener;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 import org.apache.ignite.configuration.storage.Data;
 import org.apache.ignite.configuration.storage.StorageException;
 
@@ -58,4 +59,9 @@ class TestConfigurationStorage implements ConfigurationStorage {
 
     @Override public void notifyApplied(long storageRevision) {
     }
+
+    /** {@inheritDoc} */
+    @Override public ConfigurationType type() {
+        return ConfigurationType.LOCAL;
+    }
 }
diff --git a/modules/runner/src/main/java/org/apache/ignite/configuration/extended/LocalConfigurationSchema.java b/modules/runner/src/main/java/org/apache/ignite/configuration/extended/LocalConfigurationSchema.java
index 346ae43..0097528 100644
--- a/modules/runner/src/main/java/org/apache/ignite/configuration/extended/LocalConfigurationSchema.java
+++ b/modules/runner/src/main/java/org/apache/ignite/configuration/extended/LocalConfigurationSchema.java
@@ -19,13 +19,13 @@ package org.apache.ignite.configuration.extended;
 
 import org.apache.ignite.configuration.annotation.ConfigValue;
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
-import org.apache.ignite.rest.configuration.InMemoryConfigurationStorage;
+import org.apache.ignite.configuration.storage.ConfigurationType;
 
 /**
  *
  */
 @SuppressWarnings("PMD.UnusedPrivateField")
-@ConfigurationRoot(rootName = "local", storage = InMemoryConfigurationStorage.class)
+@ConfigurationRoot(rootName = "local", type = ConfigurationType.LOCAL)
 public class LocalConfigurationSchema {
     /** */
     @ConfigValue
diff --git a/parent/pom.xml b/parent/pom.xml
index 2f32870..4b84ee6 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -479,6 +479,9 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-failsafe-plugin</artifactId>
+                <configuration>
+                    <useModulePath>false</useModulePath>
+                </configuration>
                 <executions>
                     <execution>
                         <phase>integration-test</phase>