-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Cache: create method #459
Cache: create method #459
Changes from all commits
ae7d2f8
b9af945
ccee7e8
e33fa6d
7f0d103
4e464f5
4f60577
989c843
ba2c2bf
4e1facf
0b737db
d225a5a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -7,6 +7,10 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
execute_in_subprocess, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
terminate_subprocess, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
from executorlib.standalone.inputcheck import ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
check_executor, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
check_nested_flux_executor, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
from executorlib.standalone.thread import RaisingThread | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -23,7 +27,7 @@ def __init__( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
resource_dict: Optional[dict] = None, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
execute_function: callable = execute_with_pysqa, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
terminate_function: Optional[callable] = None, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
config_directory: Optional[str] = None, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pysqa_config_directory: Optional[str] = None, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
backend: Optional[str] = None, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -36,7 +40,7 @@ def __init__( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
- cwd (str/None): current working directory where the parallel python task is executed | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
execute_function (callable, optional): The function to execute tasks. Defaults to execute_in_subprocess. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
terminate_function (callable, optional): The function to terminate the tasks. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
config_directory (str, optional): path to the config directory. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pysqa_config_directory (str, optional): path to the pysqa config directory (only for pysqa based backend). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
backend (str, optional): name of the backend used to spawn tasks. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
super().__init__() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -62,8 +66,58 @@ def __init__( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
"cache_directory": cache_directory_path, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"resource_dict": resource_dict, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"terminate_function": terminate_function, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"config_directory": config_directory, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"pysqa_config_directory": pysqa_config_directory, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"backend": backend, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def create_file_executor( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
max_workers: int = 1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
backend: str = "pysqa_flux", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
max_cores: int = 1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cache_directory: Optional[str] = None, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
resource_dict: Optional[dict] = None, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
flux_executor=None, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
flux_executor_pmi_mode: Optional[str] = None, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
flux_executor_nesting: bool = False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pysqa_config_directory: Optional[str] = None, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
hostname_localhost: Optional[bool] = None, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
block_allocation: bool = False, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
init_function: Optional[callable] = None, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if cache_directory is None: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cache_directory = "executorlib_cache" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if max_workers != 1: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"The number of workers cannot be controlled with the pysqa based backend." | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if max_cores != 1: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"The number of cores cannot be controlled with the pysqa based backend." | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if hostname_localhost is not None: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"The option to connect to hosts based on their hostname is not available with the pysqa based backend." | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if block_allocation: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"The option block_allocation is not available with the pysqa based backend." | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if init_function is not None: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"The option to specify an init_function is not available with the pysqa based backend." | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if flux_executor_pmi_mode is not None: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"The option to specify the flux pmi mode is not available with the pysqa based backend." | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
check_executor(executor=flux_executor) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
check_nested_flux_executor(nested_flux_executor=flux_executor_nesting) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return FileExecutor( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cache_directory=cache_directory, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
resource_dict=resource_dict, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pysqa_config_directory=pysqa_config_directory, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
backend=backend.split("pysqa_")[-1], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+116
to
+123
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add validation for backend name format and safer string manipulation. The backend name transformation assumes the "pysqa_" prefix exists and could fail if an invalid backend is provided. Apply this diff: check_executor(executor=flux_executor)
check_nested_flux_executor(nested_flux_executor=flux_executor_nesting)
+ if not backend.startswith("pysqa_"):
+ raise ValueError(
+ f"Backend must start with 'pysqa_'. Got: {backend}. "
+ "Supported backends: pysqa_flux, pysqa_slurm"
+ )
+ actual_backend = backend[len("pysqa_"):]
+ if actual_backend not in ["flux", "slurm"]:
+ raise ValueError(
+ f"Unsupported backend: {backend}. "
+ "Supported backends: pysqa_flux, pysqa_slurm"
+ )
return FileExecutor(
cache_directory=cache_directory,
resource_dict=resource_dict,
pysqa_config_directory=pysqa_config_directory,
- backend=backend.split("pysqa_")[-1],
+ backend=actual_backend,
) 📝 Committable suggestion
Suggested change
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codebase verification
Based on the gathered information, I can now provide the final response:
pysqa backend implementation is properly integrated but lacks tests
The implementation shows:
executorlib/cache/executor.py
andexecutorlib/cache/shared.py
However:
🔗 Analysis chain
Verify pysqa backend implementation and testing.
Let's verify the existence of pysqa backend implementations and related tests:
Let me gather more information to verify the implementation and testing thoroughly.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
Length of output: 760
Script:
Length of output: 3355