2009-04-23 9 views
3

J'ai une application Web fonctionnant en mode cluster avec un équilibreur de charge. Il consiste en deux tomcats (T1 et T2) adressant un seul DB. T2 est nfs monté sur T1. C'est la seule différence entre les deux nœuds. J'ai une méthode Java générant des fichiers. Si la demande fonctionne sur T1 il n'y a pas de problème, mais si la demande est en cours d'exécution sur le noeud 2 je reçois une exception comme suit:java.io.IOException: argument non valide

java.io.IOException: Invalid argument 
     at java.io.FileOutputStream.close0(Native Method) 
     at java.io.FileOutputStream.close(FileOutputStream.java:279) 

Le code correspondant est le suivant:

for (int i = 0; i < dataFileList.size(); i++) { 
    outputFileName = outputFolder + fileNameList.get(i); 
    FileOutputStream fileOut = new FileOutputStream(outputFileName);       
    fileOut.write(dataFileList.get(i), 0, dataFileList.get(i).length); 
    fileOut.flush(); 
    fileOut.close(); 
} 

Le exception apparaît à la fileOut.close()

Une indication?

Luis

+1

Pouvez-vous écrire des fichiers normalement à partir du système d'exploitation de T2 (relatives à l'extérieur de Java.)? – Damo

+0

Oui, je peux. De plus, lorsque l'exception ninja jeté un fichier vide est généré. – Luixv

+0

Oui! Je peux écrire directement sur le système de fichiers à partir d'un shell. De plus. Un fichier vide est généré. – Luixv

Répondre

1

Enfin, j'ai trouvé la raison. D'abord, j'ai remarqué que PAS toujours cette exception vient au même point.

Parfois, était un java.io.IOException: Invalid argument à java.io.FileOutputStream.close0 (Native Method) à java.io.FileOutputStream.close (FileOutputStream.java:279) ^^^^^

et parfois était

java.io.IOException: Invalid argument 
    at java.io.FileOutputStream.writeBytes(Native Method) 
    at java.io.FileOutputStream.write(FileOutputStream.java:260) 

le problème est donc pas un problème de java. Pas même un problème NFS. Le problème est le type de système de fichiers sous-jacent qui est un système de fichiers DRBD .

Le test sur un shell pour écrire à travers les nœuds fonctionne si vous écrivez un petit fichier . À savoir:

au nfs monté noeud

cd /tmp 
date > /shared/path-to-some-not-mounted-dir/today 

will work 

mais

cat myBigFile > /shared/path-to-some-not-mounted-dir/today 

livrera l'erreur suivante

cat: write error: Invalid argument 

Par conséquent, la solution est d'utiliser un autre type de système de fichiers, gfs par exemple.

1

Quelle ne dataFileList et fileNameList obtenir? Vous pourriez manquer de descripteurs de fichiers. C'est étrange que cela arrive sur close(), cependant.

+0

Je génère un ou deux fichiers seulement. La chose la plus intéressante est que depuis le nœud qui est directement attaché il n'y a pas de problème (même volume), mais en essayant d'écrire sur le nœud qui est monté NFS, l'exception apparaît. – Luixv

3

La définition de cette ligne dans le .profile tranché la question:

ulimit –n 2048 
Questions connexes