{"record":{"id":"10af3cc3658bd7e9","repo":"apache/cassandra","slug":"cannot-remove-temporary-or-obsoleted-files-for-s","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/SSTableLevelResetter.java","lineNumber":83,"sourceCode":"        // TODO several daemon threads will run from here.\n        // So we have to explicitly call System.exit.\n        try\n        {\n            String keyspaceName = args[1];\n            String columnfamily = args[2];\n            // validate columnfamily\n            if (Schema.instance.getTableMetadata(keyspaceName, columnfamily) == null)\n            {\n                System.err.println(\"ColumnFamily not found: \" + keyspaceName + \"/\" + columnfamily);\n                System.exit(1);\n            }\n\n            // remove any leftovers in the transaction log\n            Keyspace keyspace = Keyspace.openWithoutSSTables(keyspaceName);\n            ColumnFamilyStore cfs = keyspace.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            boolean foundSSTable = false;\n            for (Map.Entry<Descriptor, Set<Component>> sstable : lister.list().entrySet())\n            {\n                if (sstable.getValue().contains(Components.STATS))\n                {\n                    foundSSTable = true;\n                    Descriptor descriptor = sstable.getKey();\n                    StatsMetadata metadata = StatsComponent.load(descriptor).statsMetadata();\n                    if (metadata.sstableLevel > 0)\n                    {\n                        out.println(\"Changing level from \" + metadata.sstableLevel + \" to 0 on \" + descriptor.fileFor(Components.DATA));\n                        descriptor.getMetadataSerializer().mutateLevel(descriptor, 0);\n                    }","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java#L65-L101","documentation":"SSTableLevelResetter, before resetting leveled-compaction levels offline, cleans up leftover temporary/obsoleted SSTables via LifecycleTransaction.removeUnfinishedLeftovers. If that cleanup reports failure (inconsistent or unreadable transaction log files), it throws a RuntimeException naming the keyspace and table.","triggerScenarios":"Running `sstablelevelreset` on a table whose txn (transaction log) files are corrupted, partially written, or reference SSTables that are missing, so removeUnfinishedLeftovers(cfs) returns false.","commonSituations":"Crashed compaction/flush left inconsistent txn logs; someone manually deleted SSTable files referenced by transaction logs; running the tool on a data directory copied mid-operation; wrong keyspace/table argument pointing at unexpected leftovers.","solutions":["Inspect the table directory's *txn.log files and the SSTables they reference; restore missing SSTables from a replica/backup","Remove stale/orphaned transaction log files only after confirming the referenced SSTables' status","Re-run sstablelevelreset after the transaction logs are consistent","Take a filesystem backup before manual txn-log surgery"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// before running, confirm txn logs and referenced SSTables are present\nfor (File txn : new File(tableDir).listFiles((d, n) -> n.endsWith(\".txn.log\")))\n    if (!txn.canRead()) throw new IllegalStateException(\"Unreadable txn log: \" + txn);","typeGuard":null,"tryCatchPattern":"try { SSTableLevelResetter.main(args); }\ncatch (RuntimeException e) { LOG.error(\"leftover cleanup failed: \" + e.getMessage(), e); }","preventionTips":["Never manually delete SSTables while txn logs reference them","Let compactions finish or flush/cleanly stop the node before offline tools","Back up the table directory before offline maintenance"],"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"}