Commit 24203799 authored by sasha@mysql.sashanet.com's avatar sasha@mysql.sashanet.com

merged with 3.23 replication updates

parents 0b8f1595 14c133fb
...@@ -37,8 +37,10 @@ From: $FROM ...@@ -37,8 +37,10 @@ From: $FROM
To: $INTERNALS To: $INTERNALS
Subject: bk commit into 4.0 tree Subject: bk commit into 4.0 tree
Below is the list of changes that have just been pushed into main Below is the list of changes that have just been committed into a
4.0 repository. For information on how to access the repository 4.0 repository of $USER. When $USER does a push, they will be propogated 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://www.mysql.com/doc/I/n/Installing_source_tree.html see http://www.mysql.com/doc/I/n/Installing_source_tree.html
EOF EOF
......
#! /bin/sh
echo "Test: post-incoming works"
#! /bin/sh
echo "Test: post-outgoing works"
--sporadic-binlog-dump-fail --max-binlog-dump-events=2
#test to see if replication can continue when master sporadically fails on
# COM_BINLOG_DUMP and additionally limits the number of events per dump
source include/master-slave.inc;
connection master;
drop table if exists t1;
create table t1(n int not null auto_increment primary key);
insert into t1 values (NULL),(NULL);
delete from t1;
insert into t1 values (NULL),(NULL);
insert into t1 values (NULL),(NULL);
flush logs;
delete from t1;
insert into t1 values (NULL),(NULL);
insert into t1 values (NULL),(NULL);
insert into t1 values (NULL),(NULL);
save_master_pos;
connection slave;
sync_with_master;
select * from t1;
connection master;
drop table t1;
save_master_pos;
connection slave;
sync_with_master;
...@@ -1523,6 +1523,10 @@ ha_innobase::update_row( ...@@ -1523,6 +1523,10 @@ ha_innobase::update_row(
DBUG_ENTER("ha_innobase::update_row"); DBUG_ENTER("ha_innobase::update_row");
if (table->time_stamp) {
update_timestamp(new_row + table->time_stamp - 1);
}
if (last_query_id != user_thd->query_id) { if (last_query_id != user_thd->query_id) {
prebuilt->sql_stat_start = TRUE; prebuilt->sql_stat_start = TRUE;
last_query_id = user_thd->query_id; last_query_id = user_thd->query_id;
......
...@@ -2487,8 +2487,8 @@ enum options { ...@@ -2487,8 +2487,8 @@ enum options {
OPT_GEMINI_UNBUFFERED_IO, OPT_SKIP_SAFEMALLOC, OPT_GEMINI_UNBUFFERED_IO, OPT_SKIP_SAFEMALLOC,
OPT_SKIP_STACK_TRACE, OPT_SKIP_SYMLINK, OPT_REPORT_HOST, OPT_SKIP_STACK_TRACE, OPT_SKIP_SYMLINK, OPT_REPORT_HOST,
OPT_REPORT_USER, OPT_REPORT_PASSWORD, OPT_REPORT_PORT, OPT_REPORT_USER, OPT_REPORT_PASSWORD, OPT_REPORT_PORT,
OPT_SHOW_SLAVE_AUTH_INFO OPT_MAX_BINLOG_DUMP_EVENTS, OPT_SPORADIC_BINLOG_DUMP,
}; OPT_SHOW_SLAVE_AUTH_INFO};
static struct option long_options[] = { static struct option long_options[] = {
{"ansi", no_argument, 0, 'a'}, {"ansi", no_argument, 0, 'a'},
...@@ -2573,6 +2573,10 @@ static struct option long_options[] = { ...@@ -2573,6 +2573,10 @@ static struct option long_options[] = {
(int) OPT_DISCONNECT_SLAVE_EVENT_COUNT}, (int) OPT_DISCONNECT_SLAVE_EVENT_COUNT},
{"abort-slave-event-count", required_argument, 0, {"abort-slave-event-count", required_argument, 0,
(int) OPT_ABORT_SLAVE_EVENT_COUNT}, (int) OPT_ABORT_SLAVE_EVENT_COUNT},
{"max-binlog-dump-events", required_argument, 0,
(int) OPT_MAX_BINLOG_DUMP_EVENTS},
{"sporadic-binlog-dump-fail", no_argument, 0,
(int) OPT_SPORADIC_BINLOG_DUMP_FAIL},
{"safemalloc-mem-limit", required_argument, 0, (int) {"safemalloc-mem-limit", required_argument, 0, (int)
OPT_SAFEMALLOC_MEM_LIMIT}, OPT_SAFEMALLOC_MEM_LIMIT},
{"new", no_argument, 0, 'n'}, {"new", no_argument, 0, 'n'},
...@@ -2634,6 +2638,9 @@ static struct option long_options[] = { ...@@ -2634,6 +2638,9 @@ static struct option long_options[] = {
{"temp-pool", no_argument, 0, (int) OPT_TEMP_POOL}, {"temp-pool", no_argument, 0, (int) OPT_TEMP_POOL},
{"tmpdir", required_argument, 0, 't'}, {"tmpdir", required_argument, 0, 't'},
{"use-locking", no_argument, 0, (int) OPT_USE_LOCKING}, {"use-locking", no_argument, 0, (int) OPT_USE_LOCKING},
#ifdef USE_SYMDIR
{"use-symbolic-links", no_argument, 0, 's'},
#endif
{"user", required_argument, 0, 'u'}, {"user", required_argument, 0, 'u'},
{"version", no_argument, 0, 'V'}, {"version", no_argument, 0, 'V'},
{"warnings", no_argument, 0, 'W'}, {"warnings", no_argument, 0, 'W'},
...@@ -3088,6 +3095,9 @@ static void usage(void) ...@@ -3088,6 +3095,9 @@ static void usage(void)
--remove Remove mysqld from the service list (NT)\n\ --remove Remove mysqld from the service list (NT)\n\
--standalone Dummy option to start as a standalone program (NT)\ --standalone Dummy option to start as a standalone program (NT)\
"); ");
#ifdef USE_SYMDIR
puts("--use-symbolic-links Enable symbolic link support");
#endif
puts(""); puts("");
#endif #endif
#ifdef HAVE_BERKELEY_DB #ifdef HAVE_BERKELEY_DB
...@@ -3274,6 +3284,11 @@ static void get_options(int argc,char **argv) ...@@ -3274,6 +3284,11 @@ static void get_options(int argc,char **argv)
case 'r': case 'r':
mysqld_chroot=optarg; mysqld_chroot=optarg;
break; break;
#ifdef USE_SYMDIR
case 's':
my_use_symdir=1; /* Use internal symbolic links */
break;
#endif
case 't': case 't':
mysql_tmpdir=optarg; mysql_tmpdir=optarg;
break; break;
...@@ -3327,6 +3342,17 @@ static void get_options(int argc,char **argv) ...@@ -3327,6 +3342,17 @@ static void get_options(int argc,char **argv)
abort_slave_event_count = atoi(optarg); abort_slave_event_count = atoi(optarg);
#endif #endif
break; break;
case (int)OPT_SPORADIC_BINLOG_DUMP_FAIL:
#ifndef DBUG_OFF
opt_sporadic_binlog_dump_fail = 1;
#endif
break;
case (int)OPT_MAX_BINLOG_DUMP_EVENTS:
#ifndef DBUG_OFF
max_binlog_dump_events = atoi(optarg);
#endif
break;
case (int) OPT_LOG_SLAVE_UPDATES: case (int) OPT_LOG_SLAVE_UPDATES:
opt_log_slave_updates = 1; opt_log_slave_updates = 1;
break; break;
......
...@@ -1349,6 +1349,8 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused))) ...@@ -1349,6 +1349,8 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused)))
goto err; goto err;
} }
connected:
// register ourselves with the master // register ourselves with the master
// if fails, this is not fatal - we just print the error message and go // if fails, this is not fatal - we just print the error message and go
// on with life // on with life
...@@ -1397,7 +1399,7 @@ try again, log '%s' at postion %s", RPL_LOG_NAME, ...@@ -1397,7 +1399,7 @@ try again, log '%s' at postion %s", RPL_LOG_NAME,
goto err; goto err;
} }
continue; goto connected;
} }
...@@ -1448,8 +1450,9 @@ reconnecting to retry, log '%s' position %s", RPL_LOG_NAME, ...@@ -1448,8 +1450,9 @@ reconnecting to retry, log '%s' position %s", RPL_LOG_NAME,
reconnect done to recover from failed read"); reconnect done to recover from failed read");
goto err; goto err;
} }
break;
} goto connected;
} // if(event_len == packet_error)
thd->proc_info = "Processing master log event"; thd->proc_info = "Processing master log event";
if(exec_event(thd, &mysql->net, &glob_mi, event_len)) if(exec_event(thd, &mysql->net, &glob_mi, event_len))
...@@ -1492,9 +1495,8 @@ the slave thread with \"mysqladmin start-slave\". We stopped at log \ ...@@ -1492,9 +1495,8 @@ the slave thread with \"mysqladmin start-slave\". We stopped at log \
events_till_disconnect++; events_till_disconnect++;
} }
#endif #endif
} // while(!slave_killed(thd)) - read/exec loop
} } // while(!slave_killed(thd)) - slave loop
}
// error = 0; // error = 0;
err: err:
......
...@@ -32,9 +32,11 @@ extern pthread_handler_decl(handle_slave,arg); ...@@ -32,9 +32,11 @@ extern pthread_handler_decl(handle_slave,arg);
HASH slave_list; HASH slave_list;
static uint32* slave_list_key(SLAVE_INFO* si, uint* len, #ifndef DBUG_OFF
my_bool not_used __attribute__((unused))) int max_binlog_dump_events = 0; // unlimited
{ bool opt_sporadic_binlog_dump_fail = 0;
static int binlog_dump_count = 0;
#endif
*len = 4; *len = 4;
return &si->server_id; return &si->server_id;
} }
...@@ -349,8 +351,19 @@ void mysql_binlog_send(THD* thd, char* log_ident, ulong pos, ushort flags) ...@@ -349,8 +351,19 @@ void mysql_binlog_send(THD* thd, char* log_ident, ulong pos, ushort flags)
int error; int error;
const char *errmsg = "Unknown error"; const char *errmsg = "Unknown error";
NET* net = &thd->net; NET* net = &thd->net;
#ifndef DBUG_OFF
int left_events = max_binlog_dump_events;
#endif
DBUG_ENTER("mysql_binlog_send"); DBUG_ENTER("mysql_binlog_send");
#ifndef DBUG_OFF
if (opt_sporadic_binlog_dump_fail && (binlog_dump_count++ % 2))
{
errmsg = "Master failed COM_BINLOG_DUMP to test if slave can recover";
goto err;
}
#endif
bzero((char*) &log,sizeof(log)); bzero((char*) &log,sizeof(log));
if(!mysql_bin_log.is_open()) if(!mysql_bin_log.is_open())
...@@ -410,6 +423,14 @@ impossible position"; ...@@ -410,6 +423,14 @@ impossible position";
while (!(error = Log_event::read_log_event(&log, packet, log_lock))) while (!(error = Log_event::read_log_event(&log, packet, log_lock)))
{ {
#ifndef DBUG_OFF
if(max_binlog_dump_events && !left_events--)
{
net_flush(net);
errmsg = "Debugging binlog dump abort";
goto err;
}
#endif
if (my_net_write(net, (char*)packet->ptr(), packet->length()) ) if (my_net_write(net, (char*)packet->ptr(), packet->length()) )
{ {
errmsg = "Failed on my_net_write()"; errmsg = "Failed on my_net_write()";
...@@ -484,6 +505,15 @@ impossible position"; ...@@ -484,6 +505,15 @@ impossible position";
bool read_packet = 0, fatal_error = 0; bool read_packet = 0, fatal_error = 0;
#ifndef DBUG_OFF
if(max_binlog_dump_events && !left_events--)
{
net_flush(net);
errmsg = "Debugging binlog dump abort";
goto err;
}
#endif
// no one will update the log while we are reading // no one will update the log while we are reading
// now, but we'll be quick and just read one record // now, but we'll be quick and just read one record
pthread_mutex_lock(log_lock); pthread_mutex_lock(log_lock);
......
...@@ -20,6 +20,11 @@ extern uint32 server_id; ...@@ -20,6 +20,11 @@ extern uint32 server_id;
extern bool server_id_supplied; extern bool server_id_supplied;
extern I_List<i_string> binlog_do_db, binlog_ignore_db; extern I_List<i_string> binlog_do_db, binlog_ignore_db;
#ifndef DBUG_OFF
extern int max_binlog_dump_events;
extern bool opt_sporadic_binlog_dump_fail;
#endif
File open_binlog(IO_CACHE *log, const char *log_file_name, File open_binlog(IO_CACHE *log, const char *log_file_name,
const char **errmsg); const char **errmsg);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment