summaryrefslogtreecommitdiff
path: root/sql/slave.cc
diff options
context:
space:
mode:
authorunknown <sasha@mysql.sashanet.com>2000-11-24 19:49:13 -0700
committerunknown <sasha@mysql.sashanet.com>2000-11-24 19:49:13 -0700
commit1ef81b2165e5bd416bcb5b6dc91d0cbb64e4af17 (patch)
tree8369a6e73770b40358d3b22b40c94e58de8913e4 /sql/slave.cc
parent85a61b2cce24448f7ea24c75584a6f7061fd94e5 (diff)
downloadmariadb-git-1ef81b2165e5bd416bcb5b6dc91d0cbb64e4af17.tar.gz
slave master.info FILE -> IO_CACHE
send_file() is more stack-friendly - changed large static buffer to alloc_root() fixed my_b_seek() to work with WRITE_CACHE test case to make sure the slave starts correctly after being stopped truncated words file so the replication tests will take less time mysql-test/r/3.23/rpl000001.b.result: truncated words file mysql-test/r/3.23/rpl000004.b.result: truncated words file mysql-test/std_data/words: truncated words file BitKeeper/etc/ignore: Added mysql-test/rpl000011.test mysql-test/var/lib/mysql-bin.007 sql/share/norwegian/errmsg.sys sql/share/norwegian-ny/errmsg.sys to the ignore list mysys/mf_iocache2.c: got my_b_seek() to work with WRITE_CACHE, at least the one used by the slave sql/share/romanian/errmsg.sys: accidently touched the file sql/slave.cc: converted FILE to IO_CACHE for master.info sql/slave.h: FILE -> IO_CACHE for master.info sql/sql_repl.cc: be nice to the stack - change a large stack buffer to be alloced with alloc_root in send_file()
Diffstat (limited to 'sql/slave.cc')
-rw-r--r--sql/slave.cc105
1 files changed, 67 insertions, 38 deletions
diff --git a/sql/slave.cc b/sql/slave.cc
index 87ce4b24e8a..a5a15e8c30e 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -22,6 +22,9 @@
#include <thr_alarm.h>
#include <my_dir.h>
+#define RPL_LOG_NAME (glob_mi.log_file_name[0] ? glob_mi.log_file_name :\
+ "FIRST")
+
bool slave_running = 0;
pthread_t slave_real_id;
MASTER_INFO glob_mi;
@@ -227,16 +230,17 @@ int db_ok(const char* db, I_List<i_string> &do_list,
}
}
-static void init_strvar_from_file(char* var, int max_size, FILE* f,
+static void init_strvar_from_file(char* var, int max_size, IO_CACHE* f,
char* default_val)
{
- if(fgets(var, max_size, f))
+ if(my_b_gets(f,var, max_size))
{
char* last_p = strend(var) - 1;
+ int c;
if(*last_p == '\n') *last_p = 0; // if we stopped on newline, kill it
else
- while( (fgetc(f) != '\n' && !feof(f)));
+ while( ((c=my_b_get(f)) != '\n' && c != my_b_EOF));
// if we truncated a line or stopped on last char, remove all chars
// up to and including newline
}
@@ -244,12 +248,12 @@ static void init_strvar_from_file(char* var, int max_size, FILE* f,
strmake(var, default_val, max_size);
}
-static void init_intvar_from_file(int* var, FILE* f,
+static void init_intvar_from_file(int* var, IO_CACHE* f,
int default_val)
{
char buf[32];
- if(fgets(buf, sizeof(buf), f))
+ if(my_b_gets(f, buf, sizeof(buf)))
{
*var = atoi(buf);
}
@@ -392,7 +396,7 @@ int fetch_nx_table(THD* thd, MASTER_INFO* mi)
int init_master_info(MASTER_INFO* mi)
{
- FILE* file;
+ int fd;
MY_STAT stat_area;
char fname[FN_REFLEN+128];
fn_format(fname, master_info_file, mysql_data_home, "", 4+16+32);
@@ -403,19 +407,24 @@ int init_master_info(MASTER_INFO* mi)
pthread_mutex_lock(&mi->lock);
mi->pending = 0;
+ fd = mi->fd;
if(!my_stat(fname, &stat_area, MYF(0))) // we do not want any messages
// if the file does not exist
{
- file = my_fopen(fname, O_CREAT|O_RDWR|O_BINARY, MYF(MY_WME));
- if(!file)
+ // if someone removed the file from underneath our feet, just close
+ // the old descriptor and re-create the old file
+ if(fd >= 0) my_close(fd, MYF(MY_WME));
+ if((fd = my_open(fname, O_CREAT|O_RDWR|O_BINARY, MYF(MY_WME))) < 0
+ || init_io_cache(&mi->file, fd, IO_SIZE*2, READ_CACHE, 0L,0,
+ MYF(MY_WME)))
{
pthread_mutex_unlock(&mi->lock);
return 1;
}
mi->log_file_name[0] = 0;
mi->pos = 4; // skip magic number
- mi->file = file;
+ mi->fd = fd;
if(master_host)
strmake(mi->host, master_host, sizeof(mi->host) - 1);
@@ -426,22 +435,20 @@ int init_master_info(MASTER_INFO* mi)
mi->port = master_port;
mi->connect_retry = master_connect_retry;
- if(flush_master_info(mi))
- {
- pthread_mutex_unlock(&mi->lock);
- return 1;
- }
}
else
{
- file = my_fopen(fname, O_RDWR|O_BINARY, MYF(MY_WME));
- if(!file)
+ if(fd >= 0)
+ reinit_io_cache(&mi->file, READ_CACHE, 0L,0,0);
+ else if((fd = my_open(fname, O_RDWR|O_BINARY, MYF(MY_WME))) < 0
+ || init_io_cache(&mi->file, fd, IO_SIZE*2, READ_CACHE, 0L,
+ 0, MYF(MY_WME)))
{
pthread_mutex_unlock(&mi->lock);
return 1;
}
- if(!fgets(mi->log_file_name, sizeof(mi->log_file_name), file))
+ if(!my_b_gets(&mi->file, mi->log_file_name, sizeof(mi->log_file_name)))
{
sql_print_error("Error reading log file name from master info file ");
pthread_mutex_unlock(&mi->lock);
@@ -450,7 +457,7 @@ int init_master_info(MASTER_INFO* mi)
*(strend(mi->log_file_name) - 1) = 0; // kill \n
char buf[FN_REFLEN];
- if(!fgets(buf, sizeof(buf), file))
+ if(!my_b_gets(&mi->file, buf, sizeof(buf)))
{
sql_print_error("Error reading log file position from master info file");
pthread_mutex_unlock(&mi->lock);
@@ -458,19 +465,29 @@ int init_master_info(MASTER_INFO* mi)
}
mi->pos = atoi(buf);
- mi->file = file;
- init_strvar_from_file(mi->host, sizeof(mi->host), file, master_host);
- init_strvar_from_file(mi->user, sizeof(mi->user), file, master_user);
- init_strvar_from_file(mi->password, sizeof(mi->password), file,
+ mi->fd = fd;
+ init_strvar_from_file(mi->host, sizeof(mi->host), &mi->file,
+ master_host);
+ init_strvar_from_file(mi->user, sizeof(mi->user), &mi->file,
+ master_user);
+ init_strvar_from_file(mi->password, sizeof(mi->password), &mi->file,
master_password);
- init_intvar_from_file((int*)&mi->port, file, master_port);
- init_intvar_from_file((int*)&mi->connect_retry, file,
+ init_intvar_from_file((int*)&mi->port, &mi->file, master_port);
+ init_intvar_from_file((int*)&mi->connect_retry, &mi->file,
master_connect_retry);
}
mi->inited = 1;
+ // now change the cache from READ to WRITE - must do this
+ // before flush_master_info
+ reinit_io_cache(&mi->file, WRITE_CACHE, 0L,0,1);
+ if(flush_master_info(mi))
+ {
+ pthread_mutex_unlock(&mi->lock);
+ return 1;
+ }
pthread_mutex_unlock(&mi->lock);
return 0;
@@ -521,19 +538,14 @@ int show_master_info(THD* thd)
int flush_master_info(MASTER_INFO* mi)
{
- FILE* file = mi->file;
+ IO_CACHE* file = &mi->file;
char lbuf[22];
- if(my_fseek(file, 0L, MY_SEEK_SET, MYF(MY_WME)) == MY_FILEPOS_ERROR ||
- fprintf(file, "%s\n%s\n%s\n%s\n%s\n%d\n%d\n",
+ my_b_seek(file, 0L);
+ my_b_printf(file, "%s\n%s\n%s\n%s\n%s\n%d\n%d\n",
mi->log_file_name, llstr(mi->pos, lbuf), mi->host, mi->user, mi->password,
- mi->port, mi->connect_retry) < 0 ||
- fflush(file))
- {
- sql_print_error("Write error flushing master_info: %d", errno);
- return 1;
- }
-
+ mi->port, mi->connect_retry);
+ flush_io_cache(file);
return 0;
}
@@ -694,7 +706,8 @@ server_errno=%d)",
if(len == 1)
{
- sql_print_error("Received 0 length packet from server, looks like master shutdown: %s (%d)",
+ sql_print_error("Slave: received 0 length packet from server, apparent\
+ master shutdown: %s (%d)",
mc_mysql_error(mysql), read_errno);
return packet_error;
}
@@ -1006,7 +1019,16 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused)))
}
thd->proc_info = "connecting to master";
+#ifndef DBUG_OFF
+ sql_print_error("Slave thread initialized");
+#endif
safe_connect(thd, mysql, &glob_mi);
+ // always report status on startup, even if we are not in debug
+ sql_print_error("Slave: connected to master '%s@%s:%d',\
+ replication started in log '%s' at position %ld", glob_mi.user,
+ glob_mi.host, glob_mi.port,
+ RPL_LOG_NAME,
+ glob_mi.pos);
while(!slave_killed(thd))
{
@@ -1033,7 +1055,8 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused)))
thd->proc_info = "reconnecting after a failed dump request";
sql_print_error("Slave: failed dump request, reconnecting to \
-try again, master_log_pos=%ld", last_failed_pos = glob_mi.pos );
+try again, log '%s' at postion %ld", RPL_LOG_NAME,
+ last_failed_pos = glob_mi.pos );
safe_reconnect(thd, mysql, &glob_mi);
if(slave_killed(thd))
goto err;
@@ -1063,7 +1086,8 @@ try again, master_log_pos=%ld", last_failed_pos = glob_mi.pos );
goto err;
thd->proc_info = "reconnecting after a failed read";
sql_print_error("Slave: Failed reading log event, \
-reconnecting to retry, master_log_pos=%ld", last_failed_pos = glob_mi.pos);
+reconnecting to retry, log '%s' position %ld", RPL_LOG_NAME,
+ last_failed_pos = glob_mi.pos);
safe_reconnect(thd, mysql, &glob_mi);
if(slave_killed(thd))
goto err;
@@ -1074,7 +1098,8 @@ reconnecting to retry, master_log_pos=%ld", last_failed_pos = glob_mi.pos);
if(exec_event(thd, &mysql->net, &glob_mi, event_len))
{
sql_print_error("Error running query, slave aborted. Fix the problem, and re-start\
- the slave thread with mysqladmin start-slave");
+ the slave thread with mysqladmin start-slave - log '%s' position %ld",
+ RPL_LOG_NAME, glob_mi.pos);
goto err;
// there was an error running the query
// abort the slave thread, when the problem is fixed, the user
@@ -1108,6 +1133,10 @@ reconnecting to retry, master_log_pos=%ld", last_failed_pos = glob_mi.pos);
error = 0;
err:
+ // print the current replication position
+ sql_print_error("Slave thread exiting, replication stopped in log '%s' at \
+position %ld",
+ RPL_LOG_NAME, glob_mi.pos);
thd->query = thd->db = 0; // extra safety
if(mysql)
{