I don't see the daemon SocketServer thread that was created as part of the server.start() call added to the 'group' ThreadGroup. Only any new connections that the socket accepts are added to the threadGroup and only these are the ones that will get interrupted on the close call.
In our example with no clients requesting access, the thread group array remains empty and send no interrupt at all. Could this be the issue for the server to hang indefinitely? -Sudhan S On Tue, Jun 14, 2011 at 10:35 AM, Sudharsan Sampath <[email protected]>wrote: > Hi, > > I tried but have the same issue. I added server.join() after the close call > instead of waiting for a pre-defined time. But it hangs indefinitely. > > -Sudhan S > > > On Mon, Jun 13, 2011 at 10:07 PM, Alex Miller <[email protected]> wrote: > >> Hello all, >> >> I've been having an issue in some tests where it appears that closing >> a SaslSocketServer does not actually cause the socket to be closed. >> The code below reproduces roughly what happens in the course of a much >> more complicated test. Basically I start a socket server, close() it, >> then try to start another on the same port which fails to bind as the >> address is in use. >> >> From trolling through the code, it is not immediately obvious that any >> code exists to actually close the socket. The nio thread group gets >> interrupted which from debugging into this, does seem to cause the >> Connection threads to break out of their loop and close but the main >> socket listener (which is not a member of the thread group) and the >> socket channel do not get closed. >> >> Am I crazy? >> >> >> >> import java.net.InetAddress; >> import java.net.InetSocketAddress; >> >> import org.apache.avro.Protocol; >> import org.apache.avro.Schema; >> import org.apache.avro.Protocol.Message; >> import org.apache.avro.io.Decoder; >> import org.apache.avro.io.Encoder; >> import org.apache.avro.ipc.Responder; >> import org.apache.avro.ipc.SaslSocketServer; >> import org.apache.avro.ipc.Server; >> >> public class SocketDoesntClose extends Responder { >> >> public static void main(String[] args) throws Exception { >> >> Protocol prot = new Protocol("c", "a.b"); >> >> // start on port 9999 >> InetSocketAddress addr = new >> InetSocketAddress(InetAddress.getLocalHost(), 9999); >> Server server = new SaslSocketServer(new SocketDoesntClose(prot), >> addr); >> server.start(); >> >> // stop -- I would expect this to fully release the socket >> server.close(); >> >> Thread.sleep(10000); >> >> // start on same socket again -> address already in use >> server = new SaslSocketServer(new SocketDoesntClose(prot), addr); >> } >> >> // dummy implementation >> public SocketDoesntClose(Protocol local) { >> super(local); >> } >> >> public Object readRequest(Schema actual, Schema expected, Decoder in) { >> return null; >> } >> >> public Object respond(Message message, Object request) { >> return null; >> } >> >> public void writeError(Schema schema, Object error, Encoder out) { >> } >> >> public void writeResponse(Schema schema, Object response, Encoder out) { >> } >> } >> > >
