Skip to content

Commit 664df09

Browse files
committed
release inactive long-polling channel from ClientsBox to avoid memory leak
1 parent 25531de commit 664df09

File tree

3 files changed

+39
-31
lines changed

3 files changed

+39
-31
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@
55
/target
66

77
/gnupg
8+
.idea
9+
*.iml

src/main/java/com/corundumstudio/socketio/handler/ClientHead.java

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,6 @@
1515
*/
1616
package com.corundumstudio.socketio.handler;
1717

18-
import java.net.SocketAddress;
19-
import java.util.HashMap;
20-
import java.util.Map;
21-
import java.util.Map.Entry;
22-
import java.util.Queue;
23-
import java.util.Set;
24-
import java.util.UUID;
25-
import java.util.concurrent.TimeUnit;
26-
import java.util.concurrent.atomic.AtomicBoolean;
27-
28-
import org.slf4j.Logger;
29-
import org.slf4j.LoggerFactory;
30-
3118
import com.corundumstudio.socketio.Configuration;
3219
import com.corundumstudio.socketio.DisconnectableHub;
3320
import com.corundumstudio.socketio.HandshakeData;
@@ -43,13 +30,20 @@
4330
import com.corundumstudio.socketio.store.Store;
4431
import com.corundumstudio.socketio.store.StoreFactory;
4532
import com.corundumstudio.socketio.transport.NamespaceClient;
46-
4733
import io.netty.channel.Channel;
4834
import io.netty.channel.ChannelFuture;
4935
import io.netty.channel.ChannelFutureListener;
5036
import io.netty.handler.codec.http.HttpHeaderNames;
5137
import io.netty.util.AttributeKey;
5238
import io.netty.util.internal.PlatformDependent;
39+
import org.slf4j.Logger;
40+
import org.slf4j.LoggerFactory;
41+
42+
import java.net.SocketAddress;
43+
import java.util.*;
44+
import java.util.Map.Entry;
45+
import java.util.concurrent.TimeUnit;
46+
import java.util.concurrent.atomic.AtomicBoolean;
5347

5448
public class ClientHead {
5549

@@ -105,6 +99,14 @@ public void bindChannel(Channel channel, Transport transport) {
10599
sendPackets(transport, channel);
106100
}
107101

102+
public void releasePollingChannel(Channel channel) {
103+
TransportState state = channels.get(Transport.POLLING);
104+
if(channel.equals(state.getChannel())) {
105+
clientsBox.remove(channel);
106+
state.update(null);
107+
}
108+
}
109+
108110
public String getOrigin() {
109111
return handshakeData.getHttpHeaders().get(HttpHeaderNames.ORIGIN);
110112
}

src/main/java/com/corundumstudio/socketio/transport/PollingTransport.java

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,6 @@
1515
*/
1616
package com.corundumstudio.socketio.transport;
1717

18-
import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;
19-
20-
import java.io.IOException;
21-
import java.util.List;
22-
import java.util.UUID;
23-
24-
import org.slf4j.Logger;
25-
import org.slf4j.LoggerFactory;
26-
2718
import com.corundumstudio.socketio.Transport;
2819
import com.corundumstudio.socketio.handler.AuthorizeHandler;
2920
import com.corundumstudio.socketio.handler.ClientHead;
@@ -33,19 +24,21 @@
3324
import com.corundumstudio.socketio.messages.XHROptionsMessage;
3425
import com.corundumstudio.socketio.messages.XHRPostMessage;
3526
import com.corundumstudio.socketio.protocol.PacketDecoder;
36-
3727
import io.netty.buffer.ByteBuf;
28+
import io.netty.channel.Channel;
3829
import io.netty.channel.ChannelFutureListener;
3930
import io.netty.channel.ChannelHandler.Sharable;
4031
import io.netty.channel.ChannelHandlerContext;
4132
import io.netty.channel.ChannelInboundHandlerAdapter;
42-
import io.netty.handler.codec.http.DefaultHttpResponse;
43-
import io.netty.handler.codec.http.FullHttpRequest;
44-
import io.netty.handler.codec.http.HttpHeaderNames;
45-
import io.netty.handler.codec.http.HttpMethod;
46-
import io.netty.handler.codec.http.HttpResponse;
47-
import io.netty.handler.codec.http.HttpResponseStatus;
48-
import io.netty.handler.codec.http.QueryStringDecoder;
33+
import io.netty.handler.codec.http.*;
34+
import org.slf4j.Logger;
35+
import org.slf4j.LoggerFactory;
36+
37+
import java.io.IOException;
38+
import java.util.List;
39+
import java.util.UUID;
40+
41+
import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;
4942

5043
@Sharable
5144
public class PollingTransport extends ChannelInboundHandlerAdapter {
@@ -186,4 +179,15 @@ private void sendError(ChannelHandlerContext ctx) {
186179
ctx.channel().writeAndFlush(res).addListener(ChannelFutureListener.CLOSE);
187180
}
188181

182+
@Override
183+
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
184+
final Channel channel = ctx.channel();
185+
ClientHead client = clientsBox.get(channel);
186+
if (client != null && client.isTransportChannel(ctx.channel(), Transport.POLLING)) {
187+
log.debug("channel inactive {}", client.getSessionId());
188+
client.releasePollingChannel(channel);
189+
}
190+
super.channelInactive(ctx);
191+
}
192+
189193
}

0 commit comments

Comments
 (0)