2008-10-13 7 views
2

Un script python exécute deux processus python parallèles (créés via os.fork()), chacun d'entre eux essayant finalement d'extraire une feuille de dépôt de subversion dans le même répertoire de copie de travail. Avant d'exécuter la commande 'svn co ...' dans un sous-processus (via le module de sous-processus python), le code python parent vérifie si le répertoire de copie de travail existe déjà. Donc, si cela est le cas, il ne devrait pas y avoir de 'svn co' en cours d'exécution, mais plutôt un retour immédiat de la fonction parente.Comment savoir si le répertoire de travail subversion est verrouillé par svn?

Néanmoins, une collision s'est produite et l'un des processus python a échoué sur 'svn co ..' avec l'erreur suivante.

checked-out failed: svn: Working copy '/tmp/qm_23683' locked 
svn: run 'svn cleanup' to remove locks (type 'svn help cleanup' for details)** 

La première question est pourquoi la copie de travail dir vérification de l'existence ne fonctionnait pas et le second - est-il un moyen de savoir qu'une copie de travail dir est verrouillé par svn et la boucle jusqu'à ce qu'il soit déverrouillé?

Merci.

Répondre

2

Cela ressemble à une condition de course potentiel, que quelque chose comme ce qui suit peut se produire:

  1. Processus contrôles A pour voir si le répertoire existe (il ne fonctionne pas encore).
  2. Le processus B vérifie si le répertoire existe (il ne l'est pas encore). Le processus A appelle svn, ce qui crée le répertoire.
  3. Le processus B appelle svn, qui échoue par la suite.

Un moyen facile d'éviter cela est d'avoir chaque tentative de processus créer le répertoire plutôt que de vérifier son existence. Si l'autre processus a déjà créé le répertoire, l'autre processus est garanti pour obtenir un code d'erreur bien défini sous une très grande variété de plates-formes et de systèmes de fichiers. Par exemple, c'est l'un des seuls moyens fiables de faire de la synchronisation sur de nombreuses implémentations de NFS. Heureusement, svn s'en moquera si le répertoire de travail existe déjà.

Le code Python ressemblerait à quelque chose comme ceci:

import os, errno 

# ... 

try: 
    os.mkdir(dirName) 
except OSError, e: 
    if e.errno != errno.EEXIST: raise # some other error 
    print 'Directory already exists.' 
else: 
    print 'Successfully created new directory.' 

Cette technique est facile à mettre en œuvre, très fiable et utile dans une grande variété de situations.

4

Dans le répertoire, il devrait y avoir un répertoire appelé '.svn'. Dans ce cas, un fichier nommé 'locked' indique que le répertoire est verrouillé.

Questions connexes