169 lines
5.9 KiB
Bash
Executable File
169 lines
5.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
cd "$ROOT_DIR"
|
|
|
|
BUNDLE_ROOT="${BUNDLE_ROOT:-$ROOT_DIR/../../rpki/target/live/20260316-112341-multi-final3}"
|
|
CASE_INFO_SCRIPT="$ROOT_DIR/scripts/payload_replay/multi_rir_case_info.py"
|
|
PROFILE_RUN_ROOT="${PROFILE_RUN_ROOT:-$ROOT_DIR/target/live/analyze_runs}"
|
|
mkdir -p "$PROFILE_RUN_ROOT"
|
|
|
|
TS="$(date -u +%Y%m%dT%H%M%SZ)"
|
|
RUN_NAME="${RUN_NAME:-apnic_snapshot_profile_${TS}}"
|
|
RUN_DIR="$PROFILE_RUN_ROOT/$RUN_NAME"
|
|
mkdir -p "$RUN_DIR"
|
|
|
|
ANALYZE_ROOT="$ROOT_DIR/target/live/analyze"
|
|
mkdir -p "$ANALYZE_ROOT"
|
|
mapfile -t ANALYZE_BEFORE < <(find "$ANALYZE_ROOT" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort)
|
|
|
|
eval "$(python3 "$CASE_INFO_SCRIPT" --bundle-root "$BUNDLE_ROOT" --rir apnic --format env)"
|
|
|
|
DB_DIR="${DB_DIR:-$RUN_DIR/db}"
|
|
REPORT_JSON="${REPORT_JSON:-$RUN_DIR/report.json}"
|
|
RUN_LOG="${RUN_LOG:-$RUN_DIR/run.log}"
|
|
META_JSON="${META_JSON:-$RUN_DIR/meta.json}"
|
|
SUMMARY_MD="${SUMMARY_MD:-$RUN_DIR/summary.md}"
|
|
|
|
rm -rf "$DB_DIR"
|
|
|
|
cmd=(cargo run --release --features profile --bin rpki --
|
|
--db "$DB_DIR"
|
|
--tal-path "$TAL_PATH"
|
|
--ta-path "$TA_PATH"
|
|
--payload-replay-archive "$PAYLOAD_REPLAY_ARCHIVE"
|
|
--payload-replay-locks "$PAYLOAD_REPLAY_LOCKS"
|
|
--validation-time "$SNAPSHOT_VALIDATION_TIME"
|
|
--analyze
|
|
--profile-cpu
|
|
--report-json "$REPORT_JSON")
|
|
|
|
if [[ -n "${MAX_DEPTH:-}" ]]; then
|
|
cmd+=(--max-depth "$MAX_DEPTH")
|
|
fi
|
|
if [[ -n "${MAX_INSTANCES:-}" ]]; then
|
|
cmd+=(--max-instances "$MAX_INSTANCES")
|
|
fi
|
|
|
|
if [[ "${DRY_RUN:-0}" == "1" ]]; then
|
|
printf '%q ' "${cmd[@]}"
|
|
echo
|
|
exit 0
|
|
fi
|
|
|
|
run_start_s="$(date +%s)"
|
|
(
|
|
echo '# command:'
|
|
printf '%q ' "${cmd[@]}"
|
|
echo
|
|
echo
|
|
"${cmd[@]}"
|
|
) 2>&1 | tee "$RUN_LOG" >/dev/null
|
|
run_end_s="$(date +%s)"
|
|
run_duration_s="$((run_end_s - run_start_s))"
|
|
|
|
mapfile -t ANALYZE_AFTER < <(find "$ANALYZE_ROOT" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort)
|
|
ANALYZE_DIR=""
|
|
for candidate in "${ANALYZE_AFTER[@]}"; do
|
|
seen=0
|
|
for old in "${ANALYZE_BEFORE[@]}"; do
|
|
if [[ "$candidate" == "$old" ]]; then
|
|
seen=1
|
|
break
|
|
fi
|
|
done
|
|
if [[ "$seen" == "0" ]]; then
|
|
ANALYZE_DIR="$candidate"
|
|
fi
|
|
done
|
|
if [[ -z "$ANALYZE_DIR" ]]; then
|
|
ANALYZE_DIR="$(find "$ANALYZE_ROOT" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort | tail -n 1)"
|
|
fi
|
|
|
|
BUNDLE_ROOT="$BUNDLE_ROOT" \
|
|
TRUST_ANCHOR="$TRUST_ANCHOR" \
|
|
TAL_PATH="$TAL_PATH" \
|
|
TA_PATH="$TA_PATH" \
|
|
PAYLOAD_REPLAY_ARCHIVE="$PAYLOAD_REPLAY_ARCHIVE" \
|
|
PAYLOAD_REPLAY_LOCKS="$PAYLOAD_REPLAY_LOCKS" \
|
|
SNAPSHOT_VALIDATION_TIME="$SNAPSHOT_VALIDATION_TIME" \
|
|
ROUTINATOR_BASE_REPLAY_SECONDS="$ROUTINATOR_BASE_REPLAY_SECONDS" \
|
|
DB_DIR="$DB_DIR" \
|
|
REPORT_JSON="$REPORT_JSON" \
|
|
RUN_LOG="$RUN_LOG" \
|
|
ANALYZE_DIR="$ANALYZE_DIR" \
|
|
RUN_DURATION_S="$run_duration_s" \
|
|
python3 - "$META_JSON" "$SUMMARY_MD" <<'PY'
|
|
import json
|
|
import os
|
|
import sys
|
|
from datetime import datetime, timezone
|
|
from pathlib import Path
|
|
|
|
meta_path = Path(sys.argv[1])
|
|
summary_path = Path(sys.argv[2])
|
|
report_path = Path(os.environ['REPORT_JSON'])
|
|
report = json.loads(report_path.read_text(encoding='utf-8'))
|
|
recorded = datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')
|
|
meta = {
|
|
'recorded_at_utc': recorded,
|
|
'bundle_root': os.environ['BUNDLE_ROOT'],
|
|
'trust_anchor': os.environ['TRUST_ANCHOR'],
|
|
'tal_path': os.environ['TAL_PATH'],
|
|
'ta_path': os.environ['TA_PATH'],
|
|
'payload_replay_archive': os.environ['PAYLOAD_REPLAY_ARCHIVE'],
|
|
'payload_replay_locks': os.environ['PAYLOAD_REPLAY_LOCKS'],
|
|
'validation_time_arg': os.environ['SNAPSHOT_VALIDATION_TIME'],
|
|
'routinator_base_replay_seconds': float(os.environ['ROUTINATOR_BASE_REPLAY_SECONDS']),
|
|
'db_dir': os.environ['DB_DIR'],
|
|
'report_json': os.environ['REPORT_JSON'],
|
|
'run_log': os.environ['RUN_LOG'],
|
|
'analyze_dir': os.environ.get('ANALYZE_DIR') or '',
|
|
'durations_secs': {
|
|
'rpki_run_wall': int(os.environ['RUN_DURATION_S']),
|
|
},
|
|
'counts': {
|
|
'publication_points_processed': report['tree']['instances_processed'],
|
|
'publication_points_failed': report['tree']['instances_failed'],
|
|
'vrps': len(report['vrps']),
|
|
'aspas': len(report['aspas']),
|
|
'audit_publication_points': len(report['publication_points']),
|
|
},
|
|
}
|
|
meta_path.write_text(json.dumps(meta, ensure_ascii=False, indent=2) + '\n', encoding='utf-8')
|
|
ratio = meta['durations_secs']['rpki_run_wall'] / meta['routinator_base_replay_seconds'] if meta['routinator_base_replay_seconds'] else None
|
|
lines = []
|
|
lines.append('# APNIC Snapshot Replay Profile Summary\n\n')
|
|
lines.append(f"- recorded_at_utc: `{recorded}`\n")
|
|
lines.append(f"- bundle_root: `{meta['bundle_root']}`\n")
|
|
lines.append(f"- tal_path: `{meta['tal_path']}`\n")
|
|
lines.append(f"- ta_path: `{meta['ta_path']}`\n")
|
|
lines.append(f"- payload_replay_archive: `{meta['payload_replay_archive']}`\n")
|
|
lines.append(f"- payload_replay_locks: `{meta['payload_replay_locks']}`\n")
|
|
lines.append(f"- validation_time_arg: `{meta['validation_time_arg']}`\n")
|
|
lines.append(f"- db_dir: `{meta['db_dir']}`\n")
|
|
lines.append(f"- report_json: `{meta['report_json']}`\n")
|
|
lines.append(f"- run_log: `{meta['run_log']}`\n")
|
|
lines.append(f"- analyze_dir: `{meta['analyze_dir']}`\n\n")
|
|
lines.append('## Timing\n\n')
|
|
lines.append('| metric | value |\n')
|
|
lines.append('|---|---:|\n')
|
|
lines.append(f"| ours_snapshot_replay_wall_s | {meta['durations_secs']['rpki_run_wall']} |\n")
|
|
lines.append(f"| routinator_base_replay_s | {meta['routinator_base_replay_seconds']:.3f} |\n")
|
|
if ratio is not None:
|
|
lines.append(f"| ratio_ours_over_routinator | {ratio:.3f} |\n")
|
|
lines.append('\n## Counts\n\n')
|
|
for key, value in meta['counts'].items():
|
|
lines.append(f"- {key}: `{value}`\n")
|
|
summary_path.write_text(''.join(lines), encoding='utf-8')
|
|
PY
|
|
|
|
echo "== APNIC snapshot replay profiling complete ==" >&2
|
|
echo "- run_dir: $RUN_DIR" >&2
|
|
echo "- analyze_dir: $ANALYZE_DIR" >&2
|
|
echo "- report_json: $REPORT_JSON" >&2
|
|
echo "- run_log: $RUN_LOG" >&2
|
|
echo "- meta_json: $META_JSON" >&2
|
|
echo "- summary_md: $SUMMARY_MD" >&2
|