Skip to content

Commit 853e06b

Browse files
committed
fix: Optimize SandboxMetadataDB.unassignEntities
1 parent 25721d3 commit 853e06b

1 file changed

Lines changed: 29 additions & 35 deletions

File tree

src/DIRAC/WorkloadManagementSystem/DB/SandboxMetadataDB.py

Lines changed: 29 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from DIRAC.Core.Base.DB import DB
66
from DIRAC.Core.Security import Properties
77
from DIRAC.Core.Utilities import List
8+
from DIRAC.Core.Utilities.ReturnValues import convertToReturnValue, returnValueOrRaise
89

910

1011
class SandboxMetadataDB(DB):
@@ -219,11 +220,8 @@ def assignSandboxesToEntities(self, enDict, requesterName, requesterGroup, owner
219220
return result
220221
return S_OK(assigned)
221222

222-
def __filterEntitiesByRequester(self, entitiesList, requesterName, requesterGroup):
223-
"""
224-
Given a list of entities and a requester, return the ones that the requester is allowed to modify
225-
"""
226-
sqlCond = ["s.OwnerId=o.OwnerId", "s.SBId=e.SBId"]
223+
def __entitiesByRequesterCond(self, requesterName, requesterGroup):
224+
sqlCond = []
227225
requesterProps = Registry.getPropertiesForEntity(requesterGroup, name=requesterName)
228226
if Properties.JOB_ADMINISTRATOR in requesterProps:
229227
# Do nothing, just ensure it doesn't fit in the other cases
@@ -235,44 +233,40 @@ def __filterEntitiesByRequester(self, entitiesList, requesterName, requesterGrou
235233
sqlCond.append(f"o.Owner='{requesterName}'")
236234
else:
237235
return S_ERROR("Not authorized to access sandbox")
238-
for i in range(len(entitiesList)):
239-
entitiesList[i] = self._escapeString(entitiesList[i])["Value"]
240-
if len(entitiesList) == 1:
241-
sqlCond.append(f"e.EntityId = {entitiesList[0]}")
242-
else:
243-
sqlCond.append(f"e.EntityId in ( {', '.join(entitiesList)} )")
244-
sqlCmd = "SELECT DISTINCT e.EntityId FROM `sb_EntityMapping` e, `sb_SandBoxes` s, `sb_Owners` o WHERE"
245-
sqlCmd = f"{sqlCmd} {' AND '.join(sqlCond)}"
246-
result = self._query(sqlCmd)
247-
if not result["OK"]:
248-
return result
249-
return S_OK([row[0] for row in result["Value"]])
236+
return sqlCond
250237

238+
@convertToReturnValue
251239
def unassignEntities(self, entities, requesterName, requesterGroup):
252240
"""
253241
Unassign jobs to sandboxes
254242
255243
:param list entities: list of entities to unassign
256244
"""
257-
updated = 0
258245
if not entities:
259-
return S_OK()
260-
result = self.__filterEntitiesByRequester(entities, requesterName, requesterGroup)
261-
if not result["OK"]:
262-
gLogger.error("Cannot filter entities", result["Message"])
263-
return result
264-
ids = result["Value"]
265-
if not ids:
266-
return S_OK(0)
267-
sqlCmd = "DELETE FROM `sb_EntityMapping` WHERE EntityId in ( %s )" % ", ".join(
268-
["'%s'" % str(eid) for eid in ids]
269-
)
270-
result = self._update(sqlCmd)
271-
if not result["OK"]:
272-
gLogger.error("Cannot unassign entities", result["Message"])
273-
else:
274-
updated += 1
275-
return S_OK(updated)
246+
return None
247+
conds = self.__entitiesByRequesterCond(requesterName, requesterGroup)
248+
249+
sqlCmd = "CREATE TEMPORARY TABLE to_delete_EntityId (EntityId VARCHAR(128) NOT NULL, PRIMARY KEY (EntityId)) ENGINE=MEMORY;"
250+
returnValueOrRaise(self._update(sqlCmd))
251+
try:
252+
sqlCmd = "INSERT INTO to_delete_EntityId (EntityId) VALUES ( %s )"
253+
returnValueOrRaise(self._updatemany(sqlCmd, [(e,) for e in entities]))
254+
sqlCmd = "DELETE m from `sb_EntityMapping` m JOIN to_delete_EntityId t USING (EntityId)"
255+
if conds:
256+
sqlCmd = " ".join(
257+
[
258+
sqlCmd,
259+
"JOIN `sb_SandBoxes` s ON s.SBId = m.SBId",
260+
"JOIN `sb_Owners` o ON s.OwnerId = o.OwnerId",
261+
"WHERE",
262+
" AND ".join(conds),
263+
]
264+
)
265+
returnValueOrRaise(self._update(sqlCmd))
266+
finally:
267+
sqlCmd = "DROP TEMPORARY TABLE to_delete_EntityId"
268+
returnValueOrRaise(self._update(sqlCmd))
269+
return 1
276270

277271
def getSandboxesAssignedToEntity(self, entityId, requesterName, requesterGroup, requestedVO):
278272
"""

0 commit comments

Comments
 (0)