apache/cassandra · error · ConfigurationException

saved_caches_directory must not be the same as the accord.jo

Error message

saved_caches_directory must not be the same as the accord.journal_directory

What it means

DatabaseDescriptor.applySimpleConfig throws this ConfigurationException when the Accord journal directory equals the saved caches directory. Cassandra enforces that the Accord durable journal does not share a directory with saved cache snapshots to keep durability-critical journal writes isolated.

Source

Thrown at src/java/org/apache/cassandra/config/DatabaseDescriptor.java:931

            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);

        if (conf.memtable_cleanup_threshold == null)
        {
            conf.memtable_cleanup_threshold = (float) (1.0 / (1 + conf.memtable_flush_writers));
        }

View on GitHub (pinned to 88fd0f6a0e)

Solutions

  1. Give accord.journal_directory and saved_caches_directory distinct paths in cassandra.yaml.
  2. Use distinct subdirectories under a shared mount if needed.
  3. Run a config uniqueness check before startup.

Example fix

// before (cassandra.yaml)
accord:
  journal_directory: /data/cache
saved_caches_directory: /data/cache
// after
accord:
  journal_directory: /data/accord_journal
saved_caches_directory: /data/saved_caches
Defensive patterns

Strategy: validation

Validate before calling

if (cfg.accord != null && cfg.accord.journal_directory != null && cfg.accord.journal_directory.equals(cfg.saved_caches_directory))
    throw new IllegalArgumentException("accord.journal_directory must differ from saved_caches_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

When it happens

Trigger: Set accord.journal_directory equal to saved_caches_directory in cassandra.yaml and start the node; the equality check runs during applySimpleConfig in toolInitialization/applyAll.

Common situations: Consolidating less-used directories onto one path; misconfigured provisioning scripts that assign the same default directory to every unused key.

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


AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10). Data as JSON: /api/errors/8b8f61fa67424ee5. Report an issue: GitHub.