in genie-web/src/main/java/com/netflix/genie/web/tasks/node/DiskCleanupTask.java [128:185]
public void run() {
log.info("Running disk cleanup task...");
final File[] jobDirs = this.jobsDir.listFiles();
if (jobDirs == null) {
log.warn("No job dirs found. Returning.");
this.numberOfDeletedJobDirs.set(0);
this.numberOfDirsUnableToDelete.set(0);
return;
}
// For each of the directories figure out if we need to delete the files or not
long deletedCount = 0;
long unableToDeleteCount = 0;
for (final File dir : jobDirs) {
if (!dir.isDirectory()) {
log.info("File {} isn't a directory. Skipping.", dir.getName());
continue;
}
final String id = dir.getName();
try {
final Job job = this.persistenceService.getJob(id);
if (job.getStatus().isActive()) {
// Don't want to delete anything still going
continue;
}
// Delete anything with a finish time before today @12 AM UTC - retention
final Instant midnightUTC = TaskUtils.getMidnightUTC();
final Instant retentionThreshold = midnightUTC.minus(this.properties.getRetention(), ChronoUnit.DAYS);
final Optional<Instant> finished = job.getFinished();
if (finished.isPresent() && finished.get().isBefore(retentionThreshold)) {
log.info("Attempting to delete job directory for job {}", id);
if (this.runAsUser) {
final CommandLine commandLine = new CommandLine("sudo");
commandLine.addArgument("rm");
commandLine.addArgument("-rf");
commandLine.addArgument(dir.getAbsolutePath());
this.processExecutor.execute(commandLine);
} else {
// Save forking a process ourselves if we don't have to
FileUtils.deleteDirectory(dir);
}
deletedCount++;
log.info("Successfully deleted job directory for job {}", id);
}
} catch (final GenieException ge) {
log.error("Unable to get job {}. Continuing.", id, ge);
this.unableToGetJobCounter.increment();
unableToDeleteCount++;
} catch (final IOException ioe) {
log.error("Unable to delete job directory for job with id: {}", id, ioe);
this.unableToDeleteJobDirCounter.increment();
unableToDeleteCount++;
}
}
this.numberOfDeletedJobDirs.set(deletedCount);
this.numberOfDirsUnableToDelete.set(unableToDeleteCount);
}