From: Jon Olav Hauglid Date: March 2 2011 5:08pm Subject: bzr commit into mysql-5.5 branch (jon.hauglid:3364) Bug#11755431 List-Archive: http://lists.mysql.com/commits/132296 X-Bug: 11755431 Message-Id: <201103021750.p22HortG001695@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============8576470831892513237==" --===============8576470831892513237== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/x/mysql-5.5-bug11755431/ based on revid:vinay.fisrekar@stripped 3364 Jon Olav Hauglid 2011-03-02 Bug #11755431 (former 47205) MAP 'REPAIR TABLE' TO RECREATE +ANALYZE FOR ENGINES NOT SUPPORTING NATIVE REPAIR Executing 'mysqlcheck --check-upgrade --auto-repair ...' will first issue 'CHECK TABLE FOR UPGRADE' for all tables in the database in order to check if the tables are compatible with the current version of MySQL. Any tables that are found incompatible are then upgraded using 'REPAIR TABLE'. The problem was that some engines (e.g. InnoDB) does not support 'REPAIR TABLE'. This caused any such tables to be left incompatible. As a result such tables were not properly fixed by the mysql_upgrade tool. This patch fixes the problem by first changing 'CHECK TABLE FOR UPGRADE' to return a different error message if the engine does not support REPAIR. Instead of "Table upgrade required. Please do "REPAIR TABLE ..." it will report "Table rebuild required. Please do "ALTER TABLE ... FORCE ..." Second, the patch changes mysqlcheck to do 'ALTER TABLE ... FORCE' instead of 'REPAIR TABLE' in these cases. Test case added to mysqlcheck.test @ client/mysqlcheck.c Changed mysqlcheck to do 'ALTER TABLE ... FORCE' if 'CHECK TABLE FOR UPGRADE' reports ER_TABLE_NEEDS_REBUILD and not ER_TABLE_NEEDS_UPGRADE. @ mysql-test/r/mysqlcheck.result Added regression test. @ mysql-test/std_data/bug47205.frm InnoDB 5.0 FRM which contains a varchar primary key using utf8_general_ci. This is an incompatible FRM for 5.5. @ mysql-test/t/mysqlcheck.test Added regression test. @ sql/handler.h Added new HA_CAN_REPAIR flag. @ sql/share/errmsg-utf8.txt Added new error message ER_TABLE_NEEDS_REBUILD @ sql/sql_admin.cc Changed 'CHECK TABLE FOR UPDATE' to give ER_TABLE_NEEDS_REBUILD instead of ER_TABLE_NEEDS_UPGRADE if the engine does not support REPAIR (as indicated by the new HA_CAN_REPAIR flag). @ sql/sql_lex.h Remove unused ALTER_FORCE flag. @ sql/sql_yacc.yy Make sure ALTER TABLE ... FORCE recreates the table by setting the ALTER_RECREATE flag as the ALTER_FORCE flag was unused. @ storage/archive/ha_archive.h Added new HA_CAN_REPAIR flag to Archive @ storage/csv/ha_tina.h Added new HA_CAN_REPAIR flag to CSV @ storage/federated/ha_federated.h Added new HA_CAN_REPAIR flag to Federated @ storage/myisam/ha_myisam.cc Added new HA_CAN_REPAIR flag to MyISAM added: mysql-test/std_data/bug47205.frm modified: client/mysqlcheck.c mysql-test/r/mysqlcheck.result mysql-test/t/mysqlcheck.test sql/handler.cc sql/handler.h sql/share/errmsg-utf8.txt sql/sql_admin.cc sql/sql_lex.h sql/sql_yacc.yy storage/archive/ha_archive.h storage/csv/ha_tina.h storage/federated/ha_federated.h storage/myisam/ha_myisam.cc === modified file 'client/mysqlcheck.c' --- a/client/mysqlcheck.c 2011-01-16 03:59:05 +0000 +++ b/client/mysqlcheck.c 2011-03-02 17:06:19 +0000 @@ -42,7 +42,7 @@ static char *opt_password = 0, *current_ *default_charset= 0, *current_host= 0; static char *opt_plugin_dir= 0, *opt_default_auth= 0; static int first_error = 0; -DYNAMIC_ARRAY tables4repair; +DYNAMIC_ARRAY tables4repair, tables4rebuild; #ifdef HAVE_SMEM static char *shared_memory_base_name=0; #endif @@ -626,6 +626,28 @@ static int fix_database_storage_name(con return rc; } +static int rebuild_table(char *name) +{ + char *query, *ptr; + int rc= 0; + if (!(query =(char *) my_malloc((sizeof(char)*(fixed_name_length(name)+20)), + MYF(MY_WME)))) + return 1; + ptr= strmov(query, "ALTER TABLE "); + ptr= fix_table_name(ptr, name); + ptr= strxmov(ptr, " FORCE", NullS); + if (mysql_real_query(sock, query, (uint)(ptr - query))) + { + fprintf(stderr, "Failed to %s\n", query); + fprintf(stderr, "Error: %s\n", mysql_error(sock)); + rc= 1; + } + if (verbose) + printf("%-50s %s\n", name, rc ? "FAILED" : "OK"); + my_free(query); + return rc; +} + static int process_one_db(char *database) { if (what_to_do == DO_UPGRADE) @@ -739,7 +761,7 @@ static void print_result() MYSQL_ROW row; char prev[NAME_LEN*2+2]; uint i; - my_bool found_error=0; + my_bool found_error=0, table_rebuild=0; res = mysql_use_result(sock); @@ -758,8 +780,14 @@ static void print_result() */ if (found_error && opt_auto_repair && what_to_do != DO_REPAIR && strcmp(row[3],"OK")) - insert_dynamic(&tables4repair, (uchar*) prev); + { + if (table_rebuild) + insert_dynamic(&tables4rebuild, (uchar*) prev); + else + insert_dynamic(&tables4repair, (uchar*) prev); + } found_error=0; + table_rebuild=0; if (opt_silent) continue; } @@ -770,6 +798,8 @@ static void print_result() printf("%s\n%-9s: %s", row[0], row[2], row[3]); if (strcmp(row[2],"note")) found_error=1; + if (opt_auto_repair && strstr(row[3], "ALTER TABLE") != NULL) + table_rebuild=1; } else printf("%-9s: %s", row[2], row[3]); @@ -778,7 +808,12 @@ static void print_result() } /* add the last table to be repaired to the list */ if (found_error && opt_auto_repair && what_to_do != DO_REPAIR) - insert_dynamic(&tables4repair, (uchar*) prev); + { + if (table_rebuild) + insert_dynamic(&tables4rebuild, (uchar*) prev); + else + insert_dynamic(&tables4repair, (uchar*) prev); + } mysql_free_result(res); } @@ -876,7 +911,8 @@ int main(int argc, char **argv) } if (opt_auto_repair && - my_init_dynamic_array(&tables4repair, sizeof(char)*(NAME_LEN*2+2),16,64)) + (my_init_dynamic_array(&tables4repair, sizeof(char)*(NAME_LEN*2+2),16,64) || + my_init_dynamic_array(&tables4rebuild, sizeof(char)*(NAME_LEN*2+2),16,64))) { first_error = 1; goto end; @@ -894,7 +930,7 @@ int main(int argc, char **argv) { uint i; - if (!opt_silent && tables4repair.elements) + if (!opt_silent && (tables4repair.elements || tables4rebuild.elements)) puts("\nRepairing tables"); what_to_do = DO_REPAIR; for (i = 0; i < tables4repair.elements ; i++) @@ -902,11 +938,16 @@ int main(int argc, char **argv) char *name= (char*) dynamic_array_ptr(&tables4repair, i); handle_request_for_tables(name, fixed_name_length(name)); } + for (i = 0; i < tables4rebuild.elements ; i++) + rebuild_table((char*) dynamic_array_ptr(&tables4rebuild, i)); } end: dbDisconnect(current_host); if (opt_auto_repair) + { delete_dynamic(&tables4repair); + delete_dynamic(&tables4rebuild); + } my_free(opt_password); #ifdef HAVE_SMEM my_free(shared_memory_base_name); === modified file 'mysql-test/r/mysqlcheck.result' --- a/mysql-test/r/mysqlcheck.result 2010-12-17 11:11:34 +0000 +++ b/mysql-test/r/mysqlcheck.result 2011-03-02 17:06:19 +0000 @@ -260,3 +260,62 @@ End of 5.1 tests # # Bug #35269: mysqlcheck behaves different depending on order of parameters # +# +# Bug#11755431 47205: MAP 'REPAIR TABLE' TO RECREATE +ANALYZE FOR +# ENGINES NOT SUPPORTING NATIVE +# +DROP TABLE IF EXISTS bug47205; +# +# Test 1: Check that ALTER TABLE ... upgrades the table +CREATE TABLE bug47205(a VARCHAR(20) PRIMARY KEY) +DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci engine=innodb; +FLUSH TABLE bug47205; +# Replace the FRM with a 5.0 FRM that will require upgrade +# Should indicate that ALTER TABLE ... FORCE is needed +CHECK TABLE bug47205 FOR UPGRADE; +Table Op Msg_type Msg_text +test.bug47205 check error Table rebuild required. Please do "ALTER TABLE `bug47205` FORCE" or dump/reload to fix it! +ALTER TABLE bug47205 FORCE; +# Table should now be ok +CHECK TABLE bug47205 FOR UPGRADE; +Table Op Msg_type Msg_text +test.bug47205 check status OK +DROP TABLE bug47205; +# +# Test 2: InnoDB - REPAIR not supported +CREATE TABLE bug47205(a VARCHAR(20) PRIMARY KEY) +DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci engine=innodb; +FLUSH TABLE bug47205; +# Replace the FRM with a 5.0 FRM that will require upgrade +# Should indicate that ALTER TABLE .. FORCE is needed +CHECK TABLE bug47205 FOR UPGRADE; +Table Op Msg_type Msg_text +test.bug47205 check error Table rebuild required. Please do "ALTER TABLE `bug47205` FORCE" or dump/reload to fix it! +# Running mysqlcheck to check and upgrade +test.bug47205 +error : Table rebuild required. Please do "ALTER TABLE `bug47205` FORCE" or dump/reload to fix it! + +Repairing tables +# Table should now be ok +CHECK TABLE bug47205 FOR UPGRADE; +Table Op Msg_type Msg_text +test.bug47205 check status OK +DROP TABLE bug47205; +# +# Test 3: MyISAM - REPAIR supported +# Replace old FRM that will require upgrade +# Should indicate that REPAIR TABLE is needed +CHECK TABLE bug47205 FOR UPGRADE; +Table Op Msg_type Msg_text +test.bug47205 check error Table upgrade required. Please do "REPAIR TABLE `bug47205`" or dump/reload to fix it! +# Running mysqlcheck to check and upgrade +test.bug47205 +error : Table upgrade required. Please do "REPAIR TABLE `bug47205`" or dump/reload to fix it! + +Repairing tables +test.bug47205 OK +# Table should now be ok +CHECK TABLE bug47205 FOR UPGRADE; +Table Op Msg_type Msg_text +test.bug47205 check status OK +DROP TABLE bug47205; === added file 'mysql-test/std_data/bug47205.frm' Binary files a/mysql-test/std_data/bug47205.frm 1970-01-01 00:00:00 +0000 and b/mysql-test/std_data/bug47205.frm 2011-03-02 17:06:19 +0000 differ === modified file 'mysql-test/t/mysqlcheck.test' --- a/mysql-test/t/mysqlcheck.test 2010-10-08 07:09:47 +0000 +++ b/mysql-test/t/mysqlcheck.test 2011-03-02 17:06:19 +0000 @@ -229,3 +229,78 @@ drop table `t1-1`; --error 1 --exec $MYSQL_CHECK -aoc test "#mysql50#t1-1" + +--echo # +--echo # Bug#11755431 47205: MAP 'REPAIR TABLE' TO RECREATE +ANALYZE FOR +--echo # ENGINES NOT SUPPORTING NATIVE +--echo # + +--disable_warnings +DROP TABLE IF EXISTS bug47205; +--enable_warnings + +--echo # +--echo # Test 1: Check that ALTER TABLE ... upgrades the table + +CREATE TABLE bug47205(a VARCHAR(20) PRIMARY KEY) + DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci engine=innodb; + +FLUSH TABLE bug47205; + +--echo # Replace the FRM with a 5.0 FRM that will require upgrade +let $MYSQLD_DATADIR= `select @@datadir`; +--remove_file $MYSQLD_DATADIR/test/bug47205.frm +--copy_file std_data/bug47205.frm $MYSQLD_DATADIR/test/bug47205.frm + +--echo # Should indicate that ALTER TABLE ... FORCE is needed +CHECK TABLE bug47205 FOR UPGRADE; + +ALTER TABLE bug47205 FORCE; + +--echo # Table should now be ok +CHECK TABLE bug47205 FOR UPGRADE; + +DROP TABLE bug47205; + +--echo # +--echo # Test 2: InnoDB - REPAIR not supported + +CREATE TABLE bug47205(a VARCHAR(20) PRIMARY KEY) + DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci engine=innodb; + +FLUSH TABLE bug47205; + +--echo # Replace the FRM with a 5.0 FRM that will require upgrade +let $MYSQLD_DATADIR= `select @@datadir`; +--remove_file $MYSQLD_DATADIR/test/bug47205.frm +--copy_file std_data/bug47205.frm $MYSQLD_DATADIR/test/bug47205.frm + +--echo # Should indicate that ALTER TABLE .. FORCE is needed +CHECK TABLE bug47205 FOR UPGRADE; + +--echo # Running mysqlcheck to check and upgrade +--exec $MYSQL_CHECK --check-upgrade --auto-repair test + +--echo # Table should now be ok +CHECK TABLE bug47205 FOR UPGRADE; + +DROP TABLE bug47205; + +--echo # +--echo # Test 3: MyISAM - REPAIR supported + +--echo # Replace old FRM that will require upgrade +--copy_file std_data/bug36055.frm $MYSQLD_DATADIR/test/bug47205.frm +--copy_file std_data/bug36055.MYD $MYSQLD_DATADIR/test/bug47205.MYD +--copy_file std_data/bug36055.MYI $MYSQLD_DATADIR/test/bug47205.MYI + +--echo # Should indicate that REPAIR TABLE is needed +CHECK TABLE bug47205 FOR UPGRADE; + +--echo # Running mysqlcheck to check and upgrade +--exec $MYSQL_CHECK --check-upgrade --auto-repair test + +--echo # Table should now be ok +CHECK TABLE bug47205 FOR UPGRADE; + +DROP TABLE bug47205; === modified file 'sql/handler.cc' --- a/sql/handler.cc 2011-03-01 14:42:37 +0000 +++ b/sql/handler.cc 2011-03-02 17:06:19 +0000 @@ -3214,9 +3214,13 @@ int handler::ha_repair(THD* thd, HA_CHEC mark_trx_read_write(); - if ((result= repair(thd, check_opt))) - return result; - return update_frm_version(table); + result= repair(thd, check_opt); + DBUG_ASSERT(result == HA_ADMIN_NOT_IMPLEMENTED || + ha_table_flags() & HA_CAN_REPAIR); + + if (result == HA_ADMIN_OK) + result= update_frm_version(table); + return result; } === modified file 'sql/handler.h' --- a/sql/handler.h 2011-01-26 13:23:29 +0000 +++ b/sql/handler.h 2011-03-02 17:06:19 +0000 @@ -153,6 +153,12 @@ ordered. */ #define HA_DUPLICATE_KEY_NOT_IN_ORDER (LL(1) << 36) +/* + Engine supports REPAIR TABLE. Used by CHECK TABLE FOR UPGRADE if an + incompatible table is detected. If this flag is set, CHECK TABLE FOR UPGRADE + will report ER_TABLE_NEEDS_UPGRADE, otherwise ER_TABLE_NEED_REBUILD. +*/ +#define HA_CAN_REPAIR (LL(1) << 37) /* Set of all binlog flags. Currently only contain the capabilities @@ -2010,7 +2016,10 @@ private: upon the table. */ virtual int repair(THD* thd, HA_CHECK_OPT* check_opt) - { return HA_ADMIN_NOT_IMPLEMENTED; } + { + DBUG_ASSERT(!(ha_table_flags() & HA_CAN_REPAIR)); + return HA_ADMIN_NOT_IMPLEMENTED; + } virtual void start_bulk_insert(ha_rows rows) {} virtual int end_bulk_insert() { return 0; } virtual int index_read(uchar * buf, const uchar * key, uint key_len, === modified file 'sql/share/errmsg-utf8.txt' --- a/sql/share/errmsg-utf8.txt 2011-02-21 15:49:03 +0000 +++ b/sql/share/errmsg-utf8.txt 2011-03-02 17:06:19 +0000 @@ -6397,3 +6397,8 @@ ER_STMT_CACHE_FULL ER_MULTI_UPDATE_KEY_CONFLICT eng "Primary key/partition key update is not allowed since the table is updated both as '%-.192s' and '%-.192s'." + +# When translating this error mesage make sure to include "ALTER TABLE" in the +# message as mysqlcheck parses the error message looking for ALTER TABLE. +ER_TABLE_NEEDS_REBUILD + eng "Table rebuild required. Please do \"ALTER TABLE `%-.32s` FORCE\" or dump/reload to fix it!" === modified file 'sql/sql_admin.cc' --- a/sql/sql_admin.cc 2011-01-10 13:12:23 +0000 +++ b/sql/sql_admin.cc 2011-03-02 17:06:19 +0000 @@ -771,8 +771,12 @@ send_result_message: size_t length; protocol->store(STRING_WITH_LEN("error"), system_charset_info); - length=my_snprintf(buf, sizeof(buf), ER(ER_TABLE_NEEDS_UPGRADE), - table->table_name); + if (table->table->file->ha_table_flags() & HA_CAN_REPAIR) + length= my_snprintf(buf, sizeof(buf), ER(ER_TABLE_NEEDS_UPGRADE), + table->table_name); + else + length= my_snprintf(buf, sizeof(buf), ER(ER_TABLE_NEEDS_REBUILD), + table->table_name); protocol->store(buf, length, system_charset_info); fatal_error=1; break; === modified file 'sql/sql_lex.h' --- a/sql/sql_lex.h 2011-03-01 14:42:37 +0000 +++ b/sql/sql_lex.h 2011-03-02 17:06:19 +0000 @@ -944,20 +944,19 @@ inline bool st_select_lex_unit::is_union #define ALTER_CHANGE_COLUMN_DEFAULT (1L << 8) #define ALTER_KEYS_ONOFF (1L << 9) #define ALTER_CONVERT (1L << 10) -#define ALTER_FORCE (1L << 11) -#define ALTER_RECREATE (1L << 12) -#define ALTER_ADD_PARTITION (1L << 13) -#define ALTER_DROP_PARTITION (1L << 14) -#define ALTER_COALESCE_PARTITION (1L << 15) -#define ALTER_REORGANIZE_PARTITION (1L << 16) -#define ALTER_PARTITION (1L << 17) -#define ALTER_ADMIN_PARTITION (1L << 18) -#define ALTER_TABLE_REORG (1L << 19) -#define ALTER_REBUILD_PARTITION (1L << 20) -#define ALTER_ALL_PARTITION (1L << 21) -#define ALTER_REMOVE_PARTITIONING (1L << 22) -#define ALTER_FOREIGN_KEY (1L << 23) -#define ALTER_TRUNCATE_PARTITION (1L << 24) +#define ALTER_RECREATE (1L << 11) +#define ALTER_ADD_PARTITION (1L << 12) +#define ALTER_DROP_PARTITION (1L << 13) +#define ALTER_COALESCE_PARTITION (1L << 14) +#define ALTER_REORGANIZE_PARTITION (1L << 15) +#define ALTER_PARTITION (1L << 16) +#define ALTER_ADMIN_PARTITION (1L << 17) +#define ALTER_TABLE_REORG (1L << 18) +#define ALTER_REBUILD_PARTITION (1L << 19) +#define ALTER_ALL_PARTITION (1L << 20) +#define ALTER_REMOVE_PARTITIONING (1L << 21) +#define ALTER_FOREIGN_KEY (1L << 22) +#define ALTER_TRUNCATE_PARTITION (1L << 23) enum enum_alter_table_change_level { === modified file 'sql/sql_yacc.yy' --- a/sql/sql_yacc.yy 2011-02-16 16:27:35 +0000 +++ b/sql/sql_yacc.yy 2011-03-02 17:06:19 +0000 @@ -6747,7 +6747,7 @@ alter_list_item: } | FORCE_SYM { - Lex->alter_info.flags|= ALTER_FORCE; + Lex->alter_info.flags|= ALTER_RECREATE; } | alter_order_clause { === modified file 'storage/archive/ha_archive.h' --- a/storage/archive/ha_archive.h 2010-10-06 14:34:28 +0000 +++ b/storage/archive/ha_archive.h 2011-03-02 17:06:19 +0000 @@ -90,7 +90,7 @@ public: return (HA_NO_TRANSACTIONS | HA_REC_NOT_IN_SEQ | HA_CAN_BIT_FIELD | HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE | HA_STATS_RECORDS_IS_EXACT | - HA_HAS_RECORDS | + HA_HAS_RECORDS | HA_CAN_REPAIR | HA_FILE_BASED | HA_CAN_INSERT_DELAYED | HA_CAN_GEOMETRY); } ulong index_flags(uint idx, uint part, bool all_parts) const === modified file 'storage/csv/ha_tina.h' --- a/storage/csv/ha_tina.h 2010-07-08 21:20:08 +0000 +++ b/storage/csv/ha_tina.h 2011-03-02 17:06:19 +0000 @@ -106,7 +106,8 @@ public: ulonglong table_flags() const { return (HA_NO_TRANSACTIONS | HA_REC_NOT_IN_SEQ | HA_NO_AUTO_INCREMENT | - HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE); + HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE | + HA_CAN_REPAIR); } ulong index_flags(uint idx, uint part, bool all_parts) const { === modified file 'storage/federated/ha_federated.h' --- a/storage/federated/ha_federated.h 2010-10-06 14:34:28 +0000 +++ b/storage/federated/ha_federated.h 2011-03-02 17:06:19 +0000 @@ -149,7 +149,8 @@ public: HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE | HA_NO_PREFIX_CHAR_KEYS | HA_PRIMARY_KEY_REQUIRED_FOR_DELETE | HA_NO_TRANSACTIONS /* until fixed by WL#2952 */ | - HA_PARTIAL_COLUMN_READ | HA_NULL_IN_KEY); + HA_PARTIAL_COLUMN_READ | HA_NULL_IN_KEY | + HA_CAN_REPAIR); } /* This is a bitmap of flags that says how the storage engine === modified file 'storage/myisam/ha_myisam.cc' --- a/storage/myisam/ha_myisam.cc 2011-01-11 09:07:37 +0000 +++ b/storage/myisam/ha_myisam.cc 2011-03-02 17:06:19 +0000 @@ -639,7 +639,7 @@ ha_myisam::ha_myisam(handlerton *hton, T HA_DUPLICATE_POS | HA_CAN_INDEX_BLOBS | HA_AUTO_PART_KEY | HA_FILE_BASED | HA_CAN_GEOMETRY | HA_NO_TRANSACTIONS | HA_CAN_INSERT_DELAYED | HA_CAN_BIT_FIELD | HA_CAN_RTREEKEYS | - HA_HAS_RECORDS | HA_STATS_RECORDS_IS_EXACT), + HA_HAS_RECORDS | HA_STATS_RECORDS_IS_EXACT | HA_CAN_REPAIR), can_enable_indexes(1) {} --===============8576470831892513237== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jon.hauglid@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jon.hauglid@stripped # target_branch: file:///export/home/x/mysql-5.5-bug11755431/ # testament_sha1: 0a11ec2fd32cd00177b9748e88e472e39fc59e7a # timestamp: 2011-03-02 18:08:50 +0100 # base_revision_id: vinay.fisrekar@stripped\ # tv3ricuvr263335p # # Begin bundle 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 --===============8576470831892513237==--