rucio 32.5.1__tar.gz → 32.6.0.post1__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.
Potentially problematic release.
This version of rucio might be problematic. Click here for more details.
- {rucio-32.5.1 → rucio-32.6.0.post1}/PKG-INFO +1 -1
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/replica.py +24 -14
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/config.py +4 -4
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/did.py +16 -14
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/did_meta_plugins/filter_engine.py +3 -1
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/request.py +26 -49
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/rse.py +5 -6
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/topology.py +9 -5
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/transfer.py +44 -1
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/finisher.py +21 -14
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/poller.py +13 -1
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/receiver.py +2 -2
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/transfertool/fts3.py +1 -7
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/transfertool/globus.py +0 -11
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/transfertool/mock.py +0 -3
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/transfertool/transfertool.py +4 -6
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/vcsversion.py +3 -3
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_bad_replica.py +3 -3
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_conveyor.py +6 -9
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_did.py +3 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_reaper.py +2 -1
- {rucio-32.5.1 → rucio-32.6.0.post1}/AUTHORS.rst +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/ChangeLog +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/LICENSE +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/MANIFEST.in +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/README.rst +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-abacus-account +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-abacus-collection-replica +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-abacus-rse +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-admin +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-atropos +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-auditor +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-automatix +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-bb8 +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-c3po +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-cache-client +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-cache-consumer +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-conveyor-finisher +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-conveyor-poller +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-conveyor-preparer +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-conveyor-receiver +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-conveyor-stager +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-conveyor-submitter +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-conveyor-throttler +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-dark-reaper +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-dumper +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-follower +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-hermes +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-judge-cleaner +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-judge-evaluator +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-judge-injector +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-judge-repairer +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-kronos +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-light-reaper +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-minos +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-minos-temporary-expiration +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-necromancer +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-oauth-manager +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-reaper +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-replica-recoverer +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-storage-consistency-actions +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-transmogrifier +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-undertaker +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/etc/alembic.ini.template +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/etc/alembic_offline.ini.template +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/etc/globus-config.yml.template +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/etc/ldap.cfg.template +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/etc/rse-accounts.cfg.template +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/etc/rucio.cfg.template +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/etc/rucio_multi_vo.cfg.template +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/alembicrevision.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/account.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/account_limit.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/authentication.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/config.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/credential.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/did.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/dirac.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/exporter.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/heartbeat.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/identity.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/importer.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/lifetime_exception.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/lock.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/meta.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/permission.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/quarantined_replica.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/request.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/rse.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/rule.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/scope.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/subscription.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/temporary_did.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/vo.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/accountclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/accountlimitclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/baseclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/client.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/configclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/credentialclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/didclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/diracclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/downloadclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/exportclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/fileclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/importclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/lifetimeclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/lockclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/metaclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/pingclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/replicaclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/requestclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/rseclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/ruleclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/scopeclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/subscriptionclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/touchclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/uploadclient.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/cache.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/constants.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/constraints.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/didtype.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/dumper/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/dumper/consistency.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/dumper/data_models.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/dumper/path_parsing.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/exception.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/extra.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/logging.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/pcache.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/policy.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/atlas.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/belleii.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/cms.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/domatpc.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/escape.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/generic.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/generic_multi_vo.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/icecube.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/lsst.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/stomp_utils.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/stopwatch.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/test_rucio_server.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/types.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/utils.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/account.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/account_counter.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/account_limit.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/authentication.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/config.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/credential.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/did_meta_plugins/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/did_meta_plugins/did_column_meta.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/did_meta_plugins/did_meta_plugin_interface.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/did_meta_plugins/json_meta.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/did_meta_plugins/mongo_meta.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/did_meta_plugins/postgres_meta.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/dirac.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/distance.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/exporter.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/heartbeat.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/identity.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/importer.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/lifetime_exception.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/lock.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/message.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/meta.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/monitor.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/naming_convention.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/nongrid_trace.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/oidc.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/permission/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/permission/atlas.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/permission/belleii.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/permission/cms.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/permission/escape.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/permission/generic.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/permission/generic_multi_vo.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/quarantined_replica.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/replica.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/replica_sorter.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/rse_counter.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/rse_expression_parser.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/rse_selector.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/rule.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/rule_grouping.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/scope.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/subscription.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/temporary_did.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/trace.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/vo.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/volatile_replica.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/abacus/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/abacus/account.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/abacus/collection_replica.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/abacus/rse.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/atropos/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/atropos/atropos.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/auditor/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/auditor/hdfs.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/auditor/srmdumps.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/automatix/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/automatix/automatix.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/badreplicas/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/badreplicas/minos.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/badreplicas/minos_temporary_expiration.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/badreplicas/necromancer.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/bb8/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/bb8/bb8.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/bb8/common.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/bb8/nuclei_background_rebalance.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/bb8/t2_background_rebalance.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/algorithms/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/algorithms/simple.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/algorithms/t2_free_space.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/c3po.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/collectors/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/collectors/agis.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/collectors/free_space.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/collectors/jedi_did.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/collectors/mock_did.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/collectors/network_metrics.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/collectors/workload.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/utils/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/utils/dataset_cache.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/utils/expiring_dataset_cache.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/utils/expiring_list.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/utils/popularity.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/utils/timeseries.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/cache/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/cache/consumer.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/common.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/common.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/preparer.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/stager.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/submitter.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/throttler.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/follower/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/follower/follower.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/hermes/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/hermes/hermes.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/judge/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/judge/cleaner.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/judge/evaluator.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/judge/injector.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/judge/repairer.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/oauthmanager/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/oauthmanager/oauthmanager.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/reaper/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/reaper/dark_reaper.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/reaper/light_reaper.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/reaper/reaper.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/replicarecoverer/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/storage/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/storage/consistency/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/storage/consistency/actions.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/tracer/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/tracer/kronos.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/transmogrifier/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/transmogrifier/transmogrifier.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/undertaker/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/undertaker/undertaker.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/constants.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/env.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/models.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/sautils.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/session.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/types.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/util.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/cache.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/dummy.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/gfal.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/globus.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/gsiftp.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/http_cache.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/mock.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/ngarc.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/posix.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/protocol.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/rclone.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/rfio.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/srm.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/ssh.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/storm.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/webdav.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/xrootd.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/rsemanager.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/tests/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/tests/common.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/tests/common_server.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/transfertool/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/transfertool/globus_library.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/version.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/authenticated_bp.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/__init__.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/accountlimits.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/accounts.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/archives.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/auth.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/common.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/config.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/credentials.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/dids.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/dirac.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/export.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/heartbeats.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/identities.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/import.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/locks.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/main.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/meta.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/metrics.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/nongrid_traces.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/ping.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/redirect.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/replicas.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/requests.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/rses.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/rules.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/scopes.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/subscriptions.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/templates/auth_crash.html +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/templates/auth_granted.html +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/tmp_dids.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/traces.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/vos.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/main.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/metrics.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio.egg-info/SOURCES.txt +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/pylintrc +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/pyproject.toml +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/requirements.txt +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/setup.cfg +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/setup.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/setuputil.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_abacus_account.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_abacus_collection_replica.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_abacus_rse.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_account.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_account_limits.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_api_external_representation.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_archive.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_auditor.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_auditor_hdfs.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_auditor_srmdumps.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_authentication.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_automatix.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_bb8.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_belleii.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_bin_rucio.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_boolean.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_clients.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_common_types.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_config.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_conveyor_submitter.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_counter.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_credential.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_curl.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_daemons.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_dataset_replicas.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_db.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_did_meta_plugins.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_didtype.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_download.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_dumper.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_dumper_consistency.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_dumper_data_model.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_dumper_path_parsing.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_filter_engine.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_heartbeat.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_hermes.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_identity.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_impl_upload_download.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_import_export.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_judge_cleaner.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_judge_evaluator.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_judge_injector.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_judge_repairer.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_lifetime.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_message.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_meta.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_meta_did.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_module_import.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_monitor.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_multi_vo.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_naming_convention.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_oauthmanager.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_oidc.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_permission.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_pfns.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_ping.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_preparer.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_qos.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_quarantined_replica.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_redirect.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_replica.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_replica_recoverer.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_replica_sorting.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_request.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_root_proxy.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_expression_parser.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_lfn2path.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_gfal2.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_gfal2_impl.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_posix.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_rclone.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_rsync.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_srm.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_ssh.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_webdav.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_xrootd.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_selector.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rucio_server.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rule.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_schema_cms.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_scope.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_subscription.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_temporary_did.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_throttler.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_tpc.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_trace.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_transfer.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_undertaker.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_upload.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_utils.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tools/bootstrap.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tools/merge_rucio_configs.py +0 -0
- {rucio-32.5.1 → rucio-32.6.0.post1}/tools/reset_database.py +0 -0
|
@@ -14,7 +14,6 @@
|
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
16
|
import datetime
|
|
17
|
-
import uuid
|
|
18
17
|
from typing import TYPE_CHECKING
|
|
19
18
|
|
|
20
19
|
from rucio.api import permission
|
|
@@ -85,21 +84,23 @@ def declare_bad_file_replicas(replicas, reason, issuer, vo='def', force=False, *
|
|
|
85
84
|
if not replicas:
|
|
86
85
|
return {}
|
|
87
86
|
|
|
88
|
-
|
|
89
|
-
rse_map = {} # RSE name -> RSE id
|
|
90
|
-
if not permission.has_permission(issuer=issuer, vo=vo, action='declare_bad_file_replicas', kwargs=kwargs, session=session):
|
|
91
|
-
raise exception.AccessDenied('Account %s can not declare bad replicas' % (issuer))
|
|
92
|
-
|
|
93
|
-
issuer = InternalAccount(issuer, vo=vo)
|
|
87
|
+
as_pfns = isinstance(replicas[0], str)
|
|
94
88
|
|
|
95
89
|
# make sure all elements are either strings or dicts, without mixing
|
|
96
|
-
|
|
97
|
-
if any(not isinstance(r, type_) for r in replicas):
|
|
90
|
+
if any(isinstance(r, str) != as_pfns for r in replicas):
|
|
98
91
|
raise exception.InvalidType('The replicas must be specified either as a list of PFNs (strings) or list of dicts')
|
|
99
92
|
|
|
93
|
+
rse_map = {} # RSE name -> RSE id
|
|
94
|
+
|
|
100
95
|
replicas_lst = replicas
|
|
101
|
-
|
|
102
|
-
|
|
96
|
+
rse_ids_to_check = set() # to check for permission to declare bad replicas
|
|
97
|
+
if as_pfns:
|
|
98
|
+
scheme, rses_for_replicas, unknowns = replica.get_pfn_to_rse(replicas, vo=vo, session=session)
|
|
99
|
+
if unknowns:
|
|
100
|
+
raise exception.ReplicaNotFound("Not all replicas found")
|
|
101
|
+
rse_ids_to_check = set(rses_for_replicas.keys())
|
|
102
|
+
else:
|
|
103
|
+
replicas_lst = []
|
|
103
104
|
for r in replicas:
|
|
104
105
|
if "name" not in r or "scope" not in r or ("rse" not in r and "rse_id" not in r):
|
|
105
106
|
raise exception.InvalidType('The replica dictionary must include scope and either rse (name) or rse_id')
|
|
@@ -109,14 +110,24 @@ def declare_bad_file_replicas(replicas, reason, issuer, vo='def', force=False, *
|
|
|
109
110
|
rse = r["rse"]
|
|
110
111
|
rse_map[rse] = rse_id = get_rse_id(rse=rse, vo=vo, session=session)
|
|
111
112
|
replicas_lst.append({
|
|
112
|
-
"scope": scope,
|
|
113
113
|
"rse_id": rse_id,
|
|
114
|
+
"scope": scope,
|
|
114
115
|
"name": r["name"]
|
|
115
116
|
})
|
|
117
|
+
rse_ids_to_check.add(rse_id)
|
|
116
118
|
|
|
117
119
|
rse_id_to_name = invert_dict(rse_map) # RSE id -> RSE name
|
|
118
120
|
|
|
119
|
-
|
|
121
|
+
for rse_id in rse_ids_to_check:
|
|
122
|
+
if not permission.has_permission(issuer=issuer, vo=vo, action='declare_bad_file_replicas',
|
|
123
|
+
kwargs={"rse_id": rse_id},
|
|
124
|
+
session=session):
|
|
125
|
+
raise exception.AccessDenied('Account %s can not declare bad replicas in RSE %s' %
|
|
126
|
+
(issuer, rse_id_to_name.get(rse_id, rse_id)))
|
|
127
|
+
|
|
128
|
+
undeclared = replica.declare_bad_file_replicas(replicas_lst, reason=reason,
|
|
129
|
+
issuer=InternalAccount(issuer, vo=vo),
|
|
130
|
+
status=BadFilesStatus.BAD,
|
|
120
131
|
force=force, session=session)
|
|
121
132
|
out = {}
|
|
122
133
|
for rse_id, ulist in undeclared.items():
|
|
@@ -128,7 +139,6 @@ def declare_bad_file_replicas(replicas, reason, issuer, vo='def', force=False, *
|
|
|
128
139
|
rse_name = rse_id_to_name[rse_id]
|
|
129
140
|
else:
|
|
130
141
|
try:
|
|
131
|
-
uuid.UUID(rse_id)
|
|
132
142
|
rse_name = get_rse_name(rse_id=rse_id, session=session)
|
|
133
143
|
except (ValueError, exception.RSENotFound):
|
|
134
144
|
rse_name = str(rse_id)
|
|
@@ -347,7 +347,7 @@ def config_get_int(
|
|
|
347
347
|
default=default,
|
|
348
348
|
check_config_table=check_config_table,
|
|
349
349
|
session=session,
|
|
350
|
-
use_cache=
|
|
350
|
+
use_cache=use_cache,
|
|
351
351
|
expiration_time=expiration_time,
|
|
352
352
|
convert_type_fnc=int,
|
|
353
353
|
)
|
|
@@ -434,7 +434,7 @@ def config_get_float(
|
|
|
434
434
|
default=default,
|
|
435
435
|
check_config_table=check_config_table,
|
|
436
436
|
session=session,
|
|
437
|
-
use_cache=
|
|
437
|
+
use_cache=use_cache,
|
|
438
438
|
expiration_time=expiration_time,
|
|
439
439
|
convert_type_fnc=float,
|
|
440
440
|
)
|
|
@@ -521,7 +521,7 @@ def config_get_bool(
|
|
|
521
521
|
default=default,
|
|
522
522
|
check_config_table=check_config_table,
|
|
523
523
|
session=session,
|
|
524
|
-
use_cache=
|
|
524
|
+
use_cache=use_cache,
|
|
525
525
|
expiration_time=expiration_time,
|
|
526
526
|
convert_type_fnc=_convert_to_boolean,
|
|
527
527
|
)
|
|
@@ -608,7 +608,7 @@ def config_get_list(
|
|
|
608
608
|
default=default,
|
|
609
609
|
check_config_table=check_config_table,
|
|
610
610
|
session=session,
|
|
611
|
-
use_cache=
|
|
611
|
+
use_cache=use_cache,
|
|
612
612
|
expiration_time=expiration_time,
|
|
613
613
|
)
|
|
614
614
|
if isinstance(value, str):
|
|
@@ -1655,20 +1655,22 @@ def list_content(scope, name, *, session: "Session"):
|
|
|
1655
1655
|
:param name: The data identifier name.
|
|
1656
1656
|
:param session: The database session in use.
|
|
1657
1657
|
"""
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1658
|
+
stmt = select(
|
|
1659
|
+
models.DataIdentifierAssociation
|
|
1660
|
+
).with_hint(
|
|
1661
|
+
models.DataIdentifierAssociation, "INDEX(CONTENTS CONTENTS_PK)", 'oracle'
|
|
1662
|
+
).filter_by(
|
|
1663
|
+
scope=scope,
|
|
1664
|
+
name=name
|
|
1665
|
+
)
|
|
1666
|
+
children_found = False
|
|
1667
|
+
for tmp_did in session.execute(stmt).yield_per(5).scalars():
|
|
1668
|
+
children_found = True
|
|
1669
|
+
yield {'scope': tmp_did.child_scope, 'name': tmp_did.child_name, 'type': tmp_did.child_type,
|
|
1670
|
+
'bytes': tmp_did.bytes, 'adler32': tmp_did.adler32, 'md5': tmp_did.md5}
|
|
1671
|
+
if not children_found:
|
|
1672
|
+
# Raise exception if the did doesn't exist
|
|
1673
|
+
__get_did(scope=scope, name=name, session=session)
|
|
1672
1674
|
|
|
1673
1675
|
|
|
1674
1676
|
@stream_session
|
|
@@ -265,7 +265,9 @@ class FilterEngine:
|
|
|
265
265
|
else:
|
|
266
266
|
return value
|
|
267
267
|
try:
|
|
268
|
-
|
|
268
|
+
operators = ('+', '-', '*', '/')
|
|
269
|
+
if not any(operator in value for operator in operators): # fix for lax ast literal_eval in earlier python versions
|
|
270
|
+
value = ast.literal_eval(value) # will catch float, int and bool
|
|
269
271
|
except (ValueError, SyntaxError):
|
|
270
272
|
pass
|
|
271
273
|
return value
|
|
@@ -621,16 +621,17 @@ def fetch_paths(request_id, *, session: "Session"):
|
|
|
621
621
|
@METRICS.time_it
|
|
622
622
|
@transactional_session
|
|
623
623
|
def get_and_mark_next(
|
|
624
|
+
rse_collection: "RseCollection",
|
|
624
625
|
request_type,
|
|
625
626
|
state,
|
|
626
627
|
processed_by: Optional[str] = None,
|
|
627
628
|
processed_at_delay: int = 600,
|
|
628
|
-
limit=100,
|
|
629
|
-
older_than=None,
|
|
630
|
-
rse_id=None,
|
|
631
|
-
activity=None,
|
|
632
|
-
total_workers=0,
|
|
633
|
-
worker_number=0,
|
|
629
|
+
limit: int = 100,
|
|
630
|
+
older_than: "Optional[datetime.datetime]" = None,
|
|
631
|
+
rse_id: "Optional[str]" = None,
|
|
632
|
+
activity: "Optional[str]" = None,
|
|
633
|
+
total_workers: int = 0,
|
|
634
|
+
worker_number: int = 0,
|
|
634
635
|
mode_all=False,
|
|
635
636
|
hash_variable='id',
|
|
636
637
|
activity_shares=None,
|
|
@@ -643,6 +644,7 @@ def get_and_mark_next(
|
|
|
643
644
|
Retrieve the next requests matching the request type and state.
|
|
644
645
|
Workers are balanced via hashing to reduce concurrency on database.
|
|
645
646
|
|
|
647
|
+
:param rse_collection: the RSE collection being used
|
|
646
648
|
:param request_type: Type of the request as a string or list of strings.
|
|
647
649
|
:param state: State of the request as a string or list of strings.
|
|
648
650
|
:param processed_by: the daemon/executable running this query
|
|
@@ -682,7 +684,7 @@ def get_and_mark_next(
|
|
|
682
684
|
for share in activity_shares:
|
|
683
685
|
|
|
684
686
|
query = select(
|
|
685
|
-
models.Request
|
|
687
|
+
models.Request.id
|
|
686
688
|
).where(
|
|
687
689
|
models.Request.state.in_(state),
|
|
688
690
|
models.Request.request_type.in_(request_type)
|
|
@@ -738,6 +740,21 @@ def get_and_mark_next(
|
|
|
738
740
|
else:
|
|
739
741
|
query = query.limit(limit)
|
|
740
742
|
|
|
743
|
+
if session.bind.dialect.name == 'oracle':
|
|
744
|
+
query = select(
|
|
745
|
+
models.Request
|
|
746
|
+
).where(
|
|
747
|
+
models.Request.id.in_(query)
|
|
748
|
+
).with_for_update(
|
|
749
|
+
skip_locked=True
|
|
750
|
+
)
|
|
751
|
+
else:
|
|
752
|
+
query = query.with_only_columns(
|
|
753
|
+
models.Request
|
|
754
|
+
).with_for_update(
|
|
755
|
+
skip_locked=True,
|
|
756
|
+
of=models.Request.last_processed_by
|
|
757
|
+
)
|
|
741
758
|
query_result = session.execute(query).scalars()
|
|
742
759
|
if query_result:
|
|
743
760
|
if mode_all:
|
|
@@ -748,8 +765,8 @@ def get_and_mark_next(
|
|
|
748
765
|
|
|
749
766
|
dst_id = res_dict['dest_rse_id']
|
|
750
767
|
src_id = res_dict['source_rse_id']
|
|
751
|
-
res_dict['
|
|
752
|
-
res_dict['
|
|
768
|
+
res_dict['dst_rse'] = rse_collection[dst_id].ensure_loaded(load_name=True)
|
|
769
|
+
res_dict['src_rse'] = rse_collection[src_id].ensure_loaded(load_name=True) if src_id is not None else None
|
|
753
770
|
|
|
754
771
|
result.append(res_dict)
|
|
755
772
|
else:
|
|
@@ -2018,46 +2035,6 @@ def update_requests_priority(priority, filter_, *, session: "Session", logger=lo
|
|
|
2018
2035
|
raise RucioException(error.args)
|
|
2019
2036
|
|
|
2020
2037
|
|
|
2021
|
-
@transactional_session
|
|
2022
|
-
def update_request_state(tt_status_report, *, session: "Session", logger=logging.log):
|
|
2023
|
-
"""
|
|
2024
|
-
Used by poller and consumer to update the internal state of requests,
|
|
2025
|
-
after the response by the external transfertool.
|
|
2026
|
-
|
|
2027
|
-
:param tt_status_report: The transfertool status update, retrieved via request.query_request().
|
|
2028
|
-
:param session: The database session to use.
|
|
2029
|
-
:param logger: Optional decorated logger that can be passed from the calling daemons or servers.
|
|
2030
|
-
:returns commit_or_rollback: Boolean.
|
|
2031
|
-
"""
|
|
2032
|
-
|
|
2033
|
-
request_id = tt_status_report.request_id
|
|
2034
|
-
try:
|
|
2035
|
-
fields_to_update = tt_status_report.get_db_fields_to_update(session=session, logger=logger)
|
|
2036
|
-
if not fields_to_update:
|
|
2037
|
-
update_request(request_id, raise_on_missing=True, session=session)
|
|
2038
|
-
return False
|
|
2039
|
-
else:
|
|
2040
|
-
logger(logging.INFO, 'UPDATING REQUEST %s FOR %s with changes: %s' % (str(request_id), tt_status_report, fields_to_update))
|
|
2041
|
-
|
|
2042
|
-
set_request_state(request_id, session=session, **fields_to_update)
|
|
2043
|
-
request = tt_status_report.request(session)
|
|
2044
|
-
|
|
2045
|
-
if tt_status_report.state == RequestState.FAILED:
|
|
2046
|
-
if is_intermediate_hop(request):
|
|
2047
|
-
handle_failed_intermediate_hop(request, session=session)
|
|
2048
|
-
|
|
2049
|
-
add_monitor_message(new_state=tt_status_report.state,
|
|
2050
|
-
request=request,
|
|
2051
|
-
additional_fields=tt_status_report.get_monitor_msg_fields(session=session, logger=logger),
|
|
2052
|
-
session=session)
|
|
2053
|
-
return True
|
|
2054
|
-
except UnsupportedOperation as error:
|
|
2055
|
-
logger(logging.WARNING, "Request %s doesn't exist - Error: %s" % (request_id, str(error).replace('\n', '')))
|
|
2056
|
-
return False
|
|
2057
|
-
except Exception:
|
|
2058
|
-
logger(logging.CRITICAL, "Exception", exc_info=True)
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
2038
|
@read_session
|
|
2062
2039
|
def add_monitor_message(new_state, request, additional_fields, *, session: "Session"):
|
|
2063
2040
|
"""
|
|
@@ -29,7 +29,7 @@ from sqlalchemy.sql.expression import or_, and_, desc, true, false, func, select
|
|
|
29
29
|
|
|
30
30
|
from rucio.common import exception, utils
|
|
31
31
|
from rucio.common.cache import make_region_memcached
|
|
32
|
-
from rucio.common.config import get_lfn2pfn_algorithm_default
|
|
32
|
+
from rucio.common.config import get_lfn2pfn_algorithm_default
|
|
33
33
|
from rucio.common import types
|
|
34
34
|
from rucio.common.utils import CHECKSUM_KEY, GLOBALLY_SUPPORTED_CHECKSUMS, Availability
|
|
35
35
|
from rucio.core.rse_counter import add_counter, get_counter
|
|
@@ -159,8 +159,7 @@ class RseData:
|
|
|
159
159
|
Given a dict of RseData objects indexed by rse_id, ensure that the desired fields are initialised
|
|
160
160
|
in all objects from the input.
|
|
161
161
|
"""
|
|
162
|
-
|
|
163
|
-
if not use_temp_tables or len(rse_id_to_data) < 4:
|
|
162
|
+
if len(rse_id_to_data) < 4: # 4 was selected without particular reason as "seems good enough"
|
|
164
163
|
for rse_data in rse_id_to_data.values():
|
|
165
164
|
rse_data.ensure_loaded(
|
|
166
165
|
load_name=load_name,
|
|
@@ -224,7 +223,7 @@ class RseData:
|
|
|
224
223
|
session=session))
|
|
225
224
|
for rse_id, db_rse in db_rses_by_id.items():
|
|
226
225
|
rse_data = rse_id_to_data[rse_id]
|
|
227
|
-
settings = rse_data._attributes if rse_data._attributes is not None else settings_by_id
|
|
226
|
+
settings = rse_data._attributes if rse_data._attributes is not None else settings_by_id.get(rse_id, {})
|
|
228
227
|
columns = _format_get_rse(db_rse=db_rse, rse_attributes=settings, session=session)
|
|
229
228
|
rse_data._columns = columns
|
|
230
229
|
rse_data._name = columns['rse']
|
|
@@ -281,8 +280,8 @@ class RseData:
|
|
|
281
280
|
if load_name:
|
|
282
281
|
# The name could have been loaded already (when loading columns or info). Skip loading if it's known.
|
|
283
282
|
if not load_columns and not load_info:
|
|
284
|
-
for rse_id
|
|
285
|
-
|
|
283
|
+
for rse_id in rse_ids_to_load:
|
|
284
|
+
rse_id_to_data[rse_id]._name = db_rses_by_id[rse_id].rse
|
|
286
285
|
|
|
287
286
|
|
|
288
287
|
class RseCollection(Generic[T]):
|
|
@@ -18,6 +18,7 @@ import logging
|
|
|
18
18
|
import threading
|
|
19
19
|
import weakref
|
|
20
20
|
from collections.abc import Callable, Iterable, Iterator
|
|
21
|
+
from decimal import Decimal
|
|
21
22
|
from typing import TYPE_CHECKING, cast, Any, Generic, Optional, TypeVar, Union
|
|
22
23
|
|
|
23
24
|
from sqlalchemy import and_, select
|
|
@@ -32,7 +33,7 @@ from rucio.db.sqla.session import read_session, transactional_session
|
|
|
32
33
|
from rucio.rse import rsemanager as rsemgr
|
|
33
34
|
|
|
34
35
|
LoggerFunction = Callable[..., Any]
|
|
35
|
-
_Number = Union[
|
|
36
|
+
_Number = Union[int, Decimal]
|
|
36
37
|
TN = TypeVar("TN", bound="Node")
|
|
37
38
|
TE = TypeVar("TE", bound="Edge")
|
|
38
39
|
|
|
@@ -50,6 +51,9 @@ if TYPE_CHECKING:
|
|
|
50
51
|
def enabled(self) -> bool:
|
|
51
52
|
...
|
|
52
53
|
|
|
54
|
+
TNState = TypeVar("TNState", bound=_StateProvider)
|
|
55
|
+
TEState = TypeVar("TEState", bound=_StateProvider)
|
|
56
|
+
|
|
53
57
|
|
|
54
58
|
DEFAULT_HOP_PENALTY = 10
|
|
55
59
|
INF = float('inf')
|
|
@@ -344,9 +348,9 @@ class Topology(RseCollection, Generic[TN, TE]):
|
|
|
344
348
|
self,
|
|
345
349
|
dst_node: TN,
|
|
346
350
|
nodes_to_find: Optional[set[TN]] = None,
|
|
347
|
-
node_state_provider: "Callable[[TN],
|
|
348
|
-
edge_state_provider: "Callable[[TE],
|
|
349
|
-
) -> "Iterator[tuple[TN, _Number,
|
|
351
|
+
node_state_provider: "Callable[[TN], TNState]" = lambda x: x,
|
|
352
|
+
edge_state_provider: "Callable[[TE], TEState]" = lambda x: x,
|
|
353
|
+
) -> "Iterator[tuple[TN, _Number, TNState, TE, TEState]]":
|
|
350
354
|
"""
|
|
351
355
|
Does a Backwards Dijkstra's algorithm: start from destination and follow inbound links to other nodes.
|
|
352
356
|
If multihop is disabled, stop after analysing direct connections to dest_rse.
|
|
@@ -358,7 +362,7 @@ class Topology(RseCollection, Generic[TN, TE]):
|
|
|
358
362
|
|
|
359
363
|
priority_q = PriorityQueue()
|
|
360
364
|
priority_q[dst_node] = 0
|
|
361
|
-
next_hops: dict[TN, tuple[_Number,
|
|
365
|
+
next_hops: dict[TN, tuple[_Number, TNState, Optional[TE], Optional[TEState]]] =\
|
|
362
366
|
{dst_node: (0, node_state_provider(dst_node), None, None)}
|
|
363
367
|
while priority_q:
|
|
364
368
|
node = priority_q.pop()
|
|
@@ -30,7 +30,7 @@ from rucio.common.config import config_get
|
|
|
30
30
|
from rucio.common.constants import SUPPORTED_PROTOCOLS
|
|
31
31
|
from rucio.common.exception import (InvalidRSEExpression,
|
|
32
32
|
RequestNotFound, RSEProtocolNotSupported,
|
|
33
|
-
RucioException)
|
|
33
|
+
RucioException, UnsupportedOperation)
|
|
34
34
|
from rucio.common.utils import construct_surl
|
|
35
35
|
from rucio.core import did, message as message_core, request as request_core
|
|
36
36
|
from rucio.core.account import list_accounts
|
|
@@ -42,6 +42,7 @@ from rucio.db.sqla import models
|
|
|
42
42
|
from rucio.db.sqla.constants import DIDType, RequestState, RequestType, TransferLimitDirection
|
|
43
43
|
from rucio.db.sqla.session import read_session, transactional_session, stream_session
|
|
44
44
|
from rucio.rse import rsemanager as rsemgr
|
|
45
|
+
from rucio.transfertool.transfertool import TransferStatusReport
|
|
45
46
|
from rucio.transfertool.fts3 import FTS3Transfertool
|
|
46
47
|
from rucio.transfertool.globus import GlobusTransferTool
|
|
47
48
|
from rucio.transfertool.mock import MockTransfertool
|
|
@@ -500,6 +501,48 @@ def set_transfers_state(
|
|
|
500
501
|
logger(logging.DEBUG, 'Finished to register transfer state for %s' % external_id)
|
|
501
502
|
|
|
502
503
|
|
|
504
|
+
@transactional_session
|
|
505
|
+
def update_transfer_state(tt_status_report: TransferStatusReport, *, session: "Session", logger=logging.log):
|
|
506
|
+
"""
|
|
507
|
+
Used by poller and consumer to update the internal state of requests,
|
|
508
|
+
after the response by the external transfertool.
|
|
509
|
+
|
|
510
|
+
:param tt_status_report: The transfertool status update, retrieved via request.query_request().
|
|
511
|
+
:param session: The database session to use.
|
|
512
|
+
:param logger: Optional decorated logger that can be passed from the calling daemons or servers.
|
|
513
|
+
:returns commit_or_rollback: Boolean.
|
|
514
|
+
"""
|
|
515
|
+
|
|
516
|
+
request_id = tt_status_report.request_id
|
|
517
|
+
try:
|
|
518
|
+
fields_to_update = tt_status_report.get_db_fields_to_update(session=session, logger=logger)
|
|
519
|
+
if not fields_to_update:
|
|
520
|
+
request_core.update_request(request_id, raise_on_missing=True, session=session)
|
|
521
|
+
return False
|
|
522
|
+
else:
|
|
523
|
+
logger(logging.INFO, 'UPDATING REQUEST %s FOR %s with changes: %s' % (str(request_id), tt_status_report, fields_to_update))
|
|
524
|
+
|
|
525
|
+
set_request_state(request_id, session=session, **fields_to_update)
|
|
526
|
+
request = tt_status_report.request(session)
|
|
527
|
+
|
|
528
|
+
if tt_status_report.state == RequestState.FAILED:
|
|
529
|
+
if request_core.is_intermediate_hop(request):
|
|
530
|
+
request_core.handle_failed_intermediate_hop(request, session=session)
|
|
531
|
+
|
|
532
|
+
request_core.add_monitor_message(
|
|
533
|
+
new_state=tt_status_report.state,
|
|
534
|
+
request=request,
|
|
535
|
+
additional_fields=tt_status_report.get_monitor_msg_fields(session=session, logger=logger),
|
|
536
|
+
session=session
|
|
537
|
+
)
|
|
538
|
+
return True
|
|
539
|
+
except UnsupportedOperation as error:
|
|
540
|
+
logger(logging.WARNING, "Request %s doesn't exist - Error: %s" % (request_id, str(error).replace('\n', '')))
|
|
541
|
+
return False
|
|
542
|
+
except Exception:
|
|
543
|
+
logger(logging.CRITICAL, "Exception", exc_info=True)
|
|
544
|
+
|
|
545
|
+
|
|
503
546
|
@transactional_session
|
|
504
547
|
def mark_transfer_lost(request, *, session: "Session", logger=logging.log):
|
|
505
548
|
new_state = RequestState.LOST
|
|
@@ -41,10 +41,11 @@ from rucio.common.utils import chunks
|
|
|
41
41
|
from rucio.core import request as request_core, replica as replica_core
|
|
42
42
|
from rucio.core.monitor import MetricManager
|
|
43
43
|
from rucio.core.rse import list_rses
|
|
44
|
+
from rucio.core.transfer import ProtocolFactory
|
|
45
|
+
from rucio.core.topology import Topology, ExpiringObjectCache
|
|
44
46
|
from rucio.daemons.common import db_workqueue, ProducerConsumerDaemon
|
|
45
47
|
from rucio.db.sqla.constants import RequestState, RequestType, ReplicaState, BadFilesStatus
|
|
46
48
|
from rucio.db.sqla.session import transactional_session
|
|
47
|
-
from rucio.rse import rsemanager
|
|
48
49
|
|
|
49
50
|
if TYPE_CHECKING:
|
|
50
51
|
from rucio.daemons.common import HeartbeatHandler
|
|
@@ -60,6 +61,7 @@ FAILED_DURING_SUBMISSION_DELAY = datetime.timedelta(minutes=120)
|
|
|
60
61
|
def _fetch_requests(
|
|
61
62
|
db_bulk,
|
|
62
63
|
set_last_processed_by: bool,
|
|
64
|
+
cached_topology,
|
|
63
65
|
heartbeat_handler,
|
|
64
66
|
activity,
|
|
65
67
|
):
|
|
@@ -67,8 +69,11 @@ def _fetch_requests(
|
|
|
67
69
|
|
|
68
70
|
logger(logging.DEBUG, 'Working on activity %s', activity)
|
|
69
71
|
|
|
72
|
+
topology = cached_topology.get() if cached_topology else Topology()
|
|
73
|
+
|
|
70
74
|
get_requests_fnc = functools.partial(
|
|
71
75
|
request_core.get_and_mark_next,
|
|
76
|
+
rse_collection=topology,
|
|
72
77
|
request_type=[RequestType.TRANSFER, RequestType.STAGEIN, RequestType.STAGEOUT],
|
|
73
78
|
processed_by=heartbeat_handler.short_executable if set_last_processed_by else None,
|
|
74
79
|
limit=db_bulk,
|
|
@@ -100,17 +105,18 @@ def _fetch_requests(
|
|
|
100
105
|
if len(reqs) < db_bulk / 2:
|
|
101
106
|
logger(logging.INFO, "Only %s transfers, which is less than half of the bulk %s", len(reqs), db_bulk)
|
|
102
107
|
must_sleep = True
|
|
103
|
-
return must_sleep, reqs
|
|
108
|
+
return must_sleep, (reqs, topology)
|
|
104
109
|
|
|
105
110
|
|
|
106
111
|
def _handle_requests(
|
|
107
|
-
|
|
112
|
+
batch,
|
|
108
113
|
bulk,
|
|
109
114
|
suspicious_patterns,
|
|
110
115
|
retry_protocol_mismatches,
|
|
111
116
|
*,
|
|
112
117
|
logger=logging.log,
|
|
113
118
|
):
|
|
119
|
+
reqs, topology = batch
|
|
114
120
|
if not reqs:
|
|
115
121
|
return
|
|
116
122
|
|
|
@@ -122,7 +128,7 @@ def _handle_requests(
|
|
|
122
128
|
for chunk in chunks(reqs, bulk):
|
|
123
129
|
try:
|
|
124
130
|
stopwatch = Stopwatch()
|
|
125
|
-
_finish_requests(chunk, suspicious_patterns, retry_protocol_mismatches, logger=logger)
|
|
131
|
+
_finish_requests(topology, chunk, suspicious_patterns, retry_protocol_mismatches, logger=logger)
|
|
126
132
|
METRICS.timer('handle_requests_time').observe(stopwatch.elapsed / (len(chunk) or 1))
|
|
127
133
|
METRICS.counter('handle_requests').inc(len(chunk))
|
|
128
134
|
except Exception as error:
|
|
@@ -144,6 +150,7 @@ def finisher(
|
|
|
144
150
|
bulk=100,
|
|
145
151
|
db_bulk=1000,
|
|
146
152
|
partition_wait_time=10,
|
|
153
|
+
cached_topology=None,
|
|
147
154
|
total_threads=1,
|
|
148
155
|
):
|
|
149
156
|
"""
|
|
@@ -172,14 +179,15 @@ def finisher(
|
|
|
172
179
|
def _db_producer(*, activity: str, heartbeat_handler: "HeartbeatHandler"):
|
|
173
180
|
return _fetch_requests(
|
|
174
181
|
db_bulk=db_bulk,
|
|
182
|
+
cached_topology=cached_topology,
|
|
175
183
|
activity=activity,
|
|
176
184
|
set_last_processed_by=not once,
|
|
177
185
|
heartbeat_handler=heartbeat_handler,
|
|
178
186
|
)
|
|
179
187
|
|
|
180
|
-
def _consumer(
|
|
188
|
+
def _consumer(batch):
|
|
181
189
|
return _handle_requests(
|
|
182
|
-
|
|
190
|
+
batch=batch,
|
|
183
191
|
bulk=bulk,
|
|
184
192
|
suspicious_patterns=suspicious_patterns,
|
|
185
193
|
retry_protocol_mismatches=retry_protocol_mismatches,
|
|
@@ -209,17 +217,19 @@ def run(once=False, total_threads=1, sleep_time=60, activities=None, bulk=100, d
|
|
|
209
217
|
if rucio.db.sqla.util.is_old_db():
|
|
210
218
|
raise DatabaseException('Database was not updated, daemon won\'t start')
|
|
211
219
|
|
|
220
|
+
cached_topology = ExpiringObjectCache(ttl=300, new_obj_fnc=lambda: Topology())
|
|
212
221
|
finisher(
|
|
213
222
|
once=once,
|
|
214
223
|
activities=activities,
|
|
215
224
|
bulk=bulk,
|
|
216
225
|
db_bulk=db_bulk,
|
|
217
226
|
sleep_time=sleep_time,
|
|
227
|
+
cached_topology=cached_topology,
|
|
218
228
|
total_threads=total_threads
|
|
219
229
|
)
|
|
220
230
|
|
|
221
231
|
|
|
222
|
-
def _finish_requests(reqs, suspicious_patterns, retry_protocol_mismatches, logger=logging.log):
|
|
232
|
+
def _finish_requests(topology: "Topology", reqs, suspicious_patterns, retry_protocol_mismatches, logger=logging.log):
|
|
223
233
|
"""
|
|
224
234
|
Used by finisher to handle terminated requests,
|
|
225
235
|
|
|
@@ -231,7 +241,7 @@ def _finish_requests(reqs, suspicious_patterns, retry_protocol_mismatches, logge
|
|
|
231
241
|
failed_during_submission = [RequestState.SUBMITTING, RequestState.SUBMISSION_FAILED, RequestState.LOST]
|
|
232
242
|
failed_no_submission_attempts = [RequestState.NO_SOURCES, RequestState.ONLY_TAPE_SOURCES, RequestState.MISMATCH_SCHEME]
|
|
233
243
|
undeterministic_rses = __get_undeterministic_rses(logger=logger)
|
|
234
|
-
|
|
244
|
+
protocol_factory = ProtocolFactory()
|
|
235
245
|
replicas = {}
|
|
236
246
|
for req in reqs:
|
|
237
247
|
try:
|
|
@@ -252,14 +262,11 @@ def _finish_requests(reqs, suspicious_patterns, retry_protocol_mismatches, logge
|
|
|
252
262
|
|
|
253
263
|
# for TAPE, replica path is needed
|
|
254
264
|
if req['request_type'] in (RequestType.TRANSFER, RequestType.STAGEIN) and req['dest_rse_id'] in undeterministic_rses:
|
|
255
|
-
|
|
256
|
-
rses_info[req['dest_rse_id']] = rsemanager.get_rse_info(rse_id=req['dest_rse_id'])
|
|
265
|
+
dst_rse = topology[req['dest_rse_id']].ensure_loaded(load_info=True)
|
|
257
266
|
pfn = req['dest_url']
|
|
258
267
|
scheme = urlparse(pfn).scheme
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
protocols[dest_rse_id_scheme] = rsemanager.create_protocol(rses_info[req['dest_rse_id']], 'write', scheme)
|
|
262
|
-
path = protocols[dest_rse_id_scheme].parse_pfns([pfn])[pfn]['path']
|
|
268
|
+
protocol = protocol_factory.protocol(dst_rse, scheme, 'write')
|
|
269
|
+
path = protocol.parse_pfns([pfn])[pfn]['path']
|
|
263
270
|
replica['path'] = os.path.join(path, os.path.basename(pfn))
|
|
264
271
|
|
|
265
272
|
# replica should not be added to replicas until all info are filled
|
|
@@ -40,6 +40,7 @@ from rucio.common.types import InternalAccount
|
|
|
40
40
|
from rucio.common.utils import dict_chunks
|
|
41
41
|
from rucio.core import transfer as transfer_core, request as request_core
|
|
42
42
|
from rucio.core.monitor import MetricManager
|
|
43
|
+
from rucio.core.topology import Topology, ExpiringObjectCache
|
|
43
44
|
from rucio.daemons.common import db_workqueue, ProducerConsumerDaemon
|
|
44
45
|
from rucio.db.sqla.constants import RequestState, RequestType
|
|
45
46
|
from rucio.transfertool.fts3 import FTS3Transfertool
|
|
@@ -63,15 +64,21 @@ def _fetch_requests(
|
|
|
63
64
|
activity_shares,
|
|
64
65
|
transfertool,
|
|
65
66
|
filter_transfertool,
|
|
67
|
+
cached_topology,
|
|
66
68
|
activity,
|
|
69
|
+
set_last_processed_by: bool,
|
|
67
70
|
heartbeat_handler
|
|
68
71
|
):
|
|
69
72
|
worker_number, total_workers, logger = heartbeat_handler.live()
|
|
70
73
|
|
|
71
74
|
logger(logging.DEBUG, 'Start to poll transfers older than %i seconds for activity %s using transfer tool: %s' % (older_than, activity, filter_transfertool))
|
|
75
|
+
|
|
76
|
+
topology = cached_topology.get() if cached_topology else Topology()
|
|
72
77
|
transfs = request_core.get_and_mark_next(
|
|
78
|
+
rse_collection=topology,
|
|
73
79
|
request_type=[RequestType.TRANSFER, RequestType.STAGEIN, RequestType.STAGEOUT],
|
|
74
80
|
state=[RequestState.SUBMITTED],
|
|
81
|
+
processed_by=heartbeat_handler.short_executable if set_last_processed_by else None,
|
|
75
82
|
limit=db_bulk,
|
|
76
83
|
older_than=datetime.datetime.utcnow() - datetime.timedelta(seconds=older_than) if older_than else None,
|
|
77
84
|
total_workers=total_workers,
|
|
@@ -151,6 +158,7 @@ def poller(
|
|
|
151
158
|
partition_wait_time: int = 10,
|
|
152
159
|
transfertool: Optional[str] = TRANSFER_TOOL,
|
|
153
160
|
filter_transfertool: Optional[str] = FILTER_TRANSFERTOOL,
|
|
161
|
+
cached_topology=None,
|
|
154
162
|
total_threads: int = 1,
|
|
155
163
|
):
|
|
156
164
|
"""
|
|
@@ -189,7 +197,9 @@ def poller(
|
|
|
189
197
|
activity_shares=activity_shares,
|
|
190
198
|
transfertool=transfertool,
|
|
191
199
|
filter_transfertool=filter_transfertool,
|
|
200
|
+
cached_topology=cached_topology,
|
|
192
201
|
activity=activity,
|
|
202
|
+
set_last_processed_by=not once,
|
|
193
203
|
heartbeat_handler=heartbeat_handler,
|
|
194
204
|
)
|
|
195
205
|
|
|
@@ -256,6 +266,7 @@ def run(
|
|
|
256
266
|
parsed_activity_shares.update((share, int(percentage * db_bulk)) for share, percentage in parsed_activity_shares.items())
|
|
257
267
|
logging.info('activity shares enabled: %s' % parsed_activity_shares)
|
|
258
268
|
|
|
269
|
+
cached_topology = ExpiringObjectCache(ttl=300, new_obj_fnc=lambda: Topology())
|
|
259
270
|
poller(
|
|
260
271
|
once=once,
|
|
261
272
|
fts_bulk=fts_bulk,
|
|
@@ -264,6 +275,7 @@ def run(
|
|
|
264
275
|
sleep_time=sleep_time,
|
|
265
276
|
activities=activities,
|
|
266
277
|
activity_shares=parsed_activity_shares,
|
|
278
|
+
cached_topology=cached_topology,
|
|
267
279
|
total_threads=total_threads,
|
|
268
280
|
)
|
|
269
281
|
|
|
@@ -343,7 +355,7 @@ def _poll_transfers(transfertool_obj, transfers_by_eid, timeout, logger):
|
|
|
343
355
|
METRICS.counter('query_transfer_exception').inc()
|
|
344
356
|
else:
|
|
345
357
|
for request_id in request_ids.intersection(transf_resp):
|
|
346
|
-
ret =
|
|
358
|
+
ret = transfer_core.update_transfer_state(transf_resp[request_id], logger=logger)
|
|
347
359
|
# if True, really update request content; if False, only touch request
|
|
348
360
|
if ret:
|
|
349
361
|
cnt += 1
|