Files
mongo/buildscripts/resmokelib/powercycle/remote_hang_analyzer/__init__.py
Juan Gu 2513cc511b SERVER-94076 Remove unused imports via Ruff rule (#27337)
GitOrigin-RevId: 8923cc14f276be93355d763cb88c04bdb4dd9000
2024-10-04 01:43:13 +00:00

63 lines
2.6 KiB
Python

"""Run the hang analyzer on the remote powercycle instance."""
import re
from buildscripts.resmokelib.powercycle import powercycle_constants
from buildscripts.resmokelib.powercycle.lib import PowercycleCommand
from buildscripts.resmokelib.powercycle.lib.remote_operations import SSHOperation
class RunHangAnalyzerOnRemoteInstance(PowercycleCommand):
"""Run the hang-analyzer on a remote instance."""
COMMAND = "runHangAnalyzerOnRemoteInstance"
def execute(self) -> None:
""":return: None."""
if "private_ip_address" not in self.expansions:
return
hang_analyzer_processes = (
"dbtest,java,mongo,mongod,mongos,python,_test"
if "hang_analyzer_processes" not in self.expansions
else self.expansions["hang_analyzer_processes"]
)
hang_analyzer_option = f"-o file -o stdout -p {hang_analyzer_processes}"
hang_analyzer_dump_core = (
True
if "hang_analyzer_dump_core" not in self.expansions
else self.expansions["hang_analyzer_dump_core"]
)
if hang_analyzer_dump_core:
hang_analyzer_option = f"-c {hang_analyzer_option}"
core_ext = "core"
if self.is_windows():
core_ext = "mdmp"
remote_dir = powercycle_constants.REMOTE_DIR
files = self._call("ls")[1].split("\n")
dbg_regex = re.compile(r"(\.debug$)|(\.dSYM$)|(\.pdb$)")
debug_files = [f for f in files if dbg_regex.match(f)]
file_param = []
for debug_file in debug_files:
file_param.append(debug_file)
if file_param:
self.remote_op.operation(SSHOperation.COPY_TO, file_param, remote_dir)
# Activate virtualenv on remote host. The virtualenv bin_dir is different for Linux and
# Windows.
venv = powercycle_constants.VIRTUALENV_DIR
cmds = f"activate=$(find {venv} -name 'activate')"
cmds = f"{cmds}; . $activate"
# In the 'cmds' variable we pass to remote host, use 'python' instead of '$python' since
# we don't want to evaluate the local python variable, but instead pass the python string
# so the remote host will use the right python when the virtualenv is sourced.
cmds = f"{cmds}; cd {remote_dir}"
cmds = f"{cmds}; python buildscripts/resmoke.py hang-analyzer {hang_analyzer_option}"
self.remote_op.operation(SSHOperation.SHELL, cmds, None)
file_param = []
file_param.append(f"{remote_dir}/debugger*.*")
file_param.append(f"{remote_dir}/*.{core_ext}")
self.remote_op.operation(SSHOperation.COPY_FROM, file_param, None)