List:Commits« Previous MessageNext Message »
From:Rafal Somla Date:June 23 2008 2:02pm
Subject:Re: bzr commit into mysql-6.0-backup branch (jorgen.loland:2638)
Bug#33568
View as plain text  
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)
> 
> 
Thread
bzr commit into mysql-6.0-backup branch (jorgen.loland:2638) Bug#33568Jorgen Loland20 Jun
  • Re: bzr commit into mysql-6.0-backup branch (jorgen.loland:2638)Bug#33568Rafal Somla23 Jun
  • RE: bzr commit into mysql-6.0-backup branch (jorgen.loland:2638) Bug#33568Chuck Bell23 Jun