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
109 lines
3.1 KiB
Bash
Executable File
109 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Smoke (PR-tier) k6 load runner.
|
|
# Same shape as run.sh but: no seeder, only the smoke scenario, no regression
|
|
# diff. Goal is harness liveness - does the server still boot and does k6 still
|
|
# wire up - not perf gating.
|
|
#
|
|
# Usage (from repo root):
|
|
# bash tests/load/smoke.sh
|
|
#
|
|
# Env overrides:
|
|
# BUILD_TARGET=debug # debug is fine; smoke doesn't measure timings
|
|
#
|
|
# Prerequisites: docker, cargo, k6 >= 0.46
|
|
|
|
set -euo pipefail
|
|
|
|
REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
COMMON="$REPO_ROOT/tests/common"
|
|
LOAD_DIR="$REPO_ROOT/tests/load"
|
|
|
|
# shellcheck source=test.env
|
|
source "$LOAD_DIR/test.env"
|
|
|
|
SERVER_PORT="${base_url##*:}"
|
|
|
|
log() { echo "[load-smoke] $*"; }
|
|
die() { echo "[load-smoke] ERROR: $*" >&2; exit 1; }
|
|
|
|
wait_for_http() {
|
|
local url="$1" timeout="${2:-60}"
|
|
local deadline=$(( $(date +%s) + timeout ))
|
|
until curl -sf "$url" >/dev/null 2>&1; do
|
|
[[ $(date +%s) -ge $deadline ]] && die "Timeout waiting for $url"
|
|
sleep 1
|
|
done
|
|
}
|
|
|
|
command -v k6 >/dev/null 2>&1 || die "k6 is required (https://k6.io/docs/get-started/installation/)"
|
|
|
|
SERVER_PID=""
|
|
cleanup() {
|
|
if [[ -n "$SERVER_PID" ]]; then
|
|
log "Stopping OxiCloud server (pid $SERVER_PID)..."
|
|
kill "$SERVER_PID" 2>/dev/null || true
|
|
wait "$SERVER_PID" 2>/dev/null || true
|
|
fi
|
|
bash "$COMMON/stop-db.sh" || true
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
bash "$COMMON/spawn-db.sh"
|
|
# Server applies sqlx migrations on startup; don't double-apply via psql here.
|
|
# See run.sh for the gory details.
|
|
|
|
set -a
|
|
# shellcheck source=../common/server.env
|
|
source "$COMMON/server.env"
|
|
OXICLOUD_SERVER_PORT=$SERVER_PORT
|
|
OXICLOUD_STORAGE_PATH="$LOAD_DIR/storage"
|
|
set +a
|
|
|
|
rm -rf "$OXICLOUD_STORAGE_PATH"
|
|
mkdir -p "$OXICLOUD_STORAGE_PATH"
|
|
|
|
BUILD_TARGET="${BUILD_TARGET:-debug}"
|
|
OXICLOUD_BIN="$REPO_ROOT/target/$BUILD_TARGET/oxicloud"
|
|
|
|
if [[ -x "$OXICLOUD_BIN" ]]; then
|
|
log "Starting pre-built OxiCloud server ($BUILD_TARGET) on port $SERVER_PORT..."
|
|
"$OXICLOUD_BIN" &
|
|
else
|
|
log "Building and starting OxiCloud server ($BUILD_TARGET) on port $SERVER_PORT..."
|
|
cd "$REPO_ROOT"
|
|
if [[ "$BUILD_TARGET" == "release" ]]; then
|
|
cargo run --release &
|
|
else
|
|
cargo run &
|
|
fi
|
|
fi
|
|
SERVER_PID=$!
|
|
wait_for_http "$base_url/ready" 120
|
|
log "Server ready."
|
|
|
|
# Bootstrap the admin account via /api/setup (one-shot — disabled once an
|
|
# admin exists, mirrors tests/api/setup.hurl). Without this the smoke scenario
|
|
# would have no one to log in as.
|
|
log "Creating admin via /api/setup..."
|
|
SETUP_BODY=$(printf '{"username":"%s","email":"%s","password":"%s"}' \
|
|
"${username:-admin}" "${email:-admin@example.com}" "${password:-TestPassword1!}")
|
|
SETUP_STATUS=$(curl -sS -o /dev/null -w '%{http_code}' \
|
|
-X POST "$base_url/api/setup" \
|
|
-H 'Content-Type: application/json' \
|
|
-d "$SETUP_BODY")
|
|
if [[ "$SETUP_STATUS" != "201" ]]; then
|
|
die "/api/setup returned $SETUP_STATUS (expected 201)"
|
|
fi
|
|
|
|
export K6_BASE_URL="$base_url"
|
|
export K6_USERNAME="${username:-admin}"
|
|
export K6_PASSWORD="${password:-TestPassword1!}"
|
|
|
|
log "Running smoke scenario..."
|
|
k6 run \
|
|
--summary-trend-stats="avg,min,med,max,p(90),p(95),p(99)" \
|
|
--quiet \
|
|
"$LOAD_DIR/scenarios/smoke.js"
|
|
|
|
log "Smoke OK."
|