diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2014-09-05 10:42:18 -0230 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2014-09-05 10:42:18 -0230 |
commit | 9786853ab2d88598021aaec5c0409d3a45a50a13 (patch) | |
tree | d64858749513c529fdb84a98d8637d19f2c125e4 /java/src | |
parent | Minor change to JS print stack traces (diff) | |
download | ice-9786853ab2d88598021aaec5c0409d3a45a50a13.tar.bz2 ice-9786853ab2d88598021aaec5c0409d3a45a50a13.tar.xz ice-9786853ab2d88598021aaec5c0409d3a45a50a13.zip |
ICE-4891 Refactor network tracing
Diffstat (limited to 'java/src')
20 files changed, 643 insertions, 573 deletions
diff --git a/java/src/Ice/ConnectionI.java b/java/src/Ice/ConnectionI.java index 5cc8188ef09..29a2bd5543c 100644 --- a/java/src/Ice/ConnectionI.java +++ b/java/src/Ice/ConnectionI.java @@ -954,7 +954,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne java.util.List<OutgoingMessage> sentCBs = null; MessageInfo info = null; int dispatchCount = 0; - + synchronized(this) { if(_state >= StateClosed) @@ -982,7 +982,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne { observerStartWrite(buf); } - writeOp = _transceiver.write(buf); + writeOp = write(buf); if(_observer != null && (writeOp & IceInternal.SocketOperation.Write) == 0) { observerFinishWrite(buf); @@ -997,7 +997,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne observerStartRead(buf); } - readOp = _transceiver.read(buf, _hasMoreData); + readOp = read(buf); if((readOp & IceInternal.SocketOperation.Read) != 0) { break; @@ -1392,6 +1392,33 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne public void finish() { + if(!_initialized) + { + if(_instance.traceLevels().network >= 2) + { + StringBuffer s = new StringBuffer("failed to "); + s.append(_connector != null ? "establish" : "accept"); + s.append(" "); + s.append(_endpoint.protocol()); + s.append(" connection\n"); + s.append(toString()); + s.append("\n"); + s.append(_exception); + _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString()); + } + } + else + { + if(_instance.traceLevels().network >= 1) + { + StringBuffer s = new StringBuffer("closed "); + s.append(_endpoint.protocol()); + s.append(" connection\n"); + s.append(toString()); + _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString()); + } + } + if(_startCallback != null) { _startCallback.connectionStartFailed(this, _exception); @@ -1448,6 +1475,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne synchronized(this) { setState(StateFinished); + if(_dispatchCount == 0) { reap(); @@ -1987,6 +2015,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne // initialized. // _desc = _transceiver.toString(); + _initialized = true; setState(StateNotValidated); return true; @@ -2022,7 +2051,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne if(_writeStream.pos() != _writeStream.size()) { - int op = _transceiver.write(_writeStream.getBuffer()); + int op = write(_writeStream.getBuffer()); if(op != 0) { scheduleTimeout(op); @@ -2052,7 +2081,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne if(_readStream.pos() != _readStream.size()) { - int op = _transceiver.read(_readStream.getBuffer(), _hasMoreData); + int op = read(_readStream.getBuffer()); if(op != 0) { scheduleTimeout(op); @@ -2108,6 +2137,29 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne _readStream.pos(0); _readHeader = true; + if(_instance.traceLevels().network >= 1) + { + StringBuffer s = new StringBuffer(); + if(_endpoint.datagram()) + { + s.append("starting to "); + s.append(_connector != null ? "send" : "receive"); + s.append(" "); + s.append(_endpoint.protocol()); + s.append(" messages\n"); + s.append(_transceiver.toDetailedString()); + } + else + { + s.append(_connector != null ? "established" : "accepted"); + s.append(" "); + s.append(_endpoint.protocol()); + s.append(" connection\n"); + s.append(toString()); + } + _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString()); + } + return true; } @@ -2192,7 +2244,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne } if(_writeStream.pos() != _writeStream.size()) { - int op = _transceiver.write(_writeStream.getBuffer()); + int op = write(_writeStream.getBuffer()); if(op != 0) { return op; @@ -2267,7 +2319,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne { observerStartWrite(message.stream.getBuffer()); } - op = _transceiver.write(message.stream.getBuffer()); + op = write(message.stream.getBuffer()); if(op == 0) { if(_observer != null) @@ -2856,6 +2908,54 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne } } + private int read(IceInternal.Buffer buf) + { + int start = buf.b.position(); + int op = _transceiver.read(buf, _hasMoreData); + if(_instance.traceLevels().network >= 3 && buf.b.position() != start) + { + StringBuffer s = new StringBuffer("received "); + if(_endpoint.datagram()) + { + s.append(buf.b.limit()); + } + else + { + s.append(buf.b.position() - start); + s.append(" of "); + s.append(buf.b.limit() - start); + } + s.append(" bytes via "); + s.append(_endpoint.protocol()); + s.append("\n"); + s.append(toString()); + _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString()); + } + return op; + } + + private int write(IceInternal.Buffer buf) + { + int start = buf.b.position(); + int op = _transceiver.write(buf); + if(_instance.traceLevels().network >= 3 && buf.b.position() != start) + { + StringBuffer s = new StringBuffer("sent "); + s.append(buf.b.position() - start); + if(!_endpoint.datagram()) + { + s.append(" of "); + s.append(buf.b.limit() - start); + } + s.append(" bytes via "); + s.append(_endpoint.protocol()); + s.append("\n"); + s.append(toString()); + _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString()); + } + return op; + } + private static class OutgoingMessage { OutgoingMessage(IceInternal.BasicStream stream, boolean compress, boolean adopt) @@ -2977,6 +3077,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne private int _state; // The current state. private boolean _shutdownInitiated = false; + private boolean _initialized = false; private boolean _validated = false; private IceInternal.Incoming _incomingCache; diff --git a/java/src/IceInternal/Acceptor.java b/java/src/IceInternal/Acceptor.java index d5910130fa2..1adc2349db7 100644 --- a/java/src/IceInternal/Acceptor.java +++ b/java/src/IceInternal/Acceptor.java @@ -13,9 +13,10 @@ public interface Acceptor { java.nio.channels.ServerSocketChannel fd(); void close(); - void listen(); + EndpointI listen(EndpointI endp); Transceiver accept(); String protocol(); @Override String toString(); + String toDetailedString(); } diff --git a/java/src/IceInternal/EndpointI.java b/java/src/IceInternal/EndpointI.java index 10248ba71c1..f752291c6f3 100644 --- a/java/src/IceInternal/EndpointI.java +++ b/java/src/IceInternal/EndpointI.java @@ -93,12 +93,9 @@ abstract public class EndpointI implements Ice.Endpoint, java.lang.Comparable<En // // Return a server side transceiver for this endpoint, or null if a - // transceiver can only be created by an acceptor. In case a - // transceiver is created, this operation also returns a new - // "effective" endpoint, which might differ from this endpoint, - // for example, if a dynamic port number is assigned. + // transceiver can only be created by an acceptor. // - public abstract Transceiver transceiver(EndpointIHolder endpoint); + public abstract Transceiver transceiver(); // // Return connectors for this endpoint, or empty list if no connector @@ -109,12 +106,17 @@ abstract public class EndpointI implements Ice.Endpoint, java.lang.Comparable<En // // Return an acceptor for this endpoint, or null if no acceptors - // is available. In case an acceptor is created, this operation - // also returns a new "effective" endpoint, which might differ - // from this endpoint, for example, if a dynamic port number is - // assigned. + // is available. + // + public abstract Acceptor acceptor(String adapterName); + + // + // Return (potentially) new endpoint based on info from associated + // Transceiver or Acceptor, which might differ from this endpoint, + // for example, if a dynamic port number was assigned. // - public abstract Acceptor acceptor(EndpointIHolder endpoint, String adapterName); + public abstract EndpointI endpoint(Transceiver transceiver); + public abstract EndpointI endpoint(Acceptor acceptor); // // Expand endpoint out in to separate endpoints for each local diff --git a/java/src/IceInternal/IncomingConnectionFactory.java b/java/src/IceInternal/IncomingConnectionFactory.java index e0413fc1b5d..e0ecfcc2fc3 100644 --- a/java/src/IceInternal/IncomingConnectionFactory.java +++ b/java/src/IceInternal/IncomingConnectionFactory.java @@ -224,6 +224,15 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice try { transceiver = _acceptor.accept(); + + if(_instance.traceLevels().network >= 2) + { + StringBuffer s = new StringBuffer("trying to accept "); + s.append(_endpoint.protocol()); + s.append(" connection\n"); + s.append(transceiver.toString()); + _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString()); + } } catch(Ice.SocketException ex) { @@ -368,13 +377,19 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice try { - EndpointIHolder h = new EndpointIHolder(); - h.value = _endpoint; - _transceiver = _endpoint.transceiver(h); - + _transceiver = _endpoint.transceiver(); if(_transceiver != null) { - _endpoint = h.value; + if(_instance.traceLevels().network >= 2) + { + StringBuffer s = new StringBuffer("attempting to bind to "); + s.append(_endpoint.protocol()); + s.append(" socket\n"); + s.append(_transceiver.toString()); + _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString()); + } + _endpoint = _transceiver.bind(_endpoint); + Ice.ConnectionI connection = new Ice.ConnectionI(_adapter.getCommunicator(), _instance, null, _transceiver, null, _endpoint, _adapter); @@ -383,11 +398,29 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice } else { - h.value = _endpoint; - _acceptor = _endpoint.acceptor(h, adapterName); - _endpoint = h.value; + _acceptor = _endpoint.acceptor(adapterName); assert(_acceptor != null); - _acceptor.listen(); + + if(_instance.traceLevels().network >= 2) + { + StringBuffer s = new StringBuffer("attempting to bind to "); + s.append(_endpoint.protocol()); + s.append(" socket "); + s.append(_acceptor.toString()); + _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString()); + } + + _endpoint = _acceptor.listen(_endpoint); + + if(_instance.traceLevels().network >= 1) + { + StringBuffer s = new StringBuffer("listening for "); + s.append(_endpoint.protocol()); + s.append(" connections\n"); + s.append(_acceptor.toDetailedString()); + _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString()); + } + ((Ice.ObjectAdapterI)_adapter).getThreadPool().initialize(this); } } @@ -412,7 +445,7 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice { try { - _acceptor.close(); + closeAcceptor(); } catch(Ice.LocalException e) { @@ -548,7 +581,7 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice assert(_state == StateClosed); if(_acceptor != null) { - _acceptor.close(); + closeAcceptor(); } break; } @@ -559,6 +592,20 @@ public final class IncomingConnectionFactory extends EventHandler implements Ice } private void + closeAcceptor() + { + if(_instance.traceLevels().network >= 1) + { + StringBuffer s = new StringBuffer("stopping to accept "); + s.append(_endpoint.protocol()); + s.append(" connections at "); + s.append(_acceptor.toString()); + _instance.initializationData().logger.trace(_instance.traceLevels().networkCat, s.toString()); + } + _acceptor.close(); + } + + private void warning(Ice.LocalException ex) { String s = "connection exception:\n" + Ex.toString(ex) + '\n' + _acceptor.toString(); diff --git a/java/src/IceInternal/OpaqueEndpointI.java b/java/src/IceInternal/OpaqueEndpointI.java index b14beda4036..8932c41c7de 100644 --- a/java/src/IceInternal/OpaqueEndpointI.java +++ b/java/src/IceInternal/OpaqueEndpointI.java @@ -175,15 +175,11 @@ final class OpaqueEndpointI extends EndpointI // // Return a server side transceiver for this endpoint, or null if a - // transceiver can only be created by an acceptor. In case a - // transceiver is created, this operation also returns a new - // "effective" endpoint, which might differ from this endpoint, - // for example, if a dynamic port number is assigned. + // transceiver can only be created by an acceptor.d. // @Override - public Transceiver transceiver(EndpointIHolder endpoint) + public Transceiver transceiver() { - endpoint.value = null; return null; } @@ -205,15 +201,28 @@ final class OpaqueEndpointI extends EndpointI // // Return an acceptor for this endpoint, or null if no acceptors - // is available. In case an acceptor is created, this operation - // also returns a new "effective" endpoint, which might differ - // from this endpoint, for example, if a dynamic port number is - // assigned. + // is available. + // + @Override + public Acceptor acceptor(String adapterName) + { + return null; + } + // + // Return (potentially) new endpoint based on info from associated + // Transceiver or Acceptor, which might differ from this endpoint, + // for example, if a dynamic port number was assigned. + // + @Override + public EndpointI endpoint(Transceiver transceiver) + { + return null; + } + @Override - public Acceptor acceptor(EndpointIHolder endpoint, String adapterName) + public EndpointI endpoint(Acceptor acceptor) { - endpoint.value = null; return null; } diff --git a/java/src/IceInternal/OutgoingConnectionFactory.java b/java/src/IceInternal/OutgoingConnectionFactory.java index 3629661e533..773d735faff 100644 --- a/java/src/IceInternal/OutgoingConnectionFactory.java +++ b/java/src/IceInternal/OutgoingConnectionFactory.java @@ -1082,11 +1082,32 @@ public final class OutgoingConnectionFactory } } + if(_factory._instance.traceLevels().network >= 2) + { + StringBuffer s = new StringBuffer("trying to establish "); + s.append(_current.endpoint.protocol()); + s.append(" connection to "); + s.append(_current.connector.toString()); + _factory._instance.initializationData().logger.trace(_factory._instance.traceLevels().networkCat, + s.toString()); + } + connection = _factory.createConnection(_current.connector.connect(), _current); connection.start(this); } catch(Ice.LocalException ex) { + if(_factory._instance.traceLevels().network >= 2) + { + StringBuffer s = new StringBuffer("failed to establish "); + s.append(_current.endpoint.protocol()); + s.append(" connection to "); + s.append(_current.connector.toString()); + s.append(ex); + _factory._instance.initializationData().logger.trace(_factory._instance.traceLevels().networkCat, + s.toString()); + } + connectionStartFailed(connection, ex); } } diff --git a/java/src/IceInternal/TcpAcceptor.java b/java/src/IceInternal/TcpAcceptor.java index 84c025301dd..ff5d5b918c1 100644 --- a/java/src/IceInternal/TcpAcceptor.java +++ b/java/src/IceInternal/TcpAcceptor.java @@ -20,37 +20,16 @@ class TcpAcceptor implements Acceptor @Override public void close() { - if(_instance.traceLevel() >= 1) - { - String s = "stopping to accept " + protocol() + " connections at " + toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } - assert(_fd != null); Network.closeSocketNoThrow(_fd); _fd = null; } @Override - public void listen() + public EndpointI listen(EndpointI endp) { - // Nothing to do. - - if(_instance.traceLevel() >= 1) - { - StringBuffer s = new StringBuffer("listening for " + protocol() + " connections at "); - s.append(toString()); - - java.util.List<String> interfaces = - Network.getHostsForEndpointExpand(_addr.getAddress().getHostAddress(), _instance.protocolSupport(), - true); - if(!interfaces.isEmpty()) - { - s.append("\nlocal interfaces: "); - s.append(IceUtilInternal.StringUtil.joinString(interfaces, ", ")); - } - _instance.logger().trace(_instance.traceCategory(), s.toString()); - } + _addr = Network.doBind(_fd, _addr, _backlog); + return endp.endpoint(this); } @Override @@ -59,13 +38,6 @@ class TcpAcceptor implements Acceptor java.nio.channels.SocketChannel fd = Network.doAccept(_fd); Network.setBlock(fd, false); Network.setTcpBufSize(fd, _instance.properties(), _instance.logger()); - - if(_instance.traceLevel() >= 1) - { - String s = "accepted " + protocol() + " connection\n" + Network.fdToString(fd); - _instance.logger().trace(_instance.traceCategory(), s); - } - return new TcpTransceiver(_instance, fd); } @@ -81,6 +53,22 @@ class TcpAcceptor implements Acceptor return Network.addrToString(_addr); } + @Override + public String toDetailedString() + { + StringBuffer s = new StringBuffer("local address = "); + s.append(toString()); + + java.util.List<String> intfs = + Network.getHostsForEndpointExpand(_addr.getAddress().getHostAddress(), _instance.protocolSupport(), true); + if(!intfs.isEmpty()) + { + s.append("\nlocal interfaces = "); + s.append(IceUtilInternal.StringUtil.joinString(intfs, ", ")); + } + return s.toString(); + } + int effectivePort() { return _addr.getPort(); @@ -114,12 +102,6 @@ class TcpAcceptor implements Acceptor } _addr = Network.getAddressForServer(host, port, instance.protocolSupport(), instance.preferIPv6()); - if(instance.traceLevel() >= 2) - { - String s = "attempting to bind to " + protocol() + " socket " + toString(); - instance.logger().trace(instance.traceCategory(), s); - } - _addr = Network.doBind(_fd, _addr, _backlog); } catch(RuntimeException ex) { diff --git a/java/src/IceInternal/TcpConnector.java b/java/src/IceInternal/TcpConnector.java index f8fca6619ba..0ace406c1e8 100644 --- a/java/src/IceInternal/TcpConnector.java +++ b/java/src/IceInternal/TcpConnector.java @@ -14,30 +14,12 @@ final class TcpConnector implements Connector @Override public Transceiver connect() { - if(_instance.traceLevel() >= 2) - { - String s = "trying to establish " + _instance.protocol() + " connection to " + toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } - - try - { - java.nio.channels.SocketChannel fd = Network.createTcpSocket(); - Network.setBlock(fd, false); - Network.setTcpBufSize(fd, _instance.properties(), _instance.logger()); - final java.net.InetSocketAddress addr = _proxy != null ? _proxy.getAddress() : _addr; - Network.doConnect(fd, addr, _sourceAddr); - return new TcpTransceiver(_instance, fd, _proxy, _addr); - } - catch(Ice.LocalException ex) - { - if(_instance.traceLevel() >= 2) - { - String s = "failed to establish " + _instance.protocol() + " connection to " + toString() + "\n" + ex; - _instance.logger().trace(_instance.traceCategory(), s); - } - throw ex; - } + java.nio.channels.SocketChannel fd = Network.createTcpSocket(); + Network.setBlock(fd, false); + Network.setTcpBufSize(fd, _instance.properties(), _instance.logger()); + final java.net.InetSocketAddress addr = _proxy != null ? _proxy.getAddress() : _addr; + Network.doConnect(fd, addr, _sourceAddr); + return new TcpTransceiver(_instance, fd, _proxy, _addr); } @Override diff --git a/java/src/IceInternal/TcpEndpointI.java b/java/src/IceInternal/TcpEndpointI.java index f002f0f4101..9678e59803d 100644 --- a/java/src/IceInternal/TcpEndpointI.java +++ b/java/src/IceInternal/TcpEndpointI.java @@ -140,31 +140,40 @@ final class TcpEndpointI extends IPEndpointI // // Return a server side transceiver for this endpoint, or null if a - // transceiver can only be created by an acceptor. In case a - // transceiver is created, this operation also returns a new - // "effective" endpoint, which might differ from this endpoint, - // for example, if a dynamic port number is assigned. + // transceiver can only be created by an acceptor. // @Override - public Transceiver transceiver(EndpointIHolder endpoint) + public Transceiver transceiver() { - endpoint.value = this; return null; } // // Return an acceptor for this endpoint, or null if no acceptors - // is available. In case an acceptor is created, this operation - // also returns a new "effective" endpoint, which might differ - // from this endpoint, for example, if a dynamic port number is - // assigned. + // is available. // @Override - public Acceptor acceptor(EndpointIHolder endpoint, String adapterName) + public Acceptor acceptor(String adapterName) { - TcpAcceptor p = new TcpAcceptor(_instance, _host, _port); - endpoint.value = createEndpoint(_host, p.effectivePort(), _connectionId); - return p; + return new TcpAcceptor(_instance, _host, _port); + } + + // + // Return (potentially) new endpoint based on info from associated + // Transceiver or Acceptor, which might differ from this endpoint, + // for example, if a dynamic port number was assigned. + // + @Override + public EndpointI endpoint(Transceiver transceiver) + { + return this; + } + + @Override + public EndpointI endpoint(Acceptor acceptor) + { + TcpAcceptor p = (TcpAcceptor)acceptor; + return createEndpoint(_host, p.effectivePort(), _connectionId); } @Override diff --git a/java/src/IceInternal/TcpTransceiver.java b/java/src/IceInternal/TcpTransceiver.java index ebbdfdfd1de..4d1c5577900 100644 --- a/java/src/IceInternal/TcpTransceiver.java +++ b/java/src/IceInternal/TcpTransceiver.java @@ -21,103 +21,84 @@ final class TcpTransceiver implements Transceiver @Override public int initialize(Buffer readBuffer, Buffer writeBuffer, Ice.Holder<Boolean> moreData) { - try + if(_state == StateNeedConnect) { - if(_state == StateNeedConnect) - { - _state = StateConnectPending; - return SocketOperation.Connect; - } - else if(_state <= StateConnectPending) + _state = StateConnectPending; + return SocketOperation.Connect; + } + else if(_state <= StateConnectPending) + { + Network.doFinishConnect(_fd); + _desc = Network.fdToString(_fd, _proxy, _addr); + + if(_proxy != null) { - Network.doFinishConnect(_fd); - _desc = Network.fdToString(_fd, _proxy, _addr); + // + // Prepare the read & write buffers in advance. + // + _proxy.beginWriteConnectRequest(_addr, writeBuffer); + _proxy.beginReadConnectRequestResponse(readBuffer); - if(_proxy != null) + // + // Write the proxy connection message. + // + if(write(writeBuffer) == SocketOperation.None) { // - // Prepare the read & write buffers in advance. + // Write completed without blocking. // - _proxy.beginWriteConnectRequest(_addr, writeBuffer); - _proxy.beginReadConnectRequestResponse(readBuffer); + _proxy.endWriteConnectRequest(writeBuffer); // - // Write the proxy connection message. + // Try to read the response. // - if(write(writeBuffer) == SocketOperation.None) + if(read(readBuffer, moreData) == SocketOperation.None) { // - // Write completed without blocking. - // - _proxy.endWriteConnectRequest(writeBuffer); - + // Read completed without blocking - fall through. // - // Try to read the response. - // - if(read(readBuffer, moreData) == SocketOperation.None) - { - // - // Read completed without blocking - fall through. - // - _proxy.endReadConnectRequestResponse(readBuffer); - } - else - { - // - // Return SocketOperationRead to indicate we need to complete the read. - // - _state = StateProxyConnectRequestPending; // Wait for proxy response - return SocketOperation.Read; - } + _proxy.endReadConnectRequestResponse(readBuffer); } else { // - // Return SocketOperationWrite to indicate we need to complete the write. + // Return SocketOperationRead to indicate we need to complete the read. // - _state = StateProxyConnectRequest; // Send proxy connect request - return SocketOperation.Write; + _state = StateProxyConnectRequestPending; // Wait for proxy response + return SocketOperation.Read; } } - - _state = StateConnected; - } - else if(_state == StateProxyConnectRequest) - { - // - // Write completed. - // - _proxy.endWriteConnectRequest(writeBuffer); - _state = StateProxyConnectRequestPending; // Wait for proxy response - return SocketOperation.Read; - } - else if(_state == StateProxyConnectRequestPending) - { - // - // Read completed. - // - _proxy.endReadConnectRequestResponse(readBuffer); - _state = StateConnected; + else + { + // + // Return SocketOperationWrite to indicate we need to complete the write. + // + _state = StateProxyConnectRequest; // Send proxy connect request + return SocketOperation.Write; + } } + + _state = StateConnected; } - catch(Ice.LocalException ex) + else if(_state == StateProxyConnectRequest) { - if(_instance.traceLevel() >= 2) - { - StringBuilder s = new StringBuilder(128); - s.append("failed to establish " + _instance.protocol() + " connection\n"); - s.append(Network.fdToString(_fd, _proxy, _addr)); - _instance.logger().trace(_instance.traceCategory(), s.toString()); - } - throw ex; + // + // Write completed. + // + _proxy.endWriteConnectRequest(writeBuffer); + _state = StateProxyConnectRequestPending; // Wait for proxy response + return SocketOperation.Read; } - - assert(_state == StateConnected); - if(_instance.traceLevel() >= 1) + else if(_state == StateProxyConnectRequestPending) { - String s = _instance.protocol() + " connection established\n" + _desc; - _instance.logger().trace(_instance.traceCategory(), s); + // + // Read completed. + // + _proxy.endReadConnectRequestResponse(readBuffer); + _state = StateConnected; } + + assert(_state == StateConnected); return SocketOperation.None; } @@ -132,12 +113,6 @@ final class TcpTransceiver implements Transceiver @Override public void close() { - if(_state == StateConnected && _instance.traceLevel() >= 1) - { - String s = "closing " + _instance.protocol() + " connection\n" + toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } - assert(_fd != null); try { @@ -154,6 +129,13 @@ final class TcpTransceiver implements Transceiver } @Override + public EndpointI bind(EndpointI endp) + { + assert(false); + return null; + } + + @Override public int write(Buffer buf) { final int size = buf.b.limit(); @@ -207,13 +189,6 @@ final class TcpTransceiver implements Transceiver return SocketOperation.Write; } - if(_instance.traceLevel() >= 3) - { - String s = "sent " + ret + " of " + packetSize + " bytes via " + _instance.protocol() + "\n" + - toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } - if(packetSize == _maxSendPacketSize) { assert(buf.b.position() == buf.b.limit()); @@ -264,16 +239,6 @@ final class TcpTransceiver implements Transceiver return SocketOperation.Read; } - if(ret > 0) - { - if(_instance.traceLevel() >= 3) - { - String s = "received " + ret + " of " + packetSize + " bytes via " + _instance.protocol() + - "\n" + toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } - } - packetSize = buf.b.remaining(); } catch(java.io.InterruptedIOException ex) @@ -302,6 +267,12 @@ final class TcpTransceiver implements Transceiver } @Override + public String toDetailedString() + { + return toString(); + } + + @Override public Ice.ConnectionInfo getInfo() { Ice.TCPConnectionInfo info = new Ice.TCPConnectionInfo(); @@ -336,7 +307,7 @@ final class TcpTransceiver implements Transceiver _proxy = proxy; _addr = addr; _state = StateNeedConnect; - _desc = ""; + _desc = Network.fdToString(_fd, _proxy, _addr);; _maxSendPacketSize = 0; if(System.getProperty("os.name").startsWith("Windows")) diff --git a/java/src/IceInternal/Transceiver.java b/java/src/IceInternal/Transceiver.java index dfc4522fb74..c7c1fbd3a71 100644 --- a/java/src/IceInternal/Transceiver.java +++ b/java/src/IceInternal/Transceiver.java @@ -17,12 +17,14 @@ public interface Transceiver int closing(boolean initiator, Ice.LocalException ex); void close(); + EndpointI bind(EndpointI endp); int write(Buffer buf); int read(Buffer buf, Ice.Holder<Boolean> moreData); String protocol(); @Override String toString(); + String toDetailedString(); Ice.ConnectionInfo getInfo(); void checkSendSize(Buffer buf, int messageSizeMax); } diff --git a/java/src/IceInternal/UdpEndpointI.java b/java/src/IceInternal/UdpEndpointI.java index 44cb3b6988a..b5bab1f3bfb 100644 --- a/java/src/IceInternal/UdpEndpointI.java +++ b/java/src/IceInternal/UdpEndpointI.java @@ -145,34 +145,43 @@ final class UdpEndpointI extends IPEndpointI // // Return a server side transceiver for this endpoint, or null if a - // transceiver can only be created by an acceptor. In case a - // transceiver is created, this operation also returns a new - // "effective" endpoint, which might differ from this endpoint, - // for example, if a dynamic port number is assigned. + // transceiver can only be created by an acceptor. // @Override - public Transceiver transceiver(EndpointIHolder endpoint) + public Transceiver transceiver() { - UdpTransceiver p = new UdpTransceiver(_instance, _host, _port, _mcastInterface, _connect); - endpoint.value = createEndpoint(_host, p.effectivePort(), _connectionId); - return p; + return new UdpTransceiver(_instance, _host, _port, _mcastInterface, _connect); } // // Return an acceptor for this endpoint, or null if no acceptors - // is available. In case an acceptor is created, this operation - // also returns a new "effective" endpoint, which might differ - // from this endpoint, for example, if a dynamic port number is - // assigned. + // is available. // @Override - public Acceptor acceptor(EndpointIHolder endpoint, String adapterName) + public Acceptor acceptor(String adapterName) { - endpoint.value = this; return null; } // + // Return (potentially) new endpoint based on info from associated + // Transceiver or Acceptor, which might differ from this endpoint, + // for example, if a dynamic port number was assigned. + // + @Override + public EndpointI endpoint(Transceiver transceiver) + { + UdpTransceiver p = (UdpTransceiver)transceiver; + return createEndpoint(_host, p.effectivePort(), _connectionId); + } + + @Override + public EndpointI endpoint(Acceptor acceptor) + { + return this; + } + + // // Convert the endpoint to its string form // @Override diff --git a/java/src/IceInternal/UdpTransceiver.java b/java/src/IceInternal/UdpTransceiver.java index 19450b7200d..0ac66b0a366 100644 --- a/java/src/IceInternal/UdpTransceiver.java +++ b/java/src/IceInternal/UdpTransceiver.java @@ -41,12 +41,6 @@ final class UdpTransceiver implements Transceiver { assert(_fd != null); - if(_state >= StateConnected && _instance.traceLevel() >= 1) - { - String s = "closing " + _instance.protocol() + " connection\n" + toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } - try { _fd.close(); @@ -58,6 +52,61 @@ final class UdpTransceiver implements Transceiver } @Override + public EndpointI bind(EndpointI endp) + { + if(_addr.getAddress().isMulticastAddress()) + { + Network.setReuseAddress(_fd, true); + _mcastAddr = _addr; + if(System.getProperty("os.name").startsWith("Windows") || + System.getProperty("java.vm.name").startsWith("OpenJDK")) + { + // + // Windows does not allow binding to the mcast address itself + // so we bind to INADDR_ANY (0.0.0.0) instead. As a result, + // bi-directional connection won't work because the source + // address won't be the multicast address and the client will + // therefore reject the datagram. + // + int protocol = + _mcastAddr.getAddress().getAddress().length == 4 ? Network.EnableIPv4 : Network.EnableIPv6; + _addr = Network.getAddressForServer("", _port, protocol, _instance.preferIPv6()); + } + _addr = Network.doBind(_fd, _addr); + configureMulticast(_mcastAddr, _mcastInterface, -1); + + if(_port == 0) + { + _mcastAddr = new java.net.InetSocketAddress(_mcastAddr.getAddress(), _addr.getPort()); + } + } + else + { + if(!System.getProperty("os.name").startsWith("Windows")) + { + // + // Enable SO_REUSEADDR on Unix platforms to allow + // re-using the socket even if it's in the TIME_WAIT + // state. On Windows, this doesn't appear to be + // necessary and enabling SO_REUSEADDR would actually + // not be a good thing since it allows a second + // process to bind to an address even it's already + // bound by another process. + // + // TODO: using SO_EXCLUSIVEADDRUSE on Windows would + // probably be better but it's only supported by recent + // Windows versions (XP SP2, Windows Server 2003). + // + Network.setReuseAddress(_fd, true); + } + _addr = Network.doBind(_fd, _addr); + } + + _bound = true; + return endp.endpoint(this); + } + + @Override public int write(Buffer buf) { // @@ -123,13 +172,8 @@ final class UdpTransceiver implements Transceiver return SocketOperation.Write; } - if(_instance.traceLevel() >= 3) - { - String s = "sent " + ret + " bytes via " + _instance.protocol() + "\n" + toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } - assert(ret == buf.b.limit()); + buf.b.position(buf.b.limit()); return SocketOperation.None; } @@ -195,12 +239,6 @@ final class UdpTransceiver implements Transceiver } } - if(_instance.traceLevel() >= 3) - { - String s = "received " + ret + " bytes via " + _instance.protocol() + "\n" + toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } - buf.resize(ret, true); buf.b.position(ret); @@ -222,7 +260,11 @@ final class UdpTransceiver implements Transceiver } String s; - if(_state == StateNotConnected) + if(_incoming && !_bound) + { + s = "local address = " + Network.addrToString(_addr); + } + else if(_state == StateNotConnected) { java.net.DatagramSocket socket = _fd.socket(); s = "local address = " + Network.addrToString((java.net.InetSocketAddress)socket.getLocalSocketAddress()); @@ -244,6 +286,20 @@ final class UdpTransceiver implements Transceiver } @Override + public String toDetailedString() + { + StringBuffer s = new StringBuffer(toString()); + java.util.List<String> intfs = + Network.getHostsForEndpointExpand(_addr.getAddress().getHostAddress(), _instance.protocolSupport(), true); + if(!intfs.isEmpty()) + { + s.append("\nlocal interfaces = "); + s.append(IceUtilInternal.StringUtil.joinString(intfs, ", ")); + } + return s.toString(); + } + + @Override public Ice.ConnectionInfo getInfo() { Ice.UDPConnectionInfo info = new Ice.UDPConnectionInfo(); @@ -326,12 +382,6 @@ final class UdpTransceiver implements Transceiver } Network.doConnect(_fd, _addr, sourceAddr); _state = StateConnected; // We're connected now - - if(_instance.traceLevel() >= 1) - { - String s = "starting to send " + _instance.protocol() + " packets\n" + toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } } catch(Ice.LocalException ex) { @@ -347,6 +397,9 @@ final class UdpTransceiver implements Transceiver { _instance = instance; _state = connect ? StateNeedConnect : StateNotConnected; + _mcastInterface = mcastInterface; + _incoming = true; + _port = port; try { @@ -354,74 +407,6 @@ final class UdpTransceiver implements Transceiver _fd = Network.createUdpSocket(_addr); setBufSize(instance.properties()); Network.setBlock(_fd, false); - if(_instance.traceLevel() >= 2) - { - String s = "attempting to bind to " + _instance.protocol() + " socket " + Network.addrToString(_addr); - _instance.logger().trace(_instance.traceCategory(), s); - } - if(_addr.getAddress().isMulticastAddress()) - { - Network.setReuseAddress(_fd, true); - _mcastAddr = _addr; - if(System.getProperty("os.name").startsWith("Windows") || - System.getProperty("java.vm.name").startsWith("OpenJDK")) - { - // - // Windows does not allow binding to the mcast address itself - // so we bind to INADDR_ANY (0.0.0.0) instead. As a result, - // bi-directional connection won't work because the source - // address won't be the multicast address and the client will - // therefore reject the datagram. - // - int protocol = - _mcastAddr.getAddress().getAddress().length == 4 ? Network.EnableIPv4 : Network.EnableIPv6; - _addr = Network.getAddressForServer("", port, protocol, instance.preferIPv6()); - } - _addr = Network.doBind(_fd, _addr); - configureMulticast(_mcastAddr, mcastInterface, -1); - - if(port == 0) - { - _mcastAddr = new java.net.InetSocketAddress(_mcastAddr.getAddress(), _addr.getPort()); - } - } - else - { - if(!System.getProperty("os.name").startsWith("Windows")) - { - // - // Enable SO_REUSEADDR on Unix platforms to allow - // re-using the socket even if it's in the TIME_WAIT - // state. On Windows, this doesn't appear to be - // necessary and enabling SO_REUSEADDR would actually - // not be a good thing since it allows a second - // process to bind to an address even it's already - // bound by another process. - // - // TODO: using SO_EXCLUSIVEADDRUSE on Windows would - // probably be better but it's only supported by recent - // Windows versions (XP SP2, Windows Server 2003). - // - Network.setReuseAddress(_fd, true); - } - _addr = Network.doBind(_fd, _addr); - } - - if(_instance.traceLevel() >= 1) - { - StringBuffer s = new StringBuffer("starting to receive " + _instance.protocol() + " packets\n"); - s.append(toString()); - - java.util.List<String> interfaces = - Network.getHostsForEndpointExpand(_addr.getAddress().getHostAddress(), instance.protocolSupport(), - true); - if(!interfaces.isEmpty()) - { - s.append("\nlocal interfaces: "); - s.append(IceUtilInternal.StringUtil.joinString(interfaces, ", ")); - } - _instance.logger().trace(_instance.traceCategory(), s.toString()); - } } catch(Ice.LocalException ex) { @@ -624,8 +609,13 @@ final class UdpTransceiver implements Transceiver private java.nio.channels.DatagramChannel _fd; private java.net.InetSocketAddress _addr; private java.net.InetSocketAddress _mcastAddr = null; + private String _mcastInterface; private java.net.InetSocketAddress _peerAddr = null; + private boolean _incoming = false; + private int _port = 0; + private boolean _bound = false; + // // The maximum IP datagram size is 65535. Subtract 20 bytes for the IP header and 8 bytes for the UDP header // to get the maximum payload. diff --git a/java/src/IceInternal/WSAcceptor.java b/java/src/IceInternal/WSAcceptor.java index 4888fd7072b..65ef46623fb 100644 --- a/java/src/IceInternal/WSAcceptor.java +++ b/java/src/IceInternal/WSAcceptor.java @@ -24,9 +24,11 @@ final class WSAcceptor implements IceInternal.Acceptor } @Override - public void listen() + public EndpointI listen(EndpointI endp) { - _delegate.listen(); + WSEndpoint p = (WSEndpoint)endp; + EndpointI endpoint = _delegate.listen(p.delegate()); + return endp.endpoint(this); } @Override @@ -51,6 +53,17 @@ final class WSAcceptor implements IceInternal.Acceptor return _delegate.toString(); } + @Override + public String toDetailedString() + { + return _delegate.toDetailedString(); + } + + public Acceptor delegate() + { + return _delegate; + } + WSAcceptor(ProtocolInstance instance, IceInternal.Acceptor del) { _instance = instance; diff --git a/java/src/IceInternal/WSEndpoint.java b/java/src/IceInternal/WSEndpoint.java index 59c4e795cb5..7170d68e252 100644 --- a/java/src/IceInternal/WSEndpoint.java +++ b/java/src/IceInternal/WSEndpoint.java @@ -11,17 +11,17 @@ package IceInternal; final class WSEndpoint extends IceInternal.EndpointI { - public WSEndpoint(ProtocolInstance instance, IceInternal.EndpointI del, String res) + public WSEndpoint(ProtocolInstance instance, EndpointI del, String res) { _instance = instance; - _delegate = (IceInternal.IPEndpointI)del; + _delegate = (IPEndpointI)del; _resource = res; } - public WSEndpoint(ProtocolInstance instance, IceInternal.EndpointI del, java.util.ArrayList<String> args) + public WSEndpoint(ProtocolInstance instance, EndpointI del, java.util.ArrayList<String> args) { _instance = instance; - _delegate = (IceInternal.IPEndpointI)del; + _delegate = (IPEndpointI)del; initWithOptions(args); @@ -31,10 +31,10 @@ final class WSEndpoint extends IceInternal.EndpointI } } - public WSEndpoint(ProtocolInstance instance, IceInternal.EndpointI del, IceInternal.BasicStream s) + public WSEndpoint(ProtocolInstance instance, EndpointI del, BasicStream s) { _instance = instance; - _delegate = (IceInternal.IPEndpointI)del; + _delegate = (IPEndpointI)del; _resource = s.readString(); } @@ -83,7 +83,7 @@ final class WSEndpoint extends IceInternal.EndpointI } @Override - public void streamWrite(IceInternal.BasicStream s) + public void streamWrite(BasicStream s) { s.startWriteEncaps(); _delegate.streamWriteImpl(s); @@ -98,7 +98,7 @@ final class WSEndpoint extends IceInternal.EndpointI } @Override - public IceInternal.EndpointI timeout(int timeout) + public EndpointI timeout(int timeout) { if(timeout == _delegate.timeout()) { @@ -117,7 +117,7 @@ final class WSEndpoint extends IceInternal.EndpointI } @Override - public IceInternal.EndpointI connectionId(String connectionId) + public EndpointI connectionId(String connectionId) { if(connectionId.equals(_delegate.connectionId())) { @@ -136,7 +136,7 @@ final class WSEndpoint extends IceInternal.EndpointI } @Override - public IceInternal.EndpointI compress(boolean compress) + public EndpointI compress(boolean compress) { if(compress == _delegate.compress()) { @@ -161,18 +161,17 @@ final class WSEndpoint extends IceInternal.EndpointI } @Override - public IceInternal.Transceiver transceiver(IceInternal.EndpointIHolder endpoint) + public Transceiver transceiver() { - endpoint.value = this; return null; } @Override - public java.util.List<IceInternal.Connector> connectors(Ice.EndpointSelectionType selType) + public java.util.List<Connector> connectors(Ice.EndpointSelectionType selType) { - java.util.List<IceInternal.Connector> connectors = _delegate.connectors(selType); - java.util.List<IceInternal.Connector> l = new java.util.ArrayList<IceInternal.Connector>(); - for(IceInternal.Connector c : connectors) + java.util.List<Connector> connectors = _delegate.connectors(selType); + java.util.List<Connector> l = new java.util.ArrayList<Connector>(); + for(Connector c : connectors) { l.add(new WSConnector(_instance, c, _delegate.host(), _delegate.port(), _resource)); } @@ -180,15 +179,15 @@ final class WSEndpoint extends IceInternal.EndpointI } @Override - public void connectors_async(Ice.EndpointSelectionType selType, final IceInternal.EndpointI_connectors callback) + public void connectors_async(Ice.EndpointSelectionType selType, final EndpointI_connectors callback) { - IceInternal.EndpointI_connectors cb = new IceInternal.EndpointI_connectors() + EndpointI_connectors cb = new EndpointI_connectors() { @Override - public void connectors(java.util.List<IceInternal.Connector> connectors) + public void connectors(java.util.List<Connector> connectors) { - java.util.List<IceInternal.Connector> l = new java.util.ArrayList<IceInternal.Connector>(); - for(IceInternal.Connector c : connectors) + java.util.List<Connector> l = new java.util.ArrayList<Connector>(); + for(Connector c : connectors) { l.add(new WSConnector(_instance, c, _delegate.host(), _delegate.port(), _resource)); } @@ -205,23 +204,32 @@ final class WSEndpoint extends IceInternal.EndpointI } @Override - public IceInternal.Acceptor acceptor(IceInternal.EndpointIHolder endpoint, String adapterName) + public Acceptor acceptor(String adapterName) { - IceInternal.EndpointIHolder delEndp = new IceInternal.EndpointIHolder(); - IceInternal.Acceptor delAcc = _delegate.acceptor(delEndp, adapterName); - if(delEndp.value != null) - { - endpoint.value = new WSEndpoint(_instance, delEndp.value, _resource); - } + Acceptor delAcc = _delegate.acceptor(adapterName); return new WSAcceptor(_instance, delAcc); } @Override - public java.util.List<IceInternal.EndpointI> expand() + public EndpointI endpoint(Transceiver transceiver) { - java.util.List<IceInternal.EndpointI> endps = _delegate.expand(); - java.util.List<IceInternal.EndpointI> l = new java.util.ArrayList<IceInternal.EndpointI>(); - for(IceInternal.EndpointI e : endps) + return this; + } + + @Override + public EndpointI endpoint(Acceptor acceptor) + { + WSAcceptor p = (WSAcceptor)acceptor; + EndpointI delEndp = _delegate.endpoint(p.delegate()); + return new WSEndpoint(_instance, delEndp, _resource); + } + + @Override + public java.util.List<EndpointI> expand() + { + java.util.List<EndpointI> endps = _delegate.expand(); + java.util.List<EndpointI> l = new java.util.ArrayList<EndpointI>(); + for(EndpointI e : endps) { l.add(e == _delegate ? this : new WSEndpoint(_instance, e, _resource)); } @@ -229,7 +237,7 @@ final class WSEndpoint extends IceInternal.EndpointI } @Override - public boolean equivalent(IceInternal.EndpointI endpoint) + public boolean equivalent(EndpointI endpoint) { if(!(endpoint instanceof WSEndpoint)) { @@ -278,7 +286,7 @@ final class WSEndpoint extends IceInternal.EndpointI } @Override - public int compareTo(IceInternal.EndpointI obj) // From java.lang.Comparable + public int compareTo(EndpointI obj) // From java.lang.Comparable { if(!(obj instanceof WSEndpoint)) { @@ -300,6 +308,11 @@ final class WSEndpoint extends IceInternal.EndpointI return _delegate.compareTo(p._delegate); } + public EndpointI delegate() + { + return _delegate; + } + @Override protected boolean checkOption(String option, String argument, String endpoint) { @@ -324,6 +337,6 @@ final class WSEndpoint extends IceInternal.EndpointI } private ProtocolInstance _instance; - private IceInternal.IPEndpointI _delegate; + private IPEndpointI _delegate; private String _resource; } diff --git a/java/src/IceInternal/WSTransceiver.java b/java/src/IceInternal/WSTransceiver.java index 84fa616dd5e..c34a1f65e1b 100644 --- a/java/src/IceInternal/WSTransceiver.java +++ b/java/src/IceInternal/WSTransceiver.java @@ -306,6 +306,13 @@ final class WSTransceiver implements Transceiver } @Override + public EndpointI bind(EndpointI endp) + { + assert(false); + return null; + } + + @Override public int write(Buffer buf) { if(_state < StateOpened) @@ -450,6 +457,12 @@ final class WSTransceiver implements Transceiver } @Override + public String toDetailedString() + { + return _delegate.toDetailedString(); + } + + @Override public Ice.ConnectionInfo getInfo() { Ice.IPConnectionInfo di = (Ice.IPConnectionInfo)_delegate.getInfo(); diff --git a/java/src/IceSSL/AcceptorI.java b/java/src/IceSSL/AcceptorI.java index 22a5c238876..a7bc1754149 100644 --- a/java/src/IceSSL/AcceptorI.java +++ b/java/src/IceSSL/AcceptorI.java @@ -20,37 +20,17 @@ final class AcceptorI implements IceInternal.Acceptor @Override public void close() { - if(_instance.traceLevel() >= 1) - { - String s = "stopping to accept " + _instance.protocol() + " connections at " + toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } - assert(_fd != null); IceInternal.Network.closeSocketNoThrow(_fd); _fd = null; } @Override - public void listen() + public IceInternal.EndpointI listen(IceInternal.EndpointI endp) { - // Nothing to do. - - if(_instance.traceLevel() >= 1) - { - StringBuffer s = new StringBuffer("listening for " + _instance.protocol() + " connections at "); - s.append(toString()); + _addr = IceInternal.Network.doBind(_fd, _addr, _backlog); - java.util.List<String> interfaces = - IceInternal.Network.getHostsForEndpointExpand(_addr.getAddress().getHostAddress(), - _instance.protocolSupport(), true); - if(!interfaces.isEmpty()) - { - s.append("\nlocal interfaces: "); - s.append(IceUtilInternal.StringUtil.joinString(interfaces, ", ")); - } - _instance.logger().trace(_instance.traceCategory(), s.toString()); - } + return endp.endpoint(this); } @Override @@ -83,12 +63,6 @@ final class AcceptorI implements IceInternal.Acceptor throw ex; } - if(_instance.traceLevel() >= 1) - { - _instance.logger().trace(_instance.traceCategory(), "accepting " + _instance.protocol() + " connection\n" + - IceInternal.Network.fdToString(fd)); - } - return new TransceiverI(_instance, engine, fd, _adapterName); } @@ -104,6 +78,23 @@ final class AcceptorI implements IceInternal.Acceptor return IceInternal.Network.addrToString(_addr); } + @Override + public String toDetailedString() + { + StringBuffer s = new StringBuffer("local address = "); + s.append(toString()); + + java.util.List<String> intfs = + IceInternal.Network.getHostsForEndpointExpand(_addr.getAddress().getHostAddress(), + _instance.protocolSupport(), true); + if(!intfs.isEmpty()) + { + s.append("\nlocal interfaces = "); + s.append(IceUtilInternal.StringUtil.joinString(intfs, ", ")); + } + return s.toString(); + } + int effectivePort() { return _addr.getPort(); @@ -139,12 +130,6 @@ final class AcceptorI implements IceInternal.Acceptor } _addr = IceInternal.Network.getAddressForServer(host, port, _instance.protocolSupport(), _instance.preferIPv6()); - if(_instance.traceLevel() >= 2) - { - String s = "attempting to bind to " + _instance.protocol() + " socket " + toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } - _addr = IceInternal.Network.doBind(_fd, _addr, _backlog); } catch(RuntimeException ex) { diff --git a/java/src/IceSSL/ConnectorI.java b/java/src/IceSSL/ConnectorI.java index 2bffb15712e..5d731029d58 100644 --- a/java/src/IceSSL/ConnectorI.java +++ b/java/src/IceSSL/ConnectorI.java @@ -24,37 +24,19 @@ final class ConnectorI implements IceInternal.Connector throw ex; } - if(_instance.traceLevel() >= 2) - { - String s = "trying to establish " + _instance.protocol() + " connection to " + toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } - + java.nio.channels.SocketChannel fd = IceInternal.Network.createTcpSocket(); + IceInternal.Network.setBlock(fd, false); + IceInternal.Network.setTcpBufSize(fd, _instance.properties(), _instance.logger()); + final java.net.InetSocketAddress addr = _proxy != null ? _proxy.getAddress() : _addr; + IceInternal.Network.doConnect(fd, addr, _sourceAddr); try { - java.nio.channels.SocketChannel fd = IceInternal.Network.createTcpSocket(); - IceInternal.Network.setBlock(fd, false); - IceInternal.Network.setTcpBufSize(fd, _instance.properties(), _instance.logger()); - final java.net.InetSocketAddress addr = _proxy != null ? _proxy.getAddress() : _addr; - IceInternal.Network.doConnect(fd, addr, _sourceAddr); - try - { - javax.net.ssl.SSLEngine engine = _instance.createSSLEngine(false, _addr); - return new TransceiverI(_instance, engine, fd, _proxy, _host, _addr); - } - catch(RuntimeException ex) - { - IceInternal.Network.closeSocketNoThrow(fd); - throw ex; - } + javax.net.ssl.SSLEngine engine = _instance.createSSLEngine(false, _addr); + return new TransceiverI(_instance, engine, fd, _proxy, _host, _addr); } - catch(Ice.LocalException ex) + catch(RuntimeException ex) { - if(_instance.traceLevel() >= 2) - { - String s = "failed to establish " + _instance.protocol() + " connection to " + toString() + "\n" + ex; - _instance.logger().trace(_instance.traceCategory(), s); - } + IceInternal.Network.closeSocketNoThrow(fd); throw ex; } } diff --git a/java/src/IceSSL/EndpointI.java b/java/src/IceSSL/EndpointI.java index 246100b7f26..1b42777d3c7 100644 --- a/java/src/IceSSL/EndpointI.java +++ b/java/src/IceSSL/EndpointI.java @@ -143,34 +143,43 @@ final class EndpointI extends IceInternal.IPEndpointI // // Return a server side transceiver for this endpoint, or null if a - // transceiver can only be created by an acceptor. In case a - // transceiver is created, this operation also returns a new - // "effective" endpoint, which might differ from this endpoint, - // for example, if a dynamic port number is assigned. + // transceiver can only be created by an acceptor. // @Override - public IceInternal.Transceiver transceiver(IceInternal.EndpointIHolder endpoint) + public IceInternal.Transceiver transceiver() { - endpoint.value = this; return null; } // // Return an acceptor for this endpoint, or null if no acceptors - // is available. In case an acceptor is created, this operation - // also returns a new "effective" endpoint, which might differ - // from this endpoint, for example, if a dynamic port number is - // assigned. + // is available. // @Override - public IceInternal.Acceptor acceptor(IceInternal.EndpointIHolder endpoint, String adapterName) + public IceInternal.Acceptor acceptor(String adapterName) { - AcceptorI p = new AcceptorI(_instance, adapterName, _host, _port); - endpoint.value = - new EndpointI(_instance, _host, p.effectivePort(), _sourceAddr, _timeout, _connectionId, _compress); - return p; + return new AcceptorI(_instance, adapterName, _host, _port); } + // + // Return (potentially) new endpoint based on info from associated + // Transceiver or Acceptor, which might differ from this endpoint, + // for example, if a dynamic port number was assigned. + // + @Override + public IceInternal.EndpointI endpoint(IceInternal.Transceiver transceiver) + { + return this; + } + + @Override + public IceInternal.EndpointI endpoint(IceInternal.Acceptor acceptor) + { + AcceptorI p = (AcceptorI)acceptor; + return new EndpointI(_instance, _host, p.effectivePort(), _sourceAddr, _timeout, _connectionId, _compress); + } + + @Override public String options() { diff --git a/java/src/IceSSL/TransceiverI.java b/java/src/IceSSL/TransceiverI.java index 3729bf569a5..4c07e4b26db 100644 --- a/java/src/IceSSL/TransceiverI.java +++ b/java/src/IceSSL/TransceiverI.java @@ -25,100 +25,86 @@ final class TransceiverI implements IceInternal.Transceiver @Override public int initialize(IceInternal.Buffer readBuffer, IceInternal.Buffer writeBuffer, Ice.Holder<Boolean> moreData) { - try + if(_state == StateNeedConnect) { - if(_state == StateNeedConnect) - { - _state = StateConnectPending; - return IceInternal.SocketOperation.Connect; - } - else if(_state <= StateConnectPending) + _state = StateConnectPending; + return IceInternal.SocketOperation.Connect; + } + else if(_state <= StateConnectPending) + { + IceInternal.Network.doFinishConnect(_fd); + _desc = IceInternal.Network.fdToString(_fd, _proxy, _addr); + + if(_proxy != null) { - IceInternal.Network.doFinishConnect(_fd); - _desc = IceInternal.Network.fdToString(_fd, _proxy, _addr); + // + // Prepare the read & write buffers in advance. + // + _proxy.beginWriteConnectRequest(_addr, writeBuffer); + _proxy.beginReadConnectRequestResponse(readBuffer); - if(_proxy != null) + // + // Write the proxy connection message. + // + if(writeRaw(writeBuffer)) { // - // Prepare the read & write buffers in advance. + // Write completed without blocking. // - _proxy.beginWriteConnectRequest(_addr, writeBuffer); - _proxy.beginReadConnectRequestResponse(readBuffer); + _proxy.endWriteConnectRequest(writeBuffer); // - // Write the proxy connection message. + // Try to read the response. // - if(writeRaw(writeBuffer)) + if(readRaw(readBuffer)) { // - // Write completed without blocking. + // Read completed without blocking - fall through. // - _proxy.endWriteConnectRequest(writeBuffer); - - // - // Try to read the response. - // - if(readRaw(readBuffer)) - { - // - // Read completed without blocking - fall through. - // - _proxy.endReadConnectRequestResponse(readBuffer); - } - else - { - // - // Return SocketOperationRead to indicate we need to complete the read. - // - _state = StateProxyConnectRequestPending; // Wait for proxy response - return IceInternal.SocketOperation.Read; - } + _proxy.endReadConnectRequestResponse(readBuffer); } else { // - // Return SocketOperationWrite to indicate we need to complete the write. + // Return SocketOperationRead to indicate we need to complete the read. // - _state = StateProxyConnectRequest; // Send proxy connect request - return IceInternal.SocketOperation.Write; + _state = StateProxyConnectRequestPending; // Wait for proxy response + return IceInternal.SocketOperation.Read; } } - - _state = StateConnected; - } - else if(_state == StateProxyConnectRequest) - { - // - // Write completed. - // - _proxy.endWriteConnectRequest(writeBuffer); - _state = StateProxyConnectRequestPending; // Wait for proxy response - return IceInternal.SocketOperation.Read; - } - else if(_state == StateProxyConnectRequestPending) - { - // - // Read completed. - // - _proxy.endReadConnectRequestResponse(readBuffer); - _state = StateConnected; + else + { + // + // Return SocketOperationWrite to indicate we need to complete the write. + // + _state = StateProxyConnectRequest; // Send proxy connect request + return IceInternal.SocketOperation.Write; + } } - assert(_state == StateConnected); - - return handshakeNonBlocking(); + _state = StateConnected; } - catch(Ice.LocalException ex) + else if(_state == StateProxyConnectRequest) { - if(_instance.traceLevel() >= 2) - { - StringBuilder s = new StringBuilder(128); - s.append("failed to establish " + protocol() + " connection\n"); - s.append(IceInternal.Network.fdToString(_fd, _proxy, _addr)); - _instance.logger().trace(_instance.traceCategory(), s.toString()); - } - throw ex; + // + // Write completed. + // + _proxy.endWriteConnectRequest(writeBuffer); + _state = StateProxyConnectRequestPending; // Wait for proxy response + return IceInternal.SocketOperation.Read; + } + else if(_state == StateProxyConnectRequestPending) + { + // + // Read completed. + // + _proxy.endReadConnectRequestResponse(readBuffer); + _state = StateConnected; } + + assert(_state == StateConnected); + + return handshakeNonBlocking(); } @Override @@ -132,12 +118,6 @@ final class TransceiverI implements IceInternal.Transceiver @Override public void close() { - if(_state == StateHandshakeComplete && _instance.traceLevel() >= 1) - { - String s = "closing " + protocol() + " connection\n" + toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } - assert(_fd != null); if(_state >= StateConnected) @@ -206,6 +186,13 @@ final class TransceiverI implements IceInternal.Transceiver } @Override + public IceInternal.EndpointI bind(IceInternal.EndpointI endp) + { + assert(false); + return null; + } + + @Override public int write(IceInternal.Buffer buf) { if(_state == StateProxyConnectRequest) @@ -244,25 +231,12 @@ final class TransceiverI implements IceInternal.Transceiver return readRaw(buf) ? IceInternal.SocketOperation.None : IceInternal.SocketOperation.Read; } - int rem = 0; - if(_instance.traceLevel() >= 3) - { - rem = buf.b.remaining(); - } - // // Try to satisfy the request from data we've already decrypted. // int pos = buf.b.position(); fill(buf.b); - if(_instance.traceLevel() >= 3 && buf.b.position() > pos) - { - String s = "received " + (buf.b.position() - pos) + " of " + rem + " bytes via " + protocol() + - "\n" + toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } - // // Read and decrypt more data if necessary. Note that we might read // more data from the socket than is actually necessary to fill the @@ -304,13 +278,6 @@ final class TransceiverI implements IceInternal.Transceiver pos = buf.b.position(); fill(buf.b); - - if(_instance.traceLevel() >= 3 && buf.b.position() > pos) - { - String s = "received " + (buf.b.position() - pos) + " of " + rem + " bytes via " + protocol() + - "\n" + toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } } } catch(SSLException ex) @@ -338,6 +305,12 @@ final class TransceiverI implements IceInternal.Transceiver } @Override + public String toDetailedString() + { + return toString(); + } + + @Override public Ice.ConnectionInfo getInfo() { return getNativeConnectionInfo(); @@ -608,20 +581,6 @@ final class TransceiverI implements IceInternal.Transceiver // _instance.verifyPeer(getNativeConnectionInfo(), _fd, _host); - if(_instance.traceLevel() >= 1) - { - String s; - if(_incoming) - { - s = "accepted " + protocol() + " connection\n" + _desc; - } - else - { - s = protocol() + " connection established\n" + _desc; - } - _instance.logger().trace(_instance.traceCategory(), s); - } - if(_instance.securityTraceLevel() >= 1) { _instance.traceConnection(_fd, _engine, _incoming); @@ -662,20 +621,6 @@ final class TransceiverI implements IceInternal.Transceiver case OK: break; } - - // - // If the SSL engine consumed any of the application's message buffer, - // then log it. - // - if(result.bytesConsumed() > 0) - { - if(_instance.traceLevel() >= 3) - { - String s = "sent " + result.bytesConsumed() + " of " + rem + " bytes via " + - protocol() + "\n" + toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } - } } // @@ -874,12 +819,6 @@ final class TransceiverI implements IceInternal.Transceiver { return false; } - - if(_instance.traceLevel() >= 3) - { - String s = "sent " + ret + " of " + packetSize + " bytes via " + protocol() + "\n" + toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } } catch(java.io.InterruptedIOException ex) { @@ -914,16 +853,6 @@ final class TransceiverI implements IceInternal.Transceiver return false; } - if(ret > 0) - { - if(_instance.traceLevel() >= 3) - { - String s = "received " + ret + " of " + packetSize + " bytes via " + protocol() + "\n" + - toString(); - _instance.logger().trace(_instance.traceCategory(), s); - } - } - packetSize = buf.b.remaining(); } catch(java.io.InterruptedIOException ex) |