Add protection in windows for slow file lock releasing (#50884)

This commit adds retries for windows cleanup after tests, which may fail
due to file locks not being immediately released after a windows process
exits.

closes #50825
This commit is contained in:
Ryan Ernst 2020-01-13 10:38:25 -08:00 committed by Ryan Ernst
parent 56bbed3593
commit 2dc23bd968
2 changed files with 30 additions and 4 deletions

View File

@ -20,10 +20,12 @@
package org.elasticsearch.packaging.util; package org.elasticsearch.packaging.util;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.function.Consumer;
import static org.elasticsearch.packaging.util.FileUtils.getTempDir; import static org.elasticsearch.packaging.util.FileUtils.getTempDir;
import static org.elasticsearch.packaging.util.FileUtils.lsGlob; import static org.elasticsearch.packaging.util.FileUtils.lsGlob;
@ -79,13 +81,13 @@ public class Cleanup {
// delete files that may still exist // delete files that may still exist
lsGlob(getTempDir(), "elasticsearch*").forEach(FileUtils::rm); lsGlob(getTempDir(), "elasticsearch*").forEach(FileUtils::rm);
final List<String> filesToDelete = Platforms.WINDOWS final List<String> filesToDelete = Platforms.WINDOWS ? ELASTICSEARCH_FILES_WINDOWS : ELASTICSEARCH_FILES_LINUX;
? ELASTICSEARCH_FILES_WINDOWS // windows needs leniency due to asinine releasing of file locking async from a process exiting
: ELASTICSEARCH_FILES_LINUX; Consumer<? super Path> rm = Platforms.WINDOWS ? FileUtils::rmWithRetries : FileUtils::rm;
filesToDelete.stream() filesToDelete.stream()
.map(Paths::get) .map(Paths::get)
.filter(Files::exists) .filter(Files::exists)
.forEach(FileUtils::rm); .forEach(rm);
// disable elasticsearch service // disable elasticsearch service
// todo add this for windows when adding tests for service intallation // todo add this for windows when adding tests for service intallation

View File

@ -84,6 +84,30 @@ public class FileUtils {
} }
} }
public static void rmWithRetries(Path... paths) {
int tries = 10;
Exception exception = null;
while (tries-- > 0) {
try {
IOUtils.rm(paths);
return;
} catch (IOException e) {
if (exception == null) {
exception = e;
} else {
exception.addSuppressed(e);
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException interrupted) {
Thread.currentThread().interrupt();
return;
}
}
throw new RuntimeException(exception);
}
public static Path mktempDir(Path path) { public static Path mktempDir(Path path) {
try { try {
return Files.createTempDirectory(path,"tmp"); return Files.createTempDirectory(path,"tmp");