parsl 2024.8.12__tar.gz → 2024.8.26__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {parsl-2024.8.12/parsl.egg-info → parsl-2024.8.26}/PKG-INFO +3 -2
- {parsl-2024.8.12 → parsl-2024.8.26}/README.rst +4 -1
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/channels/oauth_ssh/oauth_ssh.py +10 -2
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/channels/ssh/ssh.py +16 -6
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/channels/ssh_il/ssh_il.py +12 -2
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/high_throughput/executor.py +18 -27
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/high_throughput/interchange.py +31 -29
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/high_throughput/mpi_executor.py +23 -2
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/high_throughput/mpi_prefix_composer.py +5 -4
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/status_handling.py +5 -2
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/jobs/states.py +6 -1
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/db_manager.py +21 -65
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/monitoring.py +10 -23
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/router.py +12 -39
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/slurm/slurm.py +40 -10
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +3 -5
- parsl-2024.8.26/parsl/tests/test_htex/test_resource_spec_validation.py +40 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +1 -1
- parsl-2024.8.26/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +48 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +16 -8
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_mpi_apps/test_mpiex.py +2 -3
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_mpi_apps/test_resource_spec.py +39 -41
- parsl-2024.8.26/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +85 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/version.py +1 -1
- {parsl-2024.8.12 → parsl-2024.8.26/parsl.egg-info}/PKG-INFO +3 -2
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl.egg-info/SOURCES.txt +2 -1
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl.egg-info/requires.txt +4 -1
- {parsl-2024.8.12 → parsl-2024.8.26}/requirements.txt +0 -1
- {parsl-2024.8.12 → parsl-2024.8.26}/setup.py +1 -0
- parsl-2024.8.12/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -33
- parsl-2024.8.12/parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +0 -47
- {parsl-2024.8.12 → parsl-2024.8.26}/LICENSE +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/MANIFEST.in +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/addresses.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/app/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/app/app.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/app/bash.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/app/errors.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/app/futures.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/app/python.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/benchmark/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/benchmark/perf.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/channels/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/channels/base.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/channels/errors.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/channels/local/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/channels/local/local.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/channels/oauth_ssh/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/channels/ssh/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/channels/ssh_il/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/concurrent/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/config.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/ASPIRE1.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/Azure.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/bridges.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/cc_in2p3.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/ec2.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/expanse.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/frontera.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/htex_local.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/illinoiscluster.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/kubernetes.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/local_threads.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/midway.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/osg.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/polaris.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/stampede2.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/summit.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/toss3_llnl.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/vineex_local.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/configs/wqex_local.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/curvezmq.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/data_provider/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/data_provider/data_manager.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/data_provider/file_noop.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/data_provider/files.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/data_provider/ftp.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/data_provider/globus.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/data_provider/http.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/data_provider/rsync.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/data_provider/staging.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/data_provider/zip.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/dataflow/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/dataflow/dependency_resolvers.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/dataflow/dflow.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/dataflow/errors.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/dataflow/futures.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/dataflow/memoization.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/dataflow/rundirs.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/dataflow/states.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/dataflow/taskrecord.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/errors.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/base.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/errors.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/flux/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/flux/execute_parsl_task.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/flux/executor.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/flux/flux_instance_manager.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/high_throughput/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/high_throughput/errors.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/high_throughput/manager_record.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/high_throughput/manager_selector.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/high_throughput/monitoring_info.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/high_throughput/probe.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/radical/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/radical/executor.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/radical/rpex_resources.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/radical/rpex_worker.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/taskvine/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/taskvine/errors.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/taskvine/executor.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/taskvine/factory.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/taskvine/factory_config.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/taskvine/manager.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/taskvine/manager_config.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/taskvine/utils.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/threads.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/workqueue/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/workqueue/errors.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/workqueue/executor.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/jobs/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/jobs/error_handlers.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/jobs/errors.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/jobs/job_status_poller.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/jobs/strategy.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/launchers/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/launchers/base.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/launchers/errors.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/launchers/launchers.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/log_utils.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/errors.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/message_type.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/queries/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/queries/pandas.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/radios.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/remote.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/types.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/app.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/models.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/plots/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/templates/app.html +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/templates/dag.html +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/templates/error.html +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/templates/layout.html +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/templates/task.html +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/templates/workflow.html +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/utils.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/version.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/monitoring/visualization/views.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/multiprocessing.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/process_loggers.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/ad_hoc/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/aws/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/aws/aws.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/aws/template.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/azure/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/azure/azure.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/azure/template.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/base.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/cluster_provider.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/cobalt/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/cobalt/cobalt.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/cobalt/template.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/condor/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/condor/condor.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/condor/template.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/errors.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/googlecloud/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/googlecloud/googlecloud.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/grid_engine/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/grid_engine/grid_engine.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/grid_engine/template.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/kubernetes/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/kubernetes/kube.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/kubernetes/template.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/local/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/local/local.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/lsf/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/lsf/lsf.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/lsf/template.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/pbspro/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/pbspro/pbspro.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/pbspro/template.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/slurm/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/slurm/template.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/torque/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/torque/template.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/providers/torque/torque.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/py.typed +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/serialize/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/serialize/base.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/serialize/concretes.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/serialize/errors.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/serialize/facade.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/serialize/proxystore.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/callables_helper.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/azure_single_node.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/bluewaters.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/bridges.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/cc_in2p3.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/comet.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/cooley_htex.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/ec2_single_node.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/ec2_spot.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/flux_local.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/frontera.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/htex_local.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/htex_local_alternate.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/local_adhoc.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/local_radical.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/local_radical_mpi.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/local_threads.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/local_threads_globus.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/local_threads_monitoring.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/local_threads_no_cache.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/midway.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/nscc_singapore.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/osg_htex.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/petrelkube.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/summit.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/taskvine_ex.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/theta.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/user_opts.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/configs/workqueue_ex.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/conftest.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/integration/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/integration/latency.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/integration/test_apps/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/integration/test_channels/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/integration/test_channels/test_channels.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/integration/test_stress/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/manual_tests/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/manual_tests/htex_local.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/manual_tests/test_basic.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/manual_tests/test_log_filter.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/manual_tests/test_regression_220.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/manual_tests/test_worker_count.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/scaling_tests/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/scaling_tests/htex_local.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/scaling_tests/local_threads.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/scaling_tests/test_scale.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/scaling_tests/vineex_local.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/scaling_tests/wqex_local.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/site_tests/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/site_tests/site_config_selector.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/site_tests/test_provider.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/site_tests/test_site.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/sites/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/sites/test_affinity.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/sites/test_concurrent.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/sites/test_dynamic_executor.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/sites/test_ec2.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/sites/test_launchers.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/sites/test_local_adhoc.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/sites/test_mpi/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/sites/test_worker_info.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_aalst_patterns.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_bash_apps/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_bash_apps/test_basic.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_callables.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_channels/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_channels/test_dfk_close.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_channels/test_large_output.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_checkpointing/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_curvezmq.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_docs/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_docs/test_from_slides.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_docs/test_kwargs.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_docs/test_workflow1.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_docs/test_workflow2.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_docs/test_workflow4.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_error_handling/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_error_handling/test_fail.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_error_handling/test_retries.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_flowcontrol/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_flux.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_htex/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_htex/test_basic.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_htex/test_drain.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_htex/test_htex.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_htex/test_manager_failure.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_htex/test_managers_command.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_htex/test_missing_worker.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_htex/test_worker_failure.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_monitoring/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_monitoring/test_app_names.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_monitoring/test_basic.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_mpi_apps/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_providers/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_providers/test_cobalt_deprecation_warning.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_providers/test_local_provider.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_providers/test_slurm_template.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_basic.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_fail.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_futures.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_join.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_lifted.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_mapred.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_outputs.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_overview.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_simple.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_timeout.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_python_apps/test_type5.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_radical/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_regression/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_regression/test_1480.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_regression/test_1653.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_regression/test_221.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_regression/test_226.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_regression/test_2652.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_regression/test_69a.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_regression/test_854.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_regression/test_98.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_scaling/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_scaling/test_scale_down.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_serialization/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_serialization/test_basic.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_shutdown/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/staging_provider.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/test_1316.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/test_docs_1.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/test_docs_2.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/test_file.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/test_file_apps.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/test_file_staging.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/test_staging_globus.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/test_staging_https.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/test_zip_in.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/test_zip_out.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_summary.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_thread_parallelism.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_threads/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_threads/test_configs.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_utils/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/unit/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/unit/test_file.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/unit/test_usage_tracking.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/tests/utils.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/usage_tracking/__init__.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/usage_tracking/api.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/usage_tracking/levels.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/usage_tracking/usage.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl/utils.py +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl.egg-info/dependency_links.txt +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl.egg-info/entry_points.txt +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/parsl.egg-info/top_level.txt +0 -0
- {parsl-2024.8.12 → parsl-2024.8.26}/setup.cfg +0 -0
@@ -1,9 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: parsl
|
3
|
-
Version: 2024.8.
|
3
|
+
Version: 2024.8.26
|
4
4
|
Summary: Simple data dependent workflows in Python
|
5
5
|
Home-page: https://github.com/Parsl/parsl
|
6
|
-
Download-URL: https://github.com/Parsl/parsl/archive/2024.08.
|
6
|
+
Download-URL: https://github.com/Parsl/parsl/archive/2024.08.26.tar.gz
|
7
7
|
Author: The Parsl Team
|
8
8
|
Author-email: parsl@googlegroups.com
|
9
9
|
License: Apache 2.0
|
@@ -30,6 +30,7 @@ Provides-Extra: workqueue
|
|
30
30
|
Provides-Extra: flux
|
31
31
|
Provides-Extra: proxystore
|
32
32
|
Provides-Extra: radical-pilot
|
33
|
+
Provides-Extra: ssh
|
33
34
|
Provides-Extra: all
|
34
35
|
License-File: LICENSE
|
35
36
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Parsl - Parallel Scripting Library
|
2
2
|
==================================
|
3
|
-
|licence| |build-status| |docs| |NSF-1550588| |NSF-1550476| |NSF-1550562| |NSF-1550528|
|
3
|
+
|licence| |build-status| |docs| |NSF-1550588| |NSF-1550476| |NSF-1550562| |NSF-1550528| |CZI-EOSS|
|
4
4
|
|
5
5
|
Parsl extends parallelism in Python beyond a single computer.
|
6
6
|
|
@@ -64,6 +64,9 @@ then explore the `parallel computing patterns <https://parsl.readthedocs.io/en/s
|
|
64
64
|
.. |NSF-1550475| image:: https://img.shields.io/badge/NSF-1550475-blue.svg
|
65
65
|
:target: https://nsf.gov/awardsearch/showAward?AWD_ID=1550475
|
66
66
|
:alt: NSF award info
|
67
|
+
.. |CZI-EOSS| image:: https://chanzuckerberg.github.io/open-science/badges/CZI-EOSS.svg
|
68
|
+
:target: https://czi.co/EOSS
|
69
|
+
:alt: CZI's Essential Open Source Software for Science
|
67
70
|
|
68
71
|
|
69
72
|
Quickstart
|
@@ -1,11 +1,15 @@
|
|
1
1
|
import logging
|
2
2
|
import socket
|
3
3
|
|
4
|
-
import paramiko
|
5
|
-
|
6
4
|
from parsl.channels.ssh.ssh import DeprecatedSSHChannel
|
7
5
|
from parsl.errors import OptionalModuleMissing
|
8
6
|
|
7
|
+
try:
|
8
|
+
import paramiko
|
9
|
+
_ssh_enabled = True
|
10
|
+
except (ImportError, NameError, FileNotFoundError):
|
11
|
+
_ssh_enabled = False
|
12
|
+
|
9
13
|
try:
|
10
14
|
from oauth_ssh.oauth_ssh_token import find_access_token
|
11
15
|
from oauth_ssh.ssh_service import SSHService
|
@@ -38,6 +42,10 @@ class DeprecatedOAuthSSHChannel(DeprecatedSSHChannel):
|
|
38
42
|
|
39
43
|
Raises:
|
40
44
|
'''
|
45
|
+
if not _ssh_enabled:
|
46
|
+
raise OptionalModuleMissing(['ssh'],
|
47
|
+
"OauthSSHChannel requires the ssh module and config.")
|
48
|
+
|
41
49
|
if not _oauth_ssh_enabled:
|
42
50
|
raise OptionalModuleMissing(['oauth_ssh'],
|
43
51
|
"OauthSSHChannel requires oauth_ssh module and config.")
|
@@ -2,8 +2,6 @@ import errno
|
|
2
2
|
import logging
|
3
3
|
import os
|
4
4
|
|
5
|
-
import paramiko
|
6
|
-
|
7
5
|
from parsl.channels.base import Channel
|
8
6
|
from parsl.channels.errors import (
|
9
7
|
AuthException,
|
@@ -13,15 +11,24 @@ from parsl.channels.errors import (
|
|
13
11
|
FileCopyException,
|
14
12
|
SSHException,
|
15
13
|
)
|
14
|
+
from parsl.errors import OptionalModuleMissing
|
16
15
|
from parsl.utils import RepresentationMixin
|
17
16
|
|
17
|
+
try:
|
18
|
+
import paramiko
|
19
|
+
_ssh_enabled = True
|
20
|
+
except (ImportError, NameError, FileNotFoundError):
|
21
|
+
_ssh_enabled = False
|
22
|
+
|
23
|
+
|
18
24
|
logger = logging.getLogger(__name__)
|
19
25
|
|
20
26
|
|
21
|
-
|
22
|
-
|
23
|
-
self
|
24
|
-
|
27
|
+
if _ssh_enabled:
|
28
|
+
class NoAuthSSHClient(paramiko.SSHClient):
|
29
|
+
def _auth(self, username, *args):
|
30
|
+
self._transport.auth_none(username)
|
31
|
+
return
|
25
32
|
|
26
33
|
|
27
34
|
class DeprecatedSSHChannel(Channel, RepresentationMixin):
|
@@ -53,6 +60,9 @@ class DeprecatedSSHChannel(Channel, RepresentationMixin):
|
|
53
60
|
|
54
61
|
Raises:
|
55
62
|
'''
|
63
|
+
if not _ssh_enabled:
|
64
|
+
raise OptionalModuleMissing(['ssh'],
|
65
|
+
"SSHChannel requires the ssh module and config.")
|
56
66
|
|
57
67
|
self.hostname = hostname
|
58
68
|
self.username = username
|
@@ -1,9 +1,15 @@
|
|
1
1
|
import getpass
|
2
2
|
import logging
|
3
3
|
|
4
|
-
import paramiko
|
5
|
-
|
6
4
|
from parsl.channels.ssh.ssh import DeprecatedSSHChannel
|
5
|
+
from parsl.errors import OptionalModuleMissing
|
6
|
+
|
7
|
+
try:
|
8
|
+
import paramiko
|
9
|
+
_ssh_enabled = True
|
10
|
+
except (ImportError, NameError, FileNotFoundError):
|
11
|
+
_ssh_enabled = False
|
12
|
+
|
7
13
|
|
8
14
|
logger = logging.getLogger(__name__)
|
9
15
|
|
@@ -30,6 +36,10 @@ class DeprecatedSSHInteractiveLoginChannel(DeprecatedSSHChannel):
|
|
30
36
|
|
31
37
|
Raises:
|
32
38
|
'''
|
39
|
+
if not _ssh_enabled:
|
40
|
+
raise OptionalModuleMissing(['ssh'],
|
41
|
+
"SSHInteractiveLoginChannel requires the ssh module and config.")
|
42
|
+
|
33
43
|
self.hostname = hostname
|
34
44
|
self.username = username
|
35
45
|
self.password = password
|
@@ -12,7 +12,6 @@ from typing import Callable, Dict, List, Optional, Sequence, Tuple, Union
|
|
12
12
|
|
13
13
|
import typeguard
|
14
14
|
|
15
|
-
import parsl.launchers
|
16
15
|
from parsl import curvezmq
|
17
16
|
from parsl.addresses import get_all_addresses
|
18
17
|
from parsl.app.errors import RemoteExceptionWrapper
|
@@ -25,8 +24,7 @@ from parsl.executors.high_throughput.manager_selector import (
|
|
25
24
|
RandomManagerSelector,
|
26
25
|
)
|
27
26
|
from parsl.executors.high_throughput.mpi_prefix_composer import (
|
28
|
-
|
29
|
-
validate_resource_spec,
|
27
|
+
InvalidResourceSpecification,
|
30
28
|
)
|
31
29
|
from parsl.executors.status_handling import BlockProviderExecutor
|
32
30
|
from parsl.jobs.states import TERMINAL_STATES, JobState, JobStatus
|
@@ -224,17 +222,6 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
224
222
|
Parsl will create names as integers starting with 0.
|
225
223
|
|
226
224
|
default: empty list
|
227
|
-
|
228
|
-
enable_mpi_mode: bool
|
229
|
-
If enabled, MPI launch prefixes will be composed for the batch scheduler based on
|
230
|
-
the nodes available in each batch job and the resource_specification dict passed
|
231
|
-
from the app. This is an experimental feature, please refer to the following doc section
|
232
|
-
before use: https://parsl.readthedocs.io/en/stable/userguide/mpi_apps.html
|
233
|
-
|
234
|
-
mpi_launcher: str
|
235
|
-
This field is only used if enable_mpi_mode is set. Select one from the
|
236
|
-
list of supported MPI launchers = ("srun", "aprun", "mpiexec").
|
237
|
-
default: "mpiexec"
|
238
225
|
"""
|
239
226
|
|
240
227
|
@typeguard.typechecked
|
@@ -263,8 +250,6 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
263
250
|
poll_period: int = 10,
|
264
251
|
address_probe_timeout: Optional[int] = None,
|
265
252
|
worker_logdir_root: Optional[str] = None,
|
266
|
-
enable_mpi_mode: bool = False,
|
267
|
-
mpi_launcher: str = "mpiexec",
|
268
253
|
manager_selector: ManagerSelector = RandomManagerSelector(),
|
269
254
|
block_error_handler: Union[bool, Callable[[BlockProviderExecutor, Dict[str, JobStatus]], None]] = True,
|
270
255
|
encrypted: bool = False):
|
@@ -330,15 +315,6 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
330
315
|
self.encrypted = encrypted
|
331
316
|
self.cert_dir = None
|
332
317
|
|
333
|
-
self.enable_mpi_mode = enable_mpi_mode
|
334
|
-
assert mpi_launcher in VALID_LAUNCHERS, \
|
335
|
-
f"mpi_launcher must be set to one of {VALID_LAUNCHERS}"
|
336
|
-
if self.enable_mpi_mode:
|
337
|
-
assert isinstance(self.provider.launcher, parsl.launchers.SimpleLauncher), \
|
338
|
-
"mpi_mode requires the provider to be configured to use a SimpleLauncher"
|
339
|
-
|
340
|
-
self.mpi_launcher = mpi_launcher
|
341
|
-
|
342
318
|
if not launch_cmd:
|
343
319
|
launch_cmd = DEFAULT_LAUNCH_CMD
|
344
320
|
self.launch_cmd = launch_cmd
|
@@ -348,6 +324,8 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
348
324
|
self.interchange_launch_cmd = interchange_launch_cmd
|
349
325
|
|
350
326
|
radio_mode = "htex"
|
327
|
+
enable_mpi_mode: bool = False
|
328
|
+
mpi_launcher: str = "mpiexec"
|
351
329
|
|
352
330
|
def _warn_deprecated(self, old: str, new: str):
|
353
331
|
warnings.warn(
|
@@ -377,6 +355,18 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
377
355
|
return "{}/{}".format(self.worker_logdir_root, self.label)
|
378
356
|
return self.logdir
|
379
357
|
|
358
|
+
def validate_resource_spec(self, resource_specification: dict):
|
359
|
+
"""HTEX does not support *any* resource_specification options and
|
360
|
+
will raise InvalidResourceSpecification is any are passed to it"""
|
361
|
+
if resource_specification:
|
362
|
+
raise InvalidResourceSpecification(
|
363
|
+
set(resource_specification.keys()),
|
364
|
+
("HTEX does not support the supplied resource_specifications."
|
365
|
+
"For MPI applications consider using the MPIExecutor. "
|
366
|
+
"For specifications for core count/memory/walltime, consider using WorkQueueExecutor. ")
|
367
|
+
)
|
368
|
+
return
|
369
|
+
|
380
370
|
def initialize_scaling(self):
|
381
371
|
"""Compose the launch command and scale out the initial blocks.
|
382
372
|
"""
|
@@ -660,7 +650,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
660
650
|
Future
|
661
651
|
"""
|
662
652
|
|
663
|
-
validate_resource_spec(resource_specification
|
653
|
+
self.validate_resource_spec(resource_specification)
|
664
654
|
|
665
655
|
if self.bad_state_is_set:
|
666
656
|
raise self.executor_exception
|
@@ -800,7 +790,8 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
800
790
|
connected_blocks = self.connected_blocks()
|
801
791
|
for job_id in job_status:
|
802
792
|
job_info = job_status[job_id]
|
803
|
-
if job_info.terminal and job_id not in connected_blocks:
|
793
|
+
if job_info.terminal and job_id not in connected_blocks and job_info.state != JobState.SCALED_IN:
|
794
|
+
logger.debug("Rewriting job %s from status %s to MISSING", job_id, job_info)
|
804
795
|
job_status[job_id].state = JobState.MISSING
|
805
796
|
if job_status[job_id].message is None:
|
806
797
|
job_status[job_id].message = (
|
@@ -375,7 +375,7 @@ class Interchange:
|
|
375
375
|
|
376
376
|
self.zmq_context.destroy()
|
377
377
|
delta = time.time() - start
|
378
|
-
logger.info("Processed {} tasks in {} seconds"
|
378
|
+
logger.info(f"Processed {self.count} tasks in {delta} seconds")
|
379
379
|
logger.warning("Exiting")
|
380
380
|
|
381
381
|
def process_task_outgoing_incoming(
|
@@ -396,9 +396,8 @@ class Interchange:
|
|
396
396
|
try:
|
397
397
|
msg = json.loads(message[1].decode('utf-8'))
|
398
398
|
except Exception:
|
399
|
-
logger.warning("Got Exception reading message from manager: {!r}"
|
400
|
-
|
401
|
-
logger.debug("Message: \n{!r}\n".format(message[1]))
|
399
|
+
logger.warning(f"Got Exception reading message from manager: {manager_id!r}", exc_info=True)
|
400
|
+
logger.debug("Message:\n %r\n", message[1])
|
402
401
|
return
|
403
402
|
|
404
403
|
# perform a bit of validation on the structure of the deserialized
|
@@ -406,7 +405,7 @@ class Interchange:
|
|
406
405
|
# in obviously malformed cases
|
407
406
|
if not isinstance(msg, dict) or 'type' not in msg:
|
408
407
|
logger.error(f"JSON message was not correctly formatted from manager: {manager_id!r}")
|
409
|
-
logger.debug("Message
|
408
|
+
logger.debug("Message:\n %r\n", message[1])
|
410
409
|
return
|
411
410
|
|
412
411
|
if msg['type'] == 'registration':
|
@@ -425,7 +424,7 @@ class Interchange:
|
|
425
424
|
self.connected_block_history.append(msg['block_id'])
|
426
425
|
|
427
426
|
interesting_managers.add(manager_id)
|
428
|
-
logger.info("Adding manager: {!r} to ready queue"
|
427
|
+
logger.info(f"Adding manager: {manager_id!r} to ready queue")
|
429
428
|
m = self._ready_managers[manager_id]
|
430
429
|
|
431
430
|
# m is a ManagerRecord, but msg is a dict[Any,Any] and so can
|
@@ -434,12 +433,12 @@ class Interchange:
|
|
434
433
|
# later.
|
435
434
|
m.update(msg) # type: ignore[typeddict-item]
|
436
435
|
|
437
|
-
logger.info("Registration info for manager {!r}: {}"
|
436
|
+
logger.info(f"Registration info for manager {manager_id!r}: {msg}")
|
438
437
|
self._send_monitoring_info(monitoring_radio, m)
|
439
438
|
|
440
439
|
if (msg['python_v'].rsplit(".", 1)[0] != self.current_platform['python_v'].rsplit(".", 1)[0] or
|
441
440
|
msg['parsl_v'] != self.current_platform['parsl_v']):
|
442
|
-
logger.error("Manager {!r} has incompatible version info with the interchange"
|
441
|
+
logger.error(f"Manager {manager_id!r} has incompatible version info with the interchange")
|
443
442
|
logger.debug("Setting kill event")
|
444
443
|
kill_event.set()
|
445
444
|
e = VersionMismatch("py.v={} parsl.v={}".format(self.current_platform['python_v'].rsplit(".", 1)[0],
|
@@ -452,16 +451,15 @@ class Interchange:
|
|
452
451
|
self.results_outgoing.send(pkl_package)
|
453
452
|
logger.error("Sent failure reports, shutting down interchange")
|
454
453
|
else:
|
455
|
-
logger.info("Manager {!r} has compatible Parsl version {
|
456
|
-
logger.info("Manager {!r} has compatible Python version {
|
457
|
-
msg['python_v'].rsplit(".", 1)[0]))
|
454
|
+
logger.info(f"Manager {manager_id!r} has compatible Parsl version {msg['parsl_v']}")
|
455
|
+
logger.info(f"Manager {manager_id!r} has compatible Python version {msg['python_v'].rsplit('.', 1)[0]}")
|
458
456
|
elif msg['type'] == 'heartbeat':
|
459
457
|
self._ready_managers[manager_id]['last_heartbeat'] = time.time()
|
460
|
-
logger.debug("Manager
|
458
|
+
logger.debug("Manager %r sent heartbeat via tasks connection", manager_id)
|
461
459
|
self.task_outgoing.send_multipart([manager_id, b'', PKL_HEARTBEAT_CODE])
|
462
460
|
elif msg['type'] == 'drain':
|
463
461
|
self._ready_managers[manager_id]['draining'] = True
|
464
|
-
logger.debug(
|
462
|
+
logger.debug("Manager %r requested drain", manager_id)
|
465
463
|
else:
|
466
464
|
logger.error(f"Unexpected message type received from manager: {msg['type']}")
|
467
465
|
logger.debug("leaving task_outgoing section")
|
@@ -484,9 +482,11 @@ class Interchange:
|
|
484
482
|
def process_tasks_to_send(self, interesting_managers: Set[bytes]) -> None:
|
485
483
|
# Check if there are tasks that could be sent to managers
|
486
484
|
|
487
|
-
logger.debug(
|
488
|
-
total
|
489
|
-
|
485
|
+
logger.debug(
|
486
|
+
"Managers count (interesting/total): %d/%d",
|
487
|
+
len(interesting_managers),
|
488
|
+
len(self._ready_managers)
|
489
|
+
)
|
490
490
|
|
491
491
|
if interesting_managers and not self.pending_task_queue.empty():
|
492
492
|
shuffled_managers = self.manager_selector.sort_managers(self._ready_managers, interesting_managers)
|
@@ -497,7 +497,7 @@ class Interchange:
|
|
497
497
|
tasks_inflight = len(m['tasks'])
|
498
498
|
real_capacity = m['max_capacity'] - tasks_inflight
|
499
499
|
|
500
|
-
if
|
500
|
+
if real_capacity and m["active"] and not m["draining"]:
|
501
501
|
tasks = self.get_tasks(real_capacity)
|
502
502
|
if tasks:
|
503
503
|
self.task_outgoing.send_multipart([manager_id, b'', pickle.dumps(tasks)])
|
@@ -506,19 +506,19 @@ class Interchange:
|
|
506
506
|
tids = [t['task_id'] for t in tasks]
|
507
507
|
m['tasks'].extend(tids)
|
508
508
|
m['idle_since'] = None
|
509
|
-
logger.debug("Sent tasks:
|
509
|
+
logger.debug("Sent tasks: %s to manager %r", tids, manager_id)
|
510
510
|
# recompute real_capacity after sending tasks
|
511
511
|
real_capacity = m['max_capacity'] - tasks_inflight
|
512
512
|
if real_capacity > 0:
|
513
|
-
logger.debug("Manager
|
513
|
+
logger.debug("Manager %r has free capacity %s", manager_id, real_capacity)
|
514
514
|
# ... so keep it in the interesting_managers list
|
515
515
|
else:
|
516
|
-
logger.debug("Manager
|
516
|
+
logger.debug("Manager %r is now saturated", manager_id)
|
517
517
|
interesting_managers.remove(manager_id)
|
518
518
|
else:
|
519
519
|
interesting_managers.remove(manager_id)
|
520
520
|
# logger.debug("Nothing to send to manager {}".format(manager_id))
|
521
|
-
logger.debug("leaving _ready_managers section, with
|
521
|
+
logger.debug("leaving _ready_managers section, with %s managers still interesting", len(interesting_managers))
|
522
522
|
else:
|
523
523
|
logger.debug("either no interesting managers or no tasks, so skipping manager pass")
|
524
524
|
|
@@ -528,9 +528,9 @@ class Interchange:
|
|
528
528
|
logger.debug("entering results_incoming section")
|
529
529
|
manager_id, *all_messages = self.results_incoming.recv_multipart()
|
530
530
|
if manager_id not in self._ready_managers:
|
531
|
-
logger.warning("Received a result from a un-registered manager: {!r}"
|
531
|
+
logger.warning(f"Received a result from a un-registered manager: {manager_id!r}")
|
532
532
|
else:
|
533
|
-
logger.debug(
|
533
|
+
logger.debug("Got %s result items in batch from manager %r", len(all_messages), manager_id)
|
534
534
|
|
535
535
|
b_messages = []
|
536
536
|
|
@@ -548,10 +548,10 @@ class Interchange:
|
|
548
548
|
|
549
549
|
monitoring_radio.send(r['payload'])
|
550
550
|
elif r['type'] == 'heartbeat':
|
551
|
-
logger.debug(
|
551
|
+
logger.debug("Manager %r sent heartbeat via results connection", manager_id)
|
552
552
|
b_messages.append((p_message, r))
|
553
553
|
else:
|
554
|
-
logger.error("Interchange discarding result_queue message of unknown type:
|
554
|
+
logger.error("Interchange discarding result_queue message of unknown type: %s", r["type"])
|
555
555
|
|
556
556
|
got_result = False
|
557
557
|
m = self._ready_managers[manager_id]
|
@@ -560,14 +560,16 @@ class Interchange:
|
|
560
560
|
if r['type'] == 'result':
|
561
561
|
got_result = True
|
562
562
|
try:
|
563
|
-
logger.debug(
|
563
|
+
logger.debug("Removing task %s from manager record %r", r["task_id"], manager_id)
|
564
564
|
m['tasks'].remove(r['task_id'])
|
565
565
|
except Exception:
|
566
566
|
# If we reach here, there's something very wrong.
|
567
|
-
logger.exception(
|
567
|
+
logger.exception(
|
568
|
+
"Ignoring exception removing task_id %s for manager %r with task list %s",
|
568
569
|
r['task_id'],
|
569
570
|
manager_id,
|
570
|
-
m[
|
571
|
+
m["tasks"]
|
572
|
+
)
|
571
573
|
|
572
574
|
b_messages_to_send = []
|
573
575
|
for (b_message, _) in b_messages:
|
@@ -578,7 +580,7 @@ class Interchange:
|
|
578
580
|
self.results_outgoing.send_multipart(b_messages_to_send)
|
579
581
|
logger.debug("Sent messages on results_outgoing")
|
580
582
|
|
581
|
-
logger.debug(
|
583
|
+
logger.debug("Current tasks on manager %r: %s", manager_id, m["tasks"])
|
582
584
|
if len(m['tasks']) == 0 and m['idle_since'] is None:
|
583
585
|
m['idle_since'] = time.time()
|
584
586
|
|
@@ -8,8 +8,13 @@ from parsl.executors.high_throughput.executor import (
|
|
8
8
|
GENERAL_HTEX_PARAM_DOCS,
|
9
9
|
HighThroughputExecutor,
|
10
10
|
)
|
11
|
+
from parsl.executors.high_throughput.mpi_prefix_composer import (
|
12
|
+
VALID_LAUNCHERS,
|
13
|
+
validate_resource_spec,
|
14
|
+
)
|
11
15
|
from parsl.executors.status_handling import BlockProviderExecutor
|
12
16
|
from parsl.jobs.states import JobStatus
|
17
|
+
from parsl.launchers import SimpleLauncher
|
13
18
|
from parsl.providers import LocalProvider
|
14
19
|
from parsl.providers.base import ExecutionProvider
|
15
20
|
|
@@ -30,6 +35,11 @@ class MPIExecutor(HighThroughputExecutor):
|
|
30
35
|
max_workers_per_block: int
|
31
36
|
Maximum number of MPI applications to run at once per block
|
32
37
|
|
38
|
+
mpi_launcher: str
|
39
|
+
Select one from the list of supported MPI launchers:
|
40
|
+
("srun", "aprun", "mpiexec").
|
41
|
+
default: "mpiexec"
|
42
|
+
|
33
43
|
{GENERAL_HTEX_PARAM_DOCS}
|
34
44
|
"""
|
35
45
|
|
@@ -60,7 +70,6 @@ class MPIExecutor(HighThroughputExecutor):
|
|
60
70
|
super().__init__(
|
61
71
|
# Hard-coded settings
|
62
72
|
cores_per_worker=1e-9, # Ensures there will be at least an absurd number of workers
|
63
|
-
enable_mpi_mode=True,
|
64
73
|
max_workers_per_node=max_workers_per_block,
|
65
74
|
|
66
75
|
# Everything else
|
@@ -82,9 +91,21 @@ class MPIExecutor(HighThroughputExecutor):
|
|
82
91
|
poll_period=poll_period,
|
83
92
|
address_probe_timeout=address_probe_timeout,
|
84
93
|
worker_logdir_root=worker_logdir_root,
|
85
|
-
mpi_launcher=mpi_launcher,
|
86
94
|
block_error_handler=block_error_handler,
|
87
95
|
encrypted=encrypted
|
88
96
|
)
|
97
|
+
self.enable_mpi_mode = True
|
98
|
+
self.mpi_launcher = mpi_launcher
|
89
99
|
|
90
100
|
self.max_workers_per_block = max_workers_per_block
|
101
|
+
|
102
|
+
if not isinstance(self.provider.launcher, SimpleLauncher):
|
103
|
+
raise TypeError("mpi_mode requires the provider to be configured to use a SimpleLauncher")
|
104
|
+
|
105
|
+
if mpi_launcher not in VALID_LAUNCHERS:
|
106
|
+
raise ValueError(f"mpi_launcher set to:{mpi_launcher} must be set to one of {VALID_LAUNCHERS}")
|
107
|
+
|
108
|
+
self.mpi_launcher = mpi_launcher
|
109
|
+
|
110
|
+
def validate_resource_spec(self, resource_specification: dict):
|
111
|
+
return validate_resource_spec(resource_specification)
|
@@ -21,14 +21,15 @@ class MissingResourceSpecification(Exception):
|
|
21
21
|
class InvalidResourceSpecification(Exception):
|
22
22
|
"""Exception raised when Invalid input is supplied via resource specification"""
|
23
23
|
|
24
|
-
def __init__(self, invalid_keys: Set[str]):
|
24
|
+
def __init__(self, invalid_keys: Set[str], message: str = ''):
|
25
25
|
self.invalid_keys = invalid_keys
|
26
|
+
self.message = message
|
26
27
|
|
27
28
|
def __str__(self):
|
28
|
-
return f"Invalid resource specification options supplied: {self.invalid_keys}"
|
29
|
+
return f"Invalid resource specification options supplied: {self.invalid_keys} {self.message}"
|
29
30
|
|
30
31
|
|
31
|
-
def validate_resource_spec(resource_spec: Dict[str, str]
|
32
|
+
def validate_resource_spec(resource_spec: Dict[str, str]):
|
32
33
|
"""Basic validation of keys in the resource_spec
|
33
34
|
|
34
35
|
Raises: InvalidResourceSpecification if the resource_spec
|
@@ -38,7 +39,7 @@ def validate_resource_spec(resource_spec: Dict[str, str], is_mpi_enabled: bool):
|
|
38
39
|
|
39
40
|
# empty resource_spec when mpi_mode is set causes parsl to hang
|
40
41
|
# ref issue #3427
|
41
|
-
if
|
42
|
+
if len(user_keys) == 0:
|
42
43
|
raise MissingResourceSpecification('MPI mode requires optional parsl_resource_specification keyword argument to be configured')
|
43
44
|
|
44
45
|
legal_keys = set(("ranks_per_node",
|
@@ -347,7 +347,10 @@ class BlockProviderExecutor(ParslExecutor):
|
|
347
347
|
if block_ids is not None:
|
348
348
|
new_status = {}
|
349
349
|
for block_id in block_ids:
|
350
|
-
|
351
|
-
|
350
|
+
logger.debug("Marking block %s as SCALED_IN", block_id)
|
351
|
+
s = JobStatus(JobState.SCALED_IN)
|
352
|
+
new_status[block_id] = s
|
353
|
+
self._status[block_id] = s
|
354
|
+
self._simulated_status[block_id] = s
|
352
355
|
self.send_monitoring_info(new_status)
|
353
356
|
return block_ids
|
@@ -46,12 +46,17 @@ class JobState(IntEnum):
|
|
46
46
|
bad worker environment or network connectivity issues.
|
47
47
|
"""
|
48
48
|
|
49
|
+
SCALED_IN = 9
|
50
|
+
"""This job has been deliberately scaled in. Scaling code should not be concerned
|
51
|
+
that the job never ran (for example for error handling purposes).
|
52
|
+
"""
|
53
|
+
|
49
54
|
def __str__(self) -> str:
|
50
55
|
return f"{self.__class__.__name__}.{self.name}"
|
51
56
|
|
52
57
|
|
53
58
|
TERMINAL_STATES = [JobState.CANCELLED, JobState.COMPLETED, JobState.FAILED,
|
54
|
-
JobState.TIMEOUT, JobState.MISSING]
|
59
|
+
JobState.TIMEOUT, JobState.MISSING, JobState.SCALED_IN]
|
55
60
|
|
56
61
|
|
57
62
|
class JobStatus:
|