Re: Software Caused Connection Abort (10053) on Client

Robert DiFalco <[email protected]>
Newsgroups gmane.comp.java.sun.rmi
Message-ID <[email protected]>
Please note that this is a rare intermittent problem that only seems to
occur when Windows is the server (this isn't confirmed however).

Another tidbit of info, the error always seems to occur when marshalling
the same object over to the server. This object has a field that
serializes a UnicastRemoteObject. However, the field is declared as the
interface, so I'm not sure why this should be a problem (and an
intermittent one at that -- DGC?). The UnicastRemoteObject is a
singleton that the client send the server a stub too. Just some
additional info.

R.

-----Original Message-----
From: Robert DiFalco [mailto:[email protected]] 
Sent: Monday, November 28, 2005 12:00 PM
To: [email protected]
Subject: Re: Software Caused Connection Abort (10053) on Client

I have some more data on this.

On my server side trace I see this at the moment the exception occurs on
the client. On the clients side I get the Software Caused Connection
Abort while it is trying to "marshal an argument over to a server side
method."

 Nov 28, 2005 10:27:58 AM
sun.rmi.transport.tcp.TCPTransport$ConnectionHandler run
 FINER: RMI TCP Connection(20)-192.168.54.152: (port 9898) client using
192.168.54.152:0
  7RMI TCP Connection(23)-192.168.54.152, READ: TLSv1 Handshake, length
= 111
 72*** ClientHello, TLSv1
 2RandomCookie:   GMT: 1116432438  1bytes = { 11348, 873 ,  1111, 1133C,
C39 ,   66 , .205., .85., 81178, J108J, .133., .95., .20., Z
 RMI TCP Connection(20)-192.168.54.152, READ: TLSv1 Application Data,
length = 236  Nov 28, 2005 10:27:58 AM
sun.rmi.transport.tcp.TCPTransport
handleMessages
 FINE: RMI TCP Connection(20)-192.168.54.152: (port 9898) op = 80  Nov
28, 2005 10:27:58 AM sun.rmi.transport.StreamRemoteCall
getInputStream
 FINER: RMI TCP Connection(20)-192.168.54.152: getting input stream  Nov
28, 2005 10:27:58 AM sun.rmi.transport.StreamRemoteCall
getOutputStream
 FINER: RMI TCP Connection(20)-192.168.54.152: getting output stream
Z149.RMI TCP Connection(24)-192.168.54.152, READ: TLSv1 Handshake,
length = 111  .RMI TCP Connection(20)-192.168.54.152, WRITE: TLSv1
Application Data, length = 441  Nov 28, 2005 10:27:58 AM
sun.rmi.transport.tcp.TCPTransport
handleMessages
 FINE: RMI TCP Connection(20)-192.168.54.152: (port 9898) op = 115  Nov
28, 2005 10:27:58 AM sun.rmi.transport.tcp.TCPTransport
handleMessages
 FINE: RMI TCP Connection(20)-192.168.54.152: (port 9898) exception: 
 java.io.IOException: unknown transport op 115
        at
sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:477)
        at
sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.ja
va:701)
        at java.lang.Thread.run(Thread.java:534)
 Nov 28, 2005 10:27:58 AM sun.rmi.transport.tcp.TCPConnection close
 FINE: RMI TCP Connection(20)-192.168.54.152: close connection 

Note the exception because of an unknown transport op of 115. That
corresponds to this code:

    void handleMessages(Connection conn, boolean persistent) {
        int port = getEndpoint().getPort();
	
        try {
            DataInputStream in = new
DataInputStream(conn.getInputStream());
            do {
                int op = in.read();   // transport op
                if (op == -1) {
                    if (tcpLog.isLoggable(Log.BRIEF)) {
                        tcpLog.log(Log.BRIEF, "(port " +
                            port + ") connection closed");
                    }
                    break;
                }

                if (tcpLog.isLoggable(Log.BRIEF)) {
                    tcpLog.log(Log.BRIEF, "(port " + port +
                        ") op = " + op);
                }
                    
                switch (op) {
                case TransportConstants.Call:
                    // service incoming RMI call
                    RemoteCall call = new StreamRemoteCall(conn);
                    if (serviceCall(call) == false)
                        return;
                    break;

                case TransportConstants.Ping:
                    // send ack for ping
                    DataOutputStream out =
                        new DataOutputStream(conn.getOutputStream());
                    out.writeByte(TransportConstants.PingAck);
                    conn.releaseOutputStream();
                    break;

                case TransportConstants.DGCAck:
                    DGCAckHandler.received(UID.read((DataInput) in));
                    break;
                    
                default:
--->                throw new IOException("unknown transport op " + op);
                }
            } while (persistent);
            
        } catch (IOException e) {
            // exception during processing causes connection to close
(below)
            if (tcpLog.isLoggable(Log.BRIEF)) {
                tcpLog.log(Log.BRIEF, "(port " + port +
                    ") exception: ", e);
            }
        } finally {
            try {
                conn.close();
            } catch (IOException ex) {
                // eat exception
            }
        }
    }

Any thoughts on what might be going on? I was thinking that if something
when wrong in StreamRemoteCall that this 115 could be residual data
before the socket is closed. But then again, you can see that if
serverCall( call ) returns false,k the socket is closed in the finally
block, so that seems unlikely.

R.


-----Original Message-----
From: Robert DiFalco
Sent: Friday, November 18, 2005 4:30 PM
To: [email protected]
Subject: Software Caused Connection Abort (10053) on Client

Sorry, but I'm really stumped and I think I have a Windows issue here.
We have a VMWare stack simulating many agents connecting to a Windows
server. We are running jobs in batches of 25 agents at a time. When a
job is sent to an agent, it then calls back to the server to post
results.

Sometimes, some or all of the 25 agents in a batch will fail with
Software Caused Connection Abort as the agent is trying to WRITE to the
server. 

My initial thought was that the backlog value was too low on the Windows
Server. However, wouldn't this give me a Connection Refused exception
rather than a Connection Abort on Write exception?!?

Taking a look at a snoop on the server, what I do notice is that after
accepting the socket from the agent, the server sends a FIN and then
immediately afterwards a RST. Normally there is an ACK in between, but
in this case the FIN doesn't even appear to wait for one before calling
RST. What causes this sort of sequence on the server socket? Could it be
the backlog or some stupid SYN ATTACK code windows has slipped into it's
2003 Server?

Any ideas appreciated. And remember this is intermittent and it only
seems to happen with Windows Servers. If I use Linux or Solaris as a
server we do not get this intermittent issue.

R.

========================================================================
===
To unsubscribe, send email to [email protected] and include in the
body of the message "signoff RMI-USERS".  For general help, send email
to [email protected] and include in the body of the message "help".

For a list of frequently asked RMI questions please refer to:
http://java.sun.com/j2se/1.3/docs/guide/rmi/faq.html

To view past RMI-USERS postings, please see:
http://archives.java.sun.com/archives/rmi-users.html

===========================================================================
To unsubscribe, send email to [email protected] and include in the body
of the message "signoff RMI-USERS".  For general help, send email to
[email protected] and include in the body of the message "help".

For a list of frequently asked RMI questions please refer to:
http://java.sun.com/j2se/1.3/docs/guide/rmi/faq.html

To view past RMI-USERS postings, please see:
http://archives.java.sun.com/archives/rmi-users.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.