Source code for glideinwms.unittests.profile_frontend
#!/usr/bin/env python3
# SPDX-FileCopyrightText: 2009 Fermi Research Alliance, LLC
# SPDX-License-Identifier: Apache-2.0
#
# Project:
# glideinWMS
#
# Description:
# profile the countMatch frontend function
# Uncomment lines in glideinFrontendElement.subprocess_count_dt to get the data to execute this script
#
# Author:
# Marco Mascheroni
#
import cProfile
import glob
import os
import pickle
import sys
from glideinwms.lib import logSupport
# from glideinwms.frontend.glideinFrontendLib import countMatch
# Replicating the class since this should be executed standalone on a production frontend
[docs]
class FakeLogger:
"""
Super simple logger for the unittests
"""
def __init__(self, afile=sys.stderr):
self.file = afile
pass
[docs]
def debug(self, msg, *args):
"""
Pass a debug message to stderr.
Prints out msg % args.
@param msg: A message string.
@param args: Arguments which should be evaluated into the message.
"""
print(str(msg) % args, file=self.file)
[docs]
def info(self, msg, *args):
"""
Pass an info-level message to stderr.
@see: debug
"""
print(str(msg) % args, file=self.file)
[docs]
def warning(self, msg, *args):
"""
Pass a warning-level message to stderr.
@see: debug
"""
print(str(msg) % args, file=self.file)
[docs]
def error(self, msg, *args):
"""
Pass an error message to stderr.
@see: debug
"""
print(str(msg) % args, file=self.file)
[docs]
def exception(self, msg, *args):
"""
Pass an exception message to stderr.
@see: debug
"""
print(str(msg) % args, file=self.file)
[docs]
class mock_condorq_el:
def __init__(self, obj):
self.obj = obj
[docs]
def fetchStored(self):
return self.obj
[docs]
def main():
# Need to be global for cProfile to work
global cexpr, condorq_dict, glidein_dict, attr_dict, condorq_match_list
dumpdir = "/tmp/frontend_dump/main/" # This will profile the main group. Change it to profile another one
# The CMS matching expression as of April 17th 2019
mexpr = """(((glidein["attrs"].get("GLIDEIN_MaxMemMBs", 0) == 0) or (job.get("RequestMemory", 0)<=glidein["attrs"]["GLIDEIN_MaxMemMBs"])) and ((job.get("REQUIRED_OS", "any")=="any") or (glidein["attrs"].get("GLIDEIN_REQUIRED_OS", "any")=="any") or (job.get("REQUIRED_OS")==glidein["attrs"]["GLIDEIN_REQUIRED_OS"])) and ((job.get("MaxWallTimeMins", 0)*60)>=glidein["attrs"].get("GLIDEIN_Job_Min_Time", 0)) and ((job.get("MaxWallTimeMins", 0)+10)<(glidein["attrs"]["GLIDEIN_Max_Walltime"]-glidein["attrs"]["GLIDEIN_Retire_Time_Spread"])/60))"""
logSupport.log = FakeLogger()
# Load the saved dictionaries
with open(os.path.join(dumpdir, "glidein_dict.pickle"), "rb") as fd:
glidein_dict = pickle.load(fd)
with open(os.path.join(dumpdir, "attr_dict.pickle"), "rb") as fd:
attr_dict = pickle.load(fd)
with open(os.path.join(dumpdir, "condorq_match_list.pickle"), "rb") as fd:
condorq_match_list = pickle.load(fd)
cexpr = compile(mexpr, "<string>", "eval")
# The condor_q dictionary names depend on the schedd names, use glob to get them
cwd = os.getcwd()
os.chdir(dumpdir)
qdicts = glob.glob("condorq_dict*.pickle")
os.chdir(cwd)
condorq_dict = {}
for schedd_name in qdicts:
with open(os.path.join(dumpdir, schedd_name), "rb") as fd:
condorq_dict[schedd_name] = mock_condorq_el(pickle.load(fd))
print("Frontend dump loaded")
cProfile.run("countMatch(cexpr, condorq_dict, glidein_dict, attr_dict, condorq_match_list)")
if __name__ == "__main__":
main()