Verrous de fichiers et transactions

J’écris un pipeline très simple pour le traitement des fichiers téléchargés et j’ai choisi de conserver l’état du pipeline sur le système de fichiers au lieu d’une firebase database. Le pipeline lui-même est très simple car les fichiers sont traités dans des emplacements temporaires, puis déplacés de manière atomique dans un dossier indiquant qu’une étape spécifique du pipeline est terminée. Une fois le fichier déplacé dans un dossier pour l’étape suivante, le fichier de l’étape précédente est supprimé. Le pipeline est un processus unique et il n’y en a qu’un seul actif à la fois, il n’y a donc pas de conditions de concurrence ou de scénarios de panne à prendre en compte. Au pire, nous répétons le travail effectué précédemment et gaspillons de l’espace disque.

Les problèmes sont à la toute première étape du pipeline. Le serveur qui gère le téléchargement du fichier déplace les fichiers dans un dossier spécifique pour le rendre accessible aux clients, tout en créant un lien symbolique dans un autre dossier pour indiquer au processus de pipeline qu’il y a du travail à faire. Comme il y a une condition de concurrence ici, j’utilise des verrous de fichiers pour créer et supprimer les liens symboliques. Le processus de pipeline verrouille le lien symbolique, traite le fichier, supprime le lien symbolique et libère le verrou. Le processus de téléchargement fait la même chose, sauf qu’il le fait pour créer le lien symbolique. Cela prend en compte la condition de concurrence entre la suppression du lien symbolique et sa création, mais il y a encore un bogue ici.

Il est possible que le processus de téléchargement se bloque après la mise en place du fichier, mais avant de créer le lien symbolique pour indiquer qu’un fichier doit être traité. J’aimerais savoir quelle est la meilleure façon de gérer ce cas. Je peux en théorie créer un fichier au début du processus de téléchargement puis le supprimer lors de la création réussie du lien symbolique pour indiquer la création réussie du lien symbolique, mais cela entraîne à nouveau les mêmes problèmes de locking. se coordonner entre eux.

Existe-t-il un moyen plus simple de gérer le cas du processus de téléchargement bloqué?

L’approche habituelle de ce type de problème consiste à rechercher les fichiers “périmés”.

Si un fichier de locking a une date de modification supérieure à X secondes, vous supposez que le processus qui l’a créé est mort et supprimez-le.

Si un fichier de données a une date de modification supérieure à X secondes, vous supposez que le processus qui l’a créé est mort et supprimez-le.

Si vous voulez être vraiment en sécurité et que les fichiers ne sont pas particulièrement volumineux, vous pouvez faire en sorte que X soit quelque chose de ridicule comme une journée (60 * 60 * 24 secondes).