diff options
-rw-r--r-- | Bugzilla/Config/Attachment.pm | 2 | ||||
-rw-r--r-- | Bugzilla/Config/Common.pm | 19 | ||||
-rw-r--r-- | Bugzilla/DB/Mysql.pm | 36 | ||||
-rw-r--r-- | Bugzilla/Install/DB.pm | 5 | ||||
-rw-r--r-- | docs/en/xml/installation.xml | 24 | ||||
-rw-r--r-- | template/en/default/setup/strings.txt.pl | 6 |
6 files changed, 71 insertions, 21 deletions
diff --git a/Bugzilla/Config/Attachment.pm b/Bugzilla/Config/Attachment.pm index 2b014deda..f22c01d95 100644 --- a/Bugzilla/Config/Attachment.pm +++ b/Bugzilla/Config/Attachment.pm @@ -68,7 +68,7 @@ sub get_param_list { name => 'maxattachmentsize', type => 't', default => '1000', - checker => \&check_numeric + checker => \&check_maxattachmentsize }, # The maximum size (in bytes) for patches and non-patch attachments. diff --git a/Bugzilla/Config/Common.pm b/Bugzilla/Config/Common.pm index b6aa1a108..b285b3bc9 100644 --- a/Bugzilla/Config/Common.pm +++ b/Bugzilla/Config/Common.pm @@ -50,6 +50,7 @@ use base qw(Exporter); check_netmask check_user_verify_class check_image_converter check_mail_delivery_method check_notification check_utf8 check_bug_status check_smtp_auth check_theschwartz_available + check_maxattachmentsize ); # Checking functions for the various values @@ -313,6 +314,24 @@ sub check_mail_delivery_method { return ""; } +sub check_maxattachmentsize { + my $check = check_numeric(@_); + return $check if $check; + my $size = shift; + my $dbh = Bugzilla->dbh; + if ($dbh->isa('Bugzilla::DB::Mysql')) { + my (undef, $max_packet) = $dbh->selectrow_array( + q{SHOW VARIABLES LIKE 'max\_allowed\_packet'}); + my $byte_size = $size * 1024; + if ($max_packet < $byte_size) { + return "You asked for a maxattachmentsize of $byte_size bytes," + . " but the max_allowed_packet setting in MySQL currently" + . " only allows packets up to $max_packet bytes"; + } + } + return ""; +} + sub check_notification { my $option = shift; my @current_version = diff --git a/Bugzilla/DB/Mysql.pm b/Bugzilla/DB/Mysql.pm index f85bd31f1..f06900f1b 100644 --- a/Bugzilla/DB/Mysql.pm +++ b/Bugzilla/DB/Mysql.pm @@ -44,6 +44,7 @@ package Bugzilla::DB::Mysql; use strict; use Bugzilla::Constants; +use Bugzilla::Install::Util qw(install_string); use Bugzilla::Util; use Bugzilla::Error; use Bugzilla::DB::Schema::Mysql; @@ -101,20 +102,9 @@ sub new { } } - # The "comments" field of the bugs_fulltext table could easily exceed - # MySQL's default max_allowed_packet. Also, MySQL should never have - # a max_allowed_packet smaller than our max_attachment_size. However, - # if we've already set a max_allowed_packet in MySQL bigger than all - # of those, we should keep it. - my (undef, $current_max_allowed) = $self->selectrow_array( - q{SHOW VARIABLES LIKE 'max\_allowed\_packet'}); - my $min_max_allowed_packet = MAX_COMMENTS * MAX_COMMENT_LENGTH; - my $max_allowed_packet = max($min_max_allowed_packet, - $current_max_allowed, - # This parameter is not yet defined when the DB - # is being built for the very first time. - Bugzilla->params->{'maxattachmentsize'} || 0); - $self->do("SET SESSION max_allowed_packet = $max_allowed_packet"); + # Allow large GROUP_CONCATs (largely for inserting comments + # into bugs_fulltext). + $self->do('SET SESSION group_concat_max_len = 128000000'); return $self; } @@ -291,6 +281,24 @@ sub _bz_get_initial_schema { sub bz_setup_database { my ($self) = @_; + # The "comments" field of the bugs_fulltext table could easily exceed + # MySQL's default max_allowed_packet. Also, MySQL should never have + # a max_allowed_packet smaller than our max_attachment_size. So, we + # warn the user here if max_allowed_packet is too small. + my $min_max_allowed = MAX_COMMENTS * MAX_COMMENT_LENGTH; + my (undef, $current_max_allowed) = $self->selectrow_array( + q{SHOW VARIABLES LIKE 'max\_allowed\_packet'}); + # This parameter is not yet defined when the DB is being built for + # the very first time. The code below still works properly, however, + # because the default maxattachmentsize is smaller than $min_max_allowed. + my $max_attachment = (Bugzilla->params->{'maxattachmentsize'} || 0) * 1024; + my $needed_max_allowed = max($min_max_allowed, $max_attachment); + if ($current_max_allowed < $needed_max_allowed) { + warn install_string('max_allowed_packet', + { current => $current_max_allowed, + needed => $needed_max_allowed }) . "\n"; + } + # Make sure the installation has InnoDB turned on, or we're going to be # doing silly things like making foreign keys on MyISAM tables, which is # hard to fix later. We do this up here because none of the code below diff --git a/Bugzilla/Install/DB.pm b/Bugzilla/Install/DB.pm index 44ad4c814..ff949f58e 100644 --- a/Bugzilla/Install/DB.pm +++ b/Bugzilla/Install/DB.pm @@ -3074,11 +3074,6 @@ sub _populate_bugs_fulltext { if (UNIVERSAL::can($dbh, 'sql_group_concat')) { print "Populating bugs_fulltext..."; print " (this can take a long time.)\n"; - # XXX This hack should probably be moved elsewhere. - if ($dbh->isa('Bugzilla::DB::Mysql')) { - $dbh->do('SET SESSION group_concat_max_len = 128000000'); - $dbh->do('SET SESSION max_allowed_packet = 128000000'); - } $dbh->do( q{INSERT INTO bugs_fulltext (bug_id, short_desc, comments, comments_noprivate) diff --git a/docs/en/xml/installation.xml b/docs/en/xml/installation.xml index 244f08001..65c6b9e8a 100644 --- a/docs/en/xml/installation.xml +++ b/docs/en/xml/installation.xml @@ -1,5 +1,5 @@ <!-- <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"> --> -<!-- $Id: installation.xml,v 1.164 2009/01/08 23:42:53 lpsolit%gmail.com Exp $ --> +<!-- $Id: installation.xml,v 1.165 2009/03/02 01:21:57 mkanat%bugzilla.org Exp $ --> <chapter id="installing-bugzilla"> <title>Installing Bugzilla</title> @@ -778,6 +778,28 @@ improving your installation's security. </para> </caution> + + <section id="mysql-max-allowed-packet"> + <title>Allow large attachments and many comments</title> + + <para>By default, MySQL will only allow you to insert things + into the database that are smaller than 64KB. Attachments + may be larger than this. Also, Bugzilla combines all comments + on a single bug into one field for full-text searching, and the + combination of all comments on a single bug are very likely to + be larger than 64KB.</para> + + <para>To change MySQL's default, you need to edit your MySQL + configuration file, which is usually <filename>/etc/my.cnf</filename> + on Linux. We recommend that you allow at least 4MB packets by + adding the "max_allowed_packet" parameter to your MySQL + configuration in the "[mysqld]" section, like this:</para> + + <screen>[mysqld] +# Allow packets up to 4MB +max_allowed_packet=4M + </screen> + </section> <section> <title>Allow small words in full-text indexes</title> diff --git a/template/en/default/setup/strings.txt.pl b/template/en/default/setup/strings.txt.pl index d2a846d51..fdbde4e77 100644 --- a/template/en/default/setup/strings.txt.pl +++ b/template/en/default/setup/strings.txt.pl @@ -61,6 +61,12 @@ then the value of the ##column## column that needs to be fixed: EOT install_module => 'Installing ##module## version ##version##...', + max_allowed_packet => <<EOT, +WARNING: You need to set the max_allowed_packet parameter in your MySQL +configuration to at least ##needed##. Currently it is set to ##current##. +You can set this parameter in the [mysqld] section of your MySQL +configuration file. +EOT min_version_required => "Minimum version required: ", # Note: When translating these "modules" messages, don't change the formatting |