parsl 2024.3.18__tar.gz → 2024.3.25__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.
Files changed (458) hide show
  1. {parsl-2024.3.18/parsl.egg-info → parsl-2024.3.25}/PKG-INFO +2 -2
  2. {parsl-2024.3.18 → parsl-2024.3.25}/README.rst +1 -1
  3. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/dataflow/dflow.py +11 -4
  4. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/base.py +10 -0
  5. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/status_handling.py +2 -9
  6. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/taskvine/executor.py +21 -1
  7. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/workqueue/executor.py +19 -0
  8. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/jobs/error_handlers.py +1 -1
  9. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/jobs/job_status_poller.py +4 -4
  10. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/monitoring.py +26 -217
  11. parsl-2024.3.25/parsl/monitoring/router.py +208 -0
  12. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_monitoring/test_fuzz_zmq.py +2 -2
  13. parsl-2024.3.25/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +82 -0
  14. parsl-2024.3.25/parsl/tests/test_python_apps/test_context_manager.py +40 -0
  15. parsl-2024.3.25/parsl/tests/test_shutdown/test_kill_monitoring.py +65 -0
  16. parsl-2024.3.25/parsl/usage_tracking/__init__.py +0 -0
  17. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/version.py +1 -1
  18. {parsl-2024.3.18 → parsl-2024.3.25/parsl.egg-info}/PKG-INFO +2 -2
  19. {parsl-2024.3.18 → parsl-2024.3.25}/parsl.egg-info/SOURCES.txt +5 -0
  20. {parsl-2024.3.18 → parsl-2024.3.25}/parsl.egg-info/requires.txt +2 -2
  21. {parsl-2024.3.18 → parsl-2024.3.25}/setup.py +1 -1
  22. {parsl-2024.3.18 → parsl-2024.3.25}/LICENSE +0 -0
  23. {parsl-2024.3.18 → parsl-2024.3.25}/MANIFEST.in +0 -0
  24. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/__init__.py +0 -0
  25. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/addresses.py +0 -0
  26. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/app/__init__.py +0 -0
  27. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/app/app.py +0 -0
  28. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/app/bash.py +0 -0
  29. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/app/errors.py +0 -0
  30. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/app/futures.py +0 -0
  31. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/app/python.py +0 -0
  32. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/benchmark/__init__.py +0 -0
  33. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/benchmark/perf.py +0 -0
  34. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/channels/__init__.py +0 -0
  35. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/channels/base.py +0 -0
  36. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/channels/errors.py +0 -0
  37. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/channels/local/__init__.py +0 -0
  38. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/channels/local/local.py +0 -0
  39. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/channels/oauth_ssh/__init__.py +0 -0
  40. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/channels/oauth_ssh/oauth_ssh.py +0 -0
  41. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/channels/ssh/__init__.py +0 -0
  42. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/channels/ssh/ssh.py +0 -0
  43. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/channels/ssh_il/__init__.py +0 -0
  44. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/channels/ssh_il/ssh_il.py +0 -0
  45. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/concurrent/__init__.py +0 -0
  46. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/config.py +0 -0
  47. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/ASPIRE1.py +0 -0
  48. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/Azure.py +0 -0
  49. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/__init__.py +0 -0
  50. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/ad_hoc.py +0 -0
  51. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/bridges.py +0 -0
  52. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/cc_in2p3.py +0 -0
  53. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/ec2.py +0 -0
  54. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/expanse.py +0 -0
  55. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/frontera.py +0 -0
  56. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/htex_local.py +0 -0
  57. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/illinoiscluster.py +0 -0
  58. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/kubernetes.py +0 -0
  59. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/local_threads.py +0 -0
  60. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/midway.py +0 -0
  61. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/osg.py +0 -0
  62. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/polaris.py +0 -0
  63. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/stampede2.py +0 -0
  64. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/summit.py +0 -0
  65. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/toss3_llnl.py +0 -0
  66. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/vineex_local.py +0 -0
  67. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/configs/wqex_local.py +0 -0
  68. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/curvezmq.py +0 -0
  69. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/data_provider/__init__.py +0 -0
  70. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/data_provider/data_manager.py +0 -0
  71. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/data_provider/file_noop.py +0 -0
  72. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/data_provider/files.py +0 -0
  73. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/data_provider/ftp.py +0 -0
  74. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/data_provider/globus.py +0 -0
  75. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/data_provider/http.py +0 -0
  76. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/data_provider/rsync.py +0 -0
  77. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/data_provider/staging.py +0 -0
  78. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/dataflow/__init__.py +0 -0
  79. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/dataflow/errors.py +0 -0
  80. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/dataflow/futures.py +0 -0
  81. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/dataflow/memoization.py +0 -0
  82. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/dataflow/rundirs.py +0 -0
  83. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/dataflow/states.py +0 -0
  84. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/dataflow/taskrecord.py +0 -0
  85. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/errors.py +0 -0
  86. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/__init__.py +0 -0
  87. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/errors.py +0 -0
  88. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/flux/__init__.py +0 -0
  89. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/flux/execute_parsl_task.py +0 -0
  90. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/flux/executor.py +0 -0
  91. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/flux/flux_instance_manager.py +0 -0
  92. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/high_throughput/__init__.py +0 -0
  93. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/high_throughput/errors.py +0 -0
  94. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/high_throughput/executor.py +0 -0
  95. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/high_throughput/interchange.py +0 -0
  96. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/high_throughput/manager_record.py +0 -0
  97. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  98. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
  99. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
  100. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/high_throughput/probe.py +0 -0
  101. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
  102. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
  103. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/radical/__init__.py +0 -0
  104. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/radical/executor.py +0 -0
  105. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/radical/rpex_master.py +0 -0
  106. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/radical/rpex_resources.py +0 -0
  107. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/radical/rpex_worker.py +0 -0
  108. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/taskvine/__init__.py +0 -0
  109. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/taskvine/errors.py +0 -0
  110. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  111. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/taskvine/factory.py +0 -0
  112. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/taskvine/factory_config.py +0 -0
  113. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/taskvine/manager.py +0 -0
  114. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/taskvine/manager_config.py +0 -0
  115. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/taskvine/utils.py +0 -0
  116. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/threads.py +0 -0
  117. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/workqueue/__init__.py +0 -0
  118. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/workqueue/errors.py +0 -0
  119. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  120. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  121. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  122. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/jobs/__init__.py +0 -0
  123. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/jobs/errors.py +0 -0
  124. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/jobs/states.py +0 -0
  125. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/jobs/strategy.py +0 -0
  126. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/launchers/__init__.py +0 -0
  127. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/launchers/base.py +0 -0
  128. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/launchers/errors.py +0 -0
  129. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/launchers/launchers.py +0 -0
  130. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/log_utils.py +0 -0
  131. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/__init__.py +0 -0
  132. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/db_manager.py +0 -0
  133. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/message_type.py +0 -0
  134. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/queries/__init__.py +0 -0
  135. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/queries/pandas.py +0 -0
  136. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/radios.py +0 -0
  137. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/remote.py +0 -0
  138. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/types.py +0 -0
  139. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/__init__.py +0 -0
  140. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/app.py +0 -0
  141. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/models.py +0 -0
  142. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  143. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  144. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  145. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  146. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  147. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  148. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  149. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/templates/app.html +0 -0
  150. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/templates/dag.html +0 -0
  151. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/templates/error.html +0 -0
  152. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/templates/layout.html +0 -0
  153. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  154. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/templates/task.html +0 -0
  155. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  156. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  157. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/utils.py +0 -0
  158. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/version.py +0 -0
  159. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/monitoring/visualization/views.py +0 -0
  160. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/multiprocessing.py +0 -0
  161. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/process_loggers.py +0 -0
  162. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/__init__.py +0 -0
  163. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/ad_hoc/__init__.py +0 -0
  164. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
  165. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/aws/__init__.py +0 -0
  166. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/aws/aws.py +0 -0
  167. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/aws/template.py +0 -0
  168. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/azure/__init__.py +0 -0
  169. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/azure/azure.py +0 -0
  170. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/azure/template.py +0 -0
  171. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/base.py +0 -0
  172. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/cluster_provider.py +0 -0
  173. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/cobalt/__init__.py +0 -0
  174. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/cobalt/cobalt.py +0 -0
  175. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/cobalt/template.py +0 -0
  176. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/condor/__init__.py +0 -0
  177. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/condor/condor.py +0 -0
  178. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/condor/template.py +0 -0
  179. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/errors.py +0 -0
  180. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/googlecloud/__init__.py +0 -0
  181. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/googlecloud/googlecloud.py +0 -0
  182. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/grid_engine/__init__.py +0 -0
  183. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/grid_engine/grid_engine.py +0 -0
  184. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/grid_engine/template.py +0 -0
  185. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/kubernetes/__init__.py +0 -0
  186. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/kubernetes/kube.py +0 -0
  187. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/kubernetes/template.py +0 -0
  188. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/local/__init__.py +0 -0
  189. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/local/local.py +0 -0
  190. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/lsf/__init__.py +0 -0
  191. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/lsf/lsf.py +0 -0
  192. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/lsf/template.py +0 -0
  193. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/pbspro/__init__.py +0 -0
  194. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/pbspro/pbspro.py +0 -0
  195. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/pbspro/template.py +0 -0
  196. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/slurm/__init__.py +0 -0
  197. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/slurm/slurm.py +0 -0
  198. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/slurm/template.py +0 -0
  199. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/torque/__init__.py +0 -0
  200. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/torque/template.py +0 -0
  201. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/providers/torque/torque.py +0 -0
  202. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/py.typed +0 -0
  203. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/serialize/__init__.py +0 -0
  204. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/serialize/base.py +0 -0
  205. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/serialize/concretes.py +0 -0
  206. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/serialize/errors.py +0 -0
  207. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/serialize/facade.py +0 -0
  208. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/serialize/proxystore.py +0 -0
  209. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/__init__.py +0 -0
  210. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/callables_helper.py +0 -0
  211. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/__init__.py +0 -0
  212. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/ad_hoc_cluster_htex.py +0 -0
  213. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/azure_single_node.py +0 -0
  214. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/bluewaters.py +0 -0
  215. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/bridges.py +0 -0
  216. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/cc_in2p3.py +0 -0
  217. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/comet.py +0 -0
  218. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/cooley_htex.py +0 -0
  219. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/ec2_single_node.py +0 -0
  220. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/ec2_spot.py +0 -0
  221. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/frontera.py +0 -0
  222. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/htex_ad_hoc_cluster.py +0 -0
  223. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/htex_local.py +0 -0
  224. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/htex_local_alternate.py +0 -0
  225. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  226. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  227. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/local_adhoc.py +0 -0
  228. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/local_radical.py +0 -0
  229. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/local_radical_mpi.py +0 -0
  230. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/local_threads.py +0 -0
  231. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  232. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  233. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  234. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  235. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  236. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/local_threads_globus.py +0 -0
  237. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  238. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/local_threads_monitoring.py +0 -0
  239. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  240. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/midway.py +0 -0
  241. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/nscc_singapore.py +0 -0
  242. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/osg_htex.py +0 -0
  243. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/petrelkube.py +0 -0
  244. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/summit.py +0 -0
  245. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/swan_htex.py +0 -0
  246. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/taskvine_ex.py +0 -0
  247. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/theta.py +0 -0
  248. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/user_opts.py +0 -0
  249. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/configs/workqueue_ex.py +0 -0
  250. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/conftest.py +0 -0
  251. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/integration/__init__.py +0 -0
  252. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/integration/latency.py +0 -0
  253. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/integration/test_apps/__init__.py +0 -0
  254. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/integration/test_channels/__init__.py +0 -0
  255. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/integration/test_channels/test_channels.py +0 -0
  256. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
  257. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/integration/test_channels/test_scp_1.py +0 -0
  258. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/integration/test_channels/test_ssh_1.py +0 -0
  259. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/integration/test_channels/test_ssh_errors.py +0 -0
  260. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -0
  261. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -0
  262. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  263. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/integration/test_stress/__init__.py +0 -0
  264. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  265. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  266. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/manual_tests/__init__.py +0 -0
  267. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/manual_tests/htex_local.py +0 -0
  268. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/manual_tests/test_ad_hoc_htex.py +0 -0
  269. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/manual_tests/test_basic.py +0 -0
  270. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -0
  271. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  272. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  273. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/manual_tests/test_oauth_ssh.py +0 -0
  274. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  275. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
  276. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  277. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/scaling_tests/__init__.py +0 -0
  278. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/scaling_tests/htex_local.py +0 -0
  279. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/scaling_tests/local_threads.py +0 -0
  280. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/scaling_tests/test_scale.py +0 -0
  281. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
  282. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/scaling_tests/vineex_local.py +0 -0
  283. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
  284. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/scaling_tests/wqex_local.py +0 -0
  285. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/site_tests/__init__.py +0 -0
  286. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/site_tests/site_config_selector.py +0 -0
  287. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/site_tests/test_provider.py +0 -0
  288. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/site_tests/test_site.py +0 -0
  289. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/sites/__init__.py +0 -0
  290. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/sites/test_affinity.py +0 -0
  291. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/sites/test_concurrent.py +0 -0
  292. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  293. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/sites/test_ec2.py +0 -0
  294. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/sites/test_launchers.py +0 -0
  295. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/sites/test_local_adhoc.py +0 -0
  296. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  297. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/sites/test_worker_info.py +0 -0
  298. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_aalst_patterns.py +0 -0
  299. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_bash_apps/__init__.py +0 -0
  300. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  301. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  302. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  303. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  304. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  305. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  306. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  307. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  308. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  309. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  310. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  311. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_callables.py +0 -0
  312. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_channels/__init__.py +0 -0
  313. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_channels/test_large_output.py +0 -0
  314. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_checkpointing/__init__.py +0 -0
  315. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  316. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  317. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  318. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
  319. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  320. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  321. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  322. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  323. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_curvezmq.py +0 -0
  324. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_data/__init__.py +0 -0
  325. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_data/test_file.py +0 -0
  326. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_data/test_file_apps.py +0 -0
  327. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_data/test_file_staging.py +0 -0
  328. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_data/test_output_chain_filenames.py +0 -0
  329. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_docs/__init__.py +0 -0
  330. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_docs/test_from_slides.py +0 -0
  331. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_docs/test_kwargs.py +0 -0
  332. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  333. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_docs/test_workflow1.py +0 -0
  334. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_docs/test_workflow2.py +0 -0
  335. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_docs/test_workflow4.py +0 -0
  336. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_error_handling/__init__.py +0 -0
  337. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_error_handling/test_fail.py +0 -0
  338. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  339. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
  340. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  341. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_error_handling/test_retries.py +0 -0
  342. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  343. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  344. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  345. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  346. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  347. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_flux.py +0 -0
  348. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_htex/__init__.py +0 -0
  349. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_htex/test_basic.py +0 -0
  350. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  351. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  352. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  353. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_htex/test_drain.py +0 -0
  354. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_htex/test_htex.py +0 -0
  355. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  356. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  357. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  358. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  359. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
  360. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_monitoring/__init__.py +0 -0
  361. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  362. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_monitoring/test_basic.py +0 -0
  363. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  364. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  365. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  366. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  367. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_mpi_apps/__init__.py +0 -0
  368. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
  369. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +0 -0
  370. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
  371. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  372. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
  373. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
  374. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_providers/__init__.py +0 -0
  375. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_providers/test_cobalt_deprecation_warning.py +0 -0
  376. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_providers/test_local_provider.py +0 -0
  377. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  378. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  379. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  380. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  381. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/__init__.py +0 -0
  382. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  383. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_basic.py +0 -0
  384. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  385. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  386. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  387. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_fail.py +0 -0
  388. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  389. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  390. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_futures.py +0 -0
  391. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
  392. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  393. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_join.py +0 -0
  394. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  395. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  396. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  397. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  398. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  399. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  400. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  401. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  402. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  403. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_overview.py +0 -0
  404. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  405. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_simple.py +0 -0
  406. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  407. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_python_apps/test_type5.py +0 -0
  408. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_radical/__init__.py +0 -0
  409. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  410. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_regression/__init__.py +0 -0
  411. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_regression/test_1480.py +0 -0
  412. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  413. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_regression/test_1653.py +0 -0
  414. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_regression/test_221.py +0 -0
  415. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_regression/test_226.py +0 -0
  416. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_regression/test_2652.py +0 -0
  417. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_regression/test_69a.py +0 -0
  418. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_regression/test_854.py +0 -0
  419. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  420. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_regression/test_98.py +0 -0
  421. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_scaling/__init__.py +0 -0
  422. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  423. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  424. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  425. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
  426. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_serialization/__init__.py +0 -0
  427. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  428. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_serialization/test_basic.py +0 -0
  429. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  430. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
  431. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  432. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  433. {parsl-2024.3.18/parsl/tests/test_threads → parsl-2024.3.25/parsl/tests/test_shutdown}/__init__.py +0 -0
  434. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_staging/__init__.py +0 -0
  435. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_staging/staging_provider.py +0 -0
  436. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_staging/test_1316.py +0 -0
  437. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_staging/test_docs_1.py +0 -0
  438. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_staging/test_docs_2.py +0 -0
  439. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  440. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  441. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  442. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  443. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_staging/test_staging_https.py +0 -0
  444. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_summary.py +0 -0
  445. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_thread_parallelism.py +0 -0
  446. {parsl-2024.3.18/parsl/tests/test_utils → parsl-2024.3.25/parsl/tests/test_threads}/__init__.py +0 -0
  447. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_threads/test_configs.py +0 -0
  448. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  449. {parsl-2024.3.18/parsl/usage_tracking → parsl-2024.3.25/parsl/tests/test_utils}/__init__.py +0 -0
  450. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  451. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/tests/utils.py +0 -0
  452. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/usage_tracking/usage.py +0 -0
  453. {parsl-2024.3.18 → parsl-2024.3.25}/parsl/utils.py +0 -0
  454. {parsl-2024.3.18 → parsl-2024.3.25}/parsl.egg-info/dependency_links.txt +0 -0
  455. {parsl-2024.3.18 → parsl-2024.3.25}/parsl.egg-info/entry_points.txt +0 -0
  456. {parsl-2024.3.18 → parsl-2024.3.25}/parsl.egg-info/top_level.txt +0 -0
  457. {parsl-2024.3.18 → parsl-2024.3.25}/requirements.txt +0 -0
  458. {parsl-2024.3.18 → parsl-2024.3.25}/setup.cfg +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2024.3.18
