diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2015-03-05 15:44:08 -0330 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2015-03-05 15:44:08 -0330 |
commit | b96b045ecc6e034307ba8065af73c252e0093bbb (patch) | |
tree | c3f22df1c67a7de3c435c4be31ef2adfb300b1e8 /java/src | |
parent | Fixed linux php build (diff) | |
download | ice-b96b045ecc6e034307ba8065af73c252e0093bbb.tar.bz2 ice-b96b045ecc6e034307ba8065af73c252e0093bbb.tar.xz ice-b96b045ecc6e034307ba8065af73c252e0093bbb.zip |
ICE-6082 No way to discover send/recv buffer sizes
Diffstat (limited to 'java/src')
8 files changed, 96 insertions, 32 deletions
diff --git a/java/src/Ice/src/main/java/Ice/ConnectionI.java b/java/src/Ice/src/main/java/Ice/ConnectionI.java index 51835eb4bd2..bfe8715e339 100644 --- a/java/src/Ice/src/main/java/Ice/ConnectionI.java +++ b/java/src/Ice/src/main/java/Ice/ConnectionI.java @@ -287,7 +287,7 @@ public final class ConnectionI extends IceInternal.EventHandler // is sill only called every (timeout / 2) period. // if(acm.heartbeat == ACMHeartbeat.HeartbeatAlways || - (acm.heartbeat != ACMHeartbeat.HeartbeatOff && _writeStream.isEmpty() && + (acm.heartbeat != ACMHeartbeat.HeartbeatOff && _writeStream.isEmpty() && now >= (_acmLastActivity + acm.timeout / 4))) { if(acm.heartbeat != ACMHeartbeat.HeartbeatOnInvocation || _dispatchCount > 0) @@ -354,11 +354,11 @@ public final class ConnectionI extends IceInternal.EventHandler _transceiver.checkSendSize(os.getBuffer()); // - // Notify the request that it's cancelable with this connection. + // Notify the request that it's cancelable with this connection. // This will throw if the request is canceled. // out.cancelable(this); - + int requestId = 0; if(response) { @@ -638,7 +638,7 @@ public final class ConnectionI extends IceInternal.EventHandler private Ice.AsyncResult begin_flushBatchRequestsInternal(IceInternal.CallbackBase cb) { - IceInternal.ConnectionFlushBatch result = + IceInternal.ConnectionFlushBatch result = new IceInternal.ConnectionFlushBatch(this, _communicator, _instance, __flushBatchRequests_name, cb); result.invoke(); return result; @@ -647,7 +647,7 @@ public final class ConnectionI extends IceInternal.EventHandler @Override public void end_flushBatchRequests(AsyncResult ir) { - IceInternal.ConnectionFlushBatch r = + IceInternal.ConnectionFlushBatch r = IceInternal.ConnectionFlushBatch.check(ir, this, __flushBatchRequests_name); r.__wait(); } @@ -672,7 +672,7 @@ public final class ConnectionI extends IceInternal.EventHandler } // - // Notify the request that it's cancelable with this connection. + // Notify the request that it's cancelable with this connection. // This will throw if the request is canceled. // outAsync.cancelable(this); @@ -1626,6 +1626,17 @@ public final class ConnectionI extends IceInternal.EventHandler } @Override + public synchronized void setBufferSize(int rcvSize, int sndSize) + { + if(_state >= StateClosed) + { + throw (Ice.LocalException) _exception.fillInStackTrace(); + } + _transceiver.setBufferSize(rcvSize, sndSize); + _info = null; // Invalidate the cached connection info + } + + @Override public String _toString() { return _desc; // No mutex lock, _desc is immutable. @@ -1637,7 +1648,7 @@ public final class ConnectionI extends IceInternal.EventHandler } public ConnectionI(Communicator communicator, IceInternal.Instance instance, IceInternal.ACMMonitor monitor, - IceInternal.Transceiver transceiver, IceInternal.Connector connector, + IceInternal.Transceiver transceiver, IceInternal.Connector connector, IceInternal.EndpointI endpoint, ObjectAdapterI adapter) { _communicator = communicator; @@ -1901,7 +1912,7 @@ public final class ConnectionI extends IceInternal.EventHandler { return; } - + // // Don't need to close now for connections so only close the transceiver // if the selector request it. @@ -1979,7 +1990,7 @@ public final class ConnectionI extends IceInternal.EventHandler _exception instanceof ForcedCloseConnectionException || _exception instanceof ConnectionTimeoutException || _exception instanceof CommunicatorDestroyedException || - _exception instanceof ObjectAdapterDeactivatedException || + _exception instanceof ObjectAdapterDeactivatedException || (_exception instanceof ConnectionLostException && _state >= StateClosing))) { _observer.failed(_exception.ice_name()); @@ -3129,7 +3140,7 @@ public final class ConnectionI extends IceInternal.EventHandler private int _nextRequestId; - private java.util.Map<Integer, IceInternal.OutgoingAsync> _asyncRequests = + private java.util.Map<Integer, IceInternal.OutgoingAsync> _asyncRequests = new java.util.HashMap<Integer, IceInternal.OutgoingAsync>(); private LocalException _exception; diff --git a/java/src/Ice/src/main/java/IceInternal/Network.java b/java/src/Ice/src/main/java/IceInternal/Network.java index 0c7a9475fc4..94ca324227a 100644 --- a/java/src/Ice/src/main/java/IceInternal/Network.java +++ b/java/src/Ice/src/main/java/IceInternal/Network.java @@ -1000,52 +1000,57 @@ public final class Network dfltBufSize = 128 * 1024; } - System.err.println("XXX"); + int rcvSize = instance.properties().getPropertyAsIntWithDefault("Ice.TCP.RcvSize", dfltBufSize); + int sndSize = instance.properties().getPropertyAsIntWithDefault("Ice.TCP.SndSize", dfltBufSize); - int sizeRequested = instance.properties().getPropertyAsIntWithDefault("Ice.TCP.RcvSize", dfltBufSize); - if(sizeRequested > 0) + setTcpBufSize(socket, rcvSize, sndSize, instance); + } + + public static void + setTcpBufSize(java.nio.channels.SocketChannel socket, int rcvSize, int sndSize, ProtocolInstance instance) + { + if(rcvSize > 0) { // // Try to set the buffer size. The kernel will silently adjust // the size to an acceptable value. Then read the size back to // get the size that was actually set. // - setRecvBufferSize(socket, sizeRequested); + setRecvBufferSize(socket, rcvSize); int size = getRecvBufferSize(socket); - //if(size < sizeRequested) + if(size < rcvSize) { // Warn if the size that was set is less than the requested size and // we have not already warned. BufSizeWarnInfo winfo = instance.getBufSizeWarn(Ice.TCPEndpointType.value); - if(!winfo.rcvWarn || sizeRequested != winfo.rcvSize) + if(!winfo.rcvWarn || rcvSize != winfo.rcvSize) { - instance.logger().warning("TCP receive buffer size: requested size of " + sizeRequested + + instance.logger().warning("TCP receive buffer size: requested size of " + rcvSize + " adjusted to " + size); - instance.setRcvBufSizeWarn(Ice.TCPEndpointType.value, sizeRequested); + instance.setRcvBufSizeWarn(Ice.TCPEndpointType.value, rcvSize); } } } - sizeRequested = instance.properties().getPropertyAsIntWithDefault("Ice.TCP.SndSize", dfltBufSize); - if(sizeRequested > 0) + if(sndSize > 0) { // // Try to set the buffer size. The kernel will silently adjust // the size to an acceptable value. Then read the size back to // get the size that was actually set. // - setSendBufferSize(socket, sizeRequested); + setSendBufferSize(socket, sndSize); int size = getSendBufferSize(socket); - //if(size < sizeRequested) + if(size < sndSize) { // Warn if the size that was set is less than the requested size and // we have not already warned. BufSizeWarnInfo winfo = instance.getBufSizeWarn(Ice.TCPEndpointType.value); - if(!winfo.sndWarn || sizeRequested != winfo.sndSize) + if(!winfo.sndWarn || sndSize != winfo.sndSize) { - instance.logger().warning("TCP send buffer size: requested size of " + sizeRequested + + instance.logger().warning("TCP send buffer size: requested size of " + sndSize + " adjusted to " + size); - instance.setSndBufSizeWarn(Ice.TCPEndpointType.value, sizeRequested); + instance.setSndBufSizeWarn(Ice.TCPEndpointType.value, sndSize); } } } @@ -1077,7 +1082,7 @@ public final class Network // setRecvBufferSize(socket, sizeRequested); int size = getRecvBufferSize(socket); - //if(size < sizeRequested) + if(size < sizeRequested) { // Warn if the size that was set is less than the requested size and // we have not already warned. diff --git a/java/src/Ice/src/main/java/IceInternal/StreamSocket.java b/java/src/Ice/src/main/java/IceInternal/StreamSocket.java index 61b546400b0..6fce7962576 100644 --- a/java/src/Ice/src/main/java/IceInternal/StreamSocket.java +++ b/java/src/Ice/src/main/java/IceInternal/StreamSocket.java @@ -79,6 +79,11 @@ public class StreamSocket } } + public void setBufferSize(int rcvSize, int sndSize) + { + Network.setTcpBufSize(_fd, rcvSize, sndSize, _instance); + } + public int connect(Buffer readBuffer, Buffer writeBuffer) { if(_state == StateNeedConnect) diff --git a/java/src/Ice/src/main/java/IceInternal/TcpTransceiver.java b/java/src/Ice/src/main/java/IceInternal/TcpTransceiver.java index 7f640059036..3e6cd059cd6 100644 --- a/java/src/Ice/src/main/java/IceInternal/TcpTransceiver.java +++ b/java/src/Ice/src/main/java/IceInternal/TcpTransceiver.java @@ -89,6 +89,8 @@ final class TcpTransceiver implements Transceiver info.remoteAddress = socket.getInetAddress().getHostAddress(); info.remotePort = socket.getPort(); } + info.rcvSize = Network.getRecvBufferSize(_stream.fd()); + info.sndSize = Network.getSendBufferSize(_stream.fd()); } return info; } @@ -98,6 +100,12 @@ final class TcpTransceiver implements Transceiver { } + @Override + public void setBufferSize(int rcvSize, int sndSize) + { + _stream.setBufferSize(rcvSize, sndSize); + } + TcpTransceiver(ProtocolInstance instance, StreamSocket stream) { _instance = instance; diff --git a/java/src/Ice/src/main/java/IceInternal/Transceiver.java b/java/src/Ice/src/main/java/IceInternal/Transceiver.java index 6029b6cbd95..577a5b99941 100644 --- a/java/src/Ice/src/main/java/IceInternal/Transceiver.java +++ b/java/src/Ice/src/main/java/IceInternal/Transceiver.java @@ -27,4 +27,5 @@ public interface Transceiver String toDetailedString(); Ice.ConnectionInfo getInfo(); void checkSendSize(Buffer buf); + void setBufferSize(int rcvSize, int sndSize); } diff --git a/java/src/Ice/src/main/java/IceInternal/UdpTransceiver.java b/java/src/Ice/src/main/java/IceInternal/UdpTransceiver.java index bffbeb3ce82..88800a78a2b 100644 --- a/java/src/Ice/src/main/java/IceInternal/UdpTransceiver.java +++ b/java/src/Ice/src/main/java/IceInternal/UdpTransceiver.java @@ -315,6 +315,8 @@ final class UdpTransceiver implements Transceiver info.remotePort = socket.getPort(); } } + info.rcvSize = Network.getRecvBufferSize(_fd); + info.sndSize = Network.getSendBufferSize(_fd); } if(_mcastAddr != null) { @@ -338,6 +340,12 @@ final class UdpTransceiver implements Transceiver } } + @Override + public void setBufferSize(int rcvSize, int sndSize) + { + setBufSize(rcvSize, sndSize); + } + public final int effectivePort() { return _addr.getPort(); @@ -356,7 +364,7 @@ final class UdpTransceiver implements Transceiver try { _fd = Network.createUdpSocket(_addr); - setBufSize(); + setBufSize(-1, -1); Network.setBlock(_fd, false); // // NOTE: setting the multicast interface before performing the @@ -393,7 +401,7 @@ final class UdpTransceiver implements Transceiver { _addr = Network.getAddressForServer(host, port, instance.protocolSupport(), instance.preferIPv6()); _fd = Network.createUdpSocket(_addr); - setBufSize(); + setBufSize(-1, -1); Network.setBlock(_fd, false); } catch(Ice.LocalException ex) @@ -403,7 +411,7 @@ final class UdpTransceiver implements Transceiver } } - private synchronized void setBufSize() + private synchronized void setBufSize(int rcvSize, int sndSize) { assert(_fd != null); @@ -413,12 +421,14 @@ final class UdpTransceiver implements Transceiver String direction; String prop; int dfltSize; + int sizeRequested; if(i == 0) { isSnd = false; direction = "receive"; prop = "Ice.UDP.RcvSize"; dfltSize = Network.getRecvBufferSize(_fd); + sizeRequested = rcvSize; _rcvSize = dfltSize; } else @@ -427,13 +437,20 @@ final class UdpTransceiver implements Transceiver direction = "send"; prop = "Ice.UDP.SndSize"; dfltSize = Network.getSendBufferSize(_fd); + sizeRequested = sndSize; _sndSize = dfltSize; } // - // Get property for buffer size and check for sanity. + // Get property for buffer size if size not passed in. + // + if(sizeRequested == -1) + { + sizeRequested = _instance.properties().getPropertyAsIntWithDefault(prop, dfltSize); + } + // + // Check for sanity. // - int sizeRequested = _instance.properties().getPropertyAsIntWithDefault(prop, dfltSize); if(sizeRequested < (_udpOverhead + IceInternal.Protocol.headerSize)) { _instance.logger().warning("Invalid " + prop + " value of " + sizeRequested + " adjusted to " + diff --git a/java/src/Ice/src/main/java/IceInternal/WSTransceiver.java b/java/src/Ice/src/main/java/IceInternal/WSTransceiver.java index bfa0d65e5a7..fa8e1279fb2 100644 --- a/java/src/Ice/src/main/java/IceInternal/WSTransceiver.java +++ b/java/src/Ice/src/main/java/IceInternal/WSTransceiver.java @@ -484,6 +484,8 @@ final class WSTransceiver implements Transceiver info.localPort = di.localPort; info.remoteAddress = di.remoteAddress; info.remotePort = di.remotePort; + info.rcvSize = di.rcvSize; + info.sndSize = di.sndSize; info.headers = _parser.getHeaders(); return info; } @@ -494,6 +496,12 @@ final class WSTransceiver implements Transceiver _delegate.checkSendSize(buf); } + @Override + public void setBufferSize(int rcvSize, int sndSize) + { + _delegate.setBufferSize(rcvSize, sndSize); + } + WSTransceiver(ProtocolInstance instance, Transceiver del, String host, int port, String resource) { init(instance, del); diff --git a/java/src/Ice/src/main/java/IceSSL/TransceiverI.java b/java/src/Ice/src/main/java/IceSSL/TransceiverI.java index f388e58ac60..128f890e690 100644 --- a/java/src/Ice/src/main/java/IceSSL/TransceiverI.java +++ b/java/src/Ice/src/main/java/IceSSL/TransceiverI.java @@ -257,6 +257,12 @@ final class TransceiverI implements IceInternal.Transceiver } @Override + public void setBufferSize(int rcvSize, int sndSize) + { + _stream.setBufferSize(rcvSize, sndSize); + } + + @Override public void checkSendSize(IceInternal.Buffer buf) { } @@ -306,6 +312,9 @@ final class TransceiverI implements IceInternal.Transceiver info.remotePort = socket.getPort(); } + info.rcvSize = IceInternal.Network.getRecvBufferSize(_stream.fd()); + info.sndSize = IceInternal.Network.getSendBufferSize(_stream.fd()); + SSLSession session = _engine.getSession(); info.cipher = session.getCipherSuite(); try @@ -516,7 +525,7 @@ final class TransceiverI implements IceInternal.Transceiver { throw new Ice.ConnectionLostException(ex); } - + if(_netOutput.hasRemaining()) { _netOutput.compact(); |