{"record":{"id":"cc8d367e7ad720d6","repo":"apache/cassandra","slug":"unable-to-take-a-snapshot-s-on-s-s","errorCode":null,"errorMessage":"Unable to take a snapshot %s on %s.%s","messagePattern":"Unable to take a snapshot (.+?) on (.+?)\\.(.+?)","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"critical","filePath":"src/java/org/apache/cassandra/db/repair/CassandraTableRepairManager.java","lineNumber":99,"sourceCode":"        try\n        {\n            ActiveRepairService.instance().snapshotExecutor.submit(() -> {\n                if (force || !SnapshotManager.instance.exists(cfs.getKeyspaceName(), cfs.getTableName(), name))\n                {\n                    Predicate<SSTableReader> predicate = sstable -> sstable != null &&\n                                                                    !sstable.metadata().isIndex() && // exclude SSTables from 2i\n                                                                    new Bounds<>(sstable.getFirst().getToken(), sstable.getLast().getToken()).intersects(ranges);\n\n                    SnapshotOptions options = SnapshotOptions.systemSnapshot(name, SnapshotType.REPAIR, predicate, cfs.getKeyspaceTableName())\n                                                             .ephemeral()\n                                                             .build();\n                    SnapshotManager.instance.takeSnapshot(options);\n                }\n            }).get();\n        }\n        catch (Exception ex)\n        {\n            throw new RuntimeException(String.format(\"Unable to take a snapshot %s on %s.%s\", name, cfs.metadata.keyspace, cfs.metadata.name), ex);\n        }\n\n    }\n}\n","sourceCodeStart":81,"sourceCodeEnd":104,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/db/repair/CassandraTableRepairManager.java#L81-L104","documentation":"Cassandra's repair prepare phase snapshots the tables involved so the repair operates on a consistent set of sstables. When the async snapshot task throws, the exception is wrapped in this RuntimeException naming the snapshot, keyspace and table. Common causes include disk I/O errors, missing snapshot directory permissions, or an exception inside SnapshotManager's snapshot logic.","triggerScenarios":"nodetool repair (or incremental repair) on a keyspace/table where taking the snapshot fails: disk full, I/O error, permission problems on the data/snapshot directories, or a concurrent operation invalidating the snapshot request (e.g. table dropped mid-snapshot).","commonSituations":"Disk full on a node during repair; read-only or wrong-ownership data directories; table dropped/altered concurrently; SnapshotManager limits exceeded; underlying storage faults.","solutions":["Inspect the cause attached to this RuntimeException (and node.log) for the real snapshot failure reason","Free disk space / fix directory permissions for the snapshots directory and retry the repair","Verify the table still exists and wasn't concurrently dropped; retry the repair after resolving","If SnapshotManager snapshot limit issues, raise or clear limits (nodetool snapshottools / configured max snapshot TTL count)"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// pre-checks before repair\nSystem.err.println(\"df -h\"); // ensure adequate disk space\nSystem.err.println(\"ls -ld /var/lib/cassandra/data/*/snapshots\"); // permissions exist","typeGuard":null,"tryCatchPattern":"try { repairManager.prepare(state); } catch (RuntimeException e) { if (e.getMessage().startsWith(\"Unable to take a snapshot\")) { log.error(\"snapshot failed: {}\", e.getCause(), e); retryAfterFix(); } else throw e; }","preventionTips":["Monitor disk space before scheduling repairs","Ensure cassandra user owns snapshots directories","Avoid dropping/altering tables during repair prepare phase"],"tags":["cassandra","repair","snapshot","io-error"],"backgroundTag":"snapshot-failed","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"}