{"record":{"id":"dade72a5922d1cf9","repo":"apache/cassandra","slug":"accord-journal-directory-must-not-be-the-same-as-a","errorCode":null,"errorMessage":"accord.journal_directory must not be the same as any data_file_directories","messagePattern":"accord\\.journal_directory must not be the same as any data_file_directories","errorType":"validation","errorClass":"ConfigurationException","httpStatus":null,"severity":"critical","filePath":"src/java/org/apache/cassandra/config/DatabaseDescriptor.java","lineNumber":891,"sourceCode":"            conf.saved_caches_directory = storagedirFor(\"saved_caches\");\n        }\n        if (conf.data_file_directories == null || conf.data_file_directories.length == 0)\n        {\n            conf.data_file_directories = new String[]{ storagedir(\"data_file_directories\") + File.pathSeparator() + \"data\" };\n        }\n\n        long dataFreeBytes = 0;\n        /* data file and commit log directories. they get created later, when they're needed. */\n        for (String datadir : conf.data_file_directories)\n        {\n            if (datadir == null)\n                throw new ConfigurationException(\"data_file_directories must not contain empty entry\", false);\n            if (datadir.equals(conf.local_system_data_file_directory))\n                throw new ConfigurationException(\"local_system_data_file_directory must not be the same as any data_file_directories\", false);\n            if (datadir.equals(conf.commitlog_directory))\n                throw new ConfigurationException(\"commitlog_directory must not be the same as any data_file_directories\", false);\n            if (datadir.equals(conf.accord.journal_directory))\n                throw new ConfigurationException(\"accord.journal_directory must not be the same as any data_file_directories\", false);\n            if (datadir.equals(conf.hints_directory))\n                throw new ConfigurationException(\"hints_directory must not be the same as any data_file_directories\", false);\n            if (datadir.equals(conf.saved_caches_directory))\n                throw new ConfigurationException(\"saved_caches_directory must not be the same as any data_file_directories\", false);\n\n            dataFreeBytes = saturatedSum(dataFreeBytes, tryGetSpace(datadir, FileStore::getUnallocatedSpace));\n        }\n        if (dataFreeBytes < 64 * ONE_GIB) // 64 GB\n            logger.warn(\"Only {} free across all data volumes. Consider adding more capacity to your cluster or removing obsolete snapshots\",\n                        FBUtilities.prettyPrintMemory(dataFreeBytes));\n\n        if (conf.local_system_data_file_directory != null)\n        {\n            if (conf.local_system_data_file_directory.equals(conf.commitlog_directory))\n                throw new ConfigurationException(\"local_system_data_file_directory must not be the same as the commitlog_directory\", false);\n            if (conf.local_system_data_file_directory.equals(conf.accord.journal_directory))\n                throw new ConfigurationException(\"local_system_data_file_directory must not be the same as the accord.journal_directory\", false);\n            if (conf.local_system_data_file_directory.equals(conf.saved_caches_directory))","sourceCodeStart":873,"sourceCodeEnd":909,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/config/DatabaseDescriptor.java#L873-L909","documentation":"Accord's journal (transactional metadata for the Accord-based transactional features) must not share a directory with any data_file_directories. DatabaseDescriptor.applySimpleConfig throws ConfigurationException when conf.accord.journal_directory equals a data directory, refusing to start to keep Accord journal files separate from Cassandra SSTables.","triggerScenarios":"Setting accord.journal_directory in cassandra.yaml to the same path as any data_file_directories entry; checked during startup in applySimpleConfig.","commonSituations":"Clusters enabling Accord/transactional config where the journal directory was defaulted or copy-pasted from the data directory; operators reusing one mount for everything.","solutions":["Set accord.journal_directory to its own distinct path (e.g. /var/lib/cassandra/accord/journal)","Remove the custom override so it falls back to a distinct default if one applies","Verify the rendered config with a path-uniqueness check before rollout"],"exampleFix":"# before (cassandra.yaml)\ndata_file_directories:\n  - /var/lib/cassandra/data\naccord:\n  journal_directory: /var/lib/cassandra/data\n# after (cassandra.yaml)\ndata_file_directories:\n  - /var/lib/cassandra/data\naccord:\n  journal_directory: /var/lib/cassandra/accord/journal","handlingStrategy":"validation","validationCode":"String journal = (String) ((Map<String,Object>) yaml.getOrDefault(\"accord\", Map.of())).get(\"journal_directory\");\nList<String> dirs = (List<String>) yaml.get(\"data_file_directories\");\nif (journal != null && dirs != null && dirs.contains(journal))\n    throw new IllegalArgumentException(\"accord.journal_directory must differ from all data_file_directories\");","typeGuard":null,"tryCatchPattern":"try {\n    DatabaseDescriptor.toolInitialization();\n} catch (ConfigurationException e) {\n    if (e.getMessage().contains(\"accord.journal_directory\"))\n        throw new StartupConfigError(\"accord journal directory overlaps data directory\", e);\n    throw e;\n}","preventionTips":["Dedicate a unique path to accord.journal_directory","Include accord settings in directory-collision lint checks","Prefer nested, function-specific subdirectories (e.g. .../accord/journal)"],"tags":["cassandra","configuration","accord","directories"],"backgroundTag":"conflicting-config-options","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}