panda-server-source 0.8.1__tar.gz → 1.0.1__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.
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/PKG-INFO +3 -1
- panda_server_source-1.0.1/PandaPkgInfo.py +1 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/AtlasAnalJobBroker.py +22 -8
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/AtlasBrokerUtils.py +46 -36
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/AtlasProdJobBroker.py +14 -6
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/AtlasProdTaskBroker.py +3 -2
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/GenJobBroker.py +2 -2
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/JediTaskBuffer.py +18 -9
- panda_server_source-1.0.1/pandajedi/jedidog/AsyncRequestWatchDog.py +27 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/AtlasAnalWatchDog.py +28 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/ContentsFeeder.py +24 -5
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/JediMaster.py +0 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/JobGenerator.py +11 -7
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/JobSplitter.py +2 -0
- panda_server_source-1.0.1/pandajedi/jediorder/PostProcessor.py +182 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/TaskRefiner.py +4 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/WatchDog.py +2 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedipprocess/AtlasAnalPostProcessor.py +102 -69
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedipprocess/AtlasProdPostProcessor.py +54 -19
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedipprocess/PostProcessorBase.py +22 -3
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedirefine/TaskRefinerBase.py +53 -40
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedisetup/AtlasTaskSetupper.py +1 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedithrottle/JobThrottlerBase.py +6 -2
- panda_server_source-1.0.1/pandaserver/api/v1/async_process_api.py +341 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/common.py +31 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/credential_management_api.py +1 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/file_server_api.py +4 -4
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/http_client.py +5 -6
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/job_api.py +1 -2
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/metaconfig_api.py +1 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/pilot_api.py +5 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/task_api.py +108 -6
- panda_server_source-1.0.1/pandaserver/api/v1/tests/async_process_api_tests.py +221 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/task_api_tests.py +72 -0
- {panda_server_source-0.8.1/pandaserver/brokerage → panda_server_source-1.0.1/pandaserver/asyncprocess}/__init__.py +0 -0
- panda_server_source-1.0.1/pandaserver/asyncprocess/processor.py +181 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/brokerage/SiteMapper.py +3 -2
- {panda_server_source-0.8.1/pandaserver/config → panda_server_source-1.0.1/pandaserver/brokerage}/__init__.py +0 -0
- {panda_server_source-0.8.1/pandaserver/dataservice → panda_server_source-1.0.1/pandaserver/daemons/scripts}/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/add_main.py +15 -2
- panda_server_source-1.0.1/pandaserver/daemons/scripts/async_request_daemon.py +37 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/recover_lost_files_daemon.py +0 -3
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/worker_synchronization.py +2 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/RecoverLostFilesCore.py +8 -7
- {panda_server_source-0.8.1/pandaserver/pandamcp → panda_server_source-1.0.1/pandaserver/jobdispatcher}/__init__.py +0 -0
- panda_server_source-1.0.1/pandaserver/pandamcp/client_utils/get_panda_token.py +151 -0
- panda_server_source-1.0.1/pandaserver/pandamcp/client_utils/get_panda_token.sh +123 -0
- panda_server_source-1.0.1/pandaserver/pandamcp/client_utils/panda_mcp_proxy.py +390 -0
- panda_server_source-1.0.1/pandaserver/pandamcp/client_utils/panda_mcp_wrapper.sh +92 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/pandamcp/mcp_main.py +27 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/pandamcp/mcp_test_client.py +12 -3
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/pandamcp/mcp_utils.py +18 -12
- panda_server_source-1.0.1/pandaserver/pandamcp/panda_mcp_endpoints.json +77 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/server/panda.py +15 -96
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/srvcore/CoreUtils.py +27 -1
- {panda_server_source-0.8.1/pandaserver/taskbuffer → panda_server_source-1.0.1/pandaserver/srvcore}/__init__.py +0 -0
- panda_server_source-1.0.1/pandaserver/srvcore/allowed_methods.py +14 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/srvcore/srv_msg_utils.py +0 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/DdmSpec.py +3 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/JediDatasetSpec.py +6 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/JediFileSpec.py +1 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/JediTaskSpec.py +22 -2
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/OraDBProxy.py +2 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/PrioUtil.py +1 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/TaskBuffer.py +82 -11
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/WrappedCursor.py +9 -4
- {panda_server_source-0.8.1/pandaserver/test → panda_server_source-1.0.1/pandaserver/taskbuffer}/__init__.py +0 -0
- panda_server_source-1.0.1/pandaserver/taskbuffer/db_proxy_mods/async_request_module.py +548 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/base_module.py +55 -3
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/entity_module.py +1 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/job_standalone_module.py +0 -32
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/misc_standalone_module.py +123 -29
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/task_complex_module.py +121 -36
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/task_event_module.py +155 -155
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/task_standalone_module.py +84 -29
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/task_utils_module.py +45 -18
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/worker_module.py +36 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/boostUser.py +1 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/daod_on_demand.py +1 -1
- panda_server_source-1.0.1/pandaserver/userinterface/Client.py +808 -0
- panda_server_source-1.0.1/pandaserver/userinterface/UserIF.py +540 -0
- panda_server_source-1.0.1/pandaserver/workflow/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/data_handler_plugins/panda_task_data_handler.py +15 -4
- panda_server_source-1.0.1/pandaserver/workflow/examples/multistep_merge_wfd.yaml +45 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/step_handler_plugins/panda_task_step_handler.py +3 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/workflow_base.py +9 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/workflow_core.py +112 -37
- panda_server_source-1.0.1/pandaserver/workflow/workflow_native_utils.py +893 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/workflow_parser.py +22 -14
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/workflow_utils.py +8 -3
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pyproject-source.toml +5 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pyproject.toml +5 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/panda_jedi.cfg.rpmnew.template +4 -4
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/panda_server-httpd.conf.rpmnew.template +1 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/panda_server.cfg.rpmnew.template +3 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/sysconfig/panda_jedi.template +5 -1
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/sysconfig/panda_jedi_env.template +5 -1
- panda_server_source-0.8.1/PandaPkgInfo.py +0 -1
- panda_server_source-0.8.1/pandajedi/jediorder/PostProcessor.py +0 -166
- panda_server_source-0.8.1/pandaserver/jobdispatcher/JobDispatcher.py +0 -1625
- panda_server_source-0.8.1/pandaserver/srvcore/allowed_methods.py +0 -100
- panda_server_source-0.8.1/pandaserver/taskbuffer/Utils.py +0 -848
- panda_server_source-0.8.1/pandaserver/taskbuffer/WrappedPickle.py +0 -88
- panda_server_source-0.8.1/pandaserver/userinterface/Client.py +0 -1686
- panda_server_source-0.8.1/pandaserver/userinterface/UserIF.py +0 -1799
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/.gitignore +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/.pre-commit-config.yaml +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/Dockerfile +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/Dockerfile.base +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/LICENSE.txt +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/README.md +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/package/hatch_build.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/JobBrokerBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/TaskBrokerBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediconfig/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediconfig/jedi_config.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/FactoryBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/Interaction.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/JediDBProxy.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/JediDBProxyPool.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/JediDBSchemaInfo.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/JediException.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/JediTaskBufferInterface.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/MsgWrapper.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/ProcessUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/SiteCandidate.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/ThreadUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediddm/AtlasDDMClient.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediddm/DDMClientBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediddm/DDMInterface.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediddm/GenDDMClient.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediddm/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/AtlasDataCarouselWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/AtlasDataLocalityUpdaterWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/AtlasProdWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/AtlasQueueFillerWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/AtlasTaskWithholderWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/AtlasWorkflowManagerWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/GenWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/JumboWatchDog.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/TypicalWatchDogBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/WatchDogBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediexec/reniceJEDI.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedigen/AtlasTaskGenerator.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedigen/TaskGeneratorBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedigen/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/ai_parameter_adjuster_msg_processor +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/atlas_idds_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/base_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/forwarding_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/hpo_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/jedi_contents_feeder_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/jedi_job_generator_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/jedi_post_processor_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/kafka_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/panda_callback_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/panda_to_jedi_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/processing_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/status_report_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/tape_carousel_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedimsgprocessor/workflow_manager_msg_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/JediDaemon.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/JediKnight.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/JediMsgProcessor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/JobBroker.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/JobThrottler.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/TaskBroker.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/TaskCommando.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/TaskGenerator.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/TaskSetupper.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedipprocess/AtlasPostProcessorUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedipprocess/GenPostProcessor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedipprocess/MailTemplates.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedipprocess/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedirefine/AtlasAnalTaskRefiner.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedirefine/AtlasProdTaskRefiner.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedirefine/GenTaskRefiner.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedirefine/RefinerUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedirefine/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedisetup/GenTaskSetupper.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedisetup/SimpleTaskSetupper.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedisetup/TaskSetupperBase.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedisetup/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/SchemaChecker.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addContWoSoTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addDataCarouselRequest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addEventServiceTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addHpoTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addIDDSStageInRequest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addNonAtlasTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addNonAtlasTaskEnc.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addTestTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addTestTaskParamToDEFT.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/addTestTaskWithMerger.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/brokerTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/cancelDataCarouselRequest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/contentsFeederTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/contentsFeederTestWithTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/ddmTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/jobGenForOneTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/jobGeneratorTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/jobSplitterTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/jobThrottlerTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/msgProcessorTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/postProcessorTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/resubmitDataCarouselRequest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/resubmitTaskParam.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/taskBrokerTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/taskBrokerTestWithTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/taskBufferTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/taskCommandoTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/taskRefinerTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/testOneTaskToRefine.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/testOneTaskToTaskBroker.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/testPandaDDMMap.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/updateDataCarouselRequestParams.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/watchDogTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jeditest/workQueueTest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedithrottle/AtlasAnalJobThrottler.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedithrottle/AtlasProdJobThrottler.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedithrottle/GenJobThrottler.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedithrottle/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/data_carousel_api.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/event_api.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/harvester_api.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/idds_api.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/statistics_api.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/system_api.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/credential_management_api_tests.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/data_carousel_api_tests.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/harvester_api_tests.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/idds_api_tests.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/job_api_tests.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/pilot_api_tests.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/statistics_api_tests.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/tests/system_api_tests.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/version.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/api/v1/workflow_api.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/brokerage/broker.py +0 -0
- {panda_server_source-0.8.1/pandaserver/configurator → panda_server_source-1.0.1/pandaserver/config}/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/config/config_utils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/config/daemon_config.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/config/mcp_config.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/config/panda_config.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/configurator/Carbon.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/configurator/Configurator.py +0 -0
- {panda_server_source-0.8.1/pandaserver/daemons → panda_server_source-1.0.1/pandaserver/configurator}/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/configurator/aux.py +0 -0
- {panda_server_source-0.8.1/pandaserver/daemons/scripts → panda_server_source-1.0.1/pandaserver/daemons}/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/master.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/master_systemd.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/add_sub.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/cache_pilots.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/cache_schedconfig.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/carbon.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/configurator.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/copyArchive.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/datasetManager.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/dummy_test.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/evpPD2P.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/hs_scrapers.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/metric_collector.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/panda_activeusers_query.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/pilotStreaming.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/process_workflow_files_daemon.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/task_evaluator.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/scripts/tmpwatch.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/daemons/utils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/DataServiceUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/ErrorCode.py +0 -0
- {panda_server_source-0.8.1/pandaserver/jobdispatcher → panda_server_source-1.0.1/pandaserver/dataservice}/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/activator.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/adder_atlas_plugin.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/adder_dummy_plugin.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/adder_gen.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/adder_plugin_base.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/adder_result.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/adder_simple_plugin.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/closer.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/closer_atlas_plugin.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/ddm.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/ddm_handler.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/dyn_data_distributer.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/event_lookup_client_ei.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/event_picker.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/finisher.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/setupper.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/setupper_atlas_plugin.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/setupper_dummy_plugin.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/dataservice/setupper_plugin_base.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/jobdispatcher/DispatcherUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/jobdispatcher/ErrorCode.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/jobdispatcher/Protocol.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/jobdispatcher/Watcher.py +0 -0
- {panda_server_source-0.8.1/pandaserver/proxycache → panda_server_source-1.0.1/pandaserver/pandamcp}/__init__.py +0 -0
- {panda_server_source-0.8.1/pandaserver/srvcore → panda_server_source-1.0.1/pandaserver/proxycache}/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/proxycache/panda_proxy_cache.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/proxycache/token_cache.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/server/.gacl +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/srvcore/MailUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/srvcore/oidc_utils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/srvcore/panda_request.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/ConBridge.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/DBProxyPool.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/DataCarousel.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/DatasetSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/ErrorCode.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/EventServiceUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/FileSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/GlobalShares.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/HarvesterMetricsSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/Initializer.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/InputChunk.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/JediCacheSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/JobSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/JobUtils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/NucleusSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/PanDAMsgProcessor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/PandaDBSchemaInfo.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/ParseJobXML.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/PickleFileSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/PickleJobSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/ProcessGroups.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/ResourceSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/SQLDumper.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/SQLManager.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/SiteSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/SupErrors.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/TaskBufferInterface.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/WorkQueue.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/WorkQueueMapper.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/WorkerSpec.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/WrappedPostgresConn.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/OraDBProxy_structure.png +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/data_carousel_module.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/job_complex_module.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/metrics_module.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/db_proxy_mods/workflow_module.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/retryModule.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/task_split_rules.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/workflow_processor.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/taskbuffer/wrapped_oracle_conn.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/SchemaChecker.py +0 -0
- {panda_server_source-0.8.1/pandaserver/userinterface → panda_server_source-1.0.1/pandaserver/test}/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/banUser.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/boostPrio.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/callbackDDM.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/finishJob.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/finishTaskJEDI.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/getJobs.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/killJob.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/killJobLowPrio.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/killJobsInTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/killTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/killTaskJEDI.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/killUser.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/lsst/README.txt +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/lsst/lsstSubmit.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/lsst/lsstSubmitMERGEtest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/lsst/lsstSubmitPhosim332.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/lsst/prepare-client-tarball-from-bigpanda-server.sh +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/reassignJobs.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/reassignSite.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/reassignTask.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/reassignWaiting.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/recoverLostFiles.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/reloadInputDS.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/sendCommandToJob.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/setDebugMode.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/setPriority.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testEvgen.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testEvgen17.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testG4sim.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testG4sim17.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testGlobalShares.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testReco.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testSimulReco14.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testSiteMap.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/test/testUpdateWorkerPilotStatus.py +0 -0
- {panda_server_source-0.8.1/pandaserver/workflow → panda_server_source-1.0.1/pandaserver/userinterface}/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/data_handler_plugins/base_data_handler.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/data_handler_plugins/ddm_collection_data_handler.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/pcwl_test.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/pcwl_utils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/psnakemake_container.json +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/psnakemake_task.json +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/psnakemake_test.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/snakeparser/__init__.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/snakeparser/extensions.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/snakeparser/log.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/snakeparser/names.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/snakeparser/parser.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/snakeparser/utils.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/step_handler_plugins/base_step_handler.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandaserver/workflow/workflow_core_smoketest.py +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/bin/panda_jedi-reniceJEDI.exe.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/bin/panda_server-makeSlsXml.exe.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/bin/panda_server-vomsrenew.exe.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/init.d/panda_daemon.exe.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/init.d/panda_httpd.exe.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/init.d/panda_jedi.exe.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/init.d/panda_mcp.exe.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/init.d/panda_server.exe.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/logrotate.d/panda_jedi.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/logrotate.d/panda_server.logrotate.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/panda_jedi.cron.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/sysconfig/panda_jedi.sysconfig_for_systemd.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/sysconfig/panda_server.sysconfig.rpmnew.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/sysconfig/panda_server.sysconfig_for_systemd.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/sysconfig/panda_server_env.systemd.rpmnew.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/systemd/panda.service.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/systemd/panda_daemon.service.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/systemd/panda_httpd.service.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/systemd/panda_jedi.service.template +0 -0
- {panda_server_source-0.8.1 → panda_server_source-1.0.1}/templates/systemd/panda_mcp.service.template +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: panda-server-source
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 1.0.1
|
|
4
4
|
Summary: Unified PanDA Server and JEDI Package - Source Only
|
|
5
5
|
Project-URL: Homepage, https://panda-wms.readthedocs.io/en/latest/
|
|
6
6
|
Author-email: PanDA Team <panda-support@cern.ch>
|
|
@@ -11,6 +11,8 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
11
11
|
Classifier: Programming Language :: Python :: 3.12
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.13
|
|
13
13
|
Requires-Python: >=3.10
|
|
14
|
+
Requires-Dist: panda-client-light
|
|
15
|
+
Requires-Dist: panda-common
|
|
14
16
|
Description-Content-Type: text/markdown
|
|
15
17
|
|
|
16
18
|
# Monorepo for the PanDA Server and JEDI
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
release_version = "1.0.1"
|
|
@@ -47,6 +47,13 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
47
47
|
logger.error("Failed to load the WN architecture level map!!!")
|
|
48
48
|
self.architecture_level_map = {}
|
|
49
49
|
|
|
50
|
+
# load the worker node GPU map
|
|
51
|
+
try:
|
|
52
|
+
self.wn_gpu_map = taskBufferIF.get_worker_node_gpu_map()
|
|
53
|
+
except BaseException:
|
|
54
|
+
logger.error("Failed to load the WN GPU map!!!")
|
|
55
|
+
self.wn_gpu_map = {}
|
|
56
|
+
|
|
50
57
|
# main
|
|
51
58
|
def doBrokerage(self, taskSpec, cloudName, inputChunk, taskParamMap):
|
|
52
59
|
# make logger
|
|
@@ -834,7 +841,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
834
841
|
newScanSiteList = []
|
|
835
842
|
oldScanSiteList = copy.copy(scanSiteList)
|
|
836
843
|
msg_map = {}
|
|
837
|
-
jsonCheck = AtlasBrokerUtils.JsonSoftwareCheck(self.siteMapper, self.sw_map, self.architecture_level_map)
|
|
844
|
+
jsonCheck = AtlasBrokerUtils.JsonSoftwareCheck(self.siteMapper, self.sw_map, self.architecture_level_map, self.wn_gpu_map)
|
|
838
845
|
for tmpSiteName in scanSiteList:
|
|
839
846
|
tmpSiteSpec = self.siteMapper.getSite(tmpSiteName)
|
|
840
847
|
if tmpSiteSpec.isGPU() and not taskSpec.is_hpo_workflow():
|
|
@@ -1117,7 +1124,14 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1117
1124
|
msg_map = {}
|
|
1118
1125
|
for tmpSiteName in self.get_unified_sites(scanSiteList):
|
|
1119
1126
|
tmpSiteSpec = self.siteMapper.getSite(tmpSiteName)
|
|
1120
|
-
# check
|
|
1127
|
+
# check direct access
|
|
1128
|
+
if taskSpec.allowInputLAN() == "only" and not tmpSiteSpec.isDirectIO() and not tmpSiteSpec.always_use_direct_io() and not inputChunk.isMerging:
|
|
1129
|
+
tmp_msg = f" skip site={tmpSiteName} since direct IO is disabled "
|
|
1130
|
+
tmp_msg += "criteria=-remoteio"
|
|
1131
|
+
msg_map[tmpSiteName] = tmp_msg
|
|
1132
|
+
continue
|
|
1133
|
+
|
|
1134
|
+
# check disk space
|
|
1121
1135
|
if tmpSiteSpec.maxwdir:
|
|
1122
1136
|
if CoreUtils.use_direct_io_for_job(taskSpec, tmpSiteSpec, inputChunk):
|
|
1123
1137
|
minDiskCount = minDiskCountR
|
|
@@ -1282,7 +1296,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1282
1296
|
continue
|
|
1283
1297
|
|
|
1284
1298
|
######################################
|
|
1285
|
-
# selection
|
|
1299
|
+
# selection to skip short walltime: scouts, merges, and walltime-undefined jobs
|
|
1286
1300
|
# must only go to sites with at least 24hr*10HS06s of available walltime
|
|
1287
1301
|
if (
|
|
1288
1302
|
(not sitePreAssigned and inputChunk.useScout())
|
|
@@ -1318,16 +1332,16 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1318
1332
|
if siteMaxTime != 0 and siteMaxTime < minTimeForZeroWalltime:
|
|
1319
1333
|
tmpMsg = f" skip site={tmpSiteName} due to site walltime {tmpSiteStr} (site upper limit) insufficient "
|
|
1320
1334
|
if inputChunk.useScout():
|
|
1321
|
-
tmpMsg += f"for
|
|
1322
|
-
tmpMsg += "criteria=-
|
|
1335
|
+
tmpMsg += f"for scout jobs (requireing {str_minTimeForZeroWalltime} at least) "
|
|
1336
|
+
tmpMsg += "criteria=-scout_walltime"
|
|
1323
1337
|
else:
|
|
1324
|
-
tmpMsg += f"for
|
|
1325
|
-
tmpMsg += "criteria=-
|
|
1338
|
+
tmpMsg += f"for merge or walltime-undefined jobs (requiring {str_minTimeForZeroWalltime} at least) "
|
|
1339
|
+
tmpMsg += "criteria=-min_walltime"
|
|
1326
1340
|
msg_map[tmpSiteSpec.get_unified_name()] = tmpMsg
|
|
1327
1341
|
continue
|
|
1328
1342
|
newScanSiteList.append(tmpSiteName)
|
|
1329
1343
|
scanSiteList = newScanSiteList
|
|
1330
|
-
self.add_summary_message(oldScanSiteList, scanSiteList, "
|
|
1344
|
+
self.add_summary_message(oldScanSiteList, scanSiteList, "minimum walltime capacity check", tmpLog, msg_map)
|
|
1331
1345
|
if not scanSiteList:
|
|
1332
1346
|
self.dump_summary(tmpLog)
|
|
1333
1347
|
tmpLog.error("no candidates")
|
{panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/AtlasBrokerUtils.py
RENAMED
|
@@ -17,6 +17,7 @@ from pandaserver.brokerage.SiteMapper import SiteMapper
|
|
|
17
17
|
from pandaserver.dataservice import DataServiceUtils
|
|
18
18
|
from pandaserver.dataservice.DataServiceUtils import select_scope
|
|
19
19
|
from pandaserver.taskbuffer import JobUtils, ProcessGroups, SiteSpec
|
|
20
|
+
from pandaserver.taskbuffer.DdmSpec import DOWNTIME_STATUSES
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
# get nuclei where data is available
|
|
@@ -932,6 +933,8 @@ def compare_version_string(version_string, comparison_string):
|
|
|
932
933
|
return None
|
|
933
934
|
|
|
934
935
|
operator = match.group(1).strip()
|
|
936
|
+
if operator == "=":
|
|
937
|
+
operator = "=="
|
|
935
938
|
version_to_compare = match.group(2).strip()
|
|
936
939
|
|
|
937
940
|
try:
|
|
@@ -959,10 +962,11 @@ def compare_version_string(version_string, comparison_string):
|
|
|
959
962
|
# check SW with json
|
|
960
963
|
class JsonSoftwareCheck:
|
|
961
964
|
# constructor
|
|
962
|
-
def __init__(self, site_mapper, sw_map, wn_architecture_level_map):
|
|
965
|
+
def __init__(self, site_mapper, sw_map, wn_architecture_level_map, wn_gpu_map=None):
|
|
963
966
|
self.siteMapper = site_mapper
|
|
964
967
|
self.sw_map = sw_map
|
|
965
968
|
self.wn_architecture_level_map = wn_architecture_level_map
|
|
969
|
+
self.wn_gpu_map = wn_gpu_map or {}
|
|
966
970
|
|
|
967
971
|
# get lists
|
|
968
972
|
def check(
|
|
@@ -1081,53 +1085,59 @@ class JsonSoftwareCheck:
|
|
|
1081
1085
|
|
|
1082
1086
|
# check GPU
|
|
1083
1087
|
if host_gpu_spec:
|
|
1084
|
-
# GPU not
|
|
1088
|
+
# CRIC is the GPU capability gate: skip queue if not GPU-capable per CRIC
|
|
1085
1089
|
if "gpu" not in architecture_map:
|
|
1086
1090
|
continue
|
|
1087
1091
|
|
|
1092
|
+
# All attribute checks use WN GPU monitoring (MV_WORKER_NODE_GPU_SUMMARY)
|
|
1093
|
+
# which has richer per-host data (vram, architecture, driver version)
|
|
1094
|
+
wn_gpus = self.wn_gpu_map.get(tmp_site_name, [])
|
|
1095
|
+
|
|
1088
1096
|
# check vendor
|
|
1089
|
-
if host_gpu_spec["vendor"]
|
|
1090
|
-
|
|
1091
|
-
if "vendor" in architecture_map["gpu"] and "excl" in architecture_map["gpu"]["vendor"]:
|
|
1092
|
-
continue
|
|
1093
|
-
else:
|
|
1094
|
-
# task specifies a vendor and PQ doesn't request any specific vendor
|
|
1095
|
-
if "vendor" not in architecture_map["gpu"]:
|
|
1096
|
-
continue
|
|
1097
|
-
# task specifies a vendor and PQ doesn't accept any vendor or the specific vendor
|
|
1098
|
-
if "any" not in architecture_map["gpu"]["vendor"] and host_gpu_spec["vendor"] not in architecture_map["gpu"]["vendor"]:
|
|
1097
|
+
if host_gpu_spec["vendor"] != "*":
|
|
1098
|
+
if not wn_gpus or not any(g.get("vendor") and re.match(host_gpu_spec["vendor"], g["vendor"], re.IGNORECASE) for g in wn_gpus):
|
|
1099
1099
|
continue
|
|
1100
1100
|
|
|
1101
|
-
# check model
|
|
1102
|
-
if host_gpu_spec["model"]
|
|
1103
|
-
if "model" in architecture_map["gpu"] and "excl" in architecture_map["gpu"]["model"]:
|
|
1104
|
-
continue
|
|
1105
|
-
else:
|
|
1101
|
+
# check model (include or exclude pattern)
|
|
1102
|
+
if host_gpu_spec["model"] != "*":
|
|
1106
1103
|
if isinstance(host_gpu_spec["model"], dict):
|
|
1107
1104
|
model_pattern = host_gpu_spec["model"]["pattern"]
|
|
1108
1105
|
model_excl = host_gpu_spec["model"].get("excl", False)
|
|
1109
1106
|
else:
|
|
1110
1107
|
model_pattern = host_gpu_spec["model"]
|
|
1111
1108
|
model_excl = False
|
|
1112
|
-
if
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1109
|
+
if not wn_gpus:
|
|
1110
|
+
continue
|
|
1111
|
+
matches = any(g.get("model") and re.match(model_pattern, g["model"], re.IGNORECASE) for g in wn_gpus)
|
|
1112
|
+
if matches == model_excl:
|
|
1113
|
+
continue
|
|
1114
|
+
|
|
1115
|
+
# check VRAM (in MB); supports operators: ==, >=, <=, >, <, != (e.g. ">=40960")
|
|
1116
|
+
if "vram" in host_gpu_spec:
|
|
1117
|
+
if not wn_gpus or not any(g.get("vram") and compare_version_string(str(g["vram"]), host_gpu_spec["vram"]) for g in wn_gpus):
|
|
1117
1118
|
continue
|
|
1118
1119
|
|
|
1119
|
-
# check
|
|
1120
|
+
# check GPU microarchitecture generation (e.g. Ampere, Hopper, Ada Lovelace)
|
|
1121
|
+
if "microarchitecture" in host_gpu_spec:
|
|
1122
|
+
req_arch = host_gpu_spec["microarchitecture"]
|
|
1123
|
+
if isinstance(req_arch, str):
|
|
1124
|
+
req_arch = [req_arch]
|
|
1125
|
+
if not wn_gpus or not any(g.get("architecture") in req_arch for g in wn_gpus):
|
|
1126
|
+
continue
|
|
1127
|
+
|
|
1128
|
+
# check minimum CUDA version
|
|
1120
1129
|
if "version" in host_gpu_spec:
|
|
1121
|
-
if
|
|
1122
|
-
|
|
1130
|
+
if not wn_gpus or not any(
|
|
1131
|
+
g.get("framework_version") and compare_version_string(g["framework_version"], host_gpu_spec["version"]) for g in wn_gpus
|
|
1132
|
+
):
|
|
1133
|
+
continue
|
|
1134
|
+
|
|
1135
|
+
# check minimum GPU driver version (kernel driver, e.g. 575.57.08)
|
|
1136
|
+
if "driver_version" in host_gpu_spec:
|
|
1137
|
+
if not wn_gpus or not any(
|
|
1138
|
+
g.get("driver_version") and compare_version_string(g["driver_version"], host_gpu_spec["driver_version"]) for g in wn_gpus
|
|
1139
|
+
):
|
|
1123
1140
|
continue
|
|
1124
|
-
elif "any" == architecture_map["gpu"]["version"]:
|
|
1125
|
-
# PQ accepts any version
|
|
1126
|
-
pass
|
|
1127
|
-
else:
|
|
1128
|
-
# check version at PQ
|
|
1129
|
-
if not compare_version_string(architecture_map["gpu"]["version"], host_gpu_spec["version"]):
|
|
1130
|
-
continue
|
|
1131
1141
|
go_ahead = True
|
|
1132
1142
|
except Exception as e:
|
|
1133
1143
|
if log_stream:
|
|
@@ -1251,12 +1261,12 @@ def check_endpoints_with_blacklist(
|
|
|
1251
1261
|
tmp_read_input_over_lan = tmp_input_endpoint["detailed_status"].get("read_lan")
|
|
1252
1262
|
tmp_receive_input_over_wan = tmp_input_endpoint["detailed_status"].get("write_wan")
|
|
1253
1263
|
# can read input from local
|
|
1254
|
-
if tmp_read_input_over_lan not in
|
|
1264
|
+
if tmp_read_input_over_lan not in DOWNTIME_STATUSES:
|
|
1255
1265
|
read_input_over_lan = True
|
|
1256
1266
|
# can receive input from remote to local
|
|
1257
1267
|
if tmp_site_name not in sites_in_nucleus:
|
|
1258
1268
|
# satellite sites
|
|
1259
|
-
if tmp_receive_input_over_wan not in
|
|
1269
|
+
if tmp_receive_input_over_wan not in DOWNTIME_STATUSES:
|
|
1260
1270
|
receive_input_over_wan = True
|
|
1261
1271
|
else:
|
|
1262
1272
|
# NA for nucleus sites
|
|
@@ -1267,12 +1277,12 @@ def check_endpoints_with_blacklist(
|
|
|
1267
1277
|
tmp_write_output_over_lan = tmp_output_endpoint["detailed_status"].get("write_lan")
|
|
1268
1278
|
tmp_send_output_over_wan = tmp_output_endpoint["detailed_status"].get("read_wan")
|
|
1269
1279
|
# can write output to local
|
|
1270
|
-
if tmp_write_output_over_lan not in
|
|
1280
|
+
if tmp_write_output_over_lan not in DOWNTIME_STATUSES:
|
|
1271
1281
|
write_output_over_lan = True
|
|
1272
1282
|
# can send output from local to remote
|
|
1273
1283
|
if tmp_site_name not in sites_in_nucleus:
|
|
1274
1284
|
# satellite sites
|
|
1275
|
-
if tmp_send_output_over_wan not in
|
|
1285
|
+
if tmp_send_output_over_wan not in DOWNTIME_STATUSES:
|
|
1276
1286
|
send_output_over_wan = True
|
|
1277
1287
|
else:
|
|
1278
1288
|
# NA for nucleus sites
|
|
@@ -12,6 +12,7 @@ from pandaserver.dataservice import DataServiceUtils
|
|
|
12
12
|
from pandaserver.dataservice.DataServiceUtils import select_scope
|
|
13
13
|
from pandaserver.srvcore import CoreUtils
|
|
14
14
|
from pandaserver.taskbuffer import EventServiceUtils, JobUtils
|
|
15
|
+
from pandaserver.taskbuffer.DdmSpec import DOWNTIME_STATUSES
|
|
15
16
|
|
|
16
17
|
from . import AtlasBrokerUtils
|
|
17
18
|
from .JobBrokerBase import JobBrokerBase
|
|
@@ -96,6 +97,13 @@ class AtlasProdJobBroker(JobBrokerBase):
|
|
|
96
97
|
logger.error("Failed to load the WN architecture level map!!!")
|
|
97
98
|
self.architecture_level_map = {}
|
|
98
99
|
|
|
100
|
+
# load the worker node GPU map
|
|
101
|
+
try:
|
|
102
|
+
self.wn_gpu_map = taskBufferIF.get_worker_node_gpu_map()
|
|
103
|
+
except BaseException:
|
|
104
|
+
logger.error("Failed to load the WN GPU map!!!")
|
|
105
|
+
self.wn_gpu_map = {}
|
|
106
|
+
|
|
99
107
|
def convertMBpsToWeight(self, mbps):
|
|
100
108
|
"""
|
|
101
109
|
Takes MBps value and converts to a weight between 1 and 2
|
|
@@ -255,7 +263,7 @@ class AtlasProdJobBroker(JobBrokerBase):
|
|
|
255
263
|
if not default_endpoint_out:
|
|
256
264
|
continue
|
|
257
265
|
receive_output_over_wan = default_endpoint_out["detailed_status"].get("write_wan")
|
|
258
|
-
if receive_output_over_wan in
|
|
266
|
+
if receive_output_over_wan in DOWNTIME_STATUSES:
|
|
259
267
|
nucleus_with_storages_unwritable_over_wan[tmp_name] = receive_output_over_wan
|
|
260
268
|
|
|
261
269
|
else:
|
|
@@ -754,7 +762,7 @@ class AtlasProdJobBroker(JobBrokerBase):
|
|
|
754
762
|
resolved_platforms = {}
|
|
755
763
|
preference_weight_map = {}
|
|
756
764
|
if taskSpec.transHome is not None:
|
|
757
|
-
jsonCheck = AtlasBrokerUtils.JsonSoftwareCheck(self.siteMapper, self.sw_map, self.architecture_level_map)
|
|
765
|
+
jsonCheck = AtlasBrokerUtils.JsonSoftwareCheck(self.siteMapper, self.sw_map, self.architecture_level_map, self.wn_gpu_map)
|
|
758
766
|
unified_site_list = self.get_unified_sites(scanSiteList)
|
|
759
767
|
|
|
760
768
|
host_cpu_spec = taskSpec.get_host_cpu_spec()
|
|
@@ -1126,11 +1134,11 @@ class AtlasProdJobBroker(JobBrokerBase):
|
|
|
1126
1134
|
if siteMaxTime != 0 and siteMaxTime < minTimeForZeroWalltime:
|
|
1127
1135
|
tmp_msg = f" skip site={tmpSiteName} due to site walltime {tmpSiteStr} (site upper limit) insufficient "
|
|
1128
1136
|
if inputChunk.useScout():
|
|
1129
|
-
tmp_msg += f"for
|
|
1130
|
-
tmp_msg += "criteria=-
|
|
1137
|
+
tmp_msg += f"for scout jobs (requireing {str_minTimeForZeroWalltime} at least) "
|
|
1138
|
+
tmp_msg += "criteria=-scout_walltime"
|
|
1131
1139
|
else:
|
|
1132
|
-
tmp_msg += f"for
|
|
1133
|
-
tmp_msg += "criteria=-
|
|
1140
|
+
tmp_msg += f"for walltime-undefined jobs (requiring {str_minTimeForZeroWalltime} at least) "
|
|
1141
|
+
tmp_msg += "criteria=-min_walltime"
|
|
1134
1142
|
msg_map[tmpSiteSpec.get_unified_name()] = tmp_msg
|
|
1135
1143
|
continue
|
|
1136
1144
|
# check min walltime at the site
|
|
@@ -18,6 +18,7 @@ from pandajedi.jedicore.ThreadUtils import (
|
|
|
18
18
|
)
|
|
19
19
|
from pandajedi.jedirefine import RefinerUtils
|
|
20
20
|
from pandaserver.dataservice import DataServiceUtils
|
|
21
|
+
from pandaserver.taskbuffer.DdmSpec import DOWNTIME_STATUSES
|
|
21
22
|
|
|
22
23
|
from . import AtlasBrokerUtils
|
|
23
24
|
from .AtlasProdJobBroker import AtlasProdJobBroker
|
|
@@ -345,14 +346,14 @@ class AtlasProdTaskBrokerThread(WorkerThread):
|
|
|
345
346
|
break
|
|
346
347
|
# check blacklist
|
|
347
348
|
read_wan_status = tmpEP["detailed_status"].get("read_wan")
|
|
348
|
-
if read_wan_status in
|
|
349
|
+
if read_wan_status in DOWNTIME_STATUSES:
|
|
349
350
|
tmpLog.info(
|
|
350
351
|
f" skip nucleus={tmpNucleus} since {tmp_ddm_endpoint_name} has read_wan={read_wan_status} criteria=-source_blacklist"
|
|
351
352
|
)
|
|
352
353
|
to_skip = True
|
|
353
354
|
break
|
|
354
355
|
write_wan_status = tmpEP["detailed_status"].get("write_wan")
|
|
355
|
-
if write_wan_status in
|
|
356
|
+
if write_wan_status in DOWNTIME_STATUSES:
|
|
356
357
|
tmpLog.info(
|
|
357
358
|
f" skip nucleus={tmpNucleus} since {tmp_ddm_endpoint_name} has write_wan={write_wan_status} criteria=-destination_blacklist"
|
|
358
359
|
)
|
{panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedibrokerage/GenJobBroker.py
RENAMED
|
@@ -370,13 +370,13 @@ class GenJobBroker(JobBrokerBase):
|
|
|
370
370
|
# append candidates
|
|
371
371
|
newScanSiteList = []
|
|
372
372
|
for siteCandidateSpec in candidateSpecList:
|
|
373
|
-
# append
|
|
374
|
-
inputChunk.addSiteCandidate(siteCandidateSpec)
|
|
373
|
+
# append only if all files are available at the site when file dispatch is disabled
|
|
375
374
|
if panda_config.disable_file_dispatch and len(siteCandidateSpec.localDiskFiles) < total_num_files:
|
|
376
375
|
tmpLog.debug(
|
|
377
376
|
f" skip {siteCandidateSpec.siteName} due to input file dispatch is disabled and not all files are available at the site ({len(siteCandidateSpec.localDiskFiles)} < {total_num_files})"
|
|
378
377
|
)
|
|
379
378
|
continue
|
|
379
|
+
inputChunk.addSiteCandidate(siteCandidateSpec)
|
|
380
380
|
newScanSiteList.append(siteCandidateSpec.siteName)
|
|
381
381
|
tmpLog.debug(f" use {siteCandidateSpec.siteName} with weight={siteCandidateSpec.weight} nFiles={len(siteCandidateSpec.localDiskFiles)}")
|
|
382
382
|
scanSiteList = newScanSiteList
|
{panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedicore/JediTaskBuffer.py
RENAMED
|
@@ -74,6 +74,7 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
74
74
|
order_by,
|
|
75
75
|
maxFileRecords,
|
|
76
76
|
skip_short_output,
|
|
77
|
+
lfn_constituent_map=None,
|
|
77
78
|
):
|
|
78
79
|
with self.proxyPool.get() as proxy:
|
|
79
80
|
return proxy.insertFilesForDataset_JEDI(
|
|
@@ -111,6 +112,7 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
111
112
|
order_by,
|
|
112
113
|
maxFileRecords,
|
|
113
114
|
skip_short_output,
|
|
115
|
+
lfn_constituent_map=lfn_constituent_map,
|
|
114
116
|
)
|
|
115
117
|
|
|
116
118
|
# get files from the JEDI contents table with jediTaskID and/or datasetID
|
|
@@ -198,11 +200,6 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
198
200
|
with self.proxyPool.get() as proxy:
|
|
199
201
|
return proxy.getTaskDatasetsWithID_JEDI(jediTaskID, pid, lockTask)
|
|
200
202
|
|
|
201
|
-
# get JEDI tasks with selection criteria
|
|
202
|
-
def getTaskIDsWithCriteria_JEDI(self, criteria, nTasks=50):
|
|
203
|
-
with self.proxyPool.get() as proxy:
|
|
204
|
-
return proxy.getTaskIDsWithCriteria_JEDI(criteria, nTasks)
|
|
205
|
-
|
|
206
203
|
# get JEDI tasks to be finished
|
|
207
204
|
def getTasksToBeFinished_JEDI(self, vo, prodSourceLabel, pid, nTasks=50, target_tasks=None):
|
|
208
205
|
with self.proxyPool.get() as proxy:
|
|
@@ -255,9 +252,9 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
255
252
|
)
|
|
256
253
|
|
|
257
254
|
# get tasks to be processed
|
|
258
|
-
def checkWaitingTaskPrio_JEDI(self, vo, workQueue, prodSourceLabel, cloudName, resource_name=None):
|
|
255
|
+
def checkWaitingTaskPrio_JEDI(self, vo, workQueue, prodSourceLabel, cloudName, resource_name=None, pid=None):
|
|
259
256
|
with self.proxyPool.get() as proxy:
|
|
260
|
-
return proxy.getTasksToBeProcessed_JEDI(
|
|
257
|
+
return proxy.getTasksToBeProcessed_JEDI(pid, vo, workQueue, prodSourceLabel, cloudName, isPeeking=True, resource_name=resource_name)
|
|
261
258
|
|
|
262
259
|
# get job statistics with work queue
|
|
263
260
|
def getJobStatisticsWithWorkQueue_JEDI(self, vo, prodSourceLabel, minPriority=None):
|
|
@@ -414,6 +411,7 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
414
411
|
unmergeDatasetSpecMap,
|
|
415
412
|
uniqueTaskName,
|
|
416
413
|
oldTaskStatus,
|
|
414
|
+
in_content_dataset_spec_list,
|
|
417
415
|
):
|
|
418
416
|
with self.proxyPool.get() as proxy:
|
|
419
417
|
return proxy.registerTaskInOneShot_JEDI(
|
|
@@ -429,6 +427,7 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
429
427
|
unmergeDatasetSpecMap,
|
|
430
428
|
uniqueTaskName,
|
|
431
429
|
oldTaskStatus,
|
|
430
|
+
in_content_dataset_spec_list,
|
|
432
431
|
)
|
|
433
432
|
|
|
434
433
|
# set tasks to be assigned
|
|
@@ -595,9 +594,9 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
595
594
|
)
|
|
596
595
|
|
|
597
596
|
# append input datasets for incremental execution
|
|
598
|
-
def appendDatasets_JEDI(self, jediTaskID, inMasterDatasetSpecList, inSecDatasetSpecList):
|
|
597
|
+
def appendDatasets_JEDI(self, jediTaskID, inMasterDatasetSpecList, inSecDatasetSpecList, in_content_dataset_specs):
|
|
599
598
|
with self.proxyPool.get() as proxy:
|
|
600
|
-
return proxy.appendDatasets_JEDI(jediTaskID, inMasterDatasetSpecList, inSecDatasetSpecList)
|
|
599
|
+
return proxy.appendDatasets_JEDI(jediTaskID, inMasterDatasetSpecList, inSecDatasetSpecList, in_content_dataset_specs)
|
|
601
600
|
|
|
602
601
|
# record retry history
|
|
603
602
|
def recordRetryHistory_JEDI(self, jediTaskID, oldNewPandaIDs, relationType):
|
|
@@ -927,6 +926,11 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
927
926
|
with self.proxyPool.get() as proxy:
|
|
928
927
|
return proxy.get_tasks_inputdatasets_JEDI(vo)
|
|
929
928
|
|
|
929
|
+
# get dataset locality for a task and dataset
|
|
930
|
+
def get_dataset_locality(self, jedi_taskid, datasetid):
|
|
931
|
+
with self.proxyPool.get() as proxy:
|
|
932
|
+
return proxy.get_dataset_locality(jedi_taskid, datasetid)
|
|
933
|
+
|
|
930
934
|
# update dataset locality
|
|
931
935
|
def updateDatasetLocality_JEDI(self, jedi_taskid, datasetid, rse):
|
|
932
936
|
with self.proxyPool.get() as proxy:
|
|
@@ -991,3 +995,8 @@ class JediTaskBuffer(TaskBuffer.TaskBuffer, CommandReceiveInterface):
|
|
|
991
995
|
def get_task_failure_metrics(self, jedi_task_id):
|
|
992
996
|
with self.proxyPool.get() as proxy:
|
|
993
997
|
return proxy.get_task_failure_metrics(jedi_task_id)
|
|
998
|
+
|
|
999
|
+
# reset frozen time of a task to avoid being exausted
|
|
1000
|
+
def reset_frozen_time_for_task(self, task_id):
|
|
1001
|
+
with self.proxyPool.get() as proxy:
|
|
1002
|
+
return proxy.reset_frozen_time_for_task(task_id)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from pandacommon.pandalogger.PandaLogger import PandaLogger
|
|
2
|
+
|
|
3
|
+
from pandajedi.jedicore.MsgWrapper import MsgWrapper
|
|
4
|
+
from pandaserver.asyncprocess import processor
|
|
5
|
+
|
|
6
|
+
from .WatchDogBase import WatchDogBase
|
|
7
|
+
|
|
8
|
+
logger = PandaLogger().getLogger(__name__.split(".")[-1])
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# watchdog that processes async requests on JEDI machines
|
|
12
|
+
class AsyncRequestWatchDog(WatchDogBase):
|
|
13
|
+
# constructor
|
|
14
|
+
def __init__(self, taskBufferIF, ddmIF):
|
|
15
|
+
WatchDogBase.__init__(self, taskBufferIF, ddmIF)
|
|
16
|
+
|
|
17
|
+
# main
|
|
18
|
+
def doAction(self):
|
|
19
|
+
tmpLog = MsgWrapper(logger)
|
|
20
|
+
tmpLog.debug("start")
|
|
21
|
+
try:
|
|
22
|
+
processor.run(service_name="jedi", tbuf=self.taskBufferIF)
|
|
23
|
+
except Exception as e:
|
|
24
|
+
tmpLog.error(f"failed to process async requests with {e}")
|
|
25
|
+
return self.SC_FAILED
|
|
26
|
+
tmpLog.debug("done")
|
|
27
|
+
return self.SC_SUCCEEDED
|
{panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jedidog/AtlasAnalWatchDog.py
RENAMED
|
@@ -8,6 +8,7 @@ from pandacommon.pandalogger.PandaLogger import PandaLogger
|
|
|
8
8
|
|
|
9
9
|
from pandajedi.jedicore.MsgWrapper import MsgWrapper
|
|
10
10
|
from pandaserver.dataservice.activator import Activator
|
|
11
|
+
from pandaserver.taskbuffer.JediDatasetSpec import JediDatasetSpec
|
|
11
12
|
|
|
12
13
|
from .TypicalWatchDogBase import TypicalWatchDogBase
|
|
13
14
|
|
|
@@ -27,6 +28,8 @@ class AtlasAnalWatchDog(TypicalWatchDogBase):
|
|
|
27
28
|
orig_tmp_log = MsgWrapper(logger)
|
|
28
29
|
try:
|
|
29
30
|
orig_tmp_log.debug("start")
|
|
31
|
+
# site mapper
|
|
32
|
+
self.site_mapper = self.taskBufferIF.get_site_mapper()
|
|
30
33
|
# handle waiting jobs
|
|
31
34
|
self.doForWaitingJobs()
|
|
32
35
|
# throttle tasks if so many prestaging requests
|
|
@@ -718,6 +721,11 @@ class AtlasAnalWatchDog(TypicalWatchDogBase):
|
|
|
718
721
|
|
|
719
722
|
# periodic task action
|
|
720
723
|
def do_periodic_action(self):
|
|
724
|
+
"""
|
|
725
|
+
Perform periodic action on tasks
|
|
726
|
+
* extend lifetime of output containers for analysis tasks
|
|
727
|
+
* reset frozen time of pending tasks if input dataset is available only at RSEs in downtime, to avoid unnecessary exhaustion
|
|
728
|
+
"""
|
|
721
729
|
tmp_log = MsgWrapper(logger, " do_periodic_action label=user")
|
|
722
730
|
tmp_log.debug("start")
|
|
723
731
|
try:
|
|
@@ -731,7 +739,7 @@ class AtlasAnalWatchDog(TypicalWatchDogBase):
|
|
|
731
739
|
# get tasks
|
|
732
740
|
task_list = self.taskBufferIF.get_tasks_for_periodic_action(self.vo, self.prodSourceLabel)
|
|
733
741
|
for task_id in task_list:
|
|
734
|
-
# get datasets
|
|
742
|
+
# get output datasets
|
|
735
743
|
_, tmp_datasets = self.taskBufferIF.getDatasetsWithJediTaskID_JEDI(task_id, ["output"])
|
|
736
744
|
done_containers = set()
|
|
737
745
|
for dataset_spec in tmp_datasets:
|
|
@@ -744,5 +752,24 @@ class AtlasAnalWatchDog(TypicalWatchDogBase):
|
|
|
744
752
|
dataset_spec.containerName,
|
|
745
753
|
{"type=.+": {"lifetime": lifetime}, "(SCRATCH|USER)DISK": {"lifetime": lifetime}},
|
|
746
754
|
)
|
|
755
|
+
# get input datasets
|
|
756
|
+
_, tmp_datasets = self.taskBufferIF.getDatasetsWithJediTaskID_JEDI(task_id, ["input", JediDatasetSpec.get_constituent_input_type()])
|
|
757
|
+
for dataset_spec in tmp_datasets:
|
|
758
|
+
# get locations
|
|
759
|
+
rses = self.taskBufferIF.get_dataset_locality(task_id, dataset_spec.datasetID)
|
|
760
|
+
# check if all locations are in downtime
|
|
761
|
+
if rses:
|
|
762
|
+
all_in_downtime = True
|
|
763
|
+
for rse in rses:
|
|
764
|
+
if self.site_mapper.is_readable_locally(rse):
|
|
765
|
+
all_in_downtime = False
|
|
766
|
+
break
|
|
767
|
+
if all_in_downtime:
|
|
768
|
+
tmp_log.debug(
|
|
769
|
+
f"reset frozen time for taskID={task_id} since all locations {rses} of input dataset {dataset_spec.datasetName} are in downtime"
|
|
770
|
+
)
|
|
771
|
+
self.taskBufferIF.reset_frozen_time_for_task(task_id)
|
|
772
|
+
break
|
|
773
|
+
|
|
747
774
|
except Exception as e:
|
|
748
775
|
tmp_log.error(f"failed with {str(e)}{traceback.format_exc()}")
|
{panda_server_source-0.8.1 → panda_server_source-1.0.1}/pandajedi/jediorder/ContentsFeeder.py
RENAMED
|
@@ -13,6 +13,7 @@ from pandajedi.jedicore import Interaction
|
|
|
13
13
|
from pandajedi.jedicore.MsgWrapper import MsgWrapper
|
|
14
14
|
from pandajedi.jedicore.ThreadUtils import ListWithLock, ThreadPool, WorkerThread
|
|
15
15
|
from pandajedi.jedirefine import RefinerUtils
|
|
16
|
+
from pandaserver.taskbuffer.JediDatasetSpec import JediDatasetSpec
|
|
16
17
|
|
|
17
18
|
from .JediKnight import JediKnight
|
|
18
19
|
|
|
@@ -125,10 +126,16 @@ class ContentsFeederThread(WorkerThread):
|
|
|
125
126
|
datasetsIdxConsistency = []
|
|
126
127
|
|
|
127
128
|
# get task
|
|
128
|
-
tmpStat, taskSpec = self.taskBufferIF.getTaskWithID_JEDI(jediTaskID, False, real_run, self.pid, 10
|
|
129
|
+
tmpStat, taskSpec = self.taskBufferIF.getTaskWithID_JEDI(jediTaskID, False, real_run, self.pid, 10)
|
|
129
130
|
if not tmpStat or taskSpec is None:
|
|
130
131
|
self.logger.debug(f"failed to get taskSpec for jediTaskID={jediTaskID}")
|
|
131
132
|
continue
|
|
133
|
+
# get constituent datasets grouped by their master input datasetID
|
|
134
|
+
constituent_by_master = {}
|
|
135
|
+
_, c_datasets = self.taskBufferIF.getDatasetsWithJediTaskID_JEDI(jediTaskID, [JediDatasetSpec.get_constituent_input_type()])
|
|
136
|
+
if c_datasets:
|
|
137
|
+
for c_ds in c_datasets:
|
|
138
|
+
constituent_by_master.setdefault(c_ds.masterID, []).append((c_ds.datasetID, c_ds.datasetName))
|
|
132
139
|
|
|
133
140
|
# make logger
|
|
134
141
|
try:
|
|
@@ -531,6 +538,16 @@ class ContentsFeederThread(WorkerThread):
|
|
|
531
538
|
orderBy = taskSpec.order_input_by()
|
|
532
539
|
else:
|
|
533
540
|
orderBy = None
|
|
541
|
+
# build LFN -> constituent datasetID map for this input dataset
|
|
542
|
+
lfn_constituent_map = {}
|
|
543
|
+
if datasetSpec.datasetID in constituent_by_master:
|
|
544
|
+
for c_id, c_name in constituent_by_master[datasetSpec.datasetID]:
|
|
545
|
+
try:
|
|
546
|
+
c_files = ddmIF.getFilesInDataset(c_name)
|
|
547
|
+
for f_data in c_files.values():
|
|
548
|
+
lfn_constituent_map[str(f_data["lfn"])] = c_id
|
|
549
|
+
except Exception:
|
|
550
|
+
tmpLog.warning(f"failed to get files for constituent dataset {c_name}")
|
|
534
551
|
# feed files to the contents table
|
|
535
552
|
tmpLog.debug("update contents")
|
|
536
553
|
res_dict = self.taskBufferIF.insertFilesForDataset_JEDI(
|
|
@@ -568,6 +585,7 @@ class ContentsFeederThread(WorkerThread):
|
|
|
568
585
|
orderBy,
|
|
569
586
|
maxFileRecords,
|
|
570
587
|
skip_short_output,
|
|
588
|
+
lfn_constituent_map=lfn_constituent_map,
|
|
571
589
|
)
|
|
572
590
|
retDB = res_dict["ret_val"]
|
|
573
591
|
missingFileList = res_dict["missingFileList"]
|
|
@@ -627,14 +645,15 @@ class ContentsFeederThread(WorkerThread):
|
|
|
627
645
|
setFrozenTime = False
|
|
628
646
|
skip_secondaries = True
|
|
629
647
|
tmpLog.debug("end loop")
|
|
630
|
-
# task holdup by workflow if
|
|
631
|
-
|
|
648
|
+
# task holdup by workflow if not enough master inputs are ready and parent steps are not all done
|
|
649
|
+
insufficient_ready_files = nFilesMasterReady == 0 or (nFilesPerJob and nFilesMasterReady < nFilesPerJob)
|
|
650
|
+
if not taskOnHold and not taskBroken and allUpdated and insufficient_ready_files and checkedMaster and taskSpec.is_workflow_holdup():
|
|
632
651
|
# hold up by the workflow
|
|
633
652
|
taskOnHold = True
|
|
634
653
|
tmpLog.debug("task to hold up by workflow")
|
|
635
654
|
# no master input
|
|
636
655
|
if not taskOnHold and not taskBroken and allUpdated and nFilesMaster == 0 and checkedMaster:
|
|
637
|
-
tmpErrStr = "
|
|
656
|
+
tmpErrStr = "primary input dataset is empty or all files are excluded "
|
|
638
657
|
if master_offset:
|
|
639
658
|
tmpErrStr += f" with offset={master_offset}"
|
|
640
659
|
tmpLog.error(tmpErrStr)
|
|
@@ -688,7 +707,7 @@ class ContentsFeederThread(WorkerThread):
|
|
|
688
707
|
allRet = self.taskBufferIF.updateTaskStatusByContFeeder_JEDI(jediTaskID, taskSpec, pid=self.pid, setFrozenTime=setFrozenTime)
|
|
689
708
|
elif allUpdated:
|
|
690
709
|
# all OK
|
|
691
|
-
|
|
710
|
+
_, newTaskStatus = self.taskBufferIF.updateTaskStatusByContFeeder_JEDI(
|
|
692
711
|
jediTaskID, getTaskStatus=True, pid=self.pid, useWorldCloud=taskSpec.useWorldCloud()
|
|
693
712
|
)
|
|
694
713
|
tmpMsg = f"set task_status={newTaskStatus}"
|