run_workloads.sh
application/x-sh
Filename: run_workloads.sh
Type: application/x-sh
Part: 3
#!/usr/bin/env bash
set -euo pipefail
# -----------------------------------
# Caller should adjust these values
# -----------------------------------
# Scripts path
BASE_DIR="$HOME/scripts/test_autovacuum_prioritization"
# Workload parameters
OLTP_TABLES=100
OLTP_ROWS_PER_TABLE=100000
BATCH_TABLES=5
BATCH_SIZE=1000
BATCH_CONNECTIONS=1
OLTP_CONNECTIONS=3
TIMEOUT=600
# ----------------------------
# DO NOT TOUCH!
# ----------------------------
TMP_DIR="$BASE_DIR/tmp"
TMP_OLTP_FILE="$BASE_DIR/oltp_workload.sql"
TMP_BATCH_FILES="$BASE_DIR/batch_workload"
OLTP_SCRIPT="$BASE_DIR/oltp.sh"
BATCH_SCRIPT="$BASE_DIR/batch.sh"
SUMMARY_SCRIPT="$BASE_DIR/summary.sh"
OLTP_LOG="$TMP_DIR/oltp.out"
BATCH_LOG="$TMP_DIR/batch.out"
READY_FILE="$TMP_DIR/oltp_ready"
# ----------------------------
# Ensure temp directory exists
# ----------------------------
if [ -n "$TMP_DIR" ] && [ "$TMP_DIR" != "/" ]; then
if [ -d "$TMP_DIR" ]; then
echo "Removing existing temp directory: $TMP_DIR"
rm -rf "$TMP_DIR"
fi
mkdir -p "$TMP_DIR" || { echo "Error: failed to create $TMP_DIR" >&2; exit 1; }
else
echo "Error: TMP_DIR is invalid!" >&2
exit 1
fi
# ----------------------------
# Start OLTP workload in background
# ----------------------------
echo "Starting OLTP workload..."
bash "$OLTP_SCRIPT" "$TMP_OLTP_FILE" "$OLTP_TABLES" "$OLTP_ROWS_PER_TABLE" "$READY_FILE" "$OLTP_CONNECTIONS" "$TIMEOUT" | tee "$OLTP_LOG" 2>&1 &
OLTP_PID=$!
# ----------------------------
# Wait for OLTP ready file
# ----------------------------
echo "Waiting for OLTP ready file..."
while [ ! -f "$READY_FILE" ]; do
sleep 1
done
echo "OLTP ready file detected. Starting batch workload..."
# ----------------------------
# Start batch workload in background
# ----------------------------
bash "$BATCH_SCRIPT" "$BATCH_SIZE" "$TMP_BATCH_FILES" "$BATCH_TABLES" "$BATCH_CONNECTIONS" "$TIMEOUT" | tee "$BATCH_LOG" 2>&1 &
BATCH_PID=$!
echo "OLTP PID: $OLTP_PID | Batch PID: $BATCH_PID"
# ----------------------------
# Monitor both workloads
# ----------------------------
START_TIME=$(date +%s)
while true; do
CURRENT_TIME=$(date +%s)
ELAPSED=$((CURRENT_TIME - START_TIME))
# If OLTP finished, terminate batch
if ! kill -0 "$OLTP_PID" 2>/dev/null; then
echo "OLTP workload completed, terminating batch..."
kill -TERM "$BATCH_PID" 2>/dev/null || true
wait "$BATCH_PID" 2>/dev/null || true
break
fi
# If batch finished, terminate OLTP
if ! kill -0 "$BATCH_PID" 2>/dev/null; then
echo "Batch workload completed, terminating OLTP..."
kill -TERM "$OLTP_PID" 2>/dev/null || true
wait "$OLTP_PID" 2>/dev/null || true
break
fi
# Check timeout
if [ "$ELAPSED" -ge "$TIMEOUT" ]; then
echo "⏱ Timeout reached (${ELAPSED}s), stopping both workloads..."
kill -TERM "$OLTP_PID" "$BATCH_PID" 2>/dev/null || true
wait "$OLTP_PID" 2>/dev/null || true
wait "$BATCH_PID" 2>/dev/null || true
break
fi
sleep 5
done
echo "Both workloads stopped."
# ----------------------------
# Restart PostgreSQL
# ----------------------------
echo "Restarting Postgres..."
pg_ctl restart
echo "Postgres restarted."
# ----------------------------
# Run summary script
# ----------------------------
"$SUMMARY_SCRIPT"