Commit c48c345e authored by lpsolit%gmail.com's avatar lpsolit%gmail.com

Bug 303366: Possible locking tables conflict when voting for bugs - Patch by…

Bug 303366: Possible locking tables conflict when voting for bugs - Patch by Frédéric Buclin <LpSolit@gmail.com> r=wurblzap a=justdave
parent ec1a8776
...@@ -1128,15 +1128,6 @@ sub CheckIfVotedConfirmed { ...@@ -1128,15 +1128,6 @@ sub CheckIfVotedConfirmed {
"*** This bug has been confirmed by popular vote. ***", "*** This bug has been confirmed by popular vote. ***",
0, $timestamp); 0, $timestamp);
my $template = Bugzilla->template;
my $vars = $::vars;
$vars->{'type'} = "votes";
$vars->{'id'} = $id;
$vars->{'mailrecipients'} = { 'changer' => $who };
$template->process("bug/process/results.html.tmpl", $vars)
|| ThrowTemplateError($template->error());
$ret = 1; $ret = 1;
} }
return $ret; return $ret;
......
...@@ -1369,16 +1369,28 @@ if ($action eq 'update') { ...@@ -1369,16 +1369,28 @@ if ($action eq 'update') {
} }
} }
# 3. enough votes to confirm # 3. enough votes to confirm
SendSQL("SELECT bug_id FROM bugs " . my $bug_list = $dbh->selectcol_arrayref("SELECT bug_id FROM bugs
"WHERE product_id = $product_id " . WHERE product_id = ?
" AND bug_status = 'UNCONFIRMED' " . AND bug_status = 'UNCONFIRMED'
" AND votes >= $votestoconfirm"); AND votes >= ?",
if (MoreSQLData()) { undef, ($product_id, $votestoconfirm));
if (scalar(@$bug_list)) {
print "<br>Checking unconfirmed bugs in this product for any which now have sufficient votes."; print "<br>Checking unconfirmed bugs in this product for any which now have sufficient votes.";
} }
while (MoreSQLData()) { my @updated_bugs = ();
# The user id below is used for activity log purposes foreach my $bug_id (@$bug_list) {
CheckIfVotedConfirmed(FetchOneColumn(), Bugzilla->user->id); my $confirmed = CheckIfVotedConfirmed($bug_id, $whoid);
push (@updated_bugs, $bug_id) if $confirmed;
}
$vars->{'type'} = "votes";
$vars->{'mailrecipients'} = { 'changer' => $whoid };
$vars->{'header_done'} = 1;
foreach my $bug_id (@updated_bugs) {
$vars->{'id'} = $bug_id;
$template->process("bug/process/results.html.tmpl", $vars)
|| ThrowTemplateError($template->error());
} }
} }
......
...@@ -319,13 +319,8 @@ sub record_votes { ...@@ -319,13 +319,8 @@ sub record_votes {
# need to clear the user's votes from the database. # need to clear the user's votes from the database.
my %affected; my %affected;
$dbh->bz_lock_tables('bugs WRITE', 'bugs_activity WRITE', $dbh->bz_lock_tables('bugs WRITE', 'bugs_activity WRITE',
'votes WRITE', 'longdescs WRITE', 'profiles READ', 'votes WRITE', 'longdescs WRITE',
'products READ', 'components READ', 'cc READ', 'products READ', 'fielddefs READ');
'dependencies READ', 'groups READ', 'fielddefs READ',
'namedqueries READ', 'whine_queries READ', 'watch READ',
'profiles AS watchers READ', 'profiles AS watched READ',
'user_group_map READ', 'bug_group_map READ',
'email_setting READ');
# Take note of, and delete the user's old votes from the database. # Take note of, and delete the user's old votes from the database.
SendSQL("SELECT bug_id FROM votes WHERE who = $who"); SendSQL("SELECT bug_id FROM votes WHERE who = $who");
...@@ -347,15 +342,33 @@ sub record_votes { ...@@ -347,15 +342,33 @@ sub record_votes {
# Update the cached values in the bugs table # Update the cached values in the bugs table
print $cgi->header(); print $cgi->header();
my @updated_bugs = ();
my $sth_getVotes = $dbh->prepare("SELECT SUM(vote_count) FROM votes
WHERE bug_id = ?");
my $sth_updateVotes = $dbh->prepare("UPDATE bugs SET votes = ?
WHERE bug_id = ?");
foreach my $id (keys %affected) { foreach my $id (keys %affected) {
SendSQL("SELECT sum(vote_count) FROM votes WHERE bug_id = $id"); $sth_getVotes->execute($id);
my $v = FetchOneColumn() || 0; my $v = $sth_getVotes->fetchrow_array || 0;
SendSQL("UPDATE bugs SET votes = $v WHERE bug_id = $id"); $sth_updateVotes->execute($v, $id);
my $confirmed = CheckIfVotedConfirmed($id, $who); my $confirmed = CheckIfVotedConfirmed($id, $who);
$vars->{'header_done'} = 1 if $confirmed; push (@updated_bugs, $id) if $confirmed;
} }
$dbh->bz_unlock_tables(); $dbh->bz_unlock_tables();
$vars->{'type'} = "votes";
$vars->{'mailrecipients'} = { 'changer' => $who };
foreach my $bug_id (@updated_bugs) {
$vars->{'id'} = $bug_id;
$template->process("bug/process/results.html.tmpl", $vars)
|| ThrowTemplateError($template->error());
# Set header_done to 1 only after the first bug.
$vars->{'header_done'} = 1;
}
$vars->{'votes_recorded'} = 1; $vars->{'votes_recorded'} = 1;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment