diff options
author | Harald Musum <musum@yahooinc.com> | 2022-11-16 17:00:49 +0100 |
---|---|---|
committer | Harald Musum <musum@yahooinc.com> | 2022-11-16 17:00:49 +0100 |
commit | b163b17d647c751d74f50142e016498e8dd9126a (patch) | |
tree | b5c1e36da2bd0a1a1384391dab00e295ba3ca88b /configserver | |
parent | 0e315d544583787336869be6496c5ae756935b40 (diff) |
Check if file can be deleted while holding lock
Diffstat (limited to 'configserver')
-rw-r--r-- | configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java | 6 | ||||
-rw-r--r-- | configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java | 8 |
2 files changed, 11 insertions, 3 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java index 3ae083d6f6b..b4a3a95e019 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java @@ -604,11 +604,15 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye List<String> fileReferencesToDelete = sortedUnusedFileReferences(fileDirectory.getRoot(), fileReferencesInUse, instant); if (fileReferencesToDelete.size() > 0) { log.log(Level.FINE, () -> "Will delete file references not in use: " + fileReferencesToDelete); - fileReferencesToDelete.forEach(fileReference -> fileDirectory.delete(new FileReference(fileReference))); + fileReferencesToDelete.forEach(fileReference -> fileDirectory.delete(new FileReference(fileReference), this::isFileReferenceInUse)); } return fileReferencesToDelete; } + private boolean isFileReferenceInUse(FileReference fileReference) { + return getFileReferencesInUse().contains(fileReference.value()); + } + private Set<String> getFileReferencesInUse() { Set<String> fileReferencesInUse = new HashSet<>(); for (var applicationId : listApplications()) { diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java b/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java index c7c907b6acf..e5a353b2415 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java @@ -27,6 +27,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; import java.util.concurrent.TimeUnit; +import java.util.function.Function; import java.util.logging.Level; import java.util.logging.Logger; @@ -126,10 +127,13 @@ public class FileDirectory extends AbstractComponent { return addFile(source, fileReference, hash); } - public void delete(FileReference fileReference) { + public void delete(FileReference fileReference, Function<FileReference, Boolean> canBeDeleted) { if (useLock.value()) try (Lock lock = locks.lock(fileReference)) { - IOUtils.recursiveDeleteDir(destinationDir(fileReference)); + if (canBeDeleted.apply(fileReference)) + IOUtils.recursiveDeleteDir(destinationDir(fileReference)); + else + log.log(Level.FINE, "Unable to delete file reference '" + fileReference.value() + "' since it is still in use"); } else IOUtils.recursiveDeleteDir(destinationDir(fileReference)); |