in s3-artifact-storage-server/src/main/java/jetbrains/buildServer/artifacts/s3/orphans/S3OrphanedArtifactsScanner.java [111:154]
public boolean tryScanArtifacts(@Nullable String projectExternalId, @NotNull SUser user, boolean scanBuilds, boolean calculateSizes, boolean skipErrors) {
if (isScanning.compareAndSet(false, true)) {
LOG.debug("Starting scan for orphaned artifacts");
scannedPaths.reset();
lastScanError = null;
try {
myExecutorService.submit(() -> {
final Disposable patchedThreadName = NamedThreadFactory.patchThreadName(projectExternalId + "-orphans-scan");
try {
final OrphanedArtifacts artifacts = scanArtifacts(projectExternalId, user, scanBuilds, calculateSizes);
if (artifacts != null) {
final String timestamp = DateTimeFormatter.ISO_INSTANT.format(Instant.now());
final String formattedTimestamp = StringUtils.replaceNonAlphaNumericChars(timestamp, '_');
final Path filePath = myLogsPath.toPath().resolve(Paths.get(FILE_PREFIX + formattedTimestamp));
final ObjectMapper objectMapper = new ObjectMapper();
LOG.debug("Scan finished. Writing results to " + filePath);
if (skipErrors) {
Files.write(filePath, objectMapper.writeValueAsBytes(artifacts.getOrphanedPaths()));
} else {
Files.write(filePath, objectMapper.writeValueAsBytes(artifacts));
}
}
} catch (Throwable e) {
LOG.warnAndDebugDetails("Got an error while writing orphaned artifacts to a file", e);
lastScanError = e.getMessage();
} finally {
lastScanTimestamp = Instant.now();
isScanning.set(false);
patchedThreadName.dispose();
}
});
return true;
} catch (RejectedExecutionException e) {
LOG.warnAndDebugDetails("Cannot scan for orphaned artifacts", e);
lastScanError = e.getMessage();
lastScanTimestamp = Instant.now();
isScanning.set(false);
return false;
}
} else {
return false;
}
}