From 91efd92d312808380c31cdfc69e83a53da1d6498 Mon Sep 17 00:00:00 2001 From: notplants <@notplants> Date: Wed, 29 Apr 2026 13:40:41 -0400 Subject: [PATCH] add abra command for vacuum full --- .env.sample | 4 ++-- abra.sh | 10 ++++++++++ compose.compress-state.yml | 2 +- compress_state_entrypoint.sh | 28 ++++++++++++++++++++-------- 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/.env.sample b/.env.sample index 413aa1e..c3a7d5c 100644 --- a/.env.sample +++ b/.env.sample @@ -202,10 +202,10 @@ RETENTION_MAX_LIFETIME=4w ## State compression (reduces database bloat from federation) ## Runs synapse_auto_compressor daily, built from source on first start #COMPOSE_FILE="$COMPOSE_FILE:compose.compress-state.yml" -#COMPRESS_STATE_ENTRYPOINT_VERSION=v1 +# See https://github.com/matrix-org/rust-synapse-compress-state#running-options #STATE_COMPRESS_CHUNK_SIZE=500 #STATE_COMPRESS_CHUNKS=100 -#STATE_COMPRESS_INTERVAL=86400 +#STATE_COMPRESS_SCHEDULE=0 3 * * * ## Admin interface at /admin #COMPOSE_FILE="$COMPOSE_FILE:compose.admin.yml" diff --git a/abra.sh b/abra.sh index 5009278..51867d2 100644 --- a/abra.sh +++ b/abra.sh @@ -10,6 +10,16 @@ export WK_SERVER_VERSION=v1 export WK_CLIENT_VERSION=v1 export PG_BACKUP_VERSION=v2 export ADMIN_CONFIG_VERSION=v1 +export COMPRESS_STATE_ENTRYPOINT_VERSION=v5 + +vacuum_state() { + echo "WARNING: VACUUM FULL locks the state_groups_state table." + echo "Synapse will be unable to process events until this completes." + echo "Running VACUUM FULL on state_groups_state..." + psql -U synapse -d synapse -c "VACUUM FULL state_groups_state;" + echo "VACUUM FULL complete." + psql -U synapse -d synapse -c "SELECT pg_size_pretty(pg_total_relation_size('state_groups_state'::regclass)) AS size;" +} set_admin () { admin=akadmin diff --git a/compose.compress-state.yml b/compose.compress-state.yml index 612578e..1ddd8e1 100644 --- a/compose.compress-state.yml +++ b/compose.compress-state.yml @@ -7,7 +7,7 @@ services: environment: - STATE_COMPRESS_CHUNK_SIZE=${STATE_COMPRESS_CHUNK_SIZE:-500} - STATE_COMPRESS_CHUNKS=${STATE_COMPRESS_CHUNKS:-100} - - STATE_COMPRESS_INTERVAL=${STATE_COMPRESS_INTERVAL:-86400} + - STATE_COMPRESS_SCHEDULE=${STATE_COMPRESS_SCHEDULE:-0 3 * * *} secrets: - db_password configs: diff --git a/compress_state_entrypoint.sh b/compress_state_entrypoint.sh index 2ed690f..7df067b 100644 --- a/compress_state_entrypoint.sh +++ b/compress_state_entrypoint.sh @@ -7,7 +7,7 @@ DB_PASS=$(cat /run/secrets/db_password) CONN="postgresql://synapse:${DB_PASS}@db:5432/synapse" CHUNK_SIZE="${STATE_COMPRESS_CHUNK_SIZE:-500}" CHUNKS="${STATE_COMPRESS_CHUNKS:-100}" -INTERVAL="${STATE_COMPRESS_INTERVAL:-86400}" +SCHEDULE="${STATE_COMPRESS_SCHEDULE:-0 3 * * *}" # Build from source if binary doesn't exist if [ ! -f "$BINARY" ]; then @@ -25,10 +25,22 @@ else echo "[compress-state] Using cached binary" fi -# Run compressor in a loop -while true; do - echo "[compress-state] Running at $(date)" - "$BINARY" -p "$CONN" -c "$CHUNK_SIZE" -n "$CHUNKS" || echo "[compress-state] Error: $?" - echo "[compress-state] Done. Sleeping ${INTERVAL}s" - sleep "$INTERVAL" -done +# Run once at startup +echo "[compress-state] Running initial compression at $(date)" +"$BINARY" -p "$CONN" -c "$CHUNK_SIZE" -n "$CHUNKS" || echo "[compress-state] Error: $?" + +# Set up cron job +CRON_SCRIPT="/build/run_compressor.sh" +cat > "$CRON_SCRIPT" <