Jmemcached 的小bug!

王全 发布于 2009/05/22 14:46
阅读 890
收藏 1

Jmemcached 对于memcache协议那块处理有个bug!
当启动memcached,客户端连接到jmemcached后,随便输入一个错误的命令比如(set sdfsd) 回车, 发现客户端返回Client_ERROR,这步是正常的。如果这时候继续输入命令,发现不管输入任何命令(比如刚输入个g字符)server就返回CLIENT_ERROR,导致整个会话不能使用。
经过仔细测试,发现在一个会话中只要有一次命令使用出错(比如误操作),那么这个会话永远就不能再使用

解决办法

找到其CommandDecoderl类,在他的decode方法中,定位到方法末端如下代码

        if (returnedSessionStatus.state != ERROR) {
            session.setAttribute(SESSION_STATUS, returnedSessionStatus);
            return MessageDecoderResult.OK;
        } else{
            return MessageDecoderResult.NOT_OK;
        }

在else 中加入 in.flip();即可,改后如下

        if (returnedSessionStatus.state != ERROR) {
            session.setAttribute(SESSION_STATUS, returnedSessionStatus);
            return MessageDecoderResult.OK;
        } else{
            in.flip();
            return MessageDecoderResult.NOT_OK;
        }

 

 然后再次测试,问题解决!

原因是jmemcached对于memcached协议数据包处理方式不完善,他的处理机制中没有容错处理(如果接受到的buffer有错误,buffer一直得不到 clear)。

小弟认为,这个 decoder可以借鉴mina 的 CumulativeProtocolDecoder来处理,对每次收到的数据进行换位累包.而不是一直在原buffer上累包!

各位说下自己的看法

 

 

 

 

 

 

 

 

 

 

 

 

加载中
0
红薯
红薯

不从成熟度来看,memcached 关键是性能优势,它用 C 语言,而 jmemcached 用 java 开发,不知道这性能怎样

0
王全
王全

下个礼拜我用jmemcached 和 win memcached  分别做个性能比较 ,

客户端我将使用 spymemcached (至于 whatlin,性能上略劣与spymemcached)。

不过我预测jmemcached性能偏差应该不是太大

返回顶部
顶部