[Fix-17520][TaskExecutor] Fix not clear task exec path when set development.state=false in common.properties (#17523)
diff --git a/dolphinscheduler-common/src/main/resources/common.properties b/dolphinscheduler-common/src/main/resources/common.properties
index 81143ae..9e5adea 100644
--- a/dolphinscheduler-common/src/main/resources/common.properties
+++ b/dolphinscheduler-common/src/main/resources/common.properties
@@ -81,7 +81,7 @@
# network IP gets priority, default: inner outer
#dolphin.scheduler.network.priority.strategy=default
-# development state
+# development state. it may delete task exec path when task finished, or keep it for debug reason in development
development.state=false
# If the shell process is still active after this timeout value (in seconds), then will use kill -9 to kill it
diff --git a/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/engine/executor/LogicTaskExecutor.java b/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/engine/executor/LogicTaskExecutor.java
index 4dafabf..738b36f 100644
--- a/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/engine/executor/LogicTaskExecutor.java
+++ b/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/engine/executor/LogicTaskExecutor.java
@@ -78,6 +78,11 @@
}
@Override
+ public void finalizeTask() {
+ // do nothing for now
+ }
+
+ @Override
public String toString() {
return "LogicTaskExecutor{" +
"id=" + taskExecutionContext.getTaskInstanceId() +
diff --git a/dolphinscheduler-task-executor/src/main/java/org/apache/dolphinscheduler/task/executor/ITaskExecutor.java b/dolphinscheduler-task-executor/src/main/java/org/apache/dolphinscheduler/task/executor/ITaskExecutor.java
index f62d9ab..2dd25b8 100644
--- a/dolphinscheduler-task-executor/src/main/java/org/apache/dolphinscheduler/task/executor/ITaskExecutor.java
+++ b/dolphinscheduler-task-executor/src/main/java/org/apache/dolphinscheduler/task/executor/ITaskExecutor.java
@@ -70,6 +70,11 @@
void kill();
/**
+ * finalize the task executor.
+ */
+ void finalizeTask();
+
+ /**
* Get the EventBus belongs to the task executor.
*/
TaskExecutorEventBus getTaskExecutorEventBus();
diff --git a/dolphinscheduler-task-executor/src/main/java/org/apache/dolphinscheduler/task/executor/container/AbstractTaskExecutorContainer.java b/dolphinscheduler-task-executor/src/main/java/org/apache/dolphinscheduler/task/executor/container/AbstractTaskExecutorContainer.java
index fd87643..4eac0e2 100644
--- a/dolphinscheduler-task-executor/src/main/java/org/apache/dolphinscheduler/task/executor/container/AbstractTaskExecutorContainer.java
+++ b/dolphinscheduler-task-executor/src/main/java/org/apache/dolphinscheduler/task/executor/container/AbstractTaskExecutorContainer.java
@@ -98,6 +98,8 @@
}
log.info(FINALIZE_SESSION_MARKER, FINALIZE_SESSION_MARKER.toString());
pushTaskExecutorLogToRemote(taskExecutor);
+ // [Fix-17520]
+ taskExecutor.finalizeTask();
}
@Override
diff --git a/dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/executor/PhysicalTaskExecutor.java b/dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/executor/PhysicalTaskExecutor.java
index d6139b2..1d4c7b0 100644
--- a/dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/executor/PhysicalTaskExecutor.java
+++ b/dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/executor/PhysicalTaskExecutor.java
@@ -17,7 +17,9 @@
package org.apache.dolphinscheduler.server.worker.executor;
+import org.apache.dolphinscheduler.common.constants.Constants;
import org.apache.dolphinscheduler.common.utils.JSONUtils;
+import org.apache.dolphinscheduler.common.utils.PropertyUtils;
import org.apache.dolphinscheduler.plugin.storage.api.StorageOperator;
import org.apache.dolphinscheduler.plugin.task.api.AbstractTask;
import org.apache.dolphinscheduler.plugin.task.api.TaskCallBack;
@@ -105,6 +107,18 @@
}
@Override
+ public void finalizeTask() {
+ clearTaskInstanceWorkingDirectoryIfNeeded();
+ }
+
+ private void clearTaskInstanceWorkingDirectoryIfNeeded() {
+ boolean isDevelopment = PropertyUtils.getBoolean(Constants.DEVELOPMENT_STATE, true);
+ if (!isDevelopment) {
+ TaskExecutionContextUtils.clearTaskInstanceWorkingDirectory(taskExecutionContext);
+ }
+ }
+
+ @Override
protected void initializeTaskContext() {
super.initializeTaskContext();
diff --git a/dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/utils/TaskExecutionContextUtils.java b/dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/utils/TaskExecutionContextUtils.java
index 79536bb..bdcbdbe 100644
--- a/dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/utils/TaskExecutionContextUtils.java
+++ b/dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/utils/TaskExecutionContextUtils.java
@@ -29,6 +29,7 @@
import org.apache.dolphinscheduler.server.worker.metrics.WorkerServerMetrics;
import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.nio.file.Files;
@@ -108,4 +109,16 @@
return resourceContext;
}
+ public static void clearTaskInstanceWorkingDirectory(TaskExecutionContext taskExecutionContext) {
+ final String execPath = taskExecutionContext.getExecutePath();
+ try {
+ if (StringUtils.isNotEmpty(execPath)) {
+ FileUtils.deleteFile(execPath);
+ log.info("Deleted task exec directory: {}", execPath);
+ }
+ } catch (Exception e) {
+ log.warn("Failed to delete task exec directory.", e);
+ }
+ }
+
}
diff --git a/dolphinscheduler-worker/src/test/java/org/apache/dolphinscheduler/server/worker/utils/TaskExecutionContextUtilsTest.java b/dolphinscheduler-worker/src/test/java/org/apache/dolphinscheduler/server/worker/utils/TaskExecutionContextUtilsTest.java
index 3fa08e3..36db668 100644
--- a/dolphinscheduler-worker/src/test/java/org/apache/dolphinscheduler/server/worker/utils/TaskExecutionContextUtilsTest.java
+++ b/dolphinscheduler-worker/src/test/java/org/apache/dolphinscheduler/server/worker/utils/TaskExecutionContextUtilsTest.java
@@ -55,4 +55,23 @@
FileUtils.deleteFile(taskWorkingDirectory);
}
}
+
+ @Test
+ void clearTaskInstanceWorkingDirectory() throws IOException {
+ TaskExecutionContext taskExecutionContext = new TaskExecutionContext();
+ taskExecutionContext.setTaskInstanceId(1);
+
+ TaskExecutionContextUtils.createTaskInstanceWorkingDirectory(taskExecutionContext);
+ String taskWorkingDirectory =
+ FileUtils.getTaskInstanceWorkingDirectory(taskExecutionContext.getTaskInstanceId());
+ Files.createFile(Paths.get(taskWorkingDirectory, "1.sh"));
+
+ // Test delete the working directory
+ TaskExecutionContextUtils.clearTaskInstanceWorkingDirectory(taskExecutionContext);
+ Assertions.assertFalse(Files.exists(Paths.get(taskWorkingDirectory)));
+
+ // Test do nothing if working directory is empty
+ TaskExecutionContext emptyExecPathContext = new TaskExecutionContext();
+ TaskExecutionContextUtils.clearTaskInstanceWorkingDirectory(emptyExecPathContext);
+ }
}