3
+ Version: 2024.3.25
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.03.18.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2024.03.25.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -119,7 +119,7 @@ Parsl is supported in Python 3.8+. Requirements can be found `here <requirements
119
119
  Code of Conduct
120
120
  ===============
121
121
 
122
- Parsl seeks to foster an open and welcoming environment - Please see the `Parsl Code of Conduct <https://github.com/Parsl/parsl/blob/master/CoC.md>`_ for more details.
122
+ Parsl seeks to foster an open and welcoming environment - Please see the `Parsl Code of Conduct <https://github.com/Parsl/parsl/blob/master/CODE_OF_CONDUCT.md>`_ for more details.
123
123
 
124
124
  Contributing
125
125
  ============
@@ -108,12 +108,12 @@ class DataFlowKernel:
108
108
 
109
109
  # hub address and port for interchange to connect
110
110
  self.hub_address = None # type: Optional[str]
111
- self.hub_interchange_port = None # type: Optional[int]
111
+ self.hub_zmq_port = None # type: Optional[int]
112
112
  if self.monitoring:
113
113
  if self.monitoring.logdir is None:
114
114
  self.monitoring.logdir = self.run_dir
115
115
  self.hub_address = self.monitoring.hub_address
116
- self.hub_interchange_port = self.monitoring.start(self.run_id, self.run_dir, self.config.run_dir)
116
+ self.hub_zmq_port = self.monitoring.start(self.run_id, self.run_dir, self.config.run_dir)
117
117
 
