find -type d skipped static dirs that are already offloaded (a symlink to /slowdisk is type l, not d) — so show-static-file-size.sh reported zero static for an offloaded node (e.g. bob on de-35), and backup-node.sh would drop them from the manifest (breaking re-offload on the next restore). Match dirs AND symlinks now (root-level entries too). show-static-file-size.sh also tags each static dir with its location: [OFFLOADED -> /slowdisk/...], [on-disk], or [BROKEN SYMLINK ...]. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
69 lines
2.6 KiB
Bash
Executable File
69 lines
2.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
BASEPATH="$(dirname "$0")"
|
|
source "$BASEPATH/volume-utils.sh"
|
|
static_file_list="$BASEPATH/static-file-path-list.txt"
|
|
|
|
# Read the JSON input and extract the list of keys
|
|
keys=$(get_persistent_volume_keys "/root/rpc/$1.yml")
|
|
|
|
static_size=0
|
|
total_size=0
|
|
|
|
# Iterate over the list of keys
|
|
for key in $keys; do
|
|
#echo "checking: /var/lib/docker/volumes/rpc_$key"
|
|
|
|
prefix="/var/lib/docker/volumes/rpc_$key"
|
|
|
|
volume_size=$(du -sL $prefix 2>/dev/null | awk '{print $1}')
|
|
|
|
total_size=$((total_size + volume_size))
|
|
|
|
# Only check static files if the list exists
|
|
if [[ -f "$static_file_list" ]]; then
|
|
while IFS= read -r path; do
|
|
# Skip empty lines
|
|
[[ -z "$path" ]] && continue
|
|
|
|
# Match rule: an entry with NO slash is root-level only (depth-1 under _data), so
|
|
# e.g. `snapshots` won't catch postgres pg_logical/snapshots. An entry WITH a slash
|
|
# is a path-suffix (any prefix: network-prefixed nitro, nested l2geth geth/geth/...).
|
|
# Match real dirs AND symlinks: an OFFLOADED static dir is a symlink to /slowdisk,
|
|
# which `find -type d` alone would skip.
|
|
matches=()
|
|
if [[ "$path" == */* ]]; then
|
|
while IFS= read -r d; do matches+=("$d"); done < <(find "$prefix/_data" \( -type d -o -type l \) -path "*/$path" 2>/dev/null)
|
|
else
|
|
m="$prefix/_data/$path"; { [ -d "$m" ] || [ -L "$m" ]; } && matches+=("$m")
|
|
fi
|
|
for m in "${matches[@]}"; do
|
|
size=$(du -sL "$m" 2>/dev/null | awk '{print $1}')
|
|
static_size=$((static_size + ${size:-0}))
|
|
size_formatted=$(echo "$(( ${size:-0} * 1024 ))" | numfmt --to=iec --suffix=B --format="%.2f")
|
|
# offload indicator: is this static dir symlinked out to the /slowdisk extra disk?
|
|
if [ -L "$m" ]; then
|
|
tgt=$(readlink -f "$m" 2>/dev/null)
|
|
case "$tgt" in
|
|
/slowdisk/*) loc="[OFFLOADED -> $tgt]" ;;
|
|
"") loc="[BROKEN SYMLINK -> $(readlink "$m" 2>/dev/null)]" ;;
|
|
*) loc="[SYMLINK -> $tgt]" ;;
|
|
esac
|
|
else
|
|
loc="[on-disk]"
|
|
fi
|
|
echo "$size_formatted $m $loc" >&2
|
|
done
|
|
done < "$static_file_list"
|
|
fi
|
|
done
|
|
|
|
# Calculate ratio, handling division by zero
|
|
if [[ $total_size -eq 0 ]]; then
|
|
ratio="0.00"
|
|
else
|
|
ratio=$(bc -l <<< "scale=2; $static_size/$total_size")
|
|
fi
|
|
|
|
echo "$ratio"
|