List:Commits« Previous MessageNext Message »
From:Jorgen Loland Date:December 4 2008 1:04pm
Subject:bzr commit into mysql-6.0-backup branch (jorgen.loland:2737) Bug#38426
View as plain text  
#At file:///localhome/jl208045/mysql/mysql-6.0-backup-38426/

 2737 Jorgen Loland	2008-12-04
      Bug#38426 - Backup of partitioned Falcon table will not use snapshot driver
                  
      Before, the Default backup driver was used when backing up a partitioned table. However, the Snapshot driver is capable of backing up partitioned tables if the underlying storage engine is InnoDB or Falcon.
            
      With this patch, the Snapshot backup driver is used if the underlying storage engine of a partitioned table is InnoDB or Falcon
added:
  mysql-test/suite/backup_engines/r/backup_partition.result
  mysql-test/suite/backup_engines/t/backup_partition.test
modified:
  mysql-test/suite/backup/r/backup_default.result
  mysql-test/suite/backup/t/backup_default.test
  sql/backup/backup_info.cc

per-file messages:
  mysql-test/suite/backup/r/backup_default.result
    Changed storage engine of partitioned table from Falcon to MyISAM since partitioned Falcon does not use default driver
  mysql-test/suite/backup/t/backup_default.test
    Changed storage engine of partitioned table from Falcon to MyISAM since partitioned Falcon does not use default driver
  mysql-test/suite/backup_engines/r/backup_partition.result
    Test for checking that backup of partitioned tables uses correct backup driver
  mysql-test/suite/backup_engines/t/backup_partition.test
    Test for checking that backup of partitioned tables uses correct backup driver
  sql/backup/backup_info.cc
    Modify method get_storage_engine to return underlying storage engine of partitioned tables iff the storage engine is InnoDB or Falcon.
=== modified file 'mysql-test/suite/backup/r/backup_default.result'
--- a/mysql-test/suite/backup/r/backup_default.result	2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_default.result	2008-12-04 13:04:16 +0000
@@ -29,33 +29,20 @@ id	name	city
 DROP DATABASE db1;
 
 Server should not crash for backup using default driver 
-Partitioned Falcon tables
-Test for bug#33566, bug#36792 
+Mix of tables
 
 CREATE DATABASE db1;
 USE db1;
 CREATE TABLE partition_table (
 int_column int(11), 
 char_column char(5))
-engine=falcon
+ENGINE=myisam
 PARTITION BY HASH (int_column);
 INSERT INTO partition_table VALUES (0,'pVtIa');
 INSERT INTO partition_table VALUES (5,'jTfSg');
 INSERT INTO partition_table VALUES (20,'UezFi');
 INSERT INTO partition_table VALUES (25,'cxmeH');
 INSERT INTO partition_table VALUES (65,'lIuNS');
-testing content in restored tables
-SELECT * FROM partition_table ORDER BY int_column;
-int_column	char_column
-0	pVtIa
-5	jTfSg
-20	UezFi
-25	cxmeH
-65	lIuNS
-
-Server should not crash for backup using default driver 
-Mix of tables
-
 CREATE TABLE csv_table(
 id int NOT NULL,
 name char(20) NOT NULL,
@@ -67,6 +54,33 @@ i int,
 v varchar(20))
 ENGINE=myisam;
 INSERT INTO myisam_table VALUES(1,'v1'),(2,'v2'),(3,'v3');
+backup on mixed table database
+BACKUP DATABASE db1 to 'bup_mixed.bak';
+backup_id
+#
+DROP DATABASE db1;
+restore on mixed table database
+RESTORE FROM 'bup_mixed.bak';
+backup_id
+#
+testing content in restored tables
+SELECT * FROM partition_table ORDER BY int_column;
+int_column	char_column
+0	pVtIa
+5	jTfSg
+20	UezFi
+25	cxmeH
+65	lIuNS
+SELECT * FROM csv_table ORDER BY id;
+id	name	city
+1	aa1	bb1
+2	aa2	bb2
+3	aa3	bb3
+SELECT * FROM myisam_table ORDER BY i;
+i	v
+1	v1
+2	v2
+3	v3
 
 ***  CLEANUP  ****
 

=== modified file 'mysql-test/suite/backup/t/backup_default.test'
--- a/mysql-test/suite/backup/t/backup_default.test	2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/t/backup_default.test	2008-12-04 13:04:16 +0000
@@ -43,17 +43,17 @@ DROP DATABASE db1;
 
 --echo
 --echo Server should not crash for backup using default driver 
