mirror of
https://github.com/multica-ai/multica.git
synced 2026-09-28 05:13:45 +08:00
* fix(startup): retry transient database outages Co-authored-by: multica-agent <github@multica.ai> * fix(startup): address database retry review Co-authored-by: multica-agent <github@multica.ai> * test(startup): address retry review nits Co-authored-by: multica-agent <github@multica.ai> * fix(startup): preserve native pgx connect timeout Co-authored-by: multica-agent <github@multica.ai> * fix(startup): apply timeout fallback to services Co-authored-by: multica-agent <github@multica.ai> --------- Co-authored-by: Sol-Boy <sol-boy@multica-ai.local> Co-authored-by: multica-agent <github@multica.ai>
110 lines
2.8 KiB
Bash
110 lines
2.8 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
TEST_DIR="$(mktemp -d)"
|
|
ENTRYPOINT_PID=""
|
|
|
|
cleanup() {
|
|
if [ -n "$ENTRYPOINT_PID" ]; then
|
|
kill -KILL "$ENTRYPOINT_PID" 2>/dev/null || true
|
|
fi
|
|
if [ -s "$TEST_DIR/migrate.pid" ]; then
|
|
kill -KILL "$(cat "$TEST_DIR/migrate.pid")" 2>/dev/null || true
|
|
fi
|
|
rm -rf "$TEST_DIR"
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
cp "$ROOT_DIR/docker/entrypoint.sh" "$TEST_DIR/entrypoint.sh"
|
|
|
|
cat >"$TEST_DIR/migrate" <<'SCRIPT'
|
|
#!/bin/sh
|
|
trap 'printf "TERM\n" >"$MIGRATE_SIGNAL_FILE"; exit 143' TERM
|
|
printf '%s\n' "$$" >"$MIGRATE_PID_FILE"
|
|
printf '%s\n' "$MULTICA_INTERNAL_DATABASE_STARTUP_STARTED_AT_UNIX" >"$MIGRATE_STARTED_AT_FILE"
|
|
while :; do
|
|
sleep 1
|
|
done
|
|
SCRIPT
|
|
|
|
cat >"$TEST_DIR/server" <<'SCRIPT'
|
|
#!/bin/sh
|
|
printf 'started\n' >"$SERVER_STARTED_FILE"
|
|
printf '%s\n' "$MULTICA_INTERNAL_DATABASE_STARTUP_STARTED_AT_UNIX" >"$SERVER_STARTED_AT_FILE"
|
|
SCRIPT
|
|
|
|
chmod +x "$TEST_DIR/entrypoint.sh" "$TEST_DIR/migrate" "$TEST_DIR/server"
|
|
|
|
export MIGRATE_PID_FILE="$TEST_DIR/migrate.pid"
|
|
export MIGRATE_SIGNAL_FILE="$TEST_DIR/migrate.signal"
|
|
export MIGRATE_STARTED_AT_FILE="$TEST_DIR/migrate.started-at"
|
|
export SERVER_STARTED_FILE="$TEST_DIR/server.started"
|
|
export SERVER_STARTED_AT_FILE="$TEST_DIR/server.started-at"
|
|
|
|
(
|
|
cd "$TEST_DIR"
|
|
exec ./entrypoint.sh
|
|
) &
|
|
ENTRYPOINT_PID=$!
|
|
|
|
for _ in $(seq 1 50); do
|
|
if [ -s "$MIGRATE_PID_FILE" ]; then
|
|
break
|
|
fi
|
|
sleep 0.1
|
|
done
|
|
if [ ! -s "$MIGRATE_PID_FILE" ]; then
|
|
echo "migrator did not start"
|
|
exit 1
|
|
fi
|
|
|
|
kill -TERM "$ENTRYPOINT_PID"
|
|
set +e
|
|
wait "$ENTRYPOINT_PID"
|
|
status=$?
|
|
set -e
|
|
ENTRYPOINT_PID=""
|
|
|
|
if [ "$status" -ne 143 ]; then
|
|
echo "entrypoint exited with $status, want 143 after SIGTERM"
|
|
exit 1
|
|
fi
|
|
if [ "$(cat "$MIGRATE_SIGNAL_FILE" 2>/dev/null || true)" != "TERM" ]; then
|
|
echo "entrypoint did not forward SIGTERM to the migrator"
|
|
exit 1
|
|
fi
|
|
if [ -e "$SERVER_STARTED_FILE" ]; then
|
|
echo "entrypoint started the server after interrupted migrations"
|
|
exit 1
|
|
fi
|
|
|
|
cat >"$TEST_DIR/migrate" <<'SCRIPT'
|
|
#!/bin/sh
|
|
printf '%s\n' "$MULTICA_INTERNAL_DATABASE_STARTUP_STARTED_AT_UNIX" >"$MIGRATE_STARTED_AT_FILE"
|
|
exit 0
|
|
SCRIPT
|
|
chmod +x "$TEST_DIR/migrate"
|
|
|
|
(
|
|
cd "$TEST_DIR"
|
|
./entrypoint.sh
|
|
)
|
|
if [ "$(cat "$SERVER_STARTED_FILE" 2>/dev/null || true)" != "started" ]; then
|
|
echo "entrypoint did not start the server after successful migrations"
|
|
exit 1
|
|
fi
|
|
started_at="$(cat "$MIGRATE_STARTED_AT_FILE" 2>/dev/null || true)"
|
|
if [ -z "$started_at" ] || [ "$started_at" != "$(cat "$SERVER_STARTED_AT_FILE" 2>/dev/null || true)" ]; then
|
|
echo "entrypoint did not share one database startup timestamp"
|
|
exit 1
|
|
fi
|
|
case "$started_at" in
|
|
*[!0-9]*)
|
|
echo "entrypoint database startup timestamp is not a Unix timestamp"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
echo "entrypoint startup and signal forwarding ok"
|