@@ -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
0 commit comments