panda-server-source 1.0.4__tar.gz → 1.1.0__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-1.1.0/.pre-commit-config.yaml +73 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/PKG-INFO +1 -1
- panda_server_source-1.1.0/PandaPkgInfo.py +1 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/package/hatch_build.py +2 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedibrokerage/AtlasAnalJobBroker.py +119 -93
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedibrokerage/AtlasBrokerUtils.py +111 -64
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedibrokerage/AtlasProdJobBroker.py +119 -54
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedibrokerage/AtlasProdTaskBroker.py +49 -21
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedibrokerage/GenJobBroker.py +21 -8
- panda_server_source-1.1.0/pandajedi/jedibrokerage/JobBrokerBase.py +162 -0
- panda_server_source-1.1.0/pandajedi/jedibrokerage/TaskBrokerBase.py +42 -0
- panda_server_source-1.1.0/pandajedi/jediconfig/jedi_config.py +202 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/FactoryBase.py +55 -27
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/Interaction.py +102 -71
- panda_server_source-1.1.0/pandajedi/jedicore/JediDBProxy.py +78 -0
- panda_server_source-1.1.0/pandajedi/jedicore/JediDBProxyPool.py +14 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/JediDBSchemaInfo.py +5 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/JediException.py +5 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/JediTaskBuffer.py +375 -258
- panda_server_source-1.1.0/pandajedi/jedicore/JediTaskBufferInterface.py +76 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/MsgWrapper.py +28 -18
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/ProcessUtils.py +7 -3
- panda_server_source-1.1.0/pandajedi/jedicore/SiteCandidate.py +104 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/ThreadUtils.py +47 -36
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediddm/AtlasDDMClient.py +157 -87
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediddm/DDMClientBase.py +6 -4
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediddm/DDMInterface.py +26 -7
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediddm/GenDDMClient.py +7 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/AsyncRequestWatchDog.py +9 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/AtlasAnalWatchDog.py +36 -22
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/AtlasDataCarouselWatchDog.py +20 -20
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/AtlasDataLocalityUpdaterWatchDog.py +32 -10
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/AtlasProdWatchDog.py +37 -22
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/AtlasQueueFillerWatchDog.py +56 -44
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/AtlasTaskWithholderWatchDog.py +19 -11
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/AtlasWorkflowManagerWatchDog.py +9 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/GenWatchDog.py +9 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/JumboWatchDog.py +14 -7
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/TypicalWatchDogBase.py +13 -3
- panda_server_source-1.1.0/pandajedi/jedidog/WatchDogBase.py +82 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedigen/AtlasTaskGenerator.py +8 -7
- panda_server_source-1.1.0/pandajedi/jedigen/TaskGeneratorBase.py +32 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/atlas_idds_msg_processor.py +4 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/base_msg_processor.py +6 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/forwarding_msg_processor.py +3 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/hpo_msg_processor.py +3 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/jedi_contents_feeder_msg_processor.py +4 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/jedi_job_generator_msg_processor.py +28 -20
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/jedi_post_processor_msg_processor.py +10 -6
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/kafka_msg_processor.py +5 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/panda_callback_msg_processor.py +20 -18
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/panda_to_jedi_msg_processor.py +25 -6
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/processing_msg_processor.py +27 -16
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/status_report_msg_processor.py +9 -5
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/tape_carousel_msg_processor.py +19 -13
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/workflow_manager_msg_processor.py +7 -6
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/ContentsFeeder.py +110 -63
- panda_server_source-1.1.0/pandajedi/jediorder/JediKnight.py +82 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/JediMaster.py +12 -15
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/JediMsgProcessor.py +3 -1
- panda_server_source-1.1.0/pandajedi/jediorder/JobBroker.py +42 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/JobGenerator.py +365 -234
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/JobSplitter.py +45 -24
- panda_server_source-1.1.0/pandajedi/jediorder/JobThrottler.py +34 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/PostProcessor.py +54 -21
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/TaskBroker.py +77 -37
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/TaskCommando.py +31 -9
- panda_server_source-1.1.0/pandajedi/jediorder/TaskGenerator.py +22 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/TaskRefiner.py +85 -66
- panda_server_source-1.1.0/pandajedi/jediorder/TaskSetupper.py +22 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/WatchDog.py +30 -9
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedipprocess/AtlasAnalPostProcessor.py +60 -41
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedipprocess/AtlasPostProcessorUtils.py +14 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedipprocess/AtlasProdPostProcessor.py +30 -23
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedipprocess/GenPostProcessor.py +8 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedipprocess/PostProcessorBase.py +59 -37
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedirefine/AtlasAnalTaskRefiner.py +29 -7
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedirefine/AtlasProdTaskRefiner.py +19 -6
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedirefine/GenTaskRefiner.py +14 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedirefine/RefinerUtils.py +42 -12
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedirefine/TaskRefinerBase.py +76 -43
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedisetup/AtlasTaskSetupper.py +44 -16
- panda_server_source-1.1.0/pandajedi/jedisetup/GenTaskSetupper.py +23 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedisetup/SimpleTaskSetupper.py +10 -2
- panda_server_source-1.1.0/pandajedi/jedisetup/TaskSetupperBase.py +34 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addContWoSoTask.py +3 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addDataCarouselRequest.py +2 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addEventServiceTask.py +3 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addHpoTask.py +5 -4
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addIDDSStageInRequest.py +4 -5
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addNonAtlasTask.py +3 -5
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addNonAtlasTaskEnc.py +3 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addTestTask.py +1 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addTestTaskParamToDEFT.py +3 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/addTestTaskWithMerger.py +6 -4
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/brokerTest.py +9 -4
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/cancelDataCarouselRequest.py +6 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/jobGenForOneTask.py +2 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/jobGeneratorTest.py +1 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/jobSplitterTest.py +8 -4
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/resubmitDataCarouselRequest.py +6 -2
- panda_server_source-1.1.0/pandajedi/jeditest/resubmitTaskParam.py +30 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/taskBrokerTestWithTask.py +1 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/taskCommandoTest.py +1 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/testOneTaskToRefine.py +2 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/testOneTaskToTaskBroker.py +1 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/testPandaDDMMap.py +1 -7
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/updateDataCarouselRequestParams.py +1 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/workQueueTest.py +1 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedithrottle/AtlasAnalJobThrottler.py +8 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedithrottle/AtlasProdJobThrottler.py +8 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedithrottle/GenJobThrottler.py +7 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedithrottle/JobThrottlerBase.py +50 -18
- panda_server_source-1.1.0/pandaserver/api/v1/async_process_api.py +695 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/common.py +135 -50
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/credential_management_api.py +101 -24
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/data_carousel_api.py +71 -27
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/event_api.py +40 -21
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/file_server_api.py +94 -54
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/harvester_api.py +75 -21
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/http_client.py +19 -14
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/idds_api.py +29 -23
- panda_server_source-1.1.0/pandaserver/api/v1/job_api.py +715 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/metaconfig_api.py +24 -10
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/pilot_api.py +234 -127
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/statistics_api.py +57 -15
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/system_api.py +28 -14
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/task_api.py +260 -70
- panda_server_source-1.1.0/pandaserver/api/v1/tests/async_process_api_tests.py +682 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/credential_management_api_tests.py +7 -7
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/data_carousel_api_tests.py +46 -42
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/harvester_api_tests.py +13 -12
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/idds_api_tests.py +6 -5
- panda_server_source-1.1.0/pandaserver/api/v1/tests/job_api_tests.py +335 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/pilot_api_tests.py +6 -8
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/statistics_api_tests.py +11 -10
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/system_api_tests.py +9 -8
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/task_api_tests.py +46 -31
- panda_server_source-1.1.0/pandaserver/api/v1/workflow_api.py +521 -0
- panda_server_source-1.1.0/pandaserver/asyncprocess/__init__.py +8 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/asyncprocess/data_carousel_handlers.py +25 -9
- panda_server_source-1.1.0/pandaserver/asyncprocess/db_read/compose.py +148 -0
- panda_server_source-1.1.0/pandaserver/asyncprocess/db_read/request_shape.py +542 -0
- panda_server_source-1.1.0/pandaserver/asyncprocess/db_read/schema_info.py +299 -0
- panda_server_source-1.1.0/pandaserver/asyncprocess/db_read/tables.py +69 -0
- panda_server_source-1.1.0/pandaserver/asyncprocess/db_read_handlers.py +463 -0
- panda_server_source-1.1.0/pandaserver/asyncprocess/processor.py +656 -0
- {panda_server_source-1.0.4/pandaserver/brokerage → panda_server_source-1.1.0/pandaserver/asyncprocess/tests}/__init__.py +0 -0
- panda_server_source-1.1.0/pandaserver/asyncprocess/tests/db_read_handlers_tests.py +386 -0
- panda_server_source-1.1.0/pandaserver/asyncprocess/tests/db_read_tests.py +534 -0
- panda_server_source-1.1.0/pandaserver/asyncprocess/tests/grep_tests.py +409 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/brokerage/SiteMapper.py +58 -33
- {panda_server_source-1.0.4/pandaserver/config → panda_server_source-1.1.0/pandaserver/brokerage}/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/config/config_utils.py +2 -1
- panda_server_source-1.1.0/pandaserver/config/daemon_config.py +81 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/config/mcp_config.py +17 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/config/panda_config.py +132 -6
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/configurator/Carbon.py +6 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/configurator/Configurator.py +66 -30
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/configurator/aux.py +5 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/master.py +7 -5
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/master_systemd.py +5 -4
- {panda_server_source-1.0.4/pandaserver/dataservice → panda_server_source-1.1.0/pandaserver/daemons/scripts}/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/add_main.py +9 -8
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/add_sub.py +8 -9
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/async_request_daemon.py +4 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/cache_pilots.py +4 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/cache_schedconfig.py +19 -16
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/carbon.py +5 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/configurator.py +5 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/copyArchive.py +36 -35
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/datasetManager.py +65 -52
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/dummy_test.py +2 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/evpPD2P.py +12 -10
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/hs_scrapers.py +13 -11
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/metric_collector.py +63 -47
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/panda_activeusers_query.py +6 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/pilotStreaming.py +5 -5
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/process_workflow_files_daemon.py +10 -9
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/recover_lost_files_daemon.py +10 -10
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/task_evaluator.py +28 -20
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/tmpwatch.py +5 -4
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/scripts/worker_synchronization.py +6 -6
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/daemons/utils.py +108 -55
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/DataServiceUtils.py +23 -14
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/RecoverLostFilesCore.py +21 -10
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/activator.py +11 -4
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/adder_atlas_plugin.py +125 -85
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/adder_dummy_plugin.py +7 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/adder_gen.py +76 -51
- panda_server_source-1.1.0/pandaserver/dataservice/adder_plugin_base.py +48 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/adder_result.py +13 -9
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/adder_simple_plugin.py +18 -13
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/closer.py +22 -15
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/closer_atlas_plugin.py +9 -4
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/ddm.py +191 -123
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/ddm_handler.py +11 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/dyn_data_distributer.py +60 -45
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/event_lookup_client_ei.py +13 -8
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/event_picker.py +24 -10
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/finisher.py +37 -25
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/setupper.py +21 -14
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/setupper_atlas_plugin.py +393 -122
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/setupper_dummy_plugin.py +14 -4
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/setupper_plugin_base.py +23 -5
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/jobdispatcher/DispatcherUtils.py +2 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/jobdispatcher/Protocol.py +33 -18
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/jobdispatcher/Watcher.py +28 -10
- {panda_server_source-1.0.4/pandaserver/pandamcp → panda_server_source-1.1.0/pandaserver/jobdispatcher}/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/pandamcp/client_utils/get_panda_token.py +4 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/pandamcp/client_utils/panda_mcp_proxy.py +22 -18
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/pandamcp/mcp_test_client.py +5 -5
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/pandamcp/mcp_utils.py +12 -5
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/proxycache/panda_proxy_cache.py +32 -28
- panda_server_source-1.1.0/pandaserver/proxycache/token_cache.py +274 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/server/panda.py +38 -22
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/CoreUtils.py +121 -52
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/MailUtils.py +10 -9
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/exceptions.py +10 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/hardware_matching.py +11 -8
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/oidc_utils.py +23 -13
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/panda_request.py +20 -8
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/srv_msg_utils.py +6 -5
- {panda_server_source-1.0.4/pandaserver/taskbuffer → panda_server_source-1.1.0/pandaserver/srvcore/tests}/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/tests/hardware_matching_tests.py +17 -20
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/ConBridge.py +36 -25
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/DBProxyPool.py +25 -15
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/DataCarousel.py +438 -153
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/DatasetSpec.py +44 -22
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/DdmSpec.py +22 -18
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/EventServiceUtils.py +48 -39
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/FileSpec.py +73 -36
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/GlobalShares.py +49 -33
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/HarvesterMetricsSpec.py +27 -15
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/Initializer.py +2 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/InputChunk.py +182 -118
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/JediCacheSpec.py +8 -6
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/JediDatasetSpec.py +141 -96
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/JediFileSpec.py +68 -23
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/JediTaskSpec.py +361 -249
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/JobSpec.py +263 -129
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/JobUtils.py +67 -26
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/NucleusSpec.py +40 -25
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/OraDBProxy.py +70 -23
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/PanDAMsgProcessor.py +0 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/PandaDBSchemaInfo.py +1 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/PickleFileSpec.py +7 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/PickleJobSpec.py +6 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/PrioUtil.py +4 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/ProcessGroups.py +13 -11
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/ResourceSpec.py +39 -18
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/SQLDumper.py +12 -7
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/SQLManager.py +18 -14
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/SiteSpec.py +121 -35
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/TaskBuffer.py +661 -562
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/TaskBufferInterface.py +27 -15
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/WorkQueue.py +40 -26
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/WorkQueueMapper.py +30 -24
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/WorkerSpec.py +56 -16
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/WrappedCursor.py +50 -32
- panda_server_source-1.1.0/pandaserver/taskbuffer/WrappedPostgresConn.py +31 -0
- {panda_server_source-1.0.4/pandaserver/test → panda_server_source-1.1.0/pandaserver/taskbuffer}/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/data_carousel_ops.py +17 -12
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/async_request_module.py +23 -25
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/base_module.py +279 -73
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/data_carousel_module.py +61 -70
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/entity_module.py +234 -190
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/job_complex_module.py +361 -304
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/job_standalone_module.py +260 -301
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/metrics_module.py +98 -41
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/misc_standalone_module.py +325 -228
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/task_complex_module.py +465 -416
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/task_event_module.py +302 -192
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/task_standalone_module.py +301 -219
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/task_utils_module.py +211 -113
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/worker_module.py +94 -99
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/workflow_module.py +294 -82
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/offline_run_script.py +4 -9
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/retryModule.py +63 -45
- panda_server_source-1.1.0/pandaserver/taskbuffer/spec_column.py +43 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/task_split_rules.py +11 -7
- panda_server_source-1.1.0/pandaserver/taskbuffer/tests/container_image_dispatch_tests.py +54 -0
- panda_server_source-1.1.0/pandaserver/taskbuffer/tests/db_connection_tests.py +142 -0
- panda_server_source-1.1.0/pandaserver/taskbuffer/tests/key_reads_tests.py +148 -0
- panda_server_source-1.1.0/pandaserver/taskbuffer/tests/wrapped_conn_tests.py +55 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/workflow_processor.py +30 -21
- panda_server_source-1.1.0/pandaserver/taskbuffer/wrapped_oracle_conn.py +25 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/boostUser.py +3 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/callbackDDM.py +2 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/daod_on_demand.py +2 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/finishJob.py +36 -31
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/getJobs.py +11 -9
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/killJob.py +1 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/killJobLowPrio.py +3 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/killJobsInTask.py +1 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/killTask.py +1 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/lsst/lsstSubmitPhosim332.py +0 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/reassignJobs.py +1 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/reassignSite.py +4 -4
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/reassignTask.py +4 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/reassignWaiting.py +1 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testEvgen.py +1 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testG4sim.py +1 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testG4sim17.py +1 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testGlobalShares.py +4 -2
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testReco.py +1 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testSimulReco14.py +3 -1
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testSiteMap.py +1 -3
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/userinterface/Client.py +53 -48
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/userinterface/UserIF.py +62 -48
- panda_server_source-1.1.0/pandaserver/userinterface/__init__.py +0 -0
- panda_server_source-1.1.0/pandaserver/workflow/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/data_handler_plugins/base_data_handler.py +15 -12
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/data_handler_plugins/ddm_collection_data_handler.py +9 -13
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/data_handler_plugins/panda_task_data_handler.py +35 -14
- panda_server_source-1.1.0/pandaserver/workflow/examples/production_chain_as_test_wfd.json +887 -0
- panda_server_source-1.1.0/pandaserver/workflow/examples/production_chain_as_user_wfd.json +887 -0
- panda_server_source-1.1.0/pandaserver/workflow/examples/production_chain_example.txt +1138 -0
- panda_server_source-1.1.0/pandaserver/workflow/examples/production_chain_wfd.json +932 -0
- panda_server_source-1.1.0/pandaserver/workflow/examples/toy_production_chain_wfd.json +896 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/pcwl_test.py +8 -6
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/pcwl_utils.py +51 -23
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/psnakemake_test.py +5 -5
- panda_server_source-1.1.0/pandaserver/workflow/snakeparser/__init__.py +8 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/snakeparser/extensions.py +18 -12
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/snakeparser/log.py +6 -5
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/snakeparser/parser.py +36 -23
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/snakeparser/utils.py +7 -4
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/step_handler_plugins/base_step_handler.py +11 -12
- panda_server_source-1.1.0/pandaserver/workflow/step_handler_plugins/panda_task_step_handler.py +666 -0
- panda_server_source-1.1.0/pandaserver/workflow/tests/README.md +20 -0
- panda_server_source-1.1.0/pandaserver/workflow/tests/data_handler_test.py +231 -0
- panda_server_source-1.1.0/pandaserver/workflow/tests/insert_step_task_test.py +265 -0
- panda_server_source-1.1.0/pandaserver/workflow/tests/no_legacy_dependency_test.py +161 -0
- panda_server_source-1.1.0/pandaserver/workflow/tests/parse_task_steps_test.py +275 -0
- panda_server_source-1.1.0/pandaserver/workflow/tests/placeholder_resolution_test.py +178 -0
- panda_server_source-1.1.0/pandaserver/workflow/tests/regression_diff_test.py +236 -0
- panda_server_source-1.1.0/pandaserver/workflow/tests/step_relations_test.py +585 -0
- panda_server_source-1.1.0/pandaserver/workflow/tests/step_submission_test.py +692 -0
- panda_server_source-1.1.0/pandaserver/workflow/tests/submit_endpoint_test.py +433 -0
- panda_server_source-1.1.0/pandaserver/workflow/tests/taskbuffer_interface_test.py +95 -0
- panda_server_source-1.1.0/pandaserver/workflow/tests/workflow_done_transition_test.py +682 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/workflow_base.py +198 -33
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/workflow_core.py +840 -123
- panda_server_source-1.1.0/pandaserver/workflow/workflow_core_smoketest.py +286 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/workflow_native_utils.py +522 -105
- panda_server_source-1.1.0/pandaserver/workflow/workflow_parser.py +370 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/workflow_utils.py +95 -50
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/panda_server.cfg.rpmnew.template +17 -1
- panda_server_source-1.0.4/.pre-commit-config.yaml +0 -19
- panda_server_source-1.0.4/PandaPkgInfo.py +0 -1
- panda_server_source-1.0.4/pandajedi/jedibrokerage/JobBrokerBase.py +0 -133
- panda_server_source-1.0.4/pandajedi/jedibrokerage/TaskBrokerBase.py +0 -15
- panda_server_source-1.0.4/pandajedi/jediconfig/jedi_config.py +0 -40
- panda_server_source-1.0.4/pandajedi/jedicore/JediDBProxy.py +0 -56
- panda_server_source-1.0.4/pandajedi/jedicore/JediDBProxyPool.py +0 -37
- panda_server_source-1.0.4/pandajedi/jedicore/JediTaskBufferInterface.py +0 -50
- panda_server_source-1.0.4/pandajedi/jedicore/SiteCandidate.py +0 -90
- panda_server_source-1.0.4/pandajedi/jedidog/WatchDogBase.py +0 -53
- panda_server_source-1.0.4/pandajedi/jedigen/TaskGeneratorBase.py +0 -15
- panda_server_source-1.0.4/pandajedi/jediorder/JediDaemon.py +0 -27
- panda_server_source-1.0.4/pandajedi/jediorder/JediKnight.py +0 -55
- panda_server_source-1.0.4/pandajedi/jediorder/JobBroker.py +0 -33
- panda_server_source-1.0.4/pandajedi/jediorder/JobThrottler.py +0 -28
- panda_server_source-1.0.4/pandajedi/jediorder/TaskGenerator.py +0 -17
- panda_server_source-1.0.4/pandajedi/jediorder/TaskSetupper.py +0 -17
- panda_server_source-1.0.4/pandajedi/jedisetup/GenTaskSetupper.py +0 -16
- panda_server_source-1.0.4/pandajedi/jedisetup/TaskSetupperBase.py +0 -15
- panda_server_source-1.0.4/pandajedi/jeditest/resubmitTaskParam.py +0 -20
- panda_server_source-1.0.4/pandaserver/api/v1/async_process_api.py +0 -401
- panda_server_source-1.0.4/pandaserver/api/v1/job_api.py +0 -464
- panda_server_source-1.0.4/pandaserver/api/v1/tests/async_process_api_tests.py +0 -369
- panda_server_source-1.0.4/pandaserver/api/v1/tests/job_api_tests.py +0 -112
- panda_server_source-1.0.4/pandaserver/api/v1/workflow_api.py +0 -136
- panda_server_source-1.0.4/pandaserver/asyncprocess/processor.py +0 -272
- panda_server_source-1.0.4/pandaserver/brokerage/broker.py +0 -272
- panda_server_source-1.0.4/pandaserver/config/daemon_config.py +0 -29
- panda_server_source-1.0.4/pandaserver/dataservice/adder_plugin_base.py +0 -27
- panda_server_source-1.0.4/pandaserver/proxycache/token_cache.py +0 -141
- panda_server_source-1.0.4/pandaserver/taskbuffer/ParseJobXML.py +0 -350
- panda_server_source-1.0.4/pandaserver/taskbuffer/WrappedPostgresConn.py +0 -24
- panda_server_source-1.0.4/pandaserver/taskbuffer/wrapped_oracle_conn.py +0 -18
- panda_server_source-1.0.4/pandaserver/workflow/snakeparser/__init__.py +0 -3
- panda_server_source-1.0.4/pandaserver/workflow/step_handler_plugins/panda_task_step_handler.py +0 -282
- panda_server_source-1.0.4/pandaserver/workflow/workflow_core_smoketest.py +0 -388
- panda_server_source-1.0.4/pandaserver/workflow/workflow_parser.py +0 -326
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/.gitignore +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/Dockerfile +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/Dockerfile.base +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/LICENSE.txt +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/README.md +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedibrokerage/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediconfig/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedicore/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediddm/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedidog/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediexec/reniceJEDI.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedigen/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedimsgprocessor/ai_parameter_adjuster_msg_processor +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jediorder/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedipprocess/MailTemplates.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedipprocess/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedirefine/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedisetup/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/SchemaChecker.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/contentsFeederTest.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/contentsFeederTestWithTask.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/ddmTest.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/jobThrottlerTest.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/msgProcessorTest.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/postProcessorTest.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/taskBrokerTest.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/taskBufferTest.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/taskRefinerTest.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jeditest/watchDogTest.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandajedi/jedithrottle/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/tests/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/api/v1/version.py +0 -0
- {panda_server_source-1.0.4/pandaserver/asyncprocess → panda_server_source-1.1.0/pandaserver/asyncprocess/db_read}/__init__.py +0 -0
- {panda_server_source-1.0.4/pandaserver/configurator → panda_server_source-1.1.0/pandaserver/config}/__init__.py +0 -0
- {panda_server_source-1.0.4/pandaserver/daemons → panda_server_source-1.1.0/pandaserver/configurator}/__init__.py +0 -0
- {panda_server_source-1.0.4/pandaserver/daemons/scripts → panda_server_source-1.1.0/pandaserver/daemons}/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/dataservice/ErrorCode.py +0 -0
- {panda_server_source-1.0.4/pandaserver/jobdispatcher → panda_server_source-1.1.0/pandaserver/dataservice}/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/jobdispatcher/ErrorCode.py +0 -0
- {panda_server_source-1.0.4/pandaserver/proxycache → panda_server_source-1.1.0/pandaserver/pandamcp}/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/pandamcp/client_utils/get_panda_token.sh +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/pandamcp/client_utils/panda_mcp_wrapper.sh +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/pandamcp/mcp_main.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/pandamcp/panda_mcp_endpoints.json +0 -0
- {panda_server_source-1.0.4/pandaserver/srvcore → panda_server_source-1.1.0/pandaserver/proxycache}/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/server/.gacl +0 -0
- {panda_server_source-1.0.4/pandaserver/srvcore/tests → panda_server_source-1.1.0/pandaserver/srvcore}/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/srvcore/allowed_methods.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/ErrorCode.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/SupErrors.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/OraDBProxy_structure.png +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/taskbuffer/db_proxy_mods/__init__.py +0 -0
- {panda_server_source-1.0.4/pandaserver/userinterface → panda_server_source-1.1.0/pandaserver/taskbuffer/tests}/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/SchemaChecker.py +0 -0
- {panda_server_source-1.0.4/pandaserver/workflow → panda_server_source-1.1.0/pandaserver/test}/__init__.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/banUser.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/boostPrio.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/finishTaskJEDI.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/killTaskJEDI.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/killUser.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/lsst/README.txt +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/lsst/lsstSubmit.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/lsst/lsstSubmitMERGEtest.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/lsst/prepare-client-tarball-from-bigpanda-server.sh +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/recoverLostFiles.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/reloadInputDS.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/sendCommandToJob.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/setDebugMode.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/setPriority.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testEvgen17.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/test/testUpdateWorkerPilotStatus.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/examples/multistep_merge_wfd.yaml +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/examples/nested_workflow_inline_sig_bg_comb_wfd.yaml +6 -6
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/examples/nested_workflow_sig_bg_comb_wfd.yaml +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/examples/scatter_sig_bg_comb_wfd.yaml +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/examples/signal_background_combine_wfd.yaml +6 -6
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/psnakemake_container.json +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/psnakemake_task.json +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pandaserver/workflow/snakeparser/names.py +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pyproject-source.toml +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/pyproject.toml +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/bin/panda_jedi-reniceJEDI.exe.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/bin/panda_server-makeSlsXml.exe.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/bin/panda_server-vomsrenew.exe.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/init.d/panda_daemon.exe.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/init.d/panda_httpd.exe.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/init.d/panda_jedi.exe.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/init.d/panda_mcp.exe.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/init.d/panda_server.exe.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/logrotate.d/panda_jedi.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/logrotate.d/panda_server.logrotate.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/panda_jedi.cfg.rpmnew.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/panda_jedi.cron.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/panda_server-httpd.conf.rpmnew.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/sysconfig/panda_jedi.sysconfig_for_systemd.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/sysconfig/panda_jedi.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/sysconfig/panda_jedi_env.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/sysconfig/panda_server.sysconfig.rpmnew.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/sysconfig/panda_server.sysconfig_for_systemd.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/sysconfig/panda_server_env.systemd.rpmnew.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/systemd/panda.service.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/systemd/panda_daemon.service.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/systemd/panda_httpd.service.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/systemd/panda_jedi.service.template +0 -0
- {panda_server_source-1.0.4 → panda_server_source-1.1.0}/templates/systemd/panda_mcp.service.template +0 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
|
|
3
|
+
# What is checked, and at which version, is defined here rather than in the CI workflow,
|
|
4
|
+
# so that `pre-commit run --all-files` gives a contributor the same answer CI will.
|
|
5
|
+
# Do not add a check to CI without adding it here.
|
|
6
|
+
|
|
7
|
+
# ruff stands in for black, isort and flynt as well as being the linter: one pin instead
|
|
8
|
+
# of three, and one tool to reason about. Its formatter targets black's style but is not
|
|
9
|
+
# byte-identical to it, which is why the switch came with a one-time reformat of the tree.
|
|
10
|
+
#
|
|
11
|
+
# The rules and the line length live in [tool.ruff] in pyproject.toml, so --isolated is
|
|
12
|
+
# deliberately absent here and a developer running ruff by hand gets the same answer.
|
|
13
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
14
|
+
rev: v0.16.9
|
|
15
|
+
hooks:
|
|
16
|
+
# The whole tree, not just the staged files: the scan takes hundredths of a second,
|
|
17
|
+
# and a name can be broken by an edit somewhere else -- a renamed import, a deleted
|
|
18
|
+
# helper, a moved class.
|
|
19
|
+
- id: ruff-check
|
|
20
|
+
args: [--fix, .]
|
|
21
|
+
pass_filenames: false
|
|
22
|
+
- id: ruff-format
|
|
23
|
+
|
|
24
|
+
- repo: https://github.com/pre-commit/mirrors-mypy
|
|
25
|
+
rev: v2.3.1
|
|
26
|
+
hooks:
|
|
27
|
+
# The tree is clean under the flags in [tool.mypy], so the gate is mypy itself: any
|
|
28
|
+
# finding fails the hook. Do not swap it for a count -- annotating a function turns on
|
|
29
|
+
# checking of its whole body, so improving annotations can raise the number before it
|
|
30
|
+
# lowers it. With zero as the bar that goes away.
|
|
31
|
+
#
|
|
32
|
+
# args is emptied because this mirror otherwise passes --ignore-missing-imports and
|
|
33
|
+
# --scripts-are-modules, which would override pyproject.toml. pass_filenames is off
|
|
34
|
+
# for the same reason: handing mypy the staged files would both miss files that an
|
|
35
|
+
# edit elsewhere breaks and change which flags apply.
|
|
36
|
+
#
|
|
37
|
+
# mypy and the stubs are pinned together: the stubs are part of what the run sees, so
|
|
38
|
+
# an unpinned upgrade would produce findings without a code change. When upgrading
|
|
39
|
+
# either, fix what the new version reports in the same PR.
|
|
40
|
+
#
|
|
41
|
+
# panda-common is deliberately absent. It ships py.typed, so installing it changes
|
|
42
|
+
# what mypy resolves, and this hook is the gate.
|
|
43
|
+
- id: mypy
|
|
44
|
+
args: []
|
|
45
|
+
additional_dependencies:
|
|
46
|
+
- types-requests==2.33.0.20260906
|
|
47
|
+
- types-PyYAML==6.0.12.20260906
|
|
48
|
+
pass_filenames: false
|
|
49
|
+
|
|
50
|
+
- repo: local
|
|
51
|
+
hooks:
|
|
52
|
+
# None of the hooks above executes a class body, so a class that cannot be created
|
|
53
|
+
# passes all of them and fails at import time instead -- in a daemon, an outage rather
|
|
54
|
+
# than a failed check. The case this tree can actually reach is a class attribute that
|
|
55
|
+
# carries a value while its name is in __slots__, which raises ValueError when the
|
|
56
|
+
# class is built. Annotating the spec classes is exactly the work that invites it,
|
|
57
|
+
# since the obvious way to write one is `status: str = ""`.
|
|
58
|
+
#
|
|
59
|
+
# These four are the spec classes that assign __slots__ and import without a config
|
|
60
|
+
# file. The fifth, daemons/utils.py's DaemonWorker, is left out on purpose: it pulls in
|
|
61
|
+
# pandaserver.config.panda_config, which reads panda_server.cfg at import time and does
|
|
62
|
+
# not swallow the failure, so covering it would mean shipping a config.
|
|
63
|
+
#
|
|
64
|
+
# panda-common carries no version here: the hook only needs it to be importable, and
|
|
65
|
+
# the bound belongs in pyproject.toml alone. This hook gets its own environment, so
|
|
66
|
+
# installing panda-common here does not reach the mypy hook above.
|
|
67
|
+
- id: slots-import
|
|
68
|
+
name: import the classes that build __slots__
|
|
69
|
+
language: python
|
|
70
|
+
entry: python -c "import pandaserver.taskbuffer.JobSpec, pandaserver.taskbuffer.FileSpec, pandaserver.taskbuffer.WorkerSpec, pandaserver.taskbuffer.HarvesterMetricsSpec"
|
|
71
|
+
additional_dependencies: ['panda-common']
|
|
72
|
+
pass_filenames: false
|
|
73
|
+
always_run: true
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
release_version = "1.1.0"
|
|
@@ -105,8 +105,8 @@ def mm_notification():
|
|
|
105
105
|
}
|
|
106
106
|
headers = {"Content-Type": "application/json"}
|
|
107
107
|
try:
|
|
108
|
-
|
|
109
|
-
except requests.exceptions.RequestException
|
|
108
|
+
requests.post(mm_webhook_url, data=json.dumps(mm_message), headers=headers)
|
|
109
|
+
except requests.exceptions.RequestException:
|
|
110
110
|
pass
|
|
111
111
|
|
|
112
112
|
|
|
@@ -3,18 +3,21 @@ import datetime
|
|
|
3
3
|
import math
|
|
4
4
|
import random
|
|
5
5
|
import re
|
|
6
|
-
import sys
|
|
7
6
|
import traceback
|
|
7
|
+
from typing import Any
|
|
8
8
|
|
|
9
9
|
from pandacommon.pandalogger.PandaLogger import PandaLogger
|
|
10
10
|
from pandacommon.pandautils.PandaUtils import naive_utcnow
|
|
11
11
|
|
|
12
12
|
from pandajedi.jedicore import Interaction
|
|
13
|
+
from pandajedi.jedicore.JediTaskBufferInterface import JediTaskBufferInterface
|
|
13
14
|
from pandajedi.jedicore.MsgWrapper import MsgWrapper
|
|
14
15
|
from pandajedi.jedicore.SiteCandidate import SiteCandidate
|
|
15
16
|
from pandaserver.dataservice.DataServiceUtils import select_scope
|
|
16
17
|
from pandaserver.srvcore import CoreUtils
|
|
17
18
|
from pandaserver.taskbuffer import JobUtils
|
|
19
|
+
from pandaserver.taskbuffer.InputChunk import InputChunk
|
|
20
|
+
from pandaserver.taskbuffer.JediTaskSpec import JediTaskSpec
|
|
18
21
|
|
|
19
22
|
from . import AtlasBrokerUtils
|
|
20
23
|
from .JobBrokerBase import JobBrokerBase
|
|
@@ -30,9 +33,9 @@ VO = "atlas"
|
|
|
30
33
|
# brokerage for ATLAS analysis
|
|
31
34
|
class AtlasAnalJobBroker(JobBrokerBase):
|
|
32
35
|
# constructor
|
|
33
|
-
def __init__(self, ddmIF, taskBufferIF):
|
|
36
|
+
def __init__(self, ddmIF: Interaction.CommandSendInterface, taskBufferIF: JediTaskBufferInterface) -> None:
|
|
34
37
|
JobBrokerBase.__init__(self, ddmIF, taskBufferIF)
|
|
35
|
-
self.dataSiteMap = {}
|
|
38
|
+
self.dataSiteMap: dict[str, Any] = {}
|
|
36
39
|
|
|
37
40
|
# load the SW availability map
|
|
38
41
|
try:
|
|
@@ -56,7 +59,9 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
56
59
|
self.wn_gpu_map = {}
|
|
57
60
|
|
|
58
61
|
# main
|
|
59
|
-
def doBrokerage(
|
|
62
|
+
def doBrokerage(
|
|
63
|
+
self, taskSpec: JediTaskSpec, cloudName: str | None, inputChunk: InputChunk, taskParamMap: dict[str, Any] | None
|
|
64
|
+
) -> tuple[Interaction.StatusCode, InputChunk]:
|
|
60
65
|
# make logger
|
|
61
66
|
if inputChunk.masterDataset:
|
|
62
67
|
msg_tag = f"<jediTaskID={taskSpec.jediTaskID} datasetID={inputChunk.masterDataset.datasetID}>"
|
|
@@ -70,6 +75,20 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
70
75
|
# return when the task is only waiting for something it cannot control, so that
|
|
71
76
|
# it is not penalized with the pending timeout while it waits
|
|
72
77
|
retWaiting = self.SC_WAITING, inputChunk
|
|
78
|
+
# doBrokerage returns either one of the error tuples above or None. Declared
|
|
79
|
+
# without a value, which binds nothing at runtime, so that the first assignment
|
|
80
|
+
# further down does not fix retVal to the tuple type alone.
|
|
81
|
+
retVal: tuple[Interaction.StatusCode, Any] | None
|
|
82
|
+
# the brokerage arithmetic below cannot run on a NULL column; a task read from the DB
|
|
83
|
+
# always carries these, so one that does not is reported rather than crashing mid-scan
|
|
84
|
+
if taskSpec.currentPriority is None or taskSpec.cpuEfficiency is None or taskSpec.prodSourceLabel is None or taskSpec.taskPriority is None:
|
|
85
|
+
tmpLog.error(
|
|
86
|
+
f"cannot broker with currentPriority={taskSpec.currentPriority} cpuEfficiency={taskSpec.cpuEfficiency} "
|
|
87
|
+
f"prodSourceLabel={taskSpec.prodSourceLabel} taskPriority={taskSpec.taskPriority}"
|
|
88
|
+
)
|
|
89
|
+
return retTmpError
|
|
90
|
+
# a NULL baseWalltime is no offset, as everywhere else it is read
|
|
91
|
+
baseWalltime = taskSpec.baseWalltime if taskSpec.baseWalltime is not None else 0
|
|
73
92
|
# new maxwdir
|
|
74
93
|
newMaxwdir = {}
|
|
75
94
|
# get primary site candidates
|
|
@@ -79,7 +98,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
79
98
|
includeList = None
|
|
80
99
|
scanSiteList = []
|
|
81
100
|
# problematic sites
|
|
82
|
-
problematic_sites_dict = {}
|
|
101
|
+
problematic_sites_dict: dict[str, Any] = {}
|
|
83
102
|
# not to use VP replicas for merging, scouts, and forceStaged
|
|
84
103
|
if inputChunk.isMerging or taskSpec.avoid_vp() or taskSpec.useScout() or taskSpec.useLocalIO():
|
|
85
104
|
useVP = False
|
|
@@ -92,8 +111,10 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
92
111
|
# get workQueue
|
|
93
112
|
workQueue = self.taskBufferIF.getWorkQueueMap().getQueueWithIDGshare(taskSpec.workQueue_ID, taskSpec.gshare)
|
|
94
113
|
|
|
95
|
-
# site limitation
|
|
96
|
-
|
|
114
|
+
# site limitation. JobGenerator fills taskParamMap in exactly when the task uses
|
|
115
|
+
# limited sites and leaves it None otherwise, so this branch is the only place
|
|
116
|
+
# here that may read it
|
|
117
|
+
if taskSpec.useLimitedSites() and taskParamMap is not None:
|
|
97
118
|
if "excludedSite" in taskParamMap:
|
|
98
119
|
excludeList = taskParamMap["excludedSite"]
|
|
99
120
|
# str to list for task retry
|
|
@@ -106,13 +127,16 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
106
127
|
includeList = taskParamMap["includedSite"]
|
|
107
128
|
# str to list for task retry
|
|
108
129
|
if includeList == "":
|
|
130
|
+
# nothing was pre-assigned. The split below cannot run on None, and
|
|
131
|
+
# the AttributeError it raised into the handler was doing this check
|
|
109
132
|
includeList = None
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
133
|
+
else:
|
|
134
|
+
try:
|
|
135
|
+
if not isinstance(includeList, list):
|
|
136
|
+
includeList = includeList.split(",")
|
|
137
|
+
siteListPreAssigned = True
|
|
138
|
+
except Exception:
|
|
139
|
+
pass
|
|
116
140
|
# loop over all sites
|
|
117
141
|
for siteName, tmpSiteSpec in self.siteMapper.siteSpecList.items():
|
|
118
142
|
if tmpSiteSpec.type == "analysis" or tmpSiteSpec.is_grandly_unified():
|
|
@@ -356,7 +380,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
356
380
|
|
|
357
381
|
# cannot get local quota
|
|
358
382
|
if not local_quota_ok:
|
|
359
|
-
tmpLog.error(
|
|
383
|
+
tmpLog.error("failed to check local quota")
|
|
360
384
|
taskSpec.setErrDiag(tmpLog.uploadLog(taskSpec.jediTaskID))
|
|
361
385
|
return retTmpError
|
|
362
386
|
|
|
@@ -375,7 +399,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
375
399
|
loc_check_timeout_val = self.taskBufferIF.getConfigValue(ANALYSIS_COMPONENT, loc_check_timeout_key, "jedi", taskSpec.vo)
|
|
376
400
|
|
|
377
401
|
# check input datasets
|
|
378
|
-
element_map = dict()
|
|
402
|
+
element_map: dict[str, Any] = dict()
|
|
379
403
|
ddsList = set()
|
|
380
404
|
complete_disk_ok = {}
|
|
381
405
|
complete_tape_ok = {}
|
|
@@ -417,6 +441,11 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
417
441
|
tmpLog.error(f"fatal error when getting the list of sites where data is available, since {tmpRet}")
|
|
418
442
|
taskSpec.setErrDiag(tmpLog.uploadLog(taskSpec.jediTaskID))
|
|
419
443
|
return retFatal
|
|
444
|
+
if not isinstance(tmpRet, dict):
|
|
445
|
+
# only the error paths handled above return a message in its place
|
|
446
|
+
tmpLog.error(f"failed to get the list of sites where data is available, since {tmpRet}")
|
|
447
|
+
taskSpec.setErrDiag(tmpLog.uploadLog(taskSpec.jediTaskID))
|
|
448
|
+
return retTmpError
|
|
420
449
|
# append
|
|
421
450
|
self.dataSiteMap[datasetName] = tmpRet
|
|
422
451
|
complete_disk_ok[datasetName] = tmp_complete_disk_ok
|
|
@@ -520,10 +549,10 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
520
549
|
|
|
521
550
|
retVal = None
|
|
522
551
|
checkDataLocality = False
|
|
523
|
-
scanSiteWoVP = []
|
|
524
|
-
|
|
525
|
-
site_list_with_data =
|
|
526
|
-
overall_site_list = set()
|
|
552
|
+
scanSiteWoVP: list[Any] = []
|
|
553
|
+
# the sites that had the data in the first loop pass, kept for the ranking below
|
|
554
|
+
site_list_with_data: set[str] = set()
|
|
555
|
+
overall_site_list: set[str] = set()
|
|
527
556
|
for i_loop, (scanSiteList, checkDataLocality) in enumerate(scan_site_list_loops):
|
|
528
557
|
useUnionLocality = False
|
|
529
558
|
self.init_summary_list("Job brokerage summary", f"data locality check: {checkDataLocality}", self.get_unified_sites(scanSiteList))
|
|
@@ -534,8 +563,8 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
534
563
|
######################################
|
|
535
564
|
# selection for data availability
|
|
536
565
|
hasDDS = False
|
|
537
|
-
dataWeight = {}
|
|
538
|
-
remoteSourceList = {}
|
|
566
|
+
dataWeight: dict[str, Any] = {}
|
|
567
|
+
remoteSourceList: dict[str, Any] = {}
|
|
539
568
|
sites_in_nucleus = []
|
|
540
569
|
for datasetSpec in inputChunk.getDatasets():
|
|
541
570
|
datasetSpec.reset_distributed()
|
|
@@ -552,12 +581,15 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
552
581
|
if datasetName in ddsList:
|
|
553
582
|
datasetSpec.setDistributed()
|
|
554
583
|
|
|
555
|
-
# get the list of sites where data is available
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
584
|
+
# get the list of sites where data is available. The first dataset seeds
|
|
585
|
+
# the lists and the rest intersect with them, which is what the flag marks;
|
|
586
|
+
# with no dataset at all they stay empty and the checks below find nothing
|
|
587
|
+
scanSiteList = []
|
|
588
|
+
scanSiteListOnDisk: set[str] = set()
|
|
589
|
+
scanSiteListUnion: set[str] = set()
|
|
590
|
+
scanSiteListOnDiskUnion: set[str] = set()
|
|
591
|
+
scanSiteWoVpUnion: set[str] = set()
|
|
592
|
+
is_first_dataset = True
|
|
561
593
|
|
|
562
594
|
for datasetName, tmpDataSite in self.dataSiteMap.items():
|
|
563
595
|
# check if incomplete replica is allowed
|
|
@@ -582,7 +614,8 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
582
614
|
dataWeight[tmpSiteName] += 0.001
|
|
583
615
|
|
|
584
616
|
# first list
|
|
585
|
-
if
|
|
617
|
+
if is_first_dataset:
|
|
618
|
+
is_first_dataset = False
|
|
586
619
|
scanSiteList = []
|
|
587
620
|
for tmpSiteName in tmpSiteList:
|
|
588
621
|
if tmpSiteName not in oldScanUnifiedSiteList:
|
|
@@ -736,7 +769,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
736
769
|
diskio_limit_tmp = max_diskio_per_core_default
|
|
737
770
|
|
|
738
771
|
# normalize task diskIO by site corecount
|
|
739
|
-
diskio_task_tmp = taskSpec.diskIO
|
|
772
|
+
diskio_task_tmp: float | None = taskSpec.diskIO
|
|
740
773
|
if taskSpec.diskIO is not None and taskSpec.coreCount not in [None, 0, 1] and tmp_site_spec.coreCount not in [None, 0]:
|
|
741
774
|
diskio_task_tmp = taskSpec.diskIO / tmp_site_spec.coreCount
|
|
742
775
|
|
|
@@ -771,20 +804,28 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
771
804
|
|
|
772
805
|
######################################
|
|
773
806
|
# selection with IO intensity
|
|
774
|
-
if
|
|
807
|
+
if not inputChunk.isMerging:
|
|
775
808
|
newScanSiteList = []
|
|
776
809
|
oldScanSiteList = copy.copy(scanSiteList)
|
|
777
810
|
msg_map = {}
|
|
778
811
|
for tmpSiteName in scanSiteList:
|
|
779
812
|
tmpSiteSpec = self.siteMapper.getSite(tmpSiteName)
|
|
780
813
|
max_io_intensity = tmpSiteSpec.get_max_io_intensity()
|
|
781
|
-
if
|
|
782
|
-
|
|
814
|
+
if taskSpec.ioIntensity is None:
|
|
815
|
+
if max_io_intensity is None:
|
|
816
|
+
newScanSiteList.append(tmpSiteName)
|
|
817
|
+
else:
|
|
818
|
+
msg_map[tmpSiteSpec.get_unified_name()] = (
|
|
819
|
+
f" skip site={tmpSiteSpec.get_unified_name()} since task ioIntensity is None and site max_io_intensity={max_io_intensity} criteria=-max_io_intensity"
|
|
820
|
+
)
|
|
783
821
|
else:
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
822
|
+
if max_io_intensity is None or taskSpec.ioIntensity <= max_io_intensity:
|
|
823
|
+
newScanSiteList.append(tmpSiteName)
|
|
824
|
+
else:
|
|
825
|
+
msg_map[tmpSiteSpec.get_unified_name()] = (
|
|
826
|
+
f" skip site={tmpSiteSpec.get_unified_name()} since ioIntensity={taskSpec.ioIntensity} "
|
|
827
|
+
f"is larger than site max_io_intensity={max_io_intensity} criteria=-max_io_intensity"
|
|
828
|
+
)
|
|
788
829
|
scanSiteList = newScanSiteList
|
|
789
830
|
self.add_summary_message(oldScanSiteList, scanSiteList, "max IO intensity check", tmpLog, msg_map)
|
|
790
831
|
if not scanSiteList:
|
|
@@ -874,26 +915,6 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
874
915
|
retVal = retTmpError
|
|
875
916
|
continue
|
|
876
917
|
######################################
|
|
877
|
-
# selection for closed
|
|
878
|
-
if not sitePreAssigned and not inputChunk.isMerging:
|
|
879
|
-
oldScanSiteList = copy.copy(scanSiteList)
|
|
880
|
-
newScanSiteList = []
|
|
881
|
-
msg_map = {}
|
|
882
|
-
for tmpSiteName in self.get_unified_sites(scanSiteList):
|
|
883
|
-
if tmpSiteName in failureCounts and "closed" in failureCounts[tmpSiteName]:
|
|
884
|
-
nClosed = failureCounts[tmpSiteName]["closed"]
|
|
885
|
-
if nClosed > 0:
|
|
886
|
-
msg_map[tmpSiteName] = f" skip site={tmpSiteName} due to n_closed={nClosed} criteria=-closed"
|
|
887
|
-
continue
|
|
888
|
-
newScanSiteList.append(tmpSiteName)
|
|
889
|
-
scanSiteList = self.get_pseudo_sites(newScanSiteList, scanSiteList)
|
|
890
|
-
self.add_summary_message(oldScanSiteList, scanSiteList, "too many closed check", tmpLog, msg_map)
|
|
891
|
-
if not scanSiteList:
|
|
892
|
-
self.dump_summary(tmpLog)
|
|
893
|
-
tmpLog.error("no candidates")
|
|
894
|
-
retVal = retTmpError
|
|
895
|
-
continue
|
|
896
|
-
######################################
|
|
897
918
|
# selection for release
|
|
898
919
|
cmt_config = taskSpec.get_sw_platform()
|
|
899
920
|
is_regexp_cmt_config = False
|
|
@@ -1072,21 +1093,22 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1072
1093
|
if taskSpec.ramPerCore() and not inputChunk.isMerging:
|
|
1073
1094
|
if tmpSiteSpec.coreCount not in [None, 0]:
|
|
1074
1095
|
minRamCount = origMinRamCount * tmpSiteSpec.coreCount
|
|
1075
|
-
|
|
1096
|
+
compensated_min_ram_count = JobUtils.compensate_ram_count(minRamCount)
|
|
1097
|
+
minRamCount = compensated_min_ram_count if compensated_min_ram_count is not None else 0
|
|
1076
1098
|
# site max memory requirement
|
|
1077
|
-
site_maxmemory = 0
|
|
1099
|
+
site_maxmemory: float = 0
|
|
1078
1100
|
if tmpSiteSpec.maxrss not in [0, None]:
|
|
1079
1101
|
site_maxmemory = tmpSiteSpec.maxrss
|
|
1080
|
-
if site_maxmemory not in [0, None] and minRamCount
|
|
1102
|
+
if site_maxmemory not in [0, None] and minRamCount and minRamCount > site_maxmemory:
|
|
1081
1103
|
msg_map[tmpSiteSpec.get_unified_name()] = (
|
|
1082
1104
|
f" skip site={tmpSiteSpec.get_unified_name()} due to insufficient RAM less than job's core-scaled requirement {minRamCount} MB criteria=-lowmemory"
|
|
1083
1105
|
)
|
|
1084
1106
|
continue
|
|
1085
1107
|
# site min memory requirement
|
|
1086
|
-
site_minmemory = 0
|
|
1108
|
+
site_minmemory: float = 0
|
|
1087
1109
|
if tmpSiteSpec.minrss not in [0, None]:
|
|
1088
1110
|
site_minmemory = tmpSiteSpec.minrss
|
|
1089
|
-
if site_minmemory not in [0, None] and minRamCount
|
|
1111
|
+
if site_minmemory not in [0, None] and minRamCount and minRamCount < site_minmemory:
|
|
1090
1112
|
msg_map[tmpSiteSpec.get_unified_name()] = (
|
|
1091
1113
|
f" skip site={tmpSiteSpec.get_unified_name()} due to RAM lower limit greater than job's core-scaled requirement {minRamCount} MB criteria=-highmemory"
|
|
1092
1114
|
)
|
|
@@ -1117,7 +1139,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1117
1139
|
else:
|
|
1118
1140
|
maxSizePerJob //= 1024 * 1024
|
|
1119
1141
|
# size for direct IO sites
|
|
1120
|
-
minDiskCountR = tmpOutDiskSize * tmpEffAtomSize + tmpWorkDiskSize
|
|
1142
|
+
minDiskCountR: Any = tmpOutDiskSize * tmpEffAtomSize + tmpWorkDiskSize
|
|
1121
1143
|
minDiskCountR = minDiskCountR // 1024 // 1024
|
|
1122
1144
|
tmpLog.info(f"maxAtomSize={tmpMaxAtomSize} effectiveAtomSize={tmpEffAtomSize} outDiskCount={tmpOutDiskSize} workDiskSize={tmpWorkDiskSize}")
|
|
1123
1145
|
else:
|
|
@@ -1140,9 +1162,9 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1140
1162
|
# check disk space
|
|
1141
1163
|
if tmpSiteSpec.maxwdir:
|
|
1142
1164
|
if CoreUtils.use_direct_io_for_job(taskSpec, tmpSiteSpec, inputChunk):
|
|
1143
|
-
minDiskCount = minDiskCountR
|
|
1165
|
+
minDiskCount: Any = minDiskCountR
|
|
1144
1166
|
if maxSizePerJob is not None and not taskSpec.useLocalIO():
|
|
1145
|
-
tmpMinDiskCountR = tmpOutDiskSize * maxSizePerJob + tmpWorkDiskSize
|
|
1167
|
+
tmpMinDiskCountR: float = tmpOutDiskSize * maxSizePerJob + tmpWorkDiskSize
|
|
1146
1168
|
tmpMinDiskCountR /= 1024 * 1024
|
|
1147
1169
|
if tmpMinDiskCountR > minDiskCount:
|
|
1148
1170
|
minDiskCount = tmpMinDiskCountR
|
|
@@ -1221,8 +1243,10 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1221
1243
|
)
|
|
1222
1244
|
continue
|
|
1223
1245
|
# check if blacklisted
|
|
1224
|
-
|
|
1225
|
-
|
|
1246
|
+
blacklist_msg = AtlasBrokerUtils.check_endpoints_with_blacklist(
|
|
1247
|
+
tmpSiteSpec, scope_input, scope_output, sites_in_nucleus, remote_source_available
|
|
1248
|
+
)
|
|
1249
|
+
if blacklist_msg is not None:
|
|
1226
1250
|
msg_map[tmpSiteName] = f" skip site={tmpSiteName} since {tmpSiteSpec.ddm_output[scope_output]} is blacklisted in DDM criteria=-blacklist"
|
|
1227
1251
|
continue
|
|
1228
1252
|
# local quota
|
|
@@ -1248,8 +1272,9 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1248
1272
|
strMinWalltime = f"walltime*inputSize={taskSpec.walltime}*{tmpMaxAtomSize}"
|
|
1249
1273
|
else:
|
|
1250
1274
|
tmpMaxAtomSize = inputChunk.getMaxAtomSize(getNumEvents=True)
|
|
1251
|
-
|
|
1252
|
-
|
|
1275
|
+
cpu_time = taskSpec.getCpuTime()
|
|
1276
|
+
if cpu_time is not None:
|
|
1277
|
+
minWalltime = cpu_time * tmpMaxAtomSize
|
|
1253
1278
|
else:
|
|
1254
1279
|
minWalltime = None
|
|
1255
1280
|
strMinWalltime = f"cpuTime*nEventsPerJob={taskSpec.getCpuTime()}*{tmpMaxAtomSize}"
|
|
@@ -1259,14 +1284,15 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1259
1284
|
msg_map = {}
|
|
1260
1285
|
for tmpSiteName in scanSiteList:
|
|
1261
1286
|
tmpSiteSpec = self.siteMapper.getSite(tmpSiteName)
|
|
1262
|
-
|
|
1287
|
+
# a site with no maxtime imposes no ceiling, the same as 0 below and as in JobSplitter
|
|
1288
|
+
siteMaxTime: float = tmpSiteSpec.maxtime if tmpSiteSpec.maxtime is not None else 0
|
|
1263
1289
|
origSiteMaxTime = siteMaxTime
|
|
1264
1290
|
# check max walltime at the site
|
|
1265
1291
|
tmpSiteStr = f"{siteMaxTime}"
|
|
1266
1292
|
if taskSpec.useHS06():
|
|
1267
1293
|
oldSiteMaxTime = siteMaxTime
|
|
1268
|
-
siteMaxTime -=
|
|
1269
|
-
tmpSiteStr = f"({oldSiteMaxTime}-{
|
|
1294
|
+
siteMaxTime -= baseWalltime
|
|
1295
|
+
tmpSiteStr = f"({oldSiteMaxTime}-{baseWalltime})"
|
|
1270
1296
|
if siteMaxTime not in [None, 0] and tmpSiteSpec.coreCount not in [None, 0]:
|
|
1271
1297
|
siteMaxTime *= tmpSiteSpec.coreCount
|
|
1272
1298
|
tmpSiteStr += f"*{tmpSiteSpec.coreCount}"
|
|
@@ -1283,13 +1309,13 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1283
1309
|
msg_map[tmpSiteSpec.get_unified_name()] = tmpMsg
|
|
1284
1310
|
continue
|
|
1285
1311
|
# check min walltime at the site
|
|
1286
|
-
siteMinTime = tmpSiteSpec.mintime
|
|
1312
|
+
siteMinTime: float = tmpSiteSpec.mintime
|
|
1287
1313
|
origSiteMinTime = siteMinTime
|
|
1288
1314
|
tmpSiteStr = f"{siteMinTime}"
|
|
1289
1315
|
if taskSpec.useHS06():
|
|
1290
1316
|
oldSiteMinTime = siteMinTime
|
|
1291
|
-
siteMinTime -=
|
|
1292
|
-
tmpSiteStr = f"({oldSiteMinTime}-{
|
|
1317
|
+
siteMinTime -= baseWalltime
|
|
1318
|
+
tmpSiteStr = f"({oldSiteMinTime}-{baseWalltime})"
|
|
1293
1319
|
if siteMinTime not in [None, 0] and tmpSiteSpec.coreCount not in [None, 0]:
|
|
1294
1320
|
siteMinTime *= tmpSiteSpec.coreCount
|
|
1295
1321
|
tmpSiteStr += f"*{tmpSiteSpec.coreCount}"
|
|
@@ -1332,12 +1358,13 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1332
1358
|
msg_map = {}
|
|
1333
1359
|
for tmpSiteName in scanSiteList:
|
|
1334
1360
|
tmpSiteSpec = self.siteMapper.getSite(tmpSiteName)
|
|
1335
|
-
|
|
1361
|
+
# a site with no maxtime imposes no ceiling, the same as 0 below and as in JobSplitter
|
|
1362
|
+
siteMaxTime = tmpSiteSpec.maxtime if tmpSiteSpec.maxtime is not None else 0
|
|
1336
1363
|
tmpSiteStr = f"{siteMaxTime}"
|
|
1337
1364
|
if taskSpec.useHS06():
|
|
1338
1365
|
oldSiteMaxTime = siteMaxTime
|
|
1339
|
-
siteMaxTime -=
|
|
1340
|
-
tmpSiteStr = f"({oldSiteMaxTime}-{
|
|
1366
|
+
siteMaxTime -= baseWalltime
|
|
1367
|
+
tmpSiteStr = f"({oldSiteMaxTime}-{baseWalltime})"
|
|
1341
1368
|
if siteMaxTime not in [None, 0] and tmpSiteSpec.coreCount not in [None, 0]:
|
|
1342
1369
|
siteMaxTime *= tmpSiteSpec.coreCount
|
|
1343
1370
|
tmpSiteStr += f"*{tmpSiteSpec.coreCount}"
|
|
@@ -1567,7 +1594,9 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1567
1594
|
for jobStatus in ["defined", "assigned", "activated", "starting"]:
|
|
1568
1595
|
nQueue += AtlasBrokerUtils.getNumJobs(jobStatPrioMap, tmpSiteName, jobStatus, workQueue_tag=taskSpec.gshare)
|
|
1569
1596
|
# skip if overloaded
|
|
1570
|
-
|
|
1597
|
+
# grandRatio is None only when nothing is running in the share at all, in
|
|
1598
|
+
# which case every site takes the nRunning == 0 branch before the ratio is used
|
|
1599
|
+
if nQueue > minQueue and (nRunning == 0 or (grandRatio is not None and float(nQueue) / float(nRunning) > grandRatio * ratioOffset)):
|
|
1571
1600
|
tmpMsg = f" skip site={tmpSiteName} "
|
|
1572
1601
|
tmpMsg += f"nQueue>minQueue({minQueue}) and "
|
|
1573
1602
|
if nRunning == 0:
|
|
@@ -1746,7 +1775,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1746
1775
|
for tmpPseudoSiteName, error_diag in candidates_with_problems:
|
|
1747
1776
|
tmpSiteSpec = self.siteMapper.getSite(tmpPseudoSiteName)
|
|
1748
1777
|
msg_map[tmpSiteSpec.get_unified_name()] = (
|
|
1749
|
-
f" skip site={tmpSiteSpec.get_unified_name()} due to a temporary user-specific problem: {error_diag}
|
|
1778
|
+
f" skip site={tmpSiteSpec.get_unified_name()} due to a temporary user-specific problem: {error_diag} criteria=-tmp_user_problem"
|
|
1750
1779
|
)
|
|
1751
1780
|
self.add_summary_message(scanSiteList, [], "temp user problem check", tmpLog, msg_map)
|
|
1752
1781
|
self.dump_summary(tmpLog)
|
|
@@ -1757,7 +1786,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1757
1786
|
############
|
|
1758
1787
|
# loop end
|
|
1759
1788
|
overall_site_list.update(scanSiteList)
|
|
1760
|
-
if site_list_with_data
|
|
1789
|
+
if not site_list_with_data:
|
|
1761
1790
|
# preserve site list with data
|
|
1762
1791
|
site_list_with_data = set(scanSiteList)
|
|
1763
1792
|
if len(overall_site_list) >= taskSpec.getNumSitesPerJob():
|
|
@@ -1810,16 +1839,15 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1810
1839
|
if tmpAvFileMap is None:
|
|
1811
1840
|
raise Interaction.JEDITemporaryError("ddmIF.getAvailableFiles failed")
|
|
1812
1841
|
availableFileMap[datasetSpec.datasetName] = tmpAvFileMap
|
|
1813
|
-
except Exception:
|
|
1814
|
-
|
|
1815
|
-
tmpLog.error(f"failed to get available files with {errtype.__name__} {errvalue}")
|
|
1842
|
+
except Exception as e:
|
|
1843
|
+
tmpLog.error(f"failed to get available files with {type(e).__name__} {e}")
|
|
1816
1844
|
taskSpec.setErrDiag(tmpLog.uploadLog(taskSpec.jediTaskID))
|
|
1817
1845
|
return retTmpError
|
|
1818
1846
|
# make data weight
|
|
1819
1847
|
totalSize = 0
|
|
1820
1848
|
totalNumFiles = 0
|
|
1821
|
-
totalDiskSizeMap = dict()
|
|
1822
|
-
totalTapeSizeMap = dict()
|
|
1849
|
+
totalDiskSizeMap: dict[str, Any] = dict()
|
|
1850
|
+
totalTapeSizeMap: dict[str, Any] = dict()
|
|
1823
1851
|
for datasetSpec in inputChunk.getDatasets():
|
|
1824
1852
|
totalNumFiles += len(datasetSpec.Files)
|
|
1825
1853
|
for fileSpec in datasetSpec.Files:
|
|
@@ -1841,11 +1869,11 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1841
1869
|
######################################
|
|
1842
1870
|
# final procedure
|
|
1843
1871
|
tmpLog.info(f"{len(scanSiteList)} candidates for final check")
|
|
1844
|
-
weightMap = {}
|
|
1872
|
+
weightMap: dict[str, Any] = {}
|
|
1845
1873
|
weightStr = {}
|
|
1846
1874
|
candidateSpecList = []
|
|
1847
1875
|
preSiteCandidateSpec = None
|
|
1848
|
-
basic_weight_compar_map = {}
|
|
1876
|
+
basic_weight_compar_map: dict[str, Any] = {}
|
|
1849
1877
|
workerStat = self.taskBufferIF.ups_load_worker_stats()
|
|
1850
1878
|
for tmpPseudoSiteName in scanSiteList:
|
|
1851
1879
|
tmpSiteSpec = self.siteMapper.getSite(tmpPseudoSiteName)
|
|
@@ -1899,12 +1927,10 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
1899
1927
|
if isinstance(site_to_running_rate, dict):
|
|
1900
1928
|
site_to_running_rate = sum(site_to_running_rate.values())
|
|
1901
1929
|
except KeyError:
|
|
1902
|
-
to_running_rate_str = "0(unknown)"
|
|
1903
1930
|
to_running_rate = 0
|
|
1904
1931
|
else:
|
|
1905
1932
|
site_n_running = AtlasBrokerUtils.getNumJobs(jobStatPrioMap, tmpSiteName, "running")
|
|
1906
1933
|
to_running_rate = nRunning * site_to_running_rate / site_n_running if site_n_running > 0 else 0
|
|
1907
|
-
to_running_rate_str = f"{to_running_rate:.3f}"
|
|
1908
1934
|
# site class value; by default mid-class (= 0) if unclassified
|
|
1909
1935
|
site_class_value = analy_sites_class_dict.get(tmpSiteName, 0)
|
|
1910
1936
|
site_class_value = 0 if site_class_value is None else site_class_value
|
|
@@ -2049,7 +2075,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
2049
2075
|
# main weight, for User Analysis, determined by number of jobs to submit to each site class
|
|
2050
2076
|
main_weight_site_class_dict = {1: weight_epsilon_init, 0: weight_epsilon_init, -1: weight_epsilon_init}
|
|
2051
2077
|
if taskSpec.gshare in ["User Analysis", "Express Analysis"]:
|
|
2052
|
-
n_jobs_to_submit_rem = min(n_jobs_to_submit, total_rem_q_len)
|
|
2078
|
+
n_jobs_to_submit_rem: float = min(n_jobs_to_submit, total_rem_q_len)
|
|
2053
2079
|
if task_class_value == -1:
|
|
2054
2080
|
# C-task
|
|
2055
2081
|
main_weight_site_class_dict[-1] = n_jobs_to_submit_rem
|
|
@@ -2076,11 +2102,11 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
2076
2102
|
for site in weight_comparison_avail_sites:
|
|
2077
2103
|
bw_map = basic_weight_compar_map[site]
|
|
2078
2104
|
# main weight by site & task class for User Analysis, and constant for group shares
|
|
2079
|
-
nbw_main = n_jobs_to_submit
|
|
2105
|
+
nbw_main: float = n_jobs_to_submit
|
|
2080
2106
|
if taskSpec.gshare in ["User Analysis", "Express Analysis"]:
|
|
2081
2107
|
nbw_main = main_weight_site_class_dict[bw_map["class"]]
|
|
2082
2108
|
# secondary weight proportional to remaining queue length
|
|
2083
|
-
nbw_sec = 1
|
|
2109
|
+
nbw_sec: float = 1
|
|
2084
2110
|
if taskSpec.gshare in ["User Analysis", "Express Analysis"]:
|
|
2085
2111
|
_nbw_numer = max(bw_map["rem_q_len"] - nbw_main / site_class_n_site_dict[bw_map["class"]], nbw_main * 0.001)
|
|
2086
2112
|
reduced_site_class_rem_q_len = site_class_rem_q_len_dict[bw_map["class"]] - nbw_main
|
|
@@ -2180,7 +2206,7 @@ class AtlasAnalJobBroker(JobBrokerBase):
|
|
|
2180
2206
|
taskSpec.gshare, (" merging," if inputChunk.isMerging else ""), task_class_value, n_jobs_to_submit, "\n".join(prt_str_list)
|
|
2181
2207
|
)
|
|
2182
2208
|
)
|
|
2183
|
-
except Exception
|
|
2209
|
+
except Exception:
|
|
2184
2210
|
tmpLog.error(f"{traceback.format_exc()}")
|
|
2185
2211
|
# choose basic weight
|
|
2186
2212
|
_basic_weight_version = "new"
|