summaryrefslogtreecommitdiffstats
path: root/bin/tracker_service.py
diff options
context:
space:
mode:
authorSebastien Delafond <seb@debian.org>2016-02-01 22:33:23 +0000
committerSebastien Delafond <seb@debian.org>2016-02-01 22:33:23 +0000
commit58a01bb1afebc6886b3d864629e535ba8415b72f (patch)
treeb56047a7a68413ebe952caa0432aec99271e8495 /bin/tracker_service.py
parente9fc7988bc586824b288a81bab84168026ffaa0e (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.py33
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)

© 2014-2024 Faster IT GmbH | imprint | privacy policy