Maksim Zhuravkov created IGNITE-27772:
-----------------------------------------
Summary: 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
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}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)