]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 961789: large dependency trees with lots of resolved bugs are very slow to load
authorByron Jones <bjones@mozilla.com>
Mon, 10 Feb 2014 08:05:16 +0000 (16:05 +0800)
committerByron Jones <bjones@mozilla.com>
Mon, 10 Feb 2014 08:05:16 +0000 (16:05 +0800)
r=LpSolit, a=justdave

Bugzilla/Bug.pm
showdependencytree.cgi

index 3e48312a9bedf08ee625ff2f80cfd1675d7c3ba2..a2a8827a51231d1d4c7d17c417a8ee00cdbde67e 100644 (file)
@@ -3800,17 +3800,24 @@ sub editable_bug_fields {
 # Join with bug_status and bugs tables to show bugs with open statuses first,
 # and then the others
 sub EmitDependList {
-    my ($myfield, $targetfield, $bug_id) = (@_);
+    my ($my_field, $target_field, $bug_id, $exclude_resolved) = @_;
+    my $cache = Bugzilla->request_cache->{bug_dependency_list} ||= {};
+
     my $dbh = Bugzilla->dbh;
-    my $list_ref = $dbh->selectcol_arrayref(
-          "SELECT $targetfield
+    $exclude_resolved = $exclude_resolved ? 1 : 0;
+    my $is_open_clause = $exclude_resolved ? 'AND is_open = 1' : '';
+
+    $cache->{"${target_field}_sth_$exclude_resolved"} ||= $dbh->prepare(
+          "SELECT $target_field
              FROM dependencies
-                  INNER JOIN bugs ON dependencies.$targetfield = bugs.bug_id
+                  INNER JOIN bugs ON dependencies.$target_field = bugs.bug_id
                   INNER JOIN bug_status ON bugs.bug_status = bug_status.value
-            WHERE $myfield = ?
-            ORDER BY is_open DESC, $targetfield",
-            undef, $bug_id);
-    return $list_ref;
+            WHERE $my_field = ? $is_open_clause
+            ORDER BY is_open DESC, $target_field");
+
+    return $dbh->selectcol_arrayref(
+        $cache->{"${target_field}_sth_$exclude_resolved"},
+        undef, $bug_id);
 }
 
 # Creates a lot of bug objects in the same order as the input array.
index 786a0312d97d3d83f37abe2415aee8c7cecc5ffb..fb8a59cc37f7f193efdaecda3c7ef95b2899c0a5 100755 (executable)
@@ -123,10 +123,8 @@ sub _generate_tree {
             _generate_tree($dep_id, $relationship, $depth + 1, $bugs, $ids);
         }
 
-        # remove bugs according to visiblity and filters
-        if (!Bugzilla->user->can_see_bug($dep_id)
-            || ($hide_resolved && !$bugs->{$dep_id}->isopened))
-        {
+        # remove bugs according to visiblity
+        if (!Bugzilla->user->can_see_bug($dep_id)) {
             delete $ids->{$dep_id};
         }
         elsif (!grep { $_ == $dep_id } @{ $bugs->{dependencies}->{$bug_id} }) {
@@ -140,7 +138,7 @@ sub _get_dependencies {
     my $cache = Bugzilla->request_cache->{dependency_cache} ||= {};
     return $cache->{$bug_id}->{$relationship} ||=
         $relationship eq 'dependson'
-        ? Bugzilla::Bug::EmitDependList('blocked',   'dependson', $bug_id)
-        : Bugzilla::Bug::EmitDependList('dependson', 'blocked',   $bug_id);
+        ? Bugzilla::Bug::EmitDependList('blocked',   'dependson', $bug_id, $hide_resolved)
+        : Bugzilla::Bug::EmitDependList('dependson', 'blocked',   $bug_id, $hide_resolved);
 }