task-160: 超保留期仍被引用巡检(超期+引用检出供人工处理、未超期/未引用不报、只读、可重复)+ 8 条测试

This commit is contained in:
2026-09-02 07:14:05 +08:00
parent 5305d6dbc2
commit 9712bdf538
2 changed files with 168 additions and 0 deletions
@@ -83,4 +83,53 @@ public class TempOrphanInspector {
}
return report;
}
/**
* 超保留期仍被引用巡检(task-160)。
*
* 只读:临时文件超保留期但仍被任务引用的清单(供人工处理);绝不删除。
* 与 {@link #inspectOrphanFiles} 互补(该处报"未引用",此处报"被引用")。
*/
public OrphanFileReport inspectOverRetentionReferenced(File dir, Instant expireBefore, Predicate<String> isReferenced) {
List<OrphanFileEntry> entries = new ArrayList<>();
if (dir == null || !dir.isDirectory() || expireBefore == null) {
return new OrphanFileReport(entries, 0);
}
try (Stream<Path> paths = Files.walk(dir.toPath())) {
paths.filter(Files::isRegularFile).forEach(path -> {
File file = path.toFile();
Instant lastModified = TempFileMetadata.lastModified(file);
if (!lastModified.isBefore(expireBefore)) {
return;
}
boolean referenced;
try {
referenced = isReferenced != null && isReferenced.test(file.getName());
} catch (Exception ex) {
log.warn("over-retention reference check failed file={} err={}",
file.getName(), ex.getMessage());
return;
}
if (referenced) {
entries.add(new OrphanFileEntry(
path.toString(),
file.length(),
lastModified.toString()));
}
});
} catch (IOException ex) {
log.warn("over-retention inspect walk failed dir={} err={}", dir.getAbsolutePath(), ex.getMessage());
}
OrphanFileReport report = new OrphanFileReport(entries,
entries.stream().mapToInt(entry -> (int) Math.min(Integer.MAX_VALUE, entry.sizeBytes())).sum());
if (!report.isEmpty()) {
log.info("temp over-retention referenced report: count={} dir={}",
report.entries().size(), dir.getAbsolutePath());
for (OrphanFileEntry entry : report.entries()) {
log.info("temp over-retention referenced: path={} sizeBytes={} lastModifiedAt={}",
entry.path(), entry.sizeBytes(), entry.lastModifiedAt());
}
}
return report;
}
}