summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorByron Jones <bjones@mozilla.com>2014-02-10 09:05:16 +0100
committerByron Jones <bjones@mozilla.com>2014-02-10 09:05:16 +0100
commit8feb85e10f0993bdb372d500223cf568bd3dd355 (patch)
tree70963dd6d26fd76971d769a078e529976d12620f
parent256930bd096b4dc4032b5be7b6333b890471ef3a (diff)
downloadbugzilla-8feb85e10f0993bdb372d500223cf568bd3dd355.tar.gz
bugzilla-8feb85e10f0993bdb372d500223cf568bd3dd355.tar.xz
Bug 961789: large dependency trees with lots of resolved bugs are very slow to load
r=LpSolit, a=justdave
-rw-r--r--Bugzilla/Bug.pm23
-rwxr-xr-xshowdependencytree.cgi10
2 files changed, 19 insertions, 14 deletions
diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm
index 3e48312a9..a2a8827a5 100644
--- a/Bugzilla/Bug.pm
+++ b/Bugzilla/Bug.pm
@@ -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.
diff --git a/showdependencytree.cgi b/showdependencytree.cgi
index 786a0312d..fb8a59cc3 100755
--- a/showdependencytree.cgi
+++ b/showdependencytree.cgi
@@ -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);
}