mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge branch '10.3' into 10.4
This commit is contained in:
@ -22,7 +22,7 @@ EOF
|
||||
fi
|
||||
|
||||
systemctl set-environment _WSREP_NEW_CLUSTER='--wsrep-new-cluster' && \
|
||||
systemctl start ${1:-mariadb}
|
||||
systemctl restart ${1:-mariadb}
|
||||
|
||||
extcode=$?
|
||||
|
||||
|
@ -64,7 +64,7 @@ then
|
||||
[ -f "$FLUSHED" ] && rm -f "$FLUSHED"
|
||||
[ -f "$ERROR" ] && rm -f "$ERROR"
|
||||
|
||||
echo "flush tables"
|
||||
echo "flush tables"
|
||||
|
||||
# Wait for :
|
||||
# (a) Tables to be flushed, AND
|
||||
@ -72,7 +72,7 @@ then
|
||||
# (c) ERROR file, in case flush tables operation failed.
|
||||
|
||||
while [ ! -r "$FLUSHED" ] && \
|
||||
! grep -q -F ':' '--' "$FLUSHED" >/dev/null 2>&1
|
||||
! grep -q -F ':' -- "$FLUSHED" >/dev/null 2>&1
|
||||
do
|
||||
# Check whether ERROR file exists.
|
||||
if [ -f "$ERROR" ]; then
|
||||
@ -98,15 +98,11 @@ then
|
||||
|
||||
echo "done $STATE"
|
||||
|
||||
elif [ "$WSREP_SST_OPT_ROLE" = 'joiner' ]
|
||||
then
|
||||
wsrep_log_error "Unrecognized role: '$WSREP_SST_OPT_ROLE'"
|
||||
else # joiner
|
||||
|
||||
wsrep_log_error "Unsupported role: '$WSREP_SST_OPT_ROLE'"
|
||||
exit 22 # EINVAL
|
||||
|
||||
|
||||
else
|
||||
wsrep_log_error "Unrecognized role: '$WSREP_SST_OPT_ROLE'"
|
||||
exit 22 # EINVAL
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
@ -17,7 +17,8 @@
|
||||
|
||||
# This is a common command line parser to be sourced by other SST scripts
|
||||
|
||||
set -ue
|
||||
trap 'exit 32' HUP PIPE
|
||||
trap 'exit 3' INT QUIT TERM
|
||||
|
||||
# Setting the path for some utilities on CentOS
|
||||
export PATH="$PATH:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||
@ -184,7 +185,7 @@ case "$1" in
|
||||
shift
|
||||
;;
|
||||
'--bypass')
|
||||
WSREP_SST_OPT_BYPASS=1
|
||||
readonly WSREP_SST_OPT_BYPASS=1
|
||||
;;
|
||||
'--datadir')
|
||||
# Let's remove the trailing slash:
|
||||
@ -511,7 +512,24 @@ case "$1" in
|
||||
esac
|
||||
shift
|
||||
done
|
||||
readonly WSREP_SST_OPT_BYPASS
|
||||
|
||||
WSREP_TRANSFER_TYPE='SST'
|
||||
[ $WSREP_SST_OPT_BYPASS -ne 0 ] && readonly WSREP_TRANSFER_TYPE='IST'
|
||||
# Let's take the name of the current script as a base,
|
||||
# removing the directory, extension and "wsrep_sst_" prefix:
|
||||
WSREP_METHOD="${0##*/}"
|
||||
WSREP_METHOD="${WSREP_METHOD%.*}"
|
||||
readonly WSREP_METHOD="${WSREP_METHOD#wsrep_sst_}"
|
||||
if [ -n "${WSREP_SST_OPT_ROLE+x}" ]; then
|
||||
if [ "$WSREP_SST_OPT_ROLE" != 'donor' -a \
|
||||
"$WSREP_SST_OPT_ROLE" != 'joiner' ]
|
||||
then
|
||||
wsrep_log_error "Unrecognized role: '$WSREP_SST_OPT_ROLE'"
|
||||
exit 22 # EINVAL
|
||||
fi
|
||||
else
|
||||
readonly WSREP_SST_OPT_ROLE='donor'
|
||||
fi
|
||||
|
||||
# The same argument can be present on the command line several
|
||||
# times, in this case we must take its last value:
|
||||
@ -719,7 +737,7 @@ wsrep_log()
|
||||
{
|
||||
# echo everything to stderr so that it gets into common error log
|
||||
# deliberately made to look different from the rest of the log
|
||||
local readonly tst="$(date +%Y%m%d\ %H:%M:%S.%N | cut -b -21)"
|
||||
local readonly tst=$(date "+%Y%m%d %H:%M:%S.%N" | cut -b -21)
|
||||
echo "WSREP_SST: $* ($tst)" >&2
|
||||
}
|
||||
|
||||
@ -1050,7 +1068,7 @@ is_local_ip()
|
||||
[ "$1" = '127.0.0.1' -o \
|
||||
"$1" = '127.0.0.2' -o \
|
||||
"$1" = 'localhost' -o \
|
||||
"$1" = '[::1]' ] && return 0
|
||||
"$1" = '::1' ] && return 0
|
||||
# If the address starts with "127." this is probably a local
|
||||
# address, but we need to clarify what follows this prefix:
|
||||
if [ "${1#127.}" != "$1" ]; then
|
||||
@ -1067,21 +1085,25 @@ is_local_ip()
|
||||
"$1" = "$(hostname -f)" -o \
|
||||
"$1" = "$(hostname -d)" ] && return 0
|
||||
fi
|
||||
# If the address contains anything other than digits
|
||||
# and separators, it is not a local address:
|
||||
[ "${1#*[!0-9.]}" != "$1" ] && \
|
||||
[ "${1#*[!0-9A-Fa-f:\[\]]}" != "$1" ] && return 1
|
||||
# Now let's check if the given address is assigned to
|
||||
# one of the network cards:
|
||||
local ip_util=$(commandex 'ip')
|
||||
if [ -n "$ip_util" ]; then
|
||||
# ip address show ouput format is " inet[6] <address>/<mask>":
|
||||
"$ip_util" address show \
|
||||
| grep -E '^[[:space:]]*inet.? [^[:space:]]+/' -o \
|
||||
| grep -F " $1/" >/dev/null && return 0
|
||||
| grep -o -E '^[[:space:]]*inet.?[[:space:]]+[^[:space:]]+/' \
|
||||
| grep -qw -F -- "$1/" && return 0
|
||||
else
|
||||
local ifconfig_util=$(commandex 'ifconfig')
|
||||
if [ -n "$ifconfig_util" ]; then
|
||||
# ifconfig output format is " inet[6] <address> ...":
|
||||
"$ifconfig_util" \
|
||||
| grep -E '^[[:space:]]*inet.? [^[:space:]]+ ' -o \
|
||||
| grep -F " $1 " >/dev/null && return 0
|
||||
| grep -o -E '^[[:space:]]*inet.?[[:space:]]+[^[:space:]]+' \
|
||||
| grep -qw -F -- "$1" && return 0
|
||||
fi
|
||||
fi
|
||||
return 1
|
||||
@ -1403,7 +1425,7 @@ get_proc()
|
||||
if [ -z "$nproc" ]; then
|
||||
set +e
|
||||
if [ "$OS" = 'Linux' ]; then
|
||||
nproc=$(grep -c processor /proc/cpuinfo 2>/dev/null)
|
||||
nproc=$(grep -cw -E '^processor' /proc/cpuinfo 2>/dev/null)
|
||||
elif [ "$OS" = 'Darwin' -o "$OS" = 'FreeBSD' ]; then
|
||||
nproc=$(sysctl -n hw.ncpu)
|
||||
fi
|
||||
@ -1452,3 +1474,19 @@ check_server_ssl_config()
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
simple_cleanup()
|
||||
{
|
||||
# Since this is invoked just after exit NNN
|
||||
local estatus=$?
|
||||
if [ $estatus -ne 0 ]; then
|
||||
wsrep_log_error "Cleanup after exit with status: $estatus"
|
||||
fi
|
||||
if [ -n "${SST_PID:-}" ]; then
|
||||
[ "$(pwd)" != "$OLD_PWD" ] && cd "$OLD_PWD"
|
||||
[ -f "$SST_PID" ] && rm -f "$SST_PID" || :
|
||||
fi
|
||||
exit $estatus
|
||||
}
|
||||
|
||||
wsrep_log_info "$WSREP_METHOD $WSREP_TRANSFER_TYPE started on $WSREP_SST_OPT_ROLE"
|
||||
|
@ -86,6 +86,7 @@ encrypt_threads=""
|
||||
encrypt_chunk=""
|
||||
|
||||
readonly SECRET_TAG='secret'
|
||||
readonly TOTAL_TAG='secret /total'
|
||||
|
||||
# Required for backup locks
|
||||
# For backup locks it is 1 sent by joiner
|
||||
@ -165,12 +166,10 @@ get_keys()
|
||||
exit 3
|
||||
fi
|
||||
|
||||
if [ -z "$ekey" ]; then
|
||||
if [ ! -r "$ekeyfile" ]; then
|
||||
wsrep_log_error "FATAL: Either key must be specified" \
|
||||
"or keyfile must be readable"
|
||||
exit 3
|
||||
fi
|
||||
if [ -z "$ekey" -a ! -r "$ekeyfile" ]; then
|
||||
wsrep_log_error "FATAL: Either key must be specified" \
|
||||
"or keyfile must be readable"
|
||||
exit 3
|
||||
fi
|
||||
|
||||
if [ "$eformat" = 'openssl' ]; then
|
||||
@ -217,9 +216,7 @@ get_keys()
|
||||
exit 2
|
||||
fi
|
||||
|
||||
if [ "$WSREP_SST_OPT_ROLE" = 'joiner' ]; then
|
||||
ecmd="$ecmd -d"
|
||||
fi
|
||||
[ "$WSREP_SST_OPT_ROLE" = 'joiner' ] && ecmd="$ecmd -d"
|
||||
|
||||
stagemsg="$stagemsg-XB-Encrypted"
|
||||
}
|
||||
@ -324,7 +321,8 @@ get_transfer()
|
||||
if [ -z "$ssl_dhparams" ]; then
|
||||
# Determine the socat version
|
||||
SOCAT_VERSION=$(socat -V 2>&1 | \
|
||||
grep -m1 -owE '[0-9]+(\.[0-9]+)+' | head -n1)
|
||||
grep -m1 -owE '[0-9]+(\.[0-9]+)+' | \
|
||||
head -n1 || :)
|
||||
if [ -z "$SOCAT_VERSION" ]; then
|
||||
wsrep_log_error "******** FATAL ERROR ******************"
|
||||
wsrep_log_error "* Cannot determine the socat version. *"
|
||||
@ -595,18 +593,6 @@ get_stream()
|
||||
wsrep_log_info "Streaming with $sfmt"
|
||||
}
|
||||
|
||||
sig_joiner_cleanup()
|
||||
{
|
||||
local estatus=$?
|
||||
if [ $estatus -ne 0 ]; then
|
||||
wsrep_log_error "Cleanup after exit with status: $estatus"
|
||||
fi
|
||||
wsrep_log_error "Removing $MAGIC_FILE file due to signal"
|
||||
[ "$(pwd)" != "$OLD_PWD" ] && cd "$OLD_PWD"
|
||||
[ -f "$MAGIC_FILE" ] && rm -f "$MAGIC_FILE"
|
||||
exit $estatus
|
||||
}
|
||||
|
||||
cleanup_at_exit()
|
||||
{
|
||||
# Since this is invoked just after exit NNN
|
||||
@ -617,6 +603,11 @@ cleanup_at_exit()
|
||||
|
||||
[ "$(pwd)" != "$OLD_PWD" ] && cd "$OLD_PWD"
|
||||
|
||||
if [ $estatus -ne 0 ]; then
|
||||
wsrep_log_error "Removing $MAGIC_FILE file due to signal"
|
||||
[ -f "$MAGIC_FILE" ] && rm -f "$MAGIC_FILE" || :
|
||||
fi
|
||||
|
||||
if [ "$WSREP_SST_OPT_ROLE" = 'joiner' ]; then
|
||||
wsrep_log_info "Removing the sst_in_progress file"
|
||||
wsrep_cleanup_progress_file
|
||||
@ -646,7 +637,7 @@ cleanup_at_exit()
|
||||
fi
|
||||
|
||||
# Final cleanup
|
||||
pgid=$(ps -o pgid= $$ 2>/dev/null | grep -o -E '[0-9]*' || :)
|
||||
pgid=$(ps -o pgid= $$ 2>/dev/null | grep -o -E '[0-9]+' || :)
|
||||
|
||||
# This means no setsid done in mysqld.
|
||||
# We don't want to kill mysqld here otherwise.
|
||||
@ -742,17 +733,15 @@ recv_joiner()
|
||||
fi
|
||||
fi
|
||||
|
||||
pushd "$dir" 1>/dev/null
|
||||
set +e
|
||||
|
||||
if [ $wait -ne 0 ]; then
|
||||
wait_for_listen &
|
||||
fi
|
||||
|
||||
cd "$dir"
|
||||
set +e
|
||||
timeit "$msg" "$ltcmd | $strmcmd; RC=( "\${PIPESTATUS[@]}" )"
|
||||
|
||||
set -e
|
||||
popd 1>/dev/null
|
||||
cd "$OLD_PWD"
|
||||
|
||||
if [ ${RC[0]} -eq 124 ]; then
|
||||
wsrep_log_error "Possible timeout in receiving first data from" \
|
||||
@ -770,26 +759,26 @@ recv_joiner()
|
||||
|
||||
if [ $checkf -eq 1 ]; then
|
||||
if [ ! -r "$MAGIC_FILE" ]; then
|
||||
# this message should cause joiner to abort
|
||||
# this message should cause joiner to abort:
|
||||
wsrep_log_error "receiving process ended without creating" \
|
||||
"'$MAGIC_FILE'"
|
||||
wsrep_log_info "Contents of datadir"
|
||||
"magic file ($MAGIC_FILE)"
|
||||
wsrep_log_info "Contents of datadir:"
|
||||
wsrep_log_info $(ls -l "$dir/"*)
|
||||
exit 32
|
||||
fi
|
||||
|
||||
# check donor supplied secret
|
||||
SECRET=$(grep -F -- "$SECRET_TAG " "$MAGIC_FILE" 2>/dev/null | \
|
||||
cut -d ' ' -f2)
|
||||
# Select the "secret" tag whose value does not start
|
||||
# with a slash symbol. All new tags must to start with
|
||||
# the space and the slash symbol after the word "secret" -
|
||||
# to be removed by older versions of the SST scripts:
|
||||
SECRET=$(grep -m1 -E "^$SECRET_TAG[[:space:]]+[^/]" \
|
||||
-- "$MAGIC_FILE" || :)
|
||||
# Check donor supplied secret:
|
||||
SECRET=$(trim_string "${SECRET#$SECRET_TAG}")
|
||||
if [ "$SECRET" != "$MY_SECRET" ]; then
|
||||
wsrep_log_error "Donor does not know my secret!"
|
||||
wsrep_log_info "Donor: '$SECRET', my: '$MY_SECRET'"
|
||||
exit 32
|
||||
fi
|
||||
|
||||
# remove secret from the magic file
|
||||
grep -v -F -- "$SECRET_TAG " "$MAGIC_FILE" > "$MAGIC_FILE.new"
|
||||
mv "$MAGIC_FILE.new" "$MAGIC_FILE"
|
||||
fi
|
||||
}
|
||||
|
||||
@ -798,11 +787,11 @@ send_donor()
|
||||
local dir="$1"
|
||||
local msg="$2"
|
||||
|
||||
pushd "$dir" 1>/dev/null
|
||||
cd "$dir"
|
||||
set +e
|
||||
timeit "$msg" "$strmcmd | $tcmd; RC=( "\${PIPESTATUS[@]}" )"
|
||||
set -e
|
||||
popd 1>/dev/null
|
||||
cd "$OLD_PWD"
|
||||
|
||||
for ecode in "${RC[@]}"; do
|
||||
if [ $ecode -ne 0 ]; then
|
||||
@ -817,7 +806,7 @@ monitor_process()
|
||||
{
|
||||
local sst_stream_pid=$1
|
||||
|
||||
while true ; do
|
||||
while :; do
|
||||
if ! ps -p "$WSREP_SST_OPT_PARENT" >/dev/null 2>&1; then
|
||||
wsrep_log_error \
|
||||
"Parent mysqld process (PID: $WSREP_SST_OPT_PARENT)" \
|
||||
@ -834,13 +823,6 @@ monitor_process()
|
||||
|
||||
[ -f "$MAGIC_FILE" ] && rm -f "$MAGIC_FILE"
|
||||
|
||||
if [ "$WSREP_SST_OPT_ROLE" != 'joiner' -a \
|
||||
"$WSREP_SST_OPT_ROLE" != 'donor' ]
|
||||
then
|
||||
wsrep_log_error "Invalid role '$WSREP_SST_OPT_ROLE'"
|
||||
exit 22
|
||||
fi
|
||||
|
||||
read_cnf
|
||||
setup_ports
|
||||
|
||||
@ -957,8 +939,8 @@ setup_commands()
|
||||
get_stream
|
||||
get_transfer
|
||||
|
||||
if [ "$WSREP_SST_OPT_ROLE" = 'donor' ]
|
||||
then
|
||||
if [ "$WSREP_SST_OPT_ROLE" = 'donor' ]; then
|
||||
|
||||
trap cleanup_at_exit EXIT
|
||||
|
||||
if [ $WSREP_SST_OPT_BYPASS -eq 0 ]
|
||||
@ -1079,6 +1061,7 @@ then
|
||||
fi
|
||||
|
||||
setup_commands
|
||||
|
||||
set +e
|
||||
timeit "$stagemsg-SST" "$INNOBACKUP | $tcmd; RC=( "\${PIPESTATUS[@]}" )"
|
||||
set -e
|
||||
@ -1122,10 +1105,9 @@ then
|
||||
|
||||
echo "done $WSREP_SST_OPT_GTID"
|
||||
wsrep_log_info "Total time on donor: $totime seconds"
|
||||
wsrep_log_info "mariabackup SST/IST completed on donor"
|
||||
|
||||
elif [ "$WSREP_SST_OPT_ROLE" = 'joiner' ]
|
||||
then
|
||||
else # joiner
|
||||
|
||||
[ -e "$SST_PROGRESS_FILE" ] && \
|
||||
wsrep_log_info "Stale sst_in_progress file: $SST_PROGRESS_FILE"
|
||||
[ -n "$SST_PROGRESS_FILE" ] && touch "$SST_PROGRESS_FILE"
|
||||
@ -1196,6 +1178,7 @@ then
|
||||
sleep 1
|
||||
done
|
||||
|
||||
trap simple_cleanup EXIT
|
||||
echo $$ > "$SST_PID"
|
||||
|
||||
stagemsg='Joiner-Recv'
|
||||
@ -1205,7 +1188,7 @@ then
|
||||
[ -f "$DATA/$IST_FILE" ] && rm -f "$DATA/$IST_FILE"
|
||||
|
||||
# May need xtrabackup_checkpoints later on
|
||||
[ -f "$DATA/xtrabackup_binary" ] && rm -f "$DATA/xtrabackup_binary"
|
||||
[ -f "$DATA/xtrabackup_binary" ] && rm -f "$DATA/xtrabackup_binary"
|
||||
[ -f "$DATA/xtrabackup_galera_info" ] && rm -f "$DATA/xtrabackup_galera_info"
|
||||
|
||||
ADDR="$WSREP_SST_OPT_HOST"
|
||||
@ -1232,7 +1215,6 @@ then
|
||||
MY_SECRET="" # for check down in recv_joiner()
|
||||
fi
|
||||
|
||||
trap sig_joiner_cleanup HUP PIPE INT TERM
|
||||
trap cleanup_at_exit EXIT
|
||||
|
||||
if [ -n "$progress" ]; then
|
||||
@ -1256,8 +1238,7 @@ then
|
||||
|
||||
recv_joiner "$STATDIR" "$stagemsg-gtid" $stimeout 1 1
|
||||
|
||||
if ! ps -p "$WSREP_SST_OPT_PARENT" >/dev/null 2>&1
|
||||
then
|
||||
if ! ps -p "$WSREP_SST_OPT_PARENT" >/dev/null 2>&1; then
|
||||
wsrep_log_error "Parent mysqld process (PID: $WSREP_SST_OPT_PARENT)" \
|
||||
"terminated unexpectedly."
|
||||
exit 32
|
||||
@ -1285,13 +1266,13 @@ then
|
||||
cd "$DATA"
|
||||
wsrep_log_info "Cleaning the old binary logs"
|
||||
# If there is a file with binlogs state, delete it:
|
||||
[ -f "$binlog_base.state" ] && rm -fv "$binlog_base.state" 1>&2
|
||||
[ -f "$binlog_base.state" ] && rm -f "$binlog_base.state" >&2
|
||||
# Clean up the old binlog files and index:
|
||||
if [ -f "$binlog_index" ]; then
|
||||
while read bin_file || [ -n "$bin_file" ]; do
|
||||
rm -fv "$bin_file" 1>&2 || :
|
||||
rm -f "$bin_file" >&2 || :
|
||||
done < "$binlog_index"
|
||||
rm -fv "$binlog_index" 1>&2
|
||||
rm -f "$binlog_index" >&2
|
||||
fi
|
||||
if [ -n "$binlog_dir" -a "$binlog_dir" != '.' -a \
|
||||
-d "$binlog_dir" ]
|
||||
@ -1302,7 +1283,7 @@ then
|
||||
"Cleaning the binlog directory '$binlog_dir' as well"
|
||||
fi
|
||||
fi
|
||||
rm -fv "$binlog_base".[0-9]* 1>&2 || :
|
||||
rm -f "$binlog_base".[0-9]* >&2 || :
|
||||
cd "$OLD_PWD"
|
||||
fi
|
||||
|
||||
@ -1313,13 +1294,13 @@ then
|
||||
${ib_undo_dir:+"$ib_undo_dir"} \
|
||||
${ib_log_dir:+"$ib_log_dir"} \
|
||||
"$DATA" -mindepth 1 -prune -regex "$cpat" \
|
||||
-o -exec rm -rfv {} 1>&2 \+
|
||||
-o -exec rm -rf {} >&2 \+
|
||||
else
|
||||
find ${ib_home_dir:+"$ib_home_dir"} \
|
||||
${ib_undo_dir:+"$ib_undo_dir"} \
|
||||
${ib_log_dir:+"$ib_log_dir"} \
|
||||
"$DATA" -mindepth 1 -prune -regex "$cpat" \
|
||||
-o -exec rm -rfv {} 1>&2 \+
|
||||
-o -exec rm -rf {} >&2 \+
|
||||
fi
|
||||
|
||||
TDATA="$DATA"
|
||||
@ -1393,7 +1374,6 @@ then
|
||||
wsrep_log_info "Preparing the backup at $DATA"
|
||||
setup_commands
|
||||
timeit 'mariabackup prepare stage' "$INNOAPPLY"
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
wsrep_log_error "mariabackup apply finished with errors." \
|
||||
"Check syslog or '$INNOAPPLYLOG' for details."
|
||||
@ -1450,6 +1430,10 @@ then
|
||||
else
|
||||
|
||||
wsrep_log_info "'$IST_FILE' received from donor: Running IST"
|
||||
if [ $WSREP_SST_OPT_BYPASS -eq 0 ]; then
|
||||
readonly WSREP_SST_OPT_BYPASS=1
|
||||
readonly WSREP_TRANSFER_TYPE='IST'
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
@ -1458,12 +1442,13 @@ then
|
||||
exit 2
|
||||
fi
|
||||
|
||||
coords=$(cat "$MAGIC_FILE")
|
||||
# Remove special tags from the magic file, and from the output:
|
||||
coords=$(grep -v -E "^$SECRET_TAG[[:space:]]" -- "$MAGIC_FILE")
|
||||
wsrep_log_info "Galera co-ords from recovery: $coords"
|
||||
cat "$MAGIC_FILE" # Output : UUID:seqno wsrep_gtid_domain_id
|
||||
echo "$coords" # Output : UUID:seqno wsrep_gtid_domain_id
|
||||
|
||||
wsrep_log_info "Total time on joiner: $totime seconds"
|
||||
wsrep_log_info "mariabackup SST/IST completed on joiner"
|
||||
fi
|
||||
|
||||
wsrep_log_info "$WSREP_METHOD $WSREP_TRANSFER_TYPE completed on $WSREP_SST_OPT_ROLE"
|
||||
exit 0
|
||||
|
@ -163,10 +163,11 @@ then
|
||||
echo "$STOP_WSREP" && $MYSQLDUMP && echo "$CSV_TABLES_FIX" && \
|
||||
echo "$RESTORE_GENERAL_LOG" && echo "$RESTORE_SLOW_QUERY_LOG" && \
|
||||
echo "$SET_START_POSITION" && echo "$SET_WSREP_GTID_DOMAIN_ID" \
|
||||
|| echo "SST failed to complete;") | $MYSQL
|
||||
|| echo "SST failed to complete;") | $MYSQL || exit $?
|
||||
else
|
||||
wsrep_log_info "Bypassing state dump."
|
||||
echo "$SET_START_POSITION" | $MYSQL
|
||||
echo "$SET_START_POSITION" | $MYSQL || exit $?
|
||||
fi
|
||||
|
||||
#
|
||||
wsrep_log_info "$WSREP_METHOD $WSREP_TRANSFER_TYPE completed on $WSREP_SST_OPT_ROLE"
|
||||
exit 0
|
||||
|
@ -34,6 +34,12 @@ wsrep_check_programs rsync
|
||||
|
||||
cleanup_joiner()
|
||||
{
|
||||
# Since this is invoked just after exit NNN
|
||||
local estatus=$?
|
||||
if [ $estatus -ne 0 ]; then
|
||||
wsrep_log_error "Cleanup after exit with status: $estatus"
|
||||
fi
|
||||
|
||||
local failure=0
|
||||
|
||||
[ "$(pwd)" != "$OLD_PWD" ] && cd "$OLD_PWD"
|
||||
@ -72,7 +78,9 @@ cleanup_joiner()
|
||||
wsrep_cleanup_progress_file
|
||||
fi
|
||||
|
||||
[ -f "$SST_PID" ] && rm -f "$SST_PID"
|
||||
[ -f "$SST_PID" ] && rm -f "$SST_PID" || :
|
||||
|
||||
exit $estatus
|
||||
}
|
||||
|
||||
check_pid_and_port()
|
||||
@ -310,6 +318,7 @@ if [ -n "$SSLMODE" -a "$SSLMODE" != 'DISABLED' ]; then
|
||||
fi
|
||||
|
||||
readonly SECRET_TAG='secret'
|
||||
readonly BYPASS_TAG='secret /bypass'
|
||||
|
||||
SST_PID="$WSREP_SST_OPT_DATA/wsrep_sst.pid"
|
||||
|
||||
@ -325,6 +334,7 @@ while check_pid "$SST_PID" 0; do
|
||||
sleep 1
|
||||
done
|
||||
|
||||
trap simple_cleanup EXIT
|
||||
echo $$ > "$SST_PID"
|
||||
|
||||
# give some time for stunnel from the previous SST to complete:
|
||||
@ -358,7 +368,7 @@ while check_pid "$RSYNC_PID" 1 "$RSYNC_CONF"; do
|
||||
sleep 1
|
||||
done
|
||||
|
||||
[ -f "$MAGIC_FILE" ] && rm -f "$MAGIC_FILE"
|
||||
[ -f "$MAGIC_FILE" ] && rm -f "$MAGIC_FILE"
|
||||
[ -f "$BINLOG_TAR_FILE" ] && rm -f "$BINLOG_TAR_FILE"
|
||||
|
||||
if [ "$WSREP_SST_OPT_ROLE" = 'donor' ]; then
|
||||
@ -390,7 +400,7 @@ EOF
|
||||
ERROR="$WSREP_SST_OPT_DATA/sst_error"
|
||||
|
||||
[ -f "$FLUSHED" ] && rm -f "$FLUSHED"
|
||||
[ -f "$ERROR" ] && rm -f "$ERROR"
|
||||
[ -f "$ERROR" ] && rm -f "$ERROR"
|
||||
|
||||
echo 'flush tables'
|
||||
|
||||
@ -400,7 +410,7 @@ EOF
|
||||
# (c) ERROR file, in case flush tables operation failed.
|
||||
|
||||
while [ ! -r "$FLUSHED" ] && \
|
||||
! grep -q -F ':' '--' "$FLUSHED" >/dev/null 2>&1
|
||||
! grep -q -F ':' -- "$FLUSHED" 2>/dev/null
|
||||
do
|
||||
# Check whether ERROR file exists.
|
||||
if [ -f "$ERROR" ]; then
|
||||
@ -440,9 +450,16 @@ EOF
|
||||
tar_type=0
|
||||
if tar --help | grep -qw -F -- '--transform'; then
|
||||
tar_type=1
|
||||
elif tar --version | grep -q -E '^bsdtar\>'; then
|
||||
elif tar --version | grep -qw -E '^bsdtar'; then
|
||||
tar_type=2
|
||||
fi
|
||||
if [ $tar_type -eq 2 ]; then
|
||||
if [ -n "$BASH_VERSION" ]; then
|
||||
printf '%s' "$binlog_files" >&2
|
||||
else
|
||||
echo "$binlog_files" >&2
|
||||
fi
|
||||
fi
|
||||
if [ $tar_type -ne 0 ]; then
|
||||
# Preparing list of the binlog file names:
|
||||
echo "$binlog_files" | {
|
||||
@ -501,9 +518,8 @@ EOF
|
||||
fi
|
||||
|
||||
# Use deltaxfer only for WAN:
|
||||
inv=$(basename "$0")
|
||||
WHOLE_FILE_OPT=""
|
||||
if [ "${inv%wsrep_sst_rsync_wan*}" = "$inv" ]; then
|
||||
if [ "${WSREP_METHOD%_wan}" = "$WSREP_METHOD" ]; then
|
||||
WHOLE_FILE_OPT='--whole-file'
|
||||
fi
|
||||
|
||||
@ -613,7 +629,6 @@ FILTER="-f '- /lost+found'
|
||||
|
||||
wsrep_log_info "Transfer of data done"
|
||||
|
||||
|
||||
else # BYPASS
|
||||
|
||||
wsrep_log_info "Bypassing state dump."
|
||||
@ -634,6 +649,10 @@ FILTER="-f '- /lost+found'
|
||||
echo "$SECRET_TAG $WSREP_SST_OPT_REMOTE_PSWD" >> "$MAGIC_FILE"
|
||||
fi
|
||||
|
||||
if [ $WSREP_SST_OPT_BYPASS -ne 0 ]; then
|
||||
echo "$BYPASS_TAG" >> "$MAGIC_FILE"
|
||||
fi
|
||||
|
||||
rsync ${STUNNEL:+--rsh="$STUNNEL"} \
|
||||
--archive --quiet --checksum "$MAGIC_FILE" \
|
||||
"rsync://$WSREP_SST_OPT_ADDR" >&2 || RC=$?
|
||||
@ -647,15 +666,11 @@ FILTER="-f '- /lost+found'
|
||||
|
||||
if [ -n "$STUNNEL" ]; then
|
||||
[ -f "$STUNNEL_CONF" ] && rm -f "$STUNNEL_CONF"
|
||||
[ -f "$STUNNEL_PID" ] && rm -f "$STUNNEL_PID"
|
||||
[ -f "$STUNNEL_PID" ] && rm -f "$STUNNEL_PID"
|
||||
fi
|
||||
|
||||
[ -f "$SST_PID" ] && rm -f "$SST_PID"
|
||||
else # joiner
|
||||
|
||||
wsrep_log_info "rsync SST/IST completed on donor"
|
||||
|
||||
elif [ "$WSREP_SST_OPT_ROLE" = 'joiner' ]
|
||||
then
|
||||
check_sockets_utils
|
||||
|
||||
ADDR="$WSREP_SST_OPT_HOST"
|
||||
@ -663,8 +678,6 @@ then
|
||||
RSYNC_ADDR="$WSREP_SST_OPT_HOST"
|
||||
RSYNC_ADDR_UNESCAPED="$WSREP_SST_OPT_HOST_UNESCAPED"
|
||||
|
||||
trap 'exit 32' HUP PIPE
|
||||
trap 'exit 3' INT TERM ABRT
|
||||
trap cleanup_joiner EXIT
|
||||
|
||||
touch "$SST_PROGRESS_FILE"
|
||||
@ -797,8 +810,7 @@ EOF
|
||||
sleep 1
|
||||
done
|
||||
|
||||
if ! ps -p $MYSQLD_PID >/dev/null 2>&1
|
||||
then
|
||||
if ! ps -p $MYSQLD_PID >/dev/null 2>&1; then
|
||||
wsrep_log_error \
|
||||
"Parent mysqld process (PID: $MYSQLD_PID) terminated unexpectedly."
|
||||
kill -- -$MYSQLD_PID
|
||||
@ -806,52 +818,68 @@ EOF
|
||||
exit 32
|
||||
fi
|
||||
|
||||
if [ -r "$MAGIC_FILE" ]; then
|
||||
if [ -n "$MY_SECRET" ]; then
|
||||
# Check donor supplied secret:
|
||||
SECRET=$(grep -F -- "$SECRET_TAG " "$MAGIC_FILE" 2>/dev/null | \
|
||||
cut -d ' ' -f2)
|
||||
if [ "$SECRET" != "$MY_SECRET" ]; then
|
||||
wsrep_log_error "Donor does not know my secret!"
|
||||
wsrep_log_info "Donor: '$SECRET', my: '$MY_SECRET'"
|
||||
exit 32
|
||||
fi
|
||||
fi
|
||||
else
|
||||
if [ ! -r "$MAGIC_FILE" ]; then
|
||||
# This message should cause joiner to abort:
|
||||
wsrep_log_info "rsync process ended without creating magic file"
|
||||
echo "rsync process ended without creating '$MAGIC_FILE'"
|
||||
wsrep_log_info "rsync process ended without creating" \
|
||||
"magic file ($MAGIC_FILE)"
|
||||
exit 32
|
||||
fi
|
||||
|
||||
if [ -n "$WSREP_SST_OPT_BINLOG" ]; then
|
||||
binlog_tar_present=0
|
||||
[ -f "$BINLOG_TAR_FILE" ] && binlog_tar_present=1
|
||||
if [ -n "$MY_SECRET" ]; then
|
||||
# Select the "secret" tag whose value does not start
|
||||
# with a slash symbol. All new tags must to start with
|
||||
# the space and the slash symbol after the word "secret" -
|
||||
# to be removed by older versions of the SST scripts:
|
||||
SECRET=$(grep -m1 -E "^$SECRET_TAG[[:space:]]+[^/]" \
|
||||
-- "$MAGIC_FILE" || :)
|
||||
# Check donor supplied secret:
|
||||
SECRET=$(trim_string "${SECRET#$SECRET_TAG}")
|
||||
if [ "$SECRET" != "$MY_SECRET" ]; then
|
||||
wsrep_log_error "Donor does not know my secret!"
|
||||
wsrep_log_info "Donor: '$SECRET', my: '$MY_SECRET'"
|
||||
exit 32
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $WSREP_SST_OPT_BYPASS -eq 0 ]; then
|
||||
if grep -m1 -qE "^$BYPASS_TAG([[space]]+.*)?\$" -- "$MAGIC_FILE"; then
|
||||
readonly WSREP_SST_OPT_BYPASS=1
|
||||
readonly WSREP_TRANSFER_TYPE='IST'
|
||||
fi
|
||||
fi
|
||||
|
||||
binlog_tar_present=0
|
||||
if [ -f "$BINLOG_TAR_FILE" ]; then
|
||||
if [ $WSREP_SST_OPT_BYPASS -ne 0 ]; then
|
||||
wsrep_log_warning "tar with binlogs transferred in the IST mode"
|
||||
fi
|
||||
binlog_tar_present=1
|
||||
fi
|
||||
|
||||
if [ $WSREP_SST_OPT_BYPASS -eq 0 -a -n "$WSREP_SST_OPT_BINLOG" ]; then
|
||||
# If it is SST (not an IST) or tar with binlogs is present
|
||||
# among the transferred files, then we need to remove the
|
||||
# old binlogs:
|
||||
if [ $WSREP_SST_OPT_BYPASS -eq 0 -o $binlog_tar_present -ne 0 ]; then
|
||||
cd "$DATA"
|
||||
# Clean up the old binlog files and index:
|
||||
binlog_index="$WSREP_SST_OPT_BINLOG_INDEX"
|
||||
if [ -f "$binlog_index" ]; then
|
||||
while read bin_file || [ -n "$bin_file" ]; do
|
||||
rm -f "$bin_file" || :
|
||||
done < "$binlog_index"
|
||||
rm -f "$binlog_index"
|
||||
fi
|
||||
binlog_cd=0
|
||||
# Change the directory to binlog base (if possible):
|
||||
if [ -n "$binlog_dir" -a "$binlog_dir" != '.' -a \
|
||||
-d "$binlog_dir" ]
|
||||
then
|
||||
binlog_cd=1
|
||||
cd "$binlog_dir"
|
||||
fi
|
||||
# Clean up unindexed binlog files:
|
||||
rm -f "$binlog_base".[0-9]* || :
|
||||
[ $binlog_cd -ne 0 ] && cd "$DATA_DIR"
|
||||
cd "$DATA"
|
||||
# Clean up the old binlog files and index:
|
||||
binlog_index="$WSREP_SST_OPT_BINLOG_INDEX"
|
||||
if [ -f "$binlog_index" ]; then
|
||||
while read bin_file || [ -n "$bin_file" ]; do
|
||||
rm -f "$bin_file" || :
|
||||
done < "$binlog_index"
|
||||
rm -f "$binlog_index"
|
||||
fi
|
||||
binlog_cd=0
|
||||
# Change the directory to binlog base (if possible):
|
||||
if [ -n "$binlog_dir" -a "$binlog_dir" != '.' -a \
|
||||
-d "$binlog_dir" ]
|
||||
then
|
||||
binlog_cd=1
|
||||
cd "$binlog_dir"
|
||||
fi
|
||||
# Clean up unindexed binlog files:
|
||||
rm -f "$binlog_base".[0-9]* || :
|
||||
[ $binlog_cd -ne 0 ] && cd "$DATA_DIR"
|
||||
if [ $binlog_tar_present -ne 0 ]; then
|
||||
# Create a temporary file:
|
||||
tmpdir=$(parse_cnf '--mysqld|sst' 'tmpdir')
|
||||
@ -875,7 +903,7 @@ EOF
|
||||
# Extracting binlog files:
|
||||
wsrep_log_info "Extracting binlog files:"
|
||||
RC=0
|
||||
if tar --version | grep -q -E '^bsdtar\>'; then
|
||||
if tar --version | grep -qw -E '^bsdtar'; then
|
||||
tar -tf "$BINLOG_TAR_FILE" > "$tmpfile" && \
|
||||
tar -xvf "$BINLOG_TAR_FILE" > /dev/null || RC=$?
|
||||
else
|
||||
@ -883,8 +911,8 @@ EOF
|
||||
cat "$tmpfile" >&2 || RC=$?
|
||||
fi
|
||||
if [ $RC -ne 0 ]; then
|
||||
rm -f "$tmpfile"
|
||||
wsrep_log_error "Error unpacking tar file with binlog files"
|
||||
rm -f "$tmpfile"
|
||||
exit 32
|
||||
fi
|
||||
# Rebuild binlog index:
|
||||
@ -897,24 +925,13 @@ EOF
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "$MY_SECRET" ]; then
|
||||
# remove secret from the magic file, and output
|
||||
# the UUID:seqno & wsrep_gtid_domain_id:
|
||||
grep -v -F -- "$SECRET_TAG " "$MAGIC_FILE"
|
||||
else
|
||||
# Output the UUID:seqno and wsrep_gtid_domain_id:
|
||||
cat "$MAGIC_FILE"
|
||||
fi
|
||||
|
||||
wsrep_log_info "rsync SST/IST completed on joiner"
|
||||
|
||||
# wsrep_cleanup_progress_file
|
||||
# cleanup_joiner
|
||||
else
|
||||
wsrep_log_error "Unrecognized role: '$WSREP_SST_OPT_ROLE'"
|
||||
exit 22 # EINVAL
|
||||
# Remove special tags from the magic file, and from the output:
|
||||
coords=$(grep -v -E "^$SECRET_TAG[[:space:]]" -- "$MAGIC_FILE")
|
||||
wsrep_log_info "Galera co-ords from recovery: $coords"
|
||||
echo "$coords" # Output : UUID:seqno wsrep_gtid_domain_id
|
||||
fi
|
||||
|
||||
[ -f "$BINLOG_TAR_FILE" ] && rm -f "$BINLOG_TAR_FILE"
|
||||
|
||||
wsrep_log_info "$WSREP_METHOD $WSREP_TRANSFER_TYPE completed on $WSREP_SST_OPT_ROLE"
|
||||
exit 0
|
||||
|
Reference in New Issue
Block a user