diff options
author | Julius Goryavsky <julius.goryavsky@mariadb.com> | 2022-02-12 00:59:15 +0100 |
---|---|---|
committer | Julius Goryavsky <julius.goryavsky@mariadb.com> | 2022-02-14 04:29:12 +0100 |
commit | 90485df359e1e46cf536b64b486d4bbbf6514f25 (patch) | |
tree | 90c97dc3bb132caf02e786571590b769ed7c480c | |
parent | 2d536e2a7337b2f7678a4bfc7d4aa0dda685dcf6 (diff) | |
download | mariadb-git-90485df359e1e46cf536b64b486d4bbbf6514f25.tar.gz |
MDEV-27737: FreeBSD compatibility changes for SST scriptsbb-10.2-MDEV-27740-final
This commit fixes problems due to bugs and quirks in bsdtar
(the FreeBSD version of tar). Separate tests are not required,
because without these fixes, many other tests fail when tested
in the FreeBSD environment.
Also, the grep patterns for reading utility version numbers
has been made more robust. The notation of some options of
the "cut" utility has been changed.
-rw-r--r-- | scripts/wsrep_sst_common.sh | 2 | ||||
-rw-r--r-- | scripts/wsrep_sst_mariabackup.sh | 5 | ||||
-rw-r--r-- | scripts/wsrep_sst_rsync.sh | 48 | ||||
-rw-r--r-- | scripts/wsrep_sst_xtrabackup-v2.sh | 8 |
4 files changed, 47 insertions, 16 deletions
diff --git a/scripts/wsrep_sst_common.sh b/scripts/wsrep_sst_common.sh index f1d332a9822..6d4def74b86 100644 --- a/scripts/wsrep_sst_common.sh +++ b/scripts/wsrep_sst_common.sh @@ -336,7 +336,7 @@ case "$1" in else # If it's not bash, then we need to use slow # external utilities: - option=$(echo "$options" | cut -c1-1) + option=$(echo "$options" | cut -c1) fi # And the subsequent characters consider option value: value="" diff --git a/scripts/wsrep_sst_mariabackup.sh b/scripts/wsrep_sst_mariabackup.sh index 2eedff554e6..a15a3f7b7a5 100644 --- a/scripts/wsrep_sst_mariabackup.sh +++ b/scripts/wsrep_sst_mariabackup.sh @@ -323,7 +323,8 @@ get_transfer() if [ "${sockopt#*,dhparam=}" != "$sockopt" ]; then if [ -z "$ssl_dhparams" ]; then # Determine the socat version - SOCAT_VERSION=$(socat -V 2>&1 | grep -m1 -oe '[0-9]\.[0-9][\.0-9]*') + 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. *" @@ -766,7 +767,7 @@ recv_joiner() # check donor supplied secret SECRET=$(grep -F -- "$SECRET_TAG " "$MAGIC_FILE" 2>/dev/null | \ - cut -d ' ' -f 2) + 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'" diff --git a/scripts/wsrep_sst_rsync.sh b/scripts/wsrep_sst_rsync.sh index 7845f143088..54160fd19a2 100644 --- a/scripts/wsrep_sst_rsync.sh +++ b/scripts/wsrep_sst_rsync.sh @@ -435,24 +435,38 @@ EOF tar_type=0 if tar --help | grep -qw -F -- '--transform'; then tar_type=1 - elif tar --help | grep -qw -E -- '-s[[:space:]]pattern' - then + elif tar --version | grep -q -E '^bsdtar\>'; then tar_type=2 fi + if [ $tar_type -ne 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" | { binlogs="" while read bin_file || [ -n "$bin_file" ]; do [ ! -f "$bin_file" ] && continue + if [ -n "$BASH_VERSION" ]; then + first="${bin_file:0:1}" + else + first=$(echo "$bin_file" | cut -c1) + fi + if [ "$first" = '-' -o "$first" = '@' ]; then + bin_file="./$bin_file" + fi binlogs="$binlogs${binlogs:+ }'$bin_file'" done if [ -n "$binlogs" ]; then - tar_options='/^.*\///g' if [ $tar_type -eq 1 ]; then - tar_options="--transform='s$tar_options'" + tar_options="--transform='s/^.*\///g'" else - tar_options="-s '$tar_options'" + # bsdtar handles backslash incorrectly: + tar_options="-s '?^.*/??g'" fi eval tar -P $tar_options \ -cvf "'$BINLOG_TAR_FILE'" $binlogs >&2 @@ -465,6 +479,14 @@ EOF [ ! -f "$bin_file" ] && continue bin_dir=$(dirname "$bin_file") bin_base=$(basename "$bin_file") + if [ -n "$BASH_VERSION" ]; then + first="${bin_base:0:1}" + else + first=$(echo "$bin_base" | cut -c1) + fi + if [ "$first" = '-' -o "$first" = '@' ]; then + bin_base="./$bin_base" + fi if [ -n "$bin_dir" -a "$bin_dir" != '.' ]; then tar $tar_options "$BINLOG_TAR_FILE" \ -C "$bin_dir" "$bin_base" >&2 @@ -740,7 +762,7 @@ EOF exit 42 fi CN=$("$OPENSSL_BINARY" x509 -noout -subject -in "$SSTCERT" | \ - tr ',' '\n' | grep -F 'CN =' | cut -d= -f2 | sed s/^\ // | \ + tr ',' '\n' | grep -F 'CN =' | cut -d '=' -f2 | sed s/^\ // | \ sed s/\ %//) fi MY_SECRET="$(wsrep_gen_secret)" @@ -781,7 +803,7 @@ EOF if [ -n "$MY_SECRET" ]; then # Check donor supplied secret: SECRET=$(grep -F -- "$SECRET_TAG " "$MAGIC_FILE" 2>/dev/null | \ - cut -d ' ' -f 2) + 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'" @@ -840,12 +862,20 @@ EOF binlog_cd=0 if [ -n "$binlog_dir" -a "$binlog_dir" != '.' ]; then [ ! -d "$binlog_dir" ] && mkdir -p "$binlog_dir" - cd "$binlog_dir" binlog_cd=1 + cd "$binlog_dir" fi # Extracting binlog files: wsrep_log_info "Extracting binlog files:" - if ! tar -xvf "$BINLOG_TAR_FILE" > "$tmpfile"; then + RC=0 + if tar --version | grep -q -E '^bsdtar\>'; then + tar -tf "$BINLOG_TAR_FILE" > "$tmpfile" && \ + tar -xvf "$BINLOG_TAR_FILE" > /dev/null || RC=$? + else + tar -xvf "$BINLOG_TAR_FILE" > "$tmpfile" && \ + cat "$tmpfile" >&2 || RC=$? + fi + if [ $RC -ne 0 ]; then rm -f "$tmpfile" wsrep_log_error "Error unpacking tar file with binlog files" exit 32 diff --git a/scripts/wsrep_sst_xtrabackup-v2.sh b/scripts/wsrep_sst_xtrabackup-v2.sh index 978c4805205..e7cd77396fe 100644 --- a/scripts/wsrep_sst_xtrabackup-v2.sh +++ b/scripts/wsrep_sst_xtrabackup-v2.sh @@ -328,7 +328,8 @@ get_transfer() if [ "${sockopt#*,dhparam=}" != "$sockopt" ]; then if [ -z "$ssl_dhparams" ]; then # Determine the socat version - SOCAT_VERSION=$(socat -V 2>&1 | grep -m1 -oe '[0-9]\.[0-9][\.0-9]*') + 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. *" @@ -778,7 +779,7 @@ recv_joiner() # check donor supplied secret SECRET=$(grep -F -- "$SECRET_TAG " "$MAGIC_FILE" 2>/dev/null | \ - cut -d ' ' -f 2) + 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'" @@ -835,7 +836,7 @@ monitor_process() XB_REQUIRED_VERSION='2.3.5' XB_VERSION=$($BACKUP_BIN --version 2>&1 | \ - grep -oe '[0-9]\.[0-9][\.0-9]*' | head -n1) + grep -m1 -owE '[0-9]+(\.[0-9]+)+' | head -n1) if [ -z "$XB_VERSION" ]; then wsrep_log_error "FATAL: Cannot determine the $BACKUP_BIN version." \ "Needs xtrabackup-$XB_REQUIRED_VERSION or higher to" \ @@ -1212,7 +1213,6 @@ then # May need xtrabackup_checkpoints later on [ -f "$DATA/xtrabackup_binary" ] && rm -f "$DATA/xtrabackup_binary" [ -f "$DATA/xtrabackup_galera_info" ] && rm -f "$DATA/xtrabackup_galera_info" - [ -f "$DATA/ib_logfile0" ] && rm -f "$DATA/ib_logfile0" ADDR="$WSREP_SST_OPT_ADDR" |