Title: [106308] trunk
Revision
106308
Author
[email protected]
Date
2012-01-30 17:36:17 -0800 (Mon, 30 Jan 2012)

Log Message

Enable memcache on webkit-perf.appspot.com
https://bugs.webkit.org/show_bug.cgi?id=77378

Reviewed by Adam Barth.

Eanble memcache on dashboard, manifest, and runs handlers. Clear appropriate caches when new runs are reported,
or new models are created. We flush all caches when tests are merged since it's hard to figure out dependencies
in that case. Luckily, we merge tests only occassionally and manually (or hope so) so this shouldn't be an issue.

* Websites/webkit-perf.appspot.com/create_handler.py:
(CreateHandler.post):
* Websites/webkit-perf.appspot.com/dashboard_handler.py:
(DashboardHandler.get):
* Websites/webkit-perf.appspot.com/manifest_handler.py:
(ManifestHandler.get):
* Websites/webkit-perf.appspot.com/merge_tests_handler.py:
(MergeTestsHandler.post):
* Websites/webkit-perf.appspot.com/models.py:
(createInTransactionWithNumericIdHolder):
(Test):
(Test.cacheKey):
* Websites/webkit-perf.appspot.com/report_handler.py:
(ReportHandler.post):
(ReportHandler._addTestIfNeeded):
* Websites/webkit-perf.appspot.com/runs_handler.py:
(RunsHandler.get):

Modified Paths

Diff

Modified: trunk/ChangeLog (106307 => 106308)


--- trunk/ChangeLog	2012-01-31 01:25:08 UTC (rev 106307)
+++ trunk/ChangeLog	2012-01-31 01:36:17 UTC (rev 106308)
@@ -1,5 +1,34 @@
 2012-01-30  Ryosuke Niwa  <[email protected]>
 
+        Enable memcache on webkit-perf.appspot.com
+        https://bugs.webkit.org/show_bug.cgi?id=77378
+
+        Reviewed by Adam Barth.
+
+        Eanble memcache on dashboard, manifest, and runs handlers. Clear appropriate caches when new runs are reported,
+        or new models are created. We flush all caches when tests are merged since it's hard to figure out dependencies
+        in that case. Luckily, we merge tests only occassionally and manually (or hope so) so this shouldn't be an issue.
+
+        * Websites/webkit-perf.appspot.com/create_handler.py:
+        (CreateHandler.post):
+        * Websites/webkit-perf.appspot.com/dashboard_handler.py:
+        (DashboardHandler.get):
+        * Websites/webkit-perf.appspot.com/manifest_handler.py:
+        (ManifestHandler.get):
+        * Websites/webkit-perf.appspot.com/merge_tests_handler.py:
+        (MergeTestsHandler.post):
+        * Websites/webkit-perf.appspot.com/models.py:
+        (createInTransactionWithNumericIdHolder):
+        (Test):
+        (Test.cacheKey):
+        * Websites/webkit-perf.appspot.com/report_handler.py:
+        (ReportHandler.post):
+        (ReportHandler._addTestIfNeeded):
+        * Websites/webkit-perf.appspot.com/runs_handler.py:
+        (RunsHandler.get):
+
+2012-01-30  Ryosuke Niwa  <[email protected]>
+
         webkit-perf.appspot.com should have an ability to merge tests
         https://bugs.webkit.org/show_bug.cgi?id=77250
 

Modified: trunk/Websites/webkit-perf.appspot.com/app.yaml (106307 => 106308)


--- trunk/Websites/webkit-perf.appspot.com/app.yaml	2012-01-31 01:25:08 UTC (rev 106307)
+++ trunk/Websites/webkit-perf.appspot.com/app.yaml	2012-01-31 01:36:17 UTC (rev 106308)
@@ -1,5 +1,5 @@
 application: webkit-perf
-version: 9
+version: 10
 runtime: python27
 api_version: 1
 threadsafe: false

Modified: trunk/Websites/webkit-perf.appspot.com/create_handler.py (106307 => 106308)


--- trunk/Websites/webkit-perf.appspot.com/create_handler.py	2012-01-31 01:25:08 UTC (rev 106307)
+++ trunk/Websites/webkit-perf.appspot.com/create_handler.py	2012-01-31 01:36:17 UTC (rev 106308)
@@ -28,6 +28,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import webapp2
+from google.appengine.api import memcache
 from google.appengine.ext import db
 
 import json
@@ -61,6 +62,8 @@
         else:
             error = "Unknown model type: %s\n" % model
 
+        # No need to clear manifest or runs since they only contain ones with test results
+        memcache.delete('dashboard')
         self.response.out.write(error + '\n' if error else 'OK')
 
     def _createBuilder(self, name, password):

