8250646: hdiutil detach fix JDK-8245311 still fails sometimes

Reviewed-by: herrick, asemenyuk
This commit is contained in:
Alexander Matveev 2020-08-04 17:47:51 -07:00
parent 36b129fe84
commit 45c4d9d519
2 changed files with 24 additions and 3 deletions

View File

@ -446,9 +446,22 @@ public class MacDmgBundler extends MacBaseInstallerBundler {
// "hdiutil detach" might not work right away due to resource busy error, so
// repeat detach several times.
RetryExecutor retryExecutor = new RetryExecutor();
// 10 times with 3 second delays.
retryExecutor.setMaxAttemptsCount(10).setAttemptTimeoutMillis(3000)
.execute(pb);
// Image can get detach even if we got resource busy error, so stop
// trying to detach it if it is no longer attached.
retryExecutor.setExecutorInitializer(exec -> {
if (!Files.exists(mountedRoot)) {
retryExecutor.abort();
}
});
try {
// 10 times with 3 second delays.
retryExecutor.setMaxAttemptsCount(10).setAttemptTimeoutMillis(3000)
.execute(pb);
} catch (IOException ex) {
if (!retryExecutor.isAborted()) {
throw ex;
}
}
}
// Compress it to a new image

View File

@ -53,6 +53,10 @@ public final class RetryExecutor {
aborted = true;
}
boolean isAborted() {
return aborted;
}
static RetryExecutor retryOnKnownErrorMessage(String v) {
RetryExecutor result = new RetryExecutor();
return result.setExecutorInitializer(exec -> {
@ -75,6 +79,10 @@ public final class RetryExecutor {
private void executeLoop(Supplier<Executor> execSupplier) throws IOException {
aborted = false;
for (;;) {
if (aborted) {
break;
}
try {
Executor exec = execSupplier.get();
if (executorInitializer != null) {