summaryrefslogtreecommitdiffstats
path: root/configserver
diff options
context:
space:
mode:
authorHarald Musum <musum@yahooinc.com>2022-11-16 17:00:49 +0100
committerHarald Musum <musum@yahooinc.com>2022-11-16 17:00:49 +0100
commitb163b17d647c751d74f50142e016498e8dd9126a (patch)
treeb5c1e36da2bd0a1a1384391dab00e295ba3ca88b /configserver
parent0e315d544583787336869be6496c5ae756935b40 (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.java6
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileDirectory.java8
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));