Netty 里 UniqueIpFilter 的代码
public class UniqueIpFilter extends AbstractRemoteAddressFilter<InetSocketAddress> {
private final Set<InetAddress> connected = new ConcurrentSet<InetAddress>();
@Override
protected boolean accept(ChannelHandlerContext ctx, InetSocketAddress remoteAddress) throws Exception {
final InetAddress remoteIp = remoteAddress.getAddress();
if (connected.contains(remoteIp)) {
return false;
} else {
connected.add(remoteIp);
ctx.channel().closeFuture().addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
connected.remove(remoteIp);
}
});
return true;
}
}
}
逻辑很简单,就是每次连接建立时判断 set 里是否已经有新连接的远程地址。但多线程下同一个 IP 的两个请求在执行connected.contains(remoteIp)时可能出现同时为false的情况。似乎是个典型的 Test and Set 问题...
但我现在问题是不知道怎么写测试,搞了大半天了,官方也没有对这个类的测试...不管从客户端还是服务端入手,都找不到合适的时间点验证存在两个相同 IP 的连接