Depuis plus de 12 mois notre serveur Synapse n'a pas été nettoyé, et il est devenu ingérable en terme d'espace occupé. La BDD fait 1.1To, les accès disque dessus commencent à saturer les SSD de aegir.
Cette issue documente les travaux en cours, étape par étape, pour servir de base à une automatisation de la plus grande partie possible des actions, au delà de ce qui est déjà fait par synatainer.
Edited
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information
Child items
0
Show closed items
No child items are currently assigned. Use child items to break down this issue into smaller parts.
Linked items
0
Link issues together to show that they're related.
Learn more.
Le volume de chaque table est imortant en particulier dans la situation où l'espace disponible global est < 100Go. On peut nettoyer une table, mais si elle fait plus que l'espace disponible, indexes compris, on ne pourra pas la vacuum facilement, donc récupérer de l'espace.
On dump les rooms et les users pour les analyses. Dumper dans un fichier permet d'éviter de spam l'API pour générer des rapports différents. On refait la requête à partir de l'API pour avoir des données fraiches une fois qu'on a fait le tour.
synadm GET 'v1/rooms?limit=999999' > rooms.jsonsynadm GET 'v2/users?limit=999999' > users.json
La logique est la suivante : il faut libérer de l'espace, d'abord à côté de state groups states pour pouvoir récupérer assez d'espace et ensuite vacuum les state groups.
On se concentre donc d'abord sur supprimer des rooms. Et pour supprimer des rooms il faut des rooms vides ou périmées, on commence donc par essayer de désactiver des utilisateurs. La première catégorie supprimée, les guests, est désactivée depuis 4 ans sur le serveur et ne sera bientôt plus supportée du tout.
La suppression nécessite l'appel à l'API de purge de room et le suivi de l'état de la purge. Heureusement un script synatainer fait déjà tout ça pour les rooms vides :
docker compose run --rm synatainer /usr/local/bin/purge_rooms_no_local_members.sh
Pour 500 rooms et vu l'état des state groups et des index associés, compter 2 à 3 jours :)
On supprime également quelques rooms très consommatrices de ressources, notamment de state groups.
select room_id, count(*) cnt from state_groups_state group by room_id order by cnt desc;
Parmi les rooms on repère dans le top 50 les candidats pour suppression simple :
synadm GET 'v1/rooms/!ping-v9:maunium.net' | jq
Puis on supprime :
synadm DELETE 'v2/rooms/!ping-v9:maunium.net' -d '{"message":"Room is too big for this HS", "block": true, "purge": true}'
La suppression de chaque room de ce type prend plusieurs heures au début. L'impact est notable après quelques étapes, en particulier sur les state groups :
matrix=# select count(*) from state_groups_state; count------------ 1425558248
Compression systématique des state groups. En attendant d'avoir récupéré suffisamment de place pour vacuum les state groups, on commence par en diminuer le nombre. Notamment en compressant leur structure grâce à l'outil de compression synapse_compress_state embarqué dans l'image synatainer.
On dump la liste des rooms ids :
synadm GET 'v1/rooms?limit=99999' | jq '.rooms[]|.room_id' -r > rooms
On charge la liste dans l'image synatainer et on y ouvre un shell (on évite le run et la création du conteneur pour chaque room), puis :
for r in $(cat rooms); do date; synapse_compress_state -p "postgresql://$DB_USER:$PGPASSWORD@[$DB_HOST]/$DBNAME" -r "$r"; echo; done