From 99a7020a2f82445819fe48da7b4543a6d93bd158 Mon Sep 17 00:00:00 2001 From: Raimund58 Date: Sat, 15 Jul 2023 14:49:03 +0000 Subject: [PATCH] Kill orphan Blender process after rendering --- src/main/java/com/sheepit/client/Client.java | 2 +- src/main/java/com/sheepit/client/Job.java | 11 ++++++----- src/main/java/com/sheepit/client/RenderProcess.java | 13 +++++++++++++ src/main/java/com/sheepit/client/Server.java | 2 +- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/sheepit/client/Client.java b/src/main/java/com/sheepit/client/Client.java index 3410e00..04dfcce 100644 --- a/src/main/java/com/sheepit/client/Client.java +++ b/src/main/java/com/sheepit/client/Client.java @@ -534,7 +534,7 @@ import okhttp3.HttpUrl; if (this.renderingJob.getProcessRender().getProcess() != null) { this.renderingJob.setAskForRendererKill(true); - OS.getOS().kill(this.renderingJob.getProcessRender().getProcess()); + this.renderingJob.getProcessRender().kill(); } } diff --git a/src/main/java/com/sheepit/client/Job.java b/src/main/java/com/sheepit/client/Job.java index d58c7ad..806b0fb 100644 --- a/src/main/java/com/sheepit/client/Job.java +++ b/src/main/java/com/sheepit/client/Job.java @@ -123,7 +123,7 @@ import java.util.regex.Pattern; setUserBlockJob(true); RenderProcess process = getProcessRender(); if (process != null) { - OS.getOS().kill(process.getProcess()); + process.kill(); } } @@ -374,8 +374,8 @@ import java.util.regex.Pattern; long duration = (new Date().getTime() - process.getStartTime()) / 1000; // in seconds if (configuration.getMaxRenderTime() > 0 && duration > configuration.getMaxRenderTime()) { setAskForRendererKill(true); - log.debug("Killing render because process duration"); - OS.getOS().kill(process.getProcess()); + log.debug("Killing render - exceeding allowed process duration"); + process.kill(); } } } @@ -455,7 +455,6 @@ import java.util.regex.Pattern; if (configuration.getMaxAllowedMemory() != -1 && getProcessRender().getMemoryUsed().get() > configuration.getMaxAllowedMemory()) { log.debug("Blocking render because process ram used (" + getProcessRender().getMemoryUsed().get() + "k) is over user setting (" + configuration .getMaxAllowedMemory() + "k)"); - OS.getOS().kill(process.getProcess()); process.finish(); if (process.getRenderDuration() == -1) { if (timeStamp == null) { @@ -498,6 +497,7 @@ import java.util.regex.Pattern; // Put back base icon gui.updateTrayIcon(Job.SHOW_BASE_ICON); + process.kill(); for (String logline : configuration.filesystemHealthCheck()) { log.debug(logline); } @@ -547,8 +547,9 @@ import java.util.regex.Pattern; // Put back base icon gui.updateTrayIcon(Job.SHOW_BASE_ICON); - + log.debug("end of rendering"); + } catch (Exception err) { if (script_file != null) { diff --git a/src/main/java/com/sheepit/client/RenderProcess.java b/src/main/java/com/sheepit/client/RenderProcess.java index 9de57a2..c0204a9 100644 --- a/src/main/java/com/sheepit/client/RenderProcess.java +++ b/src/main/java/com/sheepit/client/RenderProcess.java @@ -19,6 +19,7 @@ package com.sheepit.client; +import com.sheepit.client.os.OS; import lombok.Data; import java.util.Date; @@ -92,7 +93,19 @@ import oshi.software.os.OSProcess; return 0; } + public void kill() { + if (process != null){ + try { + OS.getOS().kill(process); + log.debug("RenderProcess::Process killed"); + } catch (NullPointerException ex) { // We are racing the system itself, we can't avoid catching NPE's + log.debug("RenderProcess::Handled process becoming unavailable before getting killed"); + } + } + } + public void finish() { + kill(); endTime = new Date().getTime(); osProcess = null; process = null; diff --git a/src/main/java/com/sheepit/client/Server.java b/src/main/java/com/sheepit/client/Server.java index ee0c1dd..b13eda6 100644 --- a/src/main/java/com/sheepit/client/Server.java +++ b/src/main/java/com/sheepit/client/Server.java @@ -156,7 +156,7 @@ public class Server extends Thread { if (this.client.getRenderingJob().getProcessRender().getProcess() != null) { this.client.getRenderingJob().setAskForRendererKill(true); - OS.getOS().kill(this.client.getRenderingJob().getProcessRender().getProcess()); + this.client.getRenderingJob().getProcessRender().kill(); } } }