diff options
author | Mark Spruiell <mes@zeroc.com> | 2002-01-03 21:55:36 +0000 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2002-01-03 21:55:36 +0000 |
commit | aab366f5238bcb4e00dfc40ea127dd6415e26749 (patch) | |
tree | c8668bc729fb6c795e8da1ecc22427b652462aef /java/src | |
parent | update dependencies. (diff) | |
download | ice-aab366f5238bcb4e00dfc40ea127dd6415e26749.tar.bz2 ice-aab366f5238bcb4e00dfc40ea127dd6415e26749.tar.xz ice-aab366f5238bcb4e00dfc40ea127dd6415e26749.zip |
server fixes
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/IceInternal/BasicStream.java | 42 | ||||
-rw-r--r-- | java/src/IceInternal/Connection.java | 40 | ||||
-rw-r--r-- | java/src/IceInternal/DispatchStatus.java | 7 | ||||
-rw-r--r-- | java/src/IceInternal/Incoming.java | 12 | ||||
-rw-r--r-- | java/src/IceInternal/Instance.java | 7 | ||||
-rw-r--r-- | java/src/IceInternal/Network.java | 11 | ||||
-rw-r--r-- | java/src/IceInternal/ThreadPool.java | 82 | ||||
-rw-r--r-- | java/src/IceInternal/TraceUtil.java | 54 | ||||
-rw-r--r-- | java/src/IceInternal/UdpTransceiver.java | 5 |
9 files changed, 156 insertions, 104 deletions
diff --git a/java/src/IceInternal/BasicStream.java b/java/src/IceInternal/BasicStream.java index 56d397471c9..75afbd7fdf7 100644 --- a/java/src/IceInternal/BasicStream.java +++ b/java/src/IceInternal/BasicStream.java @@ -24,6 +24,7 @@ public class BasicStream _currentReadEncaps = null; _currentWriteEncaps = null; + _updateStringReadTable = true; } protected void @@ -69,7 +70,7 @@ public class BasicStream private static final int MAX = 1024 * 1024; // TODO: Configurable public void - resize(int total) + resize(int total, boolean reading) { if (total > MAX) { @@ -82,21 +83,23 @@ public class BasicStream _buf = _bufferManager.reallocate(_buf, newCapacity); _capacity = _buf.capacity(); } - _buf.limit(total); - _limit = total; - } - - /* TODO - Remove? - public void - reserve(int total) - { - if (total > MAX) + // + // If this stream is used for reading, then we want to set + // the buffer's limit to the new total size. If this buffer + // is used for writing, then we must set the buffer's limit + // to the buffer's capacity. + // + if (reading) { - throw new Ice.MemoryLimitException(); + _buf.limit(total); + } + else + { + _buf.limit(_capacity); } - _buf.reserve(total); + _buf.position(total); + _limit = total; } - */ java.nio.ByteBuffer prepareRead() @@ -1002,6 +1005,18 @@ public class BasicStream throw new Ice.NoUserExceptionFactoryException(); } + public void + disableStringReadTableUpdates() + { + _updateStringReadTable = false; + } + + public void + enableStringReadTableUpdates() + { + _updateStringReadTable = true; + } + int pos() { @@ -1064,4 +1079,5 @@ public class BasicStream private java.util.LinkedList _writeEncapsStack = new java.util.LinkedList(); private ReadEncaps _currentReadEncaps; private WriteEncaps _currentWriteEncaps; + private boolean _updateStringReadTable; } diff --git a/java/src/IceInternal/Connection.java b/java/src/IceInternal/Connection.java index 065c5a03a2d..45ae6ecfcf5 100644 --- a/java/src/IceInternal/Connection.java +++ b/java/src/IceInternal/Connection.java @@ -368,18 +368,19 @@ public final class Connection extends EventHandler { if (_state == StateClosing) { - TraceUtil.traceRequest("received batch request " + - "during closing\n" + - "(ignored by server, " + - "client will retry)", - stream, _logger, - _traceLevels); + TraceUtil.traceBatchRequest("received batch " + + "request during " + + "closing\n" + + "(ignored by server, " + + "client will retry)", + stream, _logger, + _traceLevels); } else { - TraceUtil.traceRequest("received batch request", - stream, _logger, - _traceLevels); + TraceUtil.traceBatchRequest("received batch " + + "request", stream, + _logger, _traceLevels); invoke = true; batch = true; } @@ -523,6 +524,9 @@ public final class Connection extends EventHandler return; } + // + // Fill in the message size + // os.pos(3); final int sz = os.size(); os.writeInt(sz); @@ -541,16 +545,8 @@ public final class Connection extends EventHandler } catch (Ice.LocalException ex) { - _mutex.lock(); - try - { - setState(StateClosed, ex); - return; - } - finally - { - _mutex.unlock(); - } + setState(StateClosed, ex); + return; } } finally @@ -760,7 +756,11 @@ public final class Connection extends EventHandler { if (_warn) { - String s = "connection exception:\n" + ex + '\n' + + java.io.StringWriter sw = new java.io.StringWriter(); + java.io.PrintWriter pw = new java.io.PrintWriter(sw); + ex.printStackTrace(pw); + pw.flush(); + String s = "connection exception:\n" + sw.toString() + '\n' + _transceiver.toString(); _logger.warning(s); } diff --git a/java/src/IceInternal/DispatchStatus.java b/java/src/IceInternal/DispatchStatus.java index 6bd186cb4f6..74f53c7099a 100644 --- a/java/src/IceInternal/DispatchStatus.java +++ b/java/src/IceInternal/DispatchStatus.java @@ -12,6 +12,9 @@ package IceInternal; public final class DispatchStatus { + private static DispatchStatus[] __values = new DispatchStatus[10]; + private int __value; + public static final int _DispatchOK = 0; public static final DispatchStatus DispatchOK = new DispatchStatus(_DispatchOK); public static final int _DispatchUserException = 1; @@ -52,8 +55,4 @@ public final class DispatchStatus __value = val; __values[val] = this; } - - private static DispatchStatus[] __values = new DispatchStatus[10]; - - private int __value; } diff --git a/java/src/IceInternal/Incoming.java b/java/src/IceInternal/Incoming.java index 2a9802d54f0..0ca9f066e39 100644 --- a/java/src/IceInternal/Incoming.java +++ b/java/src/IceInternal/Incoming.java @@ -131,7 +131,7 @@ public class Incoming if (status != DispatchStatus.DispatchOK && status != DispatchStatus.DispatchUserException) { - _os.resize(statusPos); + _os.resize(statusPos, false); _os.writeByte((byte)status.value()); } else @@ -153,7 +153,7 @@ public class Incoming _is.endReadEncaps(); _os.endWriteEncaps(); - _os.resize(statusPos); + _os.resize(statusPos, false); _os.writeByte((byte)DispatchStatus._DispatchLocationForward); _os.writeProxy(ex._prx); } @@ -169,7 +169,7 @@ public class Incoming _is.endReadEncaps(); _os.endWriteEncaps(); - _os.resize(statusPos); + _os.resize(statusPos, false); _os.writeByte((byte)DispatchStatus._DispatchProxyRequested); } */ @@ -184,7 +184,7 @@ public class Incoming _is.endReadEncaps(); _os.endWriteEncaps(); - _os.resize(statusPos); + _os.resize(statusPos, false); _os.writeByte((byte)DispatchStatus._DispatchUnknownLocalException); throw ex; @@ -201,7 +201,7 @@ public class Incoming _is.endReadEncaps(); _os.endWriteEncaps(); - _os.resize(statusPos); + _os.resize(statusPos, false); _os.writeByte((byte)DispatchStatus._DispatchUnknownUserException); throw ex; @@ -218,7 +218,7 @@ public class Incoming _is.endReadEncaps(); _os.endWriteEncaps(); - _os.resize(statusPos); + _os.resize(statusPos, false); _os.writeByte((byte)DispatchStatus._DispatchUnknownException); Ice.UnknownException ue = new Ice.UnknownException(); diff --git a/java/src/IceInternal/Instance.java b/java/src/IceInternal/Instance.java index c67bfc95bfd..b63a1451af7 100644 --- a/java/src/IceInternal/Instance.java +++ b/java/src/IceInternal/Instance.java @@ -92,7 +92,12 @@ public class Instance return _defaultHost; } - public synchronized BufferManager + // + // TODO: This should be synchronized, but it causes a deadlock + // on shutdown if a BasicStream is created while the Instance + // is already locked (e.g., in ThreadPool) + // + public /*synchronized*/ BufferManager bufferManager() { return _bufferManager; diff --git a/java/src/IceInternal/Network.java b/java/src/IceInternal/Network.java index 1ff51473233..d971a4117d0 100644 --- a/java/src/IceInternal/Network.java +++ b/java/src/IceInternal/Network.java @@ -63,7 +63,10 @@ public final class Network { try { - return java.nio.channels.DatagramChannel.open(); + java.nio.channels.DatagramChannel fd = + java.nio.channels.DatagramChannel.open(); + fd.configureBlocking(false); + return fd; } catch (java.io.IOException ex) { @@ -310,8 +313,12 @@ public final class Network java.net.Socket socket = result.socket(); socket.setTcpNoDelay(true); socket.setKeepAlive(true); + // + // Need to set non-blocking in order to use Selector + // + result.configureBlocking(false); } - catch (java.net.SocketException ex) + catch (java.io.IOException ex) { Ice.SocketException se = new Ice.SocketException(); se.initCause(ex); diff --git a/java/src/IceInternal/ThreadPool.java b/java/src/IceInternal/ThreadPool.java index ab546184359..e73e01b84b4 100644 --- a/java/src/IceInternal/ThreadPool.java +++ b/java/src/IceInternal/ThreadPool.java @@ -343,13 +343,22 @@ public final class ThreadPool HandlerInfo info = _adds; while (info != null) { + int op; + if ((info.fd.validOps() & + java.nio.channels.SelectionKey.OP_READ) > 0) + { + op = java.nio.channels.SelectionKey.OP_READ; + } + else + { + op = java.nio.channels.SelectionKey.OP_ACCEPT; + } + _handlers++; try { - info.key = info.fd.register( - _selector, - java.nio.channels.SelectionKey.OP_READ, - info); + info.key = + info.fd.register(_selector, op, info); } catch (java.nio.channels.ClosedChannelException ex) { @@ -469,7 +478,7 @@ public final class ThreadPool { if (stream.size() == 0) { - stream.resize(Protocol.headerSize); + stream.resize(Protocol.headerSize, true); stream.pos(0); } @@ -504,7 +513,7 @@ public final class ThreadPool { throw new Ice.MemoryLimitException(); } - stream.resize(size); + stream.resize(size, true); stream.pos(pos); } @@ -515,52 +524,6 @@ public final class ThreadPool } } - private static void - dumpBuffer(java.nio.ByteBuffer buf) - { - final int inc = 8; - - byte[] data = new byte[buf.remaining()]; - int pos = buf.position(); - buf.get(data); - buf.position(pos); - - for(int i = 0; i < data.length; i += inc) - { - for(int j = i ; j - i < inc ; j++) - { - if(j < data.length) - { - int n = (int)data[j]; - if(n < 0) - n += 256; - String s; - if(n < 10) - s = " " + n; - else if(n < 100) - s = " " + n; - else - s = "" + n; - System.out.print(s + " "); - } - else - System.out.print(" "); - } - - System.out.print('"'); - - for(int j = i; j < data.length && j - i < inc; j++) - { - if(data[j] >= (byte)32 && data[j] < (byte)127) - System.out.print((char)data[j]); - else - System.out.print('.'); - } - - System.out.println('"'); - } - } - private static final class HandlerInfo { java.nio.channels.SelectableChannel fd; @@ -605,14 +568,21 @@ public final class ThreadPool } catch (Ice.LocalException ex) { - String s = "exception in thread pool:\n" + ex; - // TODO: Stack trace? + java.io.StringWriter sw = new java.io.StringWriter(); + java.io.PrintWriter pw = new java.io.PrintWriter(sw); + ex.printStackTrace(pw); + pw.flush(); + String s = "exception in thread pool:\n" + sw.toString(); _pool._instance.logger().error(s); } catch (RuntimeException ex) { - String s = "unknown exception in thread pool:\n" + ex; - // TODO: Stack trace? + java.io.StringWriter sw = new java.io.StringWriter(); + java.io.PrintWriter pw = new java.io.PrintWriter(sw); + ex.printStackTrace(pw); + pw.flush(); + String s = "unknown exception in thread pool:\n" + + sw.toString(); _pool._instance.logger().error(s); } diff --git a/java/src/IceInternal/TraceUtil.java b/java/src/IceInternal/TraceUtil.java index 2ca8b5402ce..479ceaf7cd5 100644 --- a/java/src/IceInternal/TraceUtil.java +++ b/java/src/IceInternal/TraceUtil.java @@ -18,6 +18,7 @@ final class TraceUtil { if (tl.protocol >= 1) { + stream.disableStringReadTableUpdates(); int pos = stream.pos(); stream.pos(0); java.io.StringWriter s = new java.io.StringWriter(); @@ -25,6 +26,7 @@ final class TraceUtil printHeader(s, stream); logger.trace(tl.protocolCat, s.toString()); stream.pos(pos); + stream.enableStringReadTableUpdates(); } } @@ -34,6 +36,7 @@ final class TraceUtil { if (tl.protocol >= 1) { + stream.disableStringReadTableUpdates(); int pos = stream.pos(); stream.pos(0); java.io.StringWriter s = new java.io.StringWriter(); @@ -48,6 +51,7 @@ final class TraceUtil printRequestHeader(s, stream); logger.trace(tl.protocolCat, s.toString()); stream.pos(pos); + stream.enableStringReadTableUpdates(); } } @@ -57,6 +61,7 @@ final class TraceUtil { if (tl.protocol >= 1) { + stream.disableStringReadTableUpdates(); int pos = stream.pos(); stream.pos(0); java.io.StringWriter s = new java.io.StringWriter(); @@ -72,6 +77,7 @@ final class TraceUtil } logger.trace(tl.protocolCat, s.toString()); stream.pos(pos); + stream.enableStringReadTableUpdates(); } } @@ -81,6 +87,7 @@ final class TraceUtil { if (tl.protocol >= 1) { + stream.disableStringReadTableUpdates(); int pos = stream.pos(); stream.pos(0); java.io.StringWriter s = new java.io.StringWriter(); @@ -135,6 +142,53 @@ final class TraceUtil } logger.trace(tl.protocolCat, s.toString()); stream.pos(pos); + stream.enableStringReadTableUpdates(); + } + } + + public static void + dumpStream(BasicStream stream) + { + final int inc = 8; + + int pos = stream.pos(); + stream.pos(0); + + byte[] data = stream.readBlob(stream.size()); + + for(int i = 0; i < data.length; i += inc) + { + for(int j = i ; j - i < inc ; j++) + { + if(j < data.length) + { + int n = (int)data[j]; + if(n < 0) + n += 256; + String s; + if(n < 10) + s = " " + n; + else if(n < 100) + s = " " + n; + else + s = "" + n; + System.out.print(s + " "); + } + else + System.out.print(" "); + } + + System.out.print('"'); + + for(int j = i; j < data.length && j - i < inc; j++) + { + if(data[j] >= (byte)32 && data[j] < (byte)127) + System.out.print((char)data[j]); + else + System.out.print('.'); + } + + System.out.println('"'); } } diff --git a/java/src/IceInternal/UdpTransceiver.java b/java/src/IceInternal/UdpTransceiver.java index b872ec69a2d..e451b7b9bb1 100644 --- a/java/src/IceInternal/UdpTransceiver.java +++ b/java/src/IceInternal/UdpTransceiver.java @@ -97,9 +97,10 @@ final class UdpTransceiver implements Transceiver assert(!_sender); assert(stream.pos() == 0); final int packetSize = 64 * 1024; // TODO: configurable - stream.resize(packetSize); + stream.resize(packetSize, true); java.nio.ByteBuffer buf = stream.prepareRead(); + buf.position(0); while (true) { try @@ -114,7 +115,7 @@ final class UdpTransceiver implements Transceiver _logger.trace(_traceLevels.networkCat, s); } - stream.resize(tot); + stream.resize(tot, true); stream.pos(tot); break; } |