Chuck,
This is ok but I would move the code which sets lock mode to TL_READ from
prelock() to the constructor. At prelcok() time we shouldn't spend extra time if
it is not necessary.
Other than that the patch is good to push.
Rafal
cbell@stripped wrote:
> Below is the list of changes that have just been committed into a local
> 5.2 repository of cbell. When cbell does a push these changes will
> be propagated to the main repository and, within 24 hours after the
> push, to the public repository.
> For information on how to access the public repository
> see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
>
> ChangeSet@stripped, 2007-06-28 14:17:25-04:00, cbell@mysql_cab_desk. +14 -0
> WL#3776 : Consistent snapshot backup for MVCC
>
> This patch adds consistent snapshot algorithm for online backup. The
> consistent snapshot algorithm is designed to work with any storage engine
> that supports a consistent read operation (transaction). Currently, this
> is limited to InnoDB but the code was written to allow the use of any
> storage engine that supposts consistent read via the consistent shapshot
> method in the handler.
>
> mysql-test/r/backup.result@stripped, 2007-06-28 14:17:17-04:00, cbell@mysql_cab_desk. +6
> -6
> WL#3776 : Consistent snapshot backup for MVCC
>
> This patch adds the changes to the result file for the backup test.
>
> mysql-test/r/backup_snapshot.result@stripped, 2007-06-28 14:17:22-04:00,
> cbell@mysql_cab_desk. +58 -0
> WL#3776 : Consistent snapshot backup for MVCC
>
> This patch adds the result file for the backup_snapshot test.
>
>
> mysql-test/r/backup_snapshot.result@stripped, 2007-06-28 14:17:22-04:00,
> cbell@mysql_cab_desk. +0 -0
>
> mysql-test/t/backup.test@stripped, 2007-06-28 14:17:17-04:00, cbell@mysql_cab_desk. +6
> -6
> WL#3776 : Consistent snapshot backup for MVCC
>
> This patch alters the base test file changing two of the tables to use
> innodb instead of myisam. This will require the backup kernel to use
> both the default and snapshot drivers.
>
> mysql-test/t/backup_snapshot.opt@stripped, 2007-06-28 14:17:21-04:00,
> cbell@mysql_cab_desk. +1 -0
> WL#3776 : Consistent snapshot backup for MVCC
>
> This patch adds the option file for the backup_snapshot test.
>
>
> mysql-test/t/backup_snapshot.opt@stripped, 2007-06-28 14:17:21-04:00,
> cbell@mysql_cab_desk. +0 -0
>
> mysql-test/t/backup_snapshot.test@stripped, 2007-06-28 14:17:22-04:00,
> cbell@mysql_cab_desk. +83 -0
> WL#3776 : Consistent snapshot backup for MVCC
>
> This patch adds a test file for the consistent snapshot algorithm. The test uses
> control insertion to ensure there are simultaneous inserts and deletes occuring
> at the
> same time as the backup.
>
>
> mysql-test/t/backup_snapshot.test@stripped, 2007-06-28 14:17:22-04:00,
> cbell@mysql_cab_desk. +0 -0
>
> sql/CMakeLists.txt@stripped, 2007-06-28 14:17:18-04:00, cbell@mysql_cab_desk. +1 -0
> WL#3776 : Consistent snapshot backup for MVCC
>
> This patch adds the consistent snapshot files to the CMakeLists.txt file.
>
> sql/backup/Makefile.am@stripped, 2007-06-28 14:17:18-04:00, cbell@mysql_cab_desk. +2 -0
> WL#3776 : Consistent snapshot backup for MVCC
>
> This patch adds the consistent snapshot files to the CMakeLists.txt file.
>
>
> sql/backup/archive.cc@stripped, 2007-06-28 14:17:18-04:00, cbell@mysql_cab_desk. +4 -0
> WL#3776 : Consistent snapshot backup for MVCC
>
> This patch adds the consistent snapshot class to the Image_info struct.
>
> sql/backup/archive.h@stripped, 2007-06-28 14:17:19-04:00, cbell@mysql_cab_desk. +1 -1
> WL#3776 : Consistent snapshot backup for MVCC
>
> This patch adds the consistent snapshot class to the image types for
> the Image_info struct.
>
> sql/backup/backup_kernel.h@stripped, 2007-06-28 14:17:19-04:00, cbell@mysql_cab_desk. +1
> -0
> WL#3776 : Consistent snapshot backup for MVCC
>
> This patch adds a variable to store the index for the consistent snapshot
> driver in the images array.
>
> sql/backup/be_snapshot.cc@stripped, 2007-06-28 14:17:20-04:00, cbell@mysql_cab_desk.
> +151 -0
> WL#3776 : Consistent snapshot backup for MVCC
>
> This patch adds the consistent snapshot source file. This file contains
> the consistent snapshot algorithm.
>
>
> sql/backup/be_snapshot.cc@stripped, 2007-06-28 14:17:20-04:00, cbell@mysql_cab_desk. +0
> -0
>
> sql/backup/be_snapshot.h@stripped, 2007-06-28 14:17:21-04:00, cbell@mysql_cab_desk. +145
> -0
> WL#3776 : Consistent snapshot backup for MVCC
>
> This patch adds the buffer_iterator class for buffering the blob fields for the
> consistent snapshot and default drivers. This file contains the source code for
> the
> buffer iterator class.
>
>
> sql/backup/be_snapshot.h@stripped, 2007-06-28 14:17:21-04:00, cbell@mysql_cab_desk. +0
> -0
>
> sql/backup/data_backup.cc@stripped, 2007-06-28 14:17:20-04:00, cbell@mysql_cab_desk. +6
> -2
> WL#3776 : Consistent snapshot backup for MVCC
>
> This patch adds the snapshot driver to the tests for restore in the
> close thread tables for write_table_data().
>
> sql/backup/sql_backup.cc@stripped, 2007-06-28 14:17:20-04:00, cbell@mysql_cab_desk. +25
> -5
> WL#3776 : Consistent snapshot backup for MVCC
>
> This patch adds the consistent snapshot option to the kernel backup image
> generator.
>
> # This is a BitKeeper patch. What follows are the unified diffs for the
> # set of deltas contained in the patch. The rest of the patch, the part
> # that BitKeeper cares about, is below these diffs.
> # User: cbell
> # Host: mysql_cab_desk.
> # Root: C:/source/c++/mysql-5.2_WL_3776
>
> --- 1.1/mysql-test/r/backup.result 2007-06-28 14:17:33 -04:00
> +++ 1.2/mysql-test/r/backup.result 2007-06-28 14:17:33 -04:00
> @@ -137,9 +137,9 @@
> `q` TEXT,
> PRIMARY KEY (`a`)
> ) ENGINE=myisam DEFAULT CHARSET=latin1;
> -CREATE TABLE bup_default.t1 (a int) engine=myisam;
> +CREATE TABLE bup_default.t1 (a int) engine=innodb;
> CREATE TABLE bup_default.t2 (a int) engine=myisam;
> -CREATE TABLE bup_default.t1_blob (a int, b text);
> +CREATE TABLE bup_default.t1_blob (a int, b text) engine=innodb;
> INSERT INTO bup_default.wide VALUES (
> NULL,
> "This is column b pass 01",
> @@ -319,19 +319,19 @@
> Enter password:
> BACKUP DATABASE bup_default TO "bup_default.bak";
> Backup Summary
> - header = 40 bytes
> + header = 43 bytes
> meta-data = 890 bytes
> data = 7425 bytes
> --------------
> - total 8355 bytes
> + total 8358 bytes
> DROP DATABASE bup_default;
> RESTORE FROM "bup_default.bak";
> Restore Summary
> - header = 40 bytes
> + header = 43 bytes
> meta-data = 890 bytes
> data = 7425 bytes
> --------------
> - total 8355 bytes
> + total 8358 bytes
> SELECT * FROM bup_default.t1;
> a
> 1
> --- New file ---
> +++ mysql-test/r/backup_snapshot.result 07/06/28 14:17:22
> DROP DATABASE IF EXISTS bup_snapshot;
> CREATE DATABASE bup_snapshot;
> CREATE TABLE bup_snapshot.t1 (word CHAR(20)) ENGINE=INNODB;
> INSERT INTO bup_snapshot.t1 VALUES ("01 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("02 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("03 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("04 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("05 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("06 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("07 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("08 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("09 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("10 Some data to test");
> con1: Show that the new data doesn't exist before backup.
> SELECT * FROM bup_snapshot.t1 WHERE word LIKE '-%';
> word
> SELECT COUNT(*) FROM bup_snapshot.t1;
> COUNT(*)
> 10
> con1: Backing up database.
> BACKUP DATABASE bup_snapshot TO "bup_snapshot.bak";
> Backup Summary
> header = 22 bytes
> meta-data = 95 bytes
> data = 260 bytes
> --------------
> total 377 bytes
> con2: Inserting new data.
> INSERT INTO bup_snapshot.t1 VALUES("- Dave Mathews");
> INSERT INTO bup_snapshot.t1 VALUES("- Yes");
> INSERT INTO bup_snapshot.t1 VALUES("- Jethro Tull");
> DELETE FROM bup_snapshot.t1 WHERE word LIKE '10%';
> con2: Showing the data after inserts.
> SELECT * FROM bup_snapshot.t1 WHERE word LIKE '-%';
> word
> - Dave Mathews
> - Yes
> - Jethro Tull
> SELECT COUNT(*) FROM bup_snapshot.t1;
> COUNT(*)
> 12
> con1: Dropping the database
> DROP TABLE bup_snapshot.t1;
> con1: Restoring the database
> RESTORE FROM "bup_snapshot.bak";
> Restore Summary
> header = 22 bytes
> meta-data = 95 bytes
> data = 260 bytes
> --------------
> total 377 bytes
> con1: Showing the data (no new data should be here).
> SELECT * FROM bup_snapshot.t1 WHERE word LIKE '-%';
> word
> SELECT COUNT(*) FROM bup_snapshot.t1;
> COUNT(*)
> 10
> DROP DATABASE IF EXISTS bup_snapshot;
>
>
> --- 1.1/mysql-test/t/backup.test 2007-06-28 14:17:33 -04:00
> +++ 1.2/mysql-test/t/backup.test 2007-06-28 14:17:33 -04:00
> @@ -1,3 +1,5 @@
> +--source include/have_innodb.inc
> +
> connect (backup,localhost,root,,);
> connect (restore,localhost,root,,);
>
> @@ -124,10 +126,8 @@
> DROP DATABASE IF EXISTS db1;
> DROP DATABASE IF EXISTS db2;
>
> -
> -# This test is for the default online backup driver
> -# The test is designed to show that a consistent snapshot
> -# backup can be taken while data is being inserted and deleted.
> +#
> +# This test is for the default and snapshot online backup drivers
> #
>
> connection backup;
> @@ -161,9 +161,9 @@
> PRIMARY KEY (`a`)
> ) ENGINE=myisam DEFAULT CHARSET=latin1;
>
> -CREATE TABLE bup_default.t1 (a int) engine=myisam;
> +CREATE TABLE bup_default.t1 (a int) engine=innodb;
> CREATE TABLE bup_default.t2 (a int) engine=myisam;
> -CREATE TABLE bup_default.t1_blob (a int, b text);
> +CREATE TABLE bup_default.t1_blob (a int, b text) engine=innodb;
>
> # Insert some data.
>
> --- New file ---
> +++ mysql-test/t/backup_snapshot.opt 07/06/28 14:17:21
> --loose-debug=d,SLEEP_SNAPSHOT
>
> --- New file ---
> +++ mysql-test/t/backup_snapshot.test 07/06/28 14:17:22
> #
> # This test is for the consistent snapshot online backup driver
> # The test is designed to show that a consistent snapshot
> # backup can be taken while data is being inserted and deleted.
> #
> # TODO
> # - Make the test run the insert statements in parallel with the backup
> # command using --send and --reap and signals from backup code.
> #
>
> --source include/have_innodb.inc
> --source include/have_debug.inc
>
> --disable_warnings
> DROP DATABASE IF EXISTS bup_snapshot;
> --enable_warnings
>
> CREATE DATABASE bup_snapshot;
>
> connect (con1,localhost,root,,);
> connect (con2,localhost,root,,);
>
> connection con1;
>
> # Create a table and load it with lots of data.
>
> CREATE TABLE bup_snapshot.t1 (word CHAR(20)) ENGINE=INNODB;
>
> INSERT INTO bup_snapshot.t1 VALUES ("01 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("02 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("03 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("04 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("05 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("06 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("07 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("08 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("09 Some data to test");
> INSERT INTO bup_snapshot.t1 VALUES ("10 Some data to test");
>
> --echo con1: Show that the new data doesn't exist before backup.
> SELECT * FROM bup_snapshot.t1 WHERE word LIKE '-%';
> SELECT COUNT(*) FROM bup_snapshot.t1;
>
> # While a consistent snapshot backup is executed,
> # no external inserts should be visible to the transaction.
>
> --echo con1: Backing up database.
> BACKUP DATABASE bup_snapshot TO "bup_snapshot.bak";
>
> connection con2;
>
> --echo con2: Inserting new data.
> INSERT INTO bup_snapshot.t1 VALUES("- Dave Mathews");
> INSERT INTO bup_snapshot.t1 VALUES("- Yes");
> INSERT INTO bup_snapshot.t1 VALUES("- Jethro Tull");
> DELETE FROM bup_snapshot.t1 WHERE word LIKE '10%';
>
> --echo con2: Showing the data after inserts.
> SELECT * FROM bup_snapshot.t1 WHERE word LIKE '-%';
> SELECT COUNT(*) FROM bup_snapshot.t1;
>
> connection con1;
>
> # Now restore the database and then check to make sure the new rows
> # were not backed up.
>
> --echo con1: Dropping the database
> DROP TABLE bup_snapshot.t1;
>
> --echo con1: Restoring the database
> RESTORE FROM "bup_snapshot.bak";
>
> --echo con1: Showing the data (no new data should be here).
> SELECT * FROM bup_snapshot.t1 WHERE word LIKE '-%';
> SELECT COUNT(*) FROM bup_snapshot.t1;
>
> --disable_warnings
> DROP DATABASE IF EXISTS bup_snapshot;
> --enable_warnings
>
> --exec rm $MYSQLTEST_VARDIR/master-data/bup_snapshot.bak
>
>
>
> --- New file ---
> +++ sql/backup/be_snapshot.cc 07/06/28 14:17:20
> /* Copyright (C) 2004-2007 MySQL AB
>
> This program is free software; you can redistribute it and/or modify
> it under the terms of the GNU General Public License as published by
> the Free Software Foundation; version 2 of the License.
>
> This program is distributed in the hope that it will be useful,
> but WITHOUT ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> GNU General Public License for more details.
>
> You should have received a copy of the GNU General Public License
> along with this program; if not, write to the Free Software
> Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> */
>
> /**
> * @file
> *
> * @brief Contains the snapshot backup algorithm driver.
> *
> * This file contains the snapshot backup algorithm (also called a "driver"
> * in the online backup terminology. The snapshot backup algorithm may be
> * used in place of an engine-specific driver if one does not exist or if
> * chosen by the user.
> *
> * The snapshot backup algorithm is a non-blocking algorithm that enables a
> * consistent read of the tables given at the start of the backup/restore
> * process. This is accomplished by using a consistent snapshot transaction
> * and table locks. Once all of the data is backed up or restored, the locks
> * are removed. The snapshot backup is a row-level backup and therefore does
> * not backup the indexes or any of the engine-specific files.
> *
> * The classes in this file use the namespace "snapshot_backup" to distinguish
> * these classes from other backup drivers. The backup functionality is
> * contained in the backup class shown below. Similarly, the restore
> * functionality is contained in the restore class below.
> *
> * The format of the backup is the same as the default backup driver.
> * Please see <code> be_default.cc </code> for a complete description.
> */
>
> #include "mysql_priv.h"
> #include "backup_engine.h"
> #include "be_snapshot.h"
> #include "backup_aux.h"
>
> namespace snapshot_backup {
>
> using backup::byte;
> using backup::result_t;
> using backup::version_t;
> using backup::Table_list;
> using backup::Table_ref;
> using backup::Buffer;
> using namespace backup;
>
> /**
> * Create a snapshot backup backup driver.
> *
> * Given a list of tables to be backed-up, create instance of backup
> * driver which will create backup image of these tables.
> *
> * @param tables (in) list of tables to be backed-up.
> * @param eng (out) pointer to backup driver instance.
> *
> * @retval Error code or backup::OK on success.
> */
> result_t Engine::get_backup(const uint32, const Table_list &tables,
> Backup_driver*
> &drv)
> {
> DBUG_ENTER("Engine::get_backup");
> Backup *ptr= new snapshot_backup::Backup(tables, m_thd);
> if (!ptr)
> DBUG_RETURN(ERROR);
> drv= (backup::Backup_driver *)ptr;
> DBUG_RETURN(OK);
> }
>
> /**
> * @brief End backup process.
> *
> * This method unlocks all of the tables.
> *
> * @retval backup::OK all tables unlocked.
> */
> result_t Backup::end()
> {
> DBUG_ENTER("Snapshot_backup::end");
> end_active_trans(m_thd);
> DBUG_RETURN(OK);
> }
>
> result_t Backup::prelock()
> {
> DBUG_ENTER("Snapshot_backup::prelock()");
> if (all_tables)
> for (TABLE_LIST *tbl= all_tables; tbl != NULL; tbl= tbl->next_global)
> tbl->lock_type= TL_READ;
> DBUG_RETURN(READY);
> }
>
> result_t Backup::lock()
> {
> DBUG_ENTER("Snapshot_backup::lock()");
> /*
> We must fool the locking code to think this is a select because
> any other command type places the engine in a non-consistent read
> state.
> */
> m_thd->lex->sql_command= SQLCOM_SELECT;
> m_thd->lex->start_transaction_opt|=
> MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT;
> int res= begin_trans(m_thd);
> if (res)
> DBUG_RETURN(ERROR);
> lock_called= TRUE;
> DBUG_RETURN(OK);
> }
>
> result_t Backup::unlock()
> {
> DBUG_ENTER("Snapshot_backup::unlock()");
> DBUG_RETURN(OK);
> }
>
> /**
> * Create a snapshot backup restore driver.
> *
> * Given a list of tables to be restored, create instance of restore
> * driver which will restore these tables from a backup image.
> *
> * @param version (in) version of the backup image.
> * @param tables (in) list of tables to be restored.
> * @param eng (out) pointer to restore driver instance.
> *
> * @retval Error code or backup::OK on success.
> */
> result_t Engine::get_restore(version_t ver, const uint32, const Table_list
> &tables,
> Restore_driver* &drv)
> {
> DBUG_ENTER("Engine::get_restore");
> Restore *ptr= new snapshot_backup::Restore(tables, m_thd);
> if (!ptr)
> DBUG_RETURN(ERROR);
> drv= ptr;
> DBUG_RETURN(OK);
> }
>
> } /* snapshot_backup namespace */
>
>
>
> --- New file ---
> +++ sql/backup/be_snapshot.h 07/06/28 14:17:21
> #ifndef _SNAPSHOT_BACKUP_H
> #define _SNAPSHOT_BACKUP_H
>
> #include "archive.h"
> #include "buffer_iterator.h"
> #include "be_default.h"
>
> namespace snapshot_backup {
>
> using backup::byte;
> using backup::result_t;
> using backup::version_t;
> using backup::Table_list;
> using backup::Table_ref;
> using backup::Buffer;
>
> /**
> * @class Engine
> *
> * @brief Encapsulates snapshot online backup/restore functionality.
> *
> * This class is used to initiate the snapshot backup algorithm, which is used
> * by the backup kernel to create a backup image of data stored in any
> * engine that does not have a native backup driver but supports consisten reads.
> * It may also be used as an option by the user.
> *
> * Using this class, the caller can create an instance of the snapshot backup
> * backup and restore class. The backup class is used to backup data for a
> * list of tables. The restore class is used to restore data from a
> * previously created snapshot backup image.
> */
> class Engine: public Backup_engine
> {
> public:
> Engine(THD *t_thd) { m_thd= t_thd; }
>
> /// Return version of backup images created by this engine.
> const version_t version() const { return 0; };
> result_t get_backup(const uint32, const Table_list &tables, Backup_driver*
> &drv);
> result_t get_restore(version_t ver, const uint32, const Table_list &tables,
> Restore_driver* &drv);
> private:
> THD *m_thd; ///< Pointer to the current thread.
> };
>
> /**
> * @class Backup
> *
> * @brief Contains the snapshot backup algorithm backup functionality.
> *
> * The backup class is a row-level backup mechanism designed to perform
> * a table scan on each table reading the rows and saving the data to the
> * buffer from the backup algorithm using a consistent read transaction.
> *
> * @see <backup driver>
> */
> class Backup: public default_backup::Backup
> {
> public:
> Backup(const Table_list &tables, THD *t_thd):
> default_backup::Backup(tables, t_thd)
> { lock_called= FALSE; /* lock has not been called */ };
> virtual ~Backup(){};
> result_t begin(const size_t) { return backup::OK; };
> result_t end();
> result_t prelock();
> result_t lock();
> result_t unlock();
> };
>
> /**
> * @class Restore
> *
> * @brief Contains the snapshot backup algorithm restore functionality.
> *
> * The restore class is a row-level backup mechanism designed to restore
> * data for each table by writing the data for the rows from the
> * buffer given by the backup algorithm.
> *
> * @see <restore driver>
> */
> class Restore: public default_backup::Restore
> {
> public:
> Restore(const Table_list &tables, THD *t_thd):
> default_backup::Restore(tables, t_thd){};
> virtual ~Restore(){};
> void free() { delete this; };
> };
> } // snapshot_backup namespace
>
>
> /*********************************************************************
>
> Snapshot image class
>
> *********************************************************************/
>
> namespace backup {
>
>
> class Snapshot_image: public Image_info
> {
> public:
>
> Snapshot_image(Archive_info &info): Image_info(info)
> { ver= 1; }
>
> image_type type() const
> { return SNAPSHOT_IMAGE; }
>
> const char* name() const
> { return "Snapshot"; }
>
> bool accept(const Table_ref&, const ::handlerton* h)
> {
> return (h->start_consistent_snapshot != NULL);
> }; // accept all tables that support consistent read
>
> result_t get_backup_driver(Backup_driver* &ptr)
> { return (ptr= new snapshot_backup::Backup(tables,::current_thd)) ? OK : ERROR; }
>
> result_t get_restore_driver(Restore_driver* &ptr)
> { return (ptr= new snapshot_backup::Restore(tables,::current_thd)) ? OK : ERROR; }
>
> result_t do_write_description(OStream&)
> { return OK; } // nothing to write
>
> static result_t
> create_from_stream(version_t, Archive_info &info, IStream&,
> Image_info* &ptr)
> {
> return (ptr= new Snapshot_image(info)) ? OK : ERROR;
> }
>
> bool is_valid(){ return TRUE; };
>
> };
>
> } // backup namespace
>
>
> #endif
>
>
>
> --- 1.5/sql/backup/Makefile.am 2007-06-28 14:17:33 -04:00
> +++ 1.6/sql/backup/Makefile.am 2007-06-28 14:17:33 -04:00
> @@ -32,6 +32,7 @@
> data_backup.cc \
> sql_backup.cc \
> be_default.cc \
> + be_snapshot.cc \
> buffer_iterator.cc
>
> noinst_HEADERS = \
> @@ -46,6 +47,7 @@
> archive.h \
> meta_backup.h \
> be_default.h \
> + be_snapshot.h \
> buffer_iterator.h
>
> DEFS = \
>
> --- 1.4/sql/backup/archive.cc 2007-06-28 14:17:33 -04:00
> +++ 1.5/sql/backup/archive.cc 2007-06-28 14:17:33 -04:00
> @@ -25,6 +25,7 @@
> #include "backup_aux.h"
> #include "archive.h"
> #include "be_default.h"
> +#include "be_snapshot.h"
>
> /***************************************
>
> @@ -354,6 +355,9 @@
>
> case DEFAULT_IMAGE:
> return Default_image::create_from_stream(ver,info,s,ptr);
> +
> + case SNAPSHOT_IMAGE:
> + return Snapshot_image::create_from_stream(ver,info,s,ptr);
>
> default:
> DBUG_PRINT("restore",("Unknown image type %d",t));
>
> --- 1.3/sql/backup/archive.h 2007-06-28 14:17:33 -04:00
> +++ 1.4/sql/backup/archive.h 2007-06-28 14:17:33 -04:00
> @@ -116,7 +116,7 @@
> {
> public:
>
> - enum image_type {NATIVE_IMAGE, DEFAULT_IMAGE};
> + enum image_type {NATIVE_IMAGE, DEFAULT_IMAGE, SNAPSHOT_IMAGE};
>
> virtual image_type type() const =0; ///< Return type of the image.
> version_t ver; ///< Image format version.
>
> --- 1.2/sql/backup/backup_kernel.h 2007-06-28 14:17:33 -04:00
> +++ 1.3/sql/backup/backup_kernel.h 2007-06-28 14:17:33 -04:00
> @@ -150,6 +150,7 @@
> int find_image(const Table_ref&);
>
> int default_image_no; ///< Position of the default image in @c images list, -1
> if not used.
> + int snapshot_image_no; ///< Position of the snapshot image in @c images list,
> -1 if not used.
>
> Db_item* add_db(const backup::Db_ref&);
> Table_item* add_table(Db_item&, const Table_ref&);
>
> --- 1.5/sql/backup/data_backup.cc 2007-06-28 14:17:33 -04:00
> +++ 1.6/sql/backup/data_backup.cc 2007-06-28 14:17:33 -04:00
> @@ -40,6 +40,7 @@
> #include "backup_kernel.h"
> #include "debug.h"
> #include "be_default.h"
> +#include "be_snapshot.h"
>
> /***********************************************
>
> @@ -337,6 +338,7 @@
> table_list_last= table_list;
> while (table_list_last->next_global != NULL)
> table_list_last= table_list_last->next_global;
> + *tables_last= table_list_last;
> }
> else
> if (backup_drv)
> @@ -409,7 +411,8 @@
> inactive.push_back(p);
> }
> if (!def_or_snap_used)
> - def_or_snap_used= (i->type() == Image_info::DEFAULT_IMAGE);
> + def_or_snap_used= ((i->type() == Image_info::DEFAULT_IMAGE) ||
> + (i->type() == Image_info::SNAPSHOT_IMAGE));
> if (def_or_snap_used)
> get_default_snapshot_tables(&p->drv(), NULL,
> &table_list, &table_list_last);
> @@ -1285,7 +1288,8 @@
> Collect tables from default and snapshot for open and lock tables.
> There should be at most only 1 of each driver.
> */
> - if (img->type() == Image_info::DEFAULT_IMAGE)
> + if ((img->type() == Image_info::DEFAULT_IMAGE) ||
> + (img->type() == Image_info::SNAPSHOT_IMAGE))
> get_default_snapshot_tables(NULL, (default_backup::Restore *)drv[no],
> &table_list, &table_list_last);
> }
>
> --- 1.4/sql/backup/sql_backup.cc 2007-06-28 14:17:33 -04:00
> +++ 1.5/sql/backup/sql_backup.cc 2007-06-28 14:17:33 -04:00
> @@ -29,6 +29,7 @@
> #include "archive.h"
> #include "debug.h"
> #include "be_default.h"
> +#include "be_snapshot.h"
>
> namespace backup {
>
> @@ -353,7 +354,9 @@
> 3. Otherwise check if one of the existing sub-images would accept table from
> this location.
>
> - 4. When everything else fails, use default (blocking) backup driver.
> + 4. If table has no native backup engine, try a consistent snapshot one.
> +
> + 5. When everything else fails, use default (blocking) backup driver.
>
> Note: 1 is not implemented yet and hence we start with 3.
> */
> @@ -381,6 +384,9 @@
> if (default_image_no >= 0 && no == (uint)default_image_no)
> continue;
>
> + if (snapshot_image_no >= 0 && no == (uint)snapshot_image_no)
> + continue;
> +
> img= images[no];
>
> // An image object decides if it can handle given table or not
> @@ -415,9 +421,23 @@
> DBUG_RETURN(no);
> }
>
> - // Points 4: try default driver...
> + // Points 4 & 5: try consistent snapshot and default drivers..
>
> - int ino= default_image_no; //now try default driver
> + // try snapshot driver first
> + int ino= snapshot_image_no;
> + if (hton->start_consistent_snapshot != NULL)
> + {
> + if (snapshot_image_no < 0) //image doesn't exist
> + {
> + ino= img_count;
> + snapshot_image_no= img_count;
> + images[snapshot_image_no]= new Snapshot_image(*this);
> + img_count++;
> + DBUG_PRINT("backup",("Snapshot image added to archive"));
> + }
> + }
> + else
> + ino= default_image_no; //now try default driver
>
> if (ino < 0) //image doesn't exist
> {
> @@ -462,8 +482,8 @@
> closed when the structure is closed with the @c close() method.
> */
> Backup_info::Backup_info(THD *thd):
> - default_image_no(-1), m_thd(thd), i_s_tables(NULL), m_state(INIT),
> - m_items(NULL), m_last_item(NULL), m_last_db(NULL)
> + default_image_no(-1), snapshot_image_no(-2), m_thd(thd), i_s_tables(NULL),
> + m_state(INIT), m_items(NULL), m_last_item(NULL), m_last_db(NULL)
> {
> i_s_tables= get_schema_table(m_thd, ::get_schema_table(SCH_TABLES));
> if (!i_s_tables)
>
> --- 1.43/sql/CMakeLists.txt 2007-06-28 14:17:33 -04:00
> +++ 1.44/sql/CMakeLists.txt 2007-06-28 14:17:33 -04:00
> @@ -77,6 +77,7 @@
> backup/stream.cc backup/logger.cc backup/string_pool.cc
> backup/archive.cc backup/meta_backup.cc backup/data_backup.cc
> backup/sql_backup.cc backup/be_default.cc backup/buffer_iterator.cc
> + backup/be_snapshot.cc
> ${PROJECT_SOURCE_DIR}/sql/sql_yacc.cc
> ${PROJECT_SOURCE_DIR}/sql/sql_yacc.h
> ${PROJECT_SOURCE_DIR}/include/mysqld_error.h
>
>