|
19 | 19 | from pyspark.sql.window import Window |
20 | 20 | import pandas as pd |
21 | 21 | from rucio.client import Client |
| 22 | +from rucio.common.exception import InvalidRSEExpression, DataIdentifierNotFound |
| 23 | + |
| 24 | +def includes_rse_safe(client,exp, rse): |
| 25 | + try: |
| 26 | + return {'rse': rse} in list( |
| 27 | + client.list_rses(rse_expression=exp) |
| 28 | + ) |
| 29 | + except InvalidRSEExpression as e: |
| 30 | + return False |
| 31 | + except Exception as e: |
| 32 | + return False |
| 33 | + |
| 34 | +def list_rules_safe(client,d): |
| 35 | + try: |
| 36 | + return client.list_associated_rules_for_file(scope=d["scope"], name=d["name"]) |
| 37 | + except DataIdentifierNotFound: |
| 38 | + return [] |
22 | 39 |
|
23 | 40 |
|
24 | 41 | @click.command() |
@@ -59,16 +76,18 @@ def invalidate_files(filename, rse, mode): |
59 | 76 | df_delete.drop_duplicates().to_csv('/input/rucio_replicas_inv.csv',index=False) |
60 | 77 |
|
61 | 78 | #Replicas to the rules |
62 | | - df_rules = pd.DataFrame(columns=['subscription_id', 'rse_expression', 'source_replica_expression', 'ignore_account_limit', 'created_at', 'account', 'copies', 'activity', 'priority', 'updated_at', 'scope', 'expires_at', 'grouping', 'name', 'weight', 'notification', 'comments', 'did_type', 'locked', 'stuck_at', 'child_rule_id', 'state', 'locks_ok_cnt', 'purge_replicas', 'eol_at', 'id', 'error', 'locks_replicating_cnt', 'ignore_availability', 'split_container', 'locks_stuck_cnt', 'meta', 'bytes']) |
63 | | - rules = [list(rucio_client.list_associated_rules_for_file(scope=d['scope'],name=d['name'])) for d in dict_delete] |
64 | | - for r in rules: |
65 | | - if df_rules.shape[0]==0 and len(r)>0: |
66 | | - df_rules = pd.DataFrame(r) |
67 | | - else: |
68 | | - df_rules = pd.concat([df_rules,pd.DataFrame(r)],axis=0) |
| 79 | + rules = [rule for d in dict_delete for rule in list_rules_safe(rucio_client,d)] |
| 80 | + |
| 81 | + df_rules = pd.DataFrame( |
| 82 | + rules, |
| 83 | + columns=['subscription_id', 'rse_expression', 'source_replica_expression','ignore_account_limit', 'created_at', 'account', 'copies', 'activity', |
| 84 | + 'priority', 'updated_at', 'scope', 'expires_at', 'grouping', 'name','weight', 'notification', 'comments', 'did_type', 'locked', 'stuck_at', |
| 85 | + 'child_rule_id', 'state', 'locks_ok_cnt', 'purge_replicas', 'eol_at','id', 'error', 'locks_replicating_cnt', 'ignore_availability', |
| 86 | + 'split_container', 'locks_stuck_cnt', 'meta', 'bytes'] |
| 87 | + ) |
69 | 88 |
|
70 | 89 | if rse is not None: |
71 | | - df_rules['includes_rse'] = df_rules['rse_expression'].apply(lambda exp: {'rse':rse} in list(rucio_client.list_rses(rse_expression=exp))) |
| 90 | + df_rules['includes_rse'] = df_rules['rse_expression'].apply(lambda exp: includes_rse_safe(rucio_client,exp, rse)) |
72 | 91 | df_rules = df_rules.loc[df_rules.includes_rse] |
73 | 92 |
|
74 | 93 | #Rules protecting the replicas at File level |
|
0 commit comments