From 89008c7edef666d5122debba2e0eceb3c1572023 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Sep 27 2017 14:29:07 +0000 Subject: Use dogpile.cache for Errata.advisories_from_event to make BrewSignRPMEvents handling faster. --- diff --git a/conf/config.py b/conf/config.py index af08c01..6931886 100644 --- a/conf/config.py +++ b/conf/config.py @@ -193,6 +193,9 @@ class TestConfiguration(BaseConfiguration): LIGHTBLUE_SERVER_URL = '' # replace with real dev server url LIGHTBLUE_VERIFY_SSL = False + # Disable caching for tests + DOGPILE_CACHE_BACKEND = "dogpile.cache.null" + class ProdConfiguration(BaseConfiguration): pass diff --git a/fedmsg.d/freshmaker-logging.py b/fedmsg.d/freshmaker-logging.py index 8a87382..2c782e9 100644 --- a/fedmsg.d/freshmaker-logging.py +++ b/fedmsg.d/freshmaker-logging.py @@ -12,6 +12,11 @@ config = dict( "propagate": True, "handlers": ["console"], }, + dogpile={ + "level": "WARNING", + "propagate": True, + "handlers": ["console"], + }, # freshmaker={ # "level": "INFO", # "propagate": True, diff --git a/freshmaker/config.py b/freshmaker/config.py index fa72576..6dd1119 100644 --- a/freshmaker/config.py +++ b/freshmaker/config.py @@ -262,6 +262,10 @@ class Config(object): 'type': str, 'default': '', 'desc': 'Path to credential cache file.'}, + 'dogpile_cache_backend': { + 'type': str, + 'default': 'dogpile.cache.memory', + 'desc': 'Name of dogpile.cache backend to use.'}, } def __init__(self, conf_section_obj): diff --git a/freshmaker/errata.py b/freshmaker/errata.py index 97faef1..3945e6c 100644 --- a/freshmaker/errata.py +++ b/freshmaker/errata.py @@ -22,9 +22,11 @@ # Written by Jan Kaluza import requests +import dogpile.cache from requests_kerberos import HTTPKerberosAuth from freshmaker.events import BrewSignRPMEvent, ErrataAdvisoryStateChangedEvent +from freshmaker import conf class ErrataAdvisory(object): @@ -45,6 +47,13 @@ class ErrataAdvisory(object): class Errata(object): """ Interface to Errata. """ + # Cache for `advisories_from_event` related methods. The main reason + # of this cache is lookup of BrewSignRPMEvents which came in waves. + # Therefore the short 10 seconds timeout. We don't want to cache it for + # too long to keep the data in sync with Errata tool. + region = dogpile.cache.make_region().configure( + conf.dogpile_cache_backend, expiration_time=10) + def __init__(self, server_url): """ Initializes the Errata instance. @@ -76,6 +85,27 @@ class Errata(object): r.raise_for_status() return r.json() + @region.cache_on_arguments() + def _advisories_from_nvr(self, nvr): + """ + Returns the list of advisories which contain the artifact with + `nvr` NVR. + """ + build = self._errata_rest_get("/build/%s" % str(nvr)) + if "all_errata" not in build: + return [] + + advisories = [] + for errata in build["all_errata"]: + extra_data = self._errata_http_get( + "advisory/%s.json" % str(errata["id"])) + advisory = ErrataAdvisory( + errata["id"], errata["name"], errata["status"], + extra_data["security_impact"]) + advisories.append(advisory) + + return advisories + def advisories_from_event(self, event): """ Returns list of ErrataAdvisory instances associated with @@ -89,20 +119,7 @@ class Errata(object): :rtype: list """ if isinstance(event, BrewSignRPMEvent): - build = self._errata_rest_get("/build/%s" % str(event.nvr)) - if "all_errata" not in build: - return [] - - advisories = [] - for errata in build["all_errata"]: - extra_data = self._errata_http_get( - "advisory/%s.json" % str(errata["id"])) - advisory = ErrataAdvisory( - errata["id"], errata["name"], errata["status"], - extra_data["security_impact"]) - advisories.append(advisory) - - return advisories + return self._advisories_from_nvr(event.nvr) elif isinstance(event, ErrataAdvisoryStateChangedEvent): data = self._errata_http_get( "advisory/%s.json" % str(event.errata_id)) diff --git a/freshmaker/handlers/errata/errata_advisory_state_changed.py b/freshmaker/handlers/errata/errata_advisory_state_changed.py index 60f311a..4d2baab 100644 --- a/freshmaker/handlers/errata/errata_advisory_state_changed.py +++ b/freshmaker/handlers/errata/errata_advisory_state_changed.py @@ -90,8 +90,8 @@ class ErrataAdvisoryStateChangedHandler(BaseHandler): event.state) advisory = advisories[0] db_event = ErrataAdvisoryRPMsSignedEvent( - event.msg_id + "." + str(advisory.name), advisory.name, - advisory.errata_id, advisory.security_impact) + event.msg_id + "." + str(advisory.name), advisory.name, + advisory.errata_id, advisory.security_impact) return [db_event] def handle(self, event): diff --git a/requirements.txt b/requirements.txt index b437568..41afa04 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,3 +22,4 @@ requests enum34 ; python_version <= '2.7' odcs[client] krbcontext +dogpile.cache