[
https://issues.apache.org/jira/browse/IGNITE-27772?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Aleksandr Polovtsev updated IGNITE-27772:
-----------------------------------------
Description:
It is not possible to add a configuration field with a null default value,
configuration validation fails with an error:
{noformat}
org.apache.ignite.configuration.validation.ConfigurationValidationException:
Validation did not pass for keys: [ignite.network.,
'ignite.network.someStringProperty' configuration value is not initialized.]
{noformat}
*Reproducer*
Add this code to the NetworkConfigurationSchema.
{code:java}
// NetworkConfigurationSchema
@Value(hasDefault = true)
public String someStringProperty = null;
{code}
Add the following test under the runner module.
{code:java}
package org.apache.ignite.internal.configuration.compatibility;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import org.apache.ignite.configuration.ConfigurationModule;
import org.apache.ignite.configuration.KeyIgnorer;
import org.apache.ignite.internal.configuration.ConfigurationManager;
import org.apache.ignite.internal.configuration.ConfigurationModules;
import org.apache.ignite.internal.configuration.ConfigurationTreeGenerator;
import org.apache.ignite.internal.configuration.NodeConfiguration;
import org.apache.ignite.internal.configuration.ServiceLoaderModulesProvider;
import
org.apache.ignite.internal.configuration.storage.LocalFileConfigurationStorage;
import
org.apache.ignite.internal.configuration.validation.ConfigurationValidator;
import
org.apache.ignite.internal.configuration.validation.ConfigurationValidatorImpl;
import org.apache.ignite.internal.manager.ComponentContext;
import org.apache.ignite.internal.testframework.WorkDirectory;
import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(WorkDirectoryExtension.class)
public class ConfigurationTest {
@WorkDirectory
private Path path;
@Test
public void test() throws IOException {
Path file = path.resolve("file.conf");
String configString = "ignite { network: {} \n"
+ "} ";
Files.writeString(file, configString, StandardCharsets.UTF_8);
NodeConfiguration config =
loadConfiguration(file.toAbsolutePath().toString());
System.err.println(config.value());
}
private NodeConfiguration loadConfiguration(String pathFile) {
ServiceLoaderModulesProvider modulesProvider = new
ServiceLoaderModulesProvider();
List<ConfigurationModule> moduleList =
modulesProvider.modules(getClass().getClassLoader());
ConfigurationModules modules = new ConfigurationModules(moduleList);
ConfigurationTreeGenerator localConfigurationGenerator = new
ConfigurationTreeGenerator(
modules.local().rootKeys(),
modules.local().schemaExtensions(),
modules.local().polymorphicSchemaExtensions()
);
LocalFileConfigurationStorage localFileConfigurationStorage = new
LocalFileConfigurationStorage(
"WTF",
Paths.get(pathFile),
localConfigurationGenerator,
modules.local()
);
ConfigurationValidator localConfigurationValidator =
ConfigurationValidatorImpl.withDefaultValidators(localConfigurationGenerator,
modules.local().validators());
ConfigurationManager configurationManager = new ConfigurationManager(
modules.local().rootKeys(),
localFileConfigurationStorage,
localConfigurationGenerator,
localConfigurationValidator,
modules.local()::migrateDeprecatedConfigurations,
KeyIgnorer.fromDeletedPrefixes(modules.local().deletedPrefixes())
);
try {
configurationManager.startAsync(new ComponentContext()).get();
} catch (Exception e) {
throw new RuntimeException(e);
}
return
configurationManager.configurationRegistry().getConfiguration(NodeConfiguration.KEY);
}
}
{code}
h2. Definition of Done
# Values with default values equal to {{null}} should be validated to fail,
possibly on the annotation processing level;
# {{@Value}} annotation's javadoc is updated to reflect the new changes.
was:
It is not possible to add a configuration field with a null default value,
configuration validation fails with an error:
{noformat}
org.apache.ignite.configuration.validation.ConfigurationValidationException:
Validation did not pass for keys: [ignite.network.,
'ignite.network.someStringProperty' configuration value is not initialized.]
{noformat}
*Reproducer*
Add this code to the NetworkConfigurationSchema.
{noformat}
// NetworkConfigurationSchema
@Value(hasDefault = true)
public String someStringProperty = null;
{noformat}
Add the following test under the runner module.
{noformat}
package org.apache.ignite.internal.configuration.compatibility;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import org.apache.ignite.configuration.ConfigurationModule;
import org.apache.ignite.configuration.KeyIgnorer;
import org.apache.ignite.internal.configuration.ConfigurationManager;
import org.apache.ignite.internal.configuration.ConfigurationModules;
import org.apache.ignite.internal.configuration.ConfigurationTreeGenerator;
import org.apache.ignite.internal.configuration.NodeConfiguration;
import org.apache.ignite.internal.configuration.ServiceLoaderModulesProvider;
import
org.apache.ignite.internal.configuration.storage.LocalFileConfigurationStorage;
import
org.apache.ignite.internal.configuration.validation.ConfigurationValidator;
import
org.apache.ignite.internal.configuration.validation.ConfigurationValidatorImpl;
import org.apache.ignite.internal.manager.ComponentContext;
import org.apache.ignite.internal.testframework.WorkDirectory;
import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(WorkDirectoryExtension.class)
public class ConfigurationTest {
@WorkDirectory
private Path path;
@Test
public void test() throws IOException {
Path file = path.resolve("file.conf");
String configString = "ignite { network: {} \n"
+ "} ";
Files.writeString(file, configString, StandardCharsets.UTF_8);
NodeConfiguration config =
loadConfiguration(file.toAbsolutePath().toString());
System.err.println(config.value());
}
private NodeConfiguration loadConfiguration(String pathFile) {
ServiceLoaderModulesProvider modulesProvider = new
ServiceLoaderModulesProvider();
List<ConfigurationModule> moduleList =
modulesProvider.modules(getClass().getClassLoader());
ConfigurationModules modules = new ConfigurationModules(moduleList);
ConfigurationTreeGenerator localConfigurationGenerator = new
ConfigurationTreeGenerator(
modules.local().rootKeys(),
modules.local().schemaExtensions(),
modules.local().polymorphicSchemaExtensions()
);
LocalFileConfigurationStorage localFileConfigurationStorage = new
LocalFileConfigurationStorage(
"WTF",
Paths.get(pathFile),
localConfigurationGenerator,
modules.local()
);
ConfigurationValidator localConfigurationValidator =
ConfigurationValidatorImpl.withDefaultValidators(localConfigurationGenerator,
modules.local().validators());
ConfigurationManager configurationManager = new ConfigurationManager(
modules.local().rootKeys(),
localFileConfigurationStorage,
localConfigurationGenerator,
localConfigurationValidator,
modules.local()::migrateDeprecatedConfigurations,
KeyIgnorer.fromDeletedPrefixes(modules.local().deletedPrefixes())
);
try {
configurationManager.startAsync(new ComponentContext()).get();
} catch (Exception e) {
throw new RuntimeException(e);
}
return
configurationManager.configurationRegistry().getConfiguration(NodeConfiguration.KEY);
}
}
{noformat}
> Configuration. Cannot load configuration file after adding a field with a
> default NULL value
> --------------------------------------------------------------------------------------------
>
> Key: IGNITE-27772
> URL: https://issues.apache.org/jira/browse/IGNITE-27772
> Project: Ignite
> Issue Type: Bug
> Components: configuration ai3
> Affects Versions: 3.1
> Reporter: Maksim Zhuravkov
> Priority: Major
> Labels: ignite-3
>
> It is not possible to add a configuration field with a null default value,
> configuration validation fails with an error:
> {noformat}
> org.apache.ignite.configuration.validation.ConfigurationValidationException:
> Validation did not pass for keys: [ignite.network.,
> 'ignite.network.someStringProperty' configuration value is not initialized.]
> {noformat}
> *Reproducer*
> Add this code to the NetworkConfigurationSchema.
> {code:java}
> // NetworkConfigurationSchema
> @Value(hasDefault = true)
> public String someStringProperty = null;
> {code}
> Add the following test under the runner module.
> {code:java}
> package org.apache.ignite.internal.configuration.compatibility;
> import java.io.IOException;
> import java.nio.charset.StandardCharsets;
> import java.nio.file.Files;
> import java.nio.file.Path;
> import java.nio.file.Paths;
> import java.util.List;
> import org.apache.ignite.configuration.ConfigurationModule;
> import org.apache.ignite.configuration.KeyIgnorer;
> import org.apache.ignite.internal.configuration.ConfigurationManager;
> import org.apache.ignite.internal.configuration.ConfigurationModules;
> import org.apache.ignite.internal.configuration.ConfigurationTreeGenerator;
> import org.apache.ignite.internal.configuration.NodeConfiguration;
> import org.apache.ignite.internal.configuration.ServiceLoaderModulesProvider;
> import
> org.apache.ignite.internal.configuration.storage.LocalFileConfigurationStorage;
> import
> org.apache.ignite.internal.configuration.validation.ConfigurationValidator;
> import
> org.apache.ignite.internal.configuration.validation.ConfigurationValidatorImpl;
> import org.apache.ignite.internal.manager.ComponentContext;
> import org.apache.ignite.internal.testframework.WorkDirectory;
> import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
> import org.junit.jupiter.api.Test;
> import org.junit.jupiter.api.extension.ExtendWith;
> @ExtendWith(WorkDirectoryExtension.class)
> public class ConfigurationTest {
> @WorkDirectory
> private Path path;
> @Test
> public void test() throws IOException {
> Path file = path.resolve("file.conf");
> String configString = "ignite { network: {} \n"
> + "} ";
>
> Files.writeString(file, configString, StandardCharsets.UTF_8);
> NodeConfiguration config =
> loadConfiguration(file.toAbsolutePath().toString());
> System.err.println(config.value());
> }
> private NodeConfiguration loadConfiguration(String pathFile) {
> ServiceLoaderModulesProvider modulesProvider = new
> ServiceLoaderModulesProvider();
> List<ConfigurationModule> moduleList =
> modulesProvider.modules(getClass().getClassLoader());
> ConfigurationModules modules = new ConfigurationModules(moduleList);
> ConfigurationTreeGenerator localConfigurationGenerator = new
> ConfigurationTreeGenerator(
> modules.local().rootKeys(),
> modules.local().schemaExtensions(),
> modules.local().polymorphicSchemaExtensions()
> );
> LocalFileConfigurationStorage localFileConfigurationStorage = new
> LocalFileConfigurationStorage(
> "WTF",
> Paths.get(pathFile),
> localConfigurationGenerator,
> modules.local()
> );
> ConfigurationValidator localConfigurationValidator =
>
> ConfigurationValidatorImpl.withDefaultValidators(localConfigurationGenerator,
> modules.local().validators());
> ConfigurationManager configurationManager = new ConfigurationManager(
> modules.local().rootKeys(),
> localFileConfigurationStorage,
> localConfigurationGenerator,
> localConfigurationValidator,
> modules.local()::migrateDeprecatedConfigurations,
>
> KeyIgnorer.fromDeletedPrefixes(modules.local().deletedPrefixes())
> );
> try {
> configurationManager.startAsync(new ComponentContext()).get();
> } catch (Exception e) {
> throw new RuntimeException(e);
> }
> return
> configurationManager.configurationRegistry().getConfiguration(NodeConfiguration.KEY);
> }
> }
> {code}
> h2. Definition of Done
> # Values with default values equal to {{null}} should be validated to fail,
> possibly on the annotation processing level;
> # {{@Value}} annotation's javadoc is updated to reflect the new changes.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)