57 lines
1.9 KiB
Python
57 lines
1.9 KiB
Python
"""Extracts `mongo-debugsymbols.tgz` in an idempotent manner for performance."""
|
|
import glob
|
|
import os
|
|
import tarfile
|
|
import time
|
|
|
|
from buildscripts.resmokelib.setup_multiversion.download import DownloadError
|
|
from buildscripts.resmokelib.run import compare_start_time
|
|
from buildscripts.resmokelib.utils.filesystem import build_hygienic_bin_path
|
|
|
|
_DEBUG_FILE_BASE_NAMES = ['mongo', 'mongod', 'mongos']
|
|
|
|
|
|
def download_debug_symbols(root_logger, symbolizer):
|
|
"""
|
|
Extract debug symbols. Idempotent.
|
|
|
|
:param root_logger: logger to use
|
|
:param symbolizer: pre-configured instance of symbolizer for downloading symbols.
|
|
:return: None
|
|
"""
|
|
retry_secs = 10
|
|
|
|
# Check if the files are already there. They would be on *SAN builds.
|
|
sym_files = _get_symbol_files()
|
|
|
|
if len(sym_files) >= len(_DEBUG_FILE_BASE_NAMES):
|
|
root_logger.info(
|
|
"Skipping downloading debug symbols as there are already symbol files present")
|
|
return
|
|
|
|
while True:
|
|
try:
|
|
symbolizer.execute()
|
|
break
|
|
except (tarfile.ReadError, DownloadError):
|
|
root_logger.info("Debug symbols unavailable after %s secs, retrying in %s secs",
|
|
compare_start_time(time.time()), retry_secs)
|
|
time.sleep(retry_secs)
|
|
|
|
ten_min = 10 * 60
|
|
if compare_start_time(time.time()) > ten_min:
|
|
root_logger.info(
|
|
'Debug-symbols archive-file does not exist after %s secs; '
|
|
'Hang-Analyzer may not complete successfully.', ten_min)
|
|
break
|
|
|
|
|
|
def _get_symbol_files():
|
|
out = []
|
|
for ext in ['debug', 'dSYM', 'pdb']:
|
|
for file in _DEBUG_FILE_BASE_NAMES:
|
|
haystack = build_hygienic_bin_path(child='{file}.{ext}'.format(file=file, ext=ext))
|
|
for needle in glob.glob(haystack):
|
|
out.append((needle, os.path.join(os.getcwd(), os.path.basename(needle))))
|
|
return out
|