{"record":{"id":"8a88d10f6c630be9","repo":"apache/cassandra","slug":"cluster-is-not-running-unsafe-tcm-mode-can-t-load","errorCode":null,"errorMessage":"Cluster is not running unsafe TCM mode, can't load cluster metadata ","messagePattern":"Cluster is not running unsafe TCM mode, can't load cluster metadata ","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/tcm/CMSOperations.java","lineNumber":290,"sourceCode":"    @Override\n    public String dumpClusterMetadata(long epoch, long transformToEpoch, String version) throws IOException\n    {\n        return cms.dumpClusterMetadata(Epoch.create(epoch), Epoch.create(transformToEpoch), Version.valueOf(version));\n    }\n\n    @Override\n    public String dumpClusterMetadata() throws IOException\n    {\n        return dumpClusterMetadata(Epoch.EMPTY.getEpoch(),\n                                   ClusterMetadata.current().epoch.getEpoch() + 1000,\n                                   NodeVersion.CURRENT.serializationVersion().toString());\n    }\n\n    @Override\n    public void unsafeLoadClusterMetadata(String file) throws IOException\n    {\n        if (!DatabaseDescriptor.getUnsafeTCMMode())\n            throw new IllegalStateException(\"Cluster is not running unsafe TCM mode, can't load cluster metadata \" + file);\n        cms.loadClusterMetadata(file);\n    }\n\n    @Override\n    public void setCommitsPaused(boolean paused)\n    {\n        if (paused)\n            cms.pauseCommits();\n        else\n            cms.resumeCommits();\n    }\n\n    @Override\n    public boolean getCommitsPaused()\n    {\n        return cms.commitsPaused();\n    }\n","sourceCodeStart":272,"sourceCodeEnd":308,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tcm/CMSOperations.java#L272-L308","documentation":"Thrown by CMSOperations.unsafeLoadClusterMetadata when loading cluster metadata from a snapshot file is attempted while unsafe TCM mode is disabled. This operation can overwrite the cluster's metadata state, so it requires the explicit opt-in flag.","triggerScenarios":"Calling unsafeLoadClusterMetadata(String file) when DatabaseDescriptor.getUnsafeTCMMode() returns false.","commonSituations":"Restoring metadata from a backup snapshot during disaster recovery without having enabled unsafe_tcm_mode, or enabling it on a non-CMS node / forgetting a restart.","solutions":["Enable unsafe_tcm_mode: true in cassandra.yaml and restart the node, then retry the load.","Verify the flag took effect (log/startup output or JMX) before retrying.","Re-disable unsafe_tcm_mode once the metadata load succeeds."],"exampleFix":"// before (cassandra.yaml)\n# unsafe_tcm_mode: false\n// after\nunsafe_tcm_mode: true","handlingStrategy":"validation","validationCode":"if (!DatabaseDescriptor.getUnsafeTCMMode()) throw new IllegalStateException(\"Enable unsafe_tcm_mode and restart before loading metadata snapshots\");","typeGuard":null,"tryCatchPattern":"try { ops.unsafeLoadClusterMetadata(file); } catch (IllegalStateException e) { logger.error(\"Load rejected: {}\", e.getMessage()); }","preventionTips":["Enable unsafe_tcm_mode before metadata restore","Run the load on the intended (CMS) node","Re-disable unsafe mode after recovery completes"],"tags":["tcm","config","unsafe-mode"],"backgroundTag":"feature-not-enabled","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"}