Skip to content

Commit 2b1a270

Browse files
Merge pull request #22 from yiiyama/production
Not considering replicas for deletions if on certain site
2 parents db2e0b5 + 8915d09 commit 2b1a270

5 files changed

Lines changed: 39 additions & 0 deletions

File tree

lib/common/interface/mysqlstore.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,14 @@ def _do_load_files(self, dataset): #override
523523

524524
dataset.files.add(lfile)
525525

526+
def _do_check_if_on(self, datasetname, sitename): #override
527+
query = 'SELECT COUNT(*) FROM `datasets` AS d'
528+
query += ' INNER JOIN `dataset_replicas` AS dr ON dr.`dataset_id` = d.`id`'
529+
query += ' INNER JOIN `sites` AS s ON s.`id` = dr.`site_id`'
530+
query += ' WHERE d.`name` = %s and s.`name` = %s'
531+
532+
return (self._mysql.query(query, datasetname, sitename)[0] != 0)
533+
526534
def _do_find_block_of(self, fullpath, datasets): #override
527535
query = 'SELECT d.`name`, b.`name` FROM `files` AS f'
528536
query += ' INNER JOIN `datasets` AS d ON d.`id` = f.`dataset_id`'

lib/common/interface/store.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,15 @@ def load_files(self, dataset):
268268
finally:
269269
self.release_lock()
270270

271+
def check_if_on(self, datasetname, sitename):
272+
"""
273+
Return true/false if replica is on specific site.
274+
"""
275+
276+
logger.debug('_do_check_if_on()')
277+
278+
return self._do_check_if_on(datasetname, sitename)
279+
271280
def find_block_of(self, fullpath, datasets):
272281
"""
273282
Return the Block object for the given file.

lib/detox/configuration.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@
44
activity_indicator = '/home/cmsprod/public_html/IntelROCCS/Detox/inActionLock.txt',
55
deletion_per_iteration = 0.01, # fraction of quota to delete per iteration
66
deletion_volume_per_request = 50, # size to delete per deletion request in TB
7+
exclude_if_on = ['T1_IT_CNAF_MSS'], # if a dataset has a replica on these [sites], don't consider it for deletions. Introduced because of CNAF indicent.
78
time_shift = 0. # number of days in the future from which to evaluate the policies
89
)

lib/detox/main.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,16 @@ def _execute_policy(self, policy, is_test, comment):
9999
# will also select out replicas on sites with quotas
100100
all_replicas = policy.partition_replicas(self.inventory_manager, target_sites)
101101

102+
# check if replica is present on other site(s) that trigger exclusion from the possible deletion
103+
# possible use case: a tape site has had a water indicident, for example
104+
# Communication with database is needed because we do not have all (tape) replicas in memory
105+
if len(detox_config.main.exclude_if_on) > 0:
106+
for replica in all_replicas:
107+
ds_name = replica.dataset.name
108+
for sitename in detox_config.main.exclude_if_on:
109+
if self.inventory_manager.store.check_if_on(ds_name,sitename):
110+
replica.dataset.demand['on_protected_site'] = True
111+
102112
logger.info('Saving site and dataset states.')
103113

104114
# update site and dataset lists

lib/detox/variables.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,16 @@ def _get(self, dataset):
104104
except KeyError:
105105
return 0.
106106

107+
class DatasetOnProtectedSite(DatasetAttr):
108+
def __init__(self):
109+
DatasetAttr.__init__(self, Attr.BOOL_TYPE)
110+
111+
def _get(self, dataset):
112+
try:
113+
return dataset.demand['on_protected_site']
114+
except KeyError:
115+
return False
116+
107117
class ReplicaSize(DatasetReplicaAttr):
108118
def __init__(self):
109119
DatasetReplicaAttr.__init__(self, Attr.NUMERIC_TYPE)
@@ -272,6 +282,7 @@ def _get(self, site):
272282
'dataset.usage_rank': DatasetUsageRank(),
273283
'dataset.demand_rank': DatasetDemandRank(),
274284
'dataset.release': DatasetRelease(),
285+
'dataset.on_protected_site': DatasetOnProtectedSite(),
275286
'replica.is_last_transfer_source': ReplicaIsLastSource(),
276287
'replica.size': ReplicaSize(),
277288
'replica.incomplete': ReplicaIncomplete(),

0 commit comments

Comments
 (0)