2 votes

Dois-je m'inquiéter des conditions de course avec le transfert/traitement SFTP ?

Scénario :

J'utilise SFTP pour transférer automatiquement des fichiers entre deux systèmes, A et B.

Le système A exécute un serveur SFTP. Le système A interroge périodiquement (disons une fois par minute) son répertoire SFTP local pour vérifier l'existence de fichiers *.dat, et s'il les trouve, les importe et les supprime.

Le système B génère des fichiers *.dat, et au fur et à mesure qu'ils sont générés, les envoie au système A en se connectant à cet hôte SFTP et en les téléchargeant.

Questions :

  1. Est-il possible que le système A voie et commence à traiter un fichier avant que le système B ait fini de le télécharger ? Ou SFTP empêchera-t-il cela d'une manière ou d'une autre, par exemple en ne déposant pas les fichiers dans le dossier avant la fin du transfert réseau ?

  2. Est-il raisonnable/recommandé que le système B télécharge sous un autre nom de fichier tel que *.locked ou *.part, puis renomme en *.dat une fois le transfert réseau terminé ? Ou existe-t-il une meilleure façon de procéder ?

1voto

michaelkrieger Points 216

Il ne s'agit pas d'une condition de course par définition, mais il est possible qu'un fichier, partiellement téléchargé, soit ouvert à la lecture par le système A et contienne donc des données invalides. Le système A pourrait vérifier la cohérence du fichier, tester une taille fixe le cas échéant, tester certaines autorisations de fichiers (que vous définissez après le téléchargement) et, dans tous les cas, différer l'ouverture du fichier au cas où les conditions ne seraient pas remplies, en le faisant à la prochaine itération.

Je téléchargerais vers un nom de fichier ou un emplacement temporaire, puis renommerais/déplacerais vers le dossier/extension correct pour votre programme. Par exemple, télécharger vers nomfichier.part puis renommer vers nomfichier.dat ou télécharger vers en attente/nomfichier.dat puis déplacer hors du dossier en attente. Cela résoudra tous ces problèmes. Sur les systèmes UNIX/Linux et Windows, une opération de déplacement (ou de renommage) sera atomique et vous n'obtiendrez jamais un fichier partiel.

Il n'y a pas vraiment de meilleure façon de gérer cela. Vous avez besoin de communiquer au système A que le fichier n'est pas complet et vous n'avez pas de communication inter-processus établie entre les systèmes. Vos options sont d'utiliser un fichier de verrouillage pour empêcher votre programme d'ouvrir le fichier (et de le supprimer plus tard), d'utiliser un fichier temporaire (et ensuite de renommer/déplacer votre fichier au nom approprié), ou de faire une sorte de contrôle d'intégrité (ce qui est probablement un gaspillage de ressources).

Vous pourriez également envisager, en fonction de la fréquence à laquelle cela se produit, de déclencher le Système A à partir du Système B. Si un fichier est présent 99% du temps, la manière que vous proposez déjà (avec un verrou) est probablement la plus efficace. D'un autre côté, si vous ne trouvez des données qu'occasionnellement, cela peut être un gaspillage de ressources (et nécessiter un programme long ou déclenché par cron). Si vous avez SFTP, vous avez peut-être un accès SSH. Dans ce cas, configurez des certificats entre le système (pour éviter le besoin de mots de passe, voir ssh-copy-id) et exécutez une version modifiée de

ssh système_a.votredomaine.com 'processfile /home/utilisateur/data/*.dat' (fichier de traitement)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X