Question

Je suis en cours d'exécution d'un travail scientifique intensif très informatiquement qui crache sur les résultats chaque maintenant et puis. Le travail est fondamentalement juste simuler la même chose tout un tas de fois, il est donc divisé entre plusieurs ordinateurs, qui utilisent différents systèmes d'exploitation. Je voudrais diriger la sortie de tous ces cas, le même fichier, puisque tous les ordinateurs peuvent voir le même système de fichiers via NFS / Samba. Voici les contraintes:

  1. doit permettre concomitantes sûr y ajouter ses. Doit bloquer si une autre instance sur un autre ordinateur est actuellement au Annexer des fichiers.
  2. performance ne pas count. E / S pour chaque instance est seulement quelques octets par minute.
  3. La simplicité ne compte. Le point entier de cette (en plus de la curiosité pure) est si je peux cesser d'avoir tous les cas écrire dans un fichier différent et fusionnant manuellement ces fichiers ensemble.
  4. ne doit pas dépendre des détails du système de fichiers. Doit travailler avec un système de fichiers inconnu sur un montage NFS ou Samba.

La langue que je utilise est D, dans le cas qui compte. Je l'ai regardé, il n'y a rien dans la norme lib qui semble faire. Les deux D-spécifiques et générales, les réponses de langue agnostique sont tout à fait acceptables et appréciés.

Était-ce utile?

La solution

-Root Vous faites face à des problèmes avec la mise en cache côté client et des données périmées. J'ai écrit un module de verrouillage indépendant OS pour fonctionner sur NFS avant. L'idée simple de créer un fichier .lock [datafile] ne fonctionne pas sur NFS. L'idée de base de travailler autour d'elle est de créer un fichier de verrouillage [datafile] .lock qui, si présent signifie fichier n'est pas verrouillé et un processus qui veut acquérir un verrou renomme le fichier à un nom différent, comme [datafile] .lock. [ nom d'hôte]. [pid]. Le changement de nom est une opération assez atomique qui fonctionne assez bien sur NFS pour garantir l'exclusivité de la serrure. Le reste est essentiellement un groupe de fail safe, des boucles, la vérification des erreurs et de récupération en cas de verrouillage du processus meurt avant de libérer le verrou et renommer le fichier de verrouillage de retour à [fichier de données] .lock

Autres conseils

La solution classique consiste à utiliser un fichier de verrouillage, ou plus exactement un répertoire de verrouillage. Sur tous les systèmes d'exploitation commune la création d'un répertoire est une opération atomique si la routine est:

  • essayer de créer un répertoire de verrouillage avec un nom fixe dans un emplacement fixe
  • si l'Echec de création, attendez une seconde ou et essayez à nouveau - répéter jusqu'à ce que le succès
  • écrire vos données dans le fichier de données réelles
  • supprimer le répertoire de verrouillage

Cela a été utilisé par des applications telles que CVS depuis de nombreuses années dans de nombreuses plates-formes. Le seul problème se produit dans les rares cas où votre application se bloque lors de l'écriture et avant de retirer le verrou.

Pourquoi ne pas simplement construire un simple serveur qui se trouve entre le fichier et les autres ordinateurs?

Alors si vous avez toujours voulu changer le format de données, vous ne devez modifier le serveur, et non tous les clients.

À mon avis la construction d'un serveur serait beaucoup plus facile que d'essayer d'utiliser un système de fichiers réseau.

Fichier de verrouillage avec une touche

Comme d'autres réponses ont mentionné, la méthode la plus simple est de créer un fichier de verrouillage dans le même répertoire que le fichier de données.

Puisque vous voulez être en mesure d'accéder au même fichier sur plusieurs PC la meilleure solution que je peux penser est juste inclure l'identifiant de la machine en train d'écrire dans le fichier de données.

Ainsi, la séquence d'écriture dans le fichier de données serait:

  1. Vérifiez s'il y a un fichier présent de verrouillage

  2. S'il y a un fichier de verrouillage, voir si je suis celui de posséder en vérifiant que son contenu a mon identifiant.
    Si tel est le cas, il suffit d'écrire dans le fichier de données puis supprimez le fichier de verrouillage.
    Si ce n'est pas le cas, attendez une seconde ou une petite longueur de temps aléatoire et essayez à nouveau le cycle.

  3. S'il n'y a pas de fichier de verrouillage, créez un avec mon identifiant et essayer le cycle à nouveau pour éviter la condition de course (re-vérifier que le fichier de verrouillage est vraiment le mien).

En plus de l'identifiant, j'enregistrerait un horodatage dans le fichier de verrouillage et vérifier si elle est plus qu'une valeur de délai donné.
Si l'horodatage est trop vieux, alors supposer que le fichier de verrouillage est obsolète et juste le supprimer car il Mea l'un des PC écrit au fichier de données peut être écrasé ou sa connexion a été perdue.

Une autre solution

Si vous êtes en contrôle le format du fichier de données, pourrait être de réserver une structure au début du fichier pour enregistrer s'il est verrouillé ou non.
Si vous réservez juste un octet à cet effet, vous pouvez supposer, par exemple, que signifierait le 00 fichier de données ne sont pas verrouillés, et que d'autres valeurs représenterait l'identifiant de la machine en train d'écrire à elle.

Problèmes avec NFS

OK, j'ajoute quelques choses parce que Jiri Klouda a à juste titre que utilise NFS mise en cache côté client qui se traduira dans le fichier de verrouillage réel étant dans un état indéterminé.

Quelques façons de résoudre ce problème:

scroll top