Skip to content

Commit

Permalink
Attempt to capture failure during worker process shutdown
Browse files Browse the repository at this point in the history
  • Loading branch information
big-guy committed Oct 31, 2019
1 parent 7dc6701 commit dd87042
Showing 1 changed file with 30 additions and 28 deletions.
Expand Up @@ -23,7 +23,6 @@
import org.gradle.internal.concurrent.CompositeStoppable;
import org.gradle.internal.concurrent.DefaultExecutorFactory;
import org.gradle.internal.concurrent.ExecutorFactory;
import org.gradle.internal.concurrent.Stoppable;
import org.gradle.internal.event.DefaultListenerManager;
import org.gradle.internal.event.ListenerManager;
import org.gradle.internal.io.ClassLoaderObjectInputStream;
Expand Down Expand Up @@ -105,8 +104,12 @@ public Void call() throws Exception {
final WorkerServices workerServices = new WorkerServices(basicWorkerServices, gradleUserHomeDir);

ObjectConnection connection = null;

WorkerLogEventListener workerLogEventListener = null;
PrintUnrecoverableErrorToFileHandler unrecoverableErrorHandler = new PrintUnrecoverableErrorToFileHandler(workerServices.get(WorkerDirectoryProvider.class));
File workingDirectory = workerServices.get(WorkerDirectoryProvider.class).getWorkingDirectory();
File errorLog = getLastResortErrorLogFile(workingDirectory);
PrintUnrecoverableErrorToFileHandler unrecoverableErrorHandler = new PrintUnrecoverableErrorToFileHandler(errorLog);

try {
// Read serialized worker
byte[] serializedWorker = decoder.readBinary();
Expand Down Expand Up @@ -147,47 +150,46 @@ public ServiceRegistry getServiceRegistry() {
}
});
} finally {
if (workerLogEventListener != null) {
loggingManager.removeOutputEventListener(workerLogEventListener);
try {
if (workerLogEventListener != null) {
loggingManager.removeOutputEventListener(workerLogEventListener);
}
CompositeStoppable.stoppable(connection, basicWorkerServices).stop();
loggingManager.stop();
} catch (Throwable t) {
// We're failing while shutting down, so log whatever might have happened.
unrecoverableErrorHandler.execute(t);
}
CompositeStoppable.stoppable(connection, unrecoverableErrorHandler, basicWorkerServices).stop();
loggingManager.stop();
}

return null;
}

private class PrintUnrecoverableErrorToFileHandler implements Action<Throwable>, Stoppable {
private final File workerDirectory;
private PrintStream ps;
private File getLastResortErrorLogFile(File workingDirectory) {
return new File(workingDirectory, "worker-error-" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".txt");
}

private static class PrintUnrecoverableErrorToFileHandler implements Action<Throwable> {
private final File errorLog;

private PrintUnrecoverableErrorToFileHandler(WorkerDirectoryProvider workerDirectoryProvider) {
this.workerDirectory = workerDirectoryProvider.getWorkingDirectory();
private PrintUnrecoverableErrorToFileHandler(File errorLog) {
this.errorLog = errorLog;
}

@Override
public void execute(Throwable throwable) {
if (ps == null) {
String fileName = "worker-error-" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".txt";
try {
final PrintStream ps = new PrintStream(errorLog);
try {
ps = new PrintStream(new File(workerDirectory, fileName));
} catch (FileNotFoundException ignored) {
// ignored
ps.println("Encountered unrecoverable error:");
throwable.printStackTrace(ps);
} finally {
ps.close();
}
}
if (ps != null) {
ps.println("Encountered unrecoverable error:");
throwable.printStackTrace(ps);
}
}

@Override
public void stop() {
if (ps != null) {
ps.close();
} catch (FileNotFoundException e) {
// ignore this, we won't be able to get any logs
}
}

}

private WorkerLogEventListener configureLogging(LoggingManagerInternal loggingManager, ObjectConnection connection) {
Expand Down

0 comments on commit dd87042

Please sign in to comment.