[jcifs] socket connection timed out error under load
Jonas Partner
jpartner at smartner.com
Fri Jul 16 12:52:36 GMT 2004
Hi
I am using 0.9.5 and have been getting the following stack trace after a prolonged period of usage browsing
and downloading files from a share. The code below reproduces this problem even using a single thread after
a few hundred requests. After some investigation I have found that the failure is immediately preceded by a call to NbtSocket close() stack dump below and that the socket and output stream are both null by the time that
the below excpetion is thrown. I am guessing this a synchronization issue with the sockets, could anyone
suggest why this may be occurring ?
Regards
Jonas Partner
Exception
jcifs.smb.SmbException: An error occured sending the request.
java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at jcifs.netbios.NbtSocket.<init>(NbtSocket.java:60)
at jcifs.smb.SmbTransport.ensureOpen(SmbTransport.java:275)
at jcifs.smb.SmbTransport.send(SmbTransport.java:602)
at jcifs.smb.SmbTransport.negotiate(SmbTransport.java:847)
at jcifs.smb.SmbTree.treeConnect(SmbTree.java:119)
at jcifs.smb.SmbFile.connect(SmbFile.java:790)
at jcifs.smb.SmbFile.connect0(SmbFile.java:760)
at jcifs.smb.SmbFile.sendTransaction(SmbFile.java:630)
at jcifs.smb.SmbFile.doFindFirstNext(SmbFile.java:1662)
at jcifs.smb.SmbFile.listFiles(SmbFile.java:1553)
at jcifs.smb.SmbFile.listFiles(SmbFile.java:1461)
at org.jpartner.jcifs.test.JcifSocketErrorCase$ThreadRequestor.run(JcifSocketErrorCase.java:56)
Stack Dump
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Unknown Source)
at jcifs.netbios.NbtSocket.close(NbtSocket.java:130)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at jcifs.netbios.NbtSocket.<init>(NbtSocket.java:60)
at jcifs.smb.SmbTransport.ensureOpen(SmbTransport.java:275)
at jcifs.smb.SmbTransport.send(SmbTransport.java:602)
at jcifs.smb.SmbTransport.negotiate(SmbTransport.java:847)
at jcifs.smb.SmbTree.treeConnect(SmbTree.java:119)
at jcifs.smb.SmbFile.connect(SmbFile.java:790)
at jcifs.smb.SmbFile.connect0(SmbFile.java:760)
at jcifs.smb.SmbFile.sendTransaction(SmbFile.java:630)
at jcifs.smb.SmbFile.doFindFirstNext(SmbFile.java:1662)
at jcifs.smb.SmbFile.listFiles(SmbFile.java:1553)
at jcifs.smb.SmbFile.listFiles(SmbFile.java:1461)
package org.jpartner.jcifs.test;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Random;
import jcifs.smb.SmbFile;
public class JcifSocketErrorCase {
public static void main(String[] args) throws Exception {
java.util.List threadList = new ArrayList();
JcifSocketErrorCase test = new JcifSocketErrorCase();
Random rand = new Random();
for (int counter = 0; counter < 1; counter++) {
ThreadRequestor requestor = test.new ThreadRequestor();
threadList.add(requestor);
Thread.sleep((int) (rand.nextFloat() * 1000));
requestor.start();
System.out.println("started requestor");
}
boolean allFinished = false;
while (!allFinished) {
allFinished = true;
for (int i = 0; i < threadList.size(); i++) {
ThreadRequestor req = (ThreadRequestor) threadList.get(i);
if (req.isAlive())
allFinished = false;
}
try {
Thread.sleep(5000);
} catch (InterruptedException intE) {
intE.printStackTrace();
}
System.out.println("all finished " + allFinished);
}
}
public class ThreadRequestor extends Thread {
public void run() {
for (int counter = 0; counter < 100; counter++) {
try {
Random rand = new Random(System.currentTimeMillis());
SmbFile file = null;
file = new SmbFile(
"smb://domain;uname:password@Server/Share/Folder/");
SmbFile[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile() && files[i].canRead()) {
InputStream in = files[i].getInputStream();
byte[] data = new byte[1024];
int read = 1;
while (read > 0) {
read = in.read(data);
}
in.close();
}
}
try {
Thread.sleep((int) (rand.nextFloat() * 1000 * 10));
} catch (InterruptedException intE) {
intE.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
More information about the jcifs
mailing list