Modified: trunk/Websites/webkit-perf.appspot.com/dashboard_handler.py (106307 => 106308)


--- trunk/Websites/webkit-perf.appspot.com/dashboard_handler.py	2012-01-31 01:25:08 UTC (rev 106307)
+++ trunk/Websites/webkit-perf.appspot.com/dashboard_handler.py	2012-01-31 01:36:17 UTC (rev 106308)
@@ -28,6 +28,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import webapp2
+from google.appengine.api import memcache
 
 import json
 
@@ -39,6 +40,13 @@
 
 class DashboardHandler(webapp2.RequestHandler):
     def get(self):
+        self.response.headers['Content-Type'] = 'application/json; charset=utf-8';
+
+        cache = memcache.get('dashboard')
+        if cache:
+            self.response.out.write(cache)
+            return
+
         webkitTrunk = Branch.get_by_key_name('webkit-trunk')
 
         # FIXME: Determine popular branches, platforms, and tests
@@ -55,5 +63,6 @@
         for test in Test.all():
             dashboard['testToId'][test.name] = test.id
 
-        self.response.headers['Content-Type'] = 'application/json; charset=utf-8';
-        self.response.out.write(json.dumps(dashboard))
+        result = json.dumps(dashboard)
+        self.response.out.write(result)
+        memcache.add('dashboard', result)

Modified: trunk/Websites/webkit-perf.appspot.com/manifest_handler.py (106307 => 106308)


--- trunk/Websites/webkit-perf.appspot.com/manifest_handler.py	2012-01-31 01:25:08 UTC (rev 106307)
+++ trunk/Websites/webkit-perf.appspot.com/manifest_handler.py	2012-01-31 01:36:17 UTC (rev 106308)
@@ -28,6 +28,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import webapp2
+from google.appengine.api import memcache
 
 import json
 
@@ -40,7 +41,10 @@
 class ManifestHandler(webapp2.RequestHandler):
     def get(self):
         self.response.headers['Content-Type'] = 'text/plain; charset=utf-8';
-        self.response.out.write('{"testMap":')
+        cache = memcache.get('manifest')
+        if cache:
+            self.response.out.write(cache)
+            return
 
         testMap = {}
         platformIdMap = {}
@@ -64,9 +68,6 @@
                 branchIdMap[branchId]['tests'].append(test.id)
                 branchIdMap[branchId]['platforms'] += platformIds
 
-        self.response.out.write(json.dumps(testMap))
-        self.response.out.write(',"platformMap":')
-
         platformMap = {}
         for platform in Platform.all():
             if platform.id not in platformIdMap:
@@ -77,9 +78,6 @@
                 'branchIds': list(set(platformIdMap[platform.id]['branches'])),
             }
 
-        self.response.out.write(json.dumps(platformMap))
-        self.response.out.write(',"branchMap":')
-
         branchMap = {}
         for branch in Branch.all():
             if branch.id not in branchIdMap:
@@ -90,5 +88,6 @@
                 'platformIds': list(set(branchIdMap[branch.id]['platforms'])),
             }
 
-        self.response.out.write(json.dumps(branchMap))
-        self.response.out.write('}')
+        result = json.dumps({'testMap': testMap, 'platformMap': platformMap, 'branchMap': branchMap})
+        self.response.out.write(result)
+        memcache.add('manifest', result)

Modified: trunk/Websites/webkit-perf.appspot.com/merge_tests_handler.py (106307 => 106308)


--- trunk/Websites/webkit-perf.appspot.com/merge_tests_handler.py	2012-01-31 01:25:08 UTC (rev 106307)
+++ trunk/Websites/webkit-perf.appspot.com/merge_tests_handler.py	2012-01-31 01:36:17 UTC (rev 106308)
@@ -28,6 +28,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import webapp2
+from google.appengine.api import memcache
 from google.appengine.ext.webapp import template
 
 import os
@@ -56,6 +57,10 @@
             result.name = into.name
             result.put()
 
+        # Just flush everyting since we rarely merge tests and we need to flush
+        # dashboard, manifest, and all runs for this test here.
+        memcache.flush_all()
+
         deleteModelWithNumericIdHolder(merge)
 
         self.response.out.write('OK')

Modified: trunk/Websites/webkit-perf.appspot.com/models.py (106307 => 106308)


--- trunk/Websites/webkit-perf.appspot.com/models.py	2012-01-31 01:25:08 UTC (rev 106307)
+++ trunk/Websites/webkit-perf.appspot.com/models.py	2012-01-31 01:36:17 UTC (rev 106308)
@@ -50,7 +50,6 @@
         idHolder.delete()
     return owner
 
-
 def deleteModelWithNumericIdHolder(model):
     idHolder = NumericIdHolder.get_by_id(model.id)
     model.delete()
@@ -100,7 +99,11 @@
     branches = db.ListProperty(db.Key)
     platforms = db.ListProperty(db.Key)
 
+    @staticmethod
+    def cacheKey(testId, branchId, platformId):
+        return 'runs:%d,%d,%d' % (testId, branchId, platformId)
 
+
 class TestResult(db.Model):
     name = db.StringProperty(required=True)
     build = db.ReferenceProperty(Build, required=True)

Modified: trunk/Websites/webkit-perf.appspot.com/report_handler.py (106307 => 106308)


--- trunk/Websites/webkit-perf.appspot.com/report_handler.py	2012-01-31 01:25:08 UTC (rev 106307)
+++ trunk/Websites/webkit-perf.appspot.com/report_handler.py	2012-01-31 01:36:17 UTC (rev 106308)
@@ -28,6 +28,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import webapp2
+from google.appengine.api import memcache
 from google.appengine.ext import db
 
 import json
@@ -85,17 +86,22 @@
         if not build:
             return
 
-        for test, result in self._body['results'].iteritems():
-            self._addTestIfNeeded(test, branch, platform)
+        for testName, result in self._body['results'].iteritems():
+            test = self._addTestIfNeeded(testName, branch, platform)
+            memcache.delete(Test.cacheKey(test.id, branch.id, platform.id))
             if isinstance(result, dict):
-                TestResult(name=test, build=build, value=float(result.get('avg', 0)), valueMedian=float(result.get('median', 0)),
+                TestResult(name=testName, build=build, value=float(result.get('avg', 0)), valueMedian=float(result.get('median', 0)),
                     valueStdev=float(result.get('stdev', 0)), valueMin=float(result.get('min', 0)), valueMax=float(result.get('max', 0))).put()
             else:
-                TestResult(name=test, build=build, value=float(result)).put()
+                TestResult(name=testName, build=build, value=float(result)).put()
 
         log = ReportLog.get(log.key())
         log.delete()
 
+        # We need to update dashboard and manifest because they are affected by the existance of test results
+        memcache.delete('dashboard')
+        memcache.delete('manifest')
+
         return self._output('OK')
 
     def _modelByKeyNameInBodyOrError(self, model, keyName):
@@ -176,7 +182,7 @@
                 test.platforms.append(platform.key())
             test.put()
             return returnValue
-        createInTransactionWithNumericIdHolder(execute)
+        return createInTransactionWithNumericIdHolder(execute) or Test.get_by_key_name(testName)
 
 
 class AdminReportHandler(ReportHandler):

Modified: trunk/Websites/webkit-perf.appspot.com/runs_handler.py (106307 => 106308)


--- trunk/Websites/webkit-perf.appspot.com/runs_handler.py	2012-01-31 01:25:08 UTC (rev 106307)
+++ trunk/Websites/webkit-perf.appspot.com/runs_handler.py	2012-01-31 01:36:17 UTC (rev 106308)
@@ -28,6 +28,7 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import webapp2
+from google.appengine.api import memcache
 
 import json
 from time import mktime
@@ -45,6 +46,8 @@
 
 class RunsHandler(webapp2.RequestHandler):
     def get(self):
+        self.response.headers['Content-Type'] = 'application/json; charset=utf-8'
+
         try:
             testId = int(self.request.get('id', 0))
             branchId = int(self.request.get('branchid', 0))
@@ -58,6 +61,12 @@
         # FIXME: Just fetch builds specified by "days"
         # days = self.request.get('days', 365)
 
+        cacheKey = Test.cacheKey(testId, branchId, platformId)
+        cache = memcache.get(cacheKey)
+        if cache:
+            self.response.out.write(cache)
+            return
+
         builds = Build.all()
         builds.filter('branch =', modelFromNumericId(branchId, Branch))
         builds.filter('platform =', modelFromNumericId(platformId, Platform))
@@ -84,11 +93,12 @@
                 values.append(result.value)
                 timestamps.append(posixTimestamp)
 
-        self.response.headers['Content-Type'] = 'application/json; charset=utf-8';
-        self.response.out.write(json.dumps({
+        result = json.dumps({
             'test_runs': test_runs,
             'averages': averages,
             'min': min(values) if values else None,
             'max': max(values) if values else None,
             'date_range': [min(timestamps), max(timestamps)] if timestamps else None,
-            'stat': 'ok'}))
+            'stat': 'ok'})
+        self.response.out.write(result)
+        memcache.add(cacheKey, result)
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to