Source code for llvm_ir_dataset_utils.tools.get_build_failure_logs

"""Tool to find all the logs for targets that failed to build from a corpus
directory."""

import glob
import os
import json
import logging

from absl import app
from absl import flags

import ray

from llvm_ir_dataset_utils.util import dataset_corpus

FLAGS = flags.FLAGS

flags.DEFINE_string('corpus_dir', None,
                    'The corpus directory to look for build logs in.')

flags.mark_flag_as_required('corpus_dir')


@ray.remote(num_cpus=1)
def process_corpus(build_corpus_path):
  build_manifest = dataset_corpus.load_json_from_corpus(
      build_corpus_path, './build_manifest.json')
  if build_manifest is None:
    return None
  for target in build_manifest['targets']:
    if not target['success'] and target['build_log'] is not None:
      # We're assuming the spack builder here because that's mainly what this
      # script is being used for currently.
      # TODO(boomanaiden154): Make this more generic when #77 is fixed and the
      # corpora have been rebuilt.
      if build_corpus_path[-3:] == 'tar':
        build_log_path = f'{build_corpus_path}:./spack_build.log'
      else:
        build_log_path = target['build_log']
      return ('build_failure', target['name'], build_log_path)
    if target['build_log'] is None:
      return ('missing_logs', target['name'], None)
  return None


[docs]def main(_): ray.init() build_corpora = os.listdir(FLAGS.corpus_dir) corpus_futures = [] for build_corpus in build_corpora: corpus_path = os.path.join(FLAGS.corpus_dir, build_corpus) corpus_futures.append(process_corpus.remote(corpus_path)) build_failures = 0 missing_logs = 0 while len(corpus_futures) > 0: finished, corpus_futures = ray.wait(corpus_futures, timeout=5.0) finished_data = ray.get(finished) logging.info( f'Just finished {len(finished)}, {len(corpus_futures)} remaining.') for finished_corpus in finished_data: if finished_corpus is not None: if finished_corpus[0] == 'build_failure': build_failures += 1 print(f'{finished_corpus[1]},failure,{finished_corpus[2]}') elif finished_corpus[0] == 'missing_logs': missing_logs += 1 print(f'{finished_corpus[1]},no_logs,NULL') logging.warning(f'Found {build_failures} build failures.') logging.warning(f'{missing_logs} targets were missing logs.')
if __name__ == '__main__': app.run(main)