IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Gestion concurrente fichier - processus indépendant


Sujet :

C

  1. #1
    Membre chevronné Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    mars 2009
    Messages
    1 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : mars 2009
    Messages : 1 021
    Points : 2 053
    Points
    2 053
    Par défaut Gestion concurrente fichier - processus indépendant
    Bonjour,

    Je me trouve dans un situation assez complexe.

    Pour faire simple, j'ai plusieurs machines (debian 7 et 8) qui sont chacune connecté au même NAS.
    Chacune de ses machine exécute le même code.
    Le code à pour effet de mettre des fichiers sur le NAS, dans un dossier.

    Seulement voila, au bout d'un moment, le NAS sature (normal).
    J'ai donc besoin qu'une des machines connecté au NAS puisse le nettoyer.
    Les machines ne peuvent ni communiquer entre elles ni même se voir (même via le NAS).

    Comment puis-je faire en sorte qu'une machine "prenne la main" et se charge de nettoyer pendant que les autres attendent ?
    Ma problématique réside surtout dans le fait que si la machine qui a pris la mai tombe en panne, une autre dois prendre la main et continuer le travail.

    J'ai pensé, puisque je ne peux pas communiquer entre les machine via des pipe ou autre, à créé un fichier qui indique la machine qui a pris la main.
    Seulement voila, l’exécution du code est ordonnancé pour se déclencher à heure fixe, donc il y a un risque élevé que le fichier soit lu et/ou écrit en même temps.

    Donc, je me suis dit qu'il fallait mettre une protection sur ce fichier pour qu'une seule des machines puisse l'ouvrir.
    J'ai donc essayé de me diriger vers les semaphore/mutex mais cela ne peut fonctionner car il faut, si j'ai bien compris, une communication inter-processus (voir même que les processus soit fil-parent).

    Ma question final est : comment gérer l’accès concurrent à un fichier pour N processus qui ne peuvent pas communiquer entre eux, qui sont totalement indépendant ?

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    5 153
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 5 153
    Points : 16 965
    Points
    16 965
    Par défaut
    Voici une piste possible:

    Un lock peut aussi se poser en créant une socket en écoute sur un port quelconque.
    C'est comme cela que font la plupart des programmes qui bloque l'exécution multiple.

    Il suffit d'essayer d'écouter sur le port choisi. Si c'est possible, personne n'est dessus.

    Je ne sais c'est exploitable dans ton cas, mais c'est un début.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    juin 2007
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 4 072
    Points : 7 161
    Points
    7 161
    Par défaut
    Voici une idée possible : sur le NAS, créer un répertoire dédié à la création des fichiers de synchronisation.
    Plaçons-nous du point de vue d'une machine qui souhaite faire le nettoyage. Elle commence par regarder dans le répertoire du NAS si un fichier existe. S'il existe, une autre machine fait déjà le ménage.
    Sinon, elle créé un fichier nommé avec son adresse IP (en supposant que toutes les machines soient sur le même réseau). Sinon il faut fabriquer un identifiant unique de la machine en utilisant une adresse MAC par exemple (si les adresses MAC n'ont pas été modifiées) ou avec le nom de la machine (si on est sûr que tous les noms sont uniques entre eux), enfin bref, trouver un identifiant unique pour nommer le fichier.
    Après création du fichier, elle fait une pause de 5 secondes (c'est arbitraire, on pourrait imaginer une pause aléatoire entre 5 et 10s, ou n'importe quel autre calcul en fonction de la topologie réseau) histoire de laisser respirer tout le monde (latence réseau, surcharge du NAS...).
    Puis elle liste les fichiers du répertoire par ordre de dernière modification croissante. Si le premier fichier est le sien, alors c'est parti pour le nettoyage. Sinon elle supprime son fichier.

    Maintenant se pose la question d'un plantage du programme de nettoyage. Tu n'as donné aucun chiffre ou échelle de temps sur la fréquence et le temps de nettoyage, je fais donc des suppositions et tu n'auras qu'à adapter les différents temps.
    Le programme de nettoyage va faire un "touch" du fichier sur le NAS toutes les 10 minutes (commande linux. Si pas disponible, alors écrire un octet dans le fichier, mais comme je ne sais pas comment tu accèdes à tes fichiers sur le NAS...). Lorsque le nettoyage est terminé, il va supprimer son fichier.

    Une autre machine, qui ne fait pas le nettoyage car elle a été moins rapide, va observer la date de modification du fichier de l'autre machine. S'il n'est pas modifié depuis plus de 20 minutes, il suppose que le programme sur l'autre machine a planté et supprime le fichier. A partir d'ici, la machine recommence la procédure depuis le début avec création de son propre fichier... etc...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  4. #4
    Membre chevronné Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    mars 2009
    Messages
    1 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : mars 2009
    Messages : 1 021
    Points : 2 053
    Points
    2 053
    Par défaut
    Hello,

    Merci à vous deux.

    J'ai adoré l’algorithme que tu m'as présenté dinobogan.
    Je suis désolé de ne pas avoir été plus explicite sur le temps de nettoyage et de détection du plantage.
    En tous cas, cela répond entièrement à mon problème et même plus car il n'y a plus de problème d'accès concurrent.

    Je mets cela dans un coin, car je ne peux pas tester encore (n'ayant pas un environnement pour), mais au moins théoriquement tout est parfait.
    Je mets en résolu et vous souhaite une bonne soirée !

    Merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. gestion de fichier à partir d'un formulaire
    Par seb59dk dans le forum Access
    Réponses: 3
    Dernier message: 06/09/2005, 16h52
  2. Fonctions de gestion de fichiers
    Par sebduth dans le forum Fortran
    Réponses: 4
    Dernier message: 22/08/2005, 10h38
  3. [STRUTS] fichier properties indépendant
    Par meufeu dans le forum Struts 1
    Réponses: 5
    Dernier message: 28/07/2004, 16h10
  4. [JDOM] Gestion "gros fichiers"
    Par Haazheel dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 17/10/2003, 13h42
  5. [Concept] BD ou Gestion par fichier. Intérêt de la BD ?
    Par Cian dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/11/2002, 12h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo