Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
fa4e07bf
Commit
fa4e07bf
authored
22 years ago
by
monty@mashka.mysql.fi
Browse files
Options
Browse Files
Download
Plain Diff
merge
parents
75b4156d
f3a186c9
Changes
43
Hide whitespace changes
Inline
Side-by-side
Showing
43 changed files
with
483 additions
and
314 deletions
+483
-314
Docs/manual.texi
Docs/manual.texi
+19
-8
client/mysqlbinlog.cc
client/mysqlbinlog.cc
+18
-16
client/mysqltest.c
client/mysqltest.c
+38
-64
configure.in
configure.in
+9
-1
include/my_sys.h
include/my_sys.h
+13
-6
innobase/btr/btr0cur.c
innobase/btr/btr0cur.c
+1
-1
libmysql/libmysql.c
libmysql/libmysql.c
+24
-20
mysql-test/mysql-test-run.sh
mysql-test/mysql-test-run.sh
+6
-3
mysql-test/r/grant.result
mysql-test/r/grant.result
+3
-0
mysql-test/r/innodb.result
mysql-test/r/innodb.result
+1
-1
mysql-test/r/myisam.result
mysql-test/r/myisam.result
+6
-0
mysql-test/r/rpl_flush_log_loop.result
mysql-test/r/rpl_flush_log_loop.result
+17
-0
mysql-test/r/rpl_log.result
mysql-test/r/rpl_log.result
+20
-27
mysql-test/r/rpl_redirect.result
mysql-test/r/rpl_redirect.result
+43
-0
mysql-test/r/rpl_rotate_logs.result
mysql-test/r/rpl_rotate_logs.result
+2
-4
mysql-test/r/variables.result
mysql-test/r/variables.result
+1
-1
mysql-test/t/grant.test
mysql-test/t/grant.test
+1
-0
mysql-test/t/myisam.test
mysql-test/t/myisam.test
+10
-0
mysql-test/t/rpl_flush_log_loop-master.opt
mysql-test/t/rpl_flush_log_loop-master.opt
+1
-0
mysql-test/t/rpl_flush_log_loop-slave.opt
mysql-test/t/rpl_flush_log_loop-slave.opt
+1
-0
mysql-test/t/rpl_flush_log_loop.test
mysql-test/t/rpl_flush_log_loop.test
+17
-0
mysql-test/t/rpl_log.test
mysql-test/t/rpl_log.test
+24
-16
mysql-test/t/rpl_mystery22.test
mysql-test/t/rpl_mystery22.test
+1
-1
mysql-test/t/rpl_redirect.test
mysql-test/t/rpl_redirect.test
+12
-1
mysql-test/t/rpl_rotate_logs.test
mysql-test/t/rpl_rotate_logs.test
+3
-4
mysys/my_malloc.c
mysys/my_malloc.c
+12
-0
mysys/safemalloc.c
mysys/safemalloc.c
+14
-0
mysys/thr_alarm.c
mysys/thr_alarm.c
+1
-1
sql/ha_innodb.cc
sql/ha_innodb.cc
+1
-1
sql/ha_innodb.h
sql/ha_innodb.h
+2
-1
sql/item_func.cc
sql/item_func.cc
+9
-3
sql/log.cc
sql/log.cc
+5
-4
sql/log_event.cc
sql/log_event.cc
+22
-53
sql/log_event.h
sql/log_event.h
+3
-4
sql/mysqld.cc
sql/mysqld.cc
+1
-1
sql/net_serv.cc
sql/net_serv.cc
+2
-0
sql/repl_failsafe.cc
sql/repl_failsafe.cc
+9
-11
sql/slave.cc
sql/slave.cc
+76
-47
sql/slave.h
sql/slave.h
+1
-0
sql/sql_acl.cc
sql/sql_acl.cc
+11
-5
sql/sql_parse.cc
sql/sql_parse.cc
+5
-0
sql/sql_repl.cc
sql/sql_repl.cc
+10
-3
sql/sql_udf.cc
sql/sql_udf.cc
+8
-6
No files found.
Docs/manual.texi
View file @
fa4e07bf
...
...
@@ -1793,7 +1793,7 @@ and @code{row-level locking}.
@item
Our German, Austrian, and Swiss users will note that we have a new character
set, @code{latin_de}, which corrects the @emph{German sorting order},
set, @code{latin
1
_de}, which corrects the @emph{German sorting order},
placing German umlauts in the same order as German telephone books.
@item
...
...
@@ -3409,9 +3409,6 @@ database if you are not using the @code{-A} option or if you are using
@code{rehash}. This is especially notable when you have a big table
cache.
@item
The current replication protocol cannot deal with @code{LOAD DATA INFILE}
and line terminator characters of more than 1 character.
@end itemize
The following problems are known and will be fixed in due time:
...
...
@@ -3422,6 +3419,10 @@ The following problems are known and will be fixed in due time:
When using @code{SET CHARACTER SET}, one can't use translated
characters in database, table, and column names.
@item
One can't use @code{_} or @code{%} with @code{ESCAPE} in @code{LIKE
... ESCAPE}.
@item
If you have a @code{DECIMAL} column with a number stored in different
formats (+01.00, 1.00, 01.00), @code{GROUP BY} may regard each value
...
...
@@ -20614,7 +20615,7 @@ but normally this is never needed.
@subsubsection German character set
To get German sorting order, you should start @code{mysqld} with
@code{--default-character-set=latin_de}. This will give you the following
@code{--default-character-set=latin
1
_de}. This will give you the following
characteristics.
When sorting and comparing string's the following mapping is done on the
...
...
@@ -50393,8 +50394,18 @@ each individual 4.0.x release.
@itemize @bullet
@item
Fixed a bug, that caused MySQL to create unusable MyISAM tables, when key
length (in @code{CREATE TABLE}) exceeded 500 bytes.
@code{SELECT @@@@[global|session].var_name} didn't report
@code{global | session} in the result column name.
@item
Fixed problem in replication that @code{FLUSH LOGS} in a circular
replication setup created an infinite number of binary log files.
Now a @code{rotate-binary-log} command in the binary log will not cause slaves
to rotate logs.
@item
Removed @code{STOP EVENT} from binary log when doing @code{FLUSH LOGS}.
@item
Disable the use of @code{SHOW NEW MASTER FOR SLAVE} as this needs to be
completely changed in 4.1.
@item
Fixed a bug with constant expression (e.g. field of a one-row table, or field
from a table, referenced by a @code{UNIQUE} key) appeared in @code{ORDER BY}
...
...
@@ -50963,7 +50974,7 @@ Secure connections (with SSL).
Unsigned @code{BIGINT} constants now work. @code{MIN()} and @code{MAX()}
now handle signed and unsigned @code{BIGINT} numbers correctly.
@item
New character set @code{latin_de} which provides correct German sorting.
New character set @code{latin
1
_de} which provides correct German sorting.
@item
@code{STRCMP()} now uses the current character set when doing comparisons,
which means that the default comparison behaviour now is case-insensitive.
This diff is collapsed.
Click to expand it.
client/mysqlbinlog.cc
View file @
fa4e07bf
...
...
@@ -21,7 +21,7 @@
#include "log_event.h"
#define BIN_LOG_HEADER_SIZE 4
#define PROBE_HEADER_LEN (
BIN_LOG_HEADER_SIZE+
EVENT_LEN_OFFSET+4)
#define PROBE_HEADER_LEN (EVENT_LEN_OFFSET+4)
#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | CLIENT_LOCAL_FILES)
...
...
@@ -378,31 +378,40 @@ static void dump_remote_log_entries(const char* logname)
static
int
check_header
(
IO_CACHE
*
file
)
{
byte
header
[
BIN_LOG_HEADER_SIZE
];
byte
buf
[
PROBE_HEADER_LEN
];
int
old_format
=
0
;
my_off_t
pos
=
my_b_tell
(
file
);
my_b_seek
(
file
,
(
my_off_t
)
0
);
if
(
my_b_read
(
file
,
buf
,
sizeof
(
buf
)))
die
(
"Failed reading header"
);
if
(
buf
[
EVENT_TYPE_OFFSET
+
4
]
==
START_EVENT
)
if
(
my_b_read
(
file
,
header
,
sizeof
(
header
)))
die
(
"Failed reading header; Probably an empty file"
);
if
(
memcmp
(
header
,
BINLOG_MAGIC
,
sizeof
(
header
)))
die
(
"File is not a binary log file"
);
if
(
!
my_b_read
(
file
,
buf
,
sizeof
(
buf
)))
{
uint
event_len
;
event_len
=
uint4korr
(
buf
+
EVENT_LEN_OFFSET
+
4
);
old_format
=
(
event_len
<
LOG_EVENT_HEADER_LEN
+
START_HEADER_LEN
);
if
(
buf
[
4
]
==
START_EVENT
)
{
uint
event_len
;
event_len
=
uint4korr
(
buf
+
4
);
old_format
=
(
event_len
<
LOG_EVENT_HEADER_LEN
+
START_HEADER_LEN
);
}
}
my_b_seek
(
file
,
pos
);
return
old_format
;
}
static
void
dump_local_log_entries
(
const
char
*
logname
)
{
File
fd
=
-
1
;
IO_CACHE
cache
,
*
file
=
&
cache
;
ulonglong
rec_count
=
0
;
char
last_db
[
FN_REFLEN
+
1
]
=
""
;
char
last_db
[
FN_REFLEN
+
1
]
,
tmp_buff
[
BIN_LOG_HEADER_SIZE
]
;
bool
old_format
=
0
;
last_db
[
0
]
=
0
;
if
(
logname
&&
logname
[
0
]
!=
'-'
)
{
if
((
fd
=
my_open
(
logname
,
O_RDONLY
|
O_BINARY
,
MYF
(
MY_WME
)))
<
0
)
...
...
@@ -435,14 +444,7 @@ static void dump_local_log_entries(const char* logname)
}
if
(
!
position
)
{
char
magic
[
BIN_LOG_HEADER_SIZE
];
if
(
my_b_read
(
file
,
(
byte
*
)
magic
,
sizeof
(
magic
)))
die
(
"I/O error reading binlog magic number"
);
if
(
memcmp
(
magic
,
BINLOG_MAGIC
,
4
))
die
(
"Bad magic number; The file is probably not a MySQL binary log"
);
}
my_b_read
(
file
,
tmp_buff
,
BIN_LOG_HEADER_SIZE
);
// Skip header
for
(;;)
{
char
llbuff
[
21
];
...
...
This diff is collapsed.
Click to expand it.
client/mysqltest.c
View file @
fa4e07bf
...
...
@@ -87,11 +87,8 @@
#define CON_RETRY_SLEEP 2
#define MAX_CON_TRIES 5
#ifndef OS2
#define SLAVE_POLL_INTERVAL 300000
/* 0.3 of a sec */
#else
#defile SLAVE_POLL_INTERVAL 0.3
#endif
enum
{
OPT_MANAGER_USER
=
256
,
OPT_MANAGER_HOST
,
OPT_MANAGER_PASSWD
,
OPT_MANAGER_PORT
,
OPT_MANAGER_WAIT_TIMEOUT
};
...
...
@@ -423,6 +420,7 @@ static void free_used_memory()
my_free
(
embedded_server_args
[
--
embedded_server_arg_count
],
MYF
(
0
));
delete_dynamic
(
&
q_lines
);
dynstr_free
(
&
ds_res
);
free_replace
();
my_free
(
pass
,
MYF
(
MY_ALLOW_ZERO_PTR
));
free_defaults
(
default_argv
);
mysql_server_end
();
...
...
@@ -687,13 +685,23 @@ int open_file(const char* name)
return
0
;
}
static
void
my_sleep
(
ulong
m_seconds
)
{
#ifndef OS2
struct
timeval
t
;
t
.
tv_sec
=
m_seconds
/
1000000L
;
t
.
tv_usec
=
m_seconds
%
1000000L
;
select
(
0
,
0
,
0
,
0
,
&
t
);
/* sleep */
#else
DosSleep
(
m_seconds
/
1000
+
1
);
#endif
}
/* ugly long name, but we are following the convention */
int
do_wait_for_slave_to_stop
(
struct
st_query
*
q
__attribute__
((
unused
)))
{
MYSQL
*
mysql
=
&
cur_con
->
mysql
;
#ifndef OS2
struct
timeval
t
;
#endif
for
(;;)
{
MYSQL_RES
*
res
;
...
...
@@ -714,15 +722,8 @@ int do_wait_for_slave_to_stop(struct st_query* q __attribute__((unused)))
mysql_free_result
(
res
);
if
(
done
)
break
;
#ifndef OS2
t
.
tv_sec
=
0
;
t
.
tv_usec
=
SLAVE_POLL_INTERVAL
;
select
(
0
,
0
,
0
,
0
,
&
t
);
/* sleep */
#else
DosSleep
(
OS2_SLAVE_POLL_INTERVAL
);
#endif
my_sleep
(
SLAVE_POLL_INTERVAL
);
}
return
0
;
}
...
...
@@ -1000,10 +1001,18 @@ int do_sync_with_master2(const char* p)
die
(
"line %u: empty result in %s"
,
start_lineno
,
query_buf
);
if
(
!
row
[
0
])
die
(
"Error on slave while syncing with master"
);
mysql_free_result
(
res
);
last_result
=
0
;
mysql_free_result
(
res
);
last_result
=
0
;
if
(
rpl_parse
)
mysql_enable_rpl_parse
(
mysql
);
#ifndef TO_BE_REMOVED
/*
We need this because wait_for_pos() only waits for the relay log,
which doesn't guarantee that the slave has executed the statement.
*/
my_sleep
(
2
*
1000000L
);
#endif
return
0
;
}
...
...
@@ -1082,53 +1091,15 @@ int do_disable_rpl_parse(struct st_query* q __attribute__((unused)))
int
do_sleep
(
struct
st_query
*
q
,
my_bool
real_sleep
)
{
char
*
p
=
q
->
first_argument
;
struct
timeval
t
;
int
dec_mul
=
1000000
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
while
(
*
p
&&
isspace
(
*
p
))
p
++
;
if
(
!*
p
)
die
(
"Missing argument in sleep
\n
"
);
t
.
tv_usec
=
0
;
#ifdef OS2
if
(
opt_sleep
&&
!
real_sleep
)
DosSleep
(
opt_sleep
*
1000
);
my_sleep
(
opt_sleep
*
1000000L
);
else
DosSleep
(
atof
(
p
)
*
1000
);
my_sleep
((
ulong
)
(
atof
(
p
)
*
1000000L
));
return
0
;
#else
if
(
opt_sleep
&&
!
real_sleep
)
t
.
tv_sec
=
opt_sleep
;
else
{
t
.
tv_sec
=
atoi
(
p
);
while
(
*
p
&&
*
p
!=
'.'
&&
!
isspace
(
*
p
))
p
++
;
if
(
*
p
==
'.'
)
{
int
c
;
char
*
p_end
;
p
++
;
p_end
=
p
+
6
;
for
(;
p
<=
p_end
;
++
p
)
{
c
=
(
int
)
(
*
p
-
'0'
);
if
(
c
<
10
&&
(
int
)
c
>=
0
)
{
t
.
tv_usec
=
t
.
tv_usec
*
10
+
c
;
dec_mul
/=
10
;
}
else
break
;
}
}
}
t
.
tv_usec
*=
dec_mul
;
return
select
(
0
,
0
,
0
,
0
,
&
t
);
#endif
}
static
void
get_file_name
(
char
*
filename
,
struct
st_query
*
q
)
...
...
@@ -1261,8 +1232,7 @@ static void get_replace(struct st_query *q)
POINTER_ARRAY
to_array
,
from_array
;
DBUG_ENTER
(
"get_replace"
);
if
(
glob_replace
)
free_replace
();
free_replace
();
bzero
((
char
*
)
&
to_array
,
sizeof
(
to_array
));
bzero
((
char
*
)
&
from_array
,
sizeof
(
from_array
));
...
...
@@ -1298,9 +1268,12 @@ static void get_replace(struct st_query *q)
void
free_replace
()
{
DBUG_ENTER
(
"free_replace"
);
my_free
((
char
*
)
glob_replace
,
MYF
(
0
));
glob_replace
=
0
;
free_replace_buffer
();
if
(
glob_replace
)
{
my_free
((
char
*
)
glob_replace
,
MYF
(
0
));
glob_replace
=
0
;
free_replace_buffer
();
}
DBUG_VOID_RETURN
;
}
...
...
@@ -2077,7 +2050,7 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
char
*
query
;
int
query_len
;
DBUG_ENTER
(
"run_query"
);
if
(
q
->
type
!=
Q_EVAL
)
{
query
=
q
->
query
;
...
...
@@ -2090,6 +2063,7 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
query
=
eval_query
.
str
;
query_len
=
eval_query
.
length
;
}
DBUG_PRINT
(
"enter"
,
(
"query: '%-.60s'"
,
query
));
if
(
q
->
record_file
[
0
])
{
...
...
This diff is collapsed.
Click to expand it.
configure.in
View file @
fa4e07bf
...
...
@@ -922,7 +922,7 @@ case $SYSTEM_TYPE in
fi
fi
;;
*
darwin
*
)
*
darwin
5
*
)
if
test
"
$ac_cv_prog_gcc
"
=
"yes"
then
CFLAGS
=
"
$CFLAGS
-traditional-cpp -DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DHAVE_BROKEN_REALPATH"
...
...
@@ -931,6 +931,14 @@ case $SYSTEM_TYPE in
with_named_curses
=
""
fi
;;
*
darwin6
*
)
if
test
"
$ac_cv_prog_gcc
"
=
"yes"
then
CFLAGS
=
"
$CFLAGS
-traditional-cpp -DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DHAVE_BROKEN_REALPATH"
CXXFLAGS
=
"
$CXXFLAGS
-traditional-cpp -DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ"
MAX_C_OPTIMIZE
=
"-O"
fi
;;
*
freebsd
*
)
echo
"Adding fix for interrupted reads"
CXXFLAGS
=
"
$CXXFLAGS
-DMYSQLD_NET_RETRY_COUNT=1000000"
...
...
This diff is collapsed.
Click to expand it.
include/my_sys.h
View file @
fa4e07bf
...
...
@@ -126,13 +126,14 @@ extern int NEAR my_errno; /* Last error in mysys */
/* defines when allocating data */
#ifdef SAFEMALLOC
#define my_malloc(SZ,FLAG) _mymalloc(
SZ
, __FILE__, __LINE__, FLAG )
#define my_malloc_ci(SZ,FLAG) _mymalloc(
SZ
, sFile, uLine, FLAG )
#define my_realloc(PTR,SZ,FLAG) _myrealloc(
PTR, SZ
, __FILE__, __LINE__, FLAG )
#define my_malloc(SZ,FLAG) _mymalloc(
(SZ)
, __FILE__, __LINE__, FLAG )
#define my_malloc_ci(SZ,FLAG) _mymalloc(
(SZ)
, sFile, uLine, FLAG )
#define my_realloc(PTR,SZ,FLAG) _myrealloc(
(PTR), (SZ)
, __FILE__, __LINE__, FLAG )
#define my_checkmalloc() _sanity( __FILE__, __LINE__ )
#define my_free(PTR,FLAG) _myfree( PTR, __FILE__, __LINE__,FLAG)
#define my_memdup(A,B,C) _my_memdup(A,B,__FILE__,__LINE__,C)
#define my_strdup(A,C) _my_strdup(A,__FILE__,__LINE__,C)
#define my_free(PTR,FLAG) _myfree((PTR), __FILE__, __LINE__,FLAG)
#define my_memdup(A,B,C) _my_memdup((A),(B), __FILE__,__LINE__,C)
#define my_strdup(A,C) _my_strdup((A), __FILE__,__LINE__,C)
#define my_strdup_with_length(A,B,C) _my_strdup_with_length((A),(B),__FILE__,__LINE__,C)
#define QUICK_SAFEMALLOC sf_malloc_quick=1
#define NORMAL_SAFEMALLOC sf_malloc_quick=0
extern
uint
sf_malloc_prehunc
,
sf_malloc_endhunc
,
sf_malloc_quick
;
...
...
@@ -153,6 +154,8 @@ extern gptr my_realloc(gptr oldpoint,uint Size,myf MyFlags);
extern
void
my_no_flags_free
(
gptr
ptr
);
extern
gptr
my_memdup
(
const
byte
*
from
,
uint
length
,
myf
MyFlags
);
extern
my_string
my_strdup
(
const
char
*
from
,
myf
MyFlags
);
extern
my_string
my_strdup_with_length
(
const
char
*
from
,
uint
length
,
myf
MyFlags
);
#define my_free(PTR,FG) my_no_flags_free(PTR)
#define CALLER_INFO_PROTO
/* nothing */
#define CALLER_INFO
/* nothing */
...
...
@@ -550,6 +553,10 @@ extern gptr _my_memdup(const byte *from,uint length,
const
char
*
sFile
,
uint
uLine
,
myf
MyFlag
);
extern
my_string
_my_strdup
(
const
char
*
from
,
const
char
*
sFile
,
uint
uLine
,
myf
MyFlag
);
extern
my_string
_my_strdup_with_length
(
const
char
*
from
,
uint
length
,
const
char
*
sFile
,
uint
uLine
,
myf
MyFlag
);
#ifndef TERMINATE
extern
void
TERMINATE
(
FILE
*
file
);
#endif
...
...
This diff is collapsed.
Click to expand it.
innobase/btr/btr0cur.c
View file @
fa4e07bf
...
...
@@ -808,7 +808,7 @@ btr_cur_optimistic_insert(
if
(
!
dtuple_check_typed_no_assert
(
entry
))
{
fprintf
(
stderr
,
"InnoDB: Error in a tuple to insert into table %
lu
index %s
\n
"
,
"InnoDB: Error in a tuple to insert into table %
s
index %s
\n
"
,
index
->
table_name
,
index
->
name
);
}
...
...
This diff is collapsed.
Click to expand it.
libmysql/libmysql.c
View file @
fa4e07bf
...
...
@@ -1049,21 +1049,21 @@ read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row, ulong *lengths)
int
STDCALL
mysql_master_query
(
MYSQL
*
mysql
,
const
char
*
q
,
unsigned
long
length
)
{
DBUG_ENTER
(
"mysql_master_query"
);
if
(
mysql_master_send_query
(
mysql
,
q
,
length
))
return
1
;
return
mysql_read_query_result
(
mysql
);
DBUG_RETURN
(
1
)
;
DBUG_RETURN
(
mysql_read_query_result
(
mysql
)
);
}
int
STDCALL
mysql_master_send_query
(
MYSQL
*
mysql
,
const
char
*
q
,
unsigned
long
length
)
{
MYSQL
*
master
=
mysql
->
master
;
if
(
!
length
)
length
=
strlen
(
q
);
MYSQL
*
master
=
mysql
->
master
;
DBUG_ENTER
(
"mysql_master_send_query"
);
if
(
!
master
->
net
.
vio
&&
!
mysql_real_connect
(
master
,
0
,
0
,
0
,
0
,
0
,
0
,
0
))
return
1
;
DBUG_RETURN
(
1
)
;
mysql
->
last_used_con
=
master
;
return
simple_command
(
master
,
COM_QUERY
,
q
,
length
,
1
);
DBUG_RETURN
(
simple_command
(
master
,
COM_QUERY
,
q
,
length
,
1
)
);
}
...
...
@@ -1071,30 +1071,31 @@ int STDCALL mysql_master_send_query(MYSQL *mysql, const char *q,
int
STDCALL
mysql_slave_query
(
MYSQL
*
mysql
,
const
char
*
q
,
unsigned
long
length
)
{
DBUG_ENTER
(
"mysql_slave_query"
);
if
(
mysql_slave_send_query
(
mysql
,
q
,
length
))
return
1
;
return
mysql_read_query_result
(
mysql
);
DBUG_RETURN
(
1
)
;
DBUG_RETURN
(
mysql_read_query_result
(
mysql
)
);
}
int
STDCALL
mysql_slave_send_query
(
MYSQL
*
mysql
,
const
char
*
q
,
unsigned
long
length
)
{
MYSQL
*
last_used_slave
,
*
slave_to_use
=
0
;
DBUG_ENTER
(
"mysql_slave_send_query"
);
if
((
last_used_slave
=
mysql
->
last_used_slave
))
slave_to_use
=
last_used_slave
->
next_slave
;
else
slave_to_use
=
mysql
->
next_slave
;
/* next_slave is always safe to use - we have a circular list of slaves
if there are no slaves, mysql->next_slave == mysql
/*
Next_slave is always safe to use - we have a circular list of slaves
if there are no slaves, mysql->next_slave == mysql
*/
mysql
->
last_used_con
=
mysql
->
last_used_slave
=
slave_to_use
;
if
(
!
length
)
length
=
strlen
(
q
);
if
(
!
slave_to_use
->
net
.
vio
&&
!
mysql_real_connect
(
slave_to_use
,
0
,
0
,
0
,
0
,
0
,
0
,
0
))
return
1
;
return
simple_command
(
slave_to_use
,
COM_QUERY
,
q
,
length
,
1
);
DBUG_RETURN
(
1
)
;
DBUG_RETURN
(
simple_command
(
slave_to_use
,
COM_QUERY
,
q
,
length
,
1
)
);
}
...
...
@@ -1307,8 +1308,7 @@ err:
enum
mysql_rpl_type
STDCALL
mysql_rpl_query_type
(
const
char
*
q
,
int
len
)
{
const
char
*
q_end
;
q_end
=
(
len
)
?
q
+
len
:
strend
(
q
);
const
char
*
q_end
=
q
+
len
;
for
(;
q
<
q_end
;
++
q
)
{
char
c
;
...
...
@@ -2203,20 +2203,24 @@ STDCALL mysql_add_slave(MYSQL* mysql, const char* host,
int
STDCALL
mysql_send_query
(
MYSQL
*
mysql
,
const
char
*
query
,
ulong
length
)
{
DBUG_ENTER
(
"mysql_send_query"
);
DBUG_PRINT
(
"enter"
,(
"rpl_parse: %d rpl_pivot: %d"
,
mysql
->
options
.
rpl_parse
,
mysql
->
rpl_pivot
));
if
(
mysql
->
options
.
rpl_parse
&&
mysql
->
rpl_pivot
)
{
switch
(
mysql_rpl_query_type
(
query
,
length
))
{
case
MYSQL_RPL_MASTER
:
return
mysql_master_send_query
(
mysql
,
query
,
length
);
DBUG_RETURN
(
mysql_master_send_query
(
mysql
,
query
,
length
)
);
case
MYSQL_RPL_SLAVE
:
return
mysql_slave_send_query
(
mysql
,
query
,
length
);
DBUG_RETURN
(
mysql_slave_send_query
(
mysql
,
query
,
length
)
);
case
MYSQL_RPL_ADMIN
:
break
;
/* fall through */
}
}
mysql
->
last_used_con
=
mysql
;
return
simple_command
(
mysql
,
COM_QUERY
,
query
,
length
,
1
);
DBUG_RETURN
(
simple_command
(
mysql
,
COM_QUERY
,
query
,
length
,
1
)
);
}
...
...
This diff is collapsed.
Click to expand it.
mysql-test/mysql-test-run.sh
View file @
fa4e07bf
...
...
@@ -742,6 +742,8 @@ start_master()
$RM
-f
$MASTER_MYDDIR
/log.
*
# Remove stale binary logs
$RM
-f
$MYSQL_TEST_DIR
/var/log/master-bin.
*
# Remove old master.info files
$RM
-f
$MYSQL_TEST_DIR
/var/master-data/master.info
#run master initialization shell script if one exists
...
...
@@ -858,8 +860,9 @@ start_slave()
slave_pid
=
$SLAVE_MYPID
slave_sock
=
"
$SLAVE_MYSOCK
"
fi
# Remove stale binary logs
$RM
-f
$MYSQL_TEST_DIR
/var/log/
$slave_ident
-bin
.
*
# Remove stale binary logs and old master.info files
$RM
-f
$MYSQL_TEST_DIR
/var/log/
$slave_ident
-
*
bin.
*
$RM
-f
$MYSQL_TEST_DIR
/
$slave_datadir
/master.info
#run slave initialization shell script if one exists
if
[
-f
"
$slave_init_script
"
]
;
...
...
@@ -1089,8 +1092,8 @@ run_testcase ()
start_master
fi
fi
do_slave_restart
=
0
do_slave_restart
=
0
if
[
-f
$slave_opt_file
]
;
then
EXTRA_SLAVE_OPT
=
`
$CAT
$slave_opt_file
|
$SED
-e
"s;
\\
$MYSQL_TEST_DIR
;
$MYSQL_TEST_DIR
;"
`
...
...
This diff is collapsed.
Click to expand it.
mysql-test/r/grant.result
View file @
fa4e07bf
...
...
@@ -7,6 +7,9 @@ Grants for mysqltest_1@localhost
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA'
GRANT SELECT ON `mysqltest`.* TO 'mysqltest_1'@'localhost'
grant delete on mysqltest.* to mysqltest_1@localhost;
select * from mysql.user where user="mysqltest_1";
Host User Password Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown_priv Process_priv File_priv Grant_priv References_priv Index_priv Alter_priv Show_db_priv Super_priv Create_tmp_table_priv Lock_tables_priv Execute_priv Repl_slave_priv Repl_client_priv ssl_type ssl_cipher x509_issuer x509_subject max_questions max_updates max_connections
localhost mysqltest_1 N N N N N N N N N N N N N N N N N N N N N SPECIFIED EDH-RSA-DES-CBC3-SHA 0 0 0
show grants for mysqltest_1@localhost;
Grants for mysqltest_1@localhost
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost' REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA'
...
...
This diff is collapsed.
Click to expand it.
mysql-test/r/innodb.result
View file @
fa4e07bf
...
...
@@ -987,7 +987,7 @@ create table t1 (id int unsigned not null auto_increment, code tinyint unsigned
BEGIN;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT @@tx_isolation,@@global.tx_isolation;
@@tx_isolation @@tx_isolation
@@tx_isolation @@
global.
tx_isolation
SERIALIZABLE READ-COMMITTED
insert into t1 (code, name) values (1, 'Tim'), (1, 'Monty'), (2, 'David');
select id, code, name from t1 order by id;
...
...
This diff is collapsed.
Click to expand it.
mysql-test/r/myisam.result
View file @
fa4e07bf
...
...
@@ -108,3 +108,9 @@ OPTIMIZE TABLE t1;
Table Op Msg_type Msg_text
test.t1 optimize status OK
DROP TABLE t1;
CREATE TABLE t1 (a varchar(255), b varchar(255), c varchar(255), KEY t1 (a, b, c));
Specified key was too long. Max key length is 500
CREATE TABLE t1 (a varchar(255), b varchar(255), c varchar(255));
ALTER TABLE t1 ADD INDEX t1 (a, b, c);
Specified key was too long. Max key length is 500
DROP TABLE t1;
This diff is collapsed.
Click to expand it.
mysql-test/r/rpl_flush_log_loop.result
0 → 100644
View file @
fa4e07bf
slave stop;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
slave start;
change master to master_host='127.0.0.1',master_user='root',
master_password='',master_port=9306;
slave start;
slave stop;
change master to master_host='127.0.0.1',master_user='root',
master_password='',master_port=9307;
slave start;
flush logs;
show slave status;
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 Relay_log_space
127.0.0.1 root 9307 60 slave-bin.001 79 mashka-relay-bin.001 119 slave-bin.001 Yes Yes 0 0 79 119
This diff is collapsed.
Click to expand it.
mysql-test/r/rpl_log.result
View file @
fa4e07bf
...
...
@@ -8,7 +8,6 @@ slave stop;
reset master;
reset slave;
reset master;
drop table if exists t1;
create table t1(n int not null auto_increment primary key);
insert into t1 values (NULL);
drop table t1;
...
...
@@ -37,6 +36,9 @@ show binlog events from 79 limit 2,1;
Log_name Pos Event_type Server_id Orig_log_pos Info
master-bin.001 200 Query 1 200 use test; insert into t1 values (NULL)
flush logs;
slave start;
flush logs;
slave stop;
create table t1 (n int);
insert into t1 values (1);
drop table t1;
...
...
@@ -52,7 +54,6 @@ 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 556 ;file_id=1
master-bin.001 579 Query 1 579 use test; drop table t1
master-bin.001 627 Rotate 1 627 master-bin.002;pos=4
master-bin.001 668 Stop 1 668
show binlog events in 'master-bin.002';
Log_name Pos Event_type Server_id Orig_log_pos Info
master-bin.002 4 Query 1 4 use test; create table t1 (n int)
...
...
@@ -68,32 +69,24 @@ Log_name
slave-bin.001
slave-bin.002
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: VERSION, Binlog ver: 3
slave-bin.001 79 Query 1 79 use test; create table t1(n int not null auto_increment primary key)
slave-bin.001 172 Intvar 1 200 INSERT_ID=1
slave-bin.001 200 Query 1 200 use test; insert into t1 values (NULL)
slave-bin.001 263 Query 1 263 use test; drop table t1
slave-bin.001 311 Query 1 311 use test; create table t1 (word char(20) not null)
slave-bin.001 386 Create_file 1 386 db=test;table=t1;file_id=1;block_len=81
slave-bin.001 565 Exec_load 1 556 ;file_id=1
slave-bin.001 588 Query 1 579 use test; drop table t1
slave-bin.001 636 Rotate 2 636 slave-bin.002;pos=4
show binlog events in 'slave-bin.002' from 4;
Log_name Pos Event_type Server_id Orig_log_pos Info
slave-bin.002 4 Slave 2 627 host=127.0.0.1,port=MASTER_PORT,log=master-bin.002,pos=4
slave-bin.002 57 Query 1 4 use test; create table t1 (n int)
slave-bin.002 115 Query 1 62 use test; insert into t1 values (1)
slave-bin.002 175 Query 1 122 use test; drop table t1
slave-bin.002 4 Query 1 4 use test; create table t1 (n int)
slave-bin.002 62 Query 1 62 use test; insert into t1 values (1)
slave-bin.002 122 Query 1 122 use test; drop table t1
show slave status;
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 Relay_log_space
127.0.0.1 root MASTER_PORT 1 master-bin.002 170 slave-relay-bin.002 916 master-bin.002 Yes Yes 0 0 170 920
show new master for slave with master_log_file='master-bin.001' and
master_log_pos=4 and master_server_id=1;
Log_name Log_pos
slave-bin.001 132
show new master for slave with master_log_file='master-bin.001' and
master_log_pos=79 and master_server_id=1;
Log_name Log_pos
slave-bin.001 225
show new master for slave with master_log_file='master-bin.001' and
master_log_pos=311 and master_server_id=1;
Log_name Log_pos
slave-bin.001 439
show new master for slave with master_log_file='master-bin.002' and
master_log_pos=4 and master_server_id=1;
Log_name Log_pos
slave-bin.002 57
show new master for slave with master_log_file='master-bin.002' and
master_log_pos=122 and master_server_id=1;
Log_name Log_pos
slave-bin.002 223
127.0.0.1 root MASTER_PORT 1 master-bin.002 170 slave-relay-bin.002 957 master-bin.002 Yes Yes 0 0 170 961
show binlog events in 'slave-bin.005' from 4;
Error when executing command SHOW BINLOG EVENTS: Could not find target log
This diff is collapsed.
Click to expand it.
mysql-test/r/rpl_
magic
.result
→
mysql-test/r/rpl_
redirect
.result
View file @
fa4e07bf
...
...
@@ -4,6 +4,11 @@ reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
slave start;
SHOW SLAVE STATUS;
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 Relay_log_space
SHOW SLAVE HOSTS;
Server_id Host Port Rpl_recovery_rank Master_id
2 127.0.0.1 SLAVE_PORT 2 1
drop table if exists t1;
create table t1 ( n int);
insert into t1 values (1),(2),(3),(4);
...
...
@@ -35,3 +40,4 @@ n
4
5
drop table t1;
drop table t1;
This diff is collapsed.
Click to expand it.
mysql-test/r/rpl_rotate_logs.result
View file @
fa4e07bf
...
...
@@ -2,12 +2,10 @@ slave start;
Could not initialize master info structure, check permisions on master.info
slave start;
Could not initialize master info structure, check permisions on master.info
change master to master_host='127.0.0.1',master_port=MASTER_PORT,
master_user='root';
change master to master_host='127.0.0.1',master_port=MASTER_PORT, master_user='root';
Could not initialize master info
reset slave;
change master to master_host='127.0.0.1',master_port=MASTER_PORT,
master_user='root';
change master to master_host='127.0.0.1',master_port=MASTER_PORT, master_user='root';
reset master;
slave start;
drop table if exists t1, t2, t3, t4;
...
...
This diff is collapsed.
Click to expand it.
mysql-test/r/variables.result
View file @
fa4e07bf
...
...
@@ -65,7 +65,7 @@ Variable_name Value
max_join_size 4294967295
set @@max_join_size=1000, @@global.max_join_size=2000;
select @@local.max_join_size, @@global.max_join_size;
@@
max_join_size @@
max_join_size
@@
session.max_join_size @@global.
max_join_size
1000 2000
select @@identity, length(@@version)>0;
@@identity length(@@version)>0
...
...
This diff is collapsed.
Click to expand it.
mysql-test/t/grant.test
View file @
fa4e07bf
...
...
@@ -8,6 +8,7 @@ flush privileges;
grant
select
on
mysqltest
.*
to
mysqltest_1
@
localhost
require
cipher
"EDH-RSA-DES-CBC3-SHA"
;
show
grants
for
mysqltest_1
@
localhost
;
grant
delete
on
mysqltest
.*
to
mysqltest_1
@
localhost
;
select
*
from
mysql
.
user
where
user
=
"mysqltest_1"
;
show
grants
for
mysqltest_1
@
localhost
;
revoke
delete
on
mysqltest
.*
from
mysqltest_1
@
localhost
;
show
grants
for
mysqltest_1
@
localhost
;
...
...
This diff is collapsed.
Click to expand it.
mysql-test/t/myisam.test
View file @
fa4e07bf
...
...
@@ -104,3 +104,13 @@ INSERT INTO t1 VALUES (1), (2), (3);
OPTIMIZE
TABLE
t1
;
DROP
TABLE
t1
;
#
# Test of creating table with too long key
#
--
error
1071
CREATE
TABLE
t1
(
a
varchar
(
255
),
b
varchar
(
255
),
c
varchar
(
255
),
KEY
t1
(
a
,
b
,
c
));
CREATE
TABLE
t1
(
a
varchar
(
255
),
b
varchar
(
255
),
c
varchar
(
255
));
--
error
1071
ALTER
TABLE
t1
ADD
INDEX
t1
(
a
,
b
,
c
);
DROP
TABLE
t1
;
This diff is collapsed.
Click to expand it.
mysql-test/t/rpl_flush_log_loop-master.opt
0 → 100644
View file @
fa4e07bf
-O max_binlog_size=1M
This diff is collapsed.
Click to expand it.
mysql-test/t/rpl_flush_log_loop-slave.opt
0 → 100644
View file @
fa4e07bf
-O max_binlog_size=1M
This diff is collapsed.
Click to expand it.
mysql-test/t/rpl_flush_log_loop.test
0 → 100644
View file @
fa4e07bf
# Testing if "flush logs" command bouncing resulting in logs created in a loop
# in case of bi-directional replication
source
include
/
master
-
slave
.
inc
connection
slave
;
eval
change
master
to
master_host
=
'127.0.0.1'
,
master_user
=
'root'
,
master_password
=
''
,
master_port
=
$MASTER_MYPORT
;
slave
start
;
connection
master
;
slave
stop
;
eval
change
master
to
master_host
=
'127.0.0.1'
,
master_user
=
'root'
,
master_password
=
''
,
master_port
=
$SLAVE_MYPORT
;
slave
start
;
flush
logs
;
sleep
5
;
show
slave
status
;
This diff is collapsed.
Click to expand it.
mysql-test/t/rpl_log.test
View file @
fa4e07bf
...
...
@@ -9,7 +9,6 @@ let $VERSION=`select version()`;
connection
master
;
reset
master
;
drop
table
if
exists
t1
;
create
table
t1
(
n
int
not
null
auto_increment
primary
key
);
insert
into
t1
values
(
NULL
);
drop
table
t1
;
...
...
@@ -22,6 +21,19 @@ show binlog events from 79 limit 1;
show
binlog
events
from
79
limit
2
;
show
binlog
events
from
79
limit
2
,
1
;
flush
logs
;
# Sync slave and force it to start on another binary log
save_master_pos
;
connection
slave
;
slave
start
;
sync_with_master
;
flush
logs
;
slave
stop
;
connection
master
;
# Create some entries for second log
create
table
t1
(
n
int
);
insert
into
t1
values
(
1
);
drop
table
t1
;
...
...
@@ -35,23 +47,19 @@ slave start;
sync_with_master
;
show
master
logs
;
--
replace_result
3306
MASTER_PORT
9306
MASTER_PORT
3334
MASTER_PORT
3336
MASTER_PORT
$VERSION
VERSION
# We can't compare binlog from slave as the result differ between
# machines based on where the LOAD DATA file is stored.
disable_result_log
;
show
binlog
events
in
'slave-bin.001'
from
4
;
--
replace_result
3306
MASTER_PORT
9306
MASTER_PORT
3334
MASTER_PORT
3336
MASTER_PORT
$VERSION
VERSION
enable_result_log
;
show
binlog
events
in
'slave-bin.002'
from
4
;
--
replace_result
3306
MASTER_PORT
9306
MASTER_PORT
3334
MASTER_PORT
3336
MASTER_PORT
show
slave
status
;
show
new
master
for
slave
with
master_log_file
=
'master-bin.001'
and
master_log_pos
=
4
and
master_server_id
=
1
;
show
new
master
for
slave
with
master_log_file
=
'master-bin.001'
and
master_log_pos
=
79
and
master_server_id
=
1
;
show
new
master
for
slave
with
master_log_file
=
'master-bin.001'
and
master_log_pos
=
311
and
master_server_id
=
1
;
show
new
master
for
slave
with
master_log_file
=
'master-bin.002'
and
master_log_pos
=
4
and
master_server_id
=
1
;
show
new
master
for
slave
with
master_log_file
=
'master-bin.002'
and
master_log_pos
=
122
and
master_server_id
=
1
;
# Need to recode the following
#show new master for slave with master_log_file='master-bin.001' and master_log_pos=4 and master_server_id=1;
#show new master for slave with master_log_file='master-bin.001' and master_log_pos=79 and master_server_id=1;
#show new master for slave with master_log_file='master-bin.001' and master_log_pos=311 and master_server_id=1;
#show new master for slave with master_log_file='master-bin.002' and master_log_pos=4 and master_server_id=1;
#show new master for slave with master_log_file='master-bin.002' and master_log_pos=122 and master_server_id=1;
--
error
1220
show
binlog
events
in
'slave-bin.005'
from
4
;
This diff is collapsed.
Click to expand it.
mysql-test/t/rpl_mystery22.test
View file @
fa4e07bf
...
...
@@ -13,7 +13,7 @@ insert into t1 values(NULL);
insert
into
t1
values
(
NULL
);
save_master_pos
;
connection
slave
;
sleep
1
;
# there is no way around this sleep - we have to wait until
sleep
3
;
# there is no way around this sleep - we have to wait until
# the slave tries to run the query, fails and aborts slave thread
delete
from
t1
where
n
=
2
;
slave
start
;
...
...
This diff is collapsed.
Click to expand it.
mysql-test/t/rpl_
magic
.test
→
mysql-test/t/rpl_
redirect
.test
View file @
fa4e07bf
#
# Test of automatic redirection of queries to master/slave.
#
source
include
/
master
-
slave
.
inc
;
#first, make sure the slave has had enough time to register
...
...
@@ -7,6 +11,10 @@ sync_with_master;
#discover slaves
connection
master
;
--
replace_result
$MASTER_MYPORT
MASTER_PORT
SHOW
SLAVE
STATUS
;
--
replace_result
$SLAVE_MYPORT
SLAVE_PORT
SHOW
SLAVE
HOSTS
;
rpl_probe
;
#turn on master/slave query direction auto-magic
...
...
@@ -16,11 +24,12 @@ create table t1 ( n int);
insert
into
t1
values
(
1
),(
2
),(
3
),(
4
);
disable_rpl_parse
;
save_master_pos
;
enable_rpl_parse
;
connection
slave
;
sync_with_master
;
insert
into
t1
values
(
5
);
connection
master
;
enable_rpl_parse
;
# The first of the queries will be sent to the slave, the second to the master.
select
*
from
t1
;
select
*
from
t1
;
disable_rpl_parse
;
...
...
@@ -28,3 +37,5 @@ select * from t1;
connection
slave
;
select
*
from
t1
;
drop
table
t1
;
connection
master
;
drop
table
t1
;
This diff is collapsed.
Click to expand it.
mysql-test/t/rpl_rotate_logs.test
View file @
fa4e07bf
...
...
@@ -20,12 +20,11 @@ system chmod 600 var/slave-data/master.info;
--
error
1201
slave
start
;
--
replace_result
3306
MASTER_PORT
9306
MASTER_PORT
3334
MASTER_PORT
3336
MASTER_PORT
!
eval
change
master
to
master_host
=
'127.0.0.1'
,
master_port
=
$MASTER_MYPORT
,
master_user
=
'root'
;
# Will get error 13 on Unix systems becasue file is not readable
!
eval
change
master
to
master_host
=
'127.0.0.1'
,
master_port
=
$MASTER_MYPORT
,
master_user
=
'root'
;
reset
slave
;
--
replace_result
3306
MASTER_PORT
9306
MASTER_PORT
3334
MASTER_PORT
3336
MASTER_PORT
eval
change
master
to
master_host
=
'127.0.0.1'
,
master_port
=
$MASTER_MYPORT
,
master_user
=
'root'
;
eval
change
master
to
master_host
=
'127.0.0.1'
,
master_port
=
$MASTER_MYPORT
,
master_user
=
'root'
;
connection
master
;
reset
master
;
connection
slave
;
...
...
This diff is collapsed.
Click to expand it.
mysys/my_malloc.c
View file @
fa4e07bf
...
...
@@ -81,3 +81,15 @@ my_string my_strdup(const char *from, myf MyFlags)
memcpy
((
byte
*
)
ptr
,
(
byte
*
)
from
,(
size_t
)
length
);
return
((
my_string
)
ptr
);
}
gptr
my_strdup_with_length
(
const
byte
*
from
,
uint
length
,
myf
MyFlags
)
{
gptr
ptr
;
if
((
ptr
=
my_malloc
(
length
+
1
,
MyFlags
))
!=
0
)
{
memcpy
((
byte
*
)
ptr
,
(
byte
*
)
from
,(
size_t
)
length
);
ptr
[
length
]
=
0
;
}
return
(
ptr
);
}
This diff is collapsed.
Click to expand it.
mysys/safemalloc.c
View file @
fa4e07bf
...
...
@@ -538,3 +538,17 @@ my_string _my_strdup(const char *from, const char *sFile, uint uLine,
memcpy
((
byte
*
)
ptr
,
(
byte
*
)
from
,(
size_t
)
length
);
return
((
my_string
)
ptr
);
}
/* _my_strdup */
my_string
_my_strdup_with_length
(
const
char
*
from
,
uint
length
,
const
char
*
sFile
,
uint
uLine
,
myf
MyFlags
)
{
gptr
ptr
;
if
((
ptr
=
_mymalloc
(
length
+
1
,
sFile
,
uLine
,
MyFlags
))
!=
0
)
{
memcpy
((
byte
*
)
ptr
,
(
byte
*
)
from
,(
size_t
)
length
);
ptr
[
length
]
=
0
;
}
return
((
my_string
)
ptr
);
}
This diff is collapsed.
Click to expand it.
mysys/thr_alarm.c
View file @
fa4e07bf
...
...
@@ -655,6 +655,7 @@ sig_handler process_alarm(int sig __attribute__((unused)))
bool
thr_alarm
(
thr_alarm_t
*
alrm
,
uint
sec
,
ALARM
*
alarm
)
{
(
*
alrm
)
=
&
alarm
->
alarmed
;
if
(
alarm_aborted
)
{
alarm
->
alarmed
.
crono
=
0
;
...
...
@@ -663,7 +664,6 @@ bool thr_alarm(thr_alarm_t *alrm, uint sec, ALARM *alarm)
if
(
!
(
alarm
->
alarmed
.
crono
=
SetTimer
((
HWND
)
NULL
,
0
,
sec
*
1000
,
(
TIMERPROC
)
NULL
)))
return
1
;
(
*
alrm
)
=
&
alarm
->
alarmed
;
return
0
;
}
...
...
This diff is collapsed.
Click to expand it.
sql/ha_innodb.cc
View file @
fa4e07bf
...
...
@@ -101,7 +101,7 @@ char* innobase_unix_file_flush_method = NULL;
/* Below we have boolean-valued start-up parameters, and their default
values */
my_bool
innobase_flush_log_at_trx_commit
=
FALSE
;
uint
innobase_flush_log_at_trx_commit
=
0
;
my_bool
innobase_log_archive
=
FALSE
;
my_bool
innobase_use_native_aio
=
FALSE
;
my_bool
innobase_fast_shutdown
=
TRUE
;
...
...
This diff is collapsed.
Click to expand it.
sql/ha_innodb.h
View file @
fa4e07bf
...
...
@@ -170,6 +170,7 @@ class ha_innobase: public handler
extern
bool
innodb_skip
;
extern
uint
innobase_init_flags
,
innobase_lock_type
;
extern
uint
innobase_flush_log_at_trx_commit
;
extern
ulong
innobase_cache_size
;
extern
char
*
innobase_home
,
*
innobase_tmpdir
,
*
innobase_logdir
;
extern
long
innobase_lock_scan_time
;
...
...
@@ -182,7 +183,7 @@ extern char *innobase_data_home_dir, *innobase_data_file_path;
extern
char
*
innobase_log_group_home_dir
,
*
innobase_log_arch_dir
;
extern
char
*
innobase_unix_file_flush_method
;
/* The following variables have to be my_bool for SHOW VARIABLES to work */
extern
my_bool
innobase_
flush_log_at_trx_commit
,
innobase_
log_archive
,
extern
my_bool
innobase_log_archive
,
innobase_use_native_aio
,
innobase_fast_shutdown
;
extern
TYPELIB
innobase_lock_typelib
;
...
...
This diff is collapsed.
Click to expand it.
sql/item_func.cc
View file @
fa4e07bf
...
...
@@ -2334,7 +2334,7 @@ Item *get_system_var(enum_var_type var_type, LEX_STRING name)
THD
*
thd
=
current_thd
;
Item
*
item
;
sys_var
*
var
;
char
buff
[
MAX_SYS_VAR_LENGTH
+
3
]
;
char
buff
[
MAX_SYS_VAR_LENGTH
+
3
+
8
],
*
pos
;
if
(
!
(
var
=
find_sys_var
(
name
.
str
)))
{
...
...
@@ -2346,8 +2346,14 @@ Item *get_system_var(enum_var_type var_type, LEX_STRING name)
thd
->
safe_to_cache_query
=
0
;
buff
[
0
]
=
'@'
;
buff
[
1
]
=
'@'
;
memcpy
(
buff
+
2
,
var
->
name
,
var
->
name_length
+
1
);
item
->
set_name
(
buff
,
var
->
name_length
+
2
);
// Will allocate name
pos
=
buff
+
2
;
if
(
var_type
==
OPT_SESSION
)
pos
=
strmov
(
pos
,
"session."
);
else
if
(
var_type
==
OPT_GLOBAL
)
pos
=
strmov
(
pos
,
"global."
);
memcpy
(
pos
,
var
->
name
,
var
->
name_length
+
1
);
// set_name() will allocate the name
item
->
set_name
(
buff
,(
uint
)
(
pos
-
buff
)
+
var
->
name_length
);
return
item
;
}
...
...
This diff is collapsed.
Click to expand it.
sql/log.cc
View file @
fa4e07bf
...
...
@@ -389,12 +389,12 @@ err:
the NEXT log file name in the index file.
log_name Filename to find in the index file.
Is a null pointer if we want to read the first entry
need_
mutex
Set this to 1 if the parent doesn't already have a
need_
lock
Set this to 1 if the parent doesn't already have a
lock on LOCK_index
NOTE
On systems without the truncate function the file will end with one or
e
more empty lines
On systems without the truncate function the file will end with one or
more empty lines
. These will be ignored when reading the file.
RETURN VALUES
0 ok
...
...
@@ -1388,6 +1388,7 @@ void MYSQL_LOG:: wait_for_update(THD* thd)
This can be set to 0 if we are going to do call open
at once after close, in which case we don't want to
close the index file.
We only write a 'stop' event to the log if exiting is set
*/
void
MYSQL_LOG
::
close
(
bool
exiting
)
...
...
@@ -1396,7 +1397,7 @@ void MYSQL_LOG::close(bool exiting)
DBUG_PRINT
(
"enter"
,(
"exiting: %d"
,
(
int
)
exiting
));
if
(
is_open
())
{
if
(
log_type
==
LOG_BIN
&&
!
no_auto_events
)
if
(
log_type
==
LOG_BIN
&&
!
no_auto_events
&&
exiting
)
{
Stop_log_event
s
;
s
.
set_log_pos
(
this
);
...
...
This diff is collapsed.
Click to expand it.
sql/log_event.cc
View file @
fa4e07bf
...
...
@@ -690,7 +690,10 @@ void Rotate_log_event::print(FILE* file, bool short_form, char* last_db)
if
(
new_log_ident
)
my_fwrite
(
file
,
(
byte
*
)
new_log_ident
,
(
uint
)
ident_len
,
MYF
(
MY_NABP
|
MY_WME
));
fprintf
(
file
,
" pos: %s
\n
"
,
llstr
(
pos
,
buf
));
fprintf
(
file
,
" pos: %s"
,
llstr
(
pos
,
buf
));
if
(
flags
&
LOG_EVENT_FORCED_ROTATE_F
)
fprintf
(
file
,
" forced by master"
);
fputc
(
'\n'
,
file
);
fflush
(
file
);
}
...
...
@@ -730,20 +733,22 @@ Rotate_log_event::Rotate_log_event(const char* buf, int event_len,
buf
+=
header_size
;
if
(
old_format
)
{
ident_len
=
(
u
char
)(
event_len
-
OLD_HEADER_LEN
);
ident_len
=
(
u
int
)(
event_len
-
OLD_HEADER_LEN
);
pos
=
4
;
ident_offset
=
0
;
}
else
{
ident_len
=
(
u
char
)(
event_len
-
ROTATE_EVENT_OVERHEAD
);
ident_len
=
(
u
int
)(
event_len
-
ROTATE_EVENT_OVERHEAD
);
pos
=
uint8korr
(
buf
+
R_POS_OFFSET
);
ident_offset
=
ROTATE_HEADER_LEN
;
}
if
(
!
(
new_log_ident
=
(
char
*
)
my_memdup
((
byte
*
)
buf
+
ident_offset
,
(
uint
)
ident_len
,
MYF
(
MY_WME
))))
set_if_smaller
(
ident_len
,
FN_REFLEN
-
1
);
if
(
!
(
new_log_ident
=
(
char
*
)
my_strdup_with_length
((
byte
*
)
buf
+
ident_offset
,
(
uint
)
ident_len
,
MYF
(
MY_WME
))))
return
;
alloced
=
1
;
}
...
...
@@ -1614,7 +1619,6 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli)
int
expected_error
,
actual_error
=
0
;
init_sql_alloc
(
&
thd
->
mem_root
,
8192
,
0
);
thd
->
db
=
rewrite_db
((
char
*
)
db
);
DBUG_ASSERT
(
q_len
==
strlen
(
query
));
/*
InnoDB internally stores the master log position it has processed so far;
...
...
@@ -1643,6 +1647,8 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli)
if
(
ignored_error_code
((
expected_error
=
error_code
))
||
!
check_expected_error
(
thd
,
rli
,
expected_error
))
{
mysql_log
.
write
(
thd
,
COM_QUERY
,
"%s"
,
thd
->
query
);
DBUG_PRINT
(
"query"
,(
"%s"
,
thd
->
query
));
mysql_parse
(
thd
,
thd
->
query
,
q_len
);
if
((
expected_error
!=
(
actual_error
=
thd
->
net
.
last_errno
))
&&
expected_error
&&
...
...
@@ -1861,71 +1867,34 @@ int Stop_log_event::exec_event(struct st_relay_log_info* rli)
Got a rotate log even from the master
IMPLEMENTATION
- Rotate the log file if the name of the log file change
d
(In practice this should always be the case)
This is mainly used so that we can later figure out the logname an
d
position for the master.
TODO
- Investigate/Test if we can't ignore all rotate log events
that we get from the master (and not even write it to the local
binary log).
We can't rotate the slave as this will cause infinitive rotations
in a A -> B -> A setup.
RETURN VALUES
0 ok
1 Impossible new log file name (rotate log event is ignored)
*/
0 ok
*/
int
Rotate_log_event
::
exec_event
(
struct
st_relay_log_info
*
rli
)
{
bool
rotate_binlog
=
0
,
write_slave_event
=
0
;
char
*
log_name
=
rli
->
master_log_name
;
DBUG_ENTER
(
"Rotate_log_event::exec_event"
);
pthread_mutex_lock
(
&
rli
->
data_lock
);
/*
TODO: probably needs re-write
rotate local binlog only if the name of remote has changed
*/
if
(
!*
log_name
||
(
memcmp
(
log_name
,
new_log_ident
,
ident_len
)
||
log_name
[
ident_len
]
!=
0
))
{
write_slave_event
=
(
!
(
flags
&
LOG_EVENT_FORCED_ROTATE_F
)
&&
mysql_bin_log
.
is_open
());
rotate_binlog
=
(
*
log_name
&&
write_slave_event
);
if
(
ident_len
>=
sizeof
(
rli
->
master_log_name
))
{
// This should be impossible
pthread_mutex_unlock
(
&
rli
->
data_lock
);
DBUG_RETURN
(
1
);
}
memcpy
(
log_name
,
new_log_ident
,
ident_len
);
log_name
[
ident_len
]
=
0
;
}
memcpy
(
log_name
,
new_log_ident
,
ident_len
+
1
);
rli
->
master_log_pos
=
pos
;
rli
->
relay_log_pos
+=
get_event_len
();
if
(
rotate_binlog
)
{
mysql_bin_log
.
new_file
();
rli
->
master_log_pos
=
BIN_LOG_HEADER_SIZE
;
}
DBUG_PRINT
(
"info"
,
(
"master_log_pos: %d"
,
(
ulong
)
rli
->
master_log_pos
));
pthread_cond_broadcast
(
&
rli
->
data_cond
);
pthread_mutex_unlock
(
&
rli
->
data_lock
);
pthread_cond_broadcast
(
&
rli
->
data_cond
);
flush_relay_log_info
(
rli
);
if
(
write_slave_event
)
{
Slave_log_event
s
(
thd
,
rli
);
if
(
s
.
master_host
)
{
s
.
set_log_pos
(
&
mysql_bin_log
);
s
.
server_id
=
::
server_id
;
mysql_bin_log
.
write
(
&
s
);
}
}
DBUG_RETURN
(
0
);
}
int
Intvar_log_event
::
exec_event
(
struct
st_relay_log_info
*
rli
)
{
switch
(
type
)
{
...
...
This diff is collapsed.
Click to expand it.
sql/log_event.h
View file @
fa4e07bf
...
...
@@ -522,16 +522,15 @@ class Rotate_log_event: public Log_event
{
public:
const
char
*
new_log_ident
;
uchar
ident_len
;
ulonglong
pos
;
uint
ident_len
;
bool
alloced
;
#ifndef MYSQL_CLIENT
Rotate_log_event
(
THD
*
thd_arg
,
const
char
*
new_log_ident_arg
,
uint
ident_len_arg
=
0
,
ulonglong
pos_arg
=
4
)
:
Log_event
(
thd_arg
),
new_log_ident
(
new_log_ident_arg
),
ident_len
(
ident_len_arg
?
ident_len_arg
:
(
uint
)
strlen
(
new_log_ident_arg
)),
pos
(
pos_arg
),
alloced
(
0
)
pos
(
pos_arg
),
ident_len
(
ident_len_arg
?
ident_len_arg
:
(
uint
)
strlen
(
new_log_ident_arg
)),
alloced
(
0
)
{}
void
pack_info
(
String
*
packet
);
int
exec_event
(
struct
st_relay_log_info
*
rli
);
...
...
This diff is collapsed.
Click to expand it.
sql/mysqld.cc
View file @
fa4e07bf
...
...
@@ -3039,7 +3039,7 @@ struct my_option my_long_options[] =
"Set to 0 if you don't want to flush logs"
,
(
gptr
*
)
&
innobase_flush_log_at_trx_commit
,
(
gptr
*
)
&
innobase_flush_log_at_trx_commit
,
0
,
GET_
BOOL
,
OPT_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
0
,
GET_
INT
,
OPT_ARG
,
0
,
0
,
2
,
0
,
0
,
0
},
{
"innodb_flush_method"
,
OPT_INNODB_FLUSH_METHOD
,
"With which method to flush data"
,
(
gptr
*
)
&
innobase_unix_file_flush_method
,
(
gptr
*
)
&
innobase_unix_file_flush_method
,
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
...
...
This diff is collapsed.
Click to expand it.
sql/net_serv.cc
View file @
fa4e07bf
...
...
@@ -237,6 +237,7 @@ my_net_write(NET *net,const char *packet,ulong len)
buff
[
3
]
=
(
uchar
)
net
->
pkt_nr
++
;
if
(
net_write_buff
(
net
,(
char
*
)
buff
,
NET_HEADER_SIZE
))
return
1
;
DBUG_DUMP
(
"packet_header"
,(
char
*
)
buff
,
NET_HEADER_SIZE
);
return
net_write_buff
(
net
,
packet
,
len
);
}
...
...
@@ -615,6 +616,7 @@ my_real_read(NET *net, ulong *complen)
(
"Packets out of order (Found: %d, expected %u)"
,
(
int
)
net
->
buff
[
net
->
where_b
+
3
],
net
->
pkt_nr
));
DBUG_DUMP
(
"packet_header"
,(
char
*
)
net
->
buff
+
net
->
where_b
,
4
);
#ifdef EXTRA_DEBUG
fprintf
(
stderr
,
"Packets out of order (Found: %d, expected %d)
\n
"
,
(
int
)
net
->
buff
[
net
->
where_b
+
3
],
...
...
This diff is collapsed.
Click to expand it.
sql/repl_failsafe.cc
View file @
fa4e07bf
...
...
@@ -236,7 +236,7 @@ static int find_target_pos(LEX_MASTER_INFO *mi, IO_CACHE *log, char *errmsg)
return
1
;
}
if
(
ev
->
log_pos
=
=
log_pos
&&
ev
->
server_id
==
target_server_id
)
if
(
ev
->
log_pos
>
=
log_pos
&&
ev
->
server_id
==
target_server_id
)
{
delete
ev
;
mi
->
pos
=
my_b_tell
(
log
);
...
...
@@ -261,23 +261,24 @@ int translate_master(THD* thd, LEX_MASTER_INFO* mi, char* errmsg)
int
error
=
1
;
int
cmp_res
;
LINT_INIT
(
cmp_res
);
DBUG_ENTER
(
"translate_master"
);
if
(
!
mysql_bin_log
.
is_open
())
{
strmov
(
errmsg
,
"Binary log is not open"
);
return
1
;
DBUG_RETURN
(
1
)
;
}
if
(
!
server_id_supplied
)
{
strmov
(
errmsg
,
"Misconfigured master - server id was not set"
);
return
1
;
DBUG_RETURN
(
1
)
;
}
if
(
mysql_bin_log
.
find_log_pos
(
&
linfo
,
NullS
,
1
))
{
strmov
(
errmsg
,
"Could not find first log"
);
return
1
;
DBUG_RETURN
(
1
)
;
}
thd
->
current_linfo
=
&
linfo
;
...
...
@@ -366,7 +367,7 @@ err:
if
(
last_file
>=
0
&&
last_file
!=
file
)
(
void
)
my_close
(
last_file
,
MYF
(
MY_WME
));
return
error
;
DBUG_RETURN
(
error
)
;
}
...
...
@@ -423,12 +424,9 @@ int show_new_master(THD* thd)
if
(
translate_master
(
thd
,
lex_mi
,
errmsg
))
{
if
(
errmsg
[
0
])
net_printf
(
&
thd
->
net
,
ER_ERROR_WHEN_EXECUTING_COMMAND
,
"SHOW NEW MASTER"
,
errmsg
);
else
send_error
(
&
thd
->
net
,
0
);
DBUG_RETURN
(
1
);
my_error
(
ER_ERROR_WHEN_EXECUTING_COMMAND
,
MYF
(
0
),
"SHOW NEW MASTER"
,
errmsg
);
DBUG_RETURN
(
-
1
);
}
else
{
...
...
This diff is collapsed.
Click to expand it.
sql/slave.cc
View file @
fa4e07bf
...
...
@@ -1468,6 +1468,8 @@ int st_relay_log_info::wait_for_pos(THD* thd, String* log_name,
int
event_count
=
0
;
ulong
init_abort_pos_wait
;
DBUG_ENTER
(
"wait_for_pos"
);
DBUG_PRINT
(
"enter"
,(
"master_log_name: '%s' pos: %ld"
,
master_log_name
,
(
ulong
)
master_log_pos
));
pthread_mutex_lock
(
&
data_lock
);
// abort only if master info changes during wait
...
...
@@ -1498,6 +1500,7 @@ int st_relay_log_info::wait_for_pos(THD* thd, String* log_name,
if
(
pos_reached
||
thd
->
killed
)
break
;
DBUG_PRINT
(
"info"
,(
"Waiting for master update"
));
const
char
*
msg
=
thd
->
enter_cond
(
&
data_cond
,
&
data_lock
,
"Waiting for master update"
);
pthread_cond_wait
(
&
data_cond
,
&
data_lock
);
...
...
@@ -2308,21 +2311,44 @@ err:
}
/*
We assume we already locked mi->data_lock
Start using a new binary log on the master
SYNOPSIS
process_io_rotate()
mi master_info for the slave
rev The rotate log event read from the binary log
DESCRIPTION
Updates the master info and relay data with the place in the next binary
log where we should start reading.
NOTES
We assume we already locked mi->data_lock
RETURN VALUES
0 ok
1 Log event is illegal
*/
static
int
process_io_rotate
(
MASTER_INFO
*
mi
,
Rotate_log_event
*
rev
)
static
int
process_io_rotate
(
MASTER_INFO
*
mi
,
Rotate_log_event
*
rev
)
{
int
return_val
=
1
;
DBUG_ENTER
(
"process_io_rotate"
);
safe_mutex_assert_owner
(
&
mi
->
data_lock
);
if
(
unlikely
(
!
rev
->
is_valid
()))
DBUG_RETURN
(
1
);
DBUG_ASSERT
(
rev
->
ident_len
<
sizeof
(
mi
->
master_log_name
));
memcpy
(
mi
->
master_log_name
,
rev
->
new_log_ident
,
rev
->
ident_len
);
mi
->
master_log_name
[
rev
->
ident_len
]
=
0
;
mi
->
master_log_pos
=
rev
->
pos
;
DBUG_PRINT
(
"info"
,
(
"master_log_pos: %d"
,
(
ulong
)
mi
->
master_log_pos
));
memcpy
(
mi
->
master_log_name
,
rev
->
new_log_ident
,
rev
->
ident_len
+
1
);
mi
->
master_log_pos
=
rev
->
pos
;
pthread_mutex_lock
(
&
mi
->
rli
.
data_lock
);
memcpy
(
mi
->
rli
.
master_log_name
,
rev
->
new_log_ident
,
rev
->
ident_len
+
1
);
mi
->
rli
.
master_log_pos
=
rev
->
pos
;
pthread_mutex_unlock
(
&
mi
->
rli
.
data_lock
);
DBUG_PRINT
(
"info"
,
(
"master_log_pos: '%s' %d"
,
mi
->
master_log_name
,
(
ulong
)
mi
->
master_log_pos
));
#ifndef DBUG_OFF
/*
If we do not do this, we will be getting the first
...
...
@@ -2335,23 +2361,24 @@ static int process_io_rotate(MASTER_INFO* mi, Rotate_log_event* rev)
}
/*
TODO: verify the issue with stop events, see if we need them at all
in the relay log
TODO: test this code before release - it has to be tested on a separte
setup with 3.23 master
TODO:
Test this code before release - it has to be tested on a separate
setup with 3.23 master
*/
static
int
queue_old_event
(
MASTER_INFO
*
mi
,
const
char
*
buf
,
ulong
event_len
)
{
const
char
*
errmsg
=
0
;
bool
inc_pos
=
1
;
bool
processed_stop_event
=
0
;
char
*
tmp_buf
=
0
;
ulong
inc_pos
;
bool
ignore_event
=
0
;
char
*
tmp_buf
=
0
;
RELAY_LOG_INFO
*
rli
=
&
mi
->
rli
;
DBUG_ENTER
(
"queue_old_event"
);
/* if we get Load event, we need to pass a non-reusable buffer
to read_log_event, so we do a trick
/*
If we get Load event, we need to pass a non-reusable buffer
to read_log_event, so we do a trick
*/
if
(
buf
[
EVENT_TYPE_OFFSET
]
==
LOAD_EVENT
)
{
...
...
@@ -2377,54 +2404,52 @@ static int queue_old_event(MASTER_INFO *mi, const char *buf,
pthread_mutex_lock
(
&
mi
->
data_lock
);
ev
->
log_pos
=
mi
->
master_log_pos
;
switch
(
ev
->
get_type_code
())
{
case
STOP_EVENT
:
ignore_event
=
mi
->
ignore_stop_event
;
mi
->
ignore_stop_event
=
0
;
inc_pos
=
event_len
;
break
;
case
ROTATE_EVENT
:
if
(
unlikely
(
process_io_rotate
(
mi
,(
Rotate_log_event
*
)
ev
)))
{
delete
ev
;
pthread_mutex_unlock
(
&
mi
->
data_lock
);
DBUG_ASSERT
(
!
tmp_buf
);
DBUG_RETURN
(
1
);
}
mi
->
ignore_stop_event
=
1
;
inc_pos
=
0
;
break
;
case
STOP_EVENT
:
processed_stop_event
=
1
;
inc_pos
=
0
;
break
;
case
CREATE_FILE_EVENT
:
{
/* We come here when and only when tmp_buf != 0 */
DBUG_ASSERT
(
tmp_buf
);
int
error
=
process_io_create_file
(
mi
,(
Create_file_log_event
*
)
ev
);
delete
ev
;
mi
->
master_log_pos
+=
event_len
;
DBUG_PRINT
(
"info"
,
(
"master_log_pos: %d"
,
(
ulong
)
mi
->
master_log_pos
));
pthread_mutex_unlock
(
&
mi
->
data_lock
);
DBUG_ASSERT
(
tmp_buf
);
my_free
((
char
*
)
tmp_buf
,
MYF
(
0
));
DBUG_RETURN
(
error
);
}
default:
mi
->
ignore_stop_event
=
0
;
inc_pos
=
event_len
;
break
;
}
if
(
likely
(
!
processed_stop_event
||
!
mi
->
ignore_stop
_event
))
if
(
likely
(
!
ignore
_event
))
{
if
(
unlikely
(
mi
->
rli
.
relay_log
.
append
(
ev
)))
if
(
unlikely
(
rli
->
relay_log
.
append
(
ev
)))
{
delete
ev
;
pthread_mutex_unlock
(
&
mi
->
data_lock
);
DBUG_ASSERT
(
!
tmp_buf
);
DBUG_RETURN
(
1
);
}
mi
->
rli
.
relay_log
.
harvest_bytes_written
(
&
mi
->
rli
.
log_space_total
);
rli
->
relay_log
.
harvest_bytes_written
(
&
rli
->
log_space_total
);
}
delete
ev
;
if
(
likely
(
inc_pos
))
mi
->
master_log_pos
+=
event_len
;
mi
->
master_log_pos
+=
inc_pos
;
DBUG_PRINT
(
"info"
,
(
"master_log_pos: %d"
,
(
ulong
)
mi
->
master_log_pos
));
if
(
unlikely
(
processed_stop_event
))
mi
->
ignore_stop_event
=
1
;
pthread_mutex_unlock
(
&
mi
->
data_lock
);
DBUG_ASSERT
(
!
tmp_buf
);
DBUG_RETURN
(
0
);
}
...
...
@@ -2435,48 +2460,52 @@ static int queue_old_event(MASTER_INFO *mi, const char *buf,
int
queue_event
(
MASTER_INFO
*
mi
,
const
char
*
buf
,
ulong
event_len
)
{
int
error
=
0
;
bool
inc_pos
=
1
;
bool
processed_stop_event
=
0
;
int
error
=
0
;
ulong
inc_pos
;
bool
ignore_event
=
0
;
RELAY_LOG_INFO
*
rli
=
&
mi
->
rli
;
DBUG_ENTER
(
"queue_event"
);
if
(
mi
->
old_format
)
DBUG_RETURN
(
queue_old_event
(
mi
,
buf
,
event_len
));
pthread_mutex_lock
(
&
mi
->
data_lock
);
/*
TODO: figure out if other events in addition to Rotate
require special processing
*/
switch
(
buf
[
EVENT_TYPE_OFFSET
])
{
case
STOP_EVENT
:
processed_stop_event
=
1
;
ignore_event
=
mi
->
ignore_stop_event
;
mi
->
ignore_stop_event
=
0
;
inc_pos
=
event_len
;
break
;
case
ROTATE_EVENT
:
{
Rotate_log_event
rev
(
buf
,
event_len
,
0
);
if
(
unlikely
(
process_io_rotate
(
mi
,
&
rev
)))
{
pthread_mutex_unlock
(
&
mi
->
data_lock
);
DBUG_RETURN
(
1
);
inc_pos
=
0
;
mi
->
ignore_stop_event
=
1
;
}
mi
->
ignore_stop_event
=
1
;
inc_pos
=
0
;
break
;
}
default:
mi
->
ignore_stop_event
=
0
;
mi
->
ignore_stop_event
=
0
;
inc_pos
=
event_len
;
break
;
}
if
(
likely
(
(
!
processed_stop_event
||
!
mi
->
ignore_stop_event
)
&&
!
(
error
=
mi
->
rli
.
relay_log
.
appendv
(
buf
,
event_len
,
0
))))
if
(
likely
(
!
ignore_event
&&
!
(
error
=
rli
->
relay_log
.
appendv
(
buf
,
event_len
,
0
))))
{
if
(
likely
(
inc_pos
))
mi
->
master_log_pos
+=
event_len
;
mi
->
master_log_pos
+=
inc_pos
;
DBUG_PRINT
(
"info"
,
(
"master_log_pos: %d"
,
(
ulong
)
mi
->
master_log_pos
));
mi
->
rli
.
relay_log
.
harvest_bytes_written
(
&
mi
->
rli
.
log_space_total
);
rli
->
relay_log
.
harvest_bytes_written
(
&
rli
->
log_space_total
);
}
if
(
unlikely
(
processed_stop_event
))
mi
->
ignore_stop_event
=
1
;
pthread_mutex_unlock
(
&
mi
->
data_lock
);
DBUG_RETURN
(
error
);
}
...
...
This diff is collapsed.
Click to expand it.
sql/slave.h
View file @
fa4e07bf
...
...
@@ -312,6 +312,7 @@ typedef struct st_master_info
}
MASTER_INFO
;
int
queue_event
(
MASTER_INFO
*
mi
,
const
char
*
buf
,
ulong
event_len
);
typedef
struct
st_table_rule_ent
...
...
This diff is collapsed.
Click to expand it.
sql/sql_acl.cc
View file @
fa4e07bf
...
...
@@ -1310,18 +1310,24 @@ static int replace_user_table(THD *thd, TABLE *table, const LEX_USER &combo,
if
(
table
->
fields
>=
31
)
/* From 4.0.0 we have more fields */
{
/* We write down SSL related ACL stuff */
table
->
field
[
25
]
->
store
(
""
,
0
);
table
->
field
[
26
]
->
store
(
""
,
0
);
table
->
field
[
27
]
->
store
(
""
,
0
);
switch
(
thd
->
lex
.
ssl_type
)
{
case
SSL_TYPE_ANY
:
table
->
field
[
24
]
->
store
(
"ANY"
,
3
);
table
->
field
[
25
]
->
store
(
""
,
0
);
table
->
field
[
26
]
->
store
(
""
,
0
);
table
->
field
[
27
]
->
store
(
""
,
0
);
break
;
case
SSL_TYPE_X509
:
table
->
field
[
24
]
->
store
(
"X509"
,
4
);
table
->
field
[
25
]
->
store
(
""
,
0
);
table
->
field
[
26
]
->
store
(
""
,
0
);
table
->
field
[
27
]
->
store
(
""
,
0
);
break
;
case
SSL_TYPE_SPECIFIED
:
table
->
field
[
24
]
->
store
(
"SPECIFIED"
,
9
);
table
->
field
[
25
]
->
store
(
""
,
0
);
table
->
field
[
26
]
->
store
(
""
,
0
);
table
->
field
[
27
]
->
store
(
""
,
0
);
if
(
thd
->
lex
.
ssl_cipher
)
table
->
field
[
25
]
->
store
(
thd
->
lex
.
ssl_cipher
,
strlen
(
thd
->
lex
.
ssl_cipher
));
...
...
@@ -1332,8 +1338,8 @@ static int replace_user_table(THD *thd, TABLE *table, const LEX_USER &combo,
table
->
field
[
27
]
->
store
(
thd
->
lex
.
x509_subject
,
strlen
(
thd
->
lex
.
x509_subject
));
break
;
default
:
table
->
field
[
24
]
->
store
(
""
,
0
);
case
SSL_TYPE_NOT_SPECIFIED
:
break
;
// Nothing to do
}
USER_RESOURCES
mqh
=
thd
->
lex
.
mqh
;
...
...
This diff is collapsed.
Click to expand it.
sql/sql_parse.cc
View file @
fa4e07bf
...
...
@@ -1356,7 +1356,12 @@ mysql_execute_command(void)
{
if
(
check_global_access
(
thd
,
REPL_SLAVE_ACL
))
goto
error
;
#ifndef WORKING_NEW_MASTER
net_printf
(
&
thd
->
net
,
ER_NOT_SUPPORTED_YET
,
"SHOW NEW MASTER"
);
res
=
1
;
#else
res
=
show_new_master
(
thd
);
#endif
break
;
}
case
SQLCOM_SHOW_SLAVE_HOSTS
:
...
...
This diff is collapsed.
Click to expand it.
sql/sql_repl.cc
View file @
fa4e07bf
...
...
@@ -910,6 +910,11 @@ int cmp_master_pos(const char* log_file_name1, ulonglong log_pos1,
const
char
*
log_file_name2
,
ulonglong
log_pos2
)
{
int
res
;
/*
TODO: Change compare function to work with file name of type
'.999 and .1000'
*/
if
((
res
=
strcmp
(
log_file_name1
,
log_file_name2
)))
return
res
;
if
(
log_pos1
>
log_pos2
)
...
...
@@ -919,6 +924,7 @@ int cmp_master_pos(const char* log_file_name1, ulonglong log_pos1,
return
-
1
;
}
int
show_binlog_events
(
THD
*
thd
)
{
DBUG_ENTER
(
"show_binlog_events"
);
...
...
@@ -1010,15 +1016,16 @@ err:
if
(
errmsg
)
{
net_printf
(
&
thd
->
net
,
ER_ERROR_WHEN_EXECUTING_COMMAND
,
"SHOW BINLOG EVENTS"
,
errmsg
);
DBUG_RETURN
(
1
);
my_error
(
ER_ERROR_WHEN_EXECUTING_COMMAND
,
MYF
(
0
)
,
"SHOW BINLOG EVENTS"
,
errmsg
);
DBUG_RETURN
(
-
1
);
}
send_eof
(
&
thd
->
net
);
DBUG_RETURN
(
0
);
}
int
show_binlog_info
(
THD
*
thd
)
{
DBUG_ENTER
(
"show_binlog_info"
);
...
...
This diff is collapsed.
Click to expand it.
sql/sql_udf.cc
View file @
fa4e07bf
...
...
@@ -285,12 +285,14 @@ udf_func *find_udf(const char *name,uint length,bool mark_used)
/* TODO: This should be changed to reader locks someday! */
pthread_mutex_lock
(
&
THR_LOCK_udf
);
udf
=
(
udf_func
*
)
hash_search
(
&
udf_hash
,(
byte
*
)
name
,
length
?
length
:
(
uint
)
strlen
(
name
));
if
(
!
udf
->
dlhandle
)
udf
=
0
;
// Could not be opened
else
if
(
mark_used
)
udf
->
usage_count
++
;
if
((
udf
=
(
udf_func
*
)
hash_search
(
&
udf_hash
,(
byte
*
)
name
,
length
?
length
:
(
uint
)
strlen
(
name
))))
{
if
(
!
udf
->
dlhandle
)
udf
=
0
;
// Could not be opened
else
if
(
mark_used
)
udf
->
usage_count
++
;
}
pthread_mutex_unlock
(
&
THR_LOCK_udf
);
DBUG_RETURN
(
udf
);
}
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment