in s3-artifact-storage-server/src/main/java/jetbrains/buildServer/artifacts/s3/orphans/S3OrphanedArtifactsScanner.java [186:249]
private Collection<OrphanedArtifact> processStorage(boolean scanBuilds, boolean calculateSizes, SProject project, SProjectFeatureDescriptor storage, ArrayList<String> errors) {
Set<OrphanedArtifact> orphanedPaths = new HashSet<>();
final Map<String, String> parameters = storage.getParameters();
final String storageType = parameters.get(S3Constants.TEAMCITY_STORAGE_TYPE_KEY);
if (StringUtil.areEqual(storageType, S3_STORAGE_TYPE) || StringUtil.areEqual(storageType, S3_COMPATIBLE_STORAGE_TYPE)) {
Set<String> orphans = new HashSet<>();
String storageName = parameters.get(ArtifactStorageSettings.TEAMCITY_STORAGE_NAME_KEY);
storageName = storageName != null ? storageName : storage.getId();
final String bucketName = S3Util.getBucketName(parameters);
if (bucketName == null) {
return orphanedPaths;
}
try {
String basePrefix = parameters.get(S3_PATH_PREFIX_SETTING);
if (basePrefix != null && !basePrefix.endsWith("/")) {
basePrefix += "/";
}
Set<ProjectEntry> outdatedEntries = scanBasePath(project.getProjectId(), basePrefix, bucketName, parameters);
for (ProjectEntry projectEntry : outdatedEntries) {
if (projectEntry.isOutdated()) {
String path = projectEntry.getPath();
LOG.debug("Found an outdated project at " + path);
orphans.add(path);
continue;
}
for (BuildTypeEntry buildTypeEntry : projectEntry.getBuildTypeEntries()) {
if (buildTypeEntry.isOutdated()) {
String path = buildTypeEntry.getPath();
LOG.debug("Found an outdated build type at " + path);
orphans.add(path);
continue;
}
if (!scanBuilds) {
continue;
}
for (BuildEntry buildEntry : buildTypeEntry.getBuildEntries()) {
orphans.add(buildEntry.getPath());
}
}
}
LOG.debug(String.format("Found %d orphaned paths in storage '%s'", orphans.size(), storageName));
for (String orphan : orphans) {
String size = null;
if (calculateSizes) {
size = StringUtil.formatFileSize(calculateSize(parameters, bucketName, project.getProjectId(), orphan));
}
orphanedPaths.add(new OrphanedArtifact(bucketName, orphan, size));
}
} catch (Exception exception) {
errors.add("Caught error while processing storage: " + storageName + " in project " + project.getExternalId() + ": " + exception.getMessage());
}
}
return orphanedPaths;
}