예제 #1
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Need to (only) specify project/branch")
        project = args[0]

        server_params = urlparse(options['server'])

        pc = PerfherderClient(protocol=server_params.scheme,
                              host=server_params.netloc)
        signatures = pc.get_performance_signatures(
            project,
            time_interval=PerformanceTimeInterval.NINETY_DAYS)

        if options['filter_props']:
            for kv in options['filter_props']:
                if ':' not in kv or len(kv) < 3:
                    raise CommandError("Must specify --filter-props as "
                                       "'key:value'")
                k, v = kv.split(':')
                signatures = signatures.filter((k, v))

        if options['time_interval'] is None:
            time_intervals = PerformanceTimeInterval.all_valid_time_intervals()
        else:
            time_intervals = [options['time_interval']]

        with concurrent.futures.ProcessPoolExecutor(
                options['num_workers']) as executor:
            futures = []

            for signature_hash in signatures.get_signature_hashes():
                futures.append(executor.submit(_add_series, server_params,
                                               project,
                                               time_intervals,
                                               signature_hash,
                                               signatures[signature_hash],
                                               options['mysql_debug'],
                                               options['verbose']))
            for future in futures:
                try:
                    future.result()
                except Exception, e:
                    self.stderr.write("FAIL: {}".format(e))
                    # shutdown any pending tasks and exit (if something
                    # is in progress, no wait to stop it)
                    executor.shutdown(wait=False)
                    for future in futures:
                        future.cancel()
                    raise CommandError(
                        "Failed to import performance data: {}".format(e))
예제 #2
0
    def handle(self, *args, **options):
        if len(args) != 1:
            raise CommandError("Need to (only) specify project/branch")
        project = args[0]

        server_params = urlparse(options['server'])

        pc = PerfherderClient(protocol=server_params.scheme,
                              host=server_params.netloc)
        signatures = pc.get_performance_signatures(
            project, time_interval=PerformanceTimeInterval.NINETY_DAYS)

        if options['filter_props']:
            for kv in options['filter_props']:
                if ':' not in kv or len(kv) < 3:
                    raise CommandError("Must specify --filter-props as "
                                       "'key:value'")
                k, v = kv.split(':')
                signatures = signatures.filter((k, v))

        if options['time_interval'] is None:
            time_intervals = PerformanceTimeInterval.all_valid_time_intervals()
        else:
            time_intervals = [options['time_interval']]

        with concurrent.futures.ProcessPoolExecutor(
                options['num_workers']) as executor:
            futures = []

            for signature_hash in signatures.get_signature_hashes():
                futures.append(
                    executor.submit(_add_series, server_params, project,
                                    time_intervals, signature_hash,
                                    signatures[signature_hash],
                                    options['mysql_debug'],
                                    options['verbose']))
            for future in futures:
                try:
                    future.result()
                except Exception, e:
                    self.stderr.write("FAIL: {}".format(e))
                    # shutdown any pending tasks and exit (if something
                    # is in progress, no wait to stop it)
                    executor.shutdown(wait=False)
                    for future in futures:
                        future.cancel()
                    raise CommandError(
                        "Failed to import performance data: {}".format(e))
예제 #3
0
    def _rewrite_data(self, project, mysql_debug):

        signature_mapping = {}
        extra_subtest_signatures = {}

        with JobsModel(project) as jm:
            jm.DEBUG = mysql_debug
            summary = jm.get_performance_series_summary(
                max(PerformanceTimeInterval.all_valid_time_intervals()))
            # first pass: rewrite non-summary tests
            for (signature_hash, signature_properties) in summary.iteritems():
                if self._signature_needs_rewriting(signature_properties,
                                                   signature_hash) and \
                        'subtest_signatures' not in signature_properties:
                    new_hash = self._rewrite_series(jm, signature_hash,
                                                    signature_properties,
                                                    None, None)
                    signature_mapping[signature_hash] = new_hash
                elif (not signature_properties.get('subtest_signatures') and
                      signature_properties.get('test') not in
                      Command.COUNTER_TESTS):
                    # in case this script got interrupted, keep track of
                    # subtest signatures which have already been converted
                    suitekey = self._get_suitekey(signature_properties)

                    if extra_subtest_signatures.get(suitekey):
                        extra_subtest_signatures[suitekey].append(
                            signature_hash)
                    else:
                        extra_subtest_signatures[suitekey] = [signature_hash]

            # second pass: rewrite summary tests
            for (signature_hash, signature_properties) in summary.iteritems():
                if (self._signature_needs_rewriting(signature_properties,
                                                    signature_hash) and
                        signature_properties.get('subtest_signatures')):
                    self._rewrite_series(jm, signature_hash,
                                         signature_properties,
                                         signature_mapping,
                                         extra_subtest_signatures)
예제 #4
0
    def _rewrite_data(self, project, mysql_debug):

        signature_mapping = {}
        extra_subtest_signatures = {}

        with JobsModel(project) as jm:
            jm.DEBUG = mysql_debug
            summary = jm.get_performance_series_summary(
                max(PerformanceTimeInterval.all_valid_time_intervals()))
            # first pass: rewrite non-summary tests
            for (signature_hash, signature_properties) in summary.iteritems():
                if self._signature_needs_rewriting(signature_properties,
                                                   signature_hash) and \
                        'subtest_signatures' not in signature_properties:
                    new_hash = self._rewrite_series(jm, signature_hash,
                                                    signature_properties, None,
                                                    None)
                    signature_mapping[signature_hash] = new_hash
                elif (not signature_properties.get('subtest_signatures')
                      and signature_properties.get('test')
                      not in Command.COUNTER_TESTS):
                    # in case this script got interrupted, keep track of
                    # subtest signatures which have already been converted
                    suitekey = self._get_suitekey(signature_properties)

                    if extra_subtest_signatures.get(suitekey):
                        extra_subtest_signatures[suitekey].append(
                            signature_hash)
                    else:
                        extra_subtest_signatures[suitekey] = [signature_hash]

            # second pass: rewrite summary tests
            for (signature_hash, signature_properties) in summary.iteritems():
                if (self._signature_needs_rewriting(signature_properties,
                                                    signature_hash)
                        and signature_properties.get('subtest_signatures')):
                    self._rewrite_series(jm, signature_hash,
                                         signature_properties,
                                         signature_mapping,
                                         extra_subtest_signatures)
예제 #5
0
    def _rewrite_series(self, jm, signature_hash, signature_properties,
                        subtest_signature_mapping, extra_subtest_signatures):
        new_props = TalosDataAdapter._transform_signature_properties(
            signature_properties,
            significant_keys=Command.SIGNIFICANT_KEYS)
        if 'subtest_signatures' in new_props:
            suitekey = self._get_suitekey(new_props)

            # rewrite a new set of subtest signatures
            old_subtest_signatures = new_props['subtest_signatures']
            new_subtest_signatures = set()
            for old_signature in old_subtest_signatures:
                try:
                    new_subtest_signatures.add(
                        subtest_signature_mapping[old_signature])
                except:
                    # key may not exist if script interrupted, get
                    # suite signatures via extra_subtest_signatures
                    for sig in extra_subtest_signatures.get(suitekey, []):
                        new_subtest_signatures.add(sig)
            new_props['subtest_signatures'] = sorted(new_subtest_signatures)
        new_hash = TalosDataAdapter.get_series_signature(new_props)
        print "%s -> %s" % (signature_hash, new_hash)
        jm.set_series_signature(new_hash, new_props)
        for time_interval in PerformanceTimeInterval.all_valid_time_intervals():
            series_list = jm.get_performance_series_from_signatures(
                [signature_hash], time_interval)

            series = utils.decompress_if_needed(series_list[0]['blob'])
            jm.store_performance_series(time_interval, 'talos_data',
                                        str(new_hash), series)

        jm.execute(proc='jobs.deletes.delete_performance_series',
                        placeholders=[signature_hash])
        jm.execute(proc='jobs.deletes.delete_series_signature',
                        placeholders=[signature_hash])

        return new_hash
예제 #6
0
    def _rewrite_series(self, jm, signature_hash, signature_properties,
                        subtest_signature_mapping, extra_subtest_signatures):
        new_props = TalosDataAdapter._transform_signature_properties(
            signature_properties, significant_keys=Command.SIGNIFICANT_KEYS)
        if 'subtest_signatures' in new_props:
            suitekey = self._get_suitekey(new_props)

            # rewrite a new set of subtest signatures
            old_subtest_signatures = new_props['subtest_signatures']
            new_subtest_signatures = set()
            for old_signature in old_subtest_signatures:
                try:
                    new_subtest_signatures.add(
                        subtest_signature_mapping[old_signature])
                except:
                    # key may not exist if script interrupted, get
                    # suite signatures via extra_subtest_signatures
                    for sig in extra_subtest_signatures.get(suitekey, []):
                        new_subtest_signatures.add(sig)
            new_props['subtest_signatures'] = sorted(new_subtest_signatures)
        new_hash = TalosDataAdapter.get_series_signature(new_props)
        print "%s -> %s" % (signature_hash, new_hash)
        jm.set_series_signature(new_hash, new_props)
        for time_interval in PerformanceTimeInterval.all_valid_time_intervals(
        ):
            series_list = jm.get_performance_series_from_signatures(
                [signature_hash], time_interval)

            series = series_list[0]['blob']
            jm.store_performance_series(time_interval, 'talos_data',
                                        str(new_hash), series)

        jm.jobs_execute(proc='jobs.deletes.delete_performance_series',
                        placeholders=[signature_hash])
        jm.jobs_execute(proc='jobs.deletes.delete_series_signature',
                        placeholders=[signature_hash])

        return new_hash