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.

Files changed (582) hide show
  1. {rucio-32.5.1 → rucio-32.6.0.post1}/PKG-INFO +1 -1
  2. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/replica.py +24 -14
  3. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/config.py +4 -4
  4. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/did.py +16 -14
  5. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/did_meta_plugins/filter_engine.py +3 -1
  6. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/request.py +26 -49
  7. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/rse.py +5 -6
  8. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/topology.py +9 -5
  9. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/transfer.py +44 -1
  10. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/finisher.py +21 -14
  11. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/poller.py +13 -1
  12. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/receiver.py +2 -2
  13. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/transfertool/fts3.py +1 -7
  14. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/transfertool/globus.py +0 -11
  15. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/transfertool/mock.py +0 -3
  16. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/transfertool/transfertool.py +4 -6
  17. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/vcsversion.py +3 -3
  18. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_bad_replica.py +3 -3
  19. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_conveyor.py +6 -9
  20. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_did.py +3 -0
  21. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_reaper.py +2 -1
  22. {rucio-32.5.1 → rucio-32.6.0.post1}/AUTHORS.rst +0 -0
  23. {rucio-32.5.1 → rucio-32.6.0.post1}/ChangeLog +0 -0
  24. {rucio-32.5.1 → rucio-32.6.0.post1}/LICENSE +0 -0
  25. {rucio-32.5.1 → rucio-32.6.0.post1}/MANIFEST.in +0 -0
  26. {rucio-32.5.1 → rucio-32.6.0.post1}/README.rst +0 -0
  27. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio +0 -0
  28. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-abacus-account +0 -0
  29. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-abacus-collection-replica +0 -0
  30. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-abacus-rse +0 -0
  31. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-admin +0 -0
  32. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-atropos +0 -0
  33. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-auditor +0 -0
  34. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-automatix +0 -0
  35. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-bb8 +0 -0
  36. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-c3po +0 -0
  37. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-cache-client +0 -0
  38. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-cache-consumer +0 -0
  39. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-conveyor-finisher +0 -0
  40. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-conveyor-poller +0 -0
  41. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-conveyor-preparer +0 -0
  42. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-conveyor-receiver +0 -0
  43. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-conveyor-stager +0 -0
  44. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-conveyor-submitter +0 -0
  45. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-conveyor-throttler +0 -0
  46. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-dark-reaper +0 -0
  47. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-dumper +0 -0
  48. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-follower +0 -0
  49. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-hermes +0 -0
  50. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-judge-cleaner +0 -0
  51. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-judge-evaluator +0 -0
  52. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-judge-injector +0 -0
  53. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-judge-repairer +0 -0
  54. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-kronos +0 -0
  55. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-light-reaper +0 -0
  56. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-minos +0 -0
  57. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-minos-temporary-expiration +0 -0
  58. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-necromancer +0 -0
  59. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-oauth-manager +0 -0
  60. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-reaper +0 -0
  61. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-replica-recoverer +0 -0
  62. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-storage-consistency-actions +0 -0
  63. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-transmogrifier +0 -0
  64. {rucio-32.5.1 → rucio-32.6.0.post1}/bin/rucio-undertaker +0 -0
  65. {rucio-32.5.1 → rucio-32.6.0.post1}/etc/alembic.ini.template +0 -0
  66. {rucio-32.5.1 → rucio-32.6.0.post1}/etc/alembic_offline.ini.template +0 -0
  67. {rucio-32.5.1 → rucio-32.6.0.post1}/etc/globus-config.yml.template +0 -0
  68. {rucio-32.5.1 → rucio-32.6.0.post1}/etc/ldap.cfg.template +0 -0
  69. {rucio-32.5.1 → rucio-32.6.0.post1}/etc/mail_templates/rule_approval_request.tmpl +0 -0
  70. {rucio-32.5.1 → rucio-32.6.0.post1}/etc/mail_templates/rule_approved_admin.tmpl +0 -0
  71. {rucio-32.5.1 → rucio-32.6.0.post1}/etc/mail_templates/rule_approved_user.tmpl +0 -0
  72. {rucio-32.5.1 → rucio-32.6.0.post1}/etc/mail_templates/rule_denied_admin.tmpl +0 -0
  73. {rucio-32.5.1 → rucio-32.6.0.post1}/etc/mail_templates/rule_denied_user.tmpl +0 -0
  74. {rucio-32.5.1 → rucio-32.6.0.post1}/etc/mail_templates/rule_ok_notification.tmpl +0 -0
  75. {rucio-32.5.1 → rucio-32.6.0.post1}/etc/rse-accounts.cfg.template +0 -0
  76. {rucio-32.5.1 → rucio-32.6.0.post1}/etc/rucio.cfg.atlas.client.template +0 -0
  77. {rucio-32.5.1 → rucio-32.6.0.post1}/etc/rucio.cfg.template +0 -0
  78. {rucio-32.5.1 → rucio-32.6.0.post1}/etc/rucio_multi_vo.cfg.template +0 -0
  79. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/__init__.py +0 -0
  80. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/alembicrevision.py +0 -0
  81. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/__init__.py +0 -0
  82. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/account.py +0 -0
  83. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/account_limit.py +0 -0
  84. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/authentication.py +0 -0
  85. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/config.py +0 -0
  86. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/credential.py +0 -0
  87. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/did.py +0 -0
  88. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/dirac.py +0 -0
  89. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/exporter.py +0 -0
  90. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/heartbeat.py +0 -0
  91. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/identity.py +0 -0
  92. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/importer.py +0 -0
  93. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/lifetime_exception.py +0 -0
  94. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/lock.py +0 -0
  95. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/meta.py +0 -0
  96. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/permission.py +0 -0
  97. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/quarantined_replica.py +0 -0
  98. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/request.py +0 -0
  99. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/rse.py +0 -0
  100. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/rule.py +0 -0
  101. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/scope.py +0 -0
  102. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/subscription.py +0 -0
  103. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/temporary_did.py +0 -0
  104. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/api/vo.py +0 -0
  105. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/__init__.py +0 -0
  106. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/accountclient.py +0 -0
  107. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/accountlimitclient.py +0 -0
  108. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/baseclient.py +0 -0
  109. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/client.py +0 -0
  110. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/configclient.py +0 -0
  111. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/credentialclient.py +0 -0
  112. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/didclient.py +0 -0
  113. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/diracclient.py +0 -0
  114. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/downloadclient.py +0 -0
  115. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/exportclient.py +0 -0
  116. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/fileclient.py +0 -0
  117. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/importclient.py +0 -0
  118. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/lifetimeclient.py +0 -0
  119. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/lockclient.py +0 -0
  120. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/metaclient.py +0 -0
  121. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/pingclient.py +0 -0
  122. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/replicaclient.py +0 -0
  123. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/requestclient.py +0 -0
  124. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/rseclient.py +0 -0
  125. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/ruleclient.py +0 -0
  126. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/scopeclient.py +0 -0
  127. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/subscriptionclient.py +0 -0
  128. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/touchclient.py +0 -0
  129. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/client/uploadclient.py +0 -0
  130. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/__init__.py +0 -0
  131. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/cache.py +0 -0
  132. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/constants.py +0 -0
  133. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/constraints.py +0 -0
  134. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/didtype.py +0 -0
  135. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/dumper/__init__.py +0 -0
  136. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/dumper/consistency.py +0 -0
  137. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/dumper/data_models.py +0 -0
  138. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/dumper/path_parsing.py +0 -0
  139. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/exception.py +0 -0
  140. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/extra.py +0 -0
  141. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/logging.py +0 -0
  142. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/pcache.py +0 -0
  143. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/policy.py +0 -0
  144. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/__init__.py +0 -0
  145. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/atlas.py +0 -0
  146. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/belleii.py +0 -0
  147. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/cms.py +0 -0
  148. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/domatpc.py +0 -0
  149. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/escape.py +0 -0
  150. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/generic.py +0 -0
  151. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/generic_multi_vo.py +0 -0
  152. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/icecube.py +0 -0
  153. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/schema/lsst.py +0 -0
  154. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/stomp_utils.py +0 -0
  155. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/stopwatch.py +0 -0
  156. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/test_rucio_server.py +0 -0
  157. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/types.py +0 -0
  158. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/common/utils.py +0 -0
  159. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/__init__.py +0 -0
  160. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/account.py +0 -0
  161. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/account_counter.py +0 -0
  162. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/account_limit.py +0 -0
  163. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/authentication.py +0 -0
  164. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/config.py +0 -0
  165. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/credential.py +0 -0
  166. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/did_meta_plugins/__init__.py +0 -0
  167. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/did_meta_plugins/did_column_meta.py +0 -0
  168. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/did_meta_plugins/did_meta_plugin_interface.py +0 -0
  169. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/did_meta_plugins/json_meta.py +0 -0
  170. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/did_meta_plugins/mongo_meta.py +0 -0
  171. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/did_meta_plugins/postgres_meta.py +0 -0
  172. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/dirac.py +0 -0
  173. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/distance.py +0 -0
  174. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/exporter.py +0 -0
  175. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/heartbeat.py +0 -0
  176. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/identity.py +0 -0
  177. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/importer.py +0 -0
  178. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/lifetime_exception.py +0 -0
  179. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/lock.py +0 -0
  180. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/message.py +0 -0
  181. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/meta.py +0 -0
  182. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/monitor.py +0 -0
  183. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/naming_convention.py +0 -0
  184. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/nongrid_trace.py +0 -0
  185. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/oidc.py +0 -0
  186. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/permission/__init__.py +0 -0
  187. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/permission/atlas.py +0 -0
  188. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/permission/belleii.py +0 -0
  189. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/permission/cms.py +0 -0
  190. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/permission/escape.py +0 -0
  191. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/permission/generic.py +0 -0
  192. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/permission/generic_multi_vo.py +0 -0
  193. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/quarantined_replica.py +0 -0
  194. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/replica.py +0 -0
  195. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/replica_sorter.py +0 -0
  196. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/rse_counter.py +0 -0
  197. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/rse_expression_parser.py +0 -0
  198. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/rse_selector.py +0 -0
  199. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/rule.py +0 -0
  200. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/rule_grouping.py +0 -0
  201. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/scope.py +0 -0
  202. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/subscription.py +0 -0
  203. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/temporary_did.py +0 -0
  204. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/trace.py +0 -0
  205. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/vo.py +0 -0
  206. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/core/volatile_replica.py +0 -0
  207. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/__init__.py +0 -0
  208. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/abacus/__init__.py +0 -0
  209. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/abacus/account.py +0 -0
  210. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/abacus/collection_replica.py +0 -0
  211. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/abacus/rse.py +0 -0
  212. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/atropos/__init__.py +0 -0
  213. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/atropos/atropos.py +0 -0
  214. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/auditor/__init__.py +0 -0
  215. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/auditor/hdfs.py +0 -0
  216. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/auditor/srmdumps.py +0 -0
  217. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/automatix/__init__.py +0 -0
  218. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/automatix/automatix.py +0 -0
  219. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/badreplicas/__init__.py +0 -0
  220. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/badreplicas/minos.py +0 -0
  221. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/badreplicas/minos_temporary_expiration.py +0 -0
  222. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/badreplicas/necromancer.py +0 -0
  223. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/bb8/__init__.py +0 -0
  224. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/bb8/bb8.py +0 -0
  225. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/bb8/common.py +0 -0
  226. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/bb8/nuclei_background_rebalance.py +0 -0
  227. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/bb8/t2_background_rebalance.py +0 -0
  228. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/__init__.py +0 -0
  229. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/algorithms/__init__.py +0 -0
  230. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/algorithms/simple.py +0 -0
  231. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/algorithms/t2_free_space.py +0 -0
  232. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +0 -0
  233. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +0 -0
  234. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/c3po.py +0 -0
  235. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/collectors/__init__.py +0 -0
  236. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/collectors/agis.py +0 -0
  237. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/collectors/free_space.py +0 -0
  238. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/collectors/jedi_did.py +0 -0
  239. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/collectors/mock_did.py +0 -0
  240. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/collectors/network_metrics.py +0 -0
  241. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/collectors/workload.py +0 -0
  242. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/utils/__init__.py +0 -0
  243. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/utils/dataset_cache.py +0 -0
  244. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/utils/expiring_dataset_cache.py +0 -0
  245. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/utils/expiring_list.py +0 -0
  246. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/utils/popularity.py +0 -0
  247. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/c3po/utils/timeseries.py +0 -0
  248. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/cache/__init__.py +0 -0
  249. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/cache/consumer.py +0 -0
  250. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/common.py +0 -0
  251. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/__init__.py +0 -0
  252. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/common.py +0 -0
  253. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/preparer.py +0 -0
  254. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/stager.py +0 -0
  255. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/submitter.py +0 -0
  256. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/conveyor/throttler.py +0 -0
  257. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/follower/__init__.py +0 -0
  258. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/follower/follower.py +0 -0
  259. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/hermes/__init__.py +0 -0
  260. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/hermes/hermes.py +0 -0
  261. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/judge/__init__.py +0 -0
  262. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/judge/cleaner.py +0 -0
  263. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/judge/evaluator.py +0 -0
  264. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/judge/injector.py +0 -0
  265. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/judge/repairer.py +0 -0
  266. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/oauthmanager/__init__.py +0 -0
  267. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/oauthmanager/oauthmanager.py +0 -0
  268. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/reaper/__init__.py +0 -0
  269. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/reaper/dark_reaper.py +0 -0
  270. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/reaper/light_reaper.py +0 -0
  271. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/reaper/reaper.py +0 -0
  272. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/replicarecoverer/__init__.py +0 -0
  273. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +0 -0
  274. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/storage/__init__.py +0 -0
  275. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/storage/consistency/__init__.py +0 -0
  276. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/storage/consistency/actions.py +0 -0
  277. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/tracer/__init__.py +0 -0
  278. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/tracer/kronos.py +0 -0
  279. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/transmogrifier/__init__.py +0 -0
  280. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/transmogrifier/transmogrifier.py +0 -0
  281. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/undertaker/__init__.py +0 -0
  282. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/daemons/undertaker/undertaker.py +0 -0
  283. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/__init__.py +0 -0
  284. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/__init__.py +0 -0
  285. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/constants.py +0 -0
  286. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/__init__.py +0 -0
  287. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/env.py +0 -0
  288. {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
  289. {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
  290. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +0 -0
  291. {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
  292. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +0 -0
  293. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +0 -0
  294. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -0
  295. {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
  296. {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
  297. {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
  298. {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
  299. {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
  300. {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
  301. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -0
  302. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +0 -0
  303. {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
  304. {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
  305. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -0
  306. {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
  307. {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
  308. {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
  309. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +0 -0
  310. {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
  311. {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
  312. {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
  313. {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
  314. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +0 -0
  315. {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
  316. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -0
  317. {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
  318. {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
  319. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +0 -0
  320. {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
  321. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +0 -0
  322. {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
  323. {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
  324. {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
  325. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +0 -0
  326. {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
  327. {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
  328. {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
  329. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +0 -0
  330. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +0 -0
  331. {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
  332. {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
  333. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +0 -0
  334. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +0 -0
  335. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -0
  336. {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
  337. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -0
  338. {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
  339. {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
  340. {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
  341. {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
  342. {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
  343. {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
  344. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +0 -0
  345. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -0
  346. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +0 -0
  347. {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
  348. {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
  349. {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
  350. {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
  351. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +0 -0
  352. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -0
  353. {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
  354. {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
  355. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -0
  356. {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
  357. {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
  358. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +0 -0
  359. {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
  360. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +0 -0
  361. {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
  362. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +0 -0
  363. {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
  364. {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
  365. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +0 -0
  366. {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
  367. {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
  368. {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
  369. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -0
  370. {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
  371. {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
  372. {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
  373. {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
  374. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -0
  375. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -0
  376. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +0 -0
  377. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -0
  378. {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
  379. {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
  380. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +0 -0
  381. {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
  382. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -0
  383. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +0 -0
  384. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +0 -0
  385. {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
  386. {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
  387. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +0 -0
  388. {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
  389. {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
  390. {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
  391. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +0 -0
  392. {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
  393. {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
  394. {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
  395. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -0
  396. {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
  397. {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
  398. {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
  399. {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
  400. {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
  401. {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
  402. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +0 -0
  403. {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
  404. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +0 -0
  405. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -0
  406. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +0 -0
  407. {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
  408. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -0
  409. {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
  410. {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
  411. {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
  412. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/models.py +0 -0
  413. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/sautils.py +0 -0
  414. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/session.py +0 -0
  415. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/types.py +0 -0
  416. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/db/sqla/util.py +0 -0
  417. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/__init__.py +0 -0
  418. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/__init__.py +0 -0
  419. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/cache.py +0 -0
  420. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/dummy.py +0 -0
  421. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/gfal.py +0 -0
  422. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/globus.py +0 -0
  423. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/gsiftp.py +0 -0
  424. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/http_cache.py +0 -0
  425. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/mock.py +0 -0
  426. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/ngarc.py +0 -0
  427. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/posix.py +0 -0
  428. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/protocol.py +0 -0
  429. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/rclone.py +0 -0
  430. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/rfio.py +0 -0
  431. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/srm.py +0 -0
  432. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/ssh.py +0 -0
  433. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/storm.py +0 -0
  434. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/webdav.py +0 -0
  435. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/protocols/xrootd.py +0 -0
  436. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/rse/rsemanager.py +0 -0
  437. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/tests/__init__.py +0 -0
  438. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/tests/common.py +0 -0
  439. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/tests/common_server.py +0 -0
  440. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/transfertool/__init__.py +0 -0
  441. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/transfertool/globus_library.py +0 -0
  442. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/version.py +0 -0
  443. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/__init__.py +0 -0
  444. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/__init__.py +0 -0
  445. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/__init__.py +0 -0
  446. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/authenticated_bp.py +0 -0
  447. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/__init__.py +0 -0
  448. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/accountlimits.py +0 -0
  449. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/accounts.py +0 -0
  450. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/archives.py +0 -0
  451. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/auth.py +0 -0
  452. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/common.py +0 -0
  453. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/config.py +0 -0
  454. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/credentials.py +0 -0
  455. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/dids.py +0 -0
  456. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/dirac.py +0 -0
  457. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/export.py +0 -0
  458. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/heartbeats.py +0 -0
  459. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/identities.py +0 -0
  460. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/import.py +0 -0
  461. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +0 -0
  462. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/locks.py +0 -0
  463. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/main.py +0 -0
  464. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/meta.py +0 -0
  465. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/metrics.py +0 -0
  466. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/nongrid_traces.py +0 -0
  467. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/ping.py +0 -0
  468. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/redirect.py +0 -0
  469. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/replicas.py +0 -0
  470. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/requests.py +0 -0
  471. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/rses.py +0 -0
  472. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/rules.py +0 -0
  473. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/scopes.py +0 -0
  474. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/subscriptions.py +0 -0
  475. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/templates/auth_crash.html +0 -0
  476. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/templates/auth_granted.html +0 -0
  477. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/tmp_dids.py +0 -0
  478. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/traces.py +0 -0
  479. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/flaskapi/v1/vos.py +0 -0
  480. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/main.py +0 -0
  481. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio/web/rest/metrics.py +0 -0
  482. {rucio-32.5.1 → rucio-32.6.0.post1}/lib/rucio.egg-info/SOURCES.txt +0 -0
  483. {rucio-32.5.1 → rucio-32.6.0.post1}/pylintrc +0 -0
  484. {rucio-32.5.1 → rucio-32.6.0.post1}/pyproject.toml +0 -0
  485. {rucio-32.5.1 → rucio-32.6.0.post1}/requirements.txt +0 -0
  486. {rucio-32.5.1 → rucio-32.6.0.post1}/setup.cfg +0 -0
  487. {rucio-32.5.1 → rucio-32.6.0.post1}/setup.py +0 -0
  488. {rucio-32.5.1 → rucio-32.6.0.post1}/setuputil.py +0 -0
  489. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_abacus_account.py +0 -0
  490. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_abacus_collection_replica.py +0 -0
  491. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_abacus_rse.py +0 -0
  492. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_account.py +0 -0
  493. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_account_limits.py +0 -0
  494. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_api_external_representation.py +0 -0
  495. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_archive.py +0 -0
  496. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_auditor.py +0 -0
  497. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_auditor_hdfs.py +0 -0
  498. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_auditor_srmdumps.py +0 -0
  499. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_authentication.py +0 -0
  500. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_automatix.py +0 -0
  501. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_bb8.py +0 -0
  502. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_belleii.py +0 -0
  503. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_bin_rucio.py +0 -0
  504. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_boolean.py +0 -0
  505. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_clients.py +0 -0
  506. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_common_types.py +0 -0
  507. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_config.py +0 -0
  508. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_conveyor_submitter.py +0 -0
  509. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_counter.py +0 -0
  510. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_credential.py +0 -0
  511. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_curl.py +0 -0
  512. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_daemons.py +0 -0
  513. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_dataset_replicas.py +0 -0
  514. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_db.py +0 -0
  515. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_did_meta_plugins.py +0 -0
  516. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_didtype.py +0 -0
  517. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_download.py +0 -0
  518. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_dumper.py +0 -0
  519. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_dumper_consistency.py +0 -0
  520. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_dumper_data_model.py +0 -0
  521. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_dumper_path_parsing.py +0 -0
  522. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_filter_engine.py +0 -0
  523. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_heartbeat.py +0 -0
  524. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_hermes.py +0 -0
  525. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_identity.py +0 -0
  526. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_impl_upload_download.py +0 -0
  527. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_import_export.py +0 -0
  528. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_judge_cleaner.py +0 -0
  529. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_judge_evaluator.py +0 -0
  530. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_judge_injector.py +0 -0
  531. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_judge_repairer.py +0 -0
  532. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_lifetime.py +0 -0
  533. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_message.py +0 -0
  534. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_meta.py +0 -0
  535. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_meta_did.py +0 -0
  536. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_module_import.py +0 -0
  537. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_monitor.py +0 -0
  538. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_multi_vo.py +0 -0
  539. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_naming_convention.py +0 -0
  540. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_oauthmanager.py +0 -0
  541. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_oidc.py +0 -0
  542. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_permission.py +0 -0
  543. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_pfns.py +0 -0
  544. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_ping.py +0 -0
  545. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_preparer.py +0 -0
  546. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_qos.py +0 -0
  547. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_quarantined_replica.py +0 -0
  548. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_redirect.py +0 -0
  549. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_replica.py +0 -0
  550. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_replica_recoverer.py +0 -0
  551. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_replica_sorting.py +0 -0
  552. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_request.py +0 -0
  553. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_root_proxy.py +0 -0
  554. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse.py +0 -0
  555. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_expression_parser.py +0 -0
  556. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_lfn2path.py +0 -0
  557. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_gfal2.py +0 -0
  558. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_gfal2_impl.py +0 -0
  559. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_posix.py +0 -0
  560. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_rclone.py +0 -0
  561. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_rsync.py +0 -0
  562. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_srm.py +0 -0
  563. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_ssh.py +0 -0
  564. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_webdav.py +0 -0
  565. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_protocol_xrootd.py +0 -0
  566. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rse_selector.py +0 -0
  567. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rucio_server.py +0 -0
  568. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_rule.py +0 -0
  569. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_schema_cms.py +0 -0
  570. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_scope.py +0 -0
  571. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_subscription.py +0 -0
  572. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_temporary_did.py +0 -0
  573. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_throttler.py +0 -0
  574. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_tpc.py +0 -0
  575. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_trace.py +0 -0
  576. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_transfer.py +0 -0
  577. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_undertaker.py +0 -0
  578. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_upload.py +0 -0
  579. {rucio-32.5.1 → rucio-32.6.0.post1}/tests/test_utils.py +0 -0
  580. {rucio-32.5.1 → rucio-32.6.0.post1}/tools/bootstrap.py +0 -0
  581. {rucio-32.5.1 → rucio-32.6.0.post1}/tools/merge_rucio_configs.py +0 -0
  582. {rucio-32.5.1 → rucio-32.6.0.post1}/tools/reset_database.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rucio
3
- Version: 32.5.1
3
+ Version: 32.6.0.post1
4
4
  Summary: Rucio Package
5
5
  Home-page: https://rucio.cern.ch/
6
6
  Author: Rucio
@@ -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
- kwargs = {}
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
- type_ = type(replicas[0])
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
- if type_ is dict:
102
- replicas_lst = [] # need to create new list to convert replica["scope"] from strings to InternalScope objects
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
- undeclared = replica.declare_bad_file_replicas(replicas_lst, reason=reason, issuer=issuer, status=BadFilesStatus.BAD,
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=True,
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=True,
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=True,
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=True,
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
- try:
1659
- stmt = select(
1660
- models.DataIdentifierAssociation
1661
- ).with_hint(
1662
- models.DataIdentifierAssociation, "INDEX(CONTENTS CONTENTS_PK)", 'oracle'
1663
- ).filter_by(
1664
- scope=scope,
1665
- name=name
1666
- )
1667
- for tmp_did in session.execute(stmt).yield_per(5).scalars():
1668
- yield {'scope': tmp_did.child_scope, 'name': tmp_did.child_name, 'type': tmp_did.child_type,
1669
- 'bytes': tmp_did.bytes, 'adler32': tmp_did.adler32, 'md5': tmp_did.md5}
1670
- except NoResultFound:
1671
- raise exception.DataIdentifierNotFound(f"Data identifier '{scope}:{name}' not found")
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
- value = ast.literal_eval(value) # will catch float, int and bool
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['dest_rse'] = get_rse_name(rse_id=dst_id, session=session) if dst_id is not None else None
752
- res_dict['source_rse'] = get_rse_name(rse_id=src_id, session=session) if src_id is not None else None
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, config_get_bool
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
- use_temp_tables = config_get_bool('core', 'use_temp_tables', default=True, session=session)
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[rse_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, rse_data in rse_id_to_data.items():
285
- rse_data._name = db_rses_by_id[rse_id].rse
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[float, int]
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], _StateProvider]" = lambda x: x,
348
- edge_state_provider: "Callable[[TE], _StateProvider]" = lambda x: x,
349
- ) -> "Iterator[tuple[TN, _Number, _StateProvider, TE, _StateProvider]]":
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, _StateProvider, Optional[TE], Optional[_StateProvider]]] =\
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
- reqs,
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(reqs):
188
+ def _consumer(batch):
181
189
  return _handle_requests(
182
- reqs=reqs,
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
- rses_info, protocols = {}, {}
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
- if req['dest_rse_id'] not in rses_info:
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
- dest_rse_id_scheme = '%s_%s' % (req['dest_rse_id'], scheme)
260
- if dest_rse_id_scheme not in protocols:
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 = request_core.update_request_state(transf_resp[request_id], logger=logger)
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