118
118
  self.time_began = datetime.datetime.now()
119
119
  self.time_completed: Optional[datetime.datetime] = None
@@ -206,6 +206,13 @@ class DataFlowKernel:
206
206
 
207
207
  atexit.register(self.atexit_cleanup)
208
208
 
209
+ def __enter__(self):
210
+ pass
211
+
212
+ def __exit__(self, exc_type, exc_value, traceback):
213
+ logger.debug("Exiting the context manager, calling cleanup for DFK")
214
+ self.cleanup()
215
+
209
216
  def _send_task_log_info(self, task_record: TaskRecord) -> None:
210
217
  if self.monitoring:
211
218
  task_log_info = self._create_task_log_info(task_record)
@@ -1115,12 +1122,12 @@ class DataFlowKernel:
1115
1122
 
1116
1123
  channel.makedirs(channel.script_dir, exist_ok=True)
1117
1124
 
1118
- def add_executors(self, executors):
1125
+ def add_executors(self, executors: Sequence[ParslExecutor]) -> None:
1119
1126
  for executor in executors:
1120
1127
  executor.run_id = self.run_id
1121
1128
  executor.run_dir = self.run_dir
1122
1129
  executor.hub_address = self.hub_address
1123
- executor.hub_port = self.hub_interchange_port
1130
+ executor.hub_port = self.hub_zmq_port
1124
1131
  if hasattr(executor, 'provider'):
