diff options
author | Sebastien Delafond <seb@debian.org> | 2016-02-01 22:33:23 +0000 |
---|---|---|
committer | Sebastien Delafond <seb@debian.org> | 2016-02-01 22:33:23 +0000 |
commit | 58a01bb1afebc6886b3d864629e535ba8415b72f (patch) | |
tree | b56047a7a68413ebe952caa0432aec99271e8495 /bin/tracker_service.py | |
parent | e9fc7988bc586824b288a81bab84168026ffaa0e (diff) |
[tracker_service] Crude caching mechanism for JSON API
* once computed, keep the JSON data cached in memory for 5
minutes (default value) before regenerating it
* at the very minimum we'll need to send along a Last-Modified header
exposing when the data was last generated
git-svn-id: svn+ssh://svn.debian.org/svn/secure-testing@39406 e39458fd-73e7-0310-bf30-c45bca0a0e42
Diffstat (limited to 'bin/tracker_service.py')
-rw-r--r-- | bin/tracker_service.py | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/bin/tracker_service.py b/bin/tracker_service.py index 6212019abf..8ff0d84bed 100644 --- a/bin/tracker_service.py +++ b/bin/tracker_service.py @@ -7,6 +7,7 @@ import re import security_db from web_support import * import json +from datetime import datetime if __name__ == "__main__": if len(sys.argv) not in (3, 5): @@ -123,9 +124,13 @@ class TrackerService(webservice_base_class): determining the values of these factors, but the rating itself comes from a fully automated formula.''') + json_generation_interval = 5 * 60 # in seconds + def __init__(self, socket_name, db_name): webservice_base_class.__init__(self, socket_name) self.db = security_db.DB(db_name) + self.json_data = None # the JSON dump itself + self.json_timestamp = None # timestamp of JSON generation self.register('', self.page_home) self.register('*', self.page_object) self.register('redirect/*', self.page_redirect) @@ -161,7 +166,7 @@ class TrackerService(webservice_base_class): self.register('data/fake-names', self.page_data_fake_names) self.register('data/pts/1', self.page_data_pts) # temorarly disabled on 2016-02-01 due to load on security-tracker - #self.register('data/json', self.page_json) + self.register('data/json', self.page_json) self.register('debsecan/**', self.page_debsecan) self.register('data/report', self.page_report) self.register('style.css', self.page_style_css) @@ -1256,8 +1261,19 @@ Debian bug number.'''), data.append('\n') return BinaryResult(''.join(data),'application/octet-stream') - def page_json(self, path, params, url): + def _get_json(self): + """Helper method handling basic caching of the JSON data, to avoid + overloading security-tracker.d.o. It'll return the cached + version of this data unless it's been generated more than + self.json_generation_interval seconds ago """ + + if self.json_timestamp: # we've generated the JSON at least once + delta = datetime.now() - self.json_timestamp + if delta.total_seconds() <= self.json_generation_interval: + # not expired yet, serve the cached data + return self.json_data + # if we reached here, the data has expired; let's regenerate it from collections import defaultdict packages = [] issues = defaultdict(list) @@ -1392,8 +1408,17 @@ Debian bug number.'''), data[pkg][issue]=pkg_issue - json_data = json.dumps(data, separators=(',', ':')) - return BinaryResult(json_data,'application/octet-stream') + # store the JSON dump in memory, and update the generation + # timestamp before returning + self.json_data = json.dumps(data, separators=(',', ':')) + self.json_timestamp = datetime.now() + return self.json_data + + def page_json(self, path, params, url): + # FIXME: we want to send along a Last-Modified header, whose + # value will be: + # self.json_timestamp.strftime("%a, %d %b %Y %H:%M:%S ") + TZ + return BinaryResult(self._get_json(),'application/octet-stream') def page_debsecan(self, path, params, url): obj = '/'.join(path) |