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

Ugly merge! But I am not done yet - there are a number of things I need to fix

before I can push
parents d7ad2cbe 56129ce6
...@@ -245,6 +245,7 @@ libmysqld/get_password.c ...@@ -245,6 +245,7 @@ libmysqld/get_password.c
libmysqld/ha_berkeley.cc libmysqld/ha_berkeley.cc
libmysqld/ha_heap.cc libmysqld/ha_heap.cc
libmysqld/ha_innobase.cc libmysqld/ha_innobase.cc
libmysqld/ha_innodb.cc
libmysqld/ha_isam.cc libmysqld/ha_isam.cc
libmysqld/ha_isammrg.cc libmysqld/ha_isammrg.cc
libmysqld/ha_myisam.cc libmysqld/ha_myisam.cc
...@@ -344,7 +345,13 @@ mysql-test/gmon.out ...@@ -344,7 +345,13 @@ mysql-test/gmon.out
mysql-test/install_test_db mysql-test/install_test_db
mysql-test/mysql-test-run mysql-test/mysql-test-run
mysql-test/r/*.reject mysql-test/r/*.reject
mysql-test/r/rpl000002.eval
mysql-test/r/rpl000014.eval
mysql-test/r/rpl000015.eval
mysql-test/r/rpl000016.eval
mysql-test/r/rpl_log.eval mysql-test/r/rpl_log.eval
mysql-test/r/slave-running.eval
mysql-test/r/slave-stopped.eval
mysql-test/share/mysql mysql-test/share/mysql
mysql-test/var/* mysql-test/var/*
mysql.kdevprj mysql.kdevprj
...@@ -451,4 +458,3 @@ vio/test-ssl ...@@ -451,4 +458,3 @@ vio/test-ssl
vio/test-sslclient vio/test-sslclient
vio/test-sslserver vio/test-sslserver
vio/viotest-ssl vio/viotest-ssl
libmysqld/ha_innodb.cc
...@@ -75,14 +75,11 @@ bin-dist: all ...@@ -75,14 +75,11 @@ bin-dist: all
$(top_builddir)/scripts/make_binary_distribution $(top_builddir)/scripts/make_binary_distribution
tags: tags:
rm -f TAGS support-files/build-tags
find -not -path \*SCCS\* -and \
\( -name \*.cc -or -name \*.h -or -name \*.yy -or -name \*.c \) \
-print -exec etags -o TAGS --append {} \;
.PHONY: init-db bin-dist .PHONY: init-db bin-dist
# Test installation # Test installation
test: test:
cd mysql-test ; ./mysql-test-run cd mysql-test ; ./mysql-test-run
...@@ -293,35 +293,105 @@ typedef int (*IO_CACHE_CALLBACK)(struct st_io_cache*); ...@@ -293,35 +293,105 @@ typedef int (*IO_CACHE_CALLBACK)(struct st_io_cache*);
typedef struct st_io_cache /* Used when cacheing files */ typedef struct st_io_cache /* Used when cacheing files */
{ {
/* pos_in_file is offset in file corresponding to the first byte of
byte* buffer. end_of_file is the offset of end of file for READ_CACHE
and WRITE_CACHE. For SEQ_READ_APPEND it the maximum of the actual
end of file and the position represented by read_end.
*/
my_off_t pos_in_file,end_of_file; my_off_t pos_in_file,end_of_file;
/* read_pos points to current read position in the buffer
read_end is the non-inclusive boundary in the buffer for the currently
valid read area
buffer is the read buffer
not sure about request_pos except that it is used in async_io
*/
byte *read_pos,*read_end,*buffer,*request_pos; byte *read_pos,*read_end,*buffer,*request_pos;
/* write_buffer is used only in WRITE caches and in SEQ_READ_APPEND to
buffer writes
append_read_pos is only used in SEQ_READ_APPEND, and points to the
current read position in the write buffer. Note that reads in
SEQ_READ_APPEND caches can happen from both read buffer (byte* buffer),
and write buffer (byte* write_buffer).
write_pos points to current write position in the write buffer and
write_end is the non-inclusive boundary of the valid write area
*/
byte *write_buffer, *append_read_pos, *write_pos, *write_end; byte *write_buffer, *append_read_pos, *write_pos, *write_end;
/* current_pos and current_end are convenience variables used by
my_b_tell() and other routines that need to know the current offset
current_pos points to &write_pos, and current_end to &write_end in a
WRITE_CACHE, and &read_pos and &read_end respectively otherwise
*/
byte **current_pos, **current_end; byte **current_pos, **current_end;
/* The lock is for append buffer used in READ_APPEND cache */ /* The lock is for append buffer used in SEQ_READ_APPEND cache */
#ifdef THREAD #ifdef THREAD
pthread_mutex_t append_buffer_lock; pthread_mutex_t append_buffer_lock;
/* need mutex copying from append buffer to read buffer */ /* need mutex copying from append buffer to read buffer */
#endif #endif
/* a caller will use my_b_read() macro to read from the cache
if the data is already in cache, it will be simply copied with
memcpy() and internal variables will be accordinging updated with
no functions invoked. However, if the data is not fully in the cache,
my_b_read() will call read_function to fetch the data. read_function
must never be invoked directly
*/
int (*read_function)(struct st_io_cache *,byte *,uint); int (*read_function)(struct st_io_cache *,byte *,uint);
/* same idea as in the case of read_function, except my_b_write() needs to
be replaced with my_b_append() for a SEQ_READ_APPEND cache
*/
int (*write_function)(struct st_io_cache *,const byte *,uint); int (*write_function)(struct st_io_cache *,const byte *,uint);
/* specifies the type of the cache. Depending on the type of the cache
certain operations might not be available and yield unpredicatable
results. Details to be documented later
*/
enum cache_type type; enum cache_type type;
/* callbacks when the actual read I/O happens */ /* callbacks when the actual read I/O happens. These were added and
are currently used for binary logging of LOAD DATA INFILE - when a
block is read from the file, we create a block create/append event, and
when IO_CACHE is closed, we create an end event. These functions could,
of course be used for other things
*/
IO_CACHE_CALLBACK pre_read; IO_CACHE_CALLBACK pre_read;
IO_CACHE_CALLBACK post_read; IO_CACHE_CALLBACK post_read;
IO_CACHE_CALLBACK pre_close; IO_CACHE_CALLBACK pre_close;
void* arg; /* for use by pre/post_read */ void* arg; /* for use by pre/post_read */
char *file_name; /* if used with 'open_cached_file' */ char *file_name; /* if used with 'open_cached_file' */
char *dir,*prefix; char *dir,*prefix;
File file; File file; /* file descriptor */
/* seek_not_done is set by my_b_seek() to inform the upcoming read/write
operation that a seek needs to be preformed prior to the actual I/O
error is 0 if the cache operation was successful, -1 if there was a
"hard" error, and the actual number of I/O-ed bytes if the read/write was
partial
*/
int seek_not_done,error; int seek_not_done,error;
/* buffer_length is the size of memory allocated for buffer or write_buffer
read_length is the same as buffer_length except when we use async io
not sure why we need it
*/
uint buffer_length,read_length; uint buffer_length,read_length;
myf myflags; /* Flags used to my_read/my_write */ myf myflags; /* Flags used to my_read/my_write */
/* /*
alloced_buffer is 1 if the buffer was allocated by init_io_cache() and
0 if it was supplied by the user
Currently READ_NET is the only one that will use a buffer allocated Currently READ_NET is the only one that will use a buffer allocated
somewhere else somewhere else
*/ */
my_bool alloced_buffer; my_bool alloced_buffer;
/* init_count is incremented every time we call init_io_cache()
It is not reset in end_io_cache(). This variable
was introduced for slave relay logs - RELAY_LOG_INFO stores a pointer
to IO_CACHE that could in some cases refer to the IO_CACHE of the
currently active relay log. The IO_CACHE then could be closed,
re-opened and start pointing to a different log file. In that case,
we could not know reliably if this happened without init_count
one must be careful with bzero() prior to the subsequent init_io_cache()
call
*/
int init_count;
#ifdef HAVE_AIOWAIT #ifdef HAVE_AIOWAIT
/* as inidicated by ifdef, this is for async I/O, we will have
Sinisa comment this some time
*/
uint inited; uint inited;
my_off_t aio_read_pos; my_off_t aio_read_pos;
my_aio_result aio_result; my_aio_result aio_result;
...@@ -366,6 +436,8 @@ typedef int (*qsort2_cmp)(const void *, const void *, const void *); ...@@ -366,6 +436,8 @@ typedef int (*qsort2_cmp)(const void *, const void *, const void *);
#define my_b_tell(info) ((info)->pos_in_file + \ #define my_b_tell(info) ((info)->pos_in_file + \
(uint) (*(info)->current_pos - (info)->request_pos)) (uint) (*(info)->current_pos - (info)->request_pos))
#define my_b_append_tell(info) ((info)->end_of_file + \
(uint) ((info)->write_pos - (info)->write_buffer))
#define my_b_bytes_in_cache(info) (uint) (*(info)->current_end - \ #define my_b_bytes_in_cache(info) (uint) (*(info)->current_end - \
*(info)->current_pos) *(info)->current_pos)
......
...@@ -402,8 +402,8 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups) ...@@ -402,8 +402,8 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups)
(void) pthread_mutex_init(&LOCK_bytes_sent,MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_bytes_sent,MY_MUTEX_INIT_FAST);
(void) pthread_mutex_init(&LOCK_bytes_received,MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_bytes_received,MY_MUTEX_INIT_FAST);
(void) pthread_mutex_init(&LOCK_timezone,MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_timezone,MY_MUTEX_INIT_FAST);
(void) pthread_mutex_init(&LOCK_binlog_update, MY_MUTEX_INIT_FAST); // QQ NOT USED (void) pthread_mutex_init(&LOCK_slave_io, MY_MUTEX_INIT_FAST);
(void) pthread_mutex_init(&LOCK_slave, MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_slave_sql, MY_MUTEX_INIT_FAST);
(void) pthread_mutex_init(&LOCK_server_id, MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_server_id, MY_MUTEX_INIT_FAST);
(void) pthread_mutex_init(&LOCK_user_conn, MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_user_conn, MY_MUTEX_INIT_FAST);
(void) pthread_cond_init(&COND_thread_count,NULL); (void) pthread_cond_init(&COND_thread_count,NULL);
...@@ -412,8 +412,11 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups) ...@@ -412,8 +412,11 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups)
(void) pthread_cond_init(&COND_flush_thread_cache,NULL); (void) pthread_cond_init(&COND_flush_thread_cache,NULL);
(void) pthread_cond_init(&COND_manager,NULL); (void) pthread_cond_init(&COND_manager,NULL);
(void) pthread_cond_init(&COND_binlog_update, NULL); (void) pthread_cond_init(&COND_binlog_update, NULL);
(void) pthread_cond_init(&COND_slave_stopped, NULL); (void) pthread_cond_init(&COND_slave_log_update, NULL);
(void) pthread_cond_init(&COND_slave_start, NULL); (void) pthread_cond_init(&COND_slave_sql_stop, NULL);
(void) pthread_cond_init(&COND_slave_sql_start, NULL);
(void) pthread_cond_init(&COND_slave_sql_stop, NULL);
(void) pthread_cond_init(&COND_slave_sql_start, NULL);
if (set_default_charset_by_name(default_charset, MYF(MY_WME))) if (set_default_charset_by_name(default_charset, MYF(MY_WME)))
{ {
......
...@@ -7,22 +7,22 @@ show master status; ...@@ -7,22 +7,22 @@ show master status;
File Position Binlog_do_db Binlog_ignore_db File Position Binlog_do_db Binlog_ignore_db
master-bin.001 79 master-bin.001 79
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Last_log_seq Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos
127.0.0.1 root MASTER_PORT 1 master-bin.001 79 Yes 0 0 1 127.0.0.1 root 9306 1 master-bin.001 79 mysql-relay-bin.002 120 master-bin.001 Yes Yes 0 0 79
change master to master_log_pos=73; change master to master_log_pos=73;
slave stop; slave stop;
change master to master_log_pos=73; change master to master_log_pos=73;
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Last_log_seq Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos
127.0.0.1 root MASTER_PORT 1 master-bin.001 73 No 0 0 1 127.0.0.1 root 9306 1 master-bin.001 73 mysql-relay-bin.001 4 master-bin.001 No No 0 0 73
slave start; slave start;
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Last_log_seq Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos
127.0.0.1 root MASTER_PORT 1 master-bin.001 73 Yes 0 0 1 127.0.0.1 root 9306 1 master-bin.001 73 mysql-relay-bin.001 4 master-bin.001 Yes Yes 0 0 73
change master to master_log_pos=173; change master to master_log_pos=173;
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Last_log_seq Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos
127.0.0.1 root MASTER_PORT 1 master-bin.001 173 Yes 0 0 1 127.0.0.1 root 9306 1 master-bin.001 173 mysql-relay-bin.001 4 master-bin.001 Yes Yes 0 0 173
show master status; show master status;
File Position Binlog_do_db Binlog_ignore_db File Position Binlog_do_db Binlog_ignore_db
master-bin.001 79 master-bin.001 79
......
...@@ -4,21 +4,21 @@ File Position Binlog_do_db Binlog_ignore_db ...@@ -4,21 +4,21 @@ File Position Binlog_do_db Binlog_ignore_db
master-bin.001 79 master-bin.001 79
reset slave; reset slave;
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Last_log_seq Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos
0 0 0 No 0 0 0 0 0 0 0 No No 0 0 0
change master to master_host='127.0.0.1'; change master to master_host='127.0.0.1';
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Last_log_seq Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos
127.0.0.1 test MASTER_PORT 60 4 No 0 0 0 127.0.0.1 test 3306 60 4 mysql-relay-bin.001 4 No No 0 0 0
change master to master_host='127.0.0.1',master_user='root', change master to master_host='127.0.0.1',master_user='root',
master_password='',master_port=MASTER_PORT; master_password='',master_port=9306;
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Last_log_seq Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos
127.0.0.1 root MASTER_PORT 60 4 No 0 0 0 127.0.0.1 root 9306 60 4 mysql-relay-bin.001 4 No No 0 0 0
slave start; slave start;
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Last_log_seq Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos
127.0.0.1 root MASTER_PORT 60 master-bin.001 79 Yes 0 0 1 127.0.0.1 root 9306 60 master-bin.001 79 mysql-relay-bin.001 120 master-bin.001 Yes Yes 0 0 79
drop table if exists t1; drop table if exists t1;
create table t1 (n int); create table t1 (n int);
insert into t1 values (10),(45),(90); insert into t1 values (10),(45),(90);
......
...@@ -2,11 +2,11 @@ slave start; ...@@ -2,11 +2,11 @@ slave start;
Could not initialize master info structure, check permisions on master.info Could not initialize master info structure, check permisions on master.info
slave start; slave start;
Could not initialize master info structure, check permisions on master.info Could not initialize master info structure, check permisions on master.info
change master to master_host='127.0.0.1',master_port=MASTER_PORT, change master to master_host='127.0.0.1',master_port=9306,
master_user='root'; master_user='root';
Could not initialize master info Could not initialize master info
reset slave; reset slave;
change master to master_host='127.0.0.1',master_port=MASTER_PORT, change master to master_host='127.0.0.1',master_port=9306,
master_user='root'; master_user='root';
reset master; reset master;
slave start; slave start;
...@@ -14,8 +14,8 @@ drop table if exists t1; ...@@ -14,8 +14,8 @@ drop table if exists t1;
create table t1 (s text); create table t1 (s text);
insert into t1 values('Could not break slave'),('Tried hard'); insert into t1 values('Could not break slave'),('Tried hard');
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Last_log_seq Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos
127.0.0.1 root MASTER_PORT 60 master-bin.001 234 Yes 0 0 3 127.0.0.1 root 9306 60 master-bin.001 234 mysql-relay-bin.001 275 master-bin.001 Yes Yes 0 0 234
select * from t1; select * from t1;
s s
Could not break slave Could not break slave
...@@ -42,8 +42,8 @@ Log_name ...@@ -42,8 +42,8 @@ Log_name
master-bin.003 master-bin.003
insert into t2 values (65); insert into t2 values (65);
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Last_log_seq Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos
127.0.0.1 root MASTER_PORT 60 master-bin.003 155 Yes 0 0 3 127.0.0.1 root 9306 60 master-bin.003 155 mysql-relay-bin.001 793 master-bin.003 Yes Yes 0 0 155
select * from t2; select * from t2;
m m
34 34
...@@ -65,8 +65,8 @@ master-bin.006 445 ...@@ -65,8 +65,8 @@ master-bin.006 445
slave stop; slave stop;
slave start; slave start;
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Last_log_seq Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos
127.0.0.1 root MASTER_PORT 60 master-bin.006 445 Yes 0 0 7 127.0.0.1 root 9306 60 master-bin.006 445 mysql-relay-bin.004 1376 master-bin.006 Yes Yes 0 0 445
lock tables t3 read; lock tables t3 read;
select count(*) from t3 where n >= 4; select count(*) from t3 where n >= 4;
count(*) count(*)
......
...@@ -15,48 +15,48 @@ create table t1 (word char(20) not null); ...@@ -15,48 +15,48 @@ create table t1 (word char(20) not null);
load data infile '../../std_data/words.dat' into table t1; load data infile '../../std_data/words.dat' into table t1;
drop table t1; drop table t1;
show binlog events; show binlog events;
Log_name Pos Event_type Server_id Log_seq Info Log_name Pos Event_type Server_id Orig_log_pos Info
master-bin.001 4 Start 1 1 Server ver: VERSION, Binlog ver: 2 master-bin.001 4 Start 1 4 Server ver: 4.0.1-alpha-debug-log, Binlog ver: 3
master-bin.001 79 Query 1 2 use test; create table t1(n int not null auto_increment primary key) master-bin.001 79 Query 1 79 use test; create table t1(n int not null auto_increment primary key)
master-bin.001 172 Intvar 1 3 INSERT_ID=1 master-bin.001 172 Intvar 1 172 INSERT_ID=1
master-bin.001 200 Query 1 4 use test; insert into t1 values (NULL) master-bin.001 200 Query 1 200 use test; insert into t1 values (NULL)
master-bin.001 263 Query 1 5 use test; drop table t1 master-bin.001 263 Query 1 263 use test; drop table t1
master-bin.001 311 Query 1 6 use test; create table t1 (word char(20) not null) master-bin.001 311 Query 1 311 use test; create table t1 (word char(20) not null)
master-bin.001 386 Create_file 1 7 db=test;table=t1;file_id=1;block_len=81 master-bin.001 386 Create_file 1 386 db=test;table=t1;file_id=1;block_len=81
master-bin.001 556 Exec_load 1 8 ;file_id=1 master-bin.001 556 Exec_load 1 556 ;file_id=1
master-bin.001 579 Query 1 9 use test; drop table t1 master-bin.001 579 Query 1 579 use test; drop table t1
show binlog events from 79 limit 1; show binlog events from 79 limit 1;
Log_name Pos Event_type Server_id Log_seq Info Log_name Pos Event_type Server_id Orig_log_pos Info
master-bin.001 79 Query 1 2 use test; create table t1(n int not null auto_increment primary key) master-bin.001 79 Query 1 79 use test; create table t1(n int not null auto_increment primary key)
show binlog events from 79 limit 2; show binlog events from 79 limit 2;
Log_name Pos Event_type Server_id Log_seq Info Log_name Pos Event_type Server_id Orig_log_pos Info
master-bin.001 79 Query 1 2 use test; create table t1(n int not null auto_increment primary key) master-bin.001 79 Query 1 79 use test; create table t1(n int not null auto_increment primary key)
master-bin.001 172 Intvar 1 3 INSERT_ID=1 master-bin.001 172 Intvar 1 172 INSERT_ID=1
show binlog events from 79 limit 2,1; show binlog events from 79 limit 2,1;
Log_name Pos Event_type Server_id Log_seq Info Log_name Pos Event_type Server_id Orig_log_pos Info
master-bin.001 200 Query 1 4 use test; insert into t1 values (NULL) master-bin.001 200 Query 1 200 use test; insert into t1 values (NULL)
flush logs; flush logs;
create table t1 (n int); create table t1 (n int);
insert into t1 values (1); insert into t1 values (1);
drop table t1; drop table t1;
show binlog events; show binlog events;
Log_name Pos Event_type Server_id Log_seq Info Log_name Pos Event_type Server_id Orig_log_pos Info
master-bin.001 4 Start 1 1 Server ver: VERSION, Binlog ver: 2 master-bin.001 4 Start 1 4 Server ver: 4.0.1-alpha-debug-log, Binlog ver: 3
master-bin.001 79 Query 1 2 use test; create table t1(n int not null auto_increment primary key) master-bin.001 79 Query 1 79 use test; create table t1(n int not null auto_increment primary key)
master-bin.001 172 Intvar 1 3 INSERT_ID=1 master-bin.001 172 Intvar 1 172 INSERT_ID=1
master-bin.001 200 Query 1 4 use test; insert into t1 values (NULL) master-bin.001 200 Query 1 200 use test; insert into t1 values (NULL)
master-bin.001 263 Query 1 5 use test; drop table t1 master-bin.001 263 Query 1 263 use test; drop table t1
master-bin.001 311 Query 1 6 use test; create table t1 (word char(20) not null) master-bin.001 311 Query 1 311 use test; create table t1 (word char(20) not null)
master-bin.001 386 Create_file 1 7 db=test;table=t1;file_id=1;block_len=81 master-bin.001 386 Create_file 1 386 db=test;table=t1;file_id=1;block_len=81
master-bin.001 556 Exec_load 1 8 ;file_id=1 master-bin.001 556 Exec_load 1 556 ;file_id=1
master-bin.001 579 Query 1 9 use test; drop table t1 master-bin.001 579 Query 1 579 use test; drop table t1
master-bin.001 627 Rotate 1 10 master-bin.002;pos=4 master-bin.001 627 Rotate 1 627 master-bin.002;pos=4
master-bin.001 668 Stop 1 11 master-bin.001 668 Stop 1 668
show binlog events in 'master-bin.002'; show binlog events in 'master-bin.002';
Log_name Pos Event_type Server_id Log_seq Info Log_name Pos Event_type Server_id Orig_log_pos Info
master-bin.002 4 Query 1 1 use test; create table t1 (n int) master-bin.002 4 Query 1 4 use test; create table t1 (n int)
master-bin.002 62 Query 1 2 use test; insert into t1 values (1) master-bin.002 62 Query 1 62 use test; insert into t1 values (1)
master-bin.002 122 Query 1 3 use test; drop table t1 master-bin.002 122 Query 1 122 use test; drop table t1
show master logs; show master logs;
Log_name Log_name
master-bin.001 master-bin.001
...@@ -67,32 +67,45 @@ Log_name ...@@ -67,32 +67,45 @@ Log_name
slave-bin.001 slave-bin.001
slave-bin.002 slave-bin.002
show binlog events in 'slave-bin.001' from 4; show binlog events in 'slave-bin.001' from 4;
Log_name Pos Event_type Server_id Orig_log_pos Info
slave-bin.001 4 Start 2 4 Server ver: 4.0.1-alpha-debug-log, Binlog ver: 3
slave-bin.001 79 Slave 2 79 host=127.0.0.1,port=9306,log=master-bin.001,pos=4
slave-bin.001 132 Query 1 79 use test; create table t1(n int not null auto_increment primary key)
slave-bin.001 225 Intvar 1 200 INSERT_ID=1
slave-bin.001 253 Query 1 200 use test; insert into t1 values (NULL)
slave-bin.001 316 Query 1 263 use test; drop table t1
slave-bin.001 364 Query 1 311 use test; create table t1 (word char(20) not null)
slave-bin.001 439 Create_file 1 386 db=test;table=t1;file_id=1;block_len=81
slave-bin.001 618 Exec_load 1 556 ;file_id=1
slave-bin.001 641 Query 1 579 use test; drop table t1
slave-bin.001 689 Rotate 1 627 slave-bin.002;pos=4; forced by master
slave-bin.001 729 Stop 2 729
show binlog events in 'slave-bin.002' from 4; show binlog events in 'slave-bin.002' from 4;
Log_name Pos Event_type Server_id Log_seq Info Log_name Pos Event_type Server_id Orig_log_pos Info
slave-bin.002 4 Slave 2 10 host=127.0.0.1,port=MASTER_PORT,log=master-bin.002,pos=4 slave-bin.002 4 Slave 2 627 host=127.0.0.1,port=9306,log=master-bin.002,pos=4
slave-bin.002 57 Query 1 1 use test; create table t1 (n int) slave-bin.002 57 Query 1 4 use test; create table t1 (n int)
slave-bin.002 115 Query 1 2 use test; insert into t1 values (1) slave-bin.002 115 Query 1 62 use test; insert into t1 values (1)
slave-bin.002 175 Query 1 3 use test; drop table t1 slave-bin.002 175 Query 1 122 use test; drop table t1
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Last_log_seq Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos
127.0.0.1 root MASTER_PORT 1 master-bin.002 170 Yes 0 0 3 127.0.0.1 root 9306 1 master-bin.002 170 mysql-relay-bin.002 935 master-bin.002 Yes Yes 0 0 170
show new master for slave with master_log_file='master-bin.001' and show new master for slave with master_log_file='master-bin.001' and
master_log_pos=4 and master_log_seq=1 and master_server_id=1; master_log_pos=4 and master_server_id=1;
Log_name Log_pos Log_name Log_pos
slave-bin.001 132 slave-bin.001 132
show new master for slave with master_log_file='master-bin.001' and show new master for slave with master_log_file='master-bin.001' and
master_log_pos=79 and master_log_seq=2 and master_server_id=1; master_log_pos=79 and master_server_id=1;
Log_name Log_pos Log_name Log_pos
slave-bin.001 225 slave-bin.001 225
show new master for slave with master_log_file='master-bin.001' and show new master for slave with master_log_file='master-bin.001' and
master_log_pos=311 and master_log_seq=6 and master_server_id=1; master_log_pos=311 and master_server_id=1;
Log_name Log_pos Log_name Log_pos
slave-bin.001 439 slave-bin.001 439
show new master for slave with master_log_file='master-bin.002' and show new master for slave with master_log_file='master-bin.002' and
master_log_pos=4 and master_log_seq=1 and master_server_id=1; master_log_pos=4 and master_server_id=1;
Log_name Log_pos Log_name Log_pos
slave-bin.002 57 slave-bin.002 57
show new master for slave with master_log_file='master-bin.002' and show new master for slave with master_log_file='master-bin.002' and
master_log_pos=137 and master_log_seq=3 and master_server_id=1; master_log_pos=122 and master_server_id=1;
Log_name Log_pos Log_name Log_pos
slave-bin.002 223 slave-bin.002 223
#! /bin/sh
# A shortcut for resolving stacks when debugging when
# we cannot duplicate the crash in a debugger and have to
# resort to using stack traces
nm --numeric-sort ../sql/mysqld > var/tmp/mysqld.sym
echo "Please type or paste the numeric stack trace,Ctrl-C to quit:"
../extra/resolve_stack_dump -s var/tmp/mysqld.sym
-O max_binlog_size=2048
rm -f $MYSQL_TEST_DIR/var/slave-data/master.info rm -f $MYSQL_TEST_DIR/var/slave-data/master.info
rm -f $MYSQL_TEST_DIR/var/slave-data/*relay*
rm -f $MYSQL_TEST_DIR/var/slave-data/*relay*
cat > $MYSQL_TEST_DIR/var/slave-data/master.info <<EOF cat > $MYSQL_TEST_DIR/var/slave-data/master.info <<EOF
master-bin.001 master-bin.001
4 4
......
...@@ -46,12 +46,12 @@ show binlog events in 'slave-bin.002' from 4; ...@@ -46,12 +46,12 @@ show binlog events in 'slave-bin.002' from 4;
--replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT --replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT
show slave status; show slave status;
show new master for slave with master_log_file='master-bin.001' and show new master for slave with master_log_file='master-bin.001' and
master_log_pos=4 and master_log_seq=1 and master_server_id=1; master_log_pos=4 and master_server_id=1;
show new master for slave with master_log_file='master-bin.001' and show new master for slave with master_log_file='master-bin.001' and
master_log_pos=79 and master_log_seq=2 and master_server_id=1; master_log_pos=79 and master_server_id=1;
show new master for slave with master_log_file='master-bin.001' and show new master for slave with master_log_file='master-bin.001' and
master_log_pos=311 and master_log_seq=6 and master_server_id=1; master_log_pos=311 and master_server_id=1;
show new master for slave with master_log_file='master-bin.002' and show new master for slave with master_log_file='master-bin.002' and
master_log_pos=4 and master_log_seq=1 and master_server_id=1; master_log_pos=4 and master_server_id=1;
show new master for slave with master_log_file='master-bin.002' and show new master for slave with master_log_file='master-bin.002' and
master_log_pos=137 and master_log_seq=3 and master_server_id=1; master_log_pos=122 and master_server_id=1;
...@@ -122,6 +122,8 @@ int init_io_cache(IO_CACHE *info, File file, uint cachesize, ...@@ -122,6 +122,8 @@ int init_io_cache(IO_CACHE *info, File file, uint cachesize,
info->pos_in_file= seek_offset; info->pos_in_file= seek_offset;
info->pre_close = info->pre_read = info->post_read = 0; info->pre_close = info->pre_read = info->post_read = 0;
info->arg = 0; info->arg = 0;
info->init_count++; /* we assume the user had set it to 0 prior to
first call */
info->alloced_buffer = 0; info->alloced_buffer = 0;
info->buffer=0; info->buffer=0;
info->seek_not_done= test(file >= 0); info->seek_not_done= test(file >= 0);
...@@ -446,11 +448,13 @@ int _my_b_seq_read(register IO_CACHE *info, byte *Buffer, uint Count) ...@@ -446,11 +448,13 @@ int _my_b_seq_read(register IO_CACHE *info, byte *Buffer, uint Count)
info->end_of_file) info->end_of_file)
goto read_append_buffer; goto read_append_buffer;
if (info->seek_not_done) /*
{ /* File touched, do seek */ With read-append cache we must always do a seek before we read,
VOID(my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0))); because the write could have moved the file pointer astray
info->seek_not_done=0; */
} VOID(my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0)));
info->seek_not_done=0;
diff_length=(uint) (pos_in_file & (IO_SIZE-1)); diff_length=(uint) (pos_in_file & (IO_SIZE-1));
/* now the second stage begins - read from file descriptor */ /* now the second stage begins - read from file descriptor */
...@@ -506,6 +510,13 @@ int _my_b_seq_read(register IO_CACHE *info, byte *Buffer, uint Count) ...@@ -506,6 +510,13 @@ int _my_b_seq_read(register IO_CACHE *info, byte *Buffer, uint Count)
memcpy(Buffer,info->buffer,(size_t) length); memcpy(Buffer,info->buffer,(size_t) length);
Count -= length; Count -= length;
Buffer += length; Buffer += length;
/*
added the line below to make
DBUG_ASSERT(pos_in_file==info->end_of_file) pass.
otherwise this does not appear to be needed
*/
pos_in_file += length;
goto read_append_buffer; goto read_append_buffer;
} }
} }
...@@ -527,10 +538,13 @@ read_append_buffer: ...@@ -527,10 +538,13 @@ read_append_buffer:
/* First copy the data to Count */ /* First copy the data to Count */
uint len_in_buff = (uint) (info->write_pos - info->append_read_pos); uint len_in_buff = (uint) (info->write_pos - info->append_read_pos);
uint copy_len; uint copy_len;
uint transfer_len;
DBUG_ASSERT(info->append_read_pos <= info->write_pos); DBUG_ASSERT(info->append_read_pos <= info->write_pos);
DBUG_ASSERT(pos_in_file == info->end_of_file); /*
TODO: figure out if the below assert is needed or correct.
*/
DBUG_ASSERT(pos_in_file == info->end_of_file);
copy_len=min(Count, len_in_buff); copy_len=min(Count, len_in_buff);
memcpy(Buffer, info->append_read_pos, copy_len); memcpy(Buffer, info->append_read_pos, copy_len);
info->append_read_pos += copy_len; info->append_read_pos += copy_len;
...@@ -540,11 +554,12 @@ read_append_buffer: ...@@ -540,11 +554,12 @@ read_append_buffer:
/* Fill read buffer with data from write buffer */ /* Fill read buffer with data from write buffer */
memcpy(info->buffer, info->append_read_pos, memcpy(info->buffer, info->append_read_pos,
(size_t) (len_in_buff - copy_len)); (size_t) (transfer_len=len_in_buff - copy_len));
info->read_pos= info->buffer; info->read_pos= info->buffer;
info->read_end= info->buffer+(len_in_buff - copy_len); info->read_end= info->buffer+transfer_len;
info->append_read_pos=info->write_pos; info->append_read_pos=info->write_pos;
info->pos_in_file+=len_in_buff; info->pos_in_file=pos_in_file+copy_len;
info->end_of_file+=len_in_buff;
} }
unlock_append_buffer(info); unlock_append_buffer(info);
return Count ? 1 : 0; return Count ? 1 : 0;
...@@ -886,12 +901,10 @@ int flush_io_cache(IO_CACHE *info) ...@@ -886,12 +901,10 @@ int flush_io_cache(IO_CACHE *info)
if ((length=(uint) (info->write_pos - info->write_buffer))) if ((length=(uint) (info->write_pos - info->write_buffer)))
{ {
pos_in_file=info->pos_in_file; pos_in_file=info->pos_in_file;
if (append_cache) /* if we have append cache, we always open the file with
{ O_APPEND which moves the pos to EOF automatically on every write
pos_in_file=info->end_of_file; */
info->seek_not_done=1; if (!append_cache && info->seek_not_done)
}
if (info->seek_not_done)
{ /* File touched, do seek */ { /* File touched, do seek */
if (my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0)) == if (my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0)) ==
MY_FILEPOS_ERROR) MY_FILEPOS_ERROR)
...@@ -901,20 +914,24 @@ int flush_io_cache(IO_CACHE *info) ...@@ -901,20 +914,24 @@ int flush_io_cache(IO_CACHE *info)
if (!append_cache) if (!append_cache)
info->seek_not_done=0; info->seek_not_done=0;
} }
info->write_pos= info->write_buffer;
if (!append_cache) if (!append_cache)
info->pos_in_file+=length; info->pos_in_file+=length;
info->write_end= (info->write_buffer+info->buffer_length- info->write_end= (info->write_buffer+info->buffer_length-
((pos_in_file+length) & (IO_SIZE-1))); ((pos_in_file+length) & (IO_SIZE-1)));
/* Set this to be used if we are using SEQ_READ_APPEND */
info->append_read_pos = info->write_buffer;
if (my_write(info->file,info->write_buffer,length, if (my_write(info->file,info->write_buffer,length,
info->myflags | MY_NABP)) info->myflags | MY_NABP))
info->error= -1; info->error= -1;
else else
info->error= 0; info->error= 0;
set_if_bigger(info->end_of_file,(pos_in_file+length)); if (!append_cache)
{
set_if_bigger(info->end_of_file,(pos_in_file+length));
}
else
info->end_of_file+=(info->write_pos-info->append_read_pos);
info->append_read_pos=info->write_pos=info->write_buffer;
DBUG_RETURN(info->error); DBUG_RETURN(info->error);
} }
} }
......
...@@ -31,12 +31,26 @@ ...@@ -31,12 +31,26 @@
void my_b_seek(IO_CACHE *info,my_off_t pos) void my_b_seek(IO_CACHE *info,my_off_t pos)
{ {
my_off_t offset = (pos - info->pos_in_file); my_off_t offset;
DBUG_ENTER("my_b_seek"); DBUG_ENTER("my_b_seek");
DBUG_PRINT("enter",("pos: %lu", (ulong) pos)); DBUG_PRINT("enter",("pos: %lu", (ulong) pos));
if (info->type == READ_CACHE) /*
TODO: verify that it is OK to do seek in the non-append
area in SEQ_READ_APPEND cache
*/
/* TODO:
a) see if this always works
b) see if there is a better way to make it work
*/
if (info->type == SEQ_READ_APPEND)
flush_io_cache(info);
offset=(pos - info->pos_in_file);
if (info->type == READ_CACHE || info->type == SEQ_READ_APPEND)
{ {
/* TODO: explain why this works if pos < info->pos_in_file */
if ((ulonglong) offset < (ulonglong) (info->read_end - info->buffer)) if ((ulonglong) offset < (ulonglong) (info->read_end - info->buffer))
{ {
/* The read is in the current buffer; Reuse it */ /* The read is in the current buffer; Reuse it */
......
...@@ -69,7 +69,8 @@ int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line) ...@@ -69,7 +69,8 @@ int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line)
} }
if (mp->count++) if (mp->count++)
{ {
fprintf(stderr,"safe_mutex: Error in thread libray: Got mutex at %s, line %d more than 1 time\n", file,line); fprintf(stderr,"safe_mutex: Error in thread libray: Got mutex at %s, \
line %d more than 1 time\n", file,line);
fflush(stderr); fflush(stderr);
abort(); abort();
} }
......
...@@ -1453,11 +1453,13 @@ longlong Item_master_pos_wait::val_int() ...@@ -1453,11 +1453,13 @@ longlong Item_master_pos_wait::val_int()
return 0; return 0;
} }
ulong pos = (ulong)args[1]->val_int(); ulong pos = (ulong)args[1]->val_int();
if ((event_count = glob_mi.wait_for_pos(thd, log_name, pos)) == -1) LOCK_ACTIVE_MI;
if ((event_count = active_mi->rli.wait_for_pos(thd, log_name, pos)) == -1)
{ {
null_value = 1; null_value = 1;
event_count=0; event_count=0;
} }
UNLOCK_ACTIVE_MI;
return event_count; return event_count;
} }
......
...@@ -222,7 +222,6 @@ static SYMBOL symbols[] = { ...@@ -222,7 +222,6 @@ static SYMBOL symbols[] = {
{ "MASTER_HOST", SYM(MASTER_HOST_SYM),0,0}, { "MASTER_HOST", SYM(MASTER_HOST_SYM),0,0},
{ "MASTER_LOG_FILE", SYM(MASTER_LOG_FILE_SYM),0,0}, { "MASTER_LOG_FILE", SYM(MASTER_LOG_FILE_SYM),0,0},
{ "MASTER_LOG_POS", SYM(MASTER_LOG_POS_SYM),0,0}, { "MASTER_LOG_POS", SYM(MASTER_LOG_POS_SYM),0,0},
{ "MASTER_LOG_SEQ", SYM(MASTER_LOG_SEQ_SYM),0,0},
{ "MASTER_PASSWORD", SYM(MASTER_PASSWORD_SYM),0,0}, { "MASTER_PASSWORD", SYM(MASTER_PASSWORD_SYM),0,0},
{ "MASTER_PORT", SYM(MASTER_PORT_SYM),0,0}, { "MASTER_PORT", SYM(MASTER_PORT_SYM),0,0},
{ "MASTER_SERVER_ID", SYM(MASTER_SERVER_ID_SYM),0,0}, { "MASTER_SERVER_ID", SYM(MASTER_SERVER_ID_SYM),0,0},
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -89,7 +89,7 @@ static MYSQL_FIELD *unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields, ...@@ -89,7 +89,7 @@ static MYSQL_FIELD *unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
my_bool default_value, my_bool default_value,
my_bool long_flag_protocol); my_bool long_flag_protocol);
static void mc_end_server(MYSQL *mysql); void mc_end_server(MYSQL *mysql);
static int mc_sock_connect(File s, const struct sockaddr *name, uint namelen, uint to); static int mc_sock_connect(File s, const struct sockaddr *name, uint namelen, uint to);
static void mc_free_old_query(MYSQL *mysql); static void mc_free_old_query(MYSQL *mysql);
static int mc_send_file_to_server(MYSQL *mysql, const char *filename); static int mc_send_file_to_server(MYSQL *mysql, const char *filename);
...@@ -194,8 +194,7 @@ HANDLE create_named_pipe(NET *net, uint connect_timeout, char **arg_host, ...@@ -194,8 +194,7 @@ HANDLE create_named_pipe(NET *net, uint connect_timeout, char **arg_host,
** Init MySQL structure or allocate one ** Init MySQL structure or allocate one
****************************************************************************/ ****************************************************************************/
MYSQL * STDCALL MYSQL *mc_mysql_init(MYSQL *mysql)
mc_mysql_init(MYSQL *mysql)
{ {
init_client_errs(); init_client_errs();
if (!mysql) if (!mysql)
...@@ -217,7 +216,7 @@ mc_mysql_init(MYSQL *mysql) ...@@ -217,7 +216,7 @@ mc_mysql_init(MYSQL *mysql)
** Shut down connection ** Shut down connection
**************************************************************************/ **************************************************************************/
static void void
mc_end_server(MYSQL *mysql) mc_end_server(MYSQL *mysql)
{ {
DBUG_ENTER("mc_end_server"); DBUG_ENTER("mc_end_server");
...@@ -339,7 +338,7 @@ static int mc_sock_connect(my_socket s, const struct sockaddr *name, ...@@ -339,7 +338,7 @@ static int mc_sock_connect(my_socket s, const struct sockaddr *name,
** or packet is an error message ** or packet is an error message
*****************************************************************************/ *****************************************************************************/
ulong STDCALL ulong
mc_net_safe_read(MYSQL *mysql) mc_net_safe_read(MYSQL *mysql)
{ {
NET *net= &mysql->net; NET *net= &mysql->net;
...@@ -400,17 +399,17 @@ max_allowed_packet on this server"); ...@@ -400,17 +399,17 @@ max_allowed_packet on this server");
} }
char * STDCALL mc_mysql_error(MYSQL *mysql) char * mc_mysql_error(MYSQL *mysql)
{ {
return (mysql)->net.last_error; return (mysql)->net.last_error;
} }
int STDCALL mc_mysql_errno(MYSQL *mysql) int mc_mysql_errno(MYSQL *mysql)
{ {
return (mysql)->net.last_errno; return (mysql)->net.last_errno;
} }
my_bool STDCALL mc_mysql_reconnect(MYSQL *mysql) my_bool mc_mysql_reconnect(MYSQL *mysql)
{ {
MYSQL tmp_mysql; MYSQL tmp_mysql;
DBUG_ENTER("mc_mysql_reconnect"); DBUG_ENTER("mc_mysql_reconnect");
...@@ -440,7 +439,7 @@ my_bool STDCALL mc_mysql_reconnect(MYSQL *mysql) ...@@ -440,7 +439,7 @@ my_bool STDCALL mc_mysql_reconnect(MYSQL *mysql)
int STDCALL int
mc_simple_command(MYSQL *mysql,enum enum_server_command command, mc_simple_command(MYSQL *mysql,enum enum_server_command command,
const char *arg, uint length, my_bool skipp_check) const char *arg, uint length, my_bool skipp_check)
{ {
...@@ -493,7 +492,7 @@ mc_simple_command(MYSQL *mysql,enum enum_server_command command, ...@@ -493,7 +492,7 @@ mc_simple_command(MYSQL *mysql,enum enum_server_command command,
} }
MYSQL * STDCALL MYSQL *
mc_mysql_connect(MYSQL *mysql,const char *host, const char *user, mc_mysql_connect(MYSQL *mysql,const char *host, const char *user,
const char *passwd, const char *db, const char *passwd, const char *db,
uint port, const char *unix_socket,uint client_flag) uint port, const char *unix_socket,uint client_flag)
...@@ -844,7 +843,7 @@ error: ...@@ -844,7 +843,7 @@ error:
** NB! Errors are not reported until you do mysql_real_connect. ** NB! Errors are not reported until you do mysql_real_connect.
************************************************************************** **************************************************************************
*/ */
int STDCALL int
mysql_ssl_clear(MYSQL *mysql) mysql_ssl_clear(MYSQL *mysql)
{ {
my_free(mysql->options.ssl_key, MYF(MY_ALLOW_ZERO_PTR)); my_free(mysql->options.ssl_key, MYF(MY_ALLOW_ZERO_PTR));
...@@ -867,7 +866,7 @@ mysql_ssl_clear(MYSQL *mysql) ...@@ -867,7 +866,7 @@ mysql_ssl_clear(MYSQL *mysql)
** If handle is alloced by mysql connect free it. ** If handle is alloced by mysql connect free it.
*************************************************************************/ *************************************************************************/
void STDCALL void
mc_mysql_close(MYSQL *mysql) mc_mysql_close(MYSQL *mysql)
{ {
DBUG_ENTER("mysql_close"); DBUG_ENTER("mysql_close");
...@@ -898,7 +897,7 @@ mc_mysql_close(MYSQL *mysql) ...@@ -898,7 +897,7 @@ mc_mysql_close(MYSQL *mysql)
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
void STDCALL mc_mysql_free_result(MYSQL_RES *result) void mc_mysql_free_result(MYSQL_RES *result)
{ {
DBUG_ENTER("mc_mysql_free_result"); DBUG_ENTER("mc_mysql_free_result");
DBUG_PRINT("enter",("mysql_res: %lx",result)); DBUG_PRINT("enter",("mysql_res: %lx",result));
...@@ -976,13 +975,13 @@ mc_unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields, ...@@ -976,13 +975,13 @@ mc_unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
DBUG_RETURN(result); DBUG_RETURN(result);
} }
int STDCALL int
mc_mysql_send_query(MYSQL* mysql, const char* query, uint length) mc_mysql_send_query(MYSQL* mysql, const char* query, uint length)
{ {
return mc_simple_command(mysql, COM_QUERY, query, length, 1); return mc_simple_command(mysql, COM_QUERY, query, length, 1);
} }
int STDCALL mc_mysql_read_query_result(MYSQL *mysql) int mc_mysql_read_query_result(MYSQL *mysql)
{ {
uchar *pos; uchar *pos;
ulong field_count; ulong field_count;
...@@ -1030,7 +1029,7 @@ get_info: ...@@ -1030,7 +1029,7 @@ get_info:
DBUG_RETURN(0); DBUG_RETURN(0);
} }
int STDCALL mc_mysql_query(MYSQL *mysql, const char *query, uint length) int mc_mysql_query(MYSQL *mysql, const char *query, uint length)
{ {
DBUG_ENTER("mysql_real_query"); DBUG_ENTER("mysql_real_query");
DBUG_PRINT("enter",("handle: %lx",mysql)); DBUG_PRINT("enter",("handle: %lx",mysql));
...@@ -1281,17 +1280,17 @@ static int mc_read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row, ...@@ -1281,17 +1280,17 @@ static int mc_read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row,
return 0; return 0;
} }
my_ulonglong STDCALL mc_mysql_num_rows(MYSQL_RES *res) my_ulonglong mc_mysql_num_rows(MYSQL_RES *res)
{ {
return res->row_count; return res->row_count;
} }
unsigned int STDCALL mc_mysql_num_fields(MYSQL_RES *res) unsigned int mc_mysql_num_fields(MYSQL_RES *res)
{ {
return res->field_count; return res->field_count;
} }
void STDCALL mc_mysql_data_seek(MYSQL_RES *result, my_ulonglong row) void mc_mysql_data_seek(MYSQL_RES *result, my_ulonglong row)
{ {
MYSQL_ROWS *tmp=0; MYSQL_ROWS *tmp=0;
DBUG_PRINT("info",("mysql_data_seek(%ld)",(long) row)); DBUG_PRINT("info",("mysql_data_seek(%ld)",(long) row));
...@@ -1301,7 +1300,7 @@ void STDCALL mc_mysql_data_seek(MYSQL_RES *result, my_ulonglong row) ...@@ -1301,7 +1300,7 @@ void STDCALL mc_mysql_data_seek(MYSQL_RES *result, my_ulonglong row)
result->data_cursor = tmp; result->data_cursor = tmp;
} }
MYSQL_ROW STDCALL mc_mysql_fetch_row(MYSQL_RES *res) MYSQL_ROW mc_mysql_fetch_row(MYSQL_RES *res)
{ {
DBUG_ENTER("mc_mysql_fetch_row"); DBUG_ENTER("mc_mysql_fetch_row");
if (!res->data) if (!res->data)
...@@ -1336,7 +1335,7 @@ MYSQL_ROW STDCALL mc_mysql_fetch_row(MYSQL_RES *res) ...@@ -1336,7 +1335,7 @@ MYSQL_ROW STDCALL mc_mysql_fetch_row(MYSQL_RES *res)
} }
} }
int STDCALL mc_mysql_select_db(MYSQL *mysql, const char *db) int mc_mysql_select_db(MYSQL *mysql, const char *db)
{ {
int error; int error;
DBUG_ENTER("mysql_select_db"); DBUG_ENTER("mysql_select_db");
...@@ -1350,7 +1349,7 @@ int STDCALL mc_mysql_select_db(MYSQL *mysql, const char *db) ...@@ -1350,7 +1349,7 @@ int STDCALL mc_mysql_select_db(MYSQL *mysql, const char *db)
} }
MYSQL_RES * STDCALL mc_mysql_store_result(MYSQL *mysql) MYSQL_RES *mc_mysql_store_result(MYSQL *mysql)
{ {
MYSQL_RES *result; MYSQL_RES *result;
DBUG_ENTER("mysql_store_result"); DBUG_ENTER("mysql_store_result");
......
...@@ -18,40 +18,34 @@ ...@@ -18,40 +18,34 @@
#define _MINI_CLIENT_H #define _MINI_CLIENT_H
MYSQL* STDCALL MYSQL* mc_mysql_connect(MYSQL *mysql,const char *host, const char *user,
mc_mysql_connect(MYSQL *mysql,const char *host, const char *user,
const char *passwd, const char *db, const char *passwd, const char *db,
uint port, const char *unix_socket,uint client_flag); uint port, const char *unix_socket,uint client_flag);
int STDCALL int mc_simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg,
mc_simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg,
uint length, my_bool skipp_check); uint length, my_bool skipp_check);
void STDCALL void mc_mysql_close(MYSQL *mysql);
mc_mysql_close(MYSQL *mysql);
MYSQL * mc_mysql_init(MYSQL *mysql);
MYSQL * STDCALL
mc_mysql_init(MYSQL *mysql); void mc_mysql_debug(const char *debug);
void STDCALL
mc_mysql_debug(const char *debug);
ulong STDCALL
mc_net_safe_read(MYSQL *mysql);
char * STDCALL mc_mysql_error(MYSQL *mysql);
int STDCALL mc_mysql_errno(MYSQL *mysql);
my_bool STDCALL mc_mysql_reconnect(MYSQL* mysql);
int STDCALL mc_mysql_send_query(MYSQL* mysql, const char* query, uint length);
int STDCALL mc_mysql_read_query_result(MYSQL *mysql);
int STDCALL mc_mysql_query(MYSQL *mysql, const char *query, uint length);
MYSQL_RES * STDCALL mc_mysql_store_result(MYSQL *mysql);
void STDCALL mc_mysql_free_result(MYSQL_RES *result);
void STDCALL mc_mysql_data_seek(MYSQL_RES *result, my_ulonglong row);
my_ulonglong STDCALL mc_mysql_num_rows(MYSQL_RES *res);
unsigned int STDCALL mc_mysql_num_fields(MYSQL_RES *res);
MYSQL_ROW STDCALL mc_mysql_fetch_row(MYSQL_RES *res);
int STDCALL mc_mysql_select_db(MYSQL *mysql, const char *db);
ulong mc_net_safe_read(MYSQL *mysql);
char * mc_mysql_error(MYSQL *mysql);
int mc_mysql_errno(MYSQL *mysql);
my_bool mc_mysql_reconnect(MYSQL* mysql);
int mc_mysql_send_query(MYSQL* mysql, const char* query, uint length);
int mc_mysql_read_query_result(MYSQL *mysql);
int mc_mysql_query(MYSQL *mysql, const char *query, uint length);
MYSQL_RES * mc_mysql_store_result(MYSQL *mysql);
void mc_mysql_free_result(MYSQL_RES *result);
void mc_mysql_data_seek(MYSQL_RES *result, my_ulonglong row);
my_ulonglong mc_mysql_num_rows(MYSQL_RES *res);
unsigned int mc_mysql_num_fields(MYSQL_RES *res);
MYSQL_ROW STDCALL mc_mysql_fetch_row(MYSQL_RES *res);
int mc_mysql_select_db(MYSQL *mysql, const char *db);
void mc_end_server(MYSQL *mysql);
#endif #endif
...@@ -540,6 +540,10 @@ void sql_print_error(const char *format,...) ...@@ -540,6 +540,10 @@ void sql_print_error(const char *format,...)
__attribute__ ((format (printf, 1, 2))); __attribute__ ((format (printf, 1, 2)));
bool fn_format_relative_to_data_home(my_string to, const char *name, bool fn_format_relative_to_data_home(my_string to, const char *name,
const char *dir, const char *extension); const char *dir, const char *extension);
void open_log(MYSQL_LOG *log, const char *hostname,
const char *opt_name, const char *extension,
enum_log_type type, bool read_append = 0,
bool no_auto_events = 0);
extern uint32 server_id; extern uint32 server_id;
extern char *mysql_data_home,server_version[SERVER_VERSION_LENGTH], extern char *mysql_data_home,server_version[SERVER_VERSION_LENGTH],
...@@ -572,9 +576,8 @@ extern pthread_mutex_t LOCK_mysql_create_db,LOCK_Acl,LOCK_open, ...@@ -572,9 +576,8 @@ extern pthread_mutex_t LOCK_mysql_create_db,LOCK_Acl,LOCK_open,
LOCK_thread_count,LOCK_mapped_file,LOCK_user_locks, LOCK_status, LOCK_thread_count,LOCK_mapped_file,LOCK_user_locks, LOCK_status,
LOCK_grant, LOCK_error_log, LOCK_delayed_insert, LOCK_grant, LOCK_error_log, LOCK_delayed_insert,
LOCK_delayed_status, LOCK_delayed_create, LOCK_crypt, LOCK_timezone, LOCK_delayed_status, LOCK_delayed_create, LOCK_crypt, LOCK_timezone,
LOCK_binlog_update, LOCK_slave, LOCK_server_id, LOCK_slave_list; LOCK_server_id, LOCK_slave_list, LOCK_active_mi;
extern pthread_cond_t COND_refresh,COND_thread_count, COND_binlog_update, extern pthread_cond_t COND_refresh,COND_thread_count;
COND_slave_stopped, COND_slave_start;
extern pthread_attr_t connection_attrib; extern pthread_attr_t connection_attrib;
extern bool opt_endinfo, using_udf_functions, locked_in_memory, extern bool opt_endinfo, using_udf_functions, locked_in_memory,
opt_using_transactions, use_temp_pool, mysql_embedded; opt_using_transactions, use_temp_pool, mysql_embedded;
...@@ -611,6 +614,7 @@ extern struct show_var_st init_vars[]; ...@@ -611,6 +614,7 @@ extern struct show_var_st init_vars[];
extern struct show_var_st status_vars[]; extern struct show_var_st status_vars[];
extern enum db_type default_table_type; extern enum db_type default_table_type;
extern enum enum_tx_isolation default_tx_isolation; extern enum enum_tx_isolation default_tx_isolation;
extern char glob_hostname[FN_REFLEN];
#ifndef __WIN__ #ifndef __WIN__
extern pthread_t signal_thread; extern pthread_t signal_thread;
......
This diff is collapsed.
...@@ -201,7 +201,7 @@ void end_slave_list() ...@@ -201,7 +201,7 @@ void end_slave_list()
static int find_target_pos(LEX_MASTER_INFO* mi, IO_CACHE* log, char* errmsg) static int find_target_pos(LEX_MASTER_INFO* mi, IO_CACHE* log, char* errmsg)
{ {
uint32 log_seq = mi->last_log_seq; uint32 log_pos = mi->pos;
uint32 target_server_id = mi->server_id; uint32 target_server_id = mi->server_id;
for (;;) for (;;)
...@@ -219,7 +219,7 @@ static int find_target_pos(LEX_MASTER_INFO* mi, IO_CACHE* log, char* errmsg) ...@@ -219,7 +219,7 @@ static int find_target_pos(LEX_MASTER_INFO* mi, IO_CACHE* log, char* errmsg)
return 1; return 1;
} }
if (ev->log_seq == log_seq && ev->server_id == target_server_id) if (ev->log_pos == log_pos && ev->server_id == target_server_id)
{ {
delete ev; delete ev;
mi->pos = my_b_tell(log); mi->pos = my_b_tell(log);
...@@ -529,7 +529,7 @@ pthread_handler_decl(handle_failsafe_rpl,arg) ...@@ -529,7 +529,7 @@ pthread_handler_decl(handle_failsafe_rpl,arg)
const char* msg = thd->enter_cond(&COND_rpl_status, const char* msg = thd->enter_cond(&COND_rpl_status,
&LOCK_rpl_status, "Waiting for request"); &LOCK_rpl_status, "Waiting for request");
pthread_cond_wait(&COND_rpl_status, &LOCK_rpl_status); pthread_cond_wait(&COND_rpl_status, &LOCK_rpl_status);
thd->proc_info="Processling request"; thd->proc_info="Processing request";
while (!break_req_chain) while (!break_req_chain)
{ {
switch (rpl_status) switch (rpl_status)
...@@ -632,10 +632,9 @@ static inline void cleanup_mysql_results(MYSQL_RES* db_res, ...@@ -632,10 +632,9 @@ static inline void cleanup_mysql_results(MYSQL_RES* db_res,
static inline int fetch_db_tables(THD* thd, MYSQL* mysql, const char* db, static inline int fetch_db_tables(THD* thd, MYSQL* mysql, const char* db,
MYSQL_RES* table_res) MYSQL_RES* table_res, MASTER_INFO* mi)
{ {
MYSQL_ROW row; MYSQL_ROW row;
for( row = mc_mysql_fetch_row(table_res); row; for( row = mc_mysql_fetch_row(table_res); row;
row = mc_mysql_fetch_row(table_res)) row = mc_mysql_fetch_row(table_res))
{ {
...@@ -651,11 +650,9 @@ static inline int fetch_db_tables(THD* thd, MYSQL* mysql, const char* db, ...@@ -651,11 +650,9 @@ static inline int fetch_db_tables(THD* thd, MYSQL* mysql, const char* db,
if (!tables_ok(thd, &table)) if (!tables_ok(thd, &table))
continue; continue;
} }
if ((error = fetch_master_table(thd, db, table_name, mi, mysql)))
if ((error = fetch_nx_table(thd, db, table_name, &glob_mi, mysql)))
return error; return error;
} }
return 0; return 0;
} }
...@@ -666,25 +663,26 @@ int load_master_data(THD* thd) ...@@ -666,25 +663,26 @@ int load_master_data(THD* thd)
MYSQL_RES* master_status_res = 0; MYSQL_RES* master_status_res = 0;
bool slave_was_running = 0; bool slave_was_running = 0;
int error = 0; int error = 0;
const char* errmsg=0;
int restart_thread_mask;
mc_mysql_init(&mysql); mc_mysql_init(&mysql);
// we do not want anyone messing with the slave at all for the entire // we do not want anyone messing with the slave at all for the entire
// duration of the data load; // duration of the data load;
pthread_mutex_lock(&LOCK_slave); LOCK_ACTIVE_MI;
lock_slave_threads(active_mi);
// first, kill the slave init_thread_mask(&restart_thread_mask,active_mi,0 /*not inverse*/);
if ((slave_was_running = slave_running)) if (restart_thread_mask &&
(error=terminate_slave_threads(active_mi,restart_thread_mask,
1 /*skip lock*/)))
{ {
abort_slave = 1; send_error(&thd->net,error);
KICK_SLAVE; unlock_slave_threads(active_mi);
thd->proc_info = "waiting for slave to die"; UNLOCK_ACTIVE_MI;
while (slave_running) return 1;
pthread_cond_wait(&COND_slave_stopped, &LOCK_slave); // wait until done
} }
if (connect_to_master(thd, &mysql, active_mi))
if (connect_to_master(thd, &mysql, &glob_mi))
{ {
net_printf(&thd->net, error = ER_CONNECT_TO_MASTER, net_printf(&thd->net, error = ER_CONNECT_TO_MASTER,
mc_mysql_error(&mysql)); mc_mysql_error(&mysql));
...@@ -746,7 +744,7 @@ int load_master_data(THD* thd) ...@@ -746,7 +744,7 @@ int load_master_data(THD* thd)
mess up and not exclude mysql database with the rules when mess up and not exclude mysql database with the rules when
he actually means to - in this case, he is up for a surprise if he actually means to - in this case, he is up for a surprise if
his priv tables get dropped and downloaded from master his priv tables get dropped and downloaded from master
TO DO - add special option, not enabled TODO - add special option, not enabled
by default, to allow inclusion of mysql database into load by default, to allow inclusion of mysql database into load
data from master data from master
*/ */
...@@ -776,7 +774,7 @@ int load_master_data(THD* thd) ...@@ -776,7 +774,7 @@ int load_master_data(THD* thd)
goto err; goto err;
} }
if ((error = fetch_db_tables(thd, &mysql, db, *cur_table_res))) if ((error = fetch_db_tables(thd,&mysql,db,*cur_table_res,active_mi)))
{ {
// we do not report the error - fetch_db_tables handles it // we do not report the error - fetch_db_tables handles it
cleanup_mysql_results(db_res, cur_table_res, table_res); cleanup_mysql_results(db_res, cur_table_res, table_res);
...@@ -799,14 +797,15 @@ int load_master_data(THD* thd) ...@@ -799,14 +797,15 @@ int load_master_data(THD* thd)
*/ */
if (row[0] && row[1]) if (row[0] && row[1])
{ {
strmake(glob_mi.log_file_name, row[0], sizeof(glob_mi.log_file_name)); strmake(active_mi->master_log_name, row[0],
glob_mi.pos = atoi(row[1]); // atoi() is ok, since offset is <= 1GB sizeof(active_mi->master_log_name));
if (glob_mi.pos < 4) // atoi() is ok, since offset is <= 1GB
glob_mi.pos = 4; // don't hit the magic number active_mi->master_log_pos = atoi(row[1]);
glob_mi.pending = 0; if (active_mi->master_log_pos < 4)
flush_master_info(&glob_mi); active_mi->master_log_pos = 4; // don't hit the magic number
active_mi->rli.pending = 0;
flush_master_info(active_mi);
} }
mc_mysql_free_result(master_status_res); mc_mysql_free_result(master_status_res);
} }
...@@ -817,11 +816,35 @@ int load_master_data(THD* thd) ...@@ -817,11 +816,35 @@ int load_master_data(THD* thd)
goto err; goto err;
} }
} }
thd->proc_info="purging old relay logs";
if (purge_relay_logs(&active_mi->rli,0 /* not only reset, but also reinit*/,
&errmsg))
{
send_error(&thd->net, 0, "Failed purging old relay logs");
unlock_slave_threads(active_mi);
UNLOCK_ACTIVE_MI;
return 1;
}
pthread_mutex_lock(&active_mi->rli.data_lock);
active_mi->rli.master_log_pos = active_mi->master_log_pos;
strnmov(active_mi->rli.master_log_name,active_mi->master_log_name,
sizeof(active_mi->rli.master_log_name));
pthread_cond_broadcast(&active_mi->rli.data_cond);
pthread_mutex_unlock(&active_mi->rli.data_lock);
thd->proc_info = "starting slave";
if (restart_thread_mask)
{
error=start_slave_threads(0 /* mutex not needed*/,
1 /* wait for start*/,
active_mi,master_info_file,relay_log_info_file,
restart_thread_mask);
}
err: err:
pthread_mutex_unlock(&LOCK_slave); unlock_slave_threads(active_mi);
if (slave_was_running) UNLOCK_ACTIVE_MI;
start_slave(0, 0); thd->proc_info = 0;
mc_mysql_close(&mysql); // safe to call since we always do mc_mysql_init() mc_mysql_close(&mysql); // safe to call since we always do mc_mysql_init()
if (!error) if (!error)
send_ok(&thd->net); send_ok(&thd->net);
......
This diff is collapsed.
This diff is collapsed.
...@@ -98,7 +98,6 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0), ...@@ -98,7 +98,6 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0),
current_linfo = 0; current_linfo = 0;
slave_thread = 0; slave_thread = 0;
slave_proxy_id = 0; slave_proxy_id = 0;
log_seq = 0;
file_id = 0; file_id = 0;
cond_count=0; cond_count=0;
convert_set=0; convert_set=0;
...@@ -119,6 +118,7 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0), ...@@ -119,6 +118,7 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0),
where="field list"; where="field list";
server_id = ::server_id; server_id = ::server_id;
slave_net = 0; slave_net = 0;
log_pos = 0;
server_status=SERVER_STATUS_AUTOCOMMIT; server_status=SERVER_STATUS_AUTOCOMMIT;
update_lock_default= low_priority_updates ? TL_WRITE_LOW_PRIORITY : TL_WRITE; update_lock_default= low_priority_updates ? TL_WRITE_LOW_PRIORITY : TL_WRITE;
options=thd_startup_options; options=thd_startup_options;
...@@ -217,10 +217,11 @@ THD::~THD() ...@@ -217,10 +217,11 @@ THD::~THD()
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
void THD::prepare_to_die() void THD::awake(bool prepare_to_die)
{ {
if (prepare_to_die)
killed = 1;
thr_alarm_kill(real_id); thr_alarm_kill(real_id);
killed = 1;
#ifdef SIGNAL_WITH_VIO_CLOSE #ifdef SIGNAL_WITH_VIO_CLOSE
close_active_vio(); close_active_vio();
#endif #endif
...@@ -229,6 +230,10 @@ void THD::prepare_to_die() ...@@ -229,6 +230,10 @@ void THD::prepare_to_die()
pthread_mutex_lock(&mysys_var->mutex); pthread_mutex_lock(&mysys_var->mutex);
if (!system_thread) // Don't abort locks if (!system_thread) // Don't abort locks
mysys_var->abort=1; mysys_var->abort=1;
// this broadcast could be up in the air if the victim thread
// exits the cond in the time between read and broadcast, but that is
// ok since all we want to do is to make the victim thread get out
// of waiting on current_cond
if (mysys_var->current_cond) if (mysys_var->current_cond)
{ {
pthread_mutex_lock(mysys_var->current_mutex); pthread_mutex_lock(mysys_var->current_mutex);
......
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#pragma interface /* gcc class implementation */ #pragma interface /* gcc class implementation */
#endif #endif
// TODO: create log.h and move all the log header stuff there
class Query_log_event; class Query_log_event;
class Load_log_event; class Load_log_event;
class Slave_log_event; class Slave_log_event;
...@@ -40,6 +42,8 @@ enum enum_log_type { LOG_CLOSED, LOG_NORMAL, LOG_NEW, LOG_BIN }; ...@@ -40,6 +42,8 @@ enum enum_log_type { LOG_CLOSED, LOG_NORMAL, LOG_NEW, LOG_BIN };
#define LOG_INFO_FATAL -7 #define LOG_INFO_FATAL -7
#define LOG_INFO_IN_USE -8 #define LOG_INFO_IN_USE -8
struct st_relay_log_info;
typedef struct st_log_info typedef struct st_log_info
{ {
char log_file_name[FN_REFLEN]; char log_file_name[FN_REFLEN];
...@@ -64,8 +68,6 @@ class MYSQL_LOG { ...@@ -64,8 +68,6 @@ class MYSQL_LOG {
char time_buff[20],db[NAME_LEN+1]; char time_buff[20],db[NAME_LEN+1];
char log_file_name[FN_REFLEN],index_file_name[FN_REFLEN]; char log_file_name[FN_REFLEN],index_file_name[FN_REFLEN];
bool write_error,inited; bool write_error,inited;
uint32 log_seq; // current event sequence number
// needed this for binlog
uint file_id; // current file sequence number for load data infile uint file_id; // current file sequence number for load data infile
// binary logging // binary logging
bool no_rotate; // for binlog - if log name can never change bool no_rotate; // for binlog - if log name can never change
...@@ -74,36 +76,52 @@ class MYSQL_LOG { ...@@ -74,36 +76,52 @@ class MYSQL_LOG {
// purging // purging
enum cache_type io_cache_type; enum cache_type io_cache_type;
bool need_start_event; bool need_start_event;
pthread_cond_t update_cond;
bool no_auto_events; // for relay binlog
friend class Log_event; friend class Log_event;
public: public:
MYSQL_LOG(); MYSQL_LOG();
~MYSQL_LOG(); ~MYSQL_LOG();
pthread_mutex_t* get_log_lock() { return &LOCK_log; } pthread_mutex_t* get_log_lock() { return &LOCK_log; }
IO_CACHE* get_log_file() { return &log_file; }
void signal_update() { pthread_cond_broadcast(&update_cond);}
void wait_for_update(THD* thd);
void set_need_start_event() { need_start_event = 1; } void set_need_start_event() { need_start_event = 1; }
void set_index_file_name(const char* index_file_name = 0); void set_index_file_name(const char* index_file_name = 0);
void init(enum_log_type log_type_arg, void init(enum_log_type log_type_arg,
enum cache_type io_cache_type_arg = WRITE_CACHE); enum cache_type io_cache_type_arg = WRITE_CACHE,
bool no_auto_events_arg = 0);
void open(const char *log_name,enum_log_type log_type, void open(const char *log_name,enum_log_type log_type,
const char *new_name=0); const char *new_name, enum cache_type io_cache_type_arg,
bool no_auto_events_arg);
void new_file(bool inside_mutex = 0); void new_file(bool inside_mutex = 0);
bool open_index(int options); bool open_index(int options);
void close_index(); void close_index();
bool write(THD *thd, enum enum_server_command command,const char *format,...); bool write(THD *thd, enum enum_server_command command,
const char *format,...);
bool write(THD *thd, const char *query, uint query_length, bool write(THD *thd, const char *query, uint query_length,
time_t query_start=0); time_t query_start=0);
bool write(Log_event* event_info); // binary log write bool write(Log_event* event_info); // binary log write
bool write(IO_CACHE *cache); bool write(IO_CACHE *cache);
//v stands for vector
//invoked as appendv(buf1,len1,buf2,len2,...,bufn,lenn,0)
bool appendv(const char* buf,uint len,...);
int generate_new_name(char *new_name,const char *old_name); int generate_new_name(char *new_name,const char *old_name);
void make_log_name(char* buf, const char* log_ident); void make_log_name(char* buf, const char* log_ident);
bool is_active(const char* log_file_name); bool is_active(const char* log_file_name);
int purge_logs(THD* thd, const char* to_log); int purge_logs(THD* thd, const char* to_log);
int purge_first_log(struct st_relay_log_info* rli);
int reset_logs(THD* thd);
void close(bool exiting = 0); // if we are exiting, we also want to close the void close(bool exiting = 0); // if we are exiting, we also want to close the
// index file // index file
// iterating through the log index file // iterating through the log index file
int find_first_log(LOG_INFO* linfo, const char* log_name); int find_first_log(LOG_INFO* linfo, const char* log_name,
int find_next_log(LOG_INFO* linfo); bool need_mutex=1);
int find_next_log(LOG_INFO* linfo, bool need_mutex=1);
int get_current_log(LOG_INFO* linfo); int get_current_log(LOG_INFO* linfo);
uint next_file_id(); uint next_file_id();
...@@ -228,33 +246,73 @@ public: ...@@ -228,33 +246,73 @@ public:
}; };
/****************************************************************************
** every connection is handled by a thread with a THD
****************************************************************************/
class delayed_insert; class delayed_insert;
/* For each client connection we create a separate thread with THD serving as
a thread/connection descriptor */
class THD :public ilink { class THD :public ilink {
public: public:
NET net; NET net; // client connection descriptor
LEX lex; LEX lex; // parse tree descriptor
MEM_ROOT mem_root; MEM_ROOT mem_root; // memory allocation pool
HASH user_vars; HASH user_vars; // hash for user variables
String packet; /* Room for 1 row */ String packet; // dynamic string buffer used for network I/O
struct sockaddr_in remote; struct sockaddr_in remote; // client socket address
struct rand_struct rand; struct rand_struct rand; // used for authentication
char *query,*thread_stack;
char *host,*user,*priv_user,*db,*ip; /* query points to the current query,
const char *proc_info, *host_or_ip; thread_stack is a pointer to the stack frame of handle_one_connection(),
uint client_capabilities,sql_mode,max_packet_length; which is called first in the thread for handling a client
uint master_access,db_access; */
TABLE *open_tables,*temporary_tables, *handler_tables; char *query,*thread_stack;
/*
host - host of the client
user - user of the client, set to NULL until the user has been read from
the connection
priv_user - not sure why we have it, but it is set to "boot" when we run
with --bootstrap
db - currently selected database
ip - client IP
*/
char *host,*user,*priv_user,*db,*ip;
/* proc_info points to a string that will show in the Info column of
SHOW PROCESSLIST output
host_or_ip points to host if host is available, otherwise points to ip
*/
const char *proc_info, *host_or_ip;
/*
client_capabilities has flags describing what the client can do
sql_mode determines if certain non-standard SQL behaviour should be
enabled
max_packet_length - supposed to be maximum packet length the client
can handle, but it currently appears to be assigned but never used
except for one debugging statement
*/
uint client_capabilities,sql_mode,max_packet_length;
/*
master_access - privillege descriptor mask for system threads
db_access - privillege descriptor mask for regular threads
*/
uint master_access,db_access;
/*
open_tables - list of regular tables in use by this thread
temporary_tables - list of temp tables in use by this thread
handler_tables - list of tables that were opened with HANDLER OPEN
and are still in use by this thread
*/
TABLE *open_tables,*temporary_tables, *handler_tables;
// TODO: document the variables below
MYSQL_LOCK *lock,*locked_tables; MYSQL_LOCK *lock,*locked_tables;
ULL *ull; ULL *ull;
struct st_my_thread_var *mysys_var; struct st_my_thread_var *mysys_var;
enum enum_server_command command; enum enum_server_command command;
uint32 server_id; uint32 server_id;
uint32 log_seq; uint32 file_id; // for LOAD DATA INFILE
uint32 file_id; // for LOAD DATA INFILE uint32 file_id; // for LOAD DATA INFILE
const char *where; const char *where;
time_t start_time,time_after_lock,user_time; time_t start_time,time_after_lock,user_time;
...@@ -312,6 +370,8 @@ public: ...@@ -312,6 +370,8 @@ public:
*/ */
ulong slave_proxy_id; ulong slave_proxy_id;
NET* slave_net; // network connection from slave -> m. NET* slave_net; // network connection from slave -> m.
uint32 log_pos;
THD(); THD();
~THD(); ~THD();
void cleanup(void); void cleanup(void);
...@@ -333,14 +393,14 @@ public: ...@@ -333,14 +393,14 @@ public:
{ {
pthread_mutex_lock(&active_vio_lock); pthread_mutex_lock(&active_vio_lock);
if(active_vio) if(active_vio)
{ {
vio_close(active_vio); vio_close(active_vio);
active_vio = 0; active_vio = 0;
} }
pthread_mutex_unlock(&active_vio_lock); pthread_mutex_unlock(&active_vio_lock);
} }
#endif #endif
void prepare_to_die(); void awake(bool prepare_to_die);
inline const char* enter_cond(pthread_cond_t *cond, pthread_mutex_t* mutex, inline const char* enter_cond(pthread_cond_t *cond, pthread_mutex_t* mutex,
const char* msg) const char* msg)
{ {
......
...@@ -95,7 +95,6 @@ typedef struct st_lex_master_info ...@@ -95,7 +95,6 @@ typedef struct st_lex_master_info
{ {
char* host, *user, *password,*log_file_name; char* host, *user, *password,*log_file_name;
uint port, connect_retry; uint port, connect_retry;
ulong last_log_seq;
ulonglong pos; ulonglong pos;
ulong server_id; ulong server_id;
} LEX_MASTER_INFO; } LEX_MASTER_INFO;
......
...@@ -1359,14 +1359,18 @@ mysql_execute_command(void) ...@@ -1359,14 +1359,18 @@ mysql_execute_command(void)
{ {
if (check_access(thd, PROCESS_ACL, any_db)) if (check_access(thd, PROCESS_ACL, any_db))
goto error; goto error;
res = change_master(thd); LOCK_ACTIVE_MI;
res = change_master(thd,active_mi);
UNLOCK_ACTIVE_MI;
break; break;
} }
case SQLCOM_SHOW_SLAVE_STAT: case SQLCOM_SHOW_SLAVE_STAT:
{ {
if (check_process_priv(thd)) if (check_process_priv(thd))
goto error; goto error;
res = show_master_info(thd); LOCK_ACTIVE_MI;
res = show_master_info(thd,active_mi);
UNLOCK_ACTIVE_MI;
break; break;
} }
case SQLCOM_SHOW_MASTER_STAT: case SQLCOM_SHOW_MASTER_STAT:
...@@ -1376,15 +1380,15 @@ mysql_execute_command(void) ...@@ -1376,15 +1380,15 @@ mysql_execute_command(void)
res = show_binlog_info(thd); res = show_binlog_info(thd);
break; break;
} }
case SQLCOM_LOAD_MASTER_DATA: // sync with master case SQLCOM_LOAD_MASTER_DATA: // sync with master
if (check_process_priv(thd)) if (check_process_priv(thd))
goto error; goto error;
res = load_master_data(thd); res = load_master_data(thd);
break; break;
case SQLCOM_LOAD_MASTER_TABLE: case SQLCOM_LOAD_MASTER_TABLE:
{
if (!tables->db) if (!tables->db)
tables->db=thd->db; tables->db=thd->db;
if (check_access(thd,CREATE_ACL,tables->db,&tables->grant.privilege)) if (check_access(thd,CREATE_ACL,tables->db,&tables->grant.privilege))
...@@ -1404,12 +1408,16 @@ mysql_execute_command(void) ...@@ -1404,12 +1408,16 @@ mysql_execute_command(void)
net_printf(&thd->net,ER_WRONG_TABLE_NAME,tables->name); net_printf(&thd->net,ER_WRONG_TABLE_NAME,tables->name);
break; break;
} }
LOCK_ACTIVE_MI;
if (fetch_nx_table(thd, tables->db, tables->real_name, &glob_mi, 0)) // fetch_master_table will send the error to the client on failure
break; // fetch_nx_table did send the error to the client if (!fetch_master_table(thd, tables->db, tables->real_name,
send_ok(&thd->net); active_mi, 0))
{
send_ok(&thd->net);
}
UNLOCK_ACTIVE_MI;
break; break;
}
case SQLCOM_CREATE_TABLE: case SQLCOM_CREATE_TABLE:
if (!tables->db) if (!tables->db)
tables->db=thd->db; tables->db=thd->db;
...@@ -1509,12 +1517,19 @@ mysql_execute_command(void) ...@@ -1509,12 +1517,19 @@ mysql_execute_command(void)
break; break;
case SQLCOM_SLAVE_START: case SQLCOM_SLAVE_START:
start_slave(thd); {
LOCK_ACTIVE_MI;
start_slave(thd,active_mi,1 /* net report*/);
UNLOCK_ACTIVE_MI;
break; break;
}
case SQLCOM_SLAVE_STOP: case SQLCOM_SLAVE_STOP:
stop_slave(thd); {
LOCK_ACTIVE_MI;
stop_slave(thd,active_mi,1/* net report*/);
UNLOCK_ACTIVE_MI;
break; break;
}
case SQLCOM_ALTER_TABLE: case SQLCOM_ALTER_TABLE:
#if defined(DONT_ALLOW_SHOW_COMMANDS) #if defined(DONT_ALLOW_SHOW_COMMANDS)
send_error(&thd->net,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ send_error(&thd->net,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */
...@@ -3204,6 +3219,7 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables) ...@@ -3204,6 +3219,7 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables)
bool result=0; bool result=0;
select_errors=0; /* Write if more errors */ select_errors=0; /* Write if more errors */
// TODO: figure out what's up with the commented out line below
// mysql_log.flush(); // Flush log // mysql_log.flush(); // Flush log
if (options & REFRESH_GRANT) if (options & REFRESH_GRANT)
{ {
...@@ -3244,16 +3260,22 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables) ...@@ -3244,16 +3260,22 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables)
if (options & REFRESH_THREADS) if (options & REFRESH_THREADS)
flush_thread_cache(); flush_thread_cache();
if (options & REFRESH_MASTER) if (options & REFRESH_MASTER)
reset_master(); if (reset_master(thd))
if (options & REFRESH_SLAVE) result=1;
reset_slave();
#ifdef OPENSSL #ifdef OPENSSL
if (options & REFRESH_DES_KEY_FILE) if (options & REFRESH_DES_KEY_FILE)
{
if (des_key_file)
result=load_des_key_file(des_key_file);
}
#endif
if (options & REFRESH_SLAVE)
{ {
if (des_key_file) LOCK_ACTIVE_MI;
result=load_des_key_file(des_key_file); if (reset_slave(active_mi))
result=1;
UNLOCK_ACTIVE_MI;
} }
#endif
return result; return result;
} }
...@@ -3271,7 +3293,7 @@ void kill_one_thread(THD *thd, ulong id) ...@@ -3271,7 +3293,7 @@ void kill_one_thread(THD *thd, ulong id)
if ((thd->master_access & PROCESS_ACL) || if ((thd->master_access & PROCESS_ACL) ||
!strcmp(thd->user,tmp->user)) !strcmp(thd->user,tmp->user))
{ {
tmp->prepare_to_die(); tmp->awake(1 /*prepare to die*/);
error=0; error=0;
} }
else else
......
This diff is collapsed.
...@@ -26,30 +26,26 @@ extern int max_binlog_dump_events; ...@@ -26,30 +26,26 @@ extern int max_binlog_dump_events;
extern bool opt_sporadic_binlog_dump_fail; extern bool opt_sporadic_binlog_dump_fail;
#endif #endif
#ifdef SIGNAL_WITH_VIO_CLOSE #define KICK_SLAVE(thd) thd->awake(0 /* do not prepare to die*/);
#define KICK_SLAVE { slave_thd->close_active_vio(); \
thr_alarm_kill(slave_real_id); }
#else
#define KICK_SLAVE thr_alarm_kill(slave_real_id);
#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);
int start_slave(THD* thd = 0, bool net_report = 1); int start_slave(THD* thd, MASTER_INFO* mi, bool net_report);
int stop_slave(THD* thd = 0, bool net_report = 1); int stop_slave(THD* thd, MASTER_INFO* mi, bool net_report);
int change_master(THD* thd); int change_master(THD* thd, MASTER_INFO* mi);
int show_binlog_events(THD* thd); int show_binlog_events(THD* thd);
int cmp_master_pos(const char* log_file_name1, ulonglong log_pos1, int cmp_master_pos(const char* log_file_name1, ulonglong log_pos1,
const char* log_file_name2, ulonglong log_pos2); const char* log_file_name2, ulonglong log_pos2);
void reset_slave(); int reset_slave(MASTER_INFO* mi);
void reset_master(); int reset_master(THD* thd);
int purge_master_logs(THD* thd, const char* to_log); int purge_master_logs(THD* thd, const char* to_log);
bool log_in_use(const char* log_name); bool log_in_use(const char* log_name);
void adjust_linfo_offsets(my_off_t purge_offset); void adjust_linfo_offsets(my_off_t purge_offset);
int show_binlogs(THD* thd); int show_binlogs(THD* thd);
extern int init_master_info(MASTER_INFO* mi); extern int init_master_info(MASTER_INFO* mi);
void kill_zombie_dump_threads(uint32 slave_server_id); void kill_zombie_dump_threads(uint32 slave_server_id);
int check_binlog_magic(IO_CACHE* log, const char** errmsg);
typedef struct st_load_file_info typedef struct st_load_file_info
{ {
......
...@@ -1177,6 +1177,15 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables) ...@@ -1177,6 +1177,15 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables)
case SHOW_RPL_STATUS: case SHOW_RPL_STATUS:
net_store_data(&packet2, rpl_status_type[(int)rpl_status]); net_store_data(&packet2, rpl_status_type[(int)rpl_status]);
break; break;
case SHOW_SLAVE_RUNNING:
{
LOCK_ACTIVE_MI;
net_store_data(&packet2, (active_mi->slave_running &&
active_mi->rli.slave_running)
? "ON" : "OFF");
UNLOCK_ACTIVE_MI;
break;
}
case SHOW_OPENTABLES: case SHOW_OPENTABLES:
net_store_data(&packet2,(uint32) cached_tables()); net_store_data(&packet2,(uint32) cached_tables());
break; break;
......
This diff is collapsed.
...@@ -123,7 +123,7 @@ terribly wrong...\n"); ...@@ -123,7 +123,7 @@ terribly wrong...\n");
} }
#endif /* __alpha__ */ #endif /* __alpha__ */
if (!stack_bottom) if (!stack_bottom || (gptr) stack_bottom > (gptr) &fp)
{ {
ulong tmp= min(0x10000,thread_stack); ulong tmp= min(0x10000,thread_stack);
/* Assume that the stack starts at the previous even 65K */ /* Assume that the stack starts at the previous even 65K */
......
...@@ -140,7 +140,7 @@ enum SHOW_TYPE { SHOW_LONG,SHOW_CHAR,SHOW_INT,SHOW_CHAR_PTR,SHOW_BOOL, ...@@ -140,7 +140,7 @@ enum SHOW_TYPE { SHOW_LONG,SHOW_CHAR,SHOW_INT,SHOW_CHAR_PTR,SHOW_BOOL,
,SHOW_SSL_CTX_SESS_TIMEOUTS, SHOW_SSL_CTX_SESS_CACHE_FULL ,SHOW_SSL_CTX_SESS_TIMEOUTS, SHOW_SSL_CTX_SESS_CACHE_FULL
,SHOW_SSL_GET_CIPHER_LIST ,SHOW_SSL_GET_CIPHER_LIST
#endif /* HAVE_OPENSSL */ #endif /* HAVE_OPENSSL */
,SHOW_RPL_STATUS ,SHOW_RPL_STATUS, SHOW_SLAVE_RUNNING
}; };
enum SHOW_COMP_OPTION { SHOW_OPTION_YES, SHOW_OPTION_NO, SHOW_OPTION_DISABLED}; enum SHOW_COMP_OPTION { SHOW_OPTION_YES, SHOW_OPTION_NO, SHOW_OPTION_DISABLED};
......
This diff is collapsed.
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