1125
1132
  if hasattr(executor.provider, 'script_dir'):
1126
1133
  executor.provider.script_dir = os.path.join(self.run_dir, 'submit_scripts')
@@ -106,6 +106,16 @@ class ParslExecutor(metaclass=ABCMeta):
106
106
  def run_dir(self, value: str) -> None:
107
107
  self._run_dir = value
108
108
 
109
+ @property
110
+ def run_id(self) -> Optional[str]:
111
+ """UUID for the enclosing DFK.
112
+ """
113
+ return self._run_id
114
+
115
+ @run_id.setter
116
+ def run_id(self, value: Optional[str]) -> None:
117
+ self._run_id = value
118
+
109
119
  @property
110
120
  def hub_address(self) -> Optional[str]:
111
121
  """Address to the Hub for monitoring.
@@ -61,7 +61,7 @@ class BlockProviderExecutor(ParslExecutor):
61
61
  # errors can happen during the submit call to the provider; this is used
62
62
  # to keep track of such errors so that they can be handled in one place
63
63
  # together with errors reported by status()
64
- self._simulated_status: Dict[Any, JobStatus] = {}
64
+ self._simulated_status: Dict[str, JobStatus] = {}
65
65
  self._executor_bad_state = threading.Event()
66
66
  self._executor_exception: Optional[Exception] = None
67
67
 
@@ -102,13 +102,10 @@ class BlockProviderExecutor(ParslExecutor):
102
102
  else:
103
103
  return self._provider.status_polling_interval
104
104
 
105
- def _fail_job_async(self, block_id: Any, message: str):
105
+ def _fail_job_async(self, block_id: str, message: str):
106
106
  """Marks a job that has failed to start but would not otherwise be included in status()
107
107
  as failed and report it in status()
108
108
  """
109
- if block_id is None:
110
- block_id = str(self._block_id_counter.get_id())
111
- logger.info(f"Allocated block ID {block_id} for simulated failure")
112
109
  self._simulated_status[block_id] = JobStatus(JobState.FAILED, message)
113
110
 
114
111
  @abstractproperty
@@ -211,10 +208,6 @@ class BlockProviderExecutor(ParslExecutor):
211
208
 
212
209
  Cause the executor to reduce the number of blocks by count.
213
210
 
214
- We should have the scale in method simply take resource object
215
- which will have the scaling methods, scale_in itself should be a coroutine, since
216
- scaling tasks can be slow.
217
-
218
211
  :return: A list of block ids corresponding to the blocks that were removed.
219
212
  """
220
213
  pass
@@ -4,6 +4,7 @@ high-throughput system for delegating Parsl tasks to thousands of remote machine
4
4
  """
5
5
 
6
6
  # Import Python built-in libraries
7
+ import atexit
7
8
  import threading
8
9
  import multiprocessing
9
10
  import logging
@@ -171,7 +172,7 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
171
172
  # Path to directory that holds all tasks' data and results.
172
173
  self._function_data_dir = ""
173
174
 
174
- # helper scripts to prepare package tarballs for Parsl apps
175
+ # Helper scripts to prepare package tarballs for Parsl apps
175
176
  self._package_analyze_script = shutil.which("poncho_package_analyze")
176
177
  self._package_create_script = shutil.which("poncho_package_create")
177
178
  if self._package_analyze_script is None or self._package_create_script is None:
@@ -179,6 +180,18 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
179
180
  else:
180
181
  self._poncho_available = True
181
182
 
183
+ # Register atexit handler to cleanup when Python shuts down
184
+ atexit.register(self.atexit_cleanup)
185
+
186
+ # Attribute indicating whether this executor was started to shut it down properly.
187
+ # This safeguards cases where an object of this executor is created but
188
+ # the executor never starts, so it shouldn't be shutdowned.
189
+ self._started = False
190
+
191
+ def atexit_cleanup(self):
192
+ # Calls this executor's shutdown method upon Python exiting the process.
193
+ self.shutdown()
194
+
182
195
  def _get_launch_command(self, block_id):
183
196
  # Implements BlockProviderExecutor's abstract method.
184
197
  # This executor uses different terminology for worker/launch
@@ -238,6 +251,9 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
238
251
  retrieve Parsl tasks within the TaskVine system.
239
252
  """
240
253
 
254
+ # Mark this executor object as started
255
+ self._started = True
256
+
241
257
  # Synchronize connection and communication settings between the manager and factory
242
258
  self.__synchronize_manager_factory_comm_settings()
243
259
 
@@ -598,6 +614,10 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
598
614
  """Shutdown the executor. Sets flag to cancel the submit process and
599
615
  collector thread, which shuts down the TaskVine system submission.
600
616
  """
617
+ if not self._started:
618
+ # Don't shutdown if the executor never starts.
619
+ return
620
+
601
621
  logger.debug("TaskVine shutdown started")
602
622
  self._should_stop.set()
603
623
 
@@ -3,6 +3,7 @@ Cooperative Computing Lab (CCL) at Notre Dame to provide a fault-tolerant,
3
3
  high-throughput system for delegating Parsl tasks to thousands of remote machines
4
4
  """
5
5
 
6
+ import atexit
6
7
  import threading
7
8
  import multiprocessing
8
9
  import logging
@@ -298,6 +299,18 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
298
299
  if self.init_command != "":
299
300
  self.launch_cmd = self.init_command + "; " + self.launch_cmd
300
301
 
302
+ # register atexit handler to cleanup when Python shuts down
303
+ atexit.register(self.atexit_cleanup)
304
+
305
+ # Attribute indicating whether this executor was started to shut it down properly.
306
+ # This safeguards cases where an object of this executor is created but
307
+ # the executor never starts, so it shouldn't be shutdowned.
308
+ self.started = False
309
+
310
+ def atexit_cleanup(self):
311
+ # Calls this executor's shutdown method upon Python exiting the process.
312
+ self.shutdown()
313
+
301
314
  def _get_launch_command(self, block_id):
302
315
  # this executor uses different terminology for worker/launch
303
316
  # commands than in htex
@@ -307,6 +320,8 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
307
320
  """Create submit process and collector thread to create, send, and
308
321
  retrieve Parsl tasks within the Work Queue system.
309
322
  """
323
+ # Mark this executor object as started
324
+ self.started = True
310
325
  self.tasks_lock = threading.Lock()
311
326
 
312
327
  # Create directories for data and results
@@ -695,6 +710,10 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
695
710
  """Shutdown the executor. Sets flag to cancel the submit process and
696
711
  collector thread, which shuts down the Work Queue system submission.
697
712
  """
713
+ if not self.started:
714
+ # Don't shutdown if the executor never starts.
715
+ return
716
+
698
717
  logger.debug("Work Queue shutdown started")
699
718
  self.should_stop.value = True
700
719
 
@@ -20,7 +20,7 @@ def simple_error_handler(executor: status_handling.BlockProviderExecutor, status
20
20
  executor.set_bad_state_and_fail_all(_get_error(status))
21
21
 
22
22
 
23
- def windowed_error_handler(executor: status_handling.BlockProviderExecutor, status: Dict[str, JobStatus], threshold: int = 3):
23
+ def windowed_error_handler(executor: status_handling.BlockProviderExecutor, status: Dict[str, JobStatus], threshold: int = 3) -> None:
24
24
  sorted_status = [(key, status[key]) for key in sorted(status, key=lambda x: int(x))]
25
25
  current_window = dict(sorted_status[-threshold:])
26
26
  total, failed = _count_jobs(current_window)
@@ -29,7 +29,7 @@ class PollItem:
29
29
  if self._dfk and self._dfk.monitoring is not None:
30
30
  self.monitoring_enabled = True
31
31
  hub_address = self._dfk.hub_address
32
- hub_port = self._dfk.hub_interchange_port
32
+ hub_port = self._dfk.hub_zmq_port
33
33
  context = zmq.Context()
34
34
  self.hub_channel = context.socket(zmq.DEALER)
35
35
  self.hub_channel.set_hwm(0)
@@ -72,7 +72,7 @@ class PollItem:
72
72
  def executor(self) -> BlockProviderExecutor:
73
73
  return self._executor
74
74
 
75
- def scale_in(self, n, max_idletime=None):
75
+ def scale_in(self, n: int, max_idletime: Optional[float] = None) -> List[str]:
76
76
 
77
77
  if max_idletime is None:
78
78
  block_ids = self._executor.scale_in(n)
@@ -82,7 +82,7 @@ class PollItem:
82
82
  # scale_in method really does come from HighThroughputExecutor,
83
83
  # and so does have an extra max_idletime parameter not present
84
84
  # in the executor interface.
85
- block_ids = self._executor.scale_in(n, max_idletime=max_idletime)
85
+ block_ids = self._executor.scale_in(n, max_idletime=max_idletime) # type: ignore[call-arg]
86
86
  if block_ids is not None:
87
87
  new_status = {}
88
88
  for block_id in block_ids:
@@ -91,7 +91,7 @@ class PollItem:
91
91
  self.send_monitoring_info(new_status)
92
92
  return block_ids
93
93
 
94
- def scale_out(self, n):
94
+ def scale_out(self, n: int) -> List[str]:
95
95
  block_ids = self._executor.scale_out(n)
96
96
  if block_ids is not None:
97
97
  new_status = {}
@@ -1,9 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import os
4
- import socket
5
4
  import time
6
- import pickle
7
5
  import logging
8
6
  import typeguard
9
7
  import zmq
@@ -22,8 +20,9 @@ from parsl.utils import setproctitle
22
20
 
23
21
  from parsl.serialize import deserialize
24
22
 
23
+ from parsl.monitoring.router import router_starter
25
24
  from parsl.monitoring.message_type import MessageType
26
- from parsl.monitoring.types import AddressedMonitoringMessage, TaggedMonitoringMessage
25
+ from parsl.monitoring.types import AddressedMonitoringMessage
27
26
  from typing import cast, Any, Callable, Dict, Optional, Sequence, Tuple, Union, TYPE_CHECKING
28
27
 
29
28
  _db_manager_excepts: Optional[Exception]
@@ -93,8 +92,6 @@ class MonitoringHub(RepresentationMixin):
93
92
  Default: 30 seconds
94
93
  """
