mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge 10.3 into 10.4
This commit is contained in:
@ -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"
|
||||
do
|
||||
# Check whether ERROR file exists.
|
||||
if [ -f "$ERROR" ]; then
|
||||
@ -105,4 +105,5 @@ else # joiner
|
||||
|
||||
fi
|
||||
|
||||
wsrep_log_info "$WSREP_METHOD $WSREP_TRANSFER_TYPE completed on $WSREP_SST_OPT_ROLE"
|
||||
exit 0
|
||||
|
@ -80,6 +80,7 @@ to_minuses()
|
||||
}
|
||||
|
||||
WSREP_SST_OPT_BYPASS=0
|
||||
WSREP_SST_OPT_PROGRESS=0
|
||||
WSREP_SST_OPT_BINLOG=""
|
||||
WSREP_SST_OPT_BINLOG_INDEX=""
|
||||
WSREP_SST_OPT_LOG_BASENAME=""
|
||||
@ -187,6 +188,10 @@ case "$1" in
|
||||
'--bypass')
|
||||
readonly WSREP_SST_OPT_BYPASS=1
|
||||
;;
|
||||
'--progress')
|
||||
readonly WSREP_SST_OPT_PROGRESS=$(( $2 ))
|
||||
shift
|
||||
;;
|
||||
'--datadir')
|
||||
# Let's remove the trailing slash:
|
||||
readonly WSREP_SST_OPT_DATA=$(trim_dir "$2")
|
||||
@ -246,11 +251,11 @@ case "$1" in
|
||||
shift
|
||||
;;
|
||||
'--local-port')
|
||||
readonly WSREP_SST_OPT_LPORT="$2"
|
||||
readonly WSREP_SST_OPT_LPORT=$(( $2 ))
|
||||
shift
|
||||
;;
|
||||
'--parent')
|
||||
readonly WSREP_SST_OPT_PARENT="$2"
|
||||
readonly WSREP_SST_OPT_PARENT=$(( $2 ))
|
||||
shift
|
||||
;;
|
||||
'--password')
|
||||
@ -258,7 +263,7 @@ case "$1" in
|
||||
shift
|
||||
;;
|
||||
'--port')
|
||||
readonly WSREP_SST_OPT_PORT="$2"
|
||||
readonly WSREP_SST_OPT_PORT=$(( $2 ))
|
||||
shift
|
||||
;;
|
||||
'--role')
|
||||
@ -531,6 +536,8 @@ else
|
||||
readonly WSREP_SST_OPT_ROLE='donor'
|
||||
fi
|
||||
|
||||
readonly WSREP_SST_OPT_PROGRESS
|
||||
|
||||
# The same argument can be present on the command line several
|
||||
# times, in this case we must take its last value:
|
||||
if [ -n "${MYSQLD_OPT_INNODB_DATA_HOME_DIR:-}" -a \
|
||||
@ -1180,28 +1187,27 @@ check_port()
|
||||
check_for_dhparams()
|
||||
{
|
||||
ssl_dhparams="$DATA/dhparams.pem"
|
||||
if [ ! -r "$ssl_dhparams" ]; then
|
||||
get_openssl
|
||||
if [ -n "$OPENSSL_BINARY" ]; then
|
||||
wsrep_log_info \
|
||||
"Could not find dhparams file, creating $ssl_dhparams"
|
||||
local bug=0
|
||||
local errmsg
|
||||
errmsg=$("$OPENSSL_BINARY" \
|
||||
dhparam -out "$ssl_dhparams" 2048 2>&1) || bug=1
|
||||
if [ $bug -ne 0 ]; then
|
||||
wsrep_log_info "run: \"$OPENSSL_BINARY\" dhparam -out \"$ssl_dhparams\" 2048"
|
||||
wsrep_log_info "output: $errmsg"
|
||||
wsrep_log_error "******** ERROR *****************************************"
|
||||
wsrep_log_error "* Could not create the dhparams.pem file with OpenSSL. *"
|
||||
wsrep_log_error "********************************************************"
|
||||
ssl_dhparams=""
|
||||
fi
|
||||
else
|
||||
# Rollback: if openssl is not installed, then use
|
||||
# the default parameters:
|
||||
get_openssl
|
||||
if [ -n "$OPENSSL_BINARY" ]; then
|
||||
wsrep_log_info \
|
||||
"Could not find dhparams file, creating $ssl_dhparams"
|
||||
local bug=0
|
||||
local errmsg
|
||||
errmsg=$("$OPENSSL_BINARY" \
|
||||
dhparam -out "$ssl_dhparams" -dsaparam 2048 2>&1) || bug=1
|
||||
if [ $bug -ne 0 ]; then
|
||||
wsrep_log_info "run: \"$OPENSSL_BINARY\" dhparam"\
|
||||
"-out \"$ssl_dhparams\" -dsaparam 2048"
|
||||
wsrep_log_info "output: $errmsg"
|
||||
wsrep_log_error "******** ERROR *****************************************"
|
||||
wsrep_log_error "* Could not create the dhparams.pem file with OpenSSL. *"
|
||||
wsrep_log_error "********************************************************"
|
||||
ssl_dhparams=""
|
||||
fi
|
||||
else
|
||||
# Rollback: if openssl is not installed, then use
|
||||
# the default parameters:
|
||||
ssl_dhparams=""
|
||||
fi
|
||||
}
|
||||
|
||||
@ -1303,29 +1309,39 @@ verify_cert_matches_key()
|
||||
#
|
||||
check_for_version()
|
||||
{
|
||||
y1="${1#*.}"
|
||||
local y1="${1#*.}"
|
||||
[ "$y1" = "$1" ] && y1=""
|
||||
z1=${y1#*.}
|
||||
local z1="${y1#*.}"
|
||||
[ "$z1" = "$y1" ] && z1=""
|
||||
x1="${1%%.*}"
|
||||
local w1="${z1#*.}"
|
||||
[ "$w1" = "$z1" ] && w1=""
|
||||
local x1="${1%%.*}"
|
||||
y1="${y1%%.*}"
|
||||
z1="${z1%%.*}"
|
||||
w1="${w1%%.*}"
|
||||
[ -z "$y1" ] && y1=0
|
||||
[ -z "$z1" ] && z1=0
|
||||
y2="${2#*.}"
|
||||
[ -z "$w1" ] && w1=0
|
||||
local y2="${2#*.}"
|
||||
[ "$y2" = "$2" ] && y2=""
|
||||
z2="${y2#*.}"
|
||||
local z2="${y2#*.}"
|
||||
[ "$z2" = "$y2" ] && z2=""
|
||||
x2="${2%%.*}"
|
||||
local w2="${z2#*.}"
|
||||
[ "$w2" = "$z2" ] && w2=""
|
||||
local x2="${2%%.*}"
|
||||
y2="${y2%%.*}"
|
||||
z2="${z2%%.*}"
|
||||
w2="${w2%%.*}"
|
||||
[ -z "$y2" ] && y2=0
|
||||
[ -z "$z2" ] && z2=0
|
||||
[ -z "$w2" ] && w2=0
|
||||
[ $x1 -lt $x2 ] && return 1
|
||||
[ $x1 -gt $x2 ] && return 0
|
||||
[ $y1 -lt $y2 ] && return 1
|
||||
[ $y1 -gt $y2 ] && return 0
|
||||
[ $z1 -lt $z2 ] && return 1
|
||||
[ $z1 -gt $z2 ] && return 0
|
||||
[ $w1 -lt $w2 ] && return 1
|
||||
return 0
|
||||
}
|
||||
|
||||
|
@ -86,15 +86,12 @@ encrypt_threads=""
|
||||
encrypt_chunk=""
|
||||
|
||||
readonly SECRET_TAG='secret'
|
||||
readonly TOTAL_TAG='total'
|
||||
|
||||
# Required for backup locks
|
||||
# For backup locks it is 1 sent by joiner
|
||||
sst_ver=1
|
||||
|
||||
if [ -n "$(commandex pv)" ] && pv --help | grep -qw -F -- '-F'; then
|
||||
pvopts="$pvopts $pvformat"
|
||||
fi
|
||||
pcmd="pv $pvopts"
|
||||
declare -a RC
|
||||
|
||||
BACKUP_BIN=$(commandex 'mariabackup')
|
||||
@ -121,18 +118,19 @@ timeit()
|
||||
|
||||
if [ $ttime -eq 1 ]; then
|
||||
x1=$(date +%s)
|
||||
wsrep_log_info "Evaluating $cmd"
|
||||
eval "$cmd"
|
||||
extcode=$?
|
||||
fi
|
||||
|
||||
wsrep_log_info "Evaluating $cmd"
|
||||
eval $cmd
|
||||
extcode=$?
|
||||
|
||||
if [ $ttime -eq 1 ]; then
|
||||
x2=$(date +%s)
|
||||
took=$(( x2-x1 ))
|
||||
wsrep_log_info "NOTE: $stage took $took seconds"
|
||||
totime=$(( totime+took ))
|
||||
else
|
||||
wsrep_log_info "Evaluating $cmd"
|
||||
eval "$cmd"
|
||||
extcode=$?
|
||||
fi
|
||||
|
||||
return $extcode
|
||||
}
|
||||
|
||||
@ -220,6 +218,21 @@ get_keys()
|
||||
stagemsg="$stagemsg-XB-Encrypted"
|
||||
}
|
||||
|
||||
get_socat_ver()
|
||||
{
|
||||
[ -n "${SOCAT_VERSION+x}" ] && return
|
||||
# Determine the socat version
|
||||
SOCAT_VERSION=$(socat -V 2>&1 | \
|
||||
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. *"
|
||||
wsrep_log_error "***************************************"
|
||||
exit 2
|
||||
fi
|
||||
}
|
||||
|
||||
get_transfer()
|
||||
{
|
||||
if [ "$tfmt" = 'nc' ]; then
|
||||
@ -285,7 +298,7 @@ get_transfer()
|
||||
# If sockopt contains 'pf=ip6' somewhere in the middle,
|
||||
# this will not interfere with socat, but exclude the trivial
|
||||
# cases when sockopt contains 'pf=ip6' as prefix or suffix:
|
||||
if [ "$sockopt" = "${sockopt#,pf=ip6}" -a \
|
||||
if [ "$sockopt" = "${sockopt#,pf=ip6,}" -a \
|
||||
"$sockopt" = "${sockopt%,pf=ip6}" ]
|
||||
then
|
||||
sockopt=",pf=ip6$sockopt"
|
||||
@ -312,22 +325,25 @@ get_transfer()
|
||||
if [ "$WSREP_SST_OPT_ROLE" = 'joiner' ]; then
|
||||
tcmd="socat -u openssl-listen:$SST_PORT,reuseaddr"
|
||||
else
|
||||
tcmd="socat -u stdio openssl-connect:$REMOTEIP:$SST_PORT"
|
||||
local addr="$REMOTEIP:$SST_PORT"
|
||||
tcmd="socat -u stdio openssl-connect:$addr"
|
||||
action='Encrypting'
|
||||
get_socat_ver
|
||||
if ! check_for_version "$SOCAT_VERSION" '1.7.4.1'; then
|
||||
if check_for_version "$SOCAT_VERSION" '1.7.3.3'; then
|
||||
# Workaround for a bug known as 'Red Hat issue 1870279'
|
||||
# (connection reset by peer) in socat versions 1.7.3.3
|
||||
# to 1.7.4.0:
|
||||
tcmd="socat stdio openssl-connect:$addr,linger=10"
|
||||
wsrep_log_info \
|
||||
"Use workaround for socat $SOCAT_VERSION bug"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "${sockopt#*,dhparam=}" != "$sockopt" ]; then
|
||||
if [ "${sockopt#*,dhparam=}" = "$sockopt" ]; then
|
||||
if [ -z "$ssl_dhparams" ]; then
|
||||
# Determine the socat version
|
||||
SOCAT_VERSION=$(socat -V 2>&1 | \
|
||||
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. *"
|
||||
wsrep_log_error "***************************************"
|
||||
exit 2
|
||||
fi
|
||||
get_socat_ver
|
||||
if ! check_for_version "$SOCAT_VERSION" '1.7.3'; then
|
||||
# socat versions < 1.7.3 will have 512-bit dhparams (too small)
|
||||
# so create 2048-bit dhparams and send that as a parameter:
|
||||
@ -419,44 +435,90 @@ get_transfer()
|
||||
get_footprint()
|
||||
{
|
||||
cd "$DATA_DIR"
|
||||
payload=$(find . -regex '.*\.ibd$\|.*\.MYI$\|.*\.MYD$\|.*ibdata1$' \
|
||||
-type f -print0 | du --files0-from=- --block-size=1 -c -s | \
|
||||
awk 'END { print $1 }')
|
||||
local payload_data=$(find . \
|
||||
-regex '.*undo[0-9]+$\|.*\.ibd$\|.*\.MYI$\|.*\.MYD$\|.*ibdata1$' \
|
||||
-type f -print0 | du --files0-from=- --block-size=1 -c -s | \
|
||||
awk 'END { print $1 }')
|
||||
|
||||
local payload_undo=0
|
||||
if [ -n "$ib_undo_dir" -a -d "$ib_undo_dir" ]; then
|
||||
cd "$ib_undo_dir"
|
||||
payload_undo=$(find . -regex '.*undo[0-9]+$' -type f -print0 | \
|
||||
du --files0-from=- --block-size=1 -c -s | awk 'END { print $1 }')
|
||||
fi
|
||||
cd "$OLD_PWD"
|
||||
|
||||
wsrep_log_info \
|
||||
"SST footprint estimate: data: $payload_data, undo: $payload_undo"
|
||||
|
||||
payload=$(( payload_data + payload_undo ))
|
||||
|
||||
if [ "$compress" != 'none' ]; then
|
||||
# QuickLZ has around 50% compression ratio
|
||||
# When compression/compaction used, the progress is only an approximate.
|
||||
payload=$(( payload*1/2 ))
|
||||
fi
|
||||
cd "$OLD_PWD"
|
||||
pcmd="$pcmd -s $payload"
|
||||
|
||||
if [ $WSREP_SST_OPT_PROGRESS -eq 1 ]; then
|
||||
# report to parent the total footprint of the SST
|
||||
echo "$TOTAL_TAG $payload"
|
||||
fi
|
||||
|
||||
adjust_progress
|
||||
}
|
||||
|
||||
adjust_progress()
|
||||
{
|
||||
if [ -z "$(commandex pv)" ]; then
|
||||
wsrep_log_error "pv not found in path: $PATH"
|
||||
wsrep_log_error "Disabling all progress/rate-limiting"
|
||||
pcmd=""
|
||||
rlimit=""
|
||||
progress=""
|
||||
return
|
||||
fi
|
||||
pcmd=""
|
||||
rcmd=""
|
||||
|
||||
if [ -n "$progress" -a "$progress" != '1' ]; then
|
||||
if [ -e "$progress" ]; then
|
||||
pcmd="$pcmd 2>>'$progress'"
|
||||
else
|
||||
pcmd="$pcmd 2>'$progress'"
|
||||
fi
|
||||
elif [ -z "$progress" -a -n "$rlimit" ]; then
|
||||
# When rlimit is non-zero
|
||||
pcmd='pv -q'
|
||||
fi
|
||||
[ "$progress" = 'none' ] && return
|
||||
|
||||
rlimitopts=""
|
||||
if [ -n "$rlimit" -a "$WSREP_SST_OPT_ROLE" = 'donor' ]; then
|
||||
wsrep_log_info "Rate-limiting SST to $rlimit"
|
||||
pcmd="$pcmd -L \$rlimit"
|
||||
rlimitopts=" -L $rlimit"
|
||||
fi
|
||||
|
||||
if [ -n "$progress" ]; then
|
||||
|
||||
# Backward compatibility: user-configured progress output
|
||||
pcmd="pv $pvopts$rlimitopts"
|
||||
|
||||
if [ -z "${PV_FORMAT+x}" ]; then
|
||||
PV_FORMAT=0
|
||||
pv --help | grep -qw -F -- '-F' && PV_FORMAT=1
|
||||
fi
|
||||
if [ $PV_FORMAT -eq 1 ]; then
|
||||
pcmd="$pcmd $pvformat"
|
||||
fi
|
||||
|
||||
if [ $payload -ne 0 ]; then
|
||||
pcmd="$pcmd -s $payload"
|
||||
fi
|
||||
|
||||
if [ "$progress" != '1' ]; then
|
||||
if [ -e "$progress" ]; then
|
||||
pcmd="$pcmd 2>>'$progress'"
|
||||
else
|
||||
pcmd="$pcmd 2>'$progress'"
|
||||
fi
|
||||
fi
|
||||
|
||||
elif [ $WSREP_SST_OPT_PROGRESS -eq 1 ]; then
|
||||
|
||||
# Default progress output parseable by parent
|
||||
pcmd="pv -f -i 1 -n -b$rlimitopts"
|
||||
|
||||
# read progress data, add tag and post to stdout
|
||||
# for the parent
|
||||
rcmd="stdbuf -oL tr '\r' '\n' | xargs -n1 echo complete"
|
||||
|
||||
elif [ -n "$rlimitopts" ]; then
|
||||
|
||||
# Rate-limiting only, when rlimit is non-zero
|
||||
pcmd="pv -q$rlimitopts"
|
||||
|
||||
fi
|
||||
}
|
||||
|
||||
@ -512,6 +574,10 @@ read_cnf()
|
||||
"CERT='$tpem', KEY='$tkey', MODE='$tmode'," \
|
||||
"encrypt='$encrypt'"
|
||||
|
||||
if [ $encrypt -ge 2 ]; then
|
||||
ssl_dhparams=$(parse_cnf "$encgroups" 'ssl-dhparams')
|
||||
fi
|
||||
|
||||
sockopt=$(parse_cnf sst sockopt "")
|
||||
progress=$(parse_cnf sst progress "")
|
||||
ttime=$(parse_cnf sst time 0)
|
||||
@ -765,18 +831,28 @@ recv_joiner()
|
||||
wsrep_log_info $(ls -l "$dir/"*)
|
||||
exit 32
|
||||
fi
|
||||
# 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
|
||||
|
||||
if [ -n "$MY_SECRET" ]; then
|
||||
# Check donor supplied secret:
|
||||
SECRET=$(grep -m1 -E "^$SECRET_TAG[[:space:]]" "$MAGIC_FILE" || :)
|
||||
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_PROGRESS -eq 1 ]; then
|
||||
# check total SST footprint
|
||||
payload=$(grep -m1 -E "^$TOTAL_TAG[[:space:]]" "$MAGIC_FILE" || :)
|
||||
if [ -n "$payload" ]; then
|
||||
payload=$(trim_string "${payload#$TOTAL_TAG}")
|
||||
if [ $payload -ge 0 ]; then
|
||||
# report to parent
|
||||
echo "$TOTAL_TAG $payload"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
@ -825,6 +901,14 @@ monitor_process()
|
||||
read_cnf
|
||||
setup_ports
|
||||
|
||||
if [ "$progress" = 'none' ]; then
|
||||
wsrep_log_info "All progress/rate-limiting disabled by configuration"
|
||||
elif [ -z "$(commandex pv)" ]; then
|
||||
wsrep_log_info "Progress reporting tool pv not found in path: $PATH"
|
||||
wsrep_log_info "Disabling all progress/rate-limiting"
|
||||
progress='none'
|
||||
fi
|
||||
|
||||
if "$BACKUP_BIN" --help 2>/dev/null | grep -qw -F -- '--version-check'; then
|
||||
disver=' --no-version-check'
|
||||
fi
|
||||
@ -980,6 +1064,14 @@ if [ "$WSREP_SST_OPT_ROLE" = 'donor' ]; then
|
||||
|
||||
check_extra
|
||||
|
||||
if [ -n "$progress" -o $WSREP_SST_OPT_PROGRESS -eq 1 ]; then
|
||||
wsrep_log_info "Estimating total transfer size"
|
||||
get_footprint
|
||||
wsrep_log_info "To transfer: $payload"
|
||||
else
|
||||
adjust_progress
|
||||
fi
|
||||
|
||||
wsrep_log_info "Streaming GTID file before SST"
|
||||
|
||||
# Store donor's wsrep GTID (state ID) and wsrep_gtid_domain_id
|
||||
@ -991,6 +1083,11 @@ if [ "$WSREP_SST_OPT_ROLE" = 'donor' ]; then
|
||||
echo "$SECRET_TAG $WSREP_SST_OPT_REMOTE_PSWD" >> "$MAGIC_FILE"
|
||||
fi
|
||||
|
||||
if [ $WSREP_SST_OPT_PROGRESS -eq 1 ]; then
|
||||
# Tell joiner what to expect:
|
||||
echo "$TOTAL_TAG $payload" >> "$MAGIC_FILE"
|
||||
fi
|
||||
|
||||
ttcmd="$tcmd"
|
||||
|
||||
if [ -n "$scomp" ]; then
|
||||
@ -1007,12 +1104,14 @@ if [ "$WSREP_SST_OPT_ROLE" = 'donor' ]; then
|
||||
# Restore the transport commmand to its original state
|
||||
tcmd="$ttcmd"
|
||||
|
||||
if [ -n "$progress" ]; then
|
||||
get_footprint
|
||||
tcmd="$pcmd | $tcmd"
|
||||
elif [ -n "$rlimit" ]; then
|
||||
adjust_progress
|
||||
tcmd="$pcmd | $tcmd"
|
||||
if [ -n "$pcmd" ]; then
|
||||
if [ -n "$rcmd" ]; then
|
||||
# redirect pv stderr to rcmd for tagging and output to parent
|
||||
tcmd="{ $pcmd 2>&3 | $tcmd; } 3>&1 | $rcmd"
|
||||
else
|
||||
# use user-configured pv output
|
||||
tcmd="$pcmd | $tcmd"
|
||||
fi
|
||||
fi
|
||||
|
||||
wsrep_log_info "Sleeping before data transfer for SST"
|
||||
@ -1214,13 +1313,6 @@ else # joiner
|
||||
MY_SECRET="" # for check down in recv_joiner()
|
||||
fi
|
||||
|
||||
trap cleanup_at_exit EXIT
|
||||
|
||||
if [ -n "$progress" ]; then
|
||||
adjust_progress
|
||||
tcmd="$tcmd | $pcmd"
|
||||
fi
|
||||
|
||||
get_keys
|
||||
if [ $encrypt -eq 1 ]; then
|
||||
strmcmd="$ecmd | $strmcmd"
|
||||
@ -1232,6 +1324,8 @@ else # joiner
|
||||
|
||||
check_sockets_utils
|
||||
|
||||
trap cleanup_at_exit EXIT
|
||||
|
||||
STATDIR="$(mktemp -d)"
|
||||
MAGIC_FILE="$STATDIR/$INFO_FILE"
|
||||
|
||||
@ -1245,6 +1339,17 @@ else # joiner
|
||||
|
||||
if [ ! -r "$STATDIR/$IST_FILE" ]; then
|
||||
|
||||
adjust_progress
|
||||
if [ -n "$pcmd" ]; then
|
||||
if [ -n "$rcmd" ]; then
|
||||
# redirect pv stderr to rcmd for tagging and output to parent
|
||||
strmcmd="{ $pcmd 2>&3 | $strmcmd; } 3>&1 | $rcmd"
|
||||
else
|
||||
# use user-configured pv output
|
||||
strmcmd="$pcmd | $strmcmd"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -d "$DATA/.sst" ]; then
|
||||
wsrep_log_info \
|
||||
"WARNING: Stale temporary SST directory:" \
|
||||
@ -1265,13 +1370,13 @@ else # joiner
|
||||
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 -f "$binlog_base.state" >&2
|
||||
[ -f "$binlog_base.state" ] && rm "$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 -f "$bin_file" >&2 || :
|
||||
done < "$binlog_index"
|
||||
rm -f "$binlog_index" >&2
|
||||
rm "$binlog_index" >&2
|
||||
fi
|
||||
if [ -n "$binlog_dir" -a "$binlog_dir" != '.' -a \
|
||||
-d "$binlog_dir" ]
|
||||
@ -1335,16 +1440,14 @@ else # joiner
|
||||
|
||||
dcmd="xargs -n 2 qpress -dT$nproc"
|
||||
|
||||
if [ -n "$progress" ] && \
|
||||
if [ -n "$progress" -a "$progress" != 'none' ] && \
|
||||
pv --help | grep -qw -F -- '--line-mode'
|
||||
then
|
||||
count=$(find "$DATA" -type f -name '*.qp' | wc -l)
|
||||
count=$(find "$DATA" -maxdepth 1 -type f -name '*.qp' | wc -l)
|
||||
count=$(( count*2 ))
|
||||
pvopts="-f -s $count -l -N Decompression"
|
||||
if pv --help | grep -qw -F -- '-F'; then
|
||||
pvopts="$pvopts -F '%N => Rate:%r Elapsed:%t %e Progress: [%b/$count]'"
|
||||
fi
|
||||
pcmd="pv $pvopts"
|
||||
pvopts='-f -l -N Decompression'
|
||||
pvformat="-F '%N => Rate:%r Elapsed:%t %e Progress: [%b/$count]'"
|
||||
payload=$count
|
||||
adjust_progress
|
||||
dcmd="$pcmd | $dcmd"
|
||||
fi
|
||||
@ -1442,7 +1545,7 @@ else # joiner
|
||||
fi
|
||||
|
||||
# Remove special tags from the magic file, and from the output:
|
||||
coords=$(grep -v -E "^$SECRET_TAG[[:space:]]" -- "$MAGIC_FILE")
|
||||
coords=$(head -n1 "$MAGIC_FILE")
|
||||
wsrep_log_info "Galera co-ords from recovery: $coords"
|
||||
echo "$coords" # Output : UUID:seqno wsrep_gtid_domain_id
|
||||
|
||||
|
@ -65,21 +65,21 @@ cleanup_joiner()
|
||||
|
||||
if [ $failure -eq 0 ]; then
|
||||
if cleanup_pid $RSYNC_REAL_PID "$RSYNC_PID" "$RSYNC_CONF"; then
|
||||
[ -f "$MAGIC_FILE" ] && rm -f "$MAGIC_FILE"
|
||||
[ -f "$BINLOG_TAR_FILE" ] && rm -f "$BINLOG_TAR_FILE"
|
||||
[ -f "$MAGIC_FILE" ] && rm -f "$MAGIC_FILE" || :
|
||||
[ -f "$BINLOG_TAR_FILE" ] && rm -f "$BINLOG_TAR_FILE" || :
|
||||
else
|
||||
wsrep_log_warning "rsync cleanup failed."
|
||||
fi
|
||||
fi
|
||||
|
||||
wsrep_log_info "Joiner cleanup done."
|
||||
|
||||
if [ "$WSREP_SST_OPT_ROLE" = 'joiner' ]; then
|
||||
wsrep_cleanup_progress_file
|
||||
fi
|
||||
|
||||
[ -f "$SST_PID" ] && rm -f "$SST_PID" || :
|
||||
|
||||
wsrep_log_info "Joiner cleanup done."
|
||||
|
||||
exit $estatus
|
||||
}
|
||||
|
||||
@ -318,7 +318,7 @@ if [ -n "$SSLMODE" -a "$SSLMODE" != 'DISABLED' ]; then
|
||||
fi
|
||||
|
||||
readonly SECRET_TAG='secret'
|
||||
readonly BYPASS_TAG='secret /bypass'
|
||||
readonly BYPASS_TAG='bypass'
|
||||
|
||||
SST_PID="$WSREP_SST_OPT_DATA/wsrep_sst.pid"
|
||||
|
||||
@ -371,10 +371,11 @@ done
|
||||
[ -f "$MAGIC_FILE" ] && rm -f "$MAGIC_FILE"
|
||||
[ -f "$BINLOG_TAR_FILE" ] && rm -f "$BINLOG_TAR_FILE"
|
||||
|
||||
RC=0
|
||||
|
||||
if [ "$WSREP_SST_OPT_ROLE" = 'donor' ]; then
|
||||
|
||||
if [ -n "$STUNNEL" ]
|
||||
then
|
||||
if [ -n "$STUNNEL" ]; then
|
||||
cat << EOF > "$STUNNEL_CONF"
|
||||
key = $SSTKEY
|
||||
cert = $SSTCERT
|
||||
@ -392,8 +393,6 @@ ${CHECK_OPT_LOCAL}
|
||||
EOF
|
||||
fi
|
||||
|
||||
RC=0
|
||||
|
||||
if [ $WSREP_SST_OPT_BYPASS -eq 0 ]; then
|
||||
|
||||
FLUSHED="$WSREP_SST_OPT_DATA/tables_flushed"
|
||||
@ -410,19 +409,19 @@ EOF
|
||||
# (c) ERROR file, in case flush tables operation failed.
|
||||
|
||||
while [ ! -r "$FLUSHED" ] && \
|
||||
! grep -q -F ':' -- "$FLUSHED" 2>/dev/null
|
||||
! grep -q -F ':' -- "$FLUSHED"
|
||||
do
|
||||
# Check whether ERROR file exists.
|
||||
if [ -f "$ERROR" ]; then
|
||||
# Flush tables operation failed.
|
||||
rm -f "$ERROR"
|
||||
rm "$ERROR"
|
||||
exit 255
|
||||
fi
|
||||
sleep 0.2
|
||||
done
|
||||
|
||||
STATE=$(cat "$FLUSHED")
|
||||
rm -f "$FLUSHED"
|
||||
rm "$FLUSHED"
|
||||
|
||||
sync
|
||||
|
||||
@ -629,6 +628,8 @@ FILTER="-f '- /lost+found'
|
||||
|
||||
wsrep_log_info "Transfer of data done"
|
||||
|
||||
[ -f "$BINLOG_TAR_FILE" ] && rm "$BINLOG_TAR_FILE"
|
||||
|
||||
else # BYPASS
|
||||
|
||||
wsrep_log_info "Bypassing state dump."
|
||||
@ -657,6 +658,8 @@ FILTER="-f '- /lost+found'
|
||||
--archive --quiet --checksum "$MAGIC_FILE" \
|
||||
"rsync://$WSREP_SST_OPT_ADDR" >&2 || RC=$?
|
||||
|
||||
rm "$MAGIC_FILE"
|
||||
|
||||
if [ $RC -ne 0 ]; then
|
||||
wsrep_log_error "rsync $MAGIC_FILE returned code $RC:"
|
||||
exit 255 # unknown error
|
||||
@ -665,8 +668,8 @@ FILTER="-f '- /lost+found'
|
||||
echo "done $STATE"
|
||||
|
||||
if [ -n "$STUNNEL" ]; then
|
||||
[ -f "$STUNNEL_CONF" ] && rm -f "$STUNNEL_CONF"
|
||||
[ -f "$STUNNEL_PID" ] && rm -f "$STUNNEL_PID"
|
||||
rm "$STUNNEL_CONF"
|
||||
[ -f "$STUNNEL_PID" ] && rm "$STUNNEL_PID"
|
||||
fi
|
||||
|
||||
else # joiner
|
||||
@ -704,8 +707,7 @@ $SILENT
|
||||
EOF
|
||||
|
||||
# If the IP is local, listen only on it:
|
||||
if is_local_ip "$RSYNC_ADDR_UNESCAPED"
|
||||
then
|
||||
if is_local_ip "$RSYNC_ADDR_UNESCAPED"; then
|
||||
RSYNC_EXTRA_ARGS="--address $RSYNC_ADDR_UNESCAPED"
|
||||
STUNNEL_ACCEPT="$RSYNC_ADDR_UNESCAPED:$RSYNC_PORT"
|
||||
else
|
||||
@ -826,13 +828,8 @@ EOF
|
||||
fi
|
||||
|
||||
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=$(grep -m1 -E "^$SECRET_TAG[[:space:]]" "$MAGIC_FILE" || :)
|
||||
SECRET=$(trim_string "${SECRET#$SECRET_TAG}")
|
||||
if [ "$SECRET" != "$MY_SECRET" ]; then
|
||||
wsrep_log_error "Donor does not know my secret!"
|
||||
@ -842,7 +839,7 @@ EOF
|
||||
fi
|
||||
|
||||
if [ $WSREP_SST_OPT_BYPASS -eq 0 ]; then
|
||||
if grep -m1 -qE "^$BYPASS_TAG([[:space:]]+.*)?\$" -- "$MAGIC_FILE"; then
|
||||
if grep -m1 -qE "^$BYPASS_TAG([[:space:]]+.*)?\$" "$MAGIC_FILE"; then
|
||||
readonly WSREP_SST_OPT_BYPASS=1
|
||||
readonly WSREP_TRANSFER_TYPE='IST'
|
||||
fi
|
||||
@ -850,10 +847,10 @@ EOF
|
||||
|
||||
binlog_tar_present=0
|
||||
if [ -f "$BINLOG_TAR_FILE" ]; then
|
||||
binlog_tar_present=1
|
||||
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
|
||||
@ -867,7 +864,7 @@ EOF
|
||||
while read bin_file || [ -n "$bin_file" ]; do
|
||||
rm -f "$bin_file" || :
|
||||
done < "$binlog_index"
|
||||
rm -f "$binlog_index"
|
||||
rm "$binlog_index"
|
||||
fi
|
||||
binlog_cd=0
|
||||
# Change the directory to binlog base (if possible):
|
||||
@ -902,7 +899,6 @@ EOF
|
||||
fi
|
||||
# Extracting binlog files:
|
||||
wsrep_log_info "Extracting binlog files:"
|
||||
RC=0
|
||||
if tar --version | grep -qw -E '^bsdtar'; then
|
||||
tar -tf "$BINLOG_TAR_FILE" > "$tmpfile" && \
|
||||
tar -xvf "$BINLOG_TAR_FILE" > /dev/null || RC=$?
|
||||
@ -912,7 +908,7 @@ EOF
|
||||
fi
|
||||
if [ $RC -ne 0 ]; then
|
||||
wsrep_log_error "Error unpacking tar file with binlog files"
|
||||
rm -f "$tmpfile"
|
||||
rm "$tmpfile"
|
||||
exit 32
|
||||
fi
|
||||
# Rebuild binlog index:
|
||||
@ -920,18 +916,16 @@ EOF
|
||||
while read bin_file || [ -n "$bin_file" ]; do
|
||||
echo "$binlog_dir${binlog_dir:+/}$bin_file" >> "$binlog_index"
|
||||
done < "$tmpfile"
|
||||
rm -f "$tmpfile"
|
||||
rm "$tmpfile"
|
||||
cd "$OLD_PWD"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Remove special tags from the magic file, and from the output:
|
||||
coords=$(grep -v -E "^$SECRET_TAG[[:space:]]" -- "$MAGIC_FILE")
|
||||
coords=$(head -n1 "$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