---echo Partitioned Falcon tables
---echo Test for bug#33566, bug#36792 
+--echo Mix of tables
 --echo 
 
 CREATE DATABASE db1;
 USE db1;
 
+# create partitioned MyISAM table - will use default driver
 CREATE TABLE partition_table (
   int_column int(11), 
   char_column char(5))
-engine=falcon
+ENGINE=myisam
 PARTITION BY HASH (int_column);
 
 INSERT INTO partition_table VALUES (0,'pVtIa');
@@ -62,30 +62,7 @@ INSERT INTO partition_table VALUES (20,'
 INSERT INTO partition_table VALUES (25,'cxmeH');
 INSERT INTO partition_table VALUES (65,'lIuNS');
 
-#
-# This portion of the test has been disabled. See BUG#39017
-#
-#--echo backup on partitioned falcon
-#--replace_column 1 #
-#BACKUP DATABASE db1 to 'bup_falcon.bak';
-#
-#DROP DATABASE db1;
-#
-#--echo restore on partitioned falcon
-#--replace_column 1 #
-#RESTORE FROM 'bup_falcon.bak';
-
---echo testing content in restored tables
-SELECT * FROM partition_table ORDER BY int_column;
-
-
---echo
---echo Server should not crash for backup using default driver 
---echo Mix of tables
---echo 
-
-# partition_table already exists in the database
-# re-create the csv_table
+# create CSV table - will use default driver
 CREATE TABLE csv_table(
    id int NOT NULL,
    name char(20) NOT NULL,
@@ -102,23 +79,20 @@ ENGINE=myisam;
 
 INSERT INTO myisam_table VALUES(1,'v1'),(2,'v2'),(3,'v3');
 
-#
-# This portion of the test has been disabled. See BUG#39017
-#
-#--echo backup on mixed table database
-#--replace_column 1 #
-#BACKUP DATABASE db1 to 'bup_mixed.bak';
-#
-#DROP DATABASE db1;
-#
-#--echo restore on mixed table database
-#--replace_column 1 #
-#RESTORE FROM 'bup_mixed.bak';
-#
-#--echo testing content in restored tables
-#SELECT * FROM partition_table ORDER BY int_column;
-#SELECT * FROM csv_table ORDER BY id;
-#SELECT * FROM myisam_table ORDER BY i;
+--echo backup on mixed table database
+--replace_column 1 #
+BACKUP DATABASE db1 to 'bup_mixed.bak';
+
+DROP DATABASE db1;
+
+--echo restore on mixed table database
+--replace_column 1 #
+RESTORE FROM 'bup_mixed.bak';
+
+--echo testing content in restored tables
+SELECT * FROM partition_table ORDER BY int_column;
+SELECT * FROM csv_table ORDER BY id;
+SELECT * FROM myisam_table ORDER BY i;
 
 
 # Test cleanup section

=== added file 'mysql-test/suite/backup_engines/r/backup_partition.result'
--- a/mysql-test/suite/backup_engines/r/backup_partition.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/backup_engines/r/backup_partition.result	2008-12-04 13:04:16 +0000
@@ -0,0 +1,43 @@
+#
+# Creating databases
+#
+CREATE DATABASE backup_part;
+CREATE TABLE backup_part.t1 (
+t1_autoinc INTEGER NOT NULL AUTO_INCREMENT,
+t1_uuid CHAR(36),
+PRIMARY KEY (t1_autoinc))
+PARTITION BY HASH (t1_autoinc);
+INSERT INTO backup_part.t1(t1_uuid) VALUES ('aaa'),('bbb'),('ccc'),('ddd');
+# Show content
+SELECT * FROM backup_part.t1 ORDER BY t1_autoinc;
+t1_autoinc	t1_uuid
+1	aaa
+2	bbb
+3	ccc
+4	ddd
+#
+# Perform backup
+#
+# Show drivers. 
+
+SELECT count(*) FROM mysql.backup_history WHERE drivers LIKE 'FILTERED DRIVER' AND backup_id=FILTERED ID;
+count(*)
+1
+
+#
+# Restore and show content
+#  
+RESTORE FROM 'partition.bak' OVERWRITE;
+backup_id
+#
+
+SELECT * FROM backup_part.t1 ORDER BY t1_autoinc;
+t1_autoinc	t1_uuid
+1	aaa
+2	bbb
+3	ccc
+4	ddd
+#
+# Cleanup
+#  
+DROP DATABASE backup_part;

=== added file 'mysql-test/suite/backup_engines/t/backup_partition.test'
--- a/mysql-test/suite/backup_engines/t/backup_partition.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/backup_engines/t/backup_partition.test	2008-12-04 13:04:16 +0000
@@ -0,0 +1,67 @@
+#
+# This test is designed to test that BACKUP selects the best available
+# driver for partitioned tables. The storage engines should use these
+# drivers:
+#
+#   Partitioned Falcon table      -> Snapshot
+#   Partitioned InnoDB table      -> Snapshot
+#   All other partitioned tables  -> Default
+#
+
+# Find expected backup driver for the current storage engine.
+
+let $exp_drv= Default;
+if (`select @@storage_engine = 'falcon'`) { let $exp_drv= Snapshot; }
+if (`select @@storage_engine = 'innodb'`) { let $exp_drv= Snapshot; }
+
+# Uncomment the line below and run the test with --force flag
+# if you want to verify that expected driver is correct
+#echo $exp_drv;
+
+--echo #
+--echo # Creating databases
+--echo #
+CREATE DATABASE backup_part;
+
+CREATE TABLE backup_part.t1 (
+  t1_autoinc INTEGER NOT NULL AUTO_INCREMENT,
+  t1_uuid CHAR(36),
+  PRIMARY KEY (t1_autoinc))
+PARTITION BY HASH (t1_autoinc);
+
+INSERT INTO backup_part.t1(t1_uuid) VALUES ('aaa'),('bbb'),('ccc'),('ddd'); 
+
+--echo # Show content
+SELECT * FROM backup_part.t1 ORDER BY t1_autoinc;
+
+--echo #
+--echo # Perform backup
+--replace_column 1 #
+let $bup_id= `BACKUP DATABASE backup_part TO 'partition.bak'`;
+
+--echo #
+--echo # Show drivers. 
+
+--echo
+# Count of expected driver for this backup_id should be 1
+# Replace exp_drv and backup_id in query because it will vary
+replace_regex /'.*'.*/'FILTERED DRIVER' AND backup_id=FILTERED ID/ ;
+--eval SELECT count(*) FROM mysql.backup_history WHERE drivers LIKE '$exp_drv' AND backup_id=$bup_id
+--echo
+
+--echo #
+--echo # Restore and show content
+--echo #  
+
+--replace_column 1 #
+RESTORE FROM 'partition.bak' OVERWRITE;
+--echo
+SELECT * FROM backup_part.t1 ORDER BY t1_autoinc;
+
+--echo #
+--echo # Cleanup
+--echo #  
+
+DROP DATABASE backup_part;
+
+--remove_file $MYSQLTEST_VARDIR/master-data/partition.bak

=== modified file 'sql/backup/backup_info.cc'
--- a/sql/backup/backup_info.cc	2008-11-25 17:44:19 +0000
+++ b/sql/backup/backup_info.cc	2008-12-04 13:04:16 +0000
@@ -8,6 +8,7 @@
 */
 
 #include "../mysql_priv.h"
+#include "../ha_partition.h"
 
 #include "backup_info.h"
 #include "backup_kernel.h"
@@ -34,6 +35,48 @@ storage_engine_ref get_storage_engine(TH
   if (table)
   {
     se= plugin_ref_to_se_ref(table->s->db_plugin);
+
+    /*
+      Further check for underlying storage engine is needed
+      if table is partitioned
+    */
+
+    storage_engine_ref se_tmp= NULL;
+
+    if (table->part_info)
+    {
+      partition_info *p_info=  table->part_info;
+      List_iterator<partition_element> p_it(p_info->partitions);
+      partition_element *p_el;
+      
+      while ((p_el= p_it++))
+      {
+        if (!se_tmp)
+        {
+          se_tmp= hton2plugin[p_el->engine_type->slot];
+          ::handlerton *h= se_hton(se_tmp);
+
+          /* 
+             Native drivers don't support partitioning. Let Falcon and
+             InnoDB use Snapshot driver; all other storage engines use
+             Default.
+          */
+          if (h->start_consistent_snapshot == NULL) 
+            goto close; // This is not a Falcon or InnoDB storage engine
+
+          continue;
+        }
+
+        // use Default driver if partitions have different storage engines
+        if (se_tmp != hton2plugin[p_el->engine_type->slot])
+          goto close;
+      };
+      
+      se= se_tmp;
+    }
+
+ close:
+  
     ::intern_close_table(table);
     my_free(table, MYF(0));
   }

Thread
bzr commit into mysql-6.0-backup branch (jorgen.loland:2737) Bug#38426Jorgen Loland4 Dec