Skip to content

Commit b106af3

Browse files
authored
Merge pull request #9 from maierbenedikt/production
Updating (disowning) block replicas
2 parents b43259a + 5c22664 commit b106af3

3 files changed

Lines changed: 62 additions & 0 deletions

File tree

lib/common/interface/mysqlstore.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1228,6 +1228,35 @@ def _do_delete_blockreplicas(self, replica_list): #override
12281228

12291229
self._mysql.query(sql)
12301230

1231+
def _do_update_blockreplicas(self, replica_list): #override
1232+
# Mass block replica update (e.g. unsubscription after a deletion) typically happens for a few sites and a few datasets.
1233+
# Fetch site id first to avoid a long query.
1234+
1235+
if len(replica_list) == 0:
1236+
return
1237+
1238+
sites = list(set([r.site for r in replica_list])) # list of sites
1239+
datasets = list(set([r.block.dataset for r in replica_list])) # list of datasets
1240+
groups = list(set([r.block.group for r in replica_list])) # list of groups
1241+
1242+
site_id_map = {}
1243+
self._make_site_map(sites, site_id_map = site_id_map)
1244+
group_id_map = {}
1245+
self._make_group_map(groups, group_id_map = group_id_map)
1246+
dataset_id_map = {}
1247+
self._make_dataset_map(datasets, dataset_id_map = dataset_id_map)
1248+
1249+
for dataset in datasets:
1250+
for block_id, block_name in self._mysql.xquery('SELECT `id`, `name` FROM `blocks` WHERE `dataset_id` = %s', dataset_id_map[dataset]):
1251+
block_name_to_id[Block.translate_name(block_name)] = block_id
1252+
1253+
all_replicas = []
1254+
for replica in replica_list:
1255+
all_replicas.append((block_name_to_id[replica.block.name], site_id_map[replica.site], group_id_map[replica.group], replica.is_complete, replica.is_custodial, time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(block_replica.last_update))))
1256+
1257+
fields = ('block_id', 'site_id', 'group_id', 'is_complete', 'is_custodial', 'last_update')
1258+
self._mysql.insert_many('block_replicas', fields, None, all_replicas, do_update = True)
1259+
12311260
def _do_set_dataset_status(self, dataset_name, status_str): #override
12321261
self._mysql.query('UPDATE `datasets` SET `status` = %s WHERE `name` LIKE %s', status_str, dataset_name)
12331262

lib/common/interface/store.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,32 @@ def delete_blockreplicas(self, replica_list):
558558
finally:
559559
self.release_lock()
560560

561+
def update_blockreplica(self, replica):
562+
"""
563+
Update block replica in persistent storage.
564+
"""
565+
566+
if config.read_only:
567+
logger.debug('_do_update_blockreplica(%s:%s)', replica.site.name, replica.block.real_name())
568+
return
569+
570+
self.update_blockreplicas([replica])
571+
572+
def update_blockreplicas(self, replica_list):
573+
"""
574+
Update a set of block replicas in persistent storage.
575+
"""
576+
577+
if config.read_only:
578+
logger.debug('_do_update_blockreplicas(%d replicas)', len(replica_list))
579+
return
580+
581+
self.acquire_lock()
582+
try:
583+
self._do_update_blockreplicas(replica_list)
584+
finally:
585+
self.release_lock()
586+
561587
def set_dataset_status(self, dataset, status):
562588
"""
563589
Set and save dataset status

lib/detox/main.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,13 @@ def commit_deletions(self, run_number, policy, deletion_list, is_test, comment):
491491

492492
for deletion_id, (approved, replicas) in deletion_mapping.iteritems():
493493
size = sum([r.size() for r in replicas])
494+
for replica in replicas:
495+
blockreplicas = []
496+
for block_replica in replica.block_replicas:
497+
blockreplica = block_replica.clone(group = None)
498+
blockreplicas.append(blockreplica)
499+
500+
self.inventory_manager.store.update_blockreplicas(blockreplicas)
494501

495502
if approved and not is_test:
496503
total_size += size

0 commit comments

Comments
 (0)