2009-04-23 111 views
3

我有一個運行在集羣模式下的負載均衡器的Web應用程序。 它包含兩個tomcat(T1和T2),只處理一個數據庫。 T2是nfs安裝到T1。這是兩個節點之間唯一的dofference。java.io.IOException:無效的參數

我有一個java方法生成一些文件。如果請求的T1 運行是沒有問題的,但如果該請求是在節點2 運行我得到一個異常如下:

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

相應的代碼如下:

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(); 
} 

的異常出現在fileOut.close()

任何提示?

路易斯

+1

是否可以從T2(即Java的之外)的操作系統通常寫文件? – Damo 2009-04-23 08:47:43

+0

是的,我可以。而且,當產生一個空文件時會產生錯誤。 – Luixv 2009-04-23 14:07:43

回答

1

最後我找到了原因。 首先我注意到並不總是這個例外來自 在同一點。

有時是 java.io.IOException異常:無效的參數 在java.io.FileOutputStream.close0(本機方法) 在java.io.FileOutputStream.close(FileOutputStream.java:279) ^^^^^

有時呈

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

因此,問題是不是Java問題。甚至沒有NFS問題。 問題的底層文件系統類型,它是DRBD 文件系統。

如果有人正在編寫一個小的 文件,那麼在外殼上進行跨節點寫操作的測試工作。即:

在NFS安裝節點

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

will work 

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

將提供以下錯誤

cat: write error: Invalid argument 

因此,解決方案是使用其他類型的文件系統,例如gfs。

1

多大做dataFileList和fileNameList得到什麼?您可能會耗盡文件描述符。雖然它發生在close()上很奇怪。

3

設置在.profile這行解決了這個問題:

ulimit –n 2048