Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[gn_commons] Questionnements sur la synchronisation des médias #2436

Closed
mvergez opened this issue Mar 27, 2023 · 6 comments
Closed

[gn_commons] Questionnements sur la synchronisation des médias #2436

mvergez opened this issue Mar 27, 2023 · 6 comments

Comments

@mvergez
Copy link
Contributor

mvergez commented Mar 27, 2023

Contexte

Dans le cadre d'une prestation avec l'ARB île de France, nous nous sommes posés des questions sur le traitement des média sur le système de fichier du serveur.

Explications

A chaque insertion ou modification d'un média, une requête POST/PUT est émise à la route /media qui ensuite fait appel entre autres à cette fonction :

TMediumRepository.sync_medias()

Qui est située ici :

Si je ne dis pas de bêtises, lorsque cette fonction est appelée, tous les fichiers médias présents dans leur dossier de stockage sont recherchés :

for (repertoire, sous_repertoires, fichiers) in os.walk(search_path):

Et ces derniers sont éventuellement renommés en deleted_ s'ils n'existent plus en base.

Problématique

A chaque création ou modification d'un seul média, tous les fichiers présents sur le système de fichiers sont "traités", ce qui peut être un processus long quand il y a beaucoup de média.

Question

Pensez-vous qu'il serait possible de revoir cette synchronisation en ne la faisant que sur l'objet effectivement traité ?

Potentielles solutions

Il serait possible d'utiliser un hook sqlalchemy de type post_delete/post_insert/post_update (doc SQLAlchemy) ou quelque chose du genre pour traiter le fichier directement lors de sa modification en base.
Nous faisons cela sur d'autres projets pour gérer le lien entre la base de données et un système de stockage s3 et cela fonctionne plutôt bien. Ce sont néanmoins des cas plus simples que GeoNature...

Peut-être d'autres solutions sont possibles.


Merci d'avance pour vos retours !

@joelclems
Copy link
Contributor

Le but de la fonction sync media est de faire du nettoyage sur les medias

  • supprimer les médias sans uuid_attached_row et plus vieux que 24h
  • supprimer les médias dont l'object attaché n'existe plus

elle n'a pas forcement besoin d'être appellée à chaque insert/ update de media et elle pourrait n'être appellée qu'une fois par jour avec celery_beat

Pour info il existe un hook dans app.py pour supprimer le fichier media quand la ligne est supprimée dans TMedia

# For deleting files on "delete" media
@before_models_committed.connect_via(app)
def on_before_models_committed(sender, changes):
for obj, change in changes:
if change == "delete" and hasattr(obj, "__before_commit_delete__"):
obj.__before_commit_delete__()

@camillemonchicourt
Copy link
Member

En effet, il ne faudrait pas appeler cette commande de nettoyage des médias orphelins à chaque ajout ou modification d'un média, pour ne pas alourdir cette opération.
Et du coup renommer cette commande sync_media en clean_attachments je pense.

@mvergez
Copy link
Contributor Author

mvergez commented Mar 27, 2023

Merci beaucoup pour vos retours et ces explications !
Et donc pour bien comprendre pour l'uuid_attached_row : dans quel cas un media peut se retrouver sans uuid_attached_row ? Et pourquoi traiter ceux qui sont plus vieux que 24h ?
Merci d'avance pour vos explications !

@joelclems
Copy link
Contributor

Par exemple dans monitoring, quand on crée un site on peut lui attacher des medias

on va uploader et enregister les medias
puis on va valider et enregistrer le site

si on a validé les medias et qu'on a arreté avant de valider le site le ou les medias n'auront pas d'uuid_attached_row

24h c'est arbitraire pour laisser le temps de valider apres avoir saisi les medias

en ce qui concerne les fichiers orphelin, cela peut arriver si l'on supprime des medias en bdd directement

@mvergez
Copy link
Contributor Author

mvergez commented Mar 27, 2023

Ah oui je comprends, c'est parce que les médias sont uploadés avant de valider la création d'un objet attaché.

Merci en tout cas pour ces explications @joelclems ! Si j'ai un peu de temps j'essaierai d'ouvrir une PR qui va dans ce sens !

@camillemonchicourt
Copy link
Member

Intégré dans la 2.13.0.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants