in src/main/java/org/apache/sling/event/impl/jobs/tasks/CleanUpTask.java [395:458]
private void cleanUpInstanceIdFolders(final TopologyCapabilities caps, final String assginedJobsPath) {
final ResourceResolver resolver = this.configuration.createResourceResolver();
if ( resolver == null ) {
return;
}
try {
final Resource baseResource = resolver.getResource(assginedJobsPath);
// sanity check - should never be null
if ( baseResource != null ) {
final List<Resource> toDelete = new ArrayList<>();
// iterate over children == instance id folders
for(final Resource r : baseResource.getChildren()) {
if ( !caps.isActive() ) {
// shutdown, stop check
toDelete.clear();
break;
}
final String instanceId = r.getName();
if ( !caps.isActive(instanceId) ) {
// is the resource empty?
if ( !hasJobs(caps, r) ) {
// check for timestamp
final long timestamp = r.getValueMap().get(PROPERTY_LAST_CHECKED, -1L);
final long now = currentTimeMillis();
if ( timestamp > 0 && (timestamp + KEEP_DURATION <= now) ) {
toDelete.add(r);
if ( toDelete.size() == MAX_REMOVE_ID_FOLDERS ) {
break;
}
} else if ( timestamp == -1 ) {
final ModifiableValueMap mvm = r.adaptTo(ModifiableValueMap.class);
if ( mvm != null ) {
mvm.put(PROPERTY_LAST_CHECKED, now);
resolver.commit();
}
}
} else {
// not empty, check if timestamp exists
if ( r.getValueMap().containsKey(PROPERTY_LAST_CHECKED) ) {
final ModifiableValueMap mvm = r.adaptTo(ModifiableValueMap.class);
if ( mvm != null ) {
mvm.remove(PROPERTY_LAST_CHECKED);
resolver.commit();
}
}
}
}
}
// remove obsolete nodes
for(final Resource r : toDelete) {
if ( caps.isActive() ) {
resolver.delete(r);
resolver.commit();
}
}
}
} catch (final PersistenceException e) {
// in the case of an error, we just log this as a warning
this.logger.warn("Exception during job resource tree cleanup.", e);
} finally {
resolver.close();
}
}