From 149d97d0137f55ea9c14e3822e01f8796a34ffa6 Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Mon, 16 Feb 2009 11:59:33 +0000 Subject: [PATCH] * Fixed issue: NETTY-125 (Backward incompatible) Use an integer as a Channel ID instead of UUID * More concise Channel.toString() and ChannelEvent.toString() implementations --- .../jboss/netty/channel/AbstractChannel.java | 44 +++++++++++++++---- .../java/org/jboss/netty/channel/Channel.java | 5 +-- .../DefaultChildChannelStateEvent.java | 5 +-- .../netty/channel/DefaultExceptionEvent.java | 2 +- .../channel/DefaultWriteCompletionEvent.java | 3 +- .../channel/DownstreamChannelStateEvent.java | 17 ++++--- .../netty/channel/DownstreamMessageEvent.java | 8 ++-- .../channel/UpstreamChannelStateEvent.java | 16 +++---- .../netty/channel/UpstreamMessageEvent.java | 8 ++-- .../netty/channel/group/ChannelGroup.java | 3 +- .../channel/group/ChannelGroupFuture.java | 3 +- .../channel/group/DefaultChannelGroup.java | 36 +++++++-------- .../group/DefaultChannelGroupFuture.java | 9 ++-- .../timeout/DefaultIdleStateEvent.java | 4 +- 14 files changed, 90 insertions(+), 73 deletions(-) diff --git a/src/main/java/org/jboss/netty/channel/AbstractChannel.java b/src/main/java/org/jboss/netty/channel/AbstractChannel.java index d9c0517674..24b6a4a03b 100644 --- a/src/main/java/org/jboss/netty/channel/AbstractChannel.java +++ b/src/main/java/org/jboss/netty/channel/AbstractChannel.java @@ -23,9 +23,9 @@ package org.jboss.netty.channel; import java.net.SocketAddress; -import java.util.UUID; +import java.util.concurrent.ConcurrentMap; -import org.jboss.netty.util.TimeBasedUuidGenerator; +import org.jboss.netty.util.ConcurrentHashMap; /** * A skeletal {@link Channel} implementation. @@ -38,7 +38,35 @@ import org.jboss.netty.util.TimeBasedUuidGenerator; */ public abstract class AbstractChannel implements Channel { - private final UUID id = TimeBasedUuidGenerator.generate(); + static final ConcurrentMap allChannels = new ConcurrentHashMap(); + private static final IdDeallocator ID_DEALLOCATOR = new IdDeallocator(); + + private static Integer allocateId(Channel channel) { + Integer id = Integer.valueOf(System.identityHashCode(channel)); + for (;;) { + // Loop until a unique ID is acquired. + // It should be found in one loop practically. + if (allChannels.putIfAbsent(id, channel) == null) { + // Successfully acquired. + return id; + } else { + // Taken by other channel at almost the same moment. + id = Integer.valueOf(id.intValue() + 1); + } + } + } + + private static final class IdDeallocator implements ChannelFutureListener { + IdDeallocator() { + super(); + } + + public void operationComplete(ChannelFuture future) throws Exception { + allChannels.remove(future.getChannel().getId()); + } + } + + private final Integer id = allocateId(this); private final Channel parent; private final ChannelFactory factory; private final ChannelPipeline pipeline; @@ -69,10 +97,11 @@ public abstract class AbstractChannel implements Channel { this.parent = parent; this.factory = factory; this.pipeline = pipeline; + closeFuture.addListener(ID_DEALLOCATOR); pipeline.attach(this, sink); } - public final UUID getId() { + public final Integer getId() { return id; } @@ -225,9 +254,8 @@ public abstract class AbstractChannel implements Channel { } StringBuilder buf = new StringBuilder(128); - buf.append(getClass().getSimpleName()); - buf.append("(id: "); - buf.append(id.toString()); + buf.append("[id: 0x"); + buf.append(Integer.toHexString(id.intValue())); if (connected) { buf.append(", "); @@ -245,7 +273,7 @@ public abstract class AbstractChannel implements Channel { buf.append(getLocalAddress()); } - buf.append(')'); + buf.append(']'); String strVal = buf.toString(); if (connected) { diff --git a/src/main/java/org/jboss/netty/channel/Channel.java b/src/main/java/org/jboss/netty/channel/Channel.java index b3fddc5a4e..123093cd46 100644 --- a/src/main/java/org/jboss/netty/channel/Channel.java +++ b/src/main/java/org/jboss/netty/channel/Channel.java @@ -24,7 +24,6 @@ package org.jboss.netty.channel; import java.net.InetSocketAddress; import java.net.SocketAddress; -import java.util.UUID; /** @@ -92,9 +91,9 @@ public interface Channel extends Comparable{ static int OP_READ_WRITE = OP_READ | OP_WRITE; /** - * Returns the {@link UUID} of this channel. + * Returns the unique integer ID of this channel. */ - UUID getId(); + Integer getId(); /** * Returns the {@link ChannelFactory} which created this channel. diff --git a/src/main/java/org/jboss/netty/channel/DefaultChildChannelStateEvent.java b/src/main/java/org/jboss/netty/channel/DefaultChildChannelStateEvent.java index 77305874d4..ce34033335 100644 --- a/src/main/java/org/jboss/netty/channel/DefaultChildChannelStateEvent.java +++ b/src/main/java/org/jboss/netty/channel/DefaultChildChannelStateEvent.java @@ -69,11 +69,8 @@ public class DefaultChildChannelStateEvent implements ChildChannelStateEvent { String channelString = getChannel().toString(); StringBuilder buf = new StringBuilder(channelString.length() + 32); buf.append(channelString); - buf.append(" - ("); - buf.append(getChildChannel().isOpen()? "CHILD_OPEN" : "CHILD_CLOSED"); - buf.append(": "); + buf.append(getChildChannel().isOpen()? " CHILD_OPEN: " : " CHILD_CLOSED: "); buf.append(getChildChannel().getId()); - buf.append(')'); return buf.toString(); } } diff --git a/src/main/java/org/jboss/netty/channel/DefaultExceptionEvent.java b/src/main/java/org/jboss/netty/channel/DefaultExceptionEvent.java index 2695a77949..8a45d97288 100644 --- a/src/main/java/org/jboss/netty/channel/DefaultExceptionEvent.java +++ b/src/main/java/org/jboss/netty/channel/DefaultExceptionEvent.java @@ -69,6 +69,6 @@ public class DefaultExceptionEvent implements ExceptionEvent { @Override public String toString() { - return getChannel().toString() + " - (EXCEPTION: " + cause + ')'; + return getChannel().toString() + " EXCEPTION: " + cause; } } diff --git a/src/main/java/org/jboss/netty/channel/DefaultWriteCompletionEvent.java b/src/main/java/org/jboss/netty/channel/DefaultWriteCompletionEvent.java index ab23c104db..164a14863a 100644 --- a/src/main/java/org/jboss/netty/channel/DefaultWriteCompletionEvent.java +++ b/src/main/java/org/jboss/netty/channel/DefaultWriteCompletionEvent.java @@ -70,9 +70,8 @@ public class DefaultWriteCompletionEvent implements WriteCompletionEvent { String channelString = getChannel().toString(); StringBuilder buf = new StringBuilder(channelString.length() + 32); buf.append(channelString); - buf.append(" - (WRITTEN_AMOUNT: "); + buf.append(" WRITTEN_AMOUNT: "); buf.append(getWrittenAmount()); - buf.append(')'); return buf.toString(); } } diff --git a/src/main/java/org/jboss/netty/channel/DownstreamChannelStateEvent.java b/src/main/java/org/jboss/netty/channel/DownstreamChannelStateEvent.java index 0f721bd85a..27db44f2f0 100644 --- a/src/main/java/org/jboss/netty/channel/DownstreamChannelStateEvent.java +++ b/src/main/java/org/jboss/netty/channel/DownstreamChannelStateEvent.java @@ -81,41 +81,40 @@ public class DownstreamChannelStateEvent implements ChannelStateEvent { String channelString = getChannel().toString(); StringBuilder buf = new StringBuilder(channelString.length() + 64); buf.append(channelString); - buf.append(" - ("); switch (getState()) { case OPEN: if (Boolean.TRUE.equals(getValue())) { - buf.append("OPEN"); + buf.append(" OPEN"); } else { - buf.append("CLOSE"); + buf.append(" CLOSE"); } break; case BOUND: if (getValue() != null) { - buf.append("BIND: "); + buf.append(" BIND: "); buf.append(getValue()); } else { - buf.append("UNBIND"); + buf.append(" UNBIND"); } break; case CONNECTED: if (getValue() != null) { - buf.append("CONNECT: "); + buf.append(" CONNECT: "); buf.append(getValue()); } else { - buf.append("DISCONNECT"); + buf.append(" DISCONNECT"); } break; case INTEREST_OPS: - buf.append("CHANGE_INTEREST: "); + buf.append(" CHANGE_INTEREST: "); buf.append(getValue()); break; default: + buf.append(' '); buf.append(getState().name()); buf.append(": "); buf.append(getValue()); } - buf.append(')'); return buf.toString(); } } diff --git a/src/main/java/org/jboss/netty/channel/DownstreamMessageEvent.java b/src/main/java/org/jboss/netty/channel/DownstreamMessageEvent.java index 2bd4580d09..7e62550cd0 100644 --- a/src/main/java/org/jboss/netty/channel/DownstreamMessageEvent.java +++ b/src/main/java/org/jboss/netty/channel/DownstreamMessageEvent.java @@ -83,12 +83,12 @@ public class DownstreamMessageEvent implements MessageEvent { @Override public String toString() { if (getRemoteAddress() == null) { - return getChannel().toString() + " - (WRITE: " + - StringUtil.stripControlCharacters(getMessage()) + ')'; + return getChannel().toString() + " WRITE: " + + StringUtil.stripControlCharacters(getMessage()); } else { - return getChannel().toString() + " - (WRITE: " + + return getChannel().toString() + " WRITE: " + StringUtil.stripControlCharacters(getMessage()) + ", " + - getRemoteAddress() + ')'; + getRemoteAddress(); } } } diff --git a/src/main/java/org/jboss/netty/channel/UpstreamChannelStateEvent.java b/src/main/java/org/jboss/netty/channel/UpstreamChannelStateEvent.java index a9f9fe59e7..4596d19f75 100644 --- a/src/main/java/org/jboss/netty/channel/UpstreamChannelStateEvent.java +++ b/src/main/java/org/jboss/netty/channel/UpstreamChannelStateEvent.java @@ -78,40 +78,38 @@ public class UpstreamChannelStateEvent implements ChannelStateEvent { String channelString = getChannel().toString(); StringBuilder buf = new StringBuilder(channelString.length() + 64); buf.append(channelString); - buf.append(" - ("); switch (getState()) { case OPEN: if (Boolean.TRUE.equals(getValue())) { - buf.append("OPEN"); + buf.append(" OPEN"); } else { - buf.append("CLOSED"); + buf.append(" CLOSED"); } break; case BOUND: if (getValue() != null) { - buf.append("BOUND: "); + buf.append(" BOUND: "); buf.append(getValue()); } else { - buf.append("UNBOUND"); + buf.append(" UNBOUND"); } break; case CONNECTED: if (getValue() != null) { - buf.append("CONNECTED: "); + buf.append(" CONNECTED: "); buf.append(getValue()); } else { - buf.append("DISCONNECTED"); + buf.append(" DISCONNECTED"); } break; case INTEREST_OPS: - buf.append("INTEREST_CHANGED"); + buf.append(" INTEREST_CHANGED"); break; default: buf.append(getState().name()); buf.append(": "); buf.append(getValue()); } - buf.append(')'); return buf.toString(); } } diff --git a/src/main/java/org/jboss/netty/channel/UpstreamMessageEvent.java b/src/main/java/org/jboss/netty/channel/UpstreamMessageEvent.java index 52f53b2b15..5d92e8304d 100644 --- a/src/main/java/org/jboss/netty/channel/UpstreamMessageEvent.java +++ b/src/main/java/org/jboss/netty/channel/UpstreamMessageEvent.java @@ -79,12 +79,12 @@ public class UpstreamMessageEvent implements MessageEvent { @Override public String toString() { if (getRemoteAddress() == null) { - return getChannel().toString() + " - (RECEIVED: " + - StringUtil.stripControlCharacters(getMessage()) + ')'; + return getChannel().toString() + " RECEIVED: " + + StringUtil.stripControlCharacters(getMessage()); } else { - return getChannel().toString() + " - (RECEIVED: " + + return getChannel().toString() + " RECEIVED: " + StringUtil.stripControlCharacters(getMessage()) + ", " + - getRemoteAddress() + ')'; + getRemoteAddress(); } } } diff --git a/src/main/java/org/jboss/netty/channel/group/ChannelGroup.java b/src/main/java/org/jboss/netty/channel/group/ChannelGroup.java index 7c760cade4..f0ba53424c 100644 --- a/src/main/java/org/jboss/netty/channel/group/ChannelGroup.java +++ b/src/main/java/org/jboss/netty/channel/group/ChannelGroup.java @@ -24,7 +24,6 @@ package org.jboss.netty.channel.group; import java.net.SocketAddress; import java.util.Set; -import java.util.UUID; import org.jboss.netty.channel.Channel; @@ -38,7 +37,7 @@ import org.jboss.netty.channel.Channel; */ public interface ChannelGroup extends Set, Comparable { String getName(); - Channel find(UUID id); + Channel find(Integer id); ChannelGroupFuture setInterestOps(int interestOps); ChannelGroupFuture setReadable(boolean readable); ChannelGroupFuture write(Object message); diff --git a/src/main/java/org/jboss/netty/channel/group/ChannelGroupFuture.java b/src/main/java/org/jboss/netty/channel/group/ChannelGroupFuture.java index f4f3ca1d47..e660d637d8 100644 --- a/src/main/java/org/jboss/netty/channel/group/ChannelGroupFuture.java +++ b/src/main/java/org/jboss/netty/channel/group/ChannelGroupFuture.java @@ -22,7 +22,6 @@ */ package org.jboss.netty.channel.group; -import java.util.UUID; import java.util.concurrent.TimeUnit; import org.jboss.netty.channel.Channel; @@ -39,7 +38,7 @@ public interface ChannelGroupFuture extends Iterable{ ChannelGroup getGroup(); - ChannelFuture find(UUID channelId); + ChannelFuture find(Integer channelId); ChannelFuture find(Channel channel); /** diff --git a/src/main/java/org/jboss/netty/channel/group/DefaultChannelGroup.java b/src/main/java/org/jboss/netty/channel/group/DefaultChannelGroup.java index 6fafa4709d..16f71515f4 100644 --- a/src/main/java/org/jboss/netty/channel/group/DefaultChannelGroup.java +++ b/src/main/java/org/jboss/netty/channel/group/DefaultChannelGroup.java @@ -50,8 +50,8 @@ public class DefaultChannelGroup extends AbstractSet implements Channel private static final AtomicInteger nextId = new AtomicInteger(); private final String name; - private final ConcurrentMap serverChannels = new ConcurrentHashMap(); - private final ConcurrentMap nonServerChannels = new ConcurrentHashMap(); + private final ConcurrentMap serverChannels = new ConcurrentHashMap(); + private final ConcurrentMap nonServerChannels = new ConcurrentHashMap(); private final ChannelFutureListener remover = new ChannelFutureListener() { public void operationComplete(ChannelFuture future) throws Exception { remove(future.getChannel()); @@ -83,7 +83,7 @@ public class DefaultChannelGroup extends AbstractSet implements Channel return nonServerChannels.size() + serverChannels.size(); } - public Channel find(UUID id) { + public Channel find(Integer id) { Channel c = nonServerChannels.get(id); if (c != null) { return c; @@ -110,7 +110,7 @@ public class DefaultChannelGroup extends AbstractSet implements Channel @Override public boolean add(Channel channel) { - ConcurrentMap map = + ConcurrentMap map = channel instanceof ServerChannel? serverChannels : nonServerChannels; boolean added = map.putIfAbsent(channel.getId(), channel) == null; @@ -175,8 +175,8 @@ public class DefaultChannelGroup extends AbstractSet implements Channel } public ChannelGroupFuture close() { - Map futures = - new HashMap(size()); + Map futures = + new HashMap(size()); for (Channel c: serverChannels.values()) { futures.put(c.getId(), c.close().awaitUninterruptibly()); @@ -189,8 +189,8 @@ public class DefaultChannelGroup extends AbstractSet implements Channel } public ChannelGroupFuture disconnect() { - Map futures = - new HashMap(size()); + Map futures = + new HashMap(size()); for (Channel c: serverChannels.values()) { futures.put(c.getId(), c.disconnect().awaitUninterruptibly()); @@ -203,8 +203,8 @@ public class DefaultChannelGroup extends AbstractSet implements Channel } public ChannelGroupFuture setInterestOps(int interestOps) { - Map futures = - new HashMap(size()); + Map futures = + new HashMap(size()); for (Channel c: serverChannels.values()) { futures.put(c.getId(), c.setInterestOps(interestOps).awaitUninterruptibly()); @@ -217,8 +217,8 @@ public class DefaultChannelGroup extends AbstractSet implements Channel } public ChannelGroupFuture setReadable(boolean readable) { - Map futures = - new HashMap(size()); + Map futures = + new HashMap(size()); for (Channel c: serverChannels.values()) { futures.put(c.getId(), c.setReadable(readable).awaitUninterruptibly()); @@ -231,8 +231,8 @@ public class DefaultChannelGroup extends AbstractSet implements Channel } public ChannelGroupFuture unbind() { - Map futures = - new HashMap(size()); + Map futures = + new HashMap(size()); for (Channel c: serverChannels.values()) { futures.put(c.getId(), c.unbind().awaitUninterruptibly()); @@ -245,8 +245,8 @@ public class DefaultChannelGroup extends AbstractSet implements Channel } public ChannelGroupFuture write(Object message) { - Map futures = - new HashMap(size()); + Map futures = + new HashMap(size()); for (Channel c: this) { futures.put(c.getId(), c.write(message)); } @@ -254,8 +254,8 @@ public class DefaultChannelGroup extends AbstractSet implements Channel } public ChannelGroupFuture write(Object message, SocketAddress remoteAddress) { - Map futures = - new HashMap(size()); + Map futures = + new HashMap(size()); for (Channel c: this) { futures.put(c.getId(), c.write(message, remoteAddress)); } diff --git a/src/main/java/org/jboss/netty/channel/group/DefaultChannelGroupFuture.java b/src/main/java/org/jboss/netty/channel/group/DefaultChannelGroupFuture.java index 5466cbd8b9..659f26de32 100644 --- a/src/main/java/org/jboss/netty/channel/group/DefaultChannelGroupFuture.java +++ b/src/main/java/org/jboss/netty/channel/group/DefaultChannelGroupFuture.java @@ -31,7 +31,6 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.UUID; import java.util.concurrent.TimeUnit; import org.jboss.netty.channel.Channel; @@ -54,7 +53,7 @@ public class DefaultChannelGroupFuture implements ChannelGroupFuture { InternalLoggerFactory.getInstance(DefaultChannelGroupFuture.class); private final ChannelGroup group; - final Map futures; + final Map futures; private volatile ChannelGroupFutureListener firstListener; private volatile List otherListeners; private boolean done; @@ -96,7 +95,7 @@ public class DefaultChannelGroupFuture implements ChannelGroupFuture { this.group = group; - Map futureMap = new HashMap(); + Map futureMap = new HashMap(); for (ChannelFuture f: futures) { futureMap.put(f.getChannel().getId(), f); } @@ -113,7 +112,7 @@ public class DefaultChannelGroupFuture implements ChannelGroupFuture { } } - DefaultChannelGroupFuture(ChannelGroup group, Map futures) { + DefaultChannelGroupFuture(ChannelGroup group, Map futures) { this.group = group; this.futures = Collections.unmodifiableMap(futures); for (ChannelFuture f: this.futures.values()) { @@ -130,7 +129,7 @@ public class DefaultChannelGroupFuture implements ChannelGroupFuture { return group; } - public ChannelFuture find(UUID channelId) { + public ChannelFuture find(Integer channelId) { return futures.get(channelId); } diff --git a/src/main/java/org/jboss/netty/handler/timeout/DefaultIdleStateEvent.java b/src/main/java/org/jboss/netty/handler/timeout/DefaultIdleStateEvent.java index 512494cead..d60086748a 100644 --- a/src/main/java/org/jboss/netty/handler/timeout/DefaultIdleStateEvent.java +++ b/src/main/java/org/jboss/netty/handler/timeout/DefaultIdleStateEvent.java @@ -73,9 +73,9 @@ public class DefaultIdleStateEvent implements IdleStateEvent { @Override public String toString() { - return getChannel().toString() + " - (" + getState() + " since " + + return getChannel().toString() + ' ' + getState() + " since " + DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.SHORT, Locale.US).format( - new Date(getLastActivityTimeMillis())) + ')'; + new Date(getLastActivityTimeMillis())); } }