From 7b3074aeb418bfa5c00d519625021adab824ab6f Mon Sep 17 00:00:00 2001 From: Dmitry Meyer Date: Tue, 2 Sep 2025 12:06:44 +0000 Subject: [PATCH] [runner] Ensure `working_dir` exists Fixes: https://github.com/dstackai/dstack/issues/3051 --- runner/internal/executor/executor.go | 9 ++++++--- runner/internal/executor/executor_test.go | 6 +++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/runner/internal/executor/executor.go b/runner/internal/executor/executor.go index 39999156c..f858b6ee5 100644 --- a/runner/internal/executor/executor.go +++ b/runner/internal/executor/executor.go @@ -196,12 +196,12 @@ func (ex *RunExecutor) Run(ctx context.Context) (err error) { ex.setJobCredentials(ctx) - if err := ex.setJobWorkingDir(ctx); err != nil { + if err := ex.prepareJobWorkingDir(ctx); err != nil { ex.SetJobStateWithTerminationReason( ctx, types.JobStateFailed, types.TerminationReasonExecutorError, - fmt.Sprintf("Failed to set the working dir (%s)", err), + fmt.Sprintf("Failed to set up the working dir (%s)", err), ) return gerrors.Wrap(err) } @@ -352,7 +352,7 @@ func (ex *RunExecutor) setJobCredentials(ctx context.Context) { log.Trace(ctx, "Job credentials", "uid", ex.jobUid, "gid", ex.jobGid, "home", ex.jobHomeDir) } -func (ex *RunExecutor) setJobWorkingDir(ctx context.Context) error { +func (ex *RunExecutor) prepareJobWorkingDir(ctx context.Context) error { var err error if ex.jobSpec.WorkingDir == nil { ex.jobWorkingDir, err = os.Getwd() @@ -369,6 +369,9 @@ func (ex *RunExecutor) setJobWorkingDir(ctx context.Context) error { } } log.Trace(ctx, "Job working dir", "path", ex.jobWorkingDir) + if err := common.MkdirAll(ctx, ex.jobWorkingDir, ex.jobUid, ex.jobGid); err != nil { + return gerrors.Wrap(err) + } return nil } diff --git a/runner/internal/executor/executor_test.go b/runner/internal/executor/executor_test.go index 410c577ce..1f5d13b58 100644 --- a/runner/internal/executor/executor_test.go +++ b/runner/internal/executor/executor_test.go @@ -28,7 +28,7 @@ func TestExecutor_WorkingDir_Set(t *testing.T) { ex.jobSpec.WorkingDir = &workingDir ex.jobSpec.Commands = append(ex.jobSpec.Commands, "pwd") - err = ex.setJobWorkingDir(context.TODO()) + err = ex.prepareJobWorkingDir(context.TODO()) require.NoError(t, err) require.Equal(t, workingDir, ex.jobWorkingDir) err = os.MkdirAll(workingDir, 0o755) @@ -47,7 +47,7 @@ func TestExecutor_WorkingDir_NotSet(t *testing.T) { require.NoError(t, err) ex.jobSpec.WorkingDir = nil ex.jobSpec.Commands = append(ex.jobSpec.Commands, "pwd") - err = ex.setJobWorkingDir(context.TODO()) + err = ex.prepareJobWorkingDir(context.TODO()) require.NoError(t, err) require.Equal(t, cwd, ex.jobWorkingDir) @@ -158,7 +158,7 @@ func TestExecutor_RemoteRepo(t *testing.T) { err := os.WriteFile(ex.codePath, []byte{}, 0o600) // empty diff require.NoError(t, err) - err = ex.setJobWorkingDir(context.TODO()) + err = ex.prepareJobWorkingDir(context.TODO()) require.NoError(t, err) err = ex.setupRepo(context.TODO()) require.NoError(t, err)