0ef4c624c5
initial test from Ed's nuc:
metric pctl baseline current delta status
-----------------------------------------------------------------------------------------------
folder_cascade.list_depth1 p50 0.3ms 0.3ms -6.3% ok
folder_cascade.list_depth1 p95 2.3ms 0.5ms -75.7% ok
folder_cascade.list_depth1 p99 4.7ms 2.5ms -48.1% ok
folder_cascade.list_depth4 p50 0.4ms 0.3ms -10.0% ok
folder_cascade.list_depth4 p95 0.9ms 0.6ms -31.2% ok
folder_cascade.list_depth4 p99 2.4ms 1.0ms -56.7% ok
folder_cascade.list_depth8 p50 0.3ms 0.3ms -8.8% ok
folder_cascade.list_depth8 p95 0.6ms 0.5ms -22.2% ok
folder_cascade.list_depth8 p99 1.9ms 0.5ms -71.5% ok
folder_cascade.list_depth_deep p50 0.3ms 0.3ms -5.0% ok
folder_cascade.list_depth_deep p95 0.6ms 0.5ms -18.6% ok
folder_cascade.list_depth_deep p99 2.0ms 0.7ms -67.2% ok
share_cascade_rebac.list_grants p50 0.4ms 0.3ms -27.6% ok
share_cascade_rebac.list_grants p95 1.2ms 0.5ms -57.0% ok
share_cascade_rebac.list_grants p99 1.7ms 1.1ms -36.7% ok
share_cascade_rebac.fetch_as_grantee_depth1 p50 0.5ms 0.5ms -11.1% ok
share_cascade_rebac.fetch_as_grantee_depth1 p95 1.1ms 0.7ms -41.2% ok
share_cascade_rebac.fetch_as_grantee_depth1 p99 3.0ms 1.3ms -58.3% ok
share_cascade_rebac.fetch_as_grantee_depth4 p50 0.5ms 0.5ms -13.7% ok
share_cascade_rebac.fetch_as_grantee_depth4 p95 1.4ms 0.7ms -50.5% ok
share_cascade_rebac.fetch_as_grantee_depth4 p99 2.2ms 1.1ms -49.3% ok
share_cascade_rebac.fetch_as_grantee_depth8 p50 0.5ms 0.4ms -16.0% ok
share_cascade_rebac.fetch_as_grantee_depth8 p95 0.9ms 0.7ms -26.1% ok
share_cascade_rebac.fetch_as_grantee_depth8 p99 1.5ms 0.9ms -40.1% ok
share_cascade_rebac.fetch_as_grantee_depth_deep p50 0.5ms 0.4ms -17.3% ok
share_cascade_rebac.fetch_as_grantee_depth_deep p95 1.0ms 0.7ms -31.2% ok
share_cascade_rebac.fetch_as_grantee_depth_deep p99 1.6ms 0.8ms -49.4% ok
subject_group_nested.fetch_as_member_depth1 p50 0.5ms 0.4ms -8.4% ok
subject_group_nested.fetch_as_member_depth1 p95 0.6ms 0.6ms -10.2% ok
subject_group_nested.fetch_as_member_depth1 p99 1.4ms 0.6ms -55.2% ok
subject_group_nested.fetch_as_member_depth4 p50 0.5ms 0.5ms -7.9% ok
subject_group_nested.fetch_as_member_depth4 p95 0.6ms 0.6ms -4.0% ok
subject_group_nested.fetch_as_member_depth4 p99 0.7ms 0.6ms -2.2% ok
subject_group_nested.fetch_as_member_depth8 p50 0.5ms 0.4ms -8.9% ok
subject_group_nested.fetch_as_member_depth8 p95 0.5ms 0.6ms +7.1% ok
subject_group_nested.fetch_as_member_depth8 p99 0.6ms 0.7ms +10.3% ok
subject_group_nested.fetch_as_member_depth_deep p50 0.5ms 0.4ms -7.6% ok
subject_group_nested.fetch_as_member_depth_deep p95 0.6ms 0.5ms -11.9% ok
subject_group_nested.fetch_as_member_depth_deep p99 0.6ms 0.7ms +8.9% ok
63 lines
2.6 KiB
Bash
Executable File
63 lines
2.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
COMPOSE_FILE="$(dirname "$0")/docker-compose.test.yml"
|
|
|
|
wait_for_port() {
|
|
local host="$1" port="$2" timeout="${3:-30}"
|
|
local deadline=$(( $(date +%s) + timeout ))
|
|
until nc -z "$host" "$port" 2>/dev/null; do
|
|
[[ $(date +%s) -ge $deadline ]] && echo "Timeout waiting for $host:$port" >&2 && exit 1
|
|
sleep 0.5
|
|
done
|
|
}
|
|
|
|
# Postgres opens its TCP socket during `initdb` (well before the server can
|
|
# actually serve queries) and slams it back shut until startup completes —
|
|
# that's the classic "server closed the connection unexpectedly" race when
|
|
# a follow-up `psql` runs too quickly. The compose file has a `pg_isready`
|
|
# healthcheck; we mirror it here so this script is the single source of
|
|
# "the DB is ready" for callers (tests/api/run.sh, just test-integration).
|
|
#
|
|
# Tries the in-container pg_isready first (always available, no host deps),
|
|
# then falls back to a SELECT-1 probe via psql.
|
|
wait_for_postgres_ready() {
|
|
local timeout="${1:-60}"
|
|
local deadline=$(( $(date +%s) + timeout ))
|
|
until docker compose -f "$COMPOSE_FILE" exec -T postgres-test \
|
|
pg_isready -U oxicloud_test -d oxicloud_test -h 127.0.0.1 >/dev/null 2>&1; do
|
|
[[ $(date +%s) -ge $deadline ]] && echo "Timeout waiting for postgres readiness" >&2 && exit 1
|
|
sleep 0.5
|
|
done
|
|
# Belt-and-braces: pg_isready returns 0 as soon as the server accepts
|
|
# connections, but a query may still race the very first request. One
|
|
# successful SELECT confirms the round-trip works end-to-end.
|
|
#
|
|
# Retry the probe a handful of times — under CPU pressure (e.g. a parallel
|
|
# cargo build hammering a self-hosted runner) the role/db init can complete
|
|
# a beat after pg_isready returns success. A single-shot probe in that
|
|
# window produces spurious "Postgres reported ready but a sample query
|
|
# failed" failures. Show the last error if every retry fails so operators
|
|
# see the actual psql diagnostic.
|
|
local last_err
|
|
for _ in 1 2 3 4 5 6 7 8 9 10; do
|
|
if last_err=$(PGPASSWORD=oxicloud_test psql -h 127.0.0.1 -p 5433 \
|
|
-U oxicloud_test -d oxicloud_test \
|
|
-v ON_ERROR_STOP=1 -c 'SELECT 1' 2>&1 >/dev/null); then
|
|
return 0
|
|
fi
|
|
sleep 0.5
|
|
done
|
|
echo "Postgres reported ready but a sample query failed after 10 retries: $last_err" >&2
|
|
exit 1
|
|
}
|
|
|
|
echo "[setup] Starting test postgres..."
|
|
docker compose -f "$COMPOSE_FILE" down -v 2>/dev/null || true
|
|
docker compose -f "$COMPOSE_FILE" up -d
|
|
echo "[setup] Waiting for postgres on port 5433..."
|
|
wait_for_port 127.0.0.1 5433
|
|
echo "[setup] Waiting for postgres to accept queries..."
|
|
wait_for_postgres_ready
|
|
echo "[setup] Postgres is ready."
|