mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge work:/home/bk/mysql into serg.mysql.com:/usr/home/serg/Abk/mysql
BitKeeper/etc/logging_ok: auto-union Docs/manual.texi: Auto merged
This commit is contained in:
@ -1,3 +1,4 @@
|
|||||||
mwagner@evoq.mwagner.org
|
|
||||||
heikki@donna.mysql.fi
|
heikki@donna.mysql.fi
|
||||||
|
mwagner@evoq.mwagner.org
|
||||||
|
sasha@mysql.sashanet.com
|
||||||
serg@serg.mysql.com
|
serg@serg.mysql.com
|
||||||
|
@ -41660,6 +41660,8 @@ not yet 100 % confident in this code.
|
|||||||
@appendixsubsec Changes in release 3.23.34
|
@appendixsubsec Changes in release 3.23.34
|
||||||
@itemize @bullet
|
@itemize @bullet
|
||||||
@item
|
@item
|
||||||
|
Improved error diagnostic for slave thread exit
|
||||||
|
@item
|
||||||
Fixed bug in @code{ALTER TABLE ... ORDER BY}.
|
Fixed bug in @code{ALTER TABLE ... ORDER BY}.
|
||||||
@item
|
@item
|
||||||
Added option @code{max_user_connections} to @code{mysqld}.
|
Added option @code{max_user_connections} to @code{mysqld}.
|
||||||
|
@ -28,10 +28,14 @@ Created 10/21/1995 Heikki Tuuri
|
|||||||
#define POSIX_ASYNC_IO
|
#define POSIX_ASYNC_IO
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef S_IRWXU
|
#ifndef S_IRUSR
|
||||||
#define S_IRWXU 00700
|
#define
|
||||||
#define S_IRWXG 00070
|
#define S_IRUSR 00400
|
||||||
#define S_IRWXO 00007
|
#define S_IWUSR 00200
|
||||||
|
#define S_IRGRP 00040
|
||||||
|
#define S_IWGRP 00020
|
||||||
|
#define S_IROTH 00004
|
||||||
|
#define S_IWOTH 00002
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -316,11 +316,8 @@ try_again:
|
|||||||
UT_NOT_USED(purpose);
|
UT_NOT_USED(purpose);
|
||||||
|
|
||||||
if (create_mode == OS_FILE_CREATE) {
|
if (create_mode == OS_FILE_CREATE) {
|
||||||
#ifndef S_IRWXU
|
file = open(name, create_flag, S_IRUSR | S_IRGRP | S_IROTH
|
||||||
file = open(name, create_flag);
|
| S_IWUSR | S_IWGRP | S_IWOTH);
|
||||||
#else
|
|
||||||
file = open(name, create_flag, S_IRWXU | S_IRWXG | S_IRWXO);
|
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
file = open(name, create_flag);
|
file = open(name, create_flag);
|
||||||
}
|
}
|
||||||
|
@ -45,3 +45,21 @@ select t1.id FROM t2 as ttxt,t1 INNER JOIN t1 as ticket2 ON ticket2.id = ttxt.ti
|
|||||||
show keys from t2;
|
show keys from t2;
|
||||||
show create table t2;
|
show create table t2;
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
|
||||||
|
# check for bug reported by Stephan Skusa
|
||||||
|
|
||||||
|
drop table if exists fulltextTEST;
|
||||||
|
CREATE TABLE fulltextTEST (
|
||||||
|
field1 varchar(40) NOT NULL,
|
||||||
|
field2 varchar(20) NOT NULL,
|
||||||
|
field3 varchar(40) NOT NULL,
|
||||||
|
PRIMARY KEY (field1),
|
||||||
|
FULLTEXT idx_fulltext (field1, field2, field3)
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO fulltextTEST VALUES ( 'test1', 'test1.1', 'test1.1.1');
|
||||||
|
INSERT INTO fulltextTEST VALUES ( 'test2', 'test2.1', 'test2.1.1');
|
||||||
|
select *
|
||||||
|
from fulltextTEST
|
||||||
|
where MATCH (field1,field2,field3) AGAINST (NULL);
|
||||||
|
drop table fulltextTEST;
|
||||||
|
48
sql/slave.cc
48
sql/slave.cc
@ -588,7 +588,7 @@ int show_master_info(THD* thd)
|
|||||||
net_store_data(packet, (uint32) glob_mi.port);
|
net_store_data(packet, (uint32) glob_mi.port);
|
||||||
net_store_data(packet, (uint32) glob_mi.connect_retry);
|
net_store_data(packet, (uint32) glob_mi.connect_retry);
|
||||||
net_store_data(packet, glob_mi.log_file_name);
|
net_store_data(packet, glob_mi.log_file_name);
|
||||||
net_store_data(packet, (longlong) glob_mi.pos);
|
net_store_data(packet, (uint32) glob_mi.pos);
|
||||||
pthread_mutex_unlock(&glob_mi.lock);
|
pthread_mutex_unlock(&glob_mi.lock);
|
||||||
pthread_mutex_lock(&LOCK_slave);
|
pthread_mutex_lock(&LOCK_slave);
|
||||||
net_store_data(packet, slave_running ? "Yes":"No");
|
net_store_data(packet, slave_running ? "Yes":"No");
|
||||||
@ -1150,7 +1150,7 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused)))
|
|||||||
|
|
||||||
int error = 1;
|
int error = 1;
|
||||||
bool retried_once = 0;
|
bool retried_once = 0;
|
||||||
ulonglong last_failed_pos = 0;
|
uint32 last_failed_pos = 0;
|
||||||
|
|
||||||
// needs to call my_thread_init(), otherwise we get a coredump in DBUG_ stuff
|
// needs to call my_thread_init(), otherwise we get a coredump in DBUG_ stuff
|
||||||
my_thread_init();
|
my_thread_init();
|
||||||
@ -1160,7 +1160,10 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused)))
|
|||||||
|
|
||||||
pthread_detach_this_thread();
|
pthread_detach_this_thread();
|
||||||
if (init_slave_thread(thd) || init_master_info(&glob_mi))
|
if (init_slave_thread(thd) || init_master_info(&glob_mi))
|
||||||
goto err;
|
{
|
||||||
|
sql_print_error("Failed during slave thread initialization");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
thd->thread_stack = (char*)&thd; // remember where our stack is
|
thd->thread_stack = (char*)&thd; // remember where our stack is
|
||||||
thd->temporary_tables = save_temporary_tables; // restore temp tables
|
thd->temporary_tables = save_temporary_tables; // restore temp tables
|
||||||
threads.append(thd);
|
threads.append(thd);
|
||||||
@ -1175,7 +1178,7 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused)))
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
thd->proc_info = "Connecting to master";
|
thd->proc_info = "connecting to master";
|
||||||
#ifndef DBUG_OFF
|
#ifndef DBUG_OFF
|
||||||
sql_print_error("Slave thread initialized");
|
sql_print_error("Slave thread initialized");
|
||||||
#endif
|
#endif
|
||||||
@ -1187,7 +1190,10 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused)))
|
|||||||
RPL_LOG_NAME,
|
RPL_LOG_NAME,
|
||||||
glob_mi.pos);
|
glob_mi.pos);
|
||||||
else
|
else
|
||||||
goto err;
|
{
|
||||||
|
sql_print_error("Slave thread killed while connecting to master");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
while (!slave_killed(thd))
|
while (!slave_killed(thd))
|
||||||
{
|
{
|
||||||
@ -1196,9 +1202,13 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused)))
|
|||||||
{
|
{
|
||||||
sql_print_error("Failed on request_dump()");
|
sql_print_error("Failed on request_dump()");
|
||||||
if(slave_killed(thd))
|
if(slave_killed(thd))
|
||||||
goto err;
|
{
|
||||||
|
sql_print_error("Slave thread killed while requesting master \
|
||||||
|
dump");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
thd->proc_info = "Waiting to reconnect after a failed dump request";
|
thd->proc_info = "Waiiting to reconnect after a failed dump request";
|
||||||
if(mysql->net.vio)
|
if(mysql->net.vio)
|
||||||
vio_close(mysql->net.vio);
|
vio_close(mysql->net.vio);
|
||||||
// first time retry immediately, assuming that we can recover
|
// first time retry immediately, assuming that we can recover
|
||||||
@ -1210,14 +1220,21 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused)))
|
|||||||
retried_once = 1;
|
retried_once = 1;
|
||||||
|
|
||||||
if(slave_killed(thd))
|
if(slave_killed(thd))
|
||||||
|
{
|
||||||
|
sql_print_error("Slave thread killed while retrying master \
|
||||||
|
dump");
|
||||||
goto err;
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
thd->proc_info = "Reconnecting after a failed dump request";
|
thd->proc_info = "Reconnecting after a failed dump request";
|
||||||
sql_print_error("Slave: failed dump request, reconnecting to \
|
sql_print_error("Slave: failed dump request, reconnecting to \
|
||||||
try again, log '%s' at postion %ld", RPL_LOG_NAME,
|
try again, log '%s' at postion %ld", RPL_LOG_NAME,
|
||||||
last_failed_pos = glob_mi.pos );
|
last_failed_pos = glob_mi.pos );
|
||||||
if(safe_reconnect(thd, mysql, &glob_mi) || slave_killed(thd))
|
if(safe_reconnect(thd, mysql, &glob_mi) || slave_killed(thd))
|
||||||
|
{
|
||||||
|
sql_print_error("Slave thread killed during or after reconnect");
|
||||||
goto err;
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1228,7 +1245,10 @@ try again, log '%s' at postion %ld", RPL_LOG_NAME,
|
|||||||
thd->proc_info = "Reading master update";
|
thd->proc_info = "Reading master update";
|
||||||
uint event_len = read_event(mysql, &glob_mi);
|
uint event_len = read_event(mysql, &glob_mi);
|
||||||
if(slave_killed(thd))
|
if(slave_killed(thd))
|
||||||
goto err;
|
{
|
||||||
|
sql_print_error("Slave thread killed while reading event");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
if (event_len == packet_error)
|
if (event_len == packet_error)
|
||||||
{
|
{
|
||||||
@ -1241,13 +1261,21 @@ try again, log '%s' at postion %ld", RPL_LOG_NAME,
|
|||||||
retried_once = 1;
|
retried_once = 1;
|
||||||
|
|
||||||
if(slave_killed(thd))
|
if(slave_killed(thd))
|
||||||
goto err;
|
{
|
||||||
|
sql_print_error("Slave thread killed while waiting to \
|
||||||
|
reconnect after a failed read");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
thd->proc_info = "Reconnecting after a failed read";
|
thd->proc_info = "Reconnecting after a failed read";
|
||||||
sql_print_error("Slave: Failed reading log event, \
|
sql_print_error("Slave: Failed reading log event, \
|
||||||
reconnecting to retry, log '%s' position %ld", RPL_LOG_NAME,
|
reconnecting to retry, log '%s' position %ld", RPL_LOG_NAME,
|
||||||
last_failed_pos = glob_mi.pos);
|
last_failed_pos = glob_mi.pos);
|
||||||
if(safe_reconnect(thd, mysql, &glob_mi) || slave_killed(thd))
|
if(safe_reconnect(thd, mysql, &glob_mi) || slave_killed(thd))
|
||||||
goto err;
|
{
|
||||||
|
sql_print_error("Slave thread killed during or after a \
|
||||||
|
reconnect done to recover from failed read");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
typedef struct st_master_info
|
typedef struct st_master_info
|
||||||
{
|
{
|
||||||
char log_file_name[FN_REFLEN];
|
char log_file_name[FN_REFLEN];
|
||||||
ulonglong pos,pending;
|
uint32 pos,pending;
|
||||||
File fd; // we keep the file open, so we need to remember the file pointer
|
File fd; // we keep the file open, so we need to remember the file pointer
|
||||||
IO_CACHE file;
|
IO_CACHE file;
|
||||||
// the variables below are needed because we can change masters on the fly
|
// the variables below are needed because we can change masters on the fly
|
||||||
@ -29,11 +29,11 @@ typedef struct st_master_info
|
|||||||
pthread_mutex_destroy(&lock);
|
pthread_mutex_destroy(&lock);
|
||||||
pthread_cond_destroy(&cond);
|
pthread_cond_destroy(&cond);
|
||||||
}
|
}
|
||||||
inline void inc_pending(ulonglong val)
|
inline void inc_pending(uint32 val)
|
||||||
{
|
{
|
||||||
pending += val;
|
pending += val;
|
||||||
}
|
}
|
||||||
inline void inc_pos(ulonglong val)
|
inline void inc_pos(uint32 val)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&lock);
|
pthread_mutex_lock(&lock);
|
||||||
pos += val + pending;
|
pos += val + pending;
|
||||||
@ -43,7 +43,7 @@ typedef struct st_master_info
|
|||||||
}
|
}
|
||||||
// thread safe read of position - not needed if we are in the slave thread,
|
// thread safe read of position - not needed if we are in the slave thread,
|
||||||
// but required otherwise
|
// but required otherwise
|
||||||
inline void read_pos(ulonglong& var)
|
inline void read_pos(uint32& var)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&lock);
|
pthread_mutex_lock(&lock);
|
||||||
var = pos;
|
var = pos;
|
||||||
|
Reference in New Issue
Block a user