Good to push.
Rafal
Jorgen Loland wrote:
> #At file:///localhome/jl208045/mysql/mysql-6.0-backup-33568/
>
> 2638 Jorgen Loland 2008-06-20
> Bug#33568 - "Backup: crash if many databases in list"
>
> DYNAMIC_ARRAY is 0 based and needs to allocate new elements when
> position == max_elements, not when position > max_elements
> added:
> mysql-test/r/backup_many_dbs.result
> mysql-test/t/backup_many_dbs.test
> modified:
> sql/backup/backup_aux.h
>
> per-file comments:
> mysql-test/r/backup_many_dbs.result
> Regression test result for 33568.
> mysql-test/t/backup_many_dbs.test
> Regression test for 33568. The test backs up 18 databases, which used to make
> server crash due to memory overrun in the array storing databases.
> sql/backup/backup_aux.h
> DYNAMIC_ARRAY is 0-based. Changed test for array overrun from "pos >
> max_element" to "pos >= max_element"
> === added file 'mysql-test/r/backup_many_dbs.result'
> --- a/mysql-test/r/backup_many_dbs.result 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/r/backup_many_dbs.result 2008-06-20 08:33:54 +0000
> @@ -0,0 +1,106 @@
> +Starting regression test for bug 33568
> +DROP DATABASE IF EXISTS db1;
> +DROP DATABASE IF EXISTS db2;
> +DROP DATABASE IF EXISTS db3;
> +DROP DATABASE IF EXISTS db4;
> +DROP DATABASE IF EXISTS db5;
> +DROP DATABASE IF EXISTS db6;
> +DROP DATABASE IF EXISTS db7;
> +DROP DATABASE IF EXISTS db8;
> +DROP DATABASE IF EXISTS db9;
> +DROP DATABASE IF EXISTS db10;
> +DROP DATABASE IF EXISTS db11;
> +DROP DATABASE IF EXISTS db12;
> +DROP DATABASE IF EXISTS db13;
> +DROP DATABASE IF EXISTS db14;
> +DROP DATABASE IF EXISTS db15;
> +DROP DATABASE IF EXISTS db16;
> +DROP DATABASE IF EXISTS db17;
> +DROP DATABASE IF EXISTS db18;
> +Creating 18 databases
> +CREATE DATABASE db1;
> +CREATE DATABASE db2;
> +CREATE DATABASE db3;
> +CREATE DATABASE db4;
> +CREATE DATABASE db5;
> +CREATE DATABASE db6;
> +CREATE DATABASE db7;
> +CREATE DATABASE db8;
> +CREATE DATABASE db9;
> +CREATE DATABASE db10;
> +CREATE DATABASE db11;
> +CREATE DATABASE db12;
> +CREATE DATABASE db13;
> +CREATE DATABASE db14;
> +CREATE DATABASE db15;
> +CREATE DATABASE db16;
> +CREATE DATABASE db17;
> +CREATE DATABASE db18;
> +Backing up the databases
> +BACKUP DATABASE db1, db2, db3, db4, db5, db6, db7, db8, db9, db10, db11, db12, db13,
> db14, db15, db16, db17, db18
> +TO 'bup_manydbs.bak';
> +backup_id
> +#
> +Dropping the databases
> +DROP DATABASE db1;
> +DROP DATABASE db2;
> +DROP DATABASE db3;
> +DROP DATABASE db4;
> +DROP DATABASE db5;
> +DROP DATABASE db6;
> +DROP DATABASE db7;
> +DROP DATABASE db8;
> +DROP DATABASE db9;
> +DROP DATABASE db10;
> +DROP DATABASE db11;
> +DROP DATABASE db12;
> +DROP DATABASE db13;
> +DROP DATABASE db14;
> +DROP DATABASE db15;
> +DROP DATABASE db16;
> +DROP DATABASE db17;
> +DROP DATABASE db18;
> +Restoring databases
> +RESTORE FROM 'bup_manydbs.bak';
> +backup_id
> +#
> +Checking that all dbs are there
> +SHOW DATABASES LIKE 'db%';
> +Database (db%)
> +db1
> +db10
> +db11
> +db12
> +db13
> +db14
> +db15
> +db16
> +db17
> +db18
> +db2
> +db3
> +db4
> +db5
> +db6
> +db7
> +db8
> +db9
> +Cleaning up
> +DROP DATABASE db1;
> +DROP DATABASE db2;
> +DROP DATABASE db3;
> +DROP DATABASE db4;
> +DROP DATABASE db5;
> +DROP DATABASE db6;
> +DROP DATABASE db7;
> +DROP DATABASE db8;
> +DROP DATABASE db9;
> +DROP DATABASE db10;
> +DROP DATABASE db11;
> +DROP DATABASE db12;
> +DROP DATABASE db13;
> +DROP DATABASE db14;
> +DROP DATABASE db15;
> +DROP DATABASE db16;
> +DROP DATABASE db17;
> +DROP DATABASE db18;
>
> === added file 'mysql-test/t/backup_many_dbs.test'
> --- a/mysql-test/t/backup_many_dbs.test 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/t/backup_many_dbs.test 2008-06-20 08:33:54 +0000
> @@ -0,0 +1,133 @@
> +###########################################################################
> +# Regression test for bug#33568
> +###############################################################################
> +--source include/have_innodb.inc
> +--source include/not_embedded.inc
> +--source include/have_debug.inc
> +
> +##############################################################
> +--echo Starting regression test for bug 33568
> +##############################################################
> +
> +--error 0,1
> +--remove_file $MYSQLTEST_VARDIR/master-data/bup_manydbs.bak
> +
> +--disable_warnings
> +DROP DATABASE IF EXISTS db1;
> +DROP DATABASE IF EXISTS db2;
> +DROP DATABASE IF EXISTS db3;
> +DROP DATABASE IF EXISTS db4;
> +DROP DATABASE IF EXISTS db5;
> +DROP DATABASE IF EXISTS db6;
> +DROP DATABASE IF EXISTS db7;
> +DROP DATABASE IF EXISTS db8;
> +DROP DATABASE IF EXISTS db9;
> +DROP DATABASE IF EXISTS db10;
> +DROP DATABASE IF EXISTS db11;
> +DROP DATABASE IF EXISTS db12;
> +DROP DATABASE IF EXISTS db13;
> +DROP DATABASE IF EXISTS db14;
> +DROP DATABASE IF EXISTS db15;
> +DROP DATABASE IF EXISTS db16;
> +DROP DATABASE IF EXISTS db17;
> +DROP DATABASE IF EXISTS db18;
> +--enable_warnings
> +
> +##############################################################
> +--echo Creating 18 databases
> +##############################################################
> +
> +# Create 18 databases. This is the threashold for provoking the bug (16
> +# dbs works, nbr 17 overruns memory, nbr 18 crashes server due to
> +# overrun memory
> +
> +CREATE DATABASE db1;
> +CREATE DATABASE db2;
> +CREATE DATABASE db3;
> +CREATE DATABASE db4;
> +CREATE DATABASE db5;
> +CREATE DATABASE db6;
> +CREATE DATABASE db7;
> +CREATE DATABASE db8;
> +CREATE DATABASE db9;
> +CREATE DATABASE db10;
> +CREATE DATABASE db11;
> +CREATE DATABASE db12;
> +CREATE DATABASE db13;
> +CREATE DATABASE db14;
> +CREATE DATABASE db15;
> +CREATE DATABASE db16;
> +CREATE DATABASE db17;
> +CREATE DATABASE db18;
For the future (or if you want to change that before pushing): you can use
simple loops inside test scripts. Something like this (but please verify details):
let $i=18;
while ($i)
{
eval CREATE DATABASE db$i;
dec $i;
}
> +
> +
> +##############################################################
> +--echo Backing up the databases
> +##############################################################
> +
> +#Backup and restore data.
> +replace_column 1 #;
> +BACKUP DATABASE db1, db2, db3, db4, db5, db6, db7, db8, db9, db10, db11, db12, db13,
> db14, db15, db16, db17, db18
> +TO 'bup_manydbs.bak';
> +
> +##############################################################
> +--echo Dropping the databases
> +##############################################################
> +DROP DATABASE db1;
> +DROP DATABASE db2;
> +DROP DATABASE db3;
> +DROP DATABASE db4;
> +DROP DATABASE db5;
> +DROP DATABASE db6;
> +DROP DATABASE db7;
> +DROP DATABASE db8;
> +DROP DATABASE db9;
> +DROP DATABASE db10;
> +DROP DATABASE db11;
> +DROP DATABASE db12;
> +DROP DATABASE db13;
> +DROP DATABASE db14;
> +DROP DATABASE db15;
> +DROP DATABASE db16;
> +DROP DATABASE db17;
> +DROP DATABASE db18;
> +
> +##############################################################
> +--echo Restoring databases
> +##############################################################
> +
> +replace_column 1 #;
> +RESTORE FROM 'bup_manydbs.bak';
> +
> +##############################################################
> +--echo Checking that all dbs are there
> +##############################################################
> +
> +SHOW DATABASES LIKE 'db%';
> +
> +##############################################################
> +--echo Cleaning up
> +##############################################################
> +
> +DROP DATABASE db1;
> +DROP DATABASE db2;
> +DROP DATABASE db3;
> +DROP DATABASE db4;
> +DROP DATABASE db5;
> +DROP DATABASE db6;
> +DROP DATABASE db7;
> +DROP DATABASE db8;
> +DROP DATABASE db9;
> +DROP DATABASE db10;
> +DROP DATABASE db11;
> +DROP DATABASE db12;
> +DROP DATABASE db13;
> +DROP DATABASE db14;
> +DROP DATABASE db15;
> +DROP DATABASE db16;
> +DROP DATABASE db17;
> +DROP DATABASE db18;
> +
> +--error 0,1
> +--remove_file $MYSQLTEST_VARDIR/master-data/bup_manydbs.bak
> +
>
> === modified file 'sql/backup/backup_aux.h'
> --- a/sql/backup/backup_aux.h 2008-03-05 17:48:12 +0000
> +++ b/sql/backup/backup_aux.h 2008-06-20 08:33:54 +0000
> @@ -297,7 +297,7 @@ int Map<uint,T>::insert(ulong pos, T *pt
> uchar *entry;
> DYNAMIC_ARRAY *array= &this->array;
>
> - while (pos > Base::array.max_element)
> + while (pos >= Base::array.max_element)
> {
> entry= alloc_dynamic(array);
> if (!entry)
> @@ -306,7 +306,7 @@ int Map<uint,T>::insert(ulong pos, T *pt
>
> clear_free_space();
>
> - if (pos > Base::array.max_element)
> + if (pos >= Base::array.max_element)
> return 1;
>
> if (pos >= Base::array.elements)
>
>