apache/cassandra · error · ConfigurationException
saved_caches_directory must not be the same as the commitlog
Error message
saved_caches_directory must not be the same as the commitlog_directory
What it means
DatabaseDescriptor.applySimpleConfig throws this ConfigurationException when the saved caches directory equals the commitlog directory. Saved caches (key/row cache snapshots) must not share the commitlog's directory so that recovery-critical WAL data is isolated from cache dumps on the same path.
Source
Thrown at src/java/org/apache/cassandra/config/DatabaseDescriptor.java:926
throw new ConfigurationException("local_system_data_file_directory must not be the same as the accord.journal_directory", false);
if (conf.local_system_data_file_directory.equals(conf.saved_caches_directory))
throw new ConfigurationException("local_system_data_file_directory must not be the same as the saved_caches_directory", false);
if (conf.local_system_data_file_directory.equals(conf.hints_directory))
throw new ConfigurationException("local_system_data_file_directory must not be the same as the hints_directory", false);
long freeBytes = tryGetSpace(conf.local_system_data_file_directory, FileStore::getUnallocatedSpace);
if (freeBytes < ONE_GIB)
logger.warn("Only {} free in the system data volume. Consider adding more capacity or removing obsolete snapshots",
FBUtilities.prettyPrintMemory(freeBytes));
}
if (conf.commitlog_directory.equals(conf.accord.journal_directory))
throw new ConfigurationException("accord.journal_directory must not be the same as the commitlog_directory", false);
if (conf.commitlog_directory.equals(conf.hints_directory))
throw new ConfigurationException("hints_directory must not be the same as the commitlog_directory", false);
if (conf.commitlog_directory.equals(conf.saved_caches_directory))
throw new ConfigurationException("saved_caches_directory must not be the same as the commitlog_directory", false);
if (conf.accord.journal_directory.equals(conf.hints_directory))
throw new ConfigurationException("hints_directory must not be the same as the accord.journal_directory", false);
if (conf.accord.journal_directory.equals(conf.saved_caches_directory))
throw new ConfigurationException("saved_caches_directory must not be the same as the accord.journal_directory", false);
if (conf.hints_directory.equals(conf.saved_caches_directory))
throw new ConfigurationException("saved_caches_directory must not be the same as the hints_directory", false);
initializeBackgroundWriteDiskAccessMode();
if (conf.memtable_flush_writers == 0)
{
conf.memtable_flush_writers = conf.data_file_directories.length == 1 ? 2 : 1;
}
if (conf.memtable_flush_writers < 1)
throw new ConfigurationException("memtable_flush_writers must be at least 1, but was " + conf.memtable_flush_writers, false);View on GitHub (pinned to 88fd0f6a0e)
Solutions
- Point saved_caches_directory to its own path in cassandra.yaml.
- Use a distinct subdirectory if the same device must be shared.
- Validate uniqueness of all directory settings with a pre-start config check.
Example fix
// before (cassandra.yaml) commitlog_directory: /data saved_caches_directory: /data // after commitlog_directory: /data/commitlog saved_caches_directory: /data/saved_caches
Defensive patterns
Strategy: validation
Validate before calling
if (cfg.saved_caches_directory != null && cfg.saved_caches_directory.equals(cfg.commitlog_directory))
throw new IllegalArgumentException("saved_caches_directory must differ from commitlog_directory"); Type guard
boolean dirsDistinct(String a, String b) { return a == null || b == null || !new File(a).getAbsolutePath().equals(new File(b).getAbsolutePath()); } Try / catch
try { DatabaseDescriptor.applyAll(cfg); } catch (ConfigurationException e) { logger.error("Directory collision: {}", e.getMessage()); System.exit(1); } Prevention
- Keep saved caches out of the commitlog volume; give them their own path
- Assert pairwise-unique directory values in your deployment pipeline
- Audit old cassandra.yaml files after migrations for merged directory paths
When it happens
Trigger: Set saved_caches_directory to the same path as commitlog_directory in cassandra.yaml and start the node; the check runs in applySimpleConfig during toolInitialization/applyAll.
Common situations: Legacy cassandra.yaml migrations where saved_caches_directory was retargeted to a commitlog mount; scripted configs that fill all directory keys from one base path.
Understand the failure class
Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.
Related errors
- local_system_data_file_directory must not be the same as the
- local_system_data_file_directory must not be the same as the
- local_system_data_file_directory must not be the same as the
- accord.journal_directory must not be the same as the commitl
- hints_directory must not be the same as the commitlog_direct
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/54a2375365af4f1b.
Report an issue: GitHub.