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 f9b7832..d4885eb 100644 (file)
@@ -1,5 +1,23 @@
 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
         https://bugs.webkit.org/show_bug.cgi?id=151480
 
index 3b07b71..845bb0e 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;