#!/bin/bash
# 실습 #17 ③ — RAID-10 (1+0): mirror 의 stripe
# - 4 disk: (m1+m2) + (m3+m4). 절반은 미러, 그 위에 stripe.
# - 읽기·쓰기 둘 다 빠르고 내결함성 좋음. DB·고성능 워크로드 표준.
# - 단점: 용량 효율 50% (4 disk → 사용 2 disk 분)
set -e

WORK=/tmp/lab_raid10
sudo mkdir -p "$WORK"
N=4

cleanup_loops() {
    sudo umount /mnt/raid10 2>/dev/null || true
    sudo mdadm --stop /dev/md10 2>/dev/null || true
    for i in $(seq 0 $((N-1))); do
        for L in $(sudo losetup -j "$WORK/disk${i}.img" 2>/dev/null | cut -d: -f1); do
            sudo losetup -d "$L" 2>/dev/null || true
        done
    done
}
trap cleanup_loops INT TERM

# 1) 4 disk
LOOPS=()
for i in $(seq 0 $((N-1))); do
    sudo dd if=/dev/zero of="$WORK/disk${i}.img" bs=1M count=200 status=none
    LOOPS+=("$(sudo losetup -f --show "$WORK/disk${i}.img")")
done

# 2) RAID-10 생성
sudo mdadm --create /dev/md10 --metadata=1.2 \
    --level=10 --raid-devices=4 \
    "${LOOPS[@]}" --run

while grep -q "resync\|recovery" /proc/mdstat; do sleep 1; done

echo
echo "=== /proc/mdstat ==="
cat /proc/mdstat

echo
echo "=== detail ==="
sudo mdadm --detail /dev/md10 | head -20

# 3) layout 확인 — near, far, offset 차이
LAYOUT=$(sudo mdadm --detail /dev/md10 | grep Layout | awk '{print $3,$4}')
echo
echo "=== Layout: $LAYOUT ==="
cat <<'EOF'
near (기본) : 한 stripe 안에 같은 데이터 인접 배치 → 읽기 빠름, 쓰기 표준
far         : 디스크 양 끝에 분산 → 순차 읽기 ↑, 무작위 쓰기 ↓
offset      : near + far 절충
EOF

# 4) 포맷 + 데이터 + 체크섬
sudo mkfs.ext4 -F /dev/md10 >/dev/null
sudo mkdir -p /mnt/raid10
sudo mount /dev/md10 /mnt/raid10

# 가용 용량 확인 — 4 × 200MB 중 50% 만 사용 가능 (= 약 400MB)
df -h /mnt/raid10
echo "→ raw 800MB 중 약 400MB 사용 가능 (50% efficiency)"

# 5) 1대 죽여도 동작
sudo dd if=/dev/urandom of=/mnt/raid10/x.bin bs=1M count=50 status=none
CKSUM=$(sudo sha256sum /mnt/raid10/x.bin | awk '{print $1}')

sudo mdadm --fail /dev/md10 "${LOOPS[0]}"
cat /proc/mdstat
echo
echo "=== degraded 에서도 데이터 OK ==="
NEW=$(sudo sha256sum /mnt/raid10/x.bin | awk '{print $1}')
[ "$CKSUM" = "$NEW" ] && echo "→ OK" || { echo "→ 불일치"; exit 1; }

# 6) 정리
sudo umount /mnt/raid10
sudo mdadm --stop /dev/md10
cleanup_loops
echo
echo "정리 완료."