95
94
 
96
- self.logger = logger
97
-
98
95
  # Any is used to disable typechecking on uses of _dfk_channel,
99
96
  # because it is used in the code as if it points to a channel, but
100
97
  # the static type is that it can also be None. The code relies on
@@ -120,6 +117,8 @@ class MonitoringHub(RepresentationMixin):
120
117
 
121
118
  def start(self, run_id: str, dfk_run_dir: str, config_run_dir: Union[str, os.PathLike]) -> int:
122
119
 
120
+ logger.debug("Starting MonitoringHub")
121
+
123
122
  if self.logdir is None:
124
123
  self.logdir = "."
125
124
 
@@ -128,9 +127,6 @@ class MonitoringHub(RepresentationMixin):
128
127
 
129
128
  os.makedirs(self.logdir, exist_ok=True)
130
129
 
131
- # Initialize the ZMQ pipe to the Parsl Client
132
-
133
- self.logger.debug("Initializing ZMQ Pipes to client")
134
130
  self.monitoring_hub_active = True
135
131
 
136
132
  # This annotation is incompatible with typeguard 4.x instrumentation
@@ -166,8 +162,8 @@ class MonitoringHub(RepresentationMixin):
166
162
  self.router_proc = ForkProcess(target=router_starter,
167
163
  args=(comm_q, self.exception_q, self.priority_msgs, self.node_msgs, self.block_msgs, self.resource_msgs),
168
164
  kwargs={"hub_address": self.hub_address,
169
- "hub_port": self.hub_port,
170
- "hub_port_range": self.hub_port_range,
165
+ "udp_port": self.hub_port,
166
+ "zmq_port_range": self.hub_port_range,
171
167
  "logdir": self.logdir,
172
168
  "logging_level": logging.DEBUG if self.monitoring_debug else logging.INFO,
173
169
  "run_id": run_id
@@ -187,7 +183,7 @@ class MonitoringHub(RepresentationMixin):
187
183
  daemon=True,
188
184
  )
189
185
  self.dbm_proc.start()
190
- self.logger.info("Started the router process {} and DBM process {}".format(self.router_proc.pid, self.dbm_proc.pid))
186
+ logger.info("Started the router process {} and DBM process {}".format(self.router_proc.pid, self.dbm_proc.pid))
191
187
 
192
188
  self.filesystem_proc = Process(target=filesystem_receiver,
193
189
  args=(self.logdir, self.resource_msgs, dfk_run_dir),
@@ -195,19 +191,19 @@ class MonitoringHub(RepresentationMixin):
195
191
  daemon=True
196
192
  )
197
193
  self.filesystem_proc.start()
198
- self.logger.info(f"Started filesystem radio receiver process {self.filesystem_proc.pid}")
194
+ logger.info(f"Started filesystem radio receiver process {self.filesystem_proc.pid}")
199
195
 
200
196
  try:
201
197
  comm_q_result = comm_q.get(block=True, timeout=120)
202
198
  except queue.Empty:
203
- self.logger.error("Hub has not completed initialization in 120s. Aborting")
199
+ logger.error("Hub has not completed initialization in 120s. Aborting")
204
200
  raise Exception("Hub failed to start")
205
201
 
206
202
  if isinstance(comm_q_result, str):
207
- self.logger.error(f"MonitoringRouter sent an error message: {comm_q_result}")
203
+ logger.error(f"MonitoringRouter sent an error message: {comm_q_result}")
208
204
  raise RuntimeError(f"MonitoringRouter failed to start: {comm_q_result}")
209
205
 
210
- udp_port, ic_port = comm_q_result
206
+ udp_port, zmq_port = comm_q_result
211
207
 
212
208
  self.monitoring_hub_url = "udp://{}:{}".format(self.hub_address, udp_port)
213
209
 
@@ -217,28 +213,28 @@ class MonitoringHub(RepresentationMixin):
217
213
  self._dfk_channel.setsockopt(zmq.LINGER, 0)
218
214
  self._dfk_channel.set_hwm(0)
219
215
  self._dfk_channel.setsockopt(zmq.SNDTIMEO, self.dfk_channel_timeout)
220
- self._dfk_channel.connect("tcp://{}:{}".format(self.hub_address, ic_port))
216
+ self._dfk_channel.connect("tcp://{}:{}".format(self.hub_address, zmq_port))
221
217
 
222
- self.logger.info("Monitoring Hub initialized")
218
+ logger.info("Monitoring Hub initialized")
223
219
 
224
- return ic_port
220
+ return zmq_port
225
221
 
226
222
  # TODO: tighten the Any message format
227
223
  def send(self, mtype: MessageType, message: Any) -> None:
228
- self.logger.debug("Sending message type {}".format(mtype))
224
+ logger.debug("Sending message type {}".format(mtype))
229
225
  try:
230
226
  self._dfk_channel.send_pyobj((mtype, message))
231
227
  except zmq.Again:
232
- self.logger.exception(
228
+ logger.exception(
233
229
  "The monitoring message sent from DFK to router timed-out after {}ms".format(self.dfk_channel_timeout))
234
230
 
235
231
  def close(self) -> None:
236
- self.logger.info("Terminating Monitoring Hub")
232
+ logger.info("Terminating Monitoring Hub")
237
233
  exception_msgs = []
238
234
  while True:
239
235
  try:
240
236
  exception_msgs.append(self.exception_q.get(block=False))
241
- self.logger.error("There was a queued exception (Either router or DBM process got exception much earlier?)")
237
+ logger.error("There was a queued exception (Either router or DBM process got exception much earlier?)")
242
238
  except queue.Empty:
243
239
  break
244
240
  if self._dfk_channel and self.monitoring_hub_active:
@@ -246,7 +242,7 @@ class MonitoringHub(RepresentationMixin):
246
242
  self._dfk_channel.close()
247
243
  if exception_msgs:
248
244
  for exception_msg in exception_msgs:
249
- self.logger.error(
245
+ logger.error(
250
246
  "{} process delivered an exception: {}. Terminating all monitoring processes immediately.".format(
251
247
  exception_msg[0],
252
248
  exception_msg[1]
@@ -255,21 +251,21 @@ class MonitoringHub(RepresentationMixin):
255
251
  self.router_proc.terminate()
256
252
  self.dbm_proc.terminate()
257
253
  self.filesystem_proc.terminate()
258
- self.logger.info("Waiting for router to terminate")
254
+ logger.info("Waiting for router to terminate")
259
255
  self.router_proc.join()
260
- self.logger.debug("Finished waiting for router termination")
256
+ logger.debug("Finished waiting for router termination")
261
257
  if len(exception_msgs) == 0:
262
- self.logger.debug("Sending STOP to DBM")
258
+ logger.debug("Sending STOP to DBM")
263
259
  self.priority_msgs.put(("STOP", 0))
264
260
  else:
265
- self.logger.debug("Not sending STOP to DBM, because there were DBM exceptions")
266
- self.logger.debug("Waiting for DB termination")
261
+ logger.debug("Not sending STOP to DBM, because there were DBM exceptions")
262
+ logger.debug("Waiting for DB termination")
267
263
  self.dbm_proc.join()
268
- self.logger.debug("Finished waiting for DBM termination")
264
+ logger.debug("Finished waiting for DBM termination")
269
265
 
270
266
  # should this be message based? it probably doesn't need to be if
271
267
  # we believe we've received all messages
272
- self.logger.info("Terminating filesystem radio receiver process")
268
+ logger.info("Terminating filesystem radio receiver process")
273
269
  self.filesystem_proc.terminate()
274
270
  self.filesystem_proc.join()
275
271
 
@@ -325,190 +321,3 @@ def filesystem_receiver(logdir: str, q: "queue.Queue[AddressedMonitoringMessage]
325
321
  logger.exception(f"Exception processing {filename} - probably will be retried next iteration")
326
322
 
327
323
  time.sleep(1) # whats a good time for this poll?
328
-
329
-
330
- class MonitoringRouter:
331
-
332
- def __init__(self,
333
- *,
334
- hub_address: str,
335
- hub_port: Optional[int] = None,
336
- hub_port_range: Tuple[int, int] = (55050, 56000),
337
-
338
- monitoring_hub_address: str = "127.0.0.1",
339
- logdir: str = ".",
340
- run_id: str,
341
- logging_level: int = logging.INFO,
342
- atexit_timeout: int = 3 # in seconds
343
- ):
344
- """ Initializes a monitoring configuration class.
345
-
346
- Parameters
347
- ----------
348
- hub_address : str
349
- The ip address at which the workers will be able to reach the Hub.
350
- hub_port : int
351
- The specific port at which workers will be able to reach the Hub via UDP. Default: None
352
- hub_port_range : tuple(int, int)
353
- The MonitoringHub picks ports at random from the range which will be used by Hub.
354
- This is overridden when the hub_port option is set. Default: (55050, 56000)
355
- logdir : str
356
- Parsl log directory paths. Logs and temp files go here. Default: '.'
357
- logging_level : int
358
- Logging level as defined in the logging module. Default: logging.INFO
359
- atexit_timeout : float, optional
360
- The amount of time in seconds to terminate the hub without receiving any messages, after the last dfk workflow message is received.
361
-
362
- """
363
- os.makedirs(logdir, exist_ok=True)
364
- self.logger = set_file_logger("{}/monitoring_router.log".format(logdir),
365
- name="monitoring_router",
366
- level=logging_level)
367
- self.logger.debug("Monitoring router starting")
368
-
369
- self.hub_address = hub_address
370
- self.atexit_timeout = atexit_timeout
371
- self.run_id = run_id
372
-
373
- self.loop_freq = 10.0 # milliseconds
374
-
375
- # Initialize the UDP socket
376
- self.sock = socket.socket(socket.AF_INET,
377
- socket.SOCK_DGRAM,
378
- socket.IPPROTO_UDP)
379
-
380
- # We are trying to bind to all interfaces with 0.0.0.0
381
- if not hub_port:
382
- self.sock.bind(('0.0.0.0', 0))
383
- self.hub_port = self.sock.getsockname()[1]
384
- else:
385
- self.hub_port = hub_port
386
- try:
387
- self.sock.bind(('0.0.0.0', self.hub_port))
388
- except Exception as e:
389
- raise RuntimeError(f"Could not bind to hub_port {hub_port} because: {e}")
390
- self.sock.settimeout(self.loop_freq / 1000)
391
- self.logger.info("Initialized the UDP socket on 0.0.0.0:{}".format(self.hub_port))
392
-
393
- self._context = zmq.Context()
394
- self.ic_channel = self._context.socket(zmq.DEALER)
395
- self.ic_channel.setsockopt(zmq.LINGER, 0)
396
- self.ic_channel.set_hwm(0)
397
- self.ic_channel.RCVTIMEO = int(self.loop_freq) # in milliseconds
398
- self.logger.debug("hub_address: {}. hub_port_range {}".format(hub_address, hub_port_range))
399
- self.ic_port = self.ic_channel.bind_to_random_port("tcp://*",
400
- min_port=hub_port_range[0],
401
- max_port=hub_port_range[1])
402
-
403
- def start(self,
404
- priority_msgs: "queue.Queue[AddressedMonitoringMessage]",
405
- node_msgs: "queue.Queue[AddressedMonitoringMessage]",
406
- block_msgs: "queue.Queue[AddressedMonitoringMessage]",
407
- resource_msgs: "queue.Queue[AddressedMonitoringMessage]") -> None:
408
- try:
409
- router_keep_going = True
410
- while router_keep_going:
411
- try:
412
- data, addr = self.sock.recvfrom(2048)
413
- resource_msg = pickle.loads(data)
414
- self.logger.debug("Got UDP Message from {}: {}".format(addr, resource_msg))
415
- resource_msgs.put((resource_msg, addr))
416
- except socket.timeout:
417
- pass
418
-
419
- try:
420
- dfk_loop_start = time.time()
421
- while time.time() - dfk_loop_start < 1.0: # TODO make configurable
422
- # note that nothing checks that msg really is of the annotated type
423
- msg: TaggedMonitoringMessage
424
- msg = self.ic_channel.recv_pyobj()
425
-
426
- assert isinstance(msg, tuple), "IC Channel expects only tuples, got {}".format(msg)
427
- assert len(msg) >= 1, "IC Channel expects tuples of length at least 1, got {}".format(msg)
428
- assert len(msg) == 2, "IC Channel expects message tuples of exactly length 2, got {}".format(msg)
429
-
430
- msg_0: AddressedMonitoringMessage
431
- msg_0 = (msg, 0)
432
-
433
- if msg[0] == MessageType.NODE_INFO:
434
- msg[1]['run_id'] = self.run_id
435
- node_msgs.put(msg_0)
436
- elif msg[0] == MessageType.RESOURCE_INFO:
437
- resource_msgs.put(msg_0)
438
- elif msg[0] == MessageType.BLOCK_INFO:
439
- block_msgs.put(msg_0)
440
- elif msg[0] == MessageType.TASK_INFO:
441
- priority_msgs.put(msg_0)
442
- elif msg[0] == MessageType.WORKFLOW_INFO:
443
- priority_msgs.put(msg_0)
444
- if 'exit_now' in msg[1] and msg[1]['exit_now']:
445
- router_keep_going = False
446
- else:
447
- # There is a type: ignore here because if msg[0]
448
- # is of the correct type, this code is unreachable,
449
- # but there is no verification that the message
450
- # received from ic_channel.recv_pyobj() is actually
451
- # of that type.
452
- self.logger.error("Discarding message " # type: ignore[unreachable]
453
- f"from interchange with unknown type {msg[0].value}")
454
- except zmq.Again:
455
- pass
456
- except Exception:
457
- # This will catch malformed messages. What happens if the
458
- # channel is broken in such a way that it always raises
459
- # an exception? Looping on this would maybe be the wrong
460
- # thing to do.
461
- self.logger.warning("Failure processing a ZMQ message", exc_info=True)
462
-
463
- self.logger.info("Monitoring router draining")
464
- last_msg_received_time = time.time()
465
- while time.time() - last_msg_received_time < self.atexit_timeout:
466
- try:
467
- data, addr = self.sock.recvfrom(2048)
468
- msg = pickle.loads(data)
469
- self.logger.debug("Got UDP Message from {}: {}".format(addr, msg))
470
- resource_msgs.put((msg, addr))
471
- last_msg_received_time = time.time()
472
- except socket.timeout:
473
- pass
474
-
475
- self.logger.info("Monitoring router finishing normally")
476
- finally:
477
- self.logger.info("Monitoring router finished")
478
-
479
-
480
- @wrap_with_logs
481
- def router_starter(comm_q: "queue.Queue[Union[Tuple[int, int], str]]",
482
- exception_q: "queue.Queue[Tuple[str, str]]",
483
- priority_msgs: "queue.Queue[AddressedMonitoringMessage]",
484
- node_msgs: "queue.Queue[AddressedMonitoringMessage]",
485
- block_msgs: "queue.Queue[AddressedMonitoringMessage]",
486
- resource_msgs: "queue.Queue[AddressedMonitoringMessage]",
487
-
488
- hub_address: str,
489
- hub_port: Optional[int],
490
- hub_port_range: Tuple[int, int],
491
-
492
- logdir: str,
493
- logging_level: int,
494
- run_id: str) -> None:
495
- setproctitle("parsl: monitoring router")
496
- try:
497
- router = MonitoringRouter(hub_address=hub_address,
498
- hub_port=hub_port,
499
- hub_port_range=hub_port_range,
500
- logdir=logdir,
501
- logging_level=logging_level,
502
- run_id=run_id)
503
- except Exception as e:
504
- logger.error("MonitoringRouter construction failed.", exc_info=True)
505
- comm_q.put(f"Monitoring router construction failed: {e}")
506
- else:
507
- comm_q.put((router.hub_port, router.ic_port))
508
-
509
- router.logger.info("Starting MonitoringRouter in router_starter")
510
- try:
511
- router.start(priority_msgs, node_msgs, block_msgs, resource_msgs)
512
- except Exception as e:
513
- router.logger.exception("router.start exception")
514
- exception_q.put(('Hub', str(e)))