From: Andrei Elkin Date: December 7 2010 6:01pm Subject: bzr commit into mysql-next-mr-wl5569 branch (andrei.elkin:3232) List-Archive: http://lists.mysql.com/commits/126250 Message-Id: <201012071801.oB7I1ukM032505@mysql1000.dsl.inet.fi> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="__129174492015656567abhmt004" --__129174492015656567abhmt004 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/andrei/MySQL/BZR/2a-23May/WL/mysql-next-mr-wl5569/ based on revid:andrei.elkin@stripped 3232 Andrei Elkin 2010-12-07 [merge] manual merge with a piece of recovery support on repo. rpl_parallel hits an assert that Alfranio is fixing modified: mysql-test/suite/rpl/r/rpl_parallel.result mysql-test/suite/rpl/t/rpl_parallel-slave.opt mysql-test/suite/rpl/t/rpl_parallel.test sql/rpl_info_dummy.cc sql/rpl_info_dummy.h sql/rpl_info_factory.cc sql/rpl_info_file.cc sql/rpl_info_file.h sql/rpl_info_handler.h sql/rpl_info_table.cc sql/rpl_info_table.h sql/rpl_mi.cc sql/rpl_rli.cc sql/rpl_rli.h sql/rpl_rli_pdb.cc sql/rpl_rli_pdb.h sql/rpl_slave.cc sql/rpl_slave.h === modified file 'mysql-test/suite/rpl/r/rpl_parallel.result' --- a/mysql-test/suite/rpl/r/rpl_parallel.result 2010-12-07 17:35:16 +0000 +++ b/mysql-test/suite/rpl/r/rpl_parallel.result 2010-12-07 18:01:39 +0000 @@ -25,3 +25,9 @@ Comparing tables master:test2.tm_nk and Comparing tables master:test1.tm_nk and slave:test1.tm_nk Comparing tables master:test0.tm_nk and slave:test0.tm_nk set @@global.slave_parallel_workers= @save.slave_parallel_workers; +SELECT * FROM mysql.slave_worker_info; +Master_id Worker_id Partitions Relay_log_name Relay_log_pos Master_log_name Master_log_pos +2 0 1 test0 ./slave-relay-bin.000004 6452394 master-bin.000001 6452245 +2 1 1 test1 ./slave-relay-bin.000004 6451588 master-bin.000001 6451439 +2 2 1 test2 ./slave-relay-bin.000004 6450782 master-bin.000001 6450633 +2 3 1 test3 ./slave-relay-bin.000004 6449976 master-bin.000001 6449827 === modified file 'mysql-test/suite/rpl/t/rpl_parallel-slave.opt' --- a/mysql-test/suite/rpl/t/rpl_parallel-slave.opt 2010-12-02 17:46:46 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel-slave.opt 2010-12-07 03:05:41 +0000 @@ -1,2 +1 @@ ---relay-log-info-repository=FILE --slave-parallel-workers=4 - +--relay-log-info-repository=TABLE --slave-parallel-workers=4 === modified file 'mysql-test/suite/rpl/t/rpl_parallel.test' --- a/mysql-test/suite/rpl/t/rpl_parallel.test 2010-12-02 18:13:12 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel.test 2010-12-07 03:05:41 +0000 @@ -46,3 +46,4 @@ source extra/rpl_tests/rpl_parallel_load connection slave; set @@global.slave_parallel_workers= @save.slave_parallel_workers; +SELECT * FROM mysql.slave_worker_info; === modified file 'sql/rpl_info_dummy.cc' --- a/sql/rpl_info_dummy.cc 2010-12-01 19:15:08 +0000 +++ b/sql/rpl_info_dummy.cc 2010-12-07 03:05:41 +0000 @@ -27,13 +27,15 @@ int Rpl_info_dummy::do_init_info(const u return 0; } -int Rpl_info_dummy::do_prepare_info_for_read() +int Rpl_info_dummy::do_prepare_info_for_read(const uint nidx + __attribute__((unused))) { if (abort) DBUG_ASSERT(0); return 0; } -int Rpl_info_dummy::do_prepare_info_for_write() +int Rpl_info_dummy::do_prepare_info_for_write(const uint nidx + __attribute__((unused))) { if (abort) DBUG_ASSERT(0); return 0; === modified file 'sql/rpl_info_dummy.h' --- a/sql/rpl_info_dummy.h 2010-12-01 19:15:08 +0000 +++ b/sql/rpl_info_dummy.h 2010-12-07 03:05:41 +0000 @@ -41,8 +41,8 @@ private: const bool force); int do_remove_info(const ulong *uidx, const uint nidx); - int do_prepare_info_for_read(); - int do_prepare_info_for_write(); + int do_prepare_info_for_read(const uint nidx); + int do_prepare_info_for_write(const uint nidx); bool do_set_info(const int pos, const char *value); bool do_set_info(const int pos, const int value); bool do_set_info(const int pos, const ulong value); === modified file 'sql/rpl_info_factory.cc' --- a/sql/rpl_info_factory.cc 2010-11-30 02:08:01 +0000 +++ b/sql/rpl_info_factory.cc 2010-12-07 03:05:41 +0000 @@ -460,7 +460,7 @@ Slave_worker *Rpl_info_factory::create_w info_fname))) goto err; - if (!(w_table= new Rpl_info_table(worker->get_number_worker_fields() + 1, + if (!(w_table= new Rpl_info_table(worker->get_number_worker_fields() + 2, WORKER_SCHEMA, WORKER_TABLE))) goto err; === modified file 'sql/rpl_info_file.cc' --- a/sql/rpl_info_file.cc 2010-12-01 19:15:08 +0000 +++ b/sql/rpl_info_file.cc 2010-12-07 03:05:41 +0000 @@ -107,14 +107,16 @@ file '%s')", info_fname); DBUG_RETURN(error); } -int Rpl_info_file::do_prepare_info_for_read() +int Rpl_info_file::do_prepare_info_for_read(const uint nidx + __attribute__((unused))) { cursor= 0; prv_error= FALSE; return (reinit_io_cache(&info_file, READ_CACHE, 0L, 0, 0)); } -int Rpl_info_file::do_prepare_info_for_write() +int Rpl_info_file::do_prepare_info_for_write(const uint nidx + __attribute__((unused))) { cursor= 0; prv_error= FALSE; === modified file 'sql/rpl_info_file.h' --- a/sql/rpl_info_file.h 2010-12-01 19:15:08 +0000 +++ b/sql/rpl_info_file.h 2010-12-07 03:05:41 +0000 @@ -48,8 +48,8 @@ private: const bool force); int do_remove_info(const ulong *uidx, const uint nidx); - int do_prepare_info_for_read(); - int do_prepare_info_for_write(); + int do_prepare_info_for_read(const uint nidx); + int do_prepare_info_for_write(const uint nidx); bool do_set_info(const int pos, const char *value); bool do_set_info(const int pos, const int value); bool do_set_info(const int pos, const ulong value); === modified file 'sql/rpl_info_handler.h' --- a/sql/rpl_info_handler.h 2010-12-01 19:15:08 +0000 +++ b/sql/rpl_info_handler.h 2010-12-07 03:05:41 +0000 @@ -118,9 +118,9 @@ public: @retval FALSE No error @retval TRUE Failure */ - int prepare_info_for_read() + int prepare_info_for_read(const uint nidx) { - return (do_prepare_info_for_read()); + return (do_prepare_info_for_read(nidx)); } /** @@ -130,9 +130,9 @@ public: @retval FALSE No error @retval TRUE Failure */ - int prepare_info_for_write() + int prepare_info_for_write(const uint nidx) { - return (do_prepare_info_for_write()); + return (do_prepare_info_for_write(nidx)); } /** @@ -310,8 +310,8 @@ private: const bool force)= 0; virtual int do_remove_info(const ulong *uidx, const uint nidx)= 0; virtual void do_end_info(const ulong *uidx, const uint nidx)= 0; - virtual int do_prepare_info_for_read()= 0; - virtual int do_prepare_info_for_write()= 0; + virtual int do_prepare_info_for_read(const uint nidx)= 0; + virtual int do_prepare_info_for_write(const uint nidx)= 0; virtual bool do_set_info(const int pos, const char *value)= 0; virtual bool do_set_info(const int pos, const ulong value)= 0; === modified file 'sql/rpl_info_table.cc' --- a/sql/rpl_info_table.cc 2010-12-01 19:15:08 +0000 +++ b/sql/rpl_info_table.cc 2010-12-07 03:05:41 +0000 @@ -315,19 +315,19 @@ void Rpl_info_table::do_end_info(const u { } -int Rpl_info_table::do_prepare_info_for_read() +int Rpl_info_table::do_prepare_info_for_read(const uint nidx) { if (!field_values) return TRUE; - cursor= 1; + cursor= nidx; return FALSE; } -int Rpl_info_table::do_prepare_info_for_write() +int Rpl_info_table::do_prepare_info_for_write(const uint nidx) { - return(do_prepare_info_for_read()); + return(do_prepare_info_for_read(nidx)); } bool Rpl_info_table::do_set_info(const int pos, const char *value) === modified file 'sql/rpl_info_table.h' --- a/sql/rpl_info_table.h 2010-12-01 19:15:08 +0000 +++ b/sql/rpl_info_table.h 2010-12-07 03:05:41 +0000 @@ -67,8 +67,8 @@ private: const bool force); int do_remove_info(const ulong *uidx, const uint nidx); - int do_prepare_info_for_read(); - int do_prepare_info_for_write(); + int do_prepare_info_for_read(const uint nidx); + int do_prepare_info_for_write(const uint nidx); bool do_set_info(const int pos, const char *value); bool do_set_info(const int pos, const int value); bool do_set_info(const int pos, const ulong value); === modified file 'sql/rpl_mi.cc' --- a/sql/rpl_mi.cc 2010-12-01 19:15:08 +0000 +++ b/sql/rpl_mi.cc 2010-12-07 03:05:41 +0000 @@ -77,7 +77,7 @@ const char *info_mi_fields []= }; Master_info::Master_info() - :Rpl_info_coordinator("I/O"), + :Rpl_info_coordinator("IO"), ssl(0), ssl_verify_server_cert(0), port(MYSQL_PORT), connect_retry(DEFAULT_CONNECT_RETRY), clock_diff_with_master(0), heartbeat_period(0), @@ -300,7 +300,7 @@ bool Master_info::read_info(Rpl_info_han is this. */ - if (from->prepare_info_for_read() || + if (from->prepare_info_for_read(nidx) || from->get_info(master_log_name, sizeof(master_log_name), "")) DBUG_RETURN(TRUE); @@ -427,7 +427,7 @@ bool Master_info::write_info(Rpl_info_ha of file we don't care about this garbage. */ - if (to->prepare_info_for_write() || + if (to->prepare_info_for_write(nidx) || to->set_info((int) LINES_IN_MASTER_INFO) || to->set_info(master_log_name) || to->set_info((ulong)master_log_pos) || === modified file 'sql/rpl_rli.cc' --- a/sql/rpl_rli.cc 2010-12-04 17:14:50 +0000 +++ b/sql/rpl_rli.cc 2010-12-07 03:05:41 +0000 @@ -1281,6 +1281,9 @@ int Relay_log_info::init_info() if (hot_log) mysql_mutex_unlock(log_lock); + // The correct place should be here. // ANDREI + // mts_recovery_routine(this); + DBUG_RETURN(0); } @@ -1644,7 +1647,7 @@ bool Relay_log_info::read_info(Rpl_info_ it is line count and not binlog name (new format) it will be overwritten by the second row later. */ - if (from->prepare_info_for_read() || + if (from->prepare_info_for_read(nidx) || from->get_info(group_relay_log_name, sizeof(group_relay_log_name), "")) DBUG_RETURN(TRUE); @@ -1691,7 +1694,7 @@ bool Relay_log_info::write_info(Rpl_info */ //DBUG_ASSERT(!belongs_to_client()); - if (to->prepare_info_for_write() || + if (to->prepare_info_for_write(nidx) || to->set_info((int) LINES_IN_RELAY_LOG_INFO_WITH_DELAY) || to->set_info(group_relay_log_name) || to->set_info((ulong) group_relay_log_pos) || === modified file 'sql/rpl_rli.h' --- a/sql/rpl_rli.h 2010-12-03 16:56:11 +0000 +++ b/sql/rpl_rli.h 2010-12-07 03:05:41 +0000 @@ -333,7 +333,7 @@ public: char slave_patternload_file[FN_REFLEN]; size_t slave_patternload_file_size; - struct timespec curr_clock, last_clock; + struct timespec last_clock; float lwm_period; Relay_log_info(bool is_slave_recovery); === modified file 'sql/rpl_rli_pdb.cc' --- a/sql/rpl_rli_pdb.cc 2010-12-07 17:35:16 +0000 +++ b/sql/rpl_rli_pdb.cc 2010-12-07 18:01:39 +0000 @@ -18,8 +18,12 @@ const char *info_slave_worker_fields []= "master_log_pos" }; -Slave_worker::Slave_worker(const char* type): Rpl_info_worker(type) +Slave_worker::Slave_worker(const char* type) + : Rpl_info_worker(type), group_relay_log_pos(0), + group_master_log_pos(0) { + group_relay_log_name[0]= 0; + group_master_log_name[0]= 0; curr_group_exec_parts= new Database_ids(); } @@ -105,7 +109,7 @@ bool Slave_worker::read_info(Rpl_info_ha ulong temp_group_relay_log_pos= 0; ulong temp_group_master_log_pos= 0; - if (from->prepare_info_for_read()) + if (from->prepare_info_for_read(nidx)) DBUG_RETURN(TRUE); if (from->get_info(curr_group_exec_parts, (Dynamic_ids *) NULL) || @@ -137,9 +141,8 @@ bool Slave_worker::write_info(Rpl_info_h of file we don't care about this garbage. */ - if (to->prepare_info_for_write() || - //to->set_info(curr_group_exec_parts) || - to->set_info("") || + if (to->prepare_info_for_write(nidx) || + to->set_info(curr_group_exec_parts) || to->set_info(group_relay_log_name) || to->set_info((ulong)group_relay_log_pos) || to->set_info(group_master_log_name) || === modified file 'sql/rpl_rli_pdb.h' --- a/sql/rpl_rli_pdb.h 2010-12-07 17:35:16 +0000 +++ b/sql/rpl_rli_pdb.h 2010-12-07 18:01:39 +0000 @@ -95,6 +95,9 @@ public: typedef struct st_slave_job_group { + char *group_master_log_name; // This is used upon recovery. + Dynamic_ids *db_ids; // This is used upon recovery. + my_off_t master_log_pos; // B-event log_pos my_off_t group_master_log_pos; // T-event lop_pos filled by W for CheckPoint my_off_t group_relay_log_pos; // filled by W @@ -113,6 +116,69 @@ typedef struct st_slave_job_group ulonglong total_seqno; } Slave_job_group; +#define copy_job(from, to) \ + do \ + { \ + to.group_master_log_pos= from.group_master_log_pos; \ + to.group_relay_log_pos= from.group_relay_log_pos; \ + to.group_relay_log_name= from.group_relay_log_name; \ + to.group_master_log_name= from.group_master_log_name; \ + to.db_ids= from.db_ids; \ + to.worker_id= from.worker_id; \ + } while (0) + +#define exchange_jobs(j1, j2) \ + do \ + { \ + Slave_job_group tmp; \ + copy_job(j2, tmp); \ + copy_job(j1, j2); \ + copy_job(tmp, j1); \ + } while (0) + +#define greater_jobs(j1, j2) \ + (j1.group_relay_log_pos > j2.group_relay_log_pos) + +#define lower_jobs(j1, j2) \ + (j1.group_relay_log_pos < j2.group_relay_log_pos) + +#define init_job(from, to) \ + do \ + { \ + to.worker_id= from->id; \ + fprintf(stderr, "DEBUGGING Worker-Id %lu Worker-Id %lu\n", \ + to.worker_id, from->id); \ + to.group_relay_log_pos= from->group_relay_log_pos; \ + fprintf(stderr, "DEBUGGING group_relay_log_pos %lu group_relay_log_pos %lu\n", \ + (ulong) to.group_relay_log_pos, (ulong) from->group_relay_log_pos); \ + to.group_relay_log_name= from->group_relay_log_name; \ + fprintf(stderr, "DEBUGGING group_relay_log_name %s group_relay_log_name %s\n", \ + to.group_relay_log_name, from->group_relay_log_name); \ + to.group_master_log_pos= from->group_master_log_pos; \ + fprintf(stderr, "DEBUGGING to group_master_log_pos %lu group_master_log_pos %lu\n", \ + (ulong) to.group_master_log_pos, (ulong) from->group_master_log_pos); \ + to.group_master_log_name= from->group_master_log_name; \ + fprintf(stderr, "DEBUGGING to group_master_log_name %s group_master_log_pos %s\n", \ + to.group_master_log_name, from->group_master_log_name); \ + to.db_ids= from->curr_group_exec_parts; \ + } while (0) + +#define debug_jobs(jobs, size) \ + do \ + { \ + for (uint pos= 0; pos < size; pos++) \ + { \ + fprintf(stderr, "DEBUGGING Worker-Id %lu, " \ + "group_relay_log_name %s, group_relay_log_pos %lu, " \ + "group_master_log_name %s, group_master_lo_pos %lu\n", \ + jobs[pos].worker_id, \ + jobs[pos].group_relay_log_name, \ + (ulong) jobs[pos].group_relay_log_pos, \ + jobs[pos].group_master_log_name, \ + (ulong) jobs[pos].group_master_log_pos); \ + } \ + } while (0) + /** Group Assigned Queue whose first element identifies first gap in committed sequence. The head of the queue is therefore next to === modified file 'sql/rpl_slave.cc' --- a/sql/rpl_slave.cc 2010-12-07 17:35:16 +0000 +++ b/sql/rpl_slave.cc 2010-12-07 18:01:39 +0000 @@ -168,7 +168,8 @@ static int terminate_slave_thread(THD *t bool skip_lock); static bool check_io_slave_killed(THD *thd, Master_info *mi, const char *info); int slave_worker_exec_job(Slave_worker * w, Relay_log_info *rli); -static bool mts_checkpoint_routine(Relay_log_info *rli, bool locked); +static bool mts_checkpoint_routine(Relay_log_info *rli, ulong period, bool locked); +bool mts_recovery_routine(Relay_log_info *rli); /* Find out which replications threads are running @@ -364,8 +365,15 @@ int init_recovery(Master_info* mi, const { DBUG_ENTER("init_recovery"); + int error= 0; Relay_log_info *rli= mi->rli; - const char *group_master_log_name= rli->get_group_master_log_name(); + char *group_master_log_name= NULL; + + // ANDREI The correct place should be here. + // if (rli->is_parallel_exec() && !(error= mts_recovery_routine(rli))) + // goto err; + + group_master_log_name= const_cast(rli->get_group_master_log_name()); if (group_master_log_name[0]) { mi->set_master_log_pos(max(BIN_LOG_HEADER_SIZE, @@ -381,7 +389,8 @@ int init_recovery(Master_info* mi, const rli->set_event_relay_log_pos(BIN_LOG_HEADER_SIZE); } - DBUG_RETURN(0); +err: + DBUG_RETURN(error); } int init_info(Master_info* mi, bool ignore_if_no_info, int thread_mask) @@ -3610,6 +3619,70 @@ err: DBUG_RETURN(0); } +int mts_recovery_partition(Slave_job_group *jobs, int p /* pos_ini */, int r /* pos_end */) +{ + Slave_job_group x; + + copy_job(jobs[p], x); + + int i= p - 1; + int j= r + 1; + + for (;;) + { + do + { + j= j - 1; + } + while (greater_jobs(jobs[j], x)); + + do + { + i= i + 1; + } + while (lower_jobs(jobs[i], x)); + + if (i < j) + exchange_jobs(jobs[i], jobs[j]); + else + return j; + } +} + +void mts_recovery_quicksort(Slave_job_group *jobs, int p /* pos_ini */, int r /* pos_end */) +{ + if (p < r) + { + int q= mts_recovery_partition(jobs, p, r); + mts_recovery_quicksort(jobs, p, q); + mts_recovery_quicksort(jobs, q + 1, r); + } +} + +bool mts_recovery_routine(Relay_log_info *rli) +{ + DBUG_ENTER("mts_recovery_routine"); + + DBUG_ASSERT(rli->workers.elements > 0); + Slave_job_group *jobs= new Slave_job_group[rli->workers.elements]; + + for (uint i= 0; i < rli->workers.elements; i++) + { + Slave_worker *w_i; + get_dynamic(&rli->workers, (uchar *) &w_i, i); + init_job(w_i, jobs[i]); + } + + mts_recovery_quicksort(jobs, 0, rli->workers.elements - 1); + + debug_jobs(jobs, rli->workers.elements); + + // TODO -- ALFRANIO CORE OF RECOVERY + + delete []jobs; + DBUG_RETURN(rli->flush_info(TRUE)); +} + /** Processing rli->gaq to find out the low-water-mark coordinates stored into the cental recovery table. @@ -3617,13 +3690,25 @@ err: @return FALSE success, TRUE otherwise */ -bool mts_checkpoint_routine(Relay_log_info *rli, bool locked) +bool mts_checkpoint_routine(Relay_log_info *rli, ulong period, bool locked) { - bool error= FALSE; ulong cnt; + bool error= FALSE; + struct timespec curr_clock; DBUG_ENTER("checkpoint_routine"); + set_timespec_nsec(curr_clock, 0); + ulong diff= diff_timespec(curr_clock, rli->last_clock); + if (diff < period) + { + /* + We do not need to execute the checkpoint now because + the time elapsed is not enough. + */ + DBUG_RETURN(FALSE); + } + if (!(cnt= rli->gaq->move_queue_head(&rli->workers))) goto end; @@ -3673,6 +3758,7 @@ bool mts_checkpoint_routine(Relay_log_in // end of commit_positions end: + set_timespec_nsec(rli->last_clock, 0); DBUG_RETURN(error); } @@ -3704,8 +3790,6 @@ int slave_start_single_worker(Relay_log_ w->relay_log_change_notified= FALSE; // the 1st group to contain relaylog name - // ALFRANIO --> The recovery procedure must be introduced here. - w->w_rli->workers= rli->workers; // shallow copying is sufficient w->w_rli->this_worker= w; @@ -4033,6 +4117,9 @@ log '%s' at position %s, relay log '%s' goto err; } + /* Recovery routine */ + mts_recovery_routine(rli); + /* execute init_slave variable */ if (opt_init_slave.length) { @@ -5244,25 +5331,18 @@ static Log_event* next_event(Relay_log_i */ rli->set_future_event_relay_log_pos(my_b_tell(cur_log)); ev->future_event_relay_log_pos= rli->get_future_event_relay_log_pos(); - if (hot_log) - mysql_mutex_unlock(log_lock); + /* MTS checkpoint in the successful read branch */ if (rli->is_parallel_exec() && rli->lwm_period != 0.0) { - int ret= 0; - struct timespec waittime; ulong period= rli->lwm_period * 1000000000UL; - set_timespec_nsec(rli->curr_clock, 0); - ulong diff= diff_timespec(rli->curr_clock, rli->last_clock); - if (diff > period) - { - mts_checkpoint_routine(rli, TRUE); - set_timespec_nsec(rli->last_clock, 0); - } + mts_checkpoint_routine(rli, period, TRUE); // ALFRANIO --- WHAT TO DO with ERRORS? } + if (hot_log) + mysql_mutex_unlock(log_lock); DBUG_RETURN(ev); } DBUG_ASSERT(thd==rli->info_thd); @@ -5384,16 +5464,10 @@ static Log_event* next_event(Relay_log_i { int ret= 0; struct timespec waittime; + ulong period= rli->lwm_period * 1000000000UL; do { - ulong period= rli->lwm_period * 1000000000UL; - set_timespec_nsec(rli->curr_clock, 0); - ulong diff= diff_timespec(rli->curr_clock, rli->last_clock); - if (diff > period) - { - mts_checkpoint_routine(rli, FALSE); - set_timespec_nsec(rli->last_clock, 0); - } + mts_checkpoint_routine(rli, period, FALSE); // ALFRANIO ERROR set_timespec_nsec(waittime, period); thd->enter_cond(log_cond, log_lock, "Slave has read all relay log; " === modified file 'sql/rpl_slave.h' --- a/sql/rpl_slave.h 2010-10-25 10:39:01 +0000 +++ b/sql/rpl_slave.h 2010-12-07 03:05:41 +0000 @@ -235,6 +235,8 @@ extern char *master_ssl_cipher, *master_ extern I_List threads; +bool mts_recovery_routine(Relay_log_info *rli); + #endif /* HAVE_REPLICATION */ /* masks for start/stop operations on io and sql slave threads */ --__129174492015656567abhmt004 MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset=us-ascii; name="andrei.elkin@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="andrei.elkin@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: andrei.elkin@stripped # target_branch: file:///home/andrei/MySQL/BZR/2a-23May/WL/mysql-next-\ # mr-wl5569/ # testament_sha1: 6d042c48ec6f0a8a279ddc01082ec07395373b5f # timestamp: 2010-12-07 20:01:56 +0200 # base_revision_id: andrei.elkin@stripped\ # rqf0s7jiwjny97by # # Begin bundle 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 XKMpEhCoSqAYh5OqJJd8WDCEzxPU0lomd9IrAK9NJlGgQbSDRPjHSeCe+dskA3gsnvBs1ksSegJ1 nrOQCfN7yqCH/KDYsKaT3aUOwmaPRtQ0n5oc+nB0SNHF3Tokk2ryT4/3IoooooopoXqWGKtxuKJY QRhYtJj4gN6HASSVKScI1akE3Qr1m+eosYRESMI8aB14UK4/KML3OQBMLtBsS7iVJneHpAT4j55O Yx16gdCqRS2apGhdGEKNKyT4uDW/Dg3Ndk88307XBqxxjTSFV1pGLSMSTZcvSPwHWu3Q6qSqkNOg MigU0HuMTm8YdJIZqqiLzQyIHxhZr64LWpKtUsnv80uQdUib24xS13scGLOnbQ5VFVBvp+aktZeH J32ykKwLyzF4tjFC89UkjnJ2s1+tRvXJFdyrDQSLy5hoRwvnR+jG5K8MzQTYmxpYF5ezFKxVEnhP 9pvNZIptTud+iYPlXfwQ1O2utZhOU7zhBomM5uTNprPUWmr5v/NL6WpSUnkJt5pCcYbom3nCi4lt +lO+EKohOCSReyL3efVs3dsZn4ng5c0PW+JmODd1NO1q0Kdn5z7mO4K5mZ1sz5sU//f58kyTZsFx kkk8WTF3t5qjdXdjNJxv3GmDqQ+w7Xb2j7i9qJNKZIZzU6En4bE9M7GYM3qOIWDRc0xjHWxBZK4m wc8N0hurbKG+6kGNIMw1PUPReTufMvSaVSqHe8LruB2uuo3fcr6vJF4T6P1rdGLbFo8KVFMzxk3S Xr/e0xmIXRMz4E1s5g0N3/TovGqHW2nmKe9/A6nky4t682QlHWE5FnzbCU7T1vt8JcLfaSiWvVFy oofcLuSKcKEg7cpE1A== --__129174492015656567abhmt004--