Perf dashboard's should not include results more than 366 days old in JSON
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 21 Nov 2015 03:12:14 +0000 (03:12 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 21 Nov 2015 03:12:14 +0000 (03:12 +0000)
https://bugs.webkit.org/show_bug.cgi?id=151529

Reviewed by Timothy Hatcher.

Don't return results more than 366 days old in /api/runs/ JSON API.
This is a ~5% runtime improvement and reduces the JSON file size by 20-50% in the internal perf dashboard.

* public/api/runs.php:
(main): Added the support for "?noResults" to avoid echoing results. This is useful for debugging.
Also instantiate RunsGenerator before issuing the query to find all configurations so that the runtime cost
of doing so will be included in elapsedTime.
(RunsGenerator::fetch_runs): Skip a row when its build and commit times are more than 366 days old.
(RunsGenerator::format_run): Takes build_time and revisions as arguments since fetch_runs uses them now.
(RunsGenerator::parse_revisions_array): Compute the max of commit times.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@192716 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Websites/perf.webkit.org/ChangeLog
Websites/perf.webkit.org/public/api/runs.php

index f9b7832e1bec80f5d0e30f74776d176c8f2bd6a5..d4885eb649f4e696d7691de3a8f2c1c43235b491 100644 (file)
@@ -1,3 +1,21 @@
+2015-11-20  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Perf dashboard's should not include results more than 366 days old in JSON
+        https://bugs.webkit.org/show_bug.cgi?id=151529
+
+        Reviewed by Timothy Hatcher.
+
+        Don't return results more than 366 days old in /api/runs/ JSON API.
+        This is a ~5% runtime improvement and reduces the JSON file size by 20-50% in the internal perf dashboard.
+
+        * public/api/runs.php:
+        (main): Added the support for "?noResults" to avoid echoing results. This is useful for debugging.
+        Also instantiate RunsGenerator before issuing the query to find all configurations so that the runtime cost
+        of doing so will be included in elapsedTime.
+        (RunsGenerator::fetch_runs): Skip a row when its build and commit times are more than 366 days old.
+        (RunsGenerator::format_run): Takes build_time and revisions as arguments since fetch_runs uses them now.
+        (RunsGenerator::parse_revisions_array): Compute the max of commit times.
+
 2015-11-20  Ryosuke Niwa  <rniwa@webkit.org>
 
         Remove chartPointRadius from interactive chart component
index 3b07b7127ca43e54f0a4a919f60f0466e8633108..845bb0e8758aaccd014ea3673082a09031ba4aa7 100644 (file)
@@ -10,10 +10,19 @@ function main($path) {
     if (count($parts) != 2)
         exit_with_error('InvalidRequest');
 
+    $test_group_id = array_get($_GET, 'testGroup');
+    $should_cache = array_get($_GET, 'cache');
+    $should_echo_results = !array_key_exists('noResult', $_GET);
+
     $db = new Database;
     if (!$db->connect())
         exit_with_error('DatabaseConnectionFailure');
 
+    if ($test_group_id)
+        $generator = new RunsGeneratorForTestGroup($db, $test_group_id);
+    else
+        $generator = new RunsGenerator($db);
+
     $platform_id = intval($parts[0]);
     $metric_id = intval($parts[1]);
     $config_rows = $db->query_and_fetch_all('SELECT *
@@ -21,8 +30,6 @@ function main($path) {
     if (!$config_rows)
         exit_with_error('ConfigurationNotFound');
 
-    $test_group_id = array_get($_GET, 'testGroup');
-    $should_cache = array_get($_GET, 'cache');
     if ($test_group_id)
         $test_group_id = intval($test_group_id);
     else if ($should_cache) { // Only v1 UI needs caching.
@@ -31,15 +38,15 @@ function main($path) {
         header("Cache-Control: maxage=$maxage");
     }
 
-    if ($test_group_id)
-        $generator = new RunsGeneratorForTestGroup($db, $test_group_id);
-    else
-        $generator = new RunsGenerator($db);
-
     foreach ($config_rows as $config)
         $generator->fetch_runs($config['config_type'], $config['config_id'], $config['config_runs_last_modified']);
 
     $content = success_json($generator->results());
+    if (!$should_echo_results) {
+        echo $generator->results()['elapsedTime'];
+        return;
+    }
+
     if (!$test_group_id)
         generate_data_file("$platform_id-$metric_id.json", $content);
     echo $content;
@@ -63,11 +70,19 @@ class RunsGenerator {
     function fetch_runs($name, $config_id, $last_modified) {
         $this->last_modified = max($this->last_modified, Database::to_js_time($last_modified));
 
+        $beginning_of_time = intval(time() - 366 * 24 * 3600) * 1000;
+
         $results = $this->execute_query($config_id);
 
         $formatted_runs = array();
-        while ($row = $this->db->fetch_next_row($results))
-            array_push($formatted_runs, self::format_run($row));
+        while ($row = $this->db->fetch_next_row($results)) {
+            $build_time = Database::to_js_time($row['build_time']);
+            $max_time = $build_time;
+            $revisions = self::parse_revisions_array($row['revisions'], $max_time);
+            if ($max_time < $beginning_of_time)
+                continue;
+            array_push($formatted_runs, self::format_run($row, $build_time, $revisions));
+        }
 
         $this->results[$name] = $formatted_runs;
     }
@@ -82,7 +97,7 @@ class RunsGenerator {
                 GROUP BY build_id, run_id', array($config_id));
     }
 
-    private static function format_run($run) {
+    private static function format_run($run, $build_time, $revisions) {
         return array(
             'id' => intval($run['run_id']),
             'mean' => floatval($run['run_mean_cache']),
@@ -90,14 +105,14 @@ class RunsGenerator {
             'sum' => floatval($run['run_sum_cache']),
             'squareSum' => floatval($run['run_square_sum_cache']),
             'markedOutlier' => Database::is_true($run['run_marked_outlier']),
-            'revisions' => self::parse_revisions_array($run['revisions']),
+            'revisions' => $revisions,
             'build' => $run['build_id'],
-            'buildTime' => Database::to_js_time($run['build_time']),
+            'buildTime' => $build_time,
             'buildNumber' => intval($run['build_number']),
             'builder' => $run['build_builder']);
     }
 
-    private static function parse_revisions_array($postgres_array) {
+    private static function parse_revisions_array($postgres_array, &$max_time) {
         // e.g. {"(WebKit,131456,\"2012-10-16 14:53:00\")","(Chromium,162004,)"}
         $outer_array = json_decode('[' . trim($postgres_array, '{}') . ']');
         $revisions = array();
@@ -106,6 +121,7 @@ class RunsGenerator {
             if (!$name_and_revision[0])
                 continue;
             $time = Database::to_js_time(trim($name_and_revision[2], '"'));
+            $max_time = max($max_time, $time);
             $revisions[trim($name_and_revision[0], '"')] = array(trim($name_and_revision[1], '"'), $time);
         }
         return $revisions;