in src/main/java/org/apache/sling/installer/core/impl/EntityResourceList.java [460:491]
public boolean compact() {
synchronized ( lock ) {
Collections.sort(this.resources);
boolean startNewCycle = false;
final List<TaskResource> toDelete = new ArrayList<>();
boolean first = true;
for(final TaskResource r : resources) {
if ( r.getState() == ResourceState.UNINSTALLED || (!first && r.getState() == ResourceState.UNINSTALL) ) {
toDelete.add(r);
}
first = false;
}
if (!toDelete.isEmpty()) {
// Avoid resources.remove(r) as the resource might have
// changed since it was added, which causes it to compare()
// differently and trip the TreeSet.remove() search.
final Set<RegisteredResourceImpl> copy = new HashSet<>(resources);
for(final RegisteredResource r : toDelete) {
copy.remove(r);
this.cleanup(r);
LOGGER.debug("Removing uninstalled from list: {}", r);
}
resources.clear();
resources.addAll(copy);
if ( !this.isEmpty() ) {
startNewCycle = true;
}
}
return startNewCycle;
}
}