parsl 2024.4.15__tar.gz → 2024.4.22__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.4.15/parsl.egg-info → parsl-2024.4.22}/PKG-INFO +2 -2
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/addresses.py +2 -2
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/app/bash.py +10 -2
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/app/errors.py +3 -5
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/dataflow/dflow.py +70 -40
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/dataflow/futures.py +26 -5
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/base.py +16 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/taskvine/executor.py +6 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/workqueue/executor.py +6 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/monitoring.py +15 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_bash_apps/test_basic.py +2 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_checkpointing/test_task_exit.py +1 -1
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_htex/test_zmq_binding.py +1 -0
- parsl-2024.4.22/parsl/tests/test_monitoring/test_stdouterr.py +137 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_context_manager.py +3 -3
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_scaling/test_regression_1621.py +11 -11
- parsl-2024.4.22/parsl/tests/test_staging/test_staging_stdout.py +61 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/utils.py +11 -2
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/version.py +1 -1
- {parsl-2024.4.15 → parsl-2024.4.22/parsl.egg-info}/PKG-INFO +2 -2
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl.egg-info/SOURCES.txt +2 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl.egg-info/requires.txt +2 -2
- {parsl-2024.4.15 → parsl-2024.4.22}/setup.py +1 -1
- {parsl-2024.4.15 → parsl-2024.4.22}/LICENSE +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/MANIFEST.in +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/README.rst +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/app/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/app/app.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/app/futures.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/app/python.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/benchmark/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/benchmark/perf.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/channels/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/channels/base.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/channels/errors.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/channels/local/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/channels/local/local.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/channels/oauth_ssh/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/channels/oauth_ssh/oauth_ssh.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/channels/ssh/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/channels/ssh/ssh.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/channels/ssh_il/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/channels/ssh_il/ssh_il.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/concurrent/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/config.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/ASPIRE1.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/Azure.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/ad_hoc.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/bridges.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/cc_in2p3.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/ec2.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/expanse.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/frontera.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/htex_local.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/illinoiscluster.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/kubernetes.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/local_threads.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/midway.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/osg.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/polaris.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/stampede2.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/summit.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/toss3_llnl.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/vineex_local.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/configs/wqex_local.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/curvezmq.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/data_provider/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/data_provider/data_manager.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/data_provider/file_noop.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/data_provider/files.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/data_provider/ftp.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/data_provider/globus.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/data_provider/http.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/data_provider/rsync.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/data_provider/staging.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/data_provider/zip.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/dataflow/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/dataflow/errors.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/dataflow/memoization.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/dataflow/rundirs.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/dataflow/states.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/dataflow/taskrecord.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/errors.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/errors.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/flux/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/flux/execute_parsl_task.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/flux/executor.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/flux/flux_instance_manager.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/high_throughput/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/high_throughput/errors.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/high_throughput/executor.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/high_throughput/interchange.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/high_throughput/manager_record.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/high_throughput/monitoring_info.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/high_throughput/probe.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/radical/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/radical/executor.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/radical/rpex_master.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/radical/rpex_resources.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/radical/rpex_worker.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/status_handling.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/taskvine/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/taskvine/errors.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/taskvine/factory.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/taskvine/factory_config.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/taskvine/manager.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/taskvine/manager_config.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/taskvine/utils.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/threads.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/workqueue/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/workqueue/errors.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/jobs/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/jobs/error_handlers.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/jobs/errors.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/jobs/job_status_poller.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/jobs/states.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/jobs/strategy.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/launchers/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/launchers/base.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/launchers/errors.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/launchers/launchers.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/log_utils.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/db_manager.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/message_type.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/queries/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/queries/pandas.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/radios.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/remote.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/router.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/types.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/app.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/models.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/plots/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/templates/app.html +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/templates/dag.html +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/templates/error.html +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/templates/layout.html +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/templates/task.html +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/templates/workflow.html +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/utils.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/version.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/monitoring/visualization/views.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/multiprocessing.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/process_loggers.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/ad_hoc/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/aws/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/aws/aws.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/aws/template.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/azure/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/azure/azure.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/azure/template.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/base.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/cluster_provider.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/cobalt/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/cobalt/cobalt.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/cobalt/template.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/condor/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/condor/condor.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/condor/template.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/errors.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/googlecloud/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/googlecloud/googlecloud.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/grid_engine/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/grid_engine/grid_engine.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/grid_engine/template.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/kubernetes/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/kubernetes/kube.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/kubernetes/template.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/local/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/local/local.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/lsf/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/lsf/lsf.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/lsf/template.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/pbspro/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/pbspro/pbspro.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/pbspro/template.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/slurm/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/slurm/slurm.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/slurm/template.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/torque/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/torque/template.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/providers/torque/torque.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/py.typed +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/serialize/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/serialize/base.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/serialize/concretes.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/serialize/errors.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/serialize/facade.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/serialize/proxystore.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/callables_helper.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/ad_hoc_cluster_htex.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/azure_single_node.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/bluewaters.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/bridges.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/cc_in2p3.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/comet.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/cooley_htex.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/ec2_single_node.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/ec2_spot.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/frontera.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/htex_ad_hoc_cluster.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/htex_local.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/htex_local_alternate.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/local_adhoc.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/local_radical.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/local_radical_mpi.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/local_threads.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/local_threads_globus.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/local_threads_monitoring.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/local_threads_no_cache.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/midway.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/nscc_singapore.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/osg_htex.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/petrelkube.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/summit.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/swan_htex.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/taskvine_ex.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/theta.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/user_opts.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/configs/workqueue_ex.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/conftest.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/integration/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/integration/latency.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/integration/test_apps/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/integration/test_channels/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/integration/test_channels/test_channels.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/integration/test_channels/test_scp_1.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/integration/test_channels/test_ssh_1.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/integration/test_channels/test_ssh_errors.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/integration/test_stress/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/manual_tests/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/manual_tests/htex_local.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/manual_tests/test_ad_hoc_htex.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/manual_tests/test_basic.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/manual_tests/test_log_filter.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/manual_tests/test_oauth_ssh.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/manual_tests/test_regression_220.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/manual_tests/test_worker_count.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/scaling_tests/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/scaling_tests/htex_local.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/scaling_tests/local_threads.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/scaling_tests/test_scale.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/scaling_tests/vineex_local.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/scaling_tests/wqex_local.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/site_tests/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/site_tests/site_config_selector.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/site_tests/test_provider.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/site_tests/test_site.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/sites/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/sites/test_affinity.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/sites/test_concurrent.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/sites/test_dynamic_executor.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/sites/test_ec2.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/sites/test_launchers.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/sites/test_local_adhoc.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/sites/test_mpi/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/sites/test_worker_info.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_aalst_patterns.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_bash_apps/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_callables.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_channels/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_channels/test_large_output.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_checkpointing/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_curvezmq.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_docs/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_docs/test_from_slides.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_docs/test_kwargs.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_docs/test_workflow1.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_docs/test_workflow2.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_docs/test_workflow4.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_error_handling/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_error_handling/test_fail.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_error_handling/test_retries.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_flowcontrol/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_flux.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_htex/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_htex/test_basic.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_htex/test_drain.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_htex/test_htex.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_htex/test_manager_failure.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_htex/test_missing_worker.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_htex/test_worker_failure.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_monitoring/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_monitoring/test_app_names.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_monitoring/test_basic.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_mpi_apps/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_providers/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_providers/test_cobalt_deprecation_warning.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_providers/test_local_provider.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_providers/test_slurm_template.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_basic.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_fail.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_futures.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_join.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_lifted.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_mapred.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_outputs.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_overview.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_simple.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_timeout.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_python_apps/test_type5.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_radical/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_regression/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_regression/test_1480.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_regression/test_1653.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_regression/test_221.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_regression/test_226.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_regression/test_2652.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_regression/test_69a.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_regression/test_854.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_regression/test_98.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_scaling/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_scaling/test_scale_down.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_serialization/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_serialization/test_basic.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_shutdown/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_staging/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_staging/staging_provider.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_staging/test_1316.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_staging/test_docs_1.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_staging/test_docs_2.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_staging/test_file.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_staging/test_file_apps.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_staging/test_file_staging.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_staging/test_staging_globus.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_staging/test_staging_https.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_staging/test_zip_out.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_summary.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_thread_parallelism.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_threads/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_threads/test_configs.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_utils/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/tests/utils.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/usage_tracking/__init__.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl/usage_tracking/usage.py +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl.egg-info/dependency_links.txt +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl.egg-info/entry_points.txt +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/parsl.egg-info/top_level.txt +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/requirements.txt +0 -0
- {parsl-2024.4.15 → parsl-2024.4.22}/setup.cfg +0 -0
@@ -1,9 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: parsl
|
3
|
-
Version: 2024.4.
|
3
|
+
Version: 2024.4.22
|
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.04.
|
6
|
+
Download-URL: https://github.com/Parsl/parsl/archive/2024.04.22.tar.gz
|
7
7
|
Author: The Parsl Team
|
8
8
|
Author-email: parsl@googlegroups.com
|
9
9
|
License: Apache 2.0
|
@@ -113,7 +113,7 @@ def get_all_addresses() -> Set[str]:
|
|
113
113
|
try:
|
114
114
|
s_addresses.add(address_by_interface(interface))
|
115
115
|
except Exception:
|
116
|
-
logger.
|
116
|
+
logger.debug("Ignoring failure to fetch address from interface {}".format(interface))
|
117
117
|
|
118
118
|
resolution_functions: List[Callable[[], str]]
|
119
119
|
resolution_functions = [address_by_hostname, address_by_route, address_by_query]
|
@@ -121,7 +121,7 @@ def get_all_addresses() -> Set[str]:
|
|
121
121
|
try:
|
122
122
|
s_addresses.add(f())
|
123
123
|
except Exception:
|
124
|
-
logger.
|
124
|
+
logger.debug("Ignoring an address finder exception")
|
125
125
|
|
126
126
|
return s_addresses
|
127
127
|
|
@@ -5,6 +5,7 @@ import logging
|
|
5
5
|
|
6
6
|
from parsl.app.errors import wrap_error
|
7
7
|
from parsl.app.app import AppBase
|
8
|
+
from parsl.data_provider.files import File
|
8
9
|
from parsl.dataflow.dflow import DataFlowKernelLoader
|
9
10
|
|
10
11
|
logger = logging.getLogger(__name__)
|
@@ -54,13 +55,20 @@ def remote_side_bash_executor(func, *args, **kwargs):
|
|
54
55
|
if stdfspec is None:
|
55
56
|
return None
|
56
57
|
|
57
|
-
|
58
|
+
if isinstance(stdfspec, File):
|
59
|
+
# a File is an os.PathLike and so we can use it directly for
|
60
|
+
# the subsequent file operations
|
61
|
+
fname = stdfspec
|
62
|
+
mode = "w"
|
63
|
+
else:
|
64
|
+
fname, mode = get_std_fname_mode(fdname, stdfspec)
|
65
|
+
|
58
66
|
try:
|
59
67
|
if os.path.dirname(fname):
|
60
68
|
os.makedirs(os.path.dirname(fname), exist_ok=True)
|
61
69
|
fd = open(fname, mode)
|
62
70
|
except Exception as e:
|
63
|
-
raise pe.BadStdStreamFile(fname
|
71
|
+
raise pe.BadStdStreamFile(str(fname)) from e
|
64
72
|
return fd
|
65
73
|
|
66
74
|
std_out = open_std_fd('stdout')
|
@@ -78,16 +78,14 @@ class BadStdStreamFile(ParslError):
|
|
78
78
|
|
79
79
|
Contains:
|
80
80
|
reason(string)
|
81
|
-
exception object
|
82
81
|
"""
|
83
82
|
|
84
|
-
def __init__(self, reason: str
|
85
|
-
super().__init__(reason
|
83
|
+
def __init__(self, reason: str) -> None:
|
84
|
+
super().__init__(reason)
|
86
85
|
self._reason = reason
|
87
|
-
self._exception = exception
|
88
86
|
|
89
87
|
def __repr__(self) -> str:
|
90
|
-
return "Bad Stream File: {}
|
88
|
+
return "Bad Stream File: {}".format(self._reason)
|
91
89
|
|
92
90
|
def __str__(self) -> str:
|
93
91
|
return self.__repr__()
|
@@ -219,14 +219,18 @@ class DataFlowKernel:
|
|
219
219
|
task_log_info = self._create_task_log_info(task_record)
|
220
220
|
self.monitoring.send(MessageType.TASK_INFO, task_log_info)
|
221
221
|
|
222
|
-
def _create_task_log_info(self, task_record):
|
222
|
+
def _create_task_log_info(self, task_record: TaskRecord) -> Dict[str, Any]:
|
223
223
|
"""
|
224
224
|
Create the dictionary that will be included in the log.
|
225
225
|
"""
|
226
226
|
info_to_monitor = ['func_name', 'memoize', 'hashsum', 'fail_count', 'fail_cost', 'status',
|
227
227
|
'id', 'time_invoked', 'try_time_launched', 'time_returned', 'try_time_returned', 'executor']
|
228
228
|
|
229
|
-
|
229
|
+
# mypy cannot verify that these task_record[k] references are valid:
|
230
|
+
# They are valid if all entries in info_to_monitor are declared in the definition of TaskRecord
|
231
|
+
# This type: ignore[literal-required] asserts that fact.
|
232
|
+
task_log_info = {"task_" + k: task_record[k] for k in info_to_monitor} # type: ignore[literal-required]
|
233
|
+
|
230
234
|
task_log_info['run_id'] = self.run_id
|
231
235
|
task_log_info['try_id'] = task_record['try_id']
|
232
236
|
task_log_info['timestamp'] = datetime.datetime.now()
|
@@ -238,33 +242,28 @@ class DataFlowKernel:
|
|
238
242
|
task_log_info['task_inputs'] = str(task_record['kwargs'].get('inputs', None))
|
239
243
|
task_log_info['task_outputs'] = str(task_record['kwargs'].get('outputs', None))
|
240
244
|
task_log_info['task_stdin'] = task_record['kwargs'].get('stdin', None)
|
241
|
-
stdout_spec = task_record['kwargs'].get('stdout', None)
|
242
|
-
stderr_spec = task_record['kwargs'].get('stderr', None)
|
243
245
|
|
244
|
-
|
245
|
-
|
246
|
-
|
246
|
+
def std_spec_to_name(name, spec):
|
247
|
+
if spec is None:
|
248
|
+
name = ""
|
249
|
+
elif isinstance(spec, File):
|
250
|
+
name = spec.url
|
251
|
+
else:
|
252
|
+
# fallthrough case is various str, os.PathLike, tuple modes that
|
253
|
+
# can be interpreted by get_std_fname_mode.
|
254
|
+
try:
|
255
|
+
name, _ = get_std_fname_mode(name, spec)
|
256
|
+
except Exception:
|
257
|
+
logger.exception(f"Could not parse {name} specification {spec} for task {task_record['id']}")
|
258
|
+
name = ""
|
259
|
+
return name
|
247
260
|
|
248
|
-
|
249
|
-
|
250
|
-
stdout_name, _ = get_std_fname_mode('stdout', stdout_spec)
|
251
|
-
except Exception:
|
252
|
-
logger.exception("Could not parse stdout specification {} for task {}".format(stdout_spec, task_record['id']))
|
253
|
-
stdout_name = ""
|
254
|
-
else:
|
255
|
-
stdout_name = ""
|
261
|
+
stdout_spec = task_record['kwargs'].get('stdout')
|
262
|
+
task_log_info['task_stdout'] = std_spec_to_name('stdout', stdout_spec)
|
256
263
|
|
257
|
-
|
258
|
-
|
259
|
-
stderr_name, _ = get_std_fname_mode('stderr', stderr_spec)
|
260
|
-
except Exception:
|
261
|
-
logger.exception("Could not parse stderr specification {} for task {}".format(stderr_spec, task_record['id']))
|
262
|
-
stderr_name = ""
|
263
|
-
else:
|
264
|
-
stderr_name = ""
|
264
|
+
stderr_spec = task_record['kwargs'].get('stderr')
|
265
|
+
task_log_info['task_stderr'] = std_spec_to_name('stderr', stderr_spec)
|
265
266
|
|
266
|
-
task_log_info['task_stdout'] = stdout_name
|
267
|
-
task_log_info['task_stderr'] = stderr_name
|
268
267
|
task_log_info['task_fail_history'] = ",".join(task_record['fail_history'])
|
269
268
|
task_log_info['task_depends'] = None
|
270
269
|
if task_record['depends'] is not None:
|
@@ -774,6 +773,10 @@ class DataFlowKernel:
|
|
774
773
|
(inputs[idx], func) = self.data_manager.optionally_stage_in(f, func, executor)
|
775
774
|
|
776
775
|
for kwarg, f in kwargs.items():
|
776
|
+
# stdout and stderr files should not be staging in (they will be staged *out*
|
777
|
+
# in _add_output_deps)
|
778
|
+
if kwarg in ['stdout', 'stderr']:
|
779
|
+
continue
|
777
780
|
(kwargs[kwarg], func) = self.data_manager.optionally_stage_in(f, func, executor)
|
778
781
|
|
779
782
|
newargs = list(args)
|
@@ -786,33 +789,56 @@ class DataFlowKernel:
|
|
786
789
|
logger.debug("Adding output dependencies")
|
787
790
|
outputs = kwargs.get('outputs', [])
|
788
791
|
app_fut._outputs = []
|
789
|
-
|
790
|
-
|
792
|
+
|
793
|
+
# Pass over all possible outputs: the outputs kwarg, stdout and stderr
|
794
|
+
# and for each of those, perform possible stage-out. This can result in:
|
795
|
+
# a DataFuture to be exposed in app_fut to represent the completion of
|
796
|
+
# that stageout (sometimes backed by a new sub-workflow for separate-task
|
797
|
+
# stageout), a replacement for the function to be executed (intended to
|
798
|
+
# be the original function wrapped with an in-task stageout wrapper), a
|
799
|
+
# rewritten File object to be passed to task to be executed
|
800
|
+
|
801
|
+
@typechecked
|
802
|
+
def stageout_one_file(file: File, rewritable_func: Callable):
|
803
|
+
if not self.check_staging_inhibited(kwargs):
|
791
804
|
# replace a File with a DataFuture - either completing when the stageout
|
792
805
|
# future completes, or if no stage out future is returned, then when the
|
793
806
|
# app itself completes.
|
794
807
|
|
795
808
|
# The staging code will get a clean copy which it is allowed to mutate,
|
796
809
|
# while the DataFuture-contained original will not be modified by any staging.
|
797
|
-
f_copy =
|
798
|
-
outputs[idx] = f_copy
|
810
|
+
f_copy = file.cleancopy()
|
799
811
|
|
800
|
-
logger.debug("Submitting stage out for output file {}".format(repr(
|
812
|
+
logger.debug("Submitting stage out for output file {}".format(repr(file)))
|
801
813
|
stageout_fut = self.data_manager.stage_out(f_copy, executor, app_fut)
|
802
814
|
if stageout_fut:
|
803
|
-
logger.debug("Adding a dependency on stageout future for {}".format(repr(
|
804
|
-
|
815
|
+
logger.debug("Adding a dependency on stageout future for {}".format(repr(file)))
|
816
|
+
df = DataFuture(stageout_fut, file, tid=app_fut.tid)
|
805
817
|
else:
|
806
|
-
logger.debug("No stageout dependency for {}".format(repr(
|
807
|
-
|
818
|
+
logger.debug("No stageout dependency for {}".format(repr(file)))
|
819
|
+
df = DataFuture(app_fut, file, tid=app_fut.tid)
|
808
820
|
|
809
821
|
# this is a hook for post-task stageout
|
810
822
|
# note that nothing depends on the output - which is maybe a bug
|
811
823
|
# in the not-very-tested stageout system?
|
812
|
-
|
824
|
+
rewritable_func = self.data_manager.replace_task_stage_out(f_copy, rewritable_func, executor)
|
825
|
+
return rewritable_func, f_copy, df
|
813
826
|
else:
|
814
|
-
logger.debug("Not performing output staging for: {}".format(repr(
|
815
|
-
|
827
|
+
logger.debug("Not performing output staging for: {}".format(repr(file)))
|
828
|
+
return rewritable_func, file, DataFuture(app_fut, file, tid=app_fut.tid)
|
829
|
+
|
830
|
+
for idx, file in enumerate(outputs):
|
831
|
+
func, outputs[idx], o = stageout_one_file(file, func)
|
832
|
+
app_fut._outputs.append(o)
|
833
|
+
|
834
|
+
file = kwargs.get('stdout')
|
835
|
+
if isinstance(file, File):
|
836
|
+
func, kwargs['stdout'], app_fut._stdout_future = stageout_one_file(file, func)
|
837
|
+
|
838
|
+
file = kwargs.get('stderr')
|
839
|
+
if isinstance(file, File):
|
840
|
+
func, kwargs['stderr'], app_fut._stderr_future = stageout_one_file(file, func)
|
841
|
+
|
816
842
|
return func
|
817
843
|
|
818
844
|
def _gather_all_deps(self, args: Sequence[Any], kwargs: Dict[str, Any]) -> List[Future]:
|
@@ -1140,8 +1166,6 @@ class DataFlowKernel:
|
|
1140
1166
|
executor.hub_port = self.hub_zmq_port
|
1141
1167
|
if self.monitoring:
|
1142
1168
|
executor.monitoring_radio = self.monitoring.radio
|
1143
|
-
else:
|
1144
|
-
executor.monitoring_radio = None
|
1145
1169
|
if hasattr(executor, 'provider'):
|
1146
1170
|
if hasattr(executor.provider, 'script_dir'):
|
1147
1171
|
executor.provider.script_dir = os.path.join(self.run_dir, 'submit_scripts')
|
@@ -1402,8 +1426,14 @@ class DataFlowKernel:
|
|
1402
1426
|
logger.info(f"{name} for task {tid} will not be redirected.")
|
1403
1427
|
elif isinstance(target, str):
|
1404
1428
|
logger.info(f"{name} for task {tid} will be redirected to {target}")
|
1405
|
-
elif isinstance(target,
|
1429
|
+
elif isinstance(target, os.PathLike):
|
1430
|
+
logger.info(f"{name} for task {tid} will be redirected to {os.fspath(target)}")
|
1431
|
+
elif isinstance(target, tuple) and len(target) == 2 and isinstance(target[0], str):
|
1406
1432
|
logger.info(f"{name} for task {tid} will be redirected to {target[0]} with mode {target[1]}")
|
1433
|
+
elif isinstance(target, tuple) and len(target) == 2 and isinstance(target[0], os.PathLike):
|
1434
|
+
logger.info(f"{name} for task {tid} will be redirected to {os.fspath(target[0])} with mode {target[1]}")
|
1435
|
+
elif isinstance(target, DataFuture):
|
1436
|
+
logger.info(f"{name} for task {tid} will staged to {target.file_obj.url}")
|
1407
1437
|
else:
|
1408
1438
|
logger.error(f"{name} for task {tid} has unknown specification: {target!r}")
|
1409
1439
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
3
3
|
from concurrent.futures import Future
|
4
4
|
import logging
|
5
5
|
import threading
|
6
|
-
from typing import Any, Optional, Sequence
|
6
|
+
from typing import Any, Optional, Sequence, Union
|
7
7
|
|
8
8
|
import parsl.app.app as app
|
9
9
|
|
@@ -70,13 +70,34 @@ class AppFuture(Future):
|
|
70
70
|
self._outputs = []
|
71
71
|
self.task_record = task_record
|
72
72
|
|
73
|
+
self._stdout_future: Optional[DataFuture] = None
|
74
|
+
self._stderr_future: Optional[DataFuture] = None
|
75
|
+
|
73
76
|
@property
|
74
|
-
def stdout(self) ->
|
75
|
-
|
77
|
+
def stdout(self) -> Union[None, str, DataFuture]:
|
78
|
+
"""Return app stdout. If stdout was specified as a string, then this
|
79
|
+
property will return that string. If stdout was specified as a File,
|
80
|
+
then this property will return a DataFuture representing that file
|
81
|
+
stageout.
|
82
|
+
TODO: this can be a tuple too I think?"""
|
83
|
+
if self._stdout_future:
|
84
|
+
return self._stdout_future
|
85
|
+
else:
|
86
|
+
# this covers the str and None cases
|
87
|
+
return self.task_record['kwargs'].get('stdout')
|
76
88
|
|
77
89
|
@property
|
78
|
-
def stderr(self) ->
|
79
|
-
|
90
|
+
def stderr(self) -> Union[None, str, DataFuture]:
|
91
|
+
"""Return app stderr. If stdout was specified as a string, then this
|
92
|
+
property will return that string. If stdout was specified as a File,
|
93
|
+
then this property will return a DataFuture representing that file
|
94
|
+
stageout.
|
95
|
+
TODO: this can be a tuple too I think?"""
|
96
|
+
if self._stderr_future:
|
97
|
+
return self._stderr_future
|
98
|
+
else:
|
99
|
+
# this covers the str and None cases
|
100
|
+
return self.task_record['kwargs'].get('stderr')
|
80
101
|
|
81
102
|
@property
|
82
103
|
def tid(self) -> int:
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import os
|
1
2
|
from abc import ABCMeta, abstractmethod
|
2
3
|
from concurrent.futures import Future
|
3
4
|
from typing import Any, Callable, Dict, Optional
|
@@ -45,6 +46,21 @@ class ParslExecutor(metaclass=ABCMeta):
|
|
45
46
|
label: str = "undefined"
|
46
47
|
radio_mode: str = "udp"
|
47
48
|
|
49
|
+
def __init__(
|
50
|
+
self,
|
51
|
+
*,
|
52
|
+
hub_address: Optional[str] = None,
|
53
|
+
hub_port: Optional[int] = None,
|
54
|
+
monitoring_radio: Optional[MonitoringRadio] = None,
|
55
|
+
run_dir: str = ".",
|
56
|
+
run_id: Optional[str] = None,
|
57
|
+
):
|
58
|
+
self.hub_address = hub_address
|
59
|
+
self.hub_port = hub_port
|
60
|
+
self.monitoring_radio = monitoring_radio
|
61
|
+
self.run_dir = os.path.abspath(run_dir)
|
62
|
+
self.run_id = run_id
|
63
|
+
|
48
64
|
def __enter__(self) -> Self:
|
49
65
|
return self
|
50
66
|
|
@@ -644,6 +644,12 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
644
644
|
logger.debug("Joining on factory process")
|
645
645
|
self._factory_process.join()
|
646
646
|
|
647
|
+
# Shutdown multiprocessing queues
|
648
|
+
self._ready_task_queue.close()
|
649
|
+
self._ready_task_queue.join_thread()
|
650
|
+
self._finished_task_queue.close()
|
651
|
+
self._finished_task_queue.join_thread()
|
652
|
+
|
647
653
|
self._is_shutdown = True
|
648
654
|
logger.debug("TaskVine shutdown completed")
|
649
655
|
|
@@ -735,6 +735,12 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
735
735
|
logger.debug("Joining on collector thread")
|
736
736
|
self.collector_thread.join()
|
737
737
|
|
738
|
+
logger.debug("Closing multiprocessing queues")
|
739
|
+
self.task_queue.close()
|
740
|
+
self.task_queue.join_thread()
|
741
|
+
self.collector_queue.close()
|
742
|
+
self.collector_queue.join_thread()
|
743
|
+
|
738
744
|
self.is_shutdown = True
|
739
745
|
logger.debug("Work Queue shutdown completed")
|
740
746
|
|
@@ -195,6 +195,8 @@ class MonitoringHub(RepresentationMixin):
|
|
195
195
|
|
196
196
|
try:
|
197
197
|
comm_q_result = comm_q.get(block=True, timeout=120)
|
198
|
+
comm_q.close()
|
199
|
+
comm_q.join_thread()
|
198
200
|
except queue.Empty:
|
199
201
|
logger.error("Hub has not completed initialization in 120s. Aborting")
|
200
202
|
raise Exception("Hub failed to start")
|
@@ -258,6 +260,19 @@ class MonitoringHub(RepresentationMixin):
|
|
258
260
|
self.filesystem_proc.terminate()
|
259
261
|
self.filesystem_proc.join()
|
260
262
|
|
263
|
+
logger.info("Closing monitoring multiprocessing queues")
|
264
|
+
self.exception_q.close()
|
265
|
+
self.exception_q.join_thread()
|
266
|
+
self.priority_msgs.close()
|
267
|
+
self.priority_msgs.join_thread()
|
268
|
+
self.resource_msgs.close()
|
269
|
+
self.resource_msgs.join_thread()
|
270
|
+
self.node_msgs.close()
|
271
|
+
self.node_msgs.join_thread()
|
272
|
+
self.block_msgs.close()
|
273
|
+
self.block_msgs.join_thread()
|
274
|
+
logger.info("Closed monitoring multiprocessing queues")
|
275
|
+
|
261
276
|
|
262
277
|
@wrap_with_logs
|
263
278
|
def filesystem_receiver(logdir: str, q: "queue.Queue[AddressedMonitoringMessage]", run_dir: str) -> None:
|
@@ -50,6 +50,8 @@ def test_auto_log_filename_format(caplog):
|
|
50
50
|
foo_future.result())
|
51
51
|
|
52
52
|
log_fpath = foo_future.stdout
|
53
|
+
assert isinstance(log_fpath, str)
|
54
|
+
|
53
55
|
log_pattern = fr".*/task_\d+_foo_{app_label}"
|
54
56
|
assert re.match(log_pattern, log_fpath), 'Output file "{0}" does not match pattern "{1}"'.format(
|
55
57
|
log_fpath, log_pattern)
|
@@ -53,6 +53,7 @@ def test_interchange_binding_with_address(cert_dir: Optional[str]):
|
|
53
53
|
assert ix.interchange_address == address
|
54
54
|
|
55
55
|
|
56
|
+
@pytest.mark.skip("This behaviour is possibly unexpected. See issue #3037")
|
56
57
|
@pytest.mark.local
|
57
58
|
@pytest.mark.parametrize("encrypted", (True, False), indirect=True)
|
58
59
|
def test_interchange_binding_with_non_ipv4_address(cert_dir: Optional[str]):
|
@@ -0,0 +1,137 @@
|
|
1
|
+
"""Tests monitoring records app name under various decoration patterns.
|
2
|
+
"""
|
3
|
+
|
4
|
+
import logging
|
5
|
+
import os
|
6
|
+
import parsl
|
7
|
+
import pytest
|
8
|
+
import re
|
9
|
+
import time
|
10
|
+
|
11
|
+
from typing import Union
|
12
|
+
|
13
|
+
from parsl.config import Config
|
14
|
+
from parsl.data_provider.files import File
|
15
|
+
from parsl.data_provider.data_manager import default_staging
|
16
|
+
from parsl.data_provider.staging import Staging
|
17
|
+
from parsl.executors import HighThroughputExecutor
|
18
|
+
from parsl.monitoring import MonitoringHub
|
19
|
+
from parsl.providers import LocalProvider
|
20
|
+
|
21
|
+
|
22
|
+
def fresh_config(run_dir):
|
23
|
+
return Config(
|
24
|
+
run_dir=str(run_dir),
|
25
|
+
executors=[
|
26
|
+
HighThroughputExecutor(
|
27
|
+
address="127.0.0.1",
|
28
|
+
label="htex_Local",
|
29
|
+
provider=LocalProvider(
|
30
|
+
init_blocks=1,
|
31
|
+
min_blocks=1,
|
32
|
+
max_blocks=1,
|
33
|
+
)
|
34
|
+
)
|
35
|
+
],
|
36
|
+
strategy='simple',
|
37
|
+
strategy_period=0.1,
|
38
|
+
monitoring=MonitoringHub(
|
39
|
+
hub_address="localhost",
|
40
|
+
hub_port=55055,
|
41
|
+
)
|
42
|
+
)
|
43
|
+
|
44
|
+
|
45
|
+
@parsl.python_app
|
46
|
+
def stdapp(stdout=None, stderr=None):
|
47
|
+
pass
|
48
|
+
|
49
|
+
|
50
|
+
class ArbitraryPathLike(os.PathLike):
|
51
|
+
def __init__(self, path: Union[str, bytes]) -> None:
|
52
|
+
self.path = path
|
53
|
+
|
54
|
+
def __fspath__(self) -> Union[str, bytes]:
|
55
|
+
return self.path
|
56
|
+
|
57
|
+
|
58
|
+
class ArbitraryStaging(Staging):
|
59
|
+
"""This staging provider will not actually do any staging, but will
|
60
|
+
accept arbitrary: scheme URLs. That's enough for this monitoring test
|
61
|
+
which doesn't need any actual stage out action to happen.
|
62
|
+
"""
|
63
|
+
def can_stage_out(self, file):
|
64
|
+
return file.scheme == "arbitrary"
|
65
|
+
|
66
|
+
|
67
|
+
@pytest.mark.local
|
68
|
+
@pytest.mark.parametrize('stdx,expected_stdx',
|
69
|
+
[('hello.txt', 'hello.txt'),
|
70
|
+
(None, ''),
|
71
|
+
(('tuple.txt', 'w'), 'tuple.txt'),
|
72
|
+
(ArbitraryPathLike('pl.txt'), 'pl.txt'),
|
73
|
+
(ArbitraryPathLike(b'pl2.txt'), 'pl2.txt'),
|
74
|
+
((ArbitraryPathLike('pl3.txt'), 'w'), 'pl3.txt'),
|
75
|
+
((ArbitraryPathLike(b'pl4.txt'), 'w'), 'pl4.txt'),
|
76
|
+
(parsl.AUTO_LOGNAME,
|
77
|
+
lambda p:
|
78
|
+
isinstance(p, str) and
|
79
|
+
os.path.isabs(p) and
|
80
|
+
re.match("^.*/task_0000_stdapp\\.std...$", p)),
|
81
|
+
(File("arbitrary:abc123"), "arbitrary:abc123"),
|
82
|
+
(File("file:///tmp/pl5"), "file:///tmp/pl5"),
|
83
|
+
])
|
84
|
+
@pytest.mark.parametrize('stream', ['stdout', 'stderr'])
|
85
|
+
def test_stdstream_to_monitoring(stdx, expected_stdx, stream, tmpd_cwd, caplog):
|
86
|
+
"""This tests that various forms of stdout/err specification are
|
87
|
+
represented in monitoring correctly. The stderr and stdout codepaths
|
88
|
+
are generally duplicated, rather than factorised, and so this test
|
89
|
+
runs the same tests on both stdout and stderr.
|
90
|
+
"""
|
91
|
+
|
92
|
+
# this is imported here rather than at module level because
|
93
|
+
# it isn't available in a plain parsl install, so this module
|
94
|
+
# would otherwise fail to import and break even a basic test
|
95
|
+
# run.
|
96
|
+
import sqlalchemy
|
97
|
+
|
98
|
+
c = fresh_config(tmpd_cwd)
|
99
|
+
c.monitoring.logging_endpoint = f"sqlite:///{tmpd_cwd}/monitoring.db"
|
100
|
+
c.executors[0].storage_access = default_staging + [ArbitraryStaging()]
|
101
|
+
|
102
|
+
with parsl.load(c):
|
103
|
+
kwargs = {stream: stdx}
|
104
|
+
stdapp(**kwargs).result()
|
105
|
+
|
106
|
+
parsl.clear()
|
107
|
+
|
108
|
+
engine = sqlalchemy.create_engine(c.monitoring.logging_endpoint)
|
109
|
+
with engine.begin() as connection:
|
110
|
+
|
111
|
+
def count_rows(table: str):
|
112
|
+
result = connection.execute(f"SELECT COUNT(*) FROM {table}")
|
113
|
+
(c, ) = result.first()
|
114
|
+
return c
|
115
|
+
|
116
|
+
# one workflow...
|
117
|
+
assert count_rows("workflow") == 1
|
118
|
+
|
119
|
+
# ... with one task ...
|
120
|
+
assert count_rows("task") == 1
|
121
|
+
|
122
|
+
# ... that was tried once ...
|
123
|
+
assert count_rows("try") == 1
|
124
|
+
|
125
|
+
# ... and has the expected name.
|
126
|
+
result = connection.execute(f"SELECT task_{stream} FROM task")
|
127
|
+
(c, ) = result.first()
|
128
|
+
|
129
|
+
if isinstance(expected_stdx, str):
|
130
|
+
assert c == expected_stdx
|
131
|
+
elif callable(expected_stdx):
|
132
|
+
assert expected_stdx(c)
|
133
|
+
else:
|
134
|
+
raise RuntimeError("Bad expected_stdx value")
|
135
|
+
|
136
|
+
for record in caplog.records:
|
137
|
+
assert record.levelno < logging.ERROR
|
@@ -24,15 +24,15 @@ def local_teardown():
|
|
24
24
|
|
25
25
|
|
26
26
|
@pytest.mark.local
|
27
|
-
def test_within_context_manger():
|
27
|
+
def test_within_context_manger(tmpd_cwd):
|
28
28
|
config = fresh_config()
|
29
29
|
with parsl.load(config=config) as dfk:
|
30
30
|
assert isinstance(dfk, DataFlowKernel)
|
31
31
|
|
32
|
-
bash_future = foo(1)
|
32
|
+
bash_future = foo(1, stdout=tmpd_cwd / 'foo.stdout')
|
33
33
|
assert bash_future.result() == 0
|
34
34
|
|
35
|
-
with open('foo.stdout', 'r') as f:
|
35
|
+
with open(tmpd_cwd / 'foo.stdout', 'r') as f:
|
36
36
|
assert f.read() == "2\n"
|
37
37
|
|
38
38
|
with pytest.raises(NoDataFlowKernelError) as excinfo:
|
@@ -9,6 +9,14 @@ from parsl.executors import HighThroughputExecutor
|
|
9
9
|
from parsl.launchers import SimpleLauncher
|
10
10
|
from parsl.providers import LocalProvider
|
11
11
|
|
12
|
+
# Timing notes:
|
13
|
+
# The configured strategy_period must be much smaller than the delay in
|
14
|
+
# app() so that multiple iterations of the strategy have had a chance
|
15
|
+
# to (mis)behave.
|
16
|
+
# The status polling interval in OneShotLocalProvider must be much bigger
|
17
|
+
# than the above times, so that the job status cached from the provider
|
18
|
+
# will not be updated while the single invocation of app() runs.
|
19
|
+
|
12
20
|
|
13
21
|
@parsl.python_app
|
14
22
|
def app():
|
@@ -55,20 +63,12 @@ def test_one_block(tmpd_cwd):
|
|
55
63
|
)
|
56
64
|
],
|
57
65
|
strategy='simple',
|
66
|
+
strategy_period=0.1
|
58
67
|
)
|
59
68
|
|
60
|
-
parsl.load(config)
|
61
|
-
|
62
|
-
|
63
|
-
def poller():
|
64
|
-
import time
|
65
|
-
while True:
|
66
|
-
dfk.job_status_poller.poll()
|
67
|
-
time.sleep(0.1)
|
69
|
+
with parsl.load(config):
|
70
|
+
app().result()
|
68
71
|
|
69
|
-
threading.Thread(target=poller, daemon=True).start()
|
70
|
-
app().result()
|
71
|
-
parsl.dfk().cleanup()
|
72
72
|
parsl.clear()
|
73
73
|
|
74
74
|
assert oneshot_provider.recorded_submits == 1
|