rucio 35.7.0__py3-none-any.whl → 37.0.0rc2__py3-none-any.whl
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/alembicrevision.py +1 -1
- rucio/{daemons/c3po/collectors → cli}/__init__.py +1 -0
- rucio/cli/account.py +216 -0
- rucio-35.7.0.data/scripts/rucio → rucio/cli/bin_legacy/rucio.py +769 -486
- rucio-35.7.0.data/scripts/rucio-admin → rucio/cli/bin_legacy/rucio_admin.py +476 -423
- rucio/cli/command.py +272 -0
- rucio/cli/config.py +72 -0
- rucio/cli/did.py +191 -0
- rucio/cli/download.py +128 -0
- rucio/cli/lifetime_exception.py +33 -0
- rucio/cli/replica.py +162 -0
- rucio/cli/rse.py +293 -0
- rucio/cli/rule.py +158 -0
- rucio/cli/scope.py +40 -0
- rucio/cli/subscription.py +73 -0
- rucio/cli/upload.py +60 -0
- rucio/cli/utils.py +226 -0
- rucio/client/accountclient.py +0 -1
- rucio/client/baseclient.py +33 -24
- rucio/client/client.py +45 -1
- rucio/client/didclient.py +5 -3
- rucio/client/downloadclient.py +6 -8
- rucio/client/replicaclient.py +0 -2
- rucio/client/richclient.py +317 -0
- rucio/client/rseclient.py +4 -4
- rucio/client/uploadclient.py +26 -12
- rucio/common/bittorrent.py +234 -0
- rucio/common/cache.py +66 -29
- rucio/common/checksum.py +168 -0
- rucio/common/client.py +122 -0
- rucio/common/config.py +22 -35
- rucio/common/constants.py +61 -3
- rucio/common/didtype.py +72 -24
- rucio/common/dumper/__init__.py +45 -38
- rucio/common/dumper/consistency.py +75 -30
- rucio/common/dumper/data_models.py +63 -19
- rucio/common/dumper/path_parsing.py +19 -8
- rucio/common/exception.py +65 -8
- rucio/common/extra.py +5 -10
- rucio/common/logging.py +13 -13
- rucio/common/pcache.py +8 -7
- rucio/common/plugins.py +59 -27
- rucio/common/policy.py +12 -3
- rucio/common/schema/__init__.py +84 -34
- rucio/common/schema/generic.py +0 -17
- rucio/common/schema/generic_multi_vo.py +0 -17
- rucio/common/stomp_utils.py +383 -119
- rucio/common/test_rucio_server.py +12 -6
- rucio/common/types.py +132 -52
- rucio/common/utils.py +93 -643
- rucio/core/account_limit.py +14 -12
- rucio/core/authentication.py +2 -2
- rucio/core/config.py +23 -42
- rucio/core/credential.py +14 -15
- rucio/core/did.py +5 -1
- rucio/core/did_meta_plugins/elasticsearch_meta.py +407 -0
- rucio/core/did_meta_plugins/filter_engine.py +62 -3
- rucio/core/did_meta_plugins/json_meta.py +2 -2
- rucio/core/did_meta_plugins/mongo_meta.py +43 -30
- rucio/core/did_meta_plugins/postgres_meta.py +75 -39
- rucio/core/identity.py +6 -5
- rucio/core/importer.py +4 -3
- rucio/core/lifetime_exception.py +2 -2
- rucio/core/lock.py +8 -7
- rucio/core/message.py +6 -0
- rucio/core/monitor.py +30 -29
- rucio/core/naming_convention.py +2 -2
- rucio/core/nongrid_trace.py +2 -2
- rucio/core/oidc.py +11 -9
- rucio/core/permission/__init__.py +79 -37
- rucio/core/permission/generic.py +1 -7
- rucio/core/permission/generic_multi_vo.py +1 -7
- rucio/core/quarantined_replica.py +4 -3
- rucio/core/replica.py +464 -139
- rucio/core/replica_sorter.py +55 -59
- rucio/core/request.py +34 -32
- rucio/core/rse.py +301 -97
- rucio/core/rse_counter.py +1 -2
- rucio/core/rse_expression_parser.py +7 -7
- rucio/core/rse_selector.py +9 -7
- rucio/core/rule.py +41 -40
- rucio/core/rule_grouping.py +42 -40
- rucio/core/scope.py +5 -4
- rucio/core/subscription.py +26 -28
- rucio/core/topology.py +11 -11
- rucio/core/trace.py +2 -2
- rucio/core/transfer.py +29 -15
- rucio/core/volatile_replica.py +4 -3
- rucio/daemons/atropos/atropos.py +1 -1
- rucio/daemons/auditor/__init__.py +2 -2
- rucio/daemons/auditor/srmdumps.py +6 -6
- rucio/daemons/automatix/automatix.py +32 -21
- rucio/daemons/badreplicas/necromancer.py +2 -2
- rucio/daemons/bb8/nuclei_background_rebalance.py +1 -1
- rucio/daemons/bb8/t2_background_rebalance.py +1 -1
- rucio/daemons/cache/consumer.py +26 -90
- rucio/daemons/common.py +15 -25
- rucio/daemons/conveyor/finisher.py +2 -2
- rucio/daemons/conveyor/poller.py +18 -28
- rucio/daemons/conveyor/receiver.py +53 -123
- rucio/daemons/conveyor/stager.py +1 -0
- rucio/daemons/conveyor/submitter.py +3 -3
- rucio/daemons/hermes/hermes.py +129 -369
- rucio/daemons/judge/evaluator.py +2 -2
- rucio/daemons/oauthmanager/oauthmanager.py +3 -3
- rucio/daemons/reaper/dark_reaper.py +7 -3
- rucio/daemons/reaper/reaper.py +12 -16
- rucio/daemons/rsedecommissioner/config.py +1 -1
- rucio/daemons/rsedecommissioner/profiles/generic.py +5 -4
- rucio/daemons/rsedecommissioner/profiles/types.py +7 -6
- rucio/daemons/rsedecommissioner/rse_decommissioner.py +1 -1
- rucio/daemons/storage/consistency/actions.py +8 -6
- rucio/daemons/tracer/kronos.py +117 -142
- rucio/db/sqla/constants.py +5 -0
- rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +4 -4
- rucio/db/sqla/migrate_repo/versions/30d5206e9cad_increase_oauthrequest_redirect_msg_.py +37 -0
- rucio/db/sqla/models.py +157 -154
- rucio/db/sqla/session.py +58 -27
- rucio/db/sqla/types.py +2 -2
- rucio/db/sqla/util.py +2 -2
- rucio/gateway/account.py +18 -12
- rucio/gateway/account_limit.py +137 -60
- rucio/gateway/authentication.py +18 -12
- rucio/gateway/config.py +30 -20
- rucio/gateway/credential.py +9 -10
- rucio/gateway/did.py +70 -53
- rucio/gateway/dirac.py +6 -4
- rucio/gateway/exporter.py +3 -2
- rucio/gateway/heartbeat.py +6 -4
- rucio/gateway/identity.py +36 -51
- rucio/gateway/importer.py +3 -2
- rucio/gateway/lifetime_exception.py +3 -2
- rucio/gateway/meta_conventions.py +17 -6
- rucio/gateway/permission.py +4 -1
- rucio/gateway/quarantined_replica.py +3 -2
- rucio/gateway/replica.py +31 -22
- rucio/gateway/request.py +27 -18
- rucio/gateway/rse.py +69 -37
- rucio/gateway/rule.py +46 -26
- rucio/gateway/scope.py +3 -2
- rucio/gateway/subscription.py +14 -11
- rucio/gateway/vo.py +12 -8
- rucio/rse/__init__.py +3 -3
- rucio/rse/protocols/bittorrent.py +11 -1
- rucio/rse/protocols/cache.py +0 -11
- rucio/rse/protocols/dummy.py +0 -11
- rucio/rse/protocols/gfal.py +14 -9
- rucio/rse/protocols/globus.py +1 -1
- rucio/rse/protocols/http_cache.py +1 -1
- rucio/rse/protocols/posix.py +2 -2
- rucio/rse/protocols/protocol.py +84 -317
- rucio/rse/protocols/rclone.py +2 -1
- rucio/rse/protocols/rfio.py +10 -1
- rucio/rse/protocols/ssh.py +2 -1
- rucio/rse/protocols/storm.py +2 -13
- rucio/rse/protocols/webdav.py +74 -30
- rucio/rse/protocols/xrootd.py +2 -1
- rucio/rse/rsemanager.py +170 -53
- rucio/rse/translation.py +260 -0
- rucio/tests/common.py +23 -13
- rucio/tests/common_server.py +26 -9
- rucio/transfertool/bittorrent.py +15 -14
- rucio/transfertool/bittorrent_driver.py +5 -7
- rucio/transfertool/bittorrent_driver_qbittorrent.py +9 -8
- rucio/transfertool/fts3.py +20 -16
- rucio/transfertool/mock.py +2 -3
- rucio/vcsversion.py +4 -4
- rucio/version.py +7 -0
- rucio/web/rest/flaskapi/v1/accounts.py +17 -3
- rucio/web/rest/flaskapi/v1/auth.py +5 -5
- rucio/web/rest/flaskapi/v1/credentials.py +3 -2
- rucio/web/rest/flaskapi/v1/dids.py +21 -15
- rucio/web/rest/flaskapi/v1/identities.py +33 -9
- rucio/web/rest/flaskapi/v1/redirect.py +5 -4
- rucio/web/rest/flaskapi/v1/replicas.py +12 -8
- rucio/web/rest/flaskapi/v1/rses.py +15 -4
- rucio/web/rest/flaskapi/v1/traces.py +56 -19
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/etc/alembic.ini.template +1 -1
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/etc/alembic_offline.ini.template +1 -1
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/etc/rucio.cfg.atlas.client.template +3 -2
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/etc/rucio.cfg.template +3 -19
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/etc/rucio_multi_vo.cfg.template +1 -18
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/requirements.server.txt +97 -68
- rucio-37.0.0rc2.data/scripts/rucio +133 -0
- rucio-37.0.0rc2.data/scripts/rucio-admin +97 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-atropos +2 -2
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-auditor +2 -1
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-automatix +2 -2
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-cache-client +17 -10
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-conveyor-receiver +1 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-kronos +1 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-minos +2 -2
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-minos-temporary-expiration +2 -2
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-necromancer +2 -2
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-reaper +6 -6
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-transmogrifier +2 -2
- rucio-37.0.0rc2.dist-info/METADATA +92 -0
- {rucio-35.7.0.dist-info → rucio-37.0.0rc2.dist-info}/RECORD +239 -245
- {rucio-35.7.0.dist-info → rucio-37.0.0rc2.dist-info}/licenses/AUTHORS.rst +3 -0
- rucio/common/schema/atlas.py +0 -413
- rucio/common/schema/belleii.py +0 -408
- rucio/common/schema/domatpc.py +0 -401
- rucio/common/schema/escape.py +0 -426
- rucio/common/schema/icecube.py +0 -406
- rucio/core/permission/atlas.py +0 -1348
- rucio/core/permission/belleii.py +0 -1077
- rucio/core/permission/escape.py +0 -1078
- rucio/daemons/c3po/algorithms/__init__.py +0 -13
- rucio/daemons/c3po/algorithms/simple.py +0 -134
- rucio/daemons/c3po/algorithms/t2_free_space.py +0 -128
- rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +0 -130
- rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +0 -294
- rucio/daemons/c3po/c3po.py +0 -371
- rucio/daemons/c3po/collectors/agis.py +0 -108
- rucio/daemons/c3po/collectors/free_space.py +0 -81
- rucio/daemons/c3po/collectors/jedi_did.py +0 -57
- rucio/daemons/c3po/collectors/mock_did.py +0 -51
- rucio/daemons/c3po/collectors/network_metrics.py +0 -71
- rucio/daemons/c3po/collectors/workload.py +0 -112
- rucio/daemons/c3po/utils/__init__.py +0 -13
- rucio/daemons/c3po/utils/dataset_cache.py +0 -50
- rucio/daemons/c3po/utils/expiring_dataset_cache.py +0 -56
- rucio/daemons/c3po/utils/expiring_list.py +0 -62
- rucio/daemons/c3po/utils/popularity.py +0 -85
- rucio/daemons/c3po/utils/timeseries.py +0 -89
- rucio/rse/protocols/gsiftp.py +0 -92
- rucio-35.7.0.data/scripts/rucio-c3po +0 -85
- rucio-35.7.0.dist-info/METADATA +0 -72
- /rucio/{daemons/c3po → cli/bin_legacy}/__init__.py +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/etc/globus-config.yml.template +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/etc/ldap.cfg.template +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/etc/rse-accounts.cfg.template +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/tools/bootstrap.py +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/tools/merge_rucio_configs.py +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/data/rucio/tools/reset_database.py +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-abacus-account +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-abacus-collection-replica +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-abacus-rse +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-bb8 +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-cache-consumer +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-conveyor-finisher +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-conveyor-poller +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-conveyor-preparer +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-conveyor-stager +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-conveyor-submitter +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-conveyor-throttler +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-dark-reaper +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-dumper +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-follower +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-hermes +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-judge-cleaner +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-judge-evaluator +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-judge-injector +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-judge-repairer +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-oauth-manager +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-replica-recoverer +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-rse-decommissioner +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-storage-consistency-actions +0 -0
- {rucio-35.7.0.data → rucio-37.0.0rc2.data}/scripts/rucio-undertaker +0 -0
- {rucio-35.7.0.dist-info → rucio-37.0.0rc2.dist-info}/WHEEL +0 -0
- {rucio-35.7.0.dist-info → rucio-37.0.0rc2.dist-info}/licenses/LICENSE +0 -0
- {rucio-35.7.0.dist-info → rucio-37.0.0rc2.dist-info}/top_level.txt +0 -0
rucio/daemons/reaper/reaper.py
CHANGED
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
"""
|
|
16
16
|
Reaper is a daemon to manage file deletion.
|
|
17
|
-
|
|
17
|
+
"""
|
|
18
18
|
|
|
19
19
|
import concurrent.futures.thread # noqa (https://github.com/rucio/rucio/issues/6548)
|
|
20
20
|
|
|
@@ -33,7 +33,7 @@ from dogpile.cache.api import NoValue
|
|
|
33
33
|
from sqlalchemy.exc import DatabaseError, IntegrityError
|
|
34
34
|
|
|
35
35
|
import rucio.db.sqla.util
|
|
36
|
-
from rucio.common.cache import
|
|
36
|
+
from rucio.common.cache import MemcacheRegion
|
|
37
37
|
from rucio.common.config import config_get_bool, config_get_int
|
|
38
38
|
from rucio.common.constants import RseAttr
|
|
39
39
|
from rucio.common.exception import DatabaseException, ReplicaNotFound, ReplicaUnAvailable, ResourceTemporaryUnavailable, RSEAccessDenied, RSENotFound, RSEProtocolNotSupported, ServiceUnavailable, SourceNotFound, VONotFound
|
|
@@ -57,12 +57,12 @@ if TYPE_CHECKING:
|
|
|
57
57
|
from collections.abc import Iterable, Sequence
|
|
58
58
|
from types import FrameType
|
|
59
59
|
|
|
60
|
-
from rucio.common.types import LoggerFunction
|
|
60
|
+
from rucio.common.types import LFNDict, LoggerFunction
|
|
61
61
|
from rucio.daemons.common import HeartbeatHandler
|
|
62
62
|
|
|
63
63
|
GRACEFUL_STOP = threading.Event()
|
|
64
64
|
METRICS = MetricManager(module=__name__)
|
|
65
|
-
REGION =
|
|
65
|
+
REGION = MemcacheRegion(expiration_time=600)
|
|
66
66
|
DAEMON_NAME = 'reaper'
|
|
67
67
|
|
|
68
68
|
EXCLUDED_RSE_GAUGE = METRICS.gauge('excluded_rses.{rse}', documentation='Temporarly excluded RSEs')
|
|
@@ -474,7 +474,7 @@ def run_once(
|
|
|
474
474
|
|
|
475
475
|
rses_to_process = get_rses_to_process(rses, include_rses, exclude_rses, vos)
|
|
476
476
|
if not rses_to_process:
|
|
477
|
-
logger(logging.
|
|
477
|
+
logger(logging.WARNING, 'Reaper: No RSEs found, sleeping')
|
|
478
478
|
return must_sleep
|
|
479
479
|
else:
|
|
480
480
|
rses_to_process = [RseData(id_=rse['id'], name=rse['rse'], columns=rse) for rse in rses_to_process]
|
|
@@ -632,8 +632,13 @@ def _run_once(
|
|
|
632
632
|
del_start_time = time.time()
|
|
633
633
|
for replica in file_replicas:
|
|
634
634
|
try:
|
|
635
|
+
lfn: "LFNDict" = {
|
|
636
|
+
'scope': replica['scope'].external,
|
|
637
|
+
'name': replica['name'],
|
|
638
|
+
'path': replica['path']
|
|
639
|
+
}
|
|
635
640
|
replica['pfn'] = str(list(rsemgr.lfns2pfns(rse_settings=rse.info,
|
|
636
|
-
lfns=[
|
|
641
|
+
lfns=[lfn],
|
|
637
642
|
operation='delete', scheme=scheme).values())[0])
|
|
638
643
|
except (ReplicaUnAvailable, ReplicaNotFound) as error:
|
|
639
644
|
logger(logging.WARNING, 'Failed get pfn UNAVAILABLE replica %s:%s on %s with error %s', replica['scope'], replica['name'], rse.name, str(error))
|
|
@@ -690,7 +695,6 @@ def run(
|
|
|
690
695
|
|
|
691
696
|
:param threads: The total number of workers.
|
|
692
697
|
:param chunk_size: The size of chunk for deletion.
|
|
693
|
-
:param threads_per_worker: Total number of threads created by each worker.
|
|
694
698
|
:param once: If True, only runs one iteration of the main loop.
|
|
695
699
|
:param greedy: If True, delete right away replicas with tombstone.
|
|
696
700
|
:param rses: List of RSEs the reaper should work against.
|
|
@@ -711,14 +715,6 @@ def run(
|
|
|
711
715
|
if rucio.db.sqla.util.is_old_db():
|
|
712
716
|
raise DatabaseException('Database was not updated, daemon won\'t start')
|
|
713
717
|
|
|
714
|
-
logging.log(logging.INFO, 'main: starting processes')
|
|
715
|
-
rses_to_process = get_rses_to_process(rses, include_rses, exclude_rses, vos)
|
|
716
|
-
if not rses_to_process:
|
|
717
|
-
logging.log(logging.ERROR, 'Reaper: No RSEs found. Exiting.')
|
|
718
|
-
return
|
|
719
|
-
|
|
720
|
-
logging.log(logging.INFO, 'Reaper: This instance will work on RSEs: %s', ', '.join([rse['rse'] for rse in rses_to_process]))
|
|
721
|
-
|
|
722
718
|
logging.log(logging.INFO, 'starting reaper threads')
|
|
723
719
|
threads_list = [threading.Thread(target=reaper, kwargs={'once': once,
|
|
724
720
|
'rses': rses,
|
|
@@ -75,7 +75,7 @@ def set_status(
|
|
|
75
75
|
:param rse_id: RSE ID.
|
|
76
76
|
:param status: RSE decommissioning status.
|
|
77
77
|
"""
|
|
78
|
-
config = attr_to_config(get_rse_attribute(rse_id, RseAttr.DECOMMISSION))
|
|
78
|
+
config = attr_to_config(get_rse_attribute(rse_id, RseAttr.DECOMMISSION)) # type: ignore (get_rse_attribute could return None)
|
|
79
79
|
config['status'] = status
|
|
80
80
|
# add_rse_attribute can handle updating existing entries too
|
|
81
81
|
add_rse_attribute(rse_id, RseAttr.DECOMMISSION, config_to_attr(config))
|
|
@@ -14,7 +14,6 @@
|
|
|
14
14
|
|
|
15
15
|
"""Generic decommissioning profiles."""
|
|
16
16
|
import logging
|
|
17
|
-
from collections.abc import Callable, Iterable
|
|
18
17
|
from datetime import datetime, timedelta
|
|
19
18
|
from typing import TYPE_CHECKING, Any
|
|
20
19
|
|
|
@@ -32,6 +31,8 @@ from rucio.db.sqla.constants import ReplicaState
|
|
|
32
31
|
from .types import DecommissioningProfile, HandlerOutcome
|
|
33
32
|
|
|
34
33
|
if TYPE_CHECKING:
|
|
34
|
+
from collections.abc import Iterable
|
|
35
|
+
|
|
35
36
|
from rucio.common.types import LoggerFunction
|
|
36
37
|
|
|
37
38
|
|
|
@@ -137,7 +138,7 @@ def _generic_discover(
|
|
|
137
138
|
rse: dict[str, Any],
|
|
138
139
|
*,
|
|
139
140
|
logger: "LoggerFunction" = logging.log
|
|
140
|
-
) -> Iterable[dict[str, Any]]:
|
|
141
|
+
) -> 'Iterable[dict[str, Any]]':
|
|
141
142
|
"""Discoverer function that calls the listing function from core.rule.
|
|
142
143
|
|
|
143
144
|
:param rse: RSE table entry as a dictionary.
|
|
@@ -186,7 +187,7 @@ def _generic_finalize(
|
|
|
186
187
|
|
|
187
188
|
def _process_replicas_with_no_locks(
|
|
188
189
|
rse: dict[str, Any],
|
|
189
|
-
replicas: Iterable[dict[str, Any]],
|
|
190
|
+
replicas: 'Iterable[dict[str, Any]]',
|
|
190
191
|
limit: int = 0,
|
|
191
192
|
*,
|
|
192
193
|
logger: "LoggerFunction" = logging.log,
|
|
@@ -382,7 +383,7 @@ def _call_for_attention(
|
|
|
382
383
|
rule: dict[str, Any],
|
|
383
384
|
rse: dict[str, Any],
|
|
384
385
|
*,
|
|
385
|
-
logger:
|
|
386
|
+
logger: "LoggerFunction" = logging.log
|
|
386
387
|
) -> HandlerOutcome:
|
|
387
388
|
return HandlerOutcome.NEED_ATTENTION
|
|
388
389
|
|
|
@@ -14,12 +14,13 @@
|
|
|
14
14
|
|
|
15
15
|
"""Types used for profile definitions."""
|
|
16
16
|
import logging
|
|
17
|
-
from collections.abc import Callable, Iterable
|
|
18
17
|
from dataclasses import dataclass
|
|
19
18
|
from enum import Enum
|
|
20
19
|
from typing import TYPE_CHECKING, Any
|
|
21
20
|
|
|
22
21
|
if TYPE_CHECKING:
|
|
22
|
+
from collections.abc import Callable, Iterable
|
|
23
|
+
|
|
23
24
|
from rucio.common.types import LoggerFunction
|
|
24
25
|
|
|
25
26
|
|
|
@@ -42,10 +43,10 @@ class DecommissioningProfile:
|
|
|
42
43
|
"""
|
|
43
44
|
|
|
44
45
|
rse: dict[str, Any]
|
|
45
|
-
initializer: Callable[..., None]
|
|
46
|
-
discoverer: Callable[..., Iterable[dict[str, Any]]]
|
|
47
|
-
handlers: list[tuple[Callable[..., bool], Callable[..., HandlerOutcome]]]
|
|
48
|
-
finalizer: Callable[..., bool]
|
|
46
|
+
initializer: "Callable[..., None]"
|
|
47
|
+
discoverer: "Callable[..., Iterable[dict[str, Any]]]"
|
|
48
|
+
handlers: list[tuple["Callable[..., bool]", "Callable[..., HandlerOutcome]"]]
|
|
49
|
+
finalizer: "Callable[..., bool]"
|
|
49
50
|
|
|
50
51
|
def initialize(
|
|
51
52
|
self,
|
|
@@ -59,7 +60,7 @@ class DecommissioningProfile:
|
|
|
59
60
|
self,
|
|
60
61
|
*,
|
|
61
62
|
logger: "LoggerFunction" = logging.log
|
|
62
|
-
) -> Iterable[dict[str, Any]]:
|
|
63
|
+
) -> 'Iterable[dict[str, Any]]':
|
|
63
64
|
"""Call the discoverer."""
|
|
64
65
|
return self.discoverer(self.rse, logger=logger)
|
|
65
66
|
|
|
@@ -98,7 +98,7 @@ def run_once(
|
|
|
98
98
|
# Get the decommission attribute (encodes the decommissioning config)
|
|
99
99
|
attr = get_rse_attribute(rse['id'], RseAttr.DECOMMISSION)
|
|
100
100
|
try:
|
|
101
|
-
config = attr_to_config(attr)
|
|
101
|
+
config = attr_to_config(attr) # type: ignore (attr could be None)
|
|
102
102
|
except InvalidStatusName:
|
|
103
103
|
logger(logging.ERROR, 'RSE %s has an invalid decommissioning status',
|
|
104
104
|
rse['rse'])
|
|
@@ -35,7 +35,7 @@ from sqlalchemy.orm.exc import FlushError
|
|
|
35
35
|
|
|
36
36
|
from rucio.common import exception
|
|
37
37
|
from rucio.common.logging import formatted_logger, setup_logging
|
|
38
|
-
from rucio.common.types import InternalAccount, InternalScope
|
|
38
|
+
from rucio.common.types import InternalAccount, InternalScope, LFNDict
|
|
39
39
|
from rucio.common.utils import daemon_sleep
|
|
40
40
|
from rucio.core.heartbeat import die, live, sanity_check
|
|
41
41
|
from rucio.core.monitor import MetricManager
|
|
@@ -443,16 +443,18 @@ def process_dark_files(
|
|
|
443
443
|
logger(logging.INFO, 'Processing a dark file:\n RSE %s Scope: %s Name: %s'
|
|
444
444
|
% (rse, scope, name))
|
|
445
445
|
rse_id = get_rse_id(rse=rse)
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
446
|
+
internal_scope = InternalScope(scope=scope, vo=issuer.vo)
|
|
447
|
+
lfn: "LFNDict" = {
|
|
448
|
+
'scope': scope,
|
|
449
|
+
'name': name,
|
|
450
|
+
}
|
|
449
451
|
attributes = get_rse_info(rse=rse)
|
|
450
|
-
pfns = lfns2pfns(rse_settings=attributes, lfns=
|
|
452
|
+
pfns = lfns2pfns(rse_settings=attributes, lfns=[lfn], operation='delete')
|
|
451
453
|
pfn_key = scope + ':' + name
|
|
452
454
|
url = pfns[pfn_key]
|
|
453
455
|
urls = [url]
|
|
454
456
|
paths = parse_pfns(attributes, urls, operation='delete')
|
|
455
|
-
replicas = [{'scope':
|
|
457
|
+
replicas = [{'scope': internal_scope, 'rse_id': rse_id, 'name': name,
|
|
456
458
|
'path': paths[url]['path'] + paths[url]['name']}]
|
|
457
459
|
add_quarantined_replicas(rse_id, replicas, session=None)
|
|
458
460
|
deleted_files += 1
|