clone-node: port both slowdisk extract fixes from clone-backup (EXDEV transform + script-file listener)
Same duplicated listener code, same two latent bugs. Not exercised today (de-32 target has SLOWDISK=False) but any clone to a SLOWDISK=True host would have failed identically. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -200,6 +200,7 @@ setup_slowdisk_structure() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
SLOWDISK_TRANSFORMS=""
|
||||||
echo "Setting up SLOWDISK structure for $key"
|
echo "Setting up SLOWDISK structure for $key"
|
||||||
echo " Static size: $((static_size_kb / 1024))MB"
|
echo " Static size: $((static_size_kb / 1024))MB"
|
||||||
echo " Static paths: ${#static_paths[@]}"
|
echo " Static paths: ${#static_paths[@]}"
|
||||||
@@ -229,6 +230,9 @@ setup_slowdisk_structure() {
|
|||||||
local slowdisk_path="${slowdisk_base}/rpc_${key}__data_${path//\//__}"
|
local slowdisk_path="${slowdisk_base}/rpc_${key}__data_${path//\//__}"
|
||||||
local target_path="${volume_path}/${path}"
|
local target_path="${volume_path}/${path}"
|
||||||
local target_dir=$(dirname "$target_path")
|
local target_dir=$(dirname "$target_path")
|
||||||
|
# tar cannot extract through a cross-device dir symlink (EXDEV) - rewrite
|
||||||
|
# member paths to land directly on /slowdisk (same fix as clone-backup).
|
||||||
|
SLOWDISK_TRANSFORMS+=" --transform='s|^\\(\\./\\)\\?var/lib/docker/volumes/rpc_${key}/_data/${path}|slowdisk/rpc_${key}__data_${path//\//__}|'"
|
||||||
|
|
||||||
# Create parent directories in volume
|
# Create parent directories in volume
|
||||||
$SSH_CMD "$DEST_HOST" "mkdir -p '$target_dir'"
|
$SSH_CMD "$DEST_HOST" "mkdir -p '$target_dir'"
|
||||||
@@ -299,7 +303,7 @@ transfer_volume() {
|
|||||||
# Use --skip-old-files to avoid overwriting existing symlinks/directories
|
# Use --skip-old-files to avoid overwriting existing symlinks/directories
|
||||||
# and --keep-directory-symlink so tar extracts THROUGH the pre-created dir symlinks
|
# and --keep-directory-symlink so tar extracts THROUGH the pre-created dir symlinks
|
||||||
# instead of trying to mkdir over them (which fails with 'Cannot mkdir: File exists')
|
# instead of trying to mkdir over them (which fails with 'Cannot mkdir: File exists')
|
||||||
tar_extract_opts="-xf - -C / --skip-old-files --keep-directory-symlink"
|
tar_extract_opts="-xf - -C / --skip-old-files --keep-directory-symlink${SLOWDISK_TRANSFORMS}"
|
||||||
echo "SLOWDISK structure ready, will extract respecting symlinks"
|
echo "SLOWDISK structure ready, will extract respecting symlinks"
|
||||||
else
|
else
|
||||||
echo "Warning: Failed to setup SLOWDISK structure, falling back to normal extraction"
|
echo "Warning: Failed to setup SLOWDISK structure, falling back to normal extraction"
|
||||||
@@ -338,12 +342,14 @@ transfer_volume() {
|
|||||||
|
|
||||||
# Start listener in screen session with proper escaping
|
# Start listener in screen session with proper escaping
|
||||||
# Use tar_extract_opts which may include --skip-old-files for SLOWDISK mode
|
# Use tar_extract_opts which may include --skip-old-files for SLOWDISK mode
|
||||||
$SSH_CMD "$DEST_HOST" "
|
# Script-file listener: tar_extract_opts may carry quoted --transform args
|
||||||
screen -dmS transfer_${key} bash -c '
|
# that no inline bash -c quoting survives (same fix as clone-backup).
|
||||||
nc -l -p $port | zstd -d | tar $tar_extract_opts 2>/tmp/transfer_${key}.err
|
$SSH_CMD "$DEST_HOST" "cat > /tmp/transfer_${key}.sh && chmod +x /tmp/transfer_${key}.sh" <<LISTENER
|
||||||
echo \$? > /tmp/transfer_${key}.done
|
#!/bin/bash
|
||||||
'
|
nc -l -p $port | zstd -d | tar $tar_extract_opts 2>/tmp/transfer_${key}.err
|
||||||
"
|
echo \$? > /tmp/transfer_${key}.done
|
||||||
|
LISTENER
|
||||||
|
$SSH_CMD "$DEST_HOST" "screen -dmS transfer_${key} /tmp/transfer_${key}.sh"
|
||||||
|
|
||||||
# Give it time to start
|
# Give it time to start
|
||||||
sleep 2
|
sleep 2
|
||||||
@@ -359,13 +365,12 @@ transfer_volume() {
|
|||||||
|
|
||||||
# Use nohup with proper backgrounding
|
# Use nohup with proper backgrounding
|
||||||
# Use tar_extract_opts which may include --skip-old-files for SLOWDISK mode
|
# Use tar_extract_opts which may include --skip-old-files for SLOWDISK mode
|
||||||
$SSH_CMD "$DEST_HOST" "
|
$SSH_CMD "$DEST_HOST" "cat > /tmp/transfer_${key}.sh && chmod +x /tmp/transfer_${key}.sh" <<LISTENER
|
||||||
nohup bash -c '
|
#!/bin/bash
|
||||||
nc -l -p $port | zstd -d | tar $tar_extract_opts 2>/tmp/transfer_${key}.err
|
nc -l -p $port | zstd -d | tar $tar_extract_opts 2>/tmp/transfer_${key}.err
|
||||||
echo \$? > /tmp/transfer_${key}.done
|
echo \$? > /tmp/transfer_${key}.done
|
||||||
' > /tmp/transfer_${key}.log 2>&1 < /dev/null &
|
LISTENER
|
||||||
echo \$! > /tmp/transfer_${key}.pid
|
$SSH_CMD "$DEST_HOST" "nohup /tmp/transfer_${key}.sh > /tmp/transfer_${key}.log 2>&1 < /dev/null & echo \$! > /tmp/transfer_${key}.pid"
|
||||||
"
|
|
||||||
|
|
||||||
sleep 2
|
sleep 2
|
||||||
|
|
||||||
@@ -479,7 +484,7 @@ transfer_volume_ssh() {
|
|||||||
if setup_slowdisk_structure "$key" "$static_size_kb" "${static_paths[@]}"; then
|
if setup_slowdisk_structure "$key" "$static_size_kb" "${static_paths[@]}"; then
|
||||||
# and --keep-directory-symlink so tar extracts THROUGH the pre-created dir symlinks
|
# and --keep-directory-symlink so tar extracts THROUGH the pre-created dir symlinks
|
||||||
# instead of trying to mkdir over them (which fails with 'Cannot mkdir: File exists')
|
# instead of trying to mkdir over them (which fails with 'Cannot mkdir: File exists')
|
||||||
tar_extract_opts="-xf - -C / --skip-old-files --keep-directory-symlink"
|
tar_extract_opts="-xf - -C / --skip-old-files --keep-directory-symlink${SLOWDISK_TRANSFORMS}"
|
||||||
echo "SLOWDISK structure ready, will extract respecting symlinks"
|
echo "SLOWDISK structure ready, will extract respecting symlinks"
|
||||||
else
|
else
|
||||||
echo "Warning: Failed to setup SLOWDISK structure, falling back to normal extraction"
|
echo "Warning: Failed to setup SLOWDISK structure, falling back to normal extraction"
|
||||||
|
|||||||
Reference in New Issue
Block a user