Reputation: 2213
I use library which download torrents. But today some error happened (log):
And so on, log continues. I found that this file exists and here is a part of code where error happens:
Could not create temp files
java.io.IOException: Invalid argument
at java.io.RandomAccessFile.setLength(Native Method)
at jBittorrentAPI.DownloadManager.checkTempFiles(DownloadManager.java:261)
at jBittorrentAPI.DownloadManager.(DownloadManager.java:108)
at torrentstealer.DownloadTorrent.run(DownloadTorrent.java:65)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Could not create temp files
java.io.IOException: Invalid argument
at java.io.RandomAccessFile.setLength(Native Method)
at jBittorrentAPI.DownloadManager.checkTempFiles(DownloadManager.java:261)
at jBittorrentAPI.DownloadManager.(DownloadManager.java:108)
at torrentstealer.DownloadTorrent.run(DownloadTorrent.java:65)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Could not create temp files
java.io.IOException: Invalid argument
at java.io.RandomAccessFile.setLength(Native Method)
at jBittorrentAPI.DownloadManager.checkTempFiles(DownloadManager.java:261)
at jBittorrentAPI.DownloadManager.(DownloadManager.java:108)
at torrentstealer.DownloadTorrent.run(DownloadTorrent.java:65)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Could not create temp files
java.io.IOException: Invalid argument
at java.io.RandomAccessFile.setLength(Native Method)
at jBittorrentAPI.DownloadManager.checkTempFiles(DownloadManager.java:261)
at jBittorrentAPI.DownloadManager.(DownloadManager.java:108)
at torrentstealer.DownloadTorrent.run(DownloadTorrent.java:65)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Could not create temp files
java.io.FileNotFoundException: /root/TorrentStealer/downloads/MAME - Update ROMs (v0.141 to v0.141u2)/lah_l104.zip (Too many open files)
at java.io.RandomAccessFile.open(Native Method)
at java.io.RandomAccessFile.(RandomAccessFile.java:212)
at jBittorrentAPI.DownloadManager.checkTempFiles(DownloadManager.java:260)
at jBittorrentAPI.DownloadManager.(DownloadManager.java:108)
at torrentstealer.DownloadTorrent.run(DownloadTorrent.java:65)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Could not create temp files
java.io.FileNotFoundException: /root/TorrentStealer/downloads/Degrassi.Junior.High.S01-S03.INTERNAL.DVDRip.XviD-FFNDVD/Degrassi.Junior.High.S01.INTERNAL.DVDRip.XviD-FFNDVDDegrassi.Junior.High.S01E10.INTERNAL.DVDRip.XviD-FFNDVDdegrassi.junior.high.s01e10.internal.dvdrip.xvid-ffndvd.r10 (Too many open files)
at java.io.RandomAccessFile.open(Native Method)
at java.io.RandomAccessFile.(RandomAccessFile.java:212)
at jBittorrentAPI.DownloadManager.checkTempFiles(DownloadManager.java:260)
at jBittorrentAPI.DownloadManager.(DownloadManager.java:108)
at torrentstealer.DownloadTorrent.run(DownloadTorrent.java:65)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Could not create temp files
java.io.FileNotFoundException: /root/TorrentStealer/downloads/MAME - Update ROMs (v0.141 to v0.141u2)/lah_l108.zip (Too many open files)
at java.io.RandomAccessFile.open(Native Method)
at java.io.RandomAccessFile.(RandomAccessFile.java:212)
at jBittorrentAPI.DownloadManager.checkTempFiles(DownloadManager.java:260)
at jBittorrentAPI.DownloadManager.(DownloadManager.java:108)
at torrentstealer.DownloadTorrent.run(DownloadTorrent.java:65)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Which called here:
/**
* Check the existence of the files specified in the torrent and if necessary,
* create them
*
* @return int
* @todo Should return an integer representing some error message...
*/
public synchronized int checkTempFiles() {
String saveas = Constants.SAVEPATH; // Should be configurable
if (this.nbOfFiles > 1)
saveas += this.torrent.saveAs + "/";
else
{
this.torrent.saveAs = this.torrent.name.get(0).toString();
}
new File(saveas).mkdirs();
for (int i = 0; i < this.nbOfFiles; i++) {
File temp = new File(saveas + ((String) (this.torrent.name.get(i))));
try {
this.output_files[i] = new RandomAccessFile(temp, "rw");
this.output_files[i].setLength((Integer)this.torrent.length.get(
i));
} catch (IOException ioe) {
System.err.println("Could not create temp files");
ioe.printStackTrace();
}
}
return 0;
}
// запуск закачки
dm.startListening(49152, 65535);
dm.startTrackerUpdate();
while(true)
{
if(dm.isComplete())
{
break;
}
try
{
Thread.sleep(100);
}
catch(InterruptedException ex)
{
Logger.getLogger(DownloadTorrent.class.getName()).log(Level.SEVERE, null, ex);
}
}
dm.stopTrackerUpdate();
dm.closeTempFiles();</code></pre>
And upper code called here: ex = Executors.newFixedThreadPool(3);
for(String torrentFile : torrentFiles) { ex.submit(new DownloadTorrent("/root/TorrentStealer/torrents/" + torrentFile)); } // ожидание завершения потоков загрузки файлов торрентов ex.shutdown(); try { ex.awaitTermination(30, TimeUnit.MINUTES); } catch(InterruptedException ex1) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex1); } ex.shutdownNow();</code></pre>Here is description of fixing «Too many open files»: http://wiki.magnolia-cms.com/display/WIKI/Too+Many+Open+Files
I set up 999999 max files, that fixed error for some time, then set up 9999999 for testing, not really works, all the time error happens. There can't be 9999999 opened files at the one moment after running when the server has been rebooted!
So men I don't know what to do. Can you help me?
Here is count of opened files when exceptions happened: T217:~# lsof | wc -l Result is: 2708
Upvotes: 0
Views: 6929
Reputation: 311050
java.io.IOException: Invalid argument
at java.io.RandomAccessFile.setLength(Native Method)
You are passing a negative value. Cast the value to a long not an Integer.
java.io.FileNotFoundException: /root/TorrentStealer/downloads/MAME - Update ROMs (v0.141 to v0.141u2)/lah_l104.zip (Too many open files)
You aren't closing your files. Every resource you open that needs closing must be closed, in a finally block to ensure there is no escape.
Upvotes: 1
Reputation: 6784
The stacktrace indicated error at java.io.RandomAccessFile.setLength() which accept a long
data type. In your code you cast the result of this.torrent.length.get(i)
to Integer.
What does this.torrent.length.get(i)
return?
it could be some downsizing issue when you convert data from the return to Integer, probably returning negative number which caused RandomAccessFile.setLength()
to error out.
Upvotes: 1