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)

Reply via email to