Skip to content

Commit df5510c

Browse files
authored
Merge pull request #2893 from fractal-analytics-platform/2892-fix-unhandled-error-with-slurmconfigextra_lines
Make `extra_lines` a non-optional list
2 parents 4031774 + 923a289 commit df5510c

File tree

6 files changed

+22
-21
lines changed

6 files changed

+22
-21
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ TBD
1010
\#2877
1111
\#2882
1212
\#2884
13+
\#2893
1314

1415
# 2.16.6
1516

fractal_server/runner/config/_slurm.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from pydantic import AfterValidator
44
from pydantic import BaseModel
55
from pydantic import ConfigDict
6+
from pydantic import Field
67
from pydantic.types import PositiveInt
78

89
from fractal_server.runner.config.slurm_mem_to_MB import slurm_mem_to_MB
@@ -44,7 +45,7 @@ class _SlurmConfigSet(BaseModel):
4445
nodelist: NonEmptyStr | None = None
4546
time: NonEmptyStr | None = None
4647
account: NonEmptyStr | None = None
47-
extra_lines: list[NonEmptyStr] | None = None
48+
extra_lines: list[NonEmptyStr] = Field(default_factory=list)
4849
gpus: NonEmptyStr | None = None
4950

5051

@@ -125,4 +126,4 @@ class JobRunnerConfigSLURM(BaseModel):
125126
default_slurm_config: _SlurmConfigSet
126127
gpu_slurm_config: _SlurmConfigSet | None = None
127128
batching_config: _BatchingConfigSet
128-
user_local_exports: DictStrStr | None = None
129+
user_local_exports: DictStrStr = Field(default_factory=dict)

fractal_server/runner/executors/slurm_common/base_slurm_runner.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ class method is useful to fix issue #2659 (which was due to
252252
f"Add {self.common_script_lines} to "
253253
f"{new_slurm_config.extra_lines=}."
254254
)
255-
current_extra_lines = new_slurm_config.extra_lines or []
255+
current_extra_lines = new_slurm_config.extra_lines
256256
new_slurm_config.extra_lines = (
257257
current_extra_lines + self.common_script_lines
258258
)

fractal_server/runner/executors/slurm_common/get_slurm_config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ def _get_slurm_config_internal(
7777
else:
7878
needs_gpu = False
7979
logger.debug(f"[get_slurm_config] {needs_gpu=}")
80-
if needs_gpu:
80+
if needs_gpu and shared_config.gpu_slurm_config is not None:
8181
for key, value in shared_config.gpu_slurm_config.model_dump(
8282
exclude_unset=True, exclude={"mem"}
8383
).items():

fractal_server/runner/executors/slurm_common/slurm_config.py

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,10 @@ class SlurmConfig(BaseModel):
8383

8484
# Free-field attribute for extra lines to be added to the SLURM job
8585
# preamble
86-
extra_lines: list[str] | None = Field(default_factory=list)
86+
extra_lines: list[str] = Field(default_factory=list)
8787

8888
# Variables that will be `export`ed in the SLURM submission script
89-
user_local_exports: dict[str, str] | None = None
89+
user_local_exports: dict[str, str] = Field(default_factory=dict)
9090

9191
# Metaparameters needed to combine multiple tasks in each SLURM job
9292
tasks_per_job: int | None = None
@@ -152,9 +152,8 @@ def to_sbatch_preamble(
152152
"SlurmConfig.sbatch_preamble requires that "
153153
f"{self.parallel_tasks_per_job=} is not None."
154154
)
155-
if self.extra_lines:
156-
if len(self.extra_lines) != len(set(self.extra_lines)):
157-
raise ValueError(f"{self.extra_lines=} contains repetitions")
155+
if len(self.extra_lines) != len(set(self.extra_lines)):
156+
raise ValueError(f"{self.extra_lines=} contains repetitions")
158157

159158
mem_per_job_MB = self.parallel_tasks_per_job * self.mem_per_task_MB
160159
lines = [
@@ -187,18 +186,16 @@ def to_sbatch_preamble(
187186
option = key.replace("_", "-")
188187
lines.append(f"{self.prefix} --{option}={value}")
189188

190-
if self.extra_lines:
191-
for line in self._sorted_extra_lines():
192-
lines.append(line)
193-
194-
if self.user_local_exports:
195-
if remote_export_dir is None:
196-
raise ValueError(
197-
f"remote_export_dir=None but {self.user_local_exports=}"
198-
)
199-
for key, value in self.user_local_exports.items():
200-
tmp_value = str(Path(remote_export_dir) / value)
201-
lines.append(f"export {key}={tmp_value}")
189+
for line in self._sorted_extra_lines():
190+
lines.append(line)
191+
192+
if self.user_local_exports != {} and remote_export_dir is None:
193+
raise ValueError(
194+
f"{remote_export_dir=} but {self.user_local_exports=}"
195+
)
196+
for key, value in self.user_local_exports.items():
197+
tmp_value = str(Path(remote_export_dir) / value)
198+
lines.append(f"export {key}={tmp_value}")
202199

203200
"""
204201
FIXME export SRUN_CPUS_PER_TASK

tests/v2/test_08_backends/test_slurm_config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ def test_get_slurm_config_internal_gpu_options():
138138
"max_num_jobs": 10,
139139
},
140140
)
141+
assert shared_slurm_config.user_local_exports == {}
142+
assert shared_slurm_config.default_slurm_config.extra_lines == []
141143

142144
# In absence of `needs_gpu`, parameters in `gpu_slurm_config` are not used
143145
mywftask = WorkflowTaskV2Mock()

0 commit comments

Comments
 (0)