From abce558f1771b6890bc9348bdb9288c0739e7531 Mon Sep 17 00:00:00 2001 From: Lukas Holecek Date: Jul 12 2019 07:49:12 +0000 Subject: Retrieve results for all test cases once with verbose flag With verbose flag, all tests for each test subject are retrieved in single request, so there is no need to retrieve specific test case again later, instead it can be fetched from cache. The performance improvement depends on number of tests explicitly required. Signed-off-by: Lukas Holecek --- diff --git a/greenwave/api_v1.py b/greenwave/api_v1.py index c145951..4a1dcf7 100644 --- a/greenwave/api_v1.py +++ b/greenwave/api_v1.py @@ -434,15 +434,6 @@ def make_decision(): 'Cannot find any applicable policies for %s subjects at gating point %s in %s' % ( subject_type, decision_context, product_version)) - for policy in subject_policies: - answers.extend( - policy.check( - product_version, - subject_identifier, - results_retriever)) - - applicable_policies.extend(subject_policies) - if verbose: # Retrieve test results and waivers for all items when verbose output is requested. verbose_results.extend( @@ -453,6 +444,15 @@ def make_decision(): product_version=product_version, )) + for policy in subject_policies: + answers.extend( + policy.check( + product_version, + subject_identifier, + results_retriever)) + + applicable_policies.extend(subject_policies) + if not verbose: for answer in answers: if not answer.is_satisfied: diff --git a/greenwave/resources.py b/greenwave/resources.py index 47f349b..ae30041 100644 --- a/greenwave/resources.py +++ b/greenwave/resources.py @@ -52,7 +52,20 @@ class ResultsRetriever(BaseRetriever): """ Retrieves results from cache or ResultsDB. """ + def __init__(self, **args): + super().__init__(**args) + self.cache = {} + def _retrieve_all(self, subject_type, subject_identifier, testcase=None, scenarios=None): + # Get test case result from cache if all test case results were already + # retrieved for given subject type/ID. + cache_key = (subject_type, subject_identifier, scenarios) + if testcase and cache_key in self.cache: + for result in self.cache[cache_key]: + if result['testcase']['name'] == testcase: + return [result] + return [] + params = { '_distinct_on': 'scenario,system_architecture' } @@ -81,6 +94,9 @@ class ResultsRetriever(BaseRetriever): params['item'] = subject_identifier results = self._retrieve_data(params) + if not testcase: + self.cache[cache_key] = results + return results def _make_request(self, params, **request_args):