{"record":{"id":"15c36438b84c4141","repo":"apache/cassandra","slug":"invalid-yaml-those-properties-nullproperties-ar","errorCode":null,"errorMessage":"Invalid yaml. Those properties <nullProperties> are not valid","messagePattern":"Invalid yaml\\. Those properties <nullProperties> are not valid","errorType":"validation","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/config/YamlConfigurationLoader.java","lineNumber":557,"sourceCode":"            Property root = null;\n            for (String s : name.split(\"\\\\.\"))\n            {\n                Property prop = getFlatProperty(type, s);\n                if (prop instanceof MissingProperty)\n                {\n                    root = null;\n                    break;\n                }\n                root = root == null ? prop : Properties.andThen(root, prop);\n                type = root.getType();\n            }\n            return root != null ? root : new MissingProperty(name);\n        }\n\n        public void check() throws ConfigurationException\n        {\n            if (!nullProperties.isEmpty())\n                throw new ConfigurationException(\"Invalid yaml. Those properties \" + nullProperties + \" are not valid\", false);\n\n            if (!missingProperties.isEmpty())\n                throw new ConfigurationException(\"Invalid yaml. Please remove properties \" + missingProperties + \" from your cassandra.yaml\", false);\n\n            if (!deprecationWarnings.isEmpty())\n                logger.warn(\"{} parameters have been deprecated. They have new names and/or value format; For more information, please refer to NEWS.txt\", deprecationWarnings);\n        }\n    }\n\n    public static LoaderOptions getDefaultLoaderOptions()\n    {\n        LoaderOptions loaderOptions = new LoaderOptions();\n        loaderOptions.setCodePointLimit(64 * 1024 * 1024); // 64 MiB\n        loaderOptions.setWarnOnDuplicateKeys(false);\n        return loaderOptions;\n    }\n}\n","sourceCodeStart":539,"sourceCodeEnd":575,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java#L539-L575","documentation":"The PropertiesChecker walks the parsed YAML property tree against the Config class schema; keys whose value resolves to null because the property name does not exist on Config (or is a removed/dead property) are collected in nullProperties. check() then throws this ConfigurationException, so Cassandra fails fast instead of silently ignoring unknown configuration keys.","triggerScenarios":"cassandra.yaml (or a programmatically supplied config map) contains a top-level or nested key that does not correspond to any field in Config/its nested types, so the checker's traversal yields a MissingProperty/null result for that path.","commonSituations":"Typos in config keys (e.g. 'concurrent_reads' misspelled); keys removed in a newer Cassandra major version still present in an old yaml; inventing plausible-looking keys that never existed.","solutions":["Remove or correct the listed properties in cassandra.yaml — the message names exactly which keys are invalid","Check the Config class / cassandra documentation for the correct key spelling","If a key was removed during an upgrade, delete it or replace it with its documented replacement","Keep only keys that exist in the Config schema for your Cassandra version"],"exampleFix":"// before (cassandra.yaml)\nconcurent_reads: 32\n// after\nconcurrent_reads: 32","handlingStrategy":"validation","validationCode":"// schema-check keys against Config fields before load\nvar configFields = java.util.Arrays.stream(org.apache.cassandra.config.Config.class.getDeclaredFields())\n    .map(java.lang.reflect.Field::getName).collect(java.util.stream.Collectors.toSet());\nnew org.yaml.snakeyaml.Yaml().load(yamlString) instanceof Map<?,?> m &&\n    m.keySet().stream().map(Object::toString)\n     .filter(k -> !configFields.contains(k))\n     .forEach(k -> System.err.println(\"Unknown config key: \" + k));","typeGuard":null,"tryCatchPattern":"try {\n    config = loader.loadConfig(url);\n} catch (ConfigurationException e) {\n    if (e.getMessage().contains(\"are not valid\"))\n        log.error(\"Unknown yaml keys found; fix names: \" + e.getMessage());\n    throw e;\n}","preventionTips":["Copy new keys only from the shipped conf/cassandra.yaml for your version","Check spelling against the Config class or docs before adding keys","Run config validation in CI with the same Cassandra version as prod","Remove invented/typo keys immediately when flagged"],"tags":["yaml","configuration","validation"],"backgroundTag":"unsupported-config-value","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}