`--fail-on-recovery-error true` 在没有可读的混合日志检查点时仍会提供不完整的 AOF 尾部
#!/usr/bin/env bash
set -euo pipefail
suffix="$$"
network="garnet-recovery-failopen-${suffix}"
node="garnet-recovery-failopen-${suffix}"
root="$(mktemp -d)"
data="$root/data"
image="ghcr.io/microsoft/garnet:2.1.8"
client_image="Redis:7-alpine"
mkdir -p
"$data"
"$root/pre-injection"
"$root/pre-boot"
"$root/post-boot"
chmod 0777
"$root"
"$data"
"$root/pre-injection"
"$root/pre-boot"
"$root/post-boot"
cleanup() {
Docker rm -f "$node" >/dev/null 2>&1 || true
Docker network rm "$network" >/dev/null 2>&1 || true
echo "Captured data remains at: $root"
}
trap cleanup EXIT
Docker network create "$network" >/dev/null
start_node() {
Docker run -d
--name "$node"
--network "$network"
--network-alias garnet
-v "$data:/data"
"$image"
--aof
--recover
--fail-on-recovery-error true
--logger-level Trace
--bind 0.0.0.0
--port 6379
--checkpointdir /data/checkpoints
--index 64m >/dev/null
}
wait_ready() {
for attempt in $(seq 1 30); do
if [ "$(Docker run --rm --network "$network" "$client_image"
Redis-cli -h garnet PING 2>/dev/null || true)" = PONG ]; then
return 0
fi
sleep 1
done
return 1
}
start_node
wait_ready
Docker run --rm --network "$network" "$client_image" sh -ec '
i=1
while [ "$i" -le 200 ]; do
Redis-cli
…
内容来源: microsoft/garnet