mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
bzr merge -r3985..3997 codership/5.5
This commit is contained in:
@ -12,6 +12,7 @@
|
|||||||
*.dll
|
*.dll
|
||||||
*.dsp
|
*.dsp
|
||||||
*.dylib
|
*.dylib
|
||||||
|
*.diff
|
||||||
*.exe
|
*.exe
|
||||||
*.exp
|
*.exp
|
||||||
*.gcda
|
*.gcda
|
||||||
|
@ -23,7 +23,7 @@ SET(WSREP_PATCH_VERSION "10")
|
|||||||
# MariaDB addition: Revision number of the last revision merged from
|
# MariaDB addition: Revision number of the last revision merged from
|
||||||
# codership branch visible in @@visible_comment.
|
# codership branch visible in @@visible_comment.
|
||||||
# Branch : codership-mysql/5.5
|
# Branch : codership-mysql/5.5
|
||||||
SET(WSREP_PATCH_REVNO "3980") # Should be updated on every merge.
|
SET(WSREP_PATCH_REVNO "3997") # Should be updated on every merge.
|
||||||
|
|
||||||
# MariaDB: Obtain patch revision number:
|
# MariaDB: Obtain patch revision number:
|
||||||
# Update WSREP_PATCH_REVNO if WSREP_REV environment variable is set.
|
# Update WSREP_PATCH_REVNO if WSREP_REV environment variable is set.
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Copyright (C) 2012 Codership Oy
|
# Copyright (C) 2012-2014 Codership Oy
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -125,3 +125,27 @@ wsrep_cleanup_progress_file()
|
|||||||
{
|
{
|
||||||
[ -n "$SST_PROGRESS_FILE" ] && rm -f "$SST_PROGRESS_FILE" 2>/dev/null
|
[ -n "$SST_PROGRESS_FILE" ] && rm -f "$SST_PROGRESS_FILE" 2>/dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wsrep_check_program()
|
||||||
|
{
|
||||||
|
local prog=$1
|
||||||
|
|
||||||
|
if ! which $prog >/dev/null
|
||||||
|
then
|
||||||
|
echo "'$prog' not found in PATH"
|
||||||
|
return 2 # no such file or directory
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
wsrep_check_programs()
|
||||||
|
{
|
||||||
|
local ret=0
|
||||||
|
|
||||||
|
while [ $# -gt 0 ]
|
||||||
|
do
|
||||||
|
wsrep_check_program $1 || ret=$?
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
return $ret
|
||||||
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash -ue
|
#!/bin/bash -ue
|
||||||
|
|
||||||
# Copyright (C) 2010 Codership Oy
|
# Copyright (C) 2010-2014 Codership Oy
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -28,6 +28,8 @@ export PATH="/usr/sbin:/sbin:$PATH"
|
|||||||
|
|
||||||
. $(dirname $0)/wsrep_sst_common
|
. $(dirname $0)/wsrep_sst_common
|
||||||
|
|
||||||
|
wsrep_check_programs rsync
|
||||||
|
|
||||||
cleanup_joiner()
|
cleanup_joiner()
|
||||||
{
|
{
|
||||||
wsrep_log_info "Joiner cleanup."
|
wsrep_log_info "Joiner cleanup."
|
||||||
@ -202,6 +204,8 @@ then
|
|||||||
|
|
||||||
elif [ "$WSREP_SST_OPT_ROLE" = "joiner" ]
|
elif [ "$WSREP_SST_OPT_ROLE" = "joiner" ]
|
||||||
then
|
then
|
||||||
|
wsrep_check_programs lsof
|
||||||
|
|
||||||
touch $SST_PROGRESS_FILE
|
touch $SST_PROGRESS_FILE
|
||||||
MYSQLD_PID=$WSREP_SST_OPT_PARENT
|
MYSQLD_PID=$WSREP_SST_OPT_PARENT
|
||||||
|
|
||||||
|
@ -63,6 +63,10 @@ STATDIR=""
|
|||||||
uextra=0
|
uextra=0
|
||||||
disver=""
|
disver=""
|
||||||
|
|
||||||
|
tmpopts=""
|
||||||
|
itmpdir=""
|
||||||
|
xtmpdir=""
|
||||||
|
|
||||||
scomp=""
|
scomp=""
|
||||||
sdecomp=""
|
sdecomp=""
|
||||||
|
|
||||||
@ -236,7 +240,7 @@ parse_cnf()
|
|||||||
get_footprint()
|
get_footprint()
|
||||||
{
|
{
|
||||||
pushd $WSREP_SST_OPT_DATA 1>/dev/null
|
pushd $WSREP_SST_OPT_DATA 1>/dev/null
|
||||||
payload=$(du --block-size=1 -c **/*.ibd **/*.MYI **/*.MYI ibdata1 | awk 'END { print $1 }')
|
payload=$(find . -regex '.*\.ibd$\|.*\.MYI$\|.*\.MYD$\|.*ibdata1$' -type f -print0 | xargs -0 du --block-size=1 -c | awk 'END { print $1 }')
|
||||||
if my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -q -- "--compress";then
|
if my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -q -- "--compress";then
|
||||||
# QuickLZ has around 50% compression ratio
|
# QuickLZ has around 50% compression ratio
|
||||||
# When compression/compaction used, the progress is only an approximate.
|
# When compression/compaction used, the progress is only an approximate.
|
||||||
@ -299,6 +303,7 @@ read_cnf()
|
|||||||
iopts=$(parse_cnf sst inno-backup-opts "")
|
iopts=$(parse_cnf sst inno-backup-opts "")
|
||||||
iapts=$(parse_cnf sst inno-apply-opts "")
|
iapts=$(parse_cnf sst inno-apply-opts "")
|
||||||
impts=$(parse_cnf sst inno-move-opts "")
|
impts=$(parse_cnf sst inno-move-opts "")
|
||||||
|
stimeout=$(parse_cnf sst sst-initial-timeout 100)
|
||||||
}
|
}
|
||||||
|
|
||||||
get_stream()
|
get_stream()
|
||||||
@ -370,20 +375,29 @@ cleanup_donor()
|
|||||||
wsrep_log_error "Cleanup after exit with status:$estatus"
|
wsrep_log_error "Cleanup after exit with status:$estatus"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -n $XTRABACKUP_PID ]];then
|
if [[ -n ${XTRABACKUP_PID:-} ]];then
|
||||||
if check_pid $XTRABACKUP_PID
|
if check_pid $XTRABACKUP_PID
|
||||||
then
|
then
|
||||||
wsrep_log_error "xtrabackup process is still running. Killing... "
|
wsrep_log_error "xtrabackup process is still running. Killing... "
|
||||||
kill_xtrabackup
|
kill_xtrabackup
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rm -f $XTRABACKUP_PID
|
|
||||||
fi
|
fi
|
||||||
rm -f ${DATA}/${IST_FILE}
|
rm -f ${DATA}/${IST_FILE} || true
|
||||||
|
|
||||||
if [[ -n $progress && -p $progress ]];then
|
if [[ -n $progress && -p $progress ]];then
|
||||||
wsrep_log_info "Cleaning up fifo file $progress"
|
wsrep_log_info "Cleaning up fifo file $progress"
|
||||||
rm $progress
|
rm -f $progress || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
wsrep_log_info "Cleaning up temporary directories"
|
||||||
|
|
||||||
|
if [[ -n $xtmpdir ]];then
|
||||||
|
[[ -d $xtmpdir ]] && rm -rf $xtmpdir || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n $itmpdir ]];then
|
||||||
|
[[ -d $itmpdir ]] && rm -rf $itmpdir || true
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,7 +405,8 @@ kill_xtrabackup()
|
|||||||
{
|
{
|
||||||
local PID=$(cat $XTRABACKUP_PID)
|
local PID=$(cat $XTRABACKUP_PID)
|
||||||
[ -n "$PID" -a "0" != "$PID" ] && kill $PID && (kill $PID && kill -9 $PID) || :
|
[ -n "$PID" -a "0" != "$PID" ] && kill $PID && (kill $PID && kill -9 $PID) || :
|
||||||
rm -f "$XTRABACKUP_PID"
|
wsrep_log_info "Removing xtrabackup pid file $XTRABACKUP_PID"
|
||||||
|
rm -f "$XTRABACKUP_PID" || true
|
||||||
}
|
}
|
||||||
|
|
||||||
setup_ports()
|
setup_ports()
|
||||||
@ -453,13 +468,30 @@ recv_joiner()
|
|||||||
{
|
{
|
||||||
local dir=$1
|
local dir=$1
|
||||||
local msg=$2
|
local msg=$2
|
||||||
|
local tmt=$3
|
||||||
|
local ltcmd
|
||||||
|
|
||||||
pushd ${dir} 1>/dev/null
|
pushd ${dir} 1>/dev/null
|
||||||
set +e
|
set +e
|
||||||
timeit "$msg" "$tcmd | $strmcmd; RC=( "\${PIPESTATUS[@]}" )"
|
|
||||||
|
if [[ $tmt -gt 0 && -x `which timeout` ]];then
|
||||||
|
if timeout --help | grep -q -- '-k';then
|
||||||
|
ltcmd="timeout -k $(( tmt+10 )) $tmt $tcmd"
|
||||||
|
else
|
||||||
|
ltcmd="timeout $tmt $tcmd"
|
||||||
|
fi
|
||||||
|
timeit "$msg" "$ltcmd | $strmcmd; RC=( "\${PIPESTATUS[@]}" )"
|
||||||
|
else
|
||||||
|
timeit "$msg" "$tcmd | $strmcmd; RC=( "\${PIPESTATUS[@]}" )"
|
||||||
|
fi
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
popd 1>/dev/null
|
popd 1>/dev/null
|
||||||
|
|
||||||
|
if [[ ${RC[0]} -eq 124 ]];then
|
||||||
|
wsrep_log_error "Possible timeout in receving first data from donor in gtid stage"
|
||||||
|
exit 32
|
||||||
|
fi
|
||||||
|
|
||||||
for ecode in "${RC[@]}";do
|
for ecode in "${RC[@]}";do
|
||||||
if [[ $ecode -ne 0 ]];then
|
if [[ $ecode -ne 0 ]];then
|
||||||
@ -501,7 +533,7 @@ send_donor()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if [[ ! -x `which innobackupex` ]];then
|
if [[ ! -x `which $INNOBACKUPEX_BIN` ]];then
|
||||||
wsrep_log_error "innobackupex not in path: $PATH"
|
wsrep_log_error "innobackupex not in path: $PATH"
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
@ -526,7 +558,7 @@ fi
|
|||||||
INNOEXTRA=""
|
INNOEXTRA=""
|
||||||
INNOAPPLY="${INNOBACKUPEX_BIN} $disver $iapts --apply-log \$rebuildcmd \${DATA} &>\${DATA}/innobackup.prepare.log"
|
INNOAPPLY="${INNOBACKUPEX_BIN} $disver $iapts --apply-log \$rebuildcmd \${DATA} &>\${DATA}/innobackup.prepare.log"
|
||||||
INNOMOVE="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} $disver $impts --move-back --force-non-empty-directories \${DATA} &>\${DATA}/innobackup.move.log"
|
INNOMOVE="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} $disver $impts --move-back --force-non-empty-directories \${DATA} &>\${DATA}/innobackup.move.log"
|
||||||
INNOBACKUP="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} $disver $iopts \$INNOEXTRA --galera-info --stream=\$sfmt \${TMPDIR} 2>\${DATA}/innobackup.backup.log"
|
INNOBACKUP="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} $disver $iopts \$tmpopts \$INNOEXTRA --galera-info --stream=\$sfmt \$itmpdir 2>\${DATA}/innobackup.backup.log"
|
||||||
|
|
||||||
if [ "$WSREP_SST_OPT_ROLE" = "donor" ]
|
if [ "$WSREP_SST_OPT_ROLE" = "donor" ]
|
||||||
then
|
then
|
||||||
@ -535,7 +567,14 @@ then
|
|||||||
if [ $WSREP_SST_OPT_BYPASS -eq 0 ]
|
if [ $WSREP_SST_OPT_BYPASS -eq 0 ]
|
||||||
then
|
then
|
||||||
|
|
||||||
TMPDIR="${TMPDIR:-/tmp}"
|
if [[ -z $(parse_cnf mysqld tmpdir "") && -z $(parse_cnf xtrabackup tmpdir "") ]];then
|
||||||
|
xtmpdir=$(mktemp -d)
|
||||||
|
tmpopts=" --tmpdir=$xtmpdir "
|
||||||
|
wsrep_log_info "Using $xtmpdir as xtrabackup temporary directory"
|
||||||
|
fi
|
||||||
|
|
||||||
|
itmpdir=$(mktemp -d)
|
||||||
|
wsrep_log_info "Using $itmpdir as innobackupex temporary directory"
|
||||||
|
|
||||||
if [ "${AUTH[0]}" != "(null)" ]; then
|
if [ "${AUTH[0]}" != "(null)" ]; then
|
||||||
INNOEXTRA+=" --user=${AUTH[0]}"
|
INNOEXTRA+=" --user=${AUTH[0]}"
|
||||||
@ -613,8 +652,8 @@ then
|
|||||||
exit 22
|
exit 22
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# innobackupex implicitly writes PID to fixed location in ${TMPDIR}
|
# innobackupex implicitly writes PID to fixed location in $xtmpdir
|
||||||
XTRABACKUP_PID="${TMPDIR}/xtrabackup_pid"
|
XTRABACKUP_PID="$xtmpdir/xtrabackup_pid"
|
||||||
|
|
||||||
|
|
||||||
else # BYPASS FOR IST
|
else # BYPASS FOR IST
|
||||||
@ -717,7 +756,7 @@ then
|
|||||||
|
|
||||||
STATDIR=$(mktemp -d)
|
STATDIR=$(mktemp -d)
|
||||||
MAGIC_FILE="${STATDIR}/${INFO_FILE}"
|
MAGIC_FILE="${STATDIR}/${INFO_FILE}"
|
||||||
recv_joiner $STATDIR "${stagemsg}-gtid" 1
|
recv_joiner $STATDIR "${stagemsg}-gtid" $stimeout
|
||||||
|
|
||||||
if ! ps -p ${WSREP_SST_OPT_PARENT} &>/dev/null
|
if ! ps -p ${WSREP_SST_OPT_PARENT} &>/dev/null
|
||||||
then
|
then
|
||||||
@ -767,7 +806,7 @@ then
|
|||||||
|
|
||||||
|
|
||||||
MAGIC_FILE="${DATA}/${INFO_FILE}"
|
MAGIC_FILE="${DATA}/${INFO_FILE}"
|
||||||
recv_joiner $DATA "${stagemsg}-SST" 0
|
recv_joiner $DATA "${stagemsg}-SST" 0
|
||||||
|
|
||||||
get_proc
|
get_proc
|
||||||
|
|
||||||
@ -867,11 +906,10 @@ then
|
|||||||
wsrep_log_info "${IST_FILE} received from donor: Running IST"
|
wsrep_log_info "${IST_FILE} received from donor: Running IST"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ! -r ${MAGIC_FILE} ]];then
|
if [[ ! -r ${MAGIC_FILE} ]];then
|
||||||
wsrep_log_error "SST magic file ${MAGIC_FILE} not found/readable"
|
wsrep_log_error "SST magic file ${MAGIC_FILE} not found/readable"
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cat "${MAGIC_FILE}" # output UUID:seqno
|
cat "${MAGIC_FILE}" # output UUID:seqno
|
||||||
wsrep_log_info "Total time on joiner: $totime seconds"
|
wsrep_log_info "Total time on joiner: $totime seconds"
|
||||||
fi
|
fi
|
||||||
|
@ -205,7 +205,7 @@ parse_cnf()
|
|||||||
get_footprint()
|
get_footprint()
|
||||||
{
|
{
|
||||||
pushd $WSREP_SST_OPT_DATA 1>/dev/null
|
pushd $WSREP_SST_OPT_DATA 1>/dev/null
|
||||||
payload=$(du --block-size=1 -c **/*.ibd **/*.MYI **/*.MYI ibdata1 | awk 'END { print $1 }')
|
payload=$(find . -regex '.*\.ibd$\|.*\.MYI$\|.*\.MYD$\|.*ibdata1$' -type f -print0 | xargs -0 du --block-size=1 -c | awk 'END { print $1 }')
|
||||||
if my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -q -- "--compress";then
|
if my_print_defaults -c $WSREP_SST_OPT_CONF xtrabackup | grep -q -- "--compress";then
|
||||||
# QuickLZ has around 50% compression ratio
|
# QuickLZ has around 50% compression ratio
|
||||||
# When compression/compaction used, the progress is only an approximate.
|
# When compression/compaction used, the progress is only an approximate.
|
||||||
|
@ -1467,8 +1467,21 @@ end:
|
|||||||
saved_master_access= thd->security_ctx->master_access;
|
saved_master_access= thd->security_ctx->master_access;
|
||||||
thd->security_ctx->master_access |= SUPER_ACL;
|
thd->security_ctx->master_access |= SUPER_ACL;
|
||||||
|
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
// sql_print_information("sizeof(LEX) = %d", sizeof(struct LEX));
|
||||||
|
// sizeof(LEX) = 4512, so it's relatively safe to allocate it on stack.
|
||||||
|
LEX lex;
|
||||||
|
lex.sql_command = SQLCOM_DROP_EVENT;
|
||||||
|
thd->lex = &lex;
|
||||||
|
WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
ret= Events::drop_event(thd, dbname, name, FALSE);
|
ret= Events::drop_event(thd, dbname, name, FALSE);
|
||||||
|
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
WSREP_TO_ISOLATION_END;
|
||||||
|
error:
|
||||||
|
#endif
|
||||||
thd->security_ctx->master_access= saved_master_access;
|
thd->security_ctx->master_access= saved_master_access;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1104,6 +1104,20 @@ Events::load_events_from_db(THD *thd)
|
|||||||
delete et;
|
delete et;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
// when SST from master node who initials event, the event status is ENABLED
|
||||||
|
// this is problematic because there are two nodes with same events and both enabled.
|
||||||
|
if (et->originator != thd->server_id)
|
||||||
|
{
|
||||||
|
store_record(table, record[1]);
|
||||||
|
table->field[ET_FIELD_STATUS]->
|
||||||
|
store((longlong) Event_parse_data::SLAVESIDE_DISABLED,
|
||||||
|
TRUE);
|
||||||
|
(void) table->file->ha_update_row(table->record[1], table->record[0]);
|
||||||
|
delete et;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
drop_on_completion= (et->on_completion ==
|
drop_on_completion= (et->on_completion ==
|
||||||
Event_parse_data::ON_COMPLETION_DROP);
|
Event_parse_data::ON_COMPLETION_DROP);
|
||||||
|
|
||||||
@ -1158,6 +1172,33 @@ int wsrep_create_event_query(THD *thd, uchar** buf, size_t* buf_len)
|
|||||||
}
|
}
|
||||||
return wsrep_to_buf_helper(thd, log_query.ptr(), log_query.length(), buf, buf_len);
|
return wsrep_to_buf_helper(thd, log_query.ptr(), log_query.length(), buf, buf_len);
|
||||||
}
|
}
|
||||||
|
static int
|
||||||
|
wsrep_alter_query_string(THD *thd, String *buf)
|
||||||
|
{
|
||||||
|
/* Append the "ALTER" part of the query */
|
||||||
|
if (buf->append(STRING_WITH_LEN("ALTER ")))
|
||||||
|
return 1;
|
||||||
|
/* Append definer */
|
||||||
|
append_definer(thd, buf, &(thd->lex->definer->user), &(thd->lex->definer->host));
|
||||||
|
/* Append the left part of thd->query after event name part */
|
||||||
|
if (buf->append(thd->lex->stmt_definition_begin,
|
||||||
|
thd->lex->stmt_definition_end -
|
||||||
|
thd->lex->stmt_definition_begin))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int wsrep_alter_event_query(THD *thd, uchar** buf, size_t* buf_len)
|
||||||
|
{
|
||||||
|
String log_query;
|
||||||
|
|
||||||
|
if (wsrep_alter_query_string(thd, &log_query))
|
||||||
|
{
|
||||||
|
WSREP_WARN("events alter string failed: %s", thd->query());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return wsrep_to_buf_helper(thd, log_query.ptr(), log_query.length(), buf, buf_len);
|
||||||
|
}
|
||||||
#endif /* WITH_WSREP */
|
#endif /* WITH_WSREP */
|
||||||
/**
|
/**
|
||||||
@} (End of group Event_Scheduler)
|
@} (End of group Event_Scheduler)
|
||||||
|
@ -2761,7 +2761,8 @@ bool one_thread_per_connection_end(THD *thd, bool put_in_cache)
|
|||||||
/* Mark that current_thd is not valid anymore */
|
/* Mark that current_thd is not valid anymore */
|
||||||
my_pthread_setspecific_ptr(THR_THD, 0);
|
my_pthread_setspecific_ptr(THR_THD, 0);
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
if (put_in_cache && !thd->wsrep_applier)
|
const bool wsrep_applier(thd->wsrep_applier);
|
||||||
|
if (put_in_cache && !wsrep_applier)
|
||||||
#else
|
#else
|
||||||
if (put_in_cache)
|
if (put_in_cache)
|
||||||
#endif /* WITH_WSREP */
|
#endif /* WITH_WSREP */
|
||||||
|
@ -6550,7 +6550,7 @@ alter:
|
|||||||
}
|
}
|
||||||
view_tail
|
view_tail
|
||||||
{}
|
{}
|
||||||
| ALTER definer_opt EVENT_SYM sp_name
|
| ALTER definer_opt remember_name EVENT_SYM sp_name
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
It is safe to use Lex->spname because
|
It is safe to use Lex->spname because
|
||||||
@ -6562,9 +6562,12 @@ alter:
|
|||||||
|
|
||||||
if (!(Lex->event_parse_data= Event_parse_data::new_instance(thd)))
|
if (!(Lex->event_parse_data= Event_parse_data::new_instance(thd)))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
Lex->event_parse_data->identifier= $4;
|
Lex->event_parse_data->identifier= $5;
|
||||||
|
|
||||||
Lex->sql_command= SQLCOM_ALTER_EVENT;
|
Lex->sql_command= SQLCOM_ALTER_EVENT;
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
Lex->stmt_definition_begin= $3;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
ev_alter_on_schedule_completion
|
ev_alter_on_schedule_completion
|
||||||
opt_ev_rename_to
|
opt_ev_rename_to
|
||||||
@ -6572,7 +6575,7 @@ alter:
|
|||||||
opt_ev_comment
|
opt_ev_comment
|
||||||
opt_ev_sql_stmt
|
opt_ev_sql_stmt
|
||||||
{
|
{
|
||||||
if (!($6 || $7 || $8 || $9 || $10))
|
if (!($7 || $8 || $9 || $10 || $11))
|
||||||
{
|
{
|
||||||
my_parse_error(ER(ER_SYNTAX_ERROR));
|
my_parse_error(ER(ER_SYNTAX_ERROR));
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
@ -6582,6 +6585,9 @@ alter:
|
|||||||
can overwrite it
|
can overwrite it
|
||||||
*/
|
*/
|
||||||
Lex->sql_command= SQLCOM_ALTER_EVENT;
|
Lex->sql_command= SQLCOM_ALTER_EVENT;
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
Lex->stmt_definition_end= (char*)YYLIP->get_cpp_ptr();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
| ALTER TABLESPACE alter_tablespace_info
|
| ALTER TABLESPACE alter_tablespace_info
|
||||||
{
|
{
|
||||||
|
@ -509,7 +509,20 @@ int wsrep_init()
|
|||||||
wsrep_ready_set(TRUE);
|
wsrep_ready_set(TRUE);
|
||||||
wsrep_inited= 1;
|
wsrep_inited= 1;
|
||||||
global_system_variables.wsrep_on = 0;
|
global_system_variables.wsrep_on = 0;
|
||||||
return 0;
|
wsrep_init_args args;
|
||||||
|
args.logger_cb = wsrep_log_cb;
|
||||||
|
args.options = (wsrep_provider_options) ?
|
||||||
|
wsrep_provider_options : "";
|
||||||
|
rcode = wsrep->init(wsrep, &args);
|
||||||
|
if (rcode)
|
||||||
|
{
|
||||||
|
DBUG_PRINT("wsrep",("wsrep::init() failed: %d", rcode));
|
||||||
|
WSREP_ERROR("wsrep::init() failed: %d, must shutdown", rcode);
|
||||||
|
wsrep->free(wsrep);
|
||||||
|
free(wsrep);
|
||||||
|
wsrep = NULL;
|
||||||
|
}
|
||||||
|
return rcode;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1216,6 +1229,9 @@ static int wsrep_TOI_begin(THD *thd, char *db_, char *table_,
|
|||||||
case SQLCOM_CREATE_EVENT:
|
case SQLCOM_CREATE_EVENT:
|
||||||
buf_err= wsrep_create_event_query(thd, &buf, &buf_len);
|
buf_err= wsrep_create_event_query(thd, &buf, &buf_len);
|
||||||
break;
|
break;
|
||||||
|
case SQLCOM_ALTER_EVENT:
|
||||||
|
buf_err= wsrep_alter_event_query(thd, &buf, &buf_len);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
buf_err= wsrep_to_buf_helper(thd, thd->query(), thd->query_length(), &buf,
|
buf_err= wsrep_to_buf_helper(thd, thd->query(), thd->query_length(), &buf,
|
||||||
&buf_len);
|
&buf_len);
|
||||||
|
@ -298,6 +298,7 @@ int wsrep_to_buf_helper(
|
|||||||
int wsrep_create_sp(THD *thd, uchar** buf, size_t* buf_len);
|
int wsrep_create_sp(THD *thd, uchar** buf, size_t* buf_len);
|
||||||
int wsrep_create_trigger_query(THD *thd, uchar** buf, size_t* buf_len);
|
int wsrep_create_trigger_query(THD *thd, uchar** buf, size_t* buf_len);
|
||||||
int wsrep_create_event_query(THD *thd, uchar** buf, size_t* buf_len);
|
int wsrep_create_event_query(THD *thd, uchar** buf, size_t* buf_len);
|
||||||
|
int wsrep_alter_event_query(THD *thd, uchar** buf, size_t* buf_len);
|
||||||
|
|
||||||
const wsrep_uuid_t* wsrep_cluster_uuid();
|
const wsrep_uuid_t* wsrep_cluster_uuid();
|
||||||
struct xid_t;
|
struct xid_t;
|
||||||
|
@ -23,11 +23,20 @@
|
|||||||
#include "sql_base.h" // close_thread_tables()
|
#include "sql_base.h" // close_thread_tables()
|
||||||
#include "mysqld.h" // start_wsrep_THD();
|
#include "mysqld.h" // start_wsrep_THD();
|
||||||
|
|
||||||
static long long wsrep_bf_aborts_counter = 0;
|
|
||||||
|
#if (__LP64__)
|
||||||
|
static volatile int64 wsrep_bf_aborts_counter(0);
|
||||||
|
#define WSREP_ATOMIC_LOAD_LONG my_atomic_load64
|
||||||
|
#define WSREP_ATOMIC_ADD_LONG my_atomic_add64
|
||||||
|
#else
|
||||||
|
static volatile int32 wsrep_bf_aborts_counter(0);
|
||||||
|
#define WSREP_ATOMIC_LOAD_LONG my_atomic_load32
|
||||||
|
#define WSREP_ATOMIC_ADD_LONG my_atomic_add32
|
||||||
|
#endif
|
||||||
|
|
||||||
int wsrep_show_bf_aborts (THD *thd, SHOW_VAR *var, char *buff)
|
int wsrep_show_bf_aborts (THD *thd, SHOW_VAR *var, char *buff)
|
||||||
{
|
{
|
||||||
wsrep_local_bf_aborts = my_atomic_load64(&wsrep_bf_aborts_counter);
|
wsrep_local_bf_aborts = WSREP_ATOMIC_LOAD_LONG(&wsrep_bf_aborts_counter);
|
||||||
var->type = SHOW_LONGLONG;
|
var->type = SHOW_LONGLONG;
|
||||||
var->value = (char*)&wsrep_local_bf_aborts;
|
var->value = (char*)&wsrep_local_bf_aborts;
|
||||||
return 0;
|
return 0;
|
||||||
@ -39,7 +48,7 @@ void wsrep_client_rollback(THD *thd)
|
|||||||
WSREP_DEBUG("client rollback due to BF abort for (%ld), query: %s",
|
WSREP_DEBUG("client rollback due to BF abort for (%ld), query: %s",
|
||||||
thd->thread_id, thd->query());
|
thd->thread_id, thd->query());
|
||||||
|
|
||||||
my_atomic_add64(&wsrep_bf_aborts_counter, 1);
|
WSREP_ATOMIC_ADD_LONG(&wsrep_bf_aborts_counter, 1);
|
||||||
|
|
||||||
thd->wsrep_conflict_state= ABORTING;
|
thd->wsrep_conflict_state= ABORTING;
|
||||||
mysql_mutex_unlock(&thd->LOCK_wsrep_thd);
|
mysql_mutex_unlock(&thd->LOCK_wsrep_thd);
|
||||||
|
@ -1820,7 +1820,12 @@ lock_rec_create(
|
|||||||
automatically of the gap type */
|
automatically of the gap type */
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(heap_no == PAGE_HEAP_NO_SUPREMUM)) {
|
if (UNIV_UNLIKELY(heap_no == PAGE_HEAP_NO_SUPREMUM)) {
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
ut_ad(!(type_mode & LOCK_REC_NOT_GAP) ||
|
||||||
|
wsrep_thd_is_BF(trx->mysql_thd, FALSE));
|
||||||
|
#else
|
||||||
ut_ad(!(type_mode & LOCK_REC_NOT_GAP));
|
ut_ad(!(type_mode & LOCK_REC_NOT_GAP));
|
||||||
|
#endif /* WITH_WSREP */
|
||||||
|
|
||||||
type_mode = type_mode & ~(LOCK_GAP | LOCK_REC_NOT_GAP);
|
type_mode = type_mode & ~(LOCK_GAP | LOCK_REC_NOT_GAP);
|
||||||
}
|
}
|
||||||
@ -2104,7 +2109,12 @@ lock_rec_add_to_queue(
|
|||||||
struct for a gap type lock */
|
struct for a gap type lock */
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(heap_no == PAGE_HEAP_NO_SUPREMUM)) {
|
if (UNIV_UNLIKELY(heap_no == PAGE_HEAP_NO_SUPREMUM)) {
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
ut_ad(!(type_mode & LOCK_REC_NOT_GAP) ||
|
||||||
|
wsrep_thd_is_BF(trx->mysql_thd, FALSE));
|
||||||
|
#else
|
||||||
ut_ad(!(type_mode & LOCK_REC_NOT_GAP));
|
ut_ad(!(type_mode & LOCK_REC_NOT_GAP));
|
||||||
|
#endif /* WITH_WSREP */
|
||||||
|
|
||||||
/* There should never be LOCK_REC_NOT_GAP on a supremum
|
/* There should never be LOCK_REC_NOT_GAP on a supremum
|
||||||
record, but let us play safe */
|
record, but let us play safe */
|
||||||
|
@ -1696,10 +1696,6 @@ row_ins_scan_sec_index_for_duplicate(
|
|||||||
mem_heap_t* heap = NULL;
|
mem_heap_t* heap = NULL;
|
||||||
ulint offsets_[REC_OFFS_NORMAL_SIZE];
|
ulint offsets_[REC_OFFS_NORMAL_SIZE];
|
||||||
ulint* offsets = offsets_;
|
ulint* offsets = offsets_;
|
||||||
#ifdef WITH_WSREP
|
|
||||||
/* appliers don't need dupkey checks */
|
|
||||||
if (wsrep_thd_is_BF(thr_get_trx(thr)->mysql_thd, 0)) return(DB_SUCCESS);
|
|
||||||
#endif /* WITH_WSREP */
|
|
||||||
rec_offs_init(offsets_);
|
rec_offs_init(offsets_);
|
||||||
|
|
||||||
n_unique = dict_index_get_n_unique(index);
|
n_unique = dict_index_get_n_unique(index);
|
||||||
@ -1764,6 +1760,13 @@ row_ins_scan_sec_index_for_duplicate(
|
|||||||
lock_type, block, rec, index, offsets, thr);
|
lock_type, block, rec, index, offsets, thr);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
if (wsrep_thd_is_BF(thr_get_trx(thr)->mysql_thd, 0)) {
|
||||||
|
if (!(lock_type & LOCK_REC_NOT_GAP)) {
|
||||||
|
lock_type |= LOCK_REC_NOT_GAP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* WITH_WSREP */
|
||||||
err = row_ins_set_shared_rec_lock(
|
err = row_ins_set_shared_rec_lock(
|
||||||
lock_type, block, rec, index, offsets, thr);
|
lock_type, block, rec, index, offsets, thr);
|
||||||
}
|
}
|
||||||
|
@ -1821,7 +1821,12 @@ lock_rec_create(
|
|||||||
automatically of the gap type */
|
automatically of the gap type */
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(heap_no == PAGE_HEAP_NO_SUPREMUM)) {
|
if (UNIV_UNLIKELY(heap_no == PAGE_HEAP_NO_SUPREMUM)) {
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
ut_ad(!(type_mode & LOCK_REC_NOT_GAP) ||
|
||||||
|
wsrep_thd_is_BF(trx->mysql_thd, FALSE));
|
||||||
|
#else
|
||||||
ut_ad(!(type_mode & LOCK_REC_NOT_GAP));
|
ut_ad(!(type_mode & LOCK_REC_NOT_GAP));
|
||||||
|
#endif /* WITH_WSREP */
|
||||||
|
|
||||||
type_mode = type_mode & ~(LOCK_GAP | LOCK_REC_NOT_GAP);
|
type_mode = type_mode & ~(LOCK_GAP | LOCK_REC_NOT_GAP);
|
||||||
}
|
}
|
||||||
@ -2111,7 +2116,12 @@ lock_rec_add_to_queue(
|
|||||||
struct for a gap type lock */
|
struct for a gap type lock */
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(heap_no == PAGE_HEAP_NO_SUPREMUM)) {
|
if (UNIV_UNLIKELY(heap_no == PAGE_HEAP_NO_SUPREMUM)) {
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
ut_ad(!(type_mode & LOCK_REC_NOT_GAP) ||
|
||||||
|
wsrep_thd_is_BF(trx->mysql_thd, FALSE));
|
||||||
|
#else
|
||||||
ut_ad(!(type_mode & LOCK_REC_NOT_GAP));
|
ut_ad(!(type_mode & LOCK_REC_NOT_GAP));
|
||||||
|
#endif /* WITH_WSREP */
|
||||||
|
|
||||||
/* There should never be LOCK_REC_NOT_GAP on a supremum
|
/* There should never be LOCK_REC_NOT_GAP on a supremum
|
||||||
record, but let us play safe */
|
record, but let us play safe */
|
||||||
|
@ -1705,10 +1705,6 @@ row_ins_scan_sec_index_for_duplicate(
|
|||||||
mem_heap_t* heap = NULL;
|
mem_heap_t* heap = NULL;
|
||||||
ulint offsets_[REC_OFFS_NORMAL_SIZE];
|
ulint offsets_[REC_OFFS_NORMAL_SIZE];
|
||||||
ulint* offsets = offsets_;
|
ulint* offsets = offsets_;
|
||||||
#ifdef WITH_WSREP
|
|
||||||
/* appliers don't need dupkey checks */
|
|
||||||
if (wsrep_thd_is_BF(thr_get_trx(thr)->mysql_thd, 0)) return(DB_SUCCESS);
|
|
||||||
#endif /* WITH_WSREP */
|
|
||||||
rec_offs_init(offsets_);
|
rec_offs_init(offsets_);
|
||||||
|
|
||||||
n_unique = dict_index_get_n_unique(index);
|
n_unique = dict_index_get_n_unique(index);
|
||||||
@ -1773,6 +1769,13 @@ row_ins_scan_sec_index_for_duplicate(
|
|||||||
lock_type, block, rec, index, offsets, thr);
|
lock_type, block, rec, index, offsets, thr);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
if (wsrep_thd_is_BF(thr_get_trx(thr)->mysql_thd, 0)) {
|
||||||
|
if (!(lock_type & LOCK_REC_NOT_GAP)) {
|
||||||
|
lock_type |= LOCK_REC_NOT_GAP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* WITH_WSREP */
|
||||||
err = row_ins_set_shared_rec_lock(
|
err = row_ins_set_shared_rec_lock(
|
||||||
lock_type, block, rec, index, offsets, thr);
|
lock_type, block, rec, index, offsets, thr);
|
||||||
}
|
}
|
||||||
|
@ -304,7 +304,7 @@ Version: %{mysql_version}
|
|||||||
Summary: MySQL: a very fast and reliable SQL database server
|
Summary: MySQL: a very fast and reliable SQL database server
|
||||||
Group: Applications/Databases
|
Group: Applications/Databases
|
||||||
%if %{defined with_wsrep}
|
%if %{defined with_wsrep}
|
||||||
Requires: %{distro_requires} rsync
|
Requires: %{distro_requires} rsync lsof
|
||||||
%else
|
%else
|
||||||
Requires: %{distro_requires}
|
Requires: %{distro_requires}
|
||||||
%endif
|
%endif
|
||||||
|
@ -20,11 +20,13 @@
|
|||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
/*! Dummy backend context. */
|
/*! Dummy backend context. */
|
||||||
typedef struct wsrep_dummy
|
typedef struct wsrep_dummy
|
||||||
{
|
{
|
||||||
wsrep_log_cb_t log_fn;
|
wsrep_log_cb_t log_fn;
|
||||||
|
char* options;
|
||||||
} wsrep_dummy_t;
|
} wsrep_dummy_t;
|
||||||
|
|
||||||
/* Get pointer to wsrep_dummy context from wsrep_t pointer */
|
/* Get pointer to wsrep_dummy context from wsrep_t pointer */
|
||||||
@ -43,6 +45,10 @@ static void dummy_free(wsrep_t *w)
|
|||||||
{
|
{
|
||||||
WSREP_DBUG_ENTER(w);
|
WSREP_DBUG_ENTER(w);
|
||||||
free(w->ctx);
|
free(w->ctx);
|
||||||
|
if (WSREP_DUMMY(w)->options) {
|
||||||
|
free(WSREP_DUMMY(w)->options);
|
||||||
|
WSREP_DUMMY(w)->options = NULL;
|
||||||
|
}
|
||||||
w->ctx = NULL;
|
w->ctx = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,6 +57,9 @@ static wsrep_status_t dummy_init (wsrep_t* w,
|
|||||||
{
|
{
|
||||||
WSREP_DUMMY(w)->log_fn = args->logger_cb;
|
WSREP_DUMMY(w)->log_fn = args->logger_cb;
|
||||||
WSREP_DBUG_ENTER(w);
|
WSREP_DBUG_ENTER(w);
|
||||||
|
if (args->options) {
|
||||||
|
WSREP_DUMMY(w)->options = strdup(args->options);
|
||||||
|
}
|
||||||
return WSREP_OK;
|
return WSREP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,16 +70,23 @@ static uint64_t dummy_capabilities (wsrep_t* w __attribute__((unused)))
|
|||||||
|
|
||||||
static wsrep_status_t dummy_options_set(
|
static wsrep_status_t dummy_options_set(
|
||||||
wsrep_t* w,
|
wsrep_t* w,
|
||||||
const char* conf __attribute__((unused)))
|
const char* conf)
|
||||||
{
|
{
|
||||||
WSREP_DBUG_ENTER(w);
|
WSREP_DBUG_ENTER(w);
|
||||||
|
if (WSREP_DUMMY(w)->options) {
|
||||||
|
free(WSREP_DUMMY(w)->options);
|
||||||
|
WSREP_DUMMY(w)->options = NULL;
|
||||||
|
}
|
||||||
|
if (conf) {
|
||||||
|
WSREP_DUMMY(w)->options = strdup(conf);
|
||||||
|
}
|
||||||
return WSREP_OK;
|
return WSREP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char* dummy_options_get (wsrep_t* w)
|
static char* dummy_options_get (wsrep_t* w)
|
||||||
{
|
{
|
||||||
WSREP_DBUG_ENTER(w);
|
WSREP_DBUG_ENTER(w);
|
||||||
return NULL;
|
return WSREP_DUMMY(w)->options;
|
||||||
}
|
}
|
||||||
|
|
||||||
static wsrep_status_t dummy_connect(
|
static wsrep_status_t dummy_connect(
|
||||||
@ -385,6 +401,7 @@ int wsrep_dummy_loader(wsrep_t* w)
|
|||||||
|
|
||||||
// initialize private context
|
// initialize private context
|
||||||
WSREP_DUMMY(w)->log_fn = NULL;
|
WSREP_DUMMY(w)->log_fn = NULL;
|
||||||
|
WSREP_DUMMY(w)->options = NULL;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user