rucio 37.0.0rc3__py3-none-any.whl → 37.0.0rc4__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/common/stomp_utils.py +119 -383
- rucio/daemons/cache/consumer.py +90 -26
- rucio/daemons/conveyor/receiver.py +123 -53
- rucio/daemons/hermes/hermes.py +343 -41
- rucio/daemons/tracer/kronos.py +139 -114
- rucio/vcsversion.py +3 -3
- {rucio-37.0.0rc3.dist-info → rucio-37.0.0rc4.dist-info}/METADATA +1 -1
- {rucio-37.0.0rc3.dist-info → rucio-37.0.0rc4.dist-info}/RECORD +67 -67
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/etc/alembic.ini.template +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/etc/alembic_offline.ini.template +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/etc/globus-config.yml.template +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/etc/ldap.cfg.template +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/etc/rse-accounts.cfg.template +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/etc/rucio.cfg.template +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/etc/rucio_multi_vo.cfg.template +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/requirements.server.txt +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/tools/bootstrap.py +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/tools/merge_rucio_configs.py +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/data/rucio/tools/reset_database.py +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-abacus-account +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-abacus-collection-replica +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-abacus-rse +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-admin +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-atropos +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-auditor +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-automatix +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-bb8 +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-cache-client +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-cache-consumer +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-conveyor-finisher +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-conveyor-poller +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-conveyor-preparer +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-conveyor-receiver +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-conveyor-stager +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-conveyor-submitter +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-conveyor-throttler +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-dark-reaper +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-dumper +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-follower +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-hermes +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-judge-cleaner +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-judge-evaluator +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-judge-injector +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-judge-repairer +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-kronos +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-minos +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-minos-temporary-expiration +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-necromancer +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-oauth-manager +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-reaper +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-replica-recoverer +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-rse-decommissioner +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-storage-consistency-actions +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-transmogrifier +0 -0
- {rucio-37.0.0rc3.data → rucio-37.0.0rc4.data}/scripts/rucio-undertaker +0 -0
- {rucio-37.0.0rc3.dist-info → rucio-37.0.0rc4.dist-info}/WHEEL +0 -0
- {rucio-37.0.0rc3.dist-info → rucio-37.0.0rc4.dist-info}/licenses/AUTHORS.rst +0 -0
- {rucio-37.0.0rc3.dist-info → rucio-37.0.0rc4.dist-info}/licenses/LICENSE +0 -0
- {rucio-37.0.0rc3.dist-info → rucio-37.0.0rc4.dist-info}/top_level.txt +0 -0
rucio/daemons/tracer/kronos.py
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"""
|
|
16
16
|
This daemon consumes tracer messages from ActiveMQ and updates the atime for replicas.
|
|
17
17
|
"""
|
|
18
|
+
|
|
18
19
|
import functools
|
|
19
20
|
import logging
|
|
20
21
|
import re
|
|
@@ -25,13 +26,13 @@ from json import loads as jloads
|
|
|
25
26
|
from queue import Queue
|
|
26
27
|
from threading import Event, Thread
|
|
27
28
|
from time import time
|
|
28
|
-
from typing import TYPE_CHECKING
|
|
29
|
+
from typing import TYPE_CHECKING, Optional
|
|
29
30
|
|
|
30
31
|
import rucio.db.sqla.util
|
|
31
|
-
from rucio.common.config import config_get, config_get_int, config_get_list
|
|
32
|
+
from rucio.common.config import config_get, config_get_bool, config_get_int, config_get_list
|
|
32
33
|
from rucio.common.exception import DatabaseException, RSENotFound
|
|
33
|
-
from rucio.common.logging import
|
|
34
|
-
from rucio.common.stomp_utils import
|
|
34
|
+
from rucio.common.logging import setup_logging
|
|
35
|
+
from rucio.common.stomp_utils import StompConnectionManager
|
|
35
36
|
from rucio.common.stopwatch import Stopwatch
|
|
36
37
|
from rucio.common.types import InternalAccount, InternalScope, LoggerFunction
|
|
37
38
|
from rucio.core.did import list_parent_dids, touch_dids
|
|
@@ -46,10 +47,9 @@ if TYPE_CHECKING:
|
|
|
46
47
|
from collections.abc import Set
|
|
47
48
|
from types import FrameType
|
|
48
49
|
|
|
50
|
+
from stomp import Connection
|
|
49
51
|
from stomp.utils import Frame
|
|
50
52
|
|
|
51
|
-
from rucio.common.stomp_utils import Connection
|
|
52
|
-
|
|
53
53
|
|
|
54
54
|
logging.getLogger("stomp").setLevel(logging.CRITICAL)
|
|
55
55
|
|
|
@@ -57,20 +57,23 @@ METRICS = MetricManager(module=__name__)
|
|
|
57
57
|
graceful_stop = Event()
|
|
58
58
|
|
|
59
59
|
|
|
60
|
-
class AMQConsumer
|
|
60
|
+
class AMQConsumer:
|
|
61
61
|
"""ActiveMQ message consumer"""
|
|
62
62
|
|
|
63
|
-
def __init__(
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
63
|
+
def __init__(
|
|
64
|
+
self,
|
|
65
|
+
broker: str,
|
|
66
|
+
conn: "Connection",
|
|
67
|
+
queue: str,
|
|
68
|
+
chunksize: int,
|
|
69
|
+
subscription_id: str,
|
|
70
|
+
excluded_usrdns: "Set[str]",
|
|
71
|
+
dataset_queue: Queue,
|
|
72
|
+
bad_files_patterns: list[re.Pattern],
|
|
73
|
+
logger: LoggerFunction = logging.log
|
|
74
|
+
):
|
|
75
|
+
self.__broker = broker
|
|
76
|
+
self.__conn = conn
|
|
74
77
|
self.__queue = queue
|
|
75
78
|
self.__reports = []
|
|
76
79
|
self.__ids = []
|
|
@@ -82,6 +85,15 @@ class AMQConsumer(ListenerBase):
|
|
|
82
85
|
self.__excluded_usrdns = excluded_usrdns
|
|
83
86
|
self.__dataset_queue = dataset_queue
|
|
84
87
|
self.__bad_files_patterns = bad_files_patterns
|
|
88
|
+
self.__logger = logger
|
|
89
|
+
|
|
90
|
+
@METRICS.count_it
|
|
91
|
+
def on_heartbeat_timeout(self) -> None:
|
|
92
|
+
self.__conn.disconnect()
|
|
93
|
+
|
|
94
|
+
@METRICS.count_it
|
|
95
|
+
def on_error(self, frame: "Frame") -> None:
|
|
96
|
+
self.__logger(logging.ERROR, 'Message receive error: [%s] %s' % (self.__broker, frame.body))
|
|
85
97
|
|
|
86
98
|
@METRICS.count_it
|
|
87
99
|
def on_message(self, frame: "Frame") -> None:
|
|
@@ -95,7 +107,7 @@ class AMQConsumer(ListenerBase):
|
|
|
95
107
|
|
|
96
108
|
try:
|
|
97
109
|
if appversion == 'dq2':
|
|
98
|
-
self.
|
|
110
|
+
self.__conn.ack(msg_id, self.__subscription_id)
|
|
99
111
|
return
|
|
100
112
|
else:
|
|
101
113
|
report = jloads(frame.body) # type: ignore
|
|
@@ -103,26 +115,22 @@ class AMQConsumer(ListenerBase):
|
|
|
103
115
|
# message is corrupt, not much to do here
|
|
104
116
|
# send count to graphite, send ack to broker and return
|
|
105
117
|
METRICS.counter('json_error').inc()
|
|
106
|
-
self.
|
|
107
|
-
self.
|
|
118
|
+
self.__logger(logging.ERROR, 'json error', exc_info=True)
|
|
119
|
+
self.__conn.ack(msg_id, self.__subscription_id)
|
|
108
120
|
return
|
|
109
121
|
|
|
110
122
|
self.__ids.append(msg_id)
|
|
111
123
|
self.__reports.append(report)
|
|
112
124
|
|
|
113
125
|
try:
|
|
114
|
-
self.
|
|
115
|
-
"message received: %s %s %s",
|
|
116
|
-
str(report['eventType']),
|
|
117
|
-
report['filename'],
|
|
118
|
-
report['remoteSite'])
|
|
126
|
+
self.__logger(logging.DEBUG, 'message received: %s %s %s' % (str(report['eventType']), report['filename'], report['remoteSite']))
|
|
119
127
|
except Exception:
|
|
120
128
|
pass
|
|
121
129
|
|
|
122
130
|
if len(self.__ids) >= self.__chunksize:
|
|
123
131
|
self.__update_atime()
|
|
124
132
|
for msg_id in self.__ids:
|
|
125
|
-
self.
|
|
133
|
+
self.__conn.ack(msg_id, self.__subscription_id)
|
|
126
134
|
|
|
127
135
|
self.__reports = []
|
|
128
136
|
self.__ids = []
|
|
@@ -145,19 +153,16 @@ class AMQConsumer(ListenerBase):
|
|
|
145
153
|
if 'stateReason' in report and report['stateReason'] and isinstance(report['stateReason'], str) and pattern.match(report['stateReason']):
|
|
146
154
|
reason = report['stateReason'][:255]
|
|
147
155
|
if 'url' not in report or not report['url']:
|
|
148
|
-
self.
|
|
156
|
+
self.__logger(logging.ERROR, 'Missing url in the following trace : ' + str(report))
|
|
149
157
|
else:
|
|
150
158
|
try:
|
|
151
|
-
|
|
152
|
-
declare_bad_file_replicas([
|
|
153
|
-
self.
|
|
154
|
-
"Declare suspicious file %s with reason %s",
|
|
155
|
-
report['url'],
|
|
156
|
-
reason)
|
|
159
|
+
pfn = report['url']
|
|
160
|
+
declare_bad_file_replicas([pfn, ], reason=reason, issuer=InternalAccount('root', vo=report['vo']), status=BadFilesStatus.SUSPICIOUS)
|
|
161
|
+
self.__logger(logging.INFO, 'Declare suspicious file %s with reason %s' % (report['url'], reason))
|
|
157
162
|
except Exception as error:
|
|
158
|
-
self.
|
|
163
|
+
self.__logger(logging.ERROR, 'Failed to declare suspicious file' + str(error))
|
|
159
164
|
except Exception as error:
|
|
160
|
-
self.
|
|
165
|
+
self.__logger(logging.ERROR, 'Problem with bad trace : %s . Error %s' % (str(report), str(error)))
|
|
161
166
|
|
|
162
167
|
# check if scope in report. if not skip this one.
|
|
163
168
|
if 'scope' not in report:
|
|
@@ -220,7 +225,7 @@ class AMQConsumer(ListenerBase):
|
|
|
220
225
|
try:
|
|
221
226
|
rse_id = get_rse_id(rse=rse, vo=report['vo'])
|
|
222
227
|
except RSENotFound:
|
|
223
|
-
self.
|
|
228
|
+
self.__logger(logging.WARNING, "Cannot lookup rse_id for %s. Will skip this report.", rse)
|
|
224
229
|
METRICS.counter('rse_not_found').inc()
|
|
225
230
|
continue
|
|
226
231
|
replicas.append({'name': report['filename'], 'scope': report['scope'], 'rse': rse, 'rse_id': rse_id, 'accessed_at': datetime.utcfromtimestamp(report['traceTimeentryUnix']),
|
|
@@ -236,7 +241,7 @@ class AMQConsumer(ListenerBase):
|
|
|
236
241
|
try:
|
|
237
242
|
rse_id = get_rse_id(rse=rse, vo=report['vo'])
|
|
238
243
|
except RSENotFound:
|
|
239
|
-
self.
|
|
244
|
+
self.__logger(logging.WARNING, "Cannot lookup rse_id for %s.", rse)
|
|
240
245
|
METRICS.counter('rse_not_found').inc()
|
|
241
246
|
if 'datasetScope' in report:
|
|
242
247
|
self.__dataset_queue.put({'scope': InternalScope(report['datasetScope'], vo=report['vo']),
|
|
@@ -254,11 +259,11 @@ class AMQConsumer(ListenerBase):
|
|
|
254
259
|
'accessed_at': datetime.utcfromtimestamp(report['traceTimeentryUnix'])})
|
|
255
260
|
|
|
256
261
|
except (KeyError, AttributeError):
|
|
257
|
-
self.
|
|
262
|
+
self.__logger(logging.ERROR, "Cannot handle report.", exc_info=True)
|
|
258
263
|
METRICS.counter('report_error').inc()
|
|
259
264
|
continue
|
|
260
265
|
except Exception:
|
|
261
|
-
self.
|
|
266
|
+
self.__logger(logging.ERROR, "Exception", exc_info=True)
|
|
262
267
|
continue
|
|
263
268
|
|
|
264
269
|
for did in list_parent_dids(report['scope'], report['filename']):
|
|
@@ -271,15 +276,15 @@ class AMQConsumer(ListenerBase):
|
|
|
271
276
|
try:
|
|
272
277
|
rse_id = get_rse_id(rse=rse, vo=report['vo'])
|
|
273
278
|
except RSENotFound:
|
|
274
|
-
self.
|
|
279
|
+
self.__logger(logging.WARNING, "Cannot lookup rse_id for %s. Will skip this report.", rse)
|
|
275
280
|
METRICS.counter('rse_not_found').inc()
|
|
276
281
|
continue
|
|
277
282
|
self.__dataset_queue.put({'scope': did['scope'], 'name': did['name'], 'did_type': did['type'], 'rse_id': rse_id, 'accessed_at': datetime.utcfromtimestamp(report['traceTimeentryUnix'])})
|
|
278
283
|
|
|
279
|
-
if not replicas:
|
|
284
|
+
if not len(replicas):
|
|
280
285
|
return
|
|
281
286
|
|
|
282
|
-
self.
|
|
287
|
+
self.__logger(logging.DEBUG, "trying to update replicas: %s", replicas)
|
|
283
288
|
|
|
284
289
|
stopwatch = Stopwatch()
|
|
285
290
|
try:
|
|
@@ -296,50 +301,25 @@ class AMQConsumer(ListenerBase):
|
|
|
296
301
|
'eventVersion': replica['eventVersion']}
|
|
297
302
|
if replica['scope'].vo != 'def':
|
|
298
303
|
resubmit['vo'] = replica['scope'].vo
|
|
299
|
-
self.
|
|
304
|
+
self.__conn.send(body=jdumps(resubmit), destination=self.__queue, headers={'appversion': 'rucio', 'resubmitted': '1'})
|
|
300
305
|
METRICS.counter('sent_resubmitted').inc()
|
|
301
306
|
METRICS.timer('update_atime').observe(stopwatch.elapsed)
|
|
302
307
|
except Exception:
|
|
303
|
-
self.
|
|
308
|
+
self.__logger(logging.ERROR, "Cannot update replicas.", exc_info=True)
|
|
304
309
|
METRICS.counter('update_error').inc()
|
|
305
310
|
|
|
306
311
|
METRICS.counter('updated_replicas').inc()
|
|
307
312
|
|
|
308
313
|
|
|
309
|
-
def kronos_file(
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
314
|
+
def kronos_file(
|
|
315
|
+
once: bool = False,
|
|
316
|
+
dataset_queue: Optional[Queue] = None,
|
|
317
|
+
sleep_time: int = 60
|
|
318
|
+
) -> None:
|
|
313
319
|
"""
|
|
314
320
|
Main loop to consume tracer reports.
|
|
315
321
|
"""
|
|
316
|
-
|
|
317
|
-
try:
|
|
318
|
-
patterns = config_get_list(section='kronos', option='bad_files_patterns', session=None)
|
|
319
|
-
for pat in patterns:
|
|
320
|
-
bad_files_patterns.append(re.compile(pat.strip()))
|
|
321
|
-
except (NoOptionError, NoSectionError, RuntimeError):
|
|
322
|
-
logger(logging.ERROR, "Failed to get bad_file_patterns")
|
|
323
|
-
bad_files_patterns.clear()
|
|
324
|
-
except Exception as error:
|
|
325
|
-
logger(logging.ERROR, f'Failed to get bad_file_patterns {str(error)}')
|
|
326
|
-
bad_files_patterns.clear()
|
|
327
|
-
|
|
328
|
-
excluded_usrdns = set(config_get('tracer-kronos', 'excluded_usrdns').split(','))
|
|
329
|
-
|
|
330
|
-
subscription_id = config_get('tracer-kronos', 'subscription_id')
|
|
331
|
-
stomp_conn_mngr = StompConnectionManager(config_section='tracer-kronos',
|
|
332
|
-
logger=logger)
|
|
333
|
-
stomp_conn_mngr.set_listener_factory('rucio-tracer-kronos',
|
|
334
|
-
AMQConsumer,
|
|
335
|
-
queue=config_get('tracer-kronos', 'queue'),
|
|
336
|
-
chunksize=config_get_int('tracer-kronos', 'chunksize'),
|
|
337
|
-
subscription_id=subscription_id,
|
|
338
|
-
excluded_usrdns=excluded_usrdns,
|
|
339
|
-
dataset_queue=dataset_queue,
|
|
340
|
-
bad_files_patterns=bad_files_patterns,
|
|
341
|
-
heartbeats=stomp_conn_mngr.config.heartbeats)
|
|
342
|
-
|
|
322
|
+
stomp_conn_mngr = StompConnectionManager()
|
|
343
323
|
run_daemon(
|
|
344
324
|
once=once,
|
|
345
325
|
graceful_stop=graceful_stop,
|
|
@@ -356,20 +336,74 @@ def kronos_file(once: bool = False,
|
|
|
356
336
|
stomp_conn_mngr.disconnect()
|
|
357
337
|
|
|
358
338
|
|
|
359
|
-
def run_once_kronos_file(heartbeat_handler: HeartbeatHandler,
|
|
360
|
-
stomp_conn_mngr: StompConnectionManager,
|
|
361
|
-
dataset_queue: Queue,
|
|
362
|
-
sleep_time: int,
|
|
363
|
-
**kwargs: dict) -> None:
|
|
339
|
+
def run_once_kronos_file(heartbeat_handler: HeartbeatHandler, stomp_conn_mngr: StompConnectionManager, dataset_queue: Queue, sleep_time: int, **kwargs) -> None:
|
|
364
340
|
"""
|
|
365
341
|
Run the amq consumer once.
|
|
366
342
|
"""
|
|
367
343
|
_, _, logger = heartbeat_handler.live()
|
|
368
344
|
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
345
|
+
chunksize = config_get_int('tracer-kronos', 'chunksize')
|
|
346
|
+
prefetch_size = config_get_int('tracer-kronos', 'prefetch_size')
|
|
347
|
+
subscription_id = config_get('tracer-kronos', 'subscription_id')
|
|
348
|
+
# Load bad file patterns from config
|
|
349
|
+
try:
|
|
350
|
+
bad_files_patterns = []
|
|
351
|
+
pattern = config_get(section='kronos', option='bad_files_patterns', session=None)
|
|
352
|
+
pattern = str(pattern)
|
|
353
|
+
patterns = pattern.split(",")
|
|
354
|
+
for pat in patterns:
|
|
355
|
+
bad_files_patterns.append(re.compile(pat.strip()))
|
|
356
|
+
except (NoOptionError, NoSectionError, RuntimeError):
|
|
357
|
+
bad_files_patterns = []
|
|
358
|
+
except Exception as error:
|
|
359
|
+
logger.error(f'Failed to get bad_file_patterns {str(error)}')
|
|
360
|
+
bad_files_patterns = []
|
|
361
|
+
|
|
362
|
+
use_ssl = config_get_bool('tracer-kronos', 'use_ssl', default=True, raise_exception=False)
|
|
363
|
+
if not use_ssl:
|
|
364
|
+
username = config_get('tracer-kronos', 'username')
|
|
365
|
+
password = config_get('tracer-kronos', 'password')
|
|
366
|
+
|
|
367
|
+
excluded_usrdns = set(config_get_list('tracer-kronos', 'excluded_usrdns'))
|
|
368
|
+
vhost = config_get('tracer-kronos', 'broker_virtual_host', raise_exception=False)
|
|
369
|
+
|
|
370
|
+
brokers_alias = config_get_list('tracer-kronos', 'brokers')
|
|
371
|
+
port = config_get_int('tracer-kronos', 'port')
|
|
372
|
+
reconnect_attempts = config_get_int('tracer-kronos', 'reconnect_attempts')
|
|
373
|
+
ssl_key_file = config_get('tracer-kronos', 'ssl_key_file', raise_exception=False)
|
|
374
|
+
ssl_cert_file = config_get('tracer-kronos', 'ssl_cert_file', raise_exception=False)
|
|
375
|
+
|
|
376
|
+
created_conns, _ = stomp_conn_mngr.re_configure(
|
|
377
|
+
brokers=brokers_alias,
|
|
378
|
+
port=port,
|
|
379
|
+
use_ssl=use_ssl,
|
|
380
|
+
vhost=vhost,
|
|
381
|
+
reconnect_attempts=reconnect_attempts,
|
|
382
|
+
ssl_key_file=ssl_key_file,
|
|
383
|
+
ssl_cert_file=ssl_cert_file,
|
|
384
|
+
timeout=sleep_time,
|
|
385
|
+
heartbeats=(0, 5000),
|
|
386
|
+
logger=logger,
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
for conn in created_conns:
|
|
390
|
+
if not conn.is_connected():
|
|
391
|
+
logger(logging.INFO, 'connecting to %s' % str(conn.transport._Transport__host_and_ports[0]))
|
|
392
|
+
METRICS.counter('reconnect.{host}').labels(host=conn.transport._Transport__host_and_ports[0][0]).inc()
|
|
393
|
+
conn.set_listener('rucio-tracer-kronos', AMQConsumer(broker=conn.transport._Transport__host_and_ports[0],
|
|
394
|
+
conn=conn,
|
|
395
|
+
queue=config_get('tracer-kronos', 'queue'),
|
|
396
|
+
chunksize=chunksize,
|
|
397
|
+
subscription_id=subscription_id,
|
|
398
|
+
excluded_usrdns=excluded_usrdns,
|
|
399
|
+
dataset_queue=dataset_queue,
|
|
400
|
+
bad_files_patterns=bad_files_patterns,
|
|
401
|
+
logger=logger))
|
|
402
|
+
if not use_ssl:
|
|
403
|
+
conn.connect(username, password)
|
|
404
|
+
else:
|
|
405
|
+
conn.connect()
|
|
406
|
+
conn.subscribe(destination=config_get('tracer-kronos', 'queue'), ack='client-individual', id=subscription_id, headers={'activemq.prefetchSize': prefetch_size})
|
|
373
407
|
|
|
374
408
|
|
|
375
409
|
def kronos_dataset(dataset_queue: Queue, once: bool = False, sleep_time: int = 60) -> None:
|
|
@@ -388,16 +422,10 @@ def kronos_dataset(dataset_queue: Queue, once: bool = False, sleep_time: int = 6
|
|
|
388
422
|
)
|
|
389
423
|
|
|
390
424
|
# once again for potential backlog
|
|
391
|
-
run_once_kronos_dataset(dataset_queue=dataset_queue,
|
|
392
|
-
return_values=return_values,
|
|
393
|
-
heartbeat_handler=return_values['heartbeat_handler'],
|
|
394
|
-
sleep_time=sleep_time)
|
|
425
|
+
run_once_kronos_dataset(dataset_queue=dataset_queue, return_values=return_values, heartbeat_handler=return_values['heartbeat_handler'], sleep_time=sleep_time)
|
|
395
426
|
|
|
396
427
|
|
|
397
|
-
def run_once_kronos_dataset(dataset_queue: Queue,
|
|
398
|
-
return_values: dict,
|
|
399
|
-
heartbeat_handler: "HeartbeatHandler | None",
|
|
400
|
-
**kwargs) -> None:
|
|
428
|
+
def run_once_kronos_dataset(dataset_queue: Queue, return_values: dict, heartbeat_handler: HeartbeatHandler, **kwargs) -> None:
|
|
401
429
|
if heartbeat_handler is None:
|
|
402
430
|
if "heartbeat_handler" not in return_values.keys():
|
|
403
431
|
return_values["heartbeat_handler"] = HeartbeatHandler("kronos-dataset", 10)
|
|
@@ -467,7 +495,7 @@ def run_once_kronos_dataset(dataset_queue: Queue,
|
|
|
467
495
|
logger(logging.INFO, 'update done for %d collection replicas, %d failed (%ds)' % (total, failed, time() - start))
|
|
468
496
|
|
|
469
497
|
|
|
470
|
-
def stop(signum:
|
|
498
|
+
def stop(signum: Optional[int] = None, frame: Optional["FrameType"] = None) -> None:
|
|
471
499
|
"""
|
|
472
500
|
Graceful exit.
|
|
473
501
|
"""
|
|
@@ -478,34 +506,31 @@ def run(
|
|
|
478
506
|
once: bool = False,
|
|
479
507
|
threads: int = 1,
|
|
480
508
|
sleep_time_datasets: int = 60,
|
|
481
|
-
sleep_time_files: int = 60
|
|
509
|
+
sleep_time_files: int = 60
|
|
510
|
+
) -> None:
|
|
482
511
|
"""
|
|
483
512
|
Starts up the consumer threads
|
|
484
513
|
"""
|
|
485
514
|
setup_logging(process_name='tracer-kronos')
|
|
486
|
-
logger = formatted_logger(logging.log, 'Kronos %s')
|
|
487
515
|
|
|
488
516
|
if rucio.db.sqla.util.is_old_db():
|
|
489
517
|
raise DatabaseException('Database was not updated, daemon won\'t start')
|
|
490
518
|
|
|
491
519
|
dataset_queue = Queue()
|
|
492
|
-
|
|
520
|
+
logging.info('starting tracer consumer threads')
|
|
493
521
|
|
|
494
522
|
thread_list = []
|
|
495
|
-
for _ in range(threads):
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
while [thread.join(timeout=3.) for thread in thread_list if thread.is_alive()]:
|
|
511
|
-
pass
|
|
523
|
+
for _ in range(0, threads):
|
|
524
|
+
thread_list.append(Thread(target=kronos_file, kwargs={'once': once,
|
|
525
|
+
'sleep_time': sleep_time_files,
|
|
526
|
+
'dataset_queue': dataset_queue}))
|
|
527
|
+
thread_list.append(Thread(target=kronos_dataset, kwargs={'once': once,
|
|
528
|
+
'sleep_time': sleep_time_datasets,
|
|
529
|
+
'dataset_queue': dataset_queue}))
|
|
530
|
+
|
|
531
|
+
[thread.start() for thread in thread_list]
|
|
532
|
+
|
|
533
|
+
logging.info('waiting for interrupts')
|
|
534
|
+
|
|
535
|
+
while len(thread_list) > 0:
|
|
536
|
+
thread_list = [thread.join(timeout=3) for thread in thread_list if thread and thread.is_alive()]
|
rucio/vcsversion.py
CHANGED
|
@@ -4,8 +4,8 @@ This file is automatically generated; Do not edit it. :)
|
|
|
4
4
|
'''
|
|
5
5
|
VERSION_INFO = {
|
|
6
6
|
'final': True,
|
|
7
|
-
'version': '37.0.
|
|
7
|
+
'version': '37.0.0rc4',
|
|
8
8
|
'branch_nick': 'master',
|
|
9
|
-
'revision_id': '
|
|
10
|
-
'revno':
|
|
9
|
+
'revision_id': '9df77d169e527191a39190f0c041a668dc411509',
|
|
10
|
+
'revno': 13615
|
|
11
11
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
rucio/__init__.py,sha256=Y7cPPlHVQPFyN8bSPFC0W3WViEdONr5g_qwBub5rufE,660
|
|
2
2
|
rucio/alembicrevision.py,sha256=lNSQZYA4U_fsMW8l0dHpiV243XZhioqvVo9ihmpuQBo,690
|
|
3
|
-
rucio/vcsversion.py,sha256=
|
|
3
|
+
rucio/vcsversion.py,sha256=JcgHYpCCYCl2QDO0epkxp6KSzhHMcg6QuWqjCDoTDTA,243
|
|
4
4
|
rucio/version.py,sha256=IwsNb1QQk0D092QQbR2K9wBPF2Akny1RGs-ZZziUohE,1519
|
|
5
5
|
rucio/cli/__init__.py,sha256=GIkHmxgE3xdvWSf-7ZnvVaJmbs7NokaSjbFzsrXOG9o,662
|
|
6
6
|
rucio/cli/account.py,sha256=ocazNLsYvWVu-XfMxaXAhUjU7syd68Pu6sYb6jdiSbs,9032
|
|
@@ -60,7 +60,7 @@ rucio/common/logging.py,sha256=_G1QDFpPLghz2VXOjdhC7j-TtZBxmPJsyJtztW7mf68,15874
|
|
|
60
60
|
rucio/common/pcache.py,sha256=pgIfBJxXYPWlD70l8g3-CVTizk_UfzaZxE27NhTvq6w,47001
|
|
61
61
|
rucio/common/plugins.py,sha256=O6Snuhm2Tf2lyTA3cCBzSJB27RX1MY_r9mEAccrRCj4,7283
|
|
62
62
|
rucio/common/policy.py,sha256=2ByqoQQp4jpHdnnpq4-Ie7GwHslP8S9Zfu8qOqgzukU,3490
|
|
63
|
-
rucio/common/stomp_utils.py,sha256=
|
|
63
|
+
rucio/common/stomp_utils.py,sha256=3GTiRTJ0roe5OX_wgkVwOJYAIhGgYbhiROHc2M8LQT8,5414
|
|
64
64
|
rucio/common/stopwatch.py,sha256=_9zxoLjr8A0wUDJsljK4vZNDCI-dIOgpcxXiCNVJcHU,1641
|
|
65
65
|
rucio/common/test_rucio_server.py,sha256=2teFpN5Pthp-zQt1_aErOURDTgOhFP9GKdEr1NMmc4o,5085
|
|
66
66
|
rucio/common/types.py,sha256=THfYyGKy7KUEvkBgAXSkdI2SxZBlsSr6E3sF9OkEms4,11764
|
|
@@ -145,20 +145,20 @@ rucio/daemons/bb8/common.py,sha256=HUtzjhLwosp-Mxs6ynwfpCQfYPNIoeej4s2WuO9zZ8c,2
|
|
|
145
145
|
rucio/daemons/bb8/nuclei_background_rebalance.py,sha256=W3lkx6KMnnBiRrWW4WEqMhKPh2KGC5E82yFJg84Vaa4,6727
|
|
146
146
|
rucio/daemons/bb8/t2_background_rebalance.py,sha256=8oS1aBhh3jrBKDDF4U5UIt_a5BDuM2LW9uP4MLcx3Fk,6606
|
|
147
147
|
rucio/daemons/cache/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
148
|
-
rucio/daemons/cache/consumer.py,sha256=
|
|
148
|
+
rucio/daemons/cache/consumer.py,sha256=ZzBBs_EJtOFkBV3IhZo-tL65Hgp3yRS--YxuNrbwsm0,6956
|
|
149
149
|
rucio/daemons/conveyor/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
150
150
|
rucio/daemons/conveyor/common.py,sha256=HhruwAk-e8yYM-5L9Kebh46snjPbS4MCJ8UV5EkGrGM,26415
|
|
151
151
|
rucio/daemons/conveyor/finisher.py,sha256=6DJt2RNwWHsUXVfAVIfHcX-SHQt4aQoLpOx4vHE-Lek,24748
|
|
152
152
|
rucio/daemons/conveyor/poller.py,sha256=ui52xp_cMXNmjSt8MRyJc4mKQrS4VQMyFdqamKws5aU,16633
|
|
153
153
|
rucio/daemons/conveyor/preparer.py,sha256=xwpjQgSLY9zqOyc6pdUbV5-eb_nWMEAiOD_F9nYfXcs,8022
|
|
154
|
-
rucio/daemons/conveyor/receiver.py,sha256=
|
|
154
|
+
rucio/daemons/conveyor/receiver.py,sha256=w-3hyTse8XNNowmtExsX3ztMh8dNVG28dsCeIm2TbFE,8820
|
|
155
155
|
rucio/daemons/conveyor/stager.py,sha256=rrZ-nfPOQMHZzFnOi18JM6rnHlEQpOsPpNM4M89o_gg,4282
|
|
156
156
|
rucio/daemons/conveyor/submitter.py,sha256=CflHNigc7gx_3LrEQpL8RRqW0MDJ86BbB6qN2Rhf0u4,17146
|
|
157
157
|
rucio/daemons/conveyor/throttler.py,sha256=5jJ156GHDaGhF85BRj7CGjizpgobAhqf-ZaUiWHdDjU,22345
|
|
158
158
|
rucio/daemons/follower/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
159
159
|
rucio/daemons/follower/follower.py,sha256=ViDKnoDtCHQsxLd78uxJKp4tHeKxRebe74jsnK-uUmU,3438
|
|
160
160
|
rucio/daemons/hermes/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
161
|
-
rucio/daemons/hermes/hermes.py,sha256=
|
|
161
|
+
rucio/daemons/hermes/hermes.py,sha256=Z3vKranH8260SOnk76ELiPSANnX8sBBpxpa6hmJTWro,29781
|
|
162
162
|
rucio/daemons/judge/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
163
163
|
rucio/daemons/judge/cleaner.py,sha256=yCv9prY-L_rpkJE2YhkKcCtaDgs2SMGS9HKi_O1hKFM,5956
|
|
164
164
|
rucio/daemons/judge/evaluator.py,sha256=XfhX5LfqYrP_T_9oeTv5idMUteCFJGnDpaA182hlGFM,7415
|
|
@@ -182,7 +182,7 @@ rucio/daemons/storage/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0Yrg
|
|
|
182
182
|
rucio/daemons/storage/consistency/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
183
183
|
rucio/daemons/storage/consistency/actions.py,sha256=U84k6493ZsHn1fOTGvSoUUzg0p1jgCd3MS4F428BCXg,31815
|
|
184
184
|
rucio/daemons/tracer/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
185
|
-
rucio/daemons/tracer/kronos.py,sha256=
|
|
185
|
+
rucio/daemons/tracer/kronos.py,sha256=B7MFo0JAlBCG2VjqeLAYjC6Ix6wNqLOb5F3I41XSxZw,24291
|
|
186
186
|
rucio/daemons/transmogrifier/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
187
187
|
rucio/daemons/transmogrifier/transmogrifier.py,sha256=9-WC2Qcm0ccIBrVJ08VjF2bTemhEUkruMwKF6qnkICg,30664
|
|
188
188
|
rucio/daemons/undertaker/__init__.py,sha256=Q91iipvMQ0VzNMuYcYQfDujZ0vL-hrB4Kmd0YrgtHGQ,618
|
|
@@ -424,64 +424,64 @@ rucio/web/rest/flaskapi/v1/types.py,sha256=kY-nml_En9zwkKu9TEYwEZGaF2NJ09gN2IUY7
|
|
|
424
424
|
rucio/web/rest/flaskapi/v1/vos.py,sha256=mJy5hYmXW7SvhoJ9VBHSjVFx0FDANTIMCXCS28zk7P0,9158
|
|
425
425
|
rucio/web/rest/flaskapi/v1/templates/auth_crash.html,sha256=enhyVliQHlblgCEHvBzAlLxymFySlc42tk87vfWdBo0,2254
|
|
426
426
|
rucio/web/rest/flaskapi/v1/templates/auth_granted.html,sha256=SDsrTCQhwklLu3mDtSTUATnK16QG1T-eWDTDjmv8bn4,2139
|
|
427
|
-
rucio-37.0.
|
|
428
|
-
rucio-37.0.
|
|
429
|
-
rucio-37.0.
|
|
430
|
-
rucio-37.0.
|
|
431
|
-
rucio-37.0.
|
|
432
|
-
rucio-37.0.
|
|
433
|
-
rucio-37.0.
|
|
434
|
-
rucio-37.0.
|
|
435
|
-
rucio-37.0.
|
|
436
|
-
rucio-37.0.
|
|
437
|
-
rucio-37.0.
|
|
438
|
-
rucio-37.0.
|
|
439
|
-
rucio-37.0.
|
|
440
|
-
rucio-37.0.
|
|
441
|
-
rucio-37.0.
|
|
442
|
-
rucio-37.0.
|
|
443
|
-
rucio-37.0.
|
|
444
|
-
rucio-37.0.
|
|
445
|
-
rucio-37.0.
|
|
446
|
-
rucio-37.0.
|
|
447
|
-
rucio-37.0.
|
|
448
|
-
rucio-37.0.
|
|
449
|
-
rucio-37.0.
|
|
450
|
-
rucio-37.0.
|
|
451
|
-
rucio-37.0.
|
|
452
|
-
rucio-37.0.
|
|
453
|
-
rucio-37.0.
|
|
454
|
-
rucio-37.0.
|
|
455
|
-
rucio-37.0.
|
|
456
|
-
rucio-37.0.
|
|
457
|
-
rucio-37.0.
|
|
458
|
-
rucio-37.0.
|
|
459
|
-
rucio-37.0.
|
|
460
|
-
rucio-37.0.
|
|
461
|
-
rucio-37.0.
|
|
462
|
-
rucio-37.0.
|
|
463
|
-
rucio-37.0.
|
|
464
|
-
rucio-37.0.
|
|
465
|
-
rucio-37.0.
|
|
466
|
-
rucio-37.0.
|
|
467
|
-
rucio-37.0.
|
|
468
|
-
rucio-37.0.
|
|
469
|
-
rucio-37.0.
|
|
470
|
-
rucio-37.0.
|
|
471
|
-
rucio-37.0.
|
|
472
|
-
rucio-37.0.
|
|
473
|
-
rucio-37.0.
|
|
474
|
-
rucio-37.0.
|
|
475
|
-
rucio-37.0.
|
|
476
|
-
rucio-37.0.
|
|
477
|
-
rucio-37.0.
|
|
478
|
-
rucio-37.0.
|
|
479
|
-
rucio-37.0.
|
|
480
|
-
rucio-37.0.
|
|
481
|
-
rucio-37.0.
|
|
482
|
-
rucio-37.0.
|
|
483
|
-
rucio-37.0.
|
|
484
|
-
rucio-37.0.
|
|
485
|
-
rucio-37.0.
|
|
486
|
-
rucio-37.0.
|
|
487
|
-
rucio-37.0.
|
|
427
|
+
rucio-37.0.0rc4.data/data/rucio/requirements.server.txt,sha256=OLvhbLbJ_9J93IJg1_9D2jyRFteFXwd0j2qOLp7PMm0,5961
|
|
428
|
+
rucio-37.0.0rc4.data/data/rucio/etc/alembic.ini.template,sha256=3eFdZvlBhtyYQcRCWGoehy4xfHe0xXqUCnxC91Neg9k,1772
|
|
429
|
+
rucio-37.0.0rc4.data/data/rucio/etc/alembic_offline.ini.template,sha256=Zg39kR-_rmxU7X9BP5x68ccSx1UNMEOzOy2JC0D4O8c,1930
|
|
430
|
+
rucio-37.0.0rc4.data/data/rucio/etc/globus-config.yml.template,sha256=ADOplXW10bO5KZVYRavwKgNaDR0VmdJ3gVbINeqoSIA,96
|
|
431
|
+
rucio-37.0.0rc4.data/data/rucio/etc/ldap.cfg.template,sha256=2n-Exv81toCDZ6OzuNfMa71OoiLTdCSjWhkzCfSN3eM,806
|
|
432
|
+
rucio-37.0.0rc4.data/data/rucio/etc/rse-accounts.cfg.template,sha256=IfDnXVxBPUrMnTMbJnd3P7eYHgY1C4Kfz7xKskJs-FI,543
|
|
433
|
+
rucio-37.0.0rc4.data/data/rucio/etc/rucio.cfg.atlas.client.template,sha256=aHP1oX9m5yA8xVTTT2Hz6AyOYu92-Bcd5LF0i3AZRQw,1350
|
|
434
|
+
rucio-37.0.0rc4.data/data/rucio/etc/rucio.cfg.template,sha256=iqtbivJDlngApmuJDiOLDQPRlxDRfljpLmiT_tzlUrM,8081
|
|
435
|
+
rucio-37.0.0rc4.data/data/rucio/etc/rucio_multi_vo.cfg.template,sha256=NbvzcC9EZm0HpmjIC60KMPwOHHn9ScM5Twb4c6MoOHc,6992
|
|
436
|
+
rucio-37.0.0rc4.data/data/rucio/etc/mail_templates/rule_approval_request.tmpl,sha256=MTrB-IQEFE6TJnkwXjLxlUIc4afHmmrdQDC1S5og_dM,1210
|
|
437
|
+
rucio-37.0.0rc4.data/data/rucio/etc/mail_templates/rule_approved_admin.tmpl,sha256=HxYNm7EKG9cMNkwUNPgZUC7o0Q9-DTINh1JtGtHOYUg,105
|
|
438
|
+
rucio-37.0.0rc4.data/data/rucio/etc/mail_templates/rule_approved_user.tmpl,sha256=R4rssZ2hE8wcYPmAyc-UDpO5SPhMLZGNuYz6pvLjPVc,499
|
|
439
|
+
rucio-37.0.0rc4.data/data/rucio/etc/mail_templates/rule_denied_admin.tmpl,sha256=feXJ3pZynlESBuPoe_y8amB84UQnLaP6SHtRk3cn7ZA,120
|
|
440
|
+
rucio-37.0.0rc4.data/data/rucio/etc/mail_templates/rule_denied_user.tmpl,sha256=O054th_sVqZTFUeC3Gg_Qe8CrXQb-bxJhMaO48VMzzU,493
|
|
441
|
+
rucio-37.0.0rc4.data/data/rucio/etc/mail_templates/rule_ok_notification.tmpl,sha256=EiT0KucfIKYnIN5XO9XawzZAJSVRYlza5sn8VloyBy4,546
|
|
442
|
+
rucio-37.0.0rc4.data/data/rucio/tools/bootstrap.py,sha256=iI0Ue2mrRJdjFITm93DLHUBxDb_yfEoMUDpgO5Bqkhw,1259
|
|
443
|
+
rucio-37.0.0rc4.data/data/rucio/tools/merge_rucio_configs.py,sha256=u62K1EcCGydM5nZA30zhlqWo4EX5N87b_MDkx5YfzVI,6163
|
|
444
|
+
rucio-37.0.0rc4.data/data/rucio/tools/reset_database.py,sha256=ctvzWtRCQT69GNvmjDxtuSq8XM0B7VTdC0y-ALnHQsI,1351
|
|
445
|
+
rucio-37.0.0rc4.data/scripts/rucio,sha256=xQRL_0mwut48KxOgWZexsSx9jfnaZHqSTAo7OnCHAgA,5081
|
|
446
|
+
rucio-37.0.0rc4.data/scripts/rucio-abacus-account,sha256=C4ThueuI3gM3IVY9h1-T6xzkxFKMLmg2XTgSY7u7HXk,2806
|
|
447
|
+
rucio-37.0.0rc4.data/scripts/rucio-abacus-collection-replica,sha256=HD2acGu8xBDAsKGCA7oLQvcY5SdT1mIQhSrREDV2n_M,1809
|
|
448
|
+
rucio-37.0.0rc4.data/scripts/rucio-abacus-rse,sha256=3ws35qgLNh6FePNJMbPB2GDMvXw6rHGuxh5t8qVByNs,2553
|
|
449
|
+
rucio-37.0.0rc4.data/scripts/rucio-admin,sha256=AhPO6-fAPviHObhB_Yi7GJXKfjpaH6m0RqxwctBeFlE,4229
|
|
450
|
+
rucio-37.0.0rc4.data/scripts/rucio-atropos,sha256=o6KsmbjxbFgtKWl7gZbmBxBc3gYWax6FkkyfhUDmKbY,3171
|
|
451
|
+
rucio-37.0.0rc4.data/scripts/rucio-auditor,sha256=SXjgj5V9utNNhFYDO7pa7hejpJORZVPPQkhxguUWNyk,6114
|
|
452
|
+
rucio-37.0.0rc4.data/scripts/rucio-automatix,sha256=Lgud3OXVqUcBrPMtTAgSgPE5ZWSr74FBfBh0EoA9-E8,1996
|
|
453
|
+
rucio-37.0.0rc4.data/scripts/rucio-bb8,sha256=TD8P3cMiDB_knZKZcGTQsy8aA7nPQXMC1TNPCyXrsSg,3089
|
|
454
|
+
rucio-37.0.0rc4.data/scripts/rucio-cache-client,sha256=71-xm4MyxEDBlwnlviHsOgF0tx5EbADsPoVpj_DJDkA,5276
|
|
455
|
+
rucio-37.0.0rc4.data/scripts/rucio-cache-consumer,sha256=5mCXRQWwAww3aabTMQh-U9HgHFkCJf3VpTHdk9R-rsU,1348
|
|
456
|
+
rucio-37.0.0rc4.data/scripts/rucio-conveyor-finisher,sha256=mAexgdlj41UOwIQDZ5POU8gTRMuKzaOqhEww6cRV2rI,2333
|
|
457
|
+
rucio-37.0.0rc4.data/scripts/rucio-conveyor-poller,sha256=z2C17x3n_eKdDrL1w1ePJpslkbOw2UMTh5BaOw-__Es,2825
|
|
458
|
+
rucio-37.0.0rc4.data/scripts/rucio-conveyor-preparer,sha256=jlaBQbN8f081ekInQxn3QcNvrQQqedmdjQ6PeEp9JeU,1746
|
|
459
|
+
rucio-37.0.0rc4.data/scripts/rucio-conveyor-receiver,sha256=Tgg6oXQp1G31ZK_7OKh6fLvcO3GdGi55b7xho2I9B74,1669
|
|
460
|
+
rucio-37.0.0rc4.data/scripts/rucio-conveyor-stager,sha256=AaFzBHTahrv5--H16lbpUlXc64hijLL_myakuJ0V-oI,3371
|
|
461
|
+
rucio-37.0.0rc4.data/scripts/rucio-conveyor-submitter,sha256=IMENh4rK8w6KbjZaOD8UJEv5BHdiFDjhfsHmZZK-T80,6738
|
|
462
|
+
rucio-37.0.0rc4.data/scripts/rucio-conveyor-throttler,sha256=HS0vqTtMlrwUlsVM8a6aSHu0Kh4qkj52A3rqYuBy7bg,3845
|
|
463
|
+
rucio-37.0.0rc4.data/scripts/rucio-dark-reaper,sha256=GmQAUNmmJKJjeuY7jbQIHvrbdQWRJSlqojMF_6h8j2Y,2532
|
|
464
|
+
rucio-37.0.0rc4.data/scripts/rucio-dumper,sha256=zGfdsamPIUxbnDFDPM6FtqR1d3FH1AdC0gtH1JeLaxU,6729
|
|
465
|
+
rucio-37.0.0rc4.data/scripts/rucio-follower,sha256=sXVEogQcoH0IxLy5qO-cjly-aVPCJ7uVcVsZtfyd2Pk,1400
|
|
466
|
+
rucio-37.0.0rc4.data/scripts/rucio-hermes,sha256=i238hHzuv9JNUUPHNcOjnFQSs6BpPmz88t8ZFgS2GxI,1973
|
|
467
|
+
rucio-37.0.0rc4.data/scripts/rucio-judge-cleaner,sha256=AKF8Jz67xRjiInuex003AXxTnOwTN2DQN38RS9jkrLY,4635
|
|
468
|
+
rucio-37.0.0rc4.data/scripts/rucio-judge-evaluator,sha256=JrWN2ZatnUig5iWM7Ku4nEspXBjaucOrc8Ic55_OCzc,7458
|
|
469
|
+
rucio-37.0.0rc4.data/scripts/rucio-judge-injector,sha256=d6na_n4H7njpUmJQg2Gc4KlbgK0_xuW5vw3waLReLTQ,1657
|
|
470
|
+
rucio-37.0.0rc4.data/scripts/rucio-judge-repairer,sha256=QHeBySAn1bYS17z5dTfq8o81uEUpqhGVUqe6KWZBVmQ,1661
|
|
471
|
+
rucio-37.0.0rc4.data/scripts/rucio-kronos,sha256=WQQ0izYfdVvmfaaRkqSf4mejL-U86OL5mD5v1t2p6Eg,1770
|
|
472
|
+
rucio-37.0.0rc4.data/scripts/rucio-minos,sha256=-utVl82-xd7zxp4yy1udqCm_MehRP7pU5WDdJ7EFuac,2246
|
|
473
|
+
rucio-37.0.0rc4.data/scripts/rucio-minos-temporary-expiration,sha256=E9G_h__cJNWuEcFDoeBFjzCHqp1swW-ff67M2WpZ3eg,1983
|
|
474
|
+
rucio-37.0.0rc4.data/scripts/rucio-necromancer,sha256=axQkxvue4PyLv5zQLyEtarTA1JgQIDJYDdLqEc7I4Ww,5612
|
|
475
|
+
rucio-37.0.0rc4.data/scripts/rucio-oauth-manager,sha256=qqFyI_L-bHg4R6a3OSgL_RsmosuODykX7HM-u0Mr-nY,2776
|
|
476
|
+
rucio-37.0.0rc4.data/scripts/rucio-reaper,sha256=c0aMDs0N0ubKcl5T5aHunqaBcmIIj6WmERReKTS9di4,3773
|
|
477
|
+
rucio-37.0.0rc4.data/scripts/rucio-replica-recoverer,sha256=GOf1qc0QD5sbWXPwBP2uWyjSi3VPMXCnOXa85h45PV4,19002
|
|
478
|
+
rucio-37.0.0rc4.data/scripts/rucio-rse-decommissioner,sha256=zXXTq1lPzoI5R012fGWrxXi9VcHZNIfB85EefwQN1kw,2337
|
|
479
|
+
rucio-37.0.0rc4.data/scripts/rucio-storage-consistency-actions,sha256=Mb4GUO1kP7HdiCORhHkYfmfZIhJKp88RBr8TEC19HXo,3906
|
|
480
|
+
rucio-37.0.0rc4.data/scripts/rucio-transmogrifier,sha256=i17F1FTrxharmCWVZpylXSH2Xow2KaxkTr2jzDFn8Rc,3350
|
|
481
|
+
rucio-37.0.0rc4.data/scripts/rucio-undertaker,sha256=HQ-irdSrsftrsS8NdVjGhxYlFE4hDVo9bh32jTwNCCc,2706
|
|
482
|
+
rucio-37.0.0rc4.dist-info/licenses/AUTHORS.rst,sha256=c4MEJjLcFZ5euNtPA7jGFL26javbFKpWTvxBoIs_l6w,4726
|
|
483
|
+
rucio-37.0.0rc4.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
484
|
+
rucio-37.0.0rc4.dist-info/METADATA,sha256=wpdmZod1T8X0dRugMWhMS1OJYvy4xdrK_rUyiaEGaWQ,2966
|
|
485
|
+
rucio-37.0.0rc4.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
|
486
|
+
rucio-37.0.0rc4.dist-info/top_level.txt,sha256=lJM8plwW0ePPICkwFnpYzfdqHnSv6JZr1OD4JEysPgM,6
|
|
487
|
+
rucio-37.0.0rc4.dist-info/RECORD,,
|
|
File without changes
|