From: Andrei Elkin Date: November 27 2010 3:37pm Subject: bzr commit into mysql-next-mr.crash-safe branch (andrei.elkin:3220) WL#5569 List-Archive: http://lists.mysql.com/commits/125223 Message-Id: <201011271537.oARFb4p6032613@mysql1000.dsl.inet.fi> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1929617104==" --===============1929617104== 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 3220 Andrei Elkin 2010-11-27 wl#5569 Providing relay-log name for wl#5599. Protocol of action on the C and W sides is described in rpl_rli_pdb.h. Erroring out in case of parallel exec and ROWS_QUERY_LOG_EVENT. (todo: the native sequential mode for the event needs some revision, in particular `delete ev' shall happen *always* in rli->cleanup_context not in two places as of current). @ sql/log_event.cc Erroring out in case of parallel exec and ROWS_QUERY_LOG_EVENT; Deploying C role of handling relay-log name change; @ sql/rpl_rli_pdb.cc Providing relay-log name for wl#5599. Freeing allocated memory for relay-log name at the end of the group execution by Worker. @ sql/rpl_rli_pdb.h Protocol of action on the C and W sides is here. Removing current_binlog; Adding a pointer group_relay_log_name member to st_slave_job_group. modified: sql/log_event.cc sql/log_event.h sql/rpl_rli_pdb.cc sql/rpl_rli_pdb.h sql/rpl_slave.cc === modified file 'sql/log_event.cc' --- a/sql/log_event.cc 2010-11-26 21:08:30 +0000 +++ b/sql/log_event.cc 2010-11-27 15:36:50 +0000 @@ -2181,7 +2181,7 @@ bool Log_event::contains_partition_info( r - a mini-group internal "regular" event that follows its g-parent (Write, Update, Delete -rows) S - sequentially applied event (may not be a part of any group). - Events of this type are determined via @c only_serial_exec() + Events of this type are determined via @c only_sequential_exec() earlier and don't cause calling this method . T - terminator of the group (XID, COMMIT, ROLLBACK) @@ -2215,6 +2215,7 @@ Slave_worker *Log_event::get_slave_worke // rli->gaq->en_queue({NULL, W_s}); g= { log_pos, + NULL, (ulong) -1, const_cast(rli)->mts_total_groups++ }; @@ -2280,12 +2281,35 @@ Slave_worker *Log_event::get_slave_worke if (ends_group() || !rli->curr_group_seen_begin) { uint i; - // assert (\exists P_k . W_s \in CGAP) if P_k is present in ev mts_group_cnt= rli->gaq->assigned_group_index; - + + if (!worker->relay_log_change_notified) + { + /* + Prior this event, C rotated the relay log to drop each + Worker's notified flag. + Now group terminating event initiates the new name + delivery through the current group relaylog slot in GAQ. + */ + + Slave_job_group *ptr_g= + (Slave_job_group *) + dynamic_array_ptr(&rli->gaq->Q, rli->gaq->assigned_group_index); + + DBUG_ASSERT(ptr_g->group_relay_log_name == NULL); + + ptr_g->group_relay_log_name= (char *) + my_malloc(strlen(const_cast(rli)->get_group_relay_log_name()) + 1, MYF(MY_WME)); + strcpy(ptr_g->group_relay_log_name, const_cast(rli)->get_group_relay_log_name()); + worker->relay_log_change_notified= TRUE; + } + DBUG_ASSERT(worker == rli->last_assigned_worker); + if (!worker) { + DBUG_ASSERT(0); + // a very special case of the empty group: {B, T} DBUG_ASSERT(rli->curr_group_assigned_parts.elements == 0 && rli->curr_group_da.elements == 1); @@ -2450,7 +2474,7 @@ int Log_event::apply_event(Relay_log_inf bool parallel; if (!(parallel= rli->is_parallel_exec()) || - only_serial_exec(rli->run_query_in_parallel, rli->curr_group_seen_begin)) + only_sequential_exec(rli->run_query_in_parallel, rli->curr_group_seen_begin)) { if (parallel) { @@ -2478,15 +2502,18 @@ int Log_event::apply_event(Relay_log_inf DBUG_ASSERT(!rli->curr_group_seen_begin); c_rli->curr_group_is_parallel= FALSE; // Coord will destruct all the rest of events - - (void) wait_for_workers_to_finish(rli); + if (!parallel_exec_by_coordinator(::server_id)) + (void) wait_for_workers_to_finish(rli); } DBUG_RETURN(do_apply_event(rli)); } - // !!! TODO: suppress - // if (get_type_code() == ROWS_QUERY_LOG_EVENT) - + if (get_type_code() == ROWS_QUERY_LOG_EVENT) + { + rli->report(ERROR_LEVEL, 0, + "No parallel support for ROWS_QUERY_LOG_EVENT"); + DBUG_RETURN(1); + } if ((!(w= get_slave_worker_id(rli)) || DBUG_EVALUATE_IF("fault_injection_get_slave_worker", 1, 0))) === modified file 'sql/log_event.h' --- a/sql/log_event.h 2010-11-26 21:08:30 +0000 +++ b/sql/log_event.h 2010-11-27 15:36:50 +0000 @@ -1155,9 +1155,10 @@ public: /** MST: to execute serially due to technical or conceptual limitation - @return TRUE for all but {Query,Rand,User_var,Intvar,Rows}_log_event + @return TRUE if despite permanent parallel execution mode an event + needs applying in a real isolation that is sequentially. */ - bool only_serial_exec(bool query_in_parallel, bool group_term_in_parallel) + bool only_sequential_exec(bool query_in_parallel, bool group_term_in_parallel) { return /* @@ -1194,7 +1195,20 @@ public: get_type_code() == PRE_GA_DELETE_ROWS_EVENT|| get_type_code() == INCIDENT_EVENT; } - + + /** + MST: some events can be applied by Coordinator concurrently with Workers. + + @return TRUE if that's the case, + FALSE otherwise. + */ + bool parallel_exec_by_coordinator(ulong slave_server_id) + { + return + get_type_code() == FORMAT_DESCRIPTION_EVENT && + (server_id == (uint32) ::server_id); + } + /** Events of a cetain type carry partitioning data such as db names. */ === modified file 'sql/rpl_rli_pdb.cc' --- a/sql/rpl_rli_pdb.cc 2010-11-26 21:08:30 +0000 +++ b/sql/rpl_rli_pdb.cc 2010-11-27 15:36:50 +0000 @@ -448,7 +448,23 @@ void Slave_worker::slave_worker_ends_gro uint i; if (!error) + { + Slave_job_group *ptr_g= + (Slave_job_group *) + dynamic_array_ptr(&c_rli->gaq->Q, c_rli->gaq->assigned_group_index); + if (ptr_g->group_relay_log_name != NULL) + { + // memorizing a new relay-log file name + + DBUG_ASSERT(strlen(ptr_g->group_relay_log_name) + 1 + <= sizeof(group_relay_log_name)); + + strcpy(group_relay_log_name, ptr_g->group_relay_log_name); + delete ptr_g->group_relay_log_name; // C allocated + ptr_g->group_relay_log_name= NULL; // mark freed + } last_group_done_index = gaq_idx; + } for (i= curr_group_exec_parts.elements; i > 0; i--) { === modified file 'sql/rpl_rli_pdb.h' --- a/sql/rpl_rli_pdb.h 2010-11-26 21:08:30 +0000 +++ b/sql/rpl_rli_pdb.h 2010-11-27 15:36:50 +0000 @@ -91,9 +91,19 @@ public: typedef struct st_slave_job_group { - //struct event_coordinates coord; - my_off_t pos; // filename in Slave_committed_queue::current_binlog[] + my_off_t master_log_pos; + /* + When RL name changes C allocates and fill in a new name of RL, + otherwise it fills in NULL. + C keeps track of each Worker has been notified on the updating + to make sure the routine runs once per change. + + W checks the value at commit and memoriezes a not-NULL + with prior freeing old one's allocation. The memorized value + plays its role at commit until a new has arrived. + */ + char *group_relay_log_name; ulong worker_id; ulonglong total_seqno; } Slave_job_group; @@ -107,9 +117,6 @@ class Slave_committed_queue : public cir { public: - /* Allocation of file_name that is common for all Slave_assigned_job_group:s */ - char current_binlog[FN_REFLEN]; - /* master's Rot-ev exec */ void update_current_binlog(const char *post_rotate); @@ -129,7 +136,6 @@ public: : circular_buffer_queue(el_size, max, inc) { uint k; - strmake(current_binlog, log, sizeof(current_binlog) - 1); my_init_dynamic_array(&last_done, sizeof(s), n, 0); for (k= 0; k < n; k++) insert_dynamic(&last_done, (uchar*) &s); // empty for each Worker @@ -188,6 +194,7 @@ public: ulong trans_jobs; // how many jobs per trns volatile int curr_jobs; // the current assignments ulong usage_partition; // number of different partitions handled by this worker + volatile bool relay_log_change_notified; // Coord sets and resets, W can read /* We need to make this a dynamic field. /Alfranio === modified file 'sql/rpl_slave.cc' --- a/sql/rpl_slave.cc 2010-11-26 21:08:30 +0000 +++ b/sql/rpl_slave.cc 2010-11-27 15:36:50 +0000 @@ -2677,7 +2677,7 @@ int apply_event_and_update_pos(Log_event // It was served so inside apply_event() above. // The main RLI table is safe to update now. -// if (!rli->is_parallel_exec() || ev->only_serial_exec()) +// if (!rli->is_parallel_exec() || ev->only_sequential_exec()) error= ev->update_pos(rli); #if 1 @@ -2879,7 +2879,7 @@ static int exec_relay_log_event(THD* thd handle_rows_query_log_event(ev, rli); if ((!rli->is_parallel_exec() || - ev->only_serial_exec(rli->run_query_in_parallel, rli->curr_group_is_parallel)) + ev->only_sequential_exec(rli->run_query_in_parallel, rli->curr_group_is_parallel)) && ev->get_type_code() != ROWS_QUERY_LOG_EVENT) // mts TODO: check this case { @@ -3603,7 +3603,7 @@ err: my_thread_end(); pthread_exit(0); - DBUG_RETURN(0); + DBUG_RETURN(0); } /** @@ -3632,6 +3632,8 @@ int slave_start_single_worker(Relay_log_ ulong key_worker_idx[]= { server_id, w->id }; w->init_info(key_worker_idx, NUMBER_OF_FIELDS_TO_IDENTIFY_WORKER); + 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 @@ -5352,6 +5354,13 @@ static Log_event* next_event(Relay_log_i rli->flush_info(key_info_idx, key_info_size); } + /* Reset the relay-log-change-notified status of Slave Workers */ + for (uint i; i < rli->workers.elements; i++) + { + Slave_worker *w= (Slave_worker *) dynamic_array_ptr(&rli->workers, i); + w->relay_log_change_notified= FALSE; + } + /* Now we want to open this next log. To know if it's a hot log (the one being written by the I/O thread now) or a cold log, we can use --===============1929617104== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/andrei.elkin@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # 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: a81ed5f4d64fab776a3967b6973a6b988d4c49d3 # timestamp: 2010-11-27 17:37:04 +0200 # base_revision_id: andrei.elkin@stripped\ # eqhloz0dt6xp23pz # # Begin bundle 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 IA== --===============1929617104==--