File indexing completed on 2026-04-10 08:39:07
0001 import datetime
0002 import optparse
0003 import re
0004
0005 from pandacommon.pandautils.PandaUtils import naive_utcnow
0006
0007 from pandaserver.config import panda_config
0008 from pandaserver.taskbuffer.OraDBProxy import DBProxy
0009 from pandaserver.userinterface import Client
0010
0011 usage = "%prog [options] siteName"
0012 option_parser = optparse.OptionParser(usage=usage, conflict_handler="resolve")
0013 option_parser.add_option(
0014 "--assigned",
0015 action="store_const",
0016 const=True,
0017 dest="assigned",
0018 default=False,
0019 help="reassign jobs in assigned state. Jobs in activated state are reassigned by default",
0020 )
0021 option_parser.add_option(
0022 "--olderThan",
0023 action="store",
0024 dest="olderThan",
0025 default=1,
0026 help="reassign jobs with modificationTime older than N hours (1 by default)",
0027 )
0028 options, args = option_parser.parse_args()
0029
0030
0031
0032 proxyS = DBProxy()
0033 proxyS.connect(panda_config.dbhost, panda_config.dbpasswd, panda_config.dbuser, panda_config.dbname)
0034
0035 site = args[0]
0036
0037 try:
0038 options.olderThan = int(options.olderThan)
0039 except Exception:
0040 pass
0041 timeLimit = naive_utcnow() - datetime.timedelta(hours=options.olderThan)
0042 varMap = {}
0043 if options.assigned:
0044 varMap[":jobStatus"] = "assigned"
0045 else:
0046 varMap[":jobStatus"] = "activated"
0047 varMap[":modificationTime"] = timeLimit
0048 varMap[":prodSourceLabel"] = "managed"
0049 varMap[":computingSite"] = site
0050 if options.assigned:
0051 sql = "SELECT PandaID,lockedby FROM ATLAS_PANDA.jobsDefined4 "
0052 else:
0053 sql = "SELECT PandaID,lockedby FROM ATLAS_PANDA.jobsActive4 "
0054 sql += (
0055 "WHERE jobStatus=:jobStatus AND computingSite=:computingSite AND modificationTime<:modificationTime AND prodSourceLabel=:prodSourceLabel ORDER BY PandaID"
0056 )
0057 status, res = proxyS.querySQLS(sql, varMap)
0058
0059 print(f"got {len(res)} jobs")
0060
0061 jobs = []
0062 jediJobs = []
0063 if res is not None:
0064 for id, lockedby in res:
0065 if lockedby == "jedi":
0066 jediJobs.append(id)
0067 else:
0068 jobs.append(id)
0069 if len(jobs):
0070 nJob = 100
0071 iJob = 0
0072 while iJob < len(jobs):
0073 print(f"reassign {str(jobs[iJob:iJob + nJob])}")
0074 Client.reassign_jobs(jobs[iJob : iJob + nJob])
0075 iJob += nJob
0076 if len(jediJobs) != 0:
0077 nJob = 100
0078 iJob = 0
0079 while iJob < len(jediJobs):
0080 print(f"kill JEDI jobs {str(jediJobs[iJob:iJob + nJob])}")
0081 Client.kill_jobs(jediJobs[iJob : iJob + nJob], 51)
0082 iJob += nJob