2010-04-21 22 views
1

Donc le merveilleux bas sur cette doozie d'un problème:Comment faire pour arrêter une erreur IOException en utilisant tout en utilisant une combinaison de jython, pyro et ant?

version courte: Nous construisons un système de distribution pour ce logiciel que nous utilisons. Fondamentalement, nous retirons l'artefact de construction, le stockons sur un serveur ftp qui le transmet à plusieurs clients qui exécutent des scripts pour patcher leurs serveurs.

version longue:

1 serveur de distribution

plusieurs serveurs clients

logiciel: Jython 2.5.1, 1.8.0 ant, pyro 3.10

Le serveur de distribution a un serveur FTP et un client PYRO fonctionnant dessus. Chaque serveur client est équipé d'un serveur PRYO.

Lorsque le client PYRO est invité à démarrer la procédure de correctif, il lit une liste de machines qui contient une liste de tous les serveurs clients. Puis se connecte à chacun des serveurs PYRO un par un et exécute la procédure de patch. La procédure est: getPatch (obtient le dernier correctif pour ce serveur), StopServer (arrête le logiciel qui peut ou ne peut pas accéder à ce qui doit être corrigé), Apply patch, StartServer. Chacun des processus appelle un script ANT qui passe avec certains noms de dossier et d'autres passes de configuration. La partie amusante arrive quand vous allez appliquer le patch. Voir ci-dessous pour le journal des erreurs. J'ai dû supprimer les noms de dossier pour des raisons de NDA.

C'est là que ça devient intéressant. Exécuter chaque section de la procédure individuellement. c'est-à-dire exécuter getPatch, StopServer, etc. un à la fois manuellement. Ce bug ne se produit pas. Physiquement goign à la machine et en cours d'exécution les processus ne se produisent pas. Seulement quand nous appelons tous les 4 processus les uns après les autres. Il se produit pendant la phase ApplyPatch lorsqu'un script de remplacement ANT est appelé sur plusieurs fichiers. Nous pensons que cela pourrait avoir quelque chose à voir avec le fait que la JVM conserve le fichier pendant une fraction de seconde ou deux. Cependant, cela doit être corrigé en fonction des notes de bogue sur la fourmi.

si bref:

serveur de distribution ==> Jython ==> Connexion pyro ==> serveur client ==> Jython ==> script fourmi

Error Log:

<*snip>\ant\deploy.xml:12: IOException in <*snip>\bin\startGs.sh - java.io.IOException:Failed to delete <*snip>\bin\rep4698373081723114968.tmp while trying to rename it. 
    at org.apache.tools.ant.taskdefs.Replace.processFile(Replace.java:709) 
    at org.apache.tools.ant.taskdefs.Replace.execute(Replace.java:548) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:398) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.Target.execute(Target.java:390) 
    at org.apache.tools.ant.Target.performTasks(Target.java:411) 
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1360) 
    at org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:38) 
    at org.apache.tools.ant.Project.executeTargets(Project.java:1212) 
    at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:441) 
    at org.apache.tools.ant.taskdefs.SubAnt.execute(SubAnt.java:302) 
    at org.apache.tools.ant.taskdefs.SubAnt.execute(SubAnt.java:221) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.Target.execute(Target.java:390) 
    at org.apache.tools.ant.Target.performTasks(Target.java:411) 
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1360) 
    at org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:38) 
    at org.apache.tools.ant.Project.executeTargets(Project.java:1212) 
    at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:441) 
    at org.apache.tools.ant.Extaskdefs.SubAnt.execute(SubAnt.java:302) 
    at org.apache.tools.ant.taskdefs.SubAnt.execute(SubAnt.java:221) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:398) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 
    at net.sf.antcontrib.logic.IfTask.execute(IfTask.java:197) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.TaskAdapter.execute(TaskAdapter.java:154) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.Target.execute(Target.java:390) 
    at org.apache.tools.ant.Target.performTasks(Target.java:411) 
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1360) 
    at org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:38) 
    at org.apache.tools.ant.Project.executeTargets(Project.java:1212) 
    at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:441) 
    at org.apache.tools.ant.taskdefs.SubAnt.execute(SubAnt.java:302) 
    at org.apache.tools.ant.taskdefs.SubAnt.execute(SubAnt.java:221) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 

il à org.apache.tools.ant.Task.perform (Task.java:348) à org.apache.tools.ant.taskdefs.MacroInstance.execute (MacroInstance.java:398) à org.apache.tools .ant.UnknownElement.execute (UnknownElement.java:291) à sun.reflect.NativeMethodAccessorImpl.invoke0 (Méthode natif) à sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) à sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) à java.lang .reflect.Method.invoke (Method.java:597) à org.apache.tools.ant.dispatch.DispatchUtils.execute (DispatchUtils.java:106) à org.apache.tools.ant.Task.perform (tâche .java: 348) à org.apache.tools.ant.taskdefs.Sequential.execute (Sequential.java:68) à org.apache.tools.ant.UnknownElement.execute (UnknownElement.java:291) au soleil Réfléchissez.NativeMethodAccessorImpl.invoke0 (méthode native) à sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) à sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) à java.lang.reflect.Method.invoke (Method.java:597) à org.apache. tools.ant.dispatch.DispatchUtils.execute (DispatchUtils.java:106) à org.apache.tools.ant.Task.perform (Task.java:348) à org.apache.tools.ant.taskdefs.MacroInstance. exécuter (MacroInstance.java:398) à sun.reflect.NativeMethodAccessorImpl.invoke0 (Méthode natif) à sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) à sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java : 25) à java.lang.reflect.Method.invoke (Method.ja va: 597) à org.apache.tools.ant.dispatch.DispatchUtils.execute (DispatchUtils.java:106) à org.apache.tools.ant.Task.perform (Task.java:348) à org. apache.tools.ant.taskdefs.Parallel $ TaskRunnable.run (Parallel.java:433) at java.lang.Thread.run (Thread.java:619) Causé par: java.io.IOException: Impossible de supprimer < * snip> \ bin \ rep4698373081723114968.tmp en essayant de le renommer. à org.apache.tools.ant.util.FileUtils.rename (FileUtils.java:1248) à org.apache.tools.ant.taskdefs.Replace.processFile (Replace.java:702) ... 125 plus

Toute aide serait appréciée.

Répondre

1

Il semble que c'est le FTP qui pose problème. Il garde un verrou via jython sur les dossiers individuels. Ainsi, lorsqu'un nouveau fichier est introduit, il le verrouille dans un état non délétable. Vous pouvez toujours modifier le fichier, c'est-à-dire exécuter un script de remplacement. Cependant, vous ne pouvez pas le supprimer. Aller travailler sur une implémentation différente du ftp. c'est-à-dire utiliser la version de java/jython plutôt que la fourmi.

+0

s'avère que ce n'était pas le ftp. bug merveilleux où la fourmi verrouillerait les scripts de remplacement si le remplacement avait déjà été appelé sur un ensemble de fichiers. en détail: Si un script externe appelle 2 scripts ant et que les deux scripts ant appellent un remplacement sur les mêmes dossiers, le second script de remplacement échouera car il ne peut pas détecter que le premier a été exécuté. En remarque, il semble que Ant ne nettoie pas ses fichiers temporaires tant que le script Ant actuel n'est pas terminé. – Kelso