{"record":{"id":"5690c537584e4cbd","repo":"apache/cassandra","slug":"cannot-remove-temporary-or-obsoleted-files-for-s-5690c5","errorCode":null,"errorMessage":"Cannot remove temporary or obsoleted files for %s.%s due to a problem with transaction log files.","messagePattern":"Cannot remove temporary or obsoleted files for (.+?)\\.(.+?) due to a problem with transaction log files\\.","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java","lineNumber":107,"sourceCode":"        }\n\n        Util.initDatabaseDescriptor();\n        ClusterMetadataService.initializeForTools(false);\n        boolean dryRun = args[0].equals(\"--dry-run\");\n        String keyspace = args[args.length - 2];\n        String columnfamily = args[args.length - 1];\n\n        if (Schema.instance.getTableMetadata(keyspace, columnfamily) == null)\n            throw new IllegalArgumentException(String.format(\"Unknown keyspace/table %s.%s\",\n                    keyspace,\n                    columnfamily));\n\n        // remove any leftovers in the transaction log\n        Keyspace ks = Keyspace.openWithoutSSTables(keyspace);\n        ColumnFamilyStore cfs = ks.getColumnFamilyStore(columnfamily);\n        if (!LifecycleTransaction.removeUnfinishedLeftovers(cfs))\n        {\n            throw new RuntimeException(String.format(\"Cannot remove temporary or obsoleted files for %s.%s \" +\n                                                     \"due to a problem with transaction log files.\",\n                                                     keyspace, columnfamily));\n        }\n\n        Directories.SSTableLister lister = cfs.getDirectories().sstableLister(Directories.OnTxnErr.THROW).skipTemporary(true);\n        SetMultimap<File, SSTableReader> sstableMultimap = HashMultimap.create();\n        for (Map.Entry<Descriptor, Set<Component>> sstable : lister.list().entrySet())\n        {\n            if (sstable.getKey() != null)\n            {\n                try\n                {\n                    SSTableReader reader = SSTableReader.open(cfs, sstable.getKey());\n                    sstableMultimap.put(reader.descriptor.directory, reader);\n                }\n                catch (Throwable t)\n                {\n                    out.println(\"Couldn't open sstable: \"+sstable.getKey().fileFor(Components.DATA));","sourceCodeStart":89,"sourceCodeEnd":125,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java#L89-L125","documentation":"Like SSTableLevelResetter, SSTableOfflineRelevel cleans unfinished LifecycleTransaction leftovers before releveling. Failure of removeUnfinishedLeftovers(cfs) — typically corrupt or inconsistent transaction log files — raises this RuntimeException identifying the keyspace and table.","triggerScenarios":"Running `sstableofflinerelevel` on a table with corrupted, partially-written, or dangling txn log files so the temporary/obsoleted SSTable cleanup cannot complete.","commonSituations":"Node crashed during compaction leaving inconsistent txn logs; SSTable files manually removed while txn logs still reference them; data directory copied while writes were in flight.","solutions":["Restore referenced-but-missing SSTables from a replica/backup or remove orphaned txn logs after verification","Re-run sstableofflinerelevel once the table directory is consistent","Check *txn.log files in the table directory for dangling references","Back up the directory before manual cleanup"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// check for dangling txn logs in the table directory before releveling\nif (java.util.Arrays.stream(tableDir.toFile().listFiles()).anyMatch(f -> f.getName().endsWith(\".txn.log\")))\n    LOG.warn(\"txn logs present; ensure leftover cleanup will succeed before releveling\");","typeGuard":null,"tryCatchPattern":"try { SSTableOfflineRelevel.main(args); }\ncatch (RuntimeException e) { LOG.error(\"leftover cleanup failed: \" + e.getMessage(), e); }","preventionTips":["Run offline tools only on cleanly stopped nodes or consistent snapshots","Restore missing SSTables referenced by txn logs before releveling","Keep a backup of the table directory"],"tags":["offline-tools","sstable","transaction-log","cassandra"],"backgroundTag":"internal-invariant-violation","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"}