xmemcached 1.2.6.2紧急发布(升级到1.2.6.1的朋友注意)

简介:

    今年在阅读某个项目源码的时候看到DelayQueue的使用, xmemcached 1.2.6.1的重连任务也是采用DelayQueue管理,ReconnectRequest实现Delayed接口,我突然想起去review下xmc的源码,发现一个严重的BUG,原始代码如下:
public   final   class  ReconnectRequest  implements  Delayed {
      
public   long  getDelay(TimeUnit unit) {
        
return   nextReconnectTimestamp  -  System.currentTimeMillis();
    }
}

    getDelay返回该任务还剩下多少时间可以被执行,将下次执行的时间戳减去当前时间即可,问题在于这里返回的是毫秒,而没有调用getDelay传入的TimeUnit做转换,在DelayQueue内部其实是用纳秒做单位交给Condition对象去等待
   for  (;;) {
                E first 
=  q.peek();
                
if  (first  ==   null ) {
                    available.await();
                } 
else  {
                    
long  delay  =   first.getDelay(TimeUnit.NANOSECONDS);
                    
if  (delay  >   0 ) {
                        
long  tl  =  available.awaitNanos(delay);
                    } 
else  {
                        E x 
=  q.poll();
                        
assert  x  !=   null ;
                        
if  (q.size()  !=   0 )
                            available.signalAll(); 
//  wake up other takers
                         return  x;

                    }
                }
            }
  
     最终导致的问题是, awaitNanos很快返回( awaitNanos接受的是纳秒,这里却传入毫秒) ,循环执行发现重新计算的delay仍然大于0,循环等到getDelay返回的越来越小直到0才执行相应的Task,,造成的现象是在重连的时候cpu占用率很高。

     单元测试的时候没有发现这个问题,主要是因为功能正常,没有关注资源消耗情况,因此惭愧地忽略了。

      解决的办法很简单,修改getDelay方法即可:
     public   long  getDelay(TimeUnit unit) {
        
return  unit.convert(
                nextReconnectTimestamp 
-  System.currentTimeMillis(),
                TimeUnit.MILLISECONDS);
    }


      这个BUG比较严重,已经升级1.2.6.1的朋友建议马上升级到1.2.6.2,使用maven的朋友只要修改版本即可,没有使用maven的请到这里下载。

文章转自庄周梦蝶  ,原文发布时间 2010-10-22

目录
相关文章
|
6月前
|
设计模式 负载均衡 Java
软件公司发新版本前会做些什么?
软件开发一般不会上来就是最终版本,而是会一个版本一个版本的迭代。新版本上线前都会经过测试,但就算这样,也不能保证上线了不出问题。所以,在公司里上线新版本代码一般都是通过灰度系统。新版本代码的上线基本都会用灰度系统,可以逐步放量的方式来保证上线过程不会出大问题,也可以用来做产品 AB 实验。我们可以用 nginx 实现这样的功能。nginx 有反向代理的功能,可以转发请求到应用服务器,也叫做网关层。我们可以在这一层根据 cookie 里的 version 字段来决定转发请求到哪个服务。
77 1
|
SQL 分布式计算 安全
【紧急】继续折腾,Log4j再发2.16.0,强烈建议升级
由于SLF4J适配兼容性的中断,Log4j 现在发布两个版本的SLF4J to Log4j的适配器。log4j-slf4j-impl对应 SLF4J 1.7.x 及更早版本;log4j-slf4j18-impl对应SLF4J 1.8.x 及更高版本一起使用。SLF4J-2.0.0 alpha 版本目前还不完全支持。
208 0
|
SQL Java 大数据
ChunJun 1.16 Release版本即将发布,bug 捉虫活动邀您参与!
【ChunJun 1.16 新版本 bug 捉虫活动开始啦!奖品丰厚,等你来拿!】 ChunJun 即将迎来 1.16 Release 版本的正式发布。由于升级初期测试验证的场景覆盖不全,需要更多小伙伴的力量一起来帮忙验证,发现和修复问题,因此 ChunJun 社区决定广发英雄帖,邀请各路捉虫达人,一起帮助 ChunJun 在稳定性上更上一层楼。我们也将送出智能音箱、星巴克礼品卡、蓝牙耳机等多项好礼作为报答。 详情请点进正文查看~
146 0
ChunJun 1.16 Release版本即将发布,bug 捉虫活动邀您参与!
|
JavaScript 前端开发 API
千呼万唤始出来,ElementPlus正式版正式发布,VueAdminWorkX第一时间升级更新
千呼万唤始出来,ElementPlus正式版正式发布,VueAdminWorkX第一时间升级更新
千呼万唤始出来,ElementPlus正式版正式发布,VueAdminWorkX第一时间升级更新
|
前端开发 架构师 安全
听说你在生产环境下还没关闭Swagger2,算你猛
Swagger用于开发期间前端和后端API上的交流使用,请注意是开发期间也就是开发环境,测试环境也可以使用,但是生产环境就不需要使用了,因为生产环境前端已经和后端打通了就不需要在使用Swagger了,如果生产环境没有关闭Swagger有啥后果?
|
Java 微服务 Spring
SpringCloud升级之路2020.0.x版-42.SpringCloudGateway 现有的可供分析的请求日志以及缺陷(下)
SpringCloud升级之路2020.0.x版-42.SpringCloudGateway 现有的可供分析的请求日志以及缺陷(下)
|
JSON 监控 Java
SpringCloud升级之路2020.0.x版-42.SpringCloudGateway 现有的可供分析的请求日志以及缺陷(上)
SpringCloud升级之路2020.0.x版-42.SpringCloudGateway 现有的可供分析的请求日志以及缺陷(上)
SpringCloud升级之路2020.0.x版-42.SpringCloudGateway 现有的可供分析的请求日志以及缺陷(上)
|
Oracle 安全 Java
JDK 16 正式发布,一次性发布 17 个新特性…不服不行!
JDK 16 正式发布 牛逼啊,JDK 15 刚发布半年(2020/09/15),JDK 16 又如期而至(2021/03/16),老铁们,跟上。 来看下 Oracle Java 支持路线图:
153 0
JDK 16 正式发布,一次性发布 17 个新特性…不服不行!
|
小程序 网络安全 API
技术干货 | mPaaS 客户端问题排查:漫长的 3s 等待之谜
对于开发者来说,排查手段已经不再局限于构建代码过程中的调试,往往需要扩充排查方法,从多种途径对问题进行分析和定位。这篇文章会和大家分享 mPaaS 开发者的一例小程序网络性能问题排查之旅。
991 0
技术干货 | mPaaS 客户端问题排查:漫长的 3s 等待之谜
|
安全
微软紧急发布10个IE补丁 用户应火速升级
3月30日,微软紧急发布MS10-018安全更新,此安全更新可消除9个秘密报告的漏洞以及一个公开披露的漏洞,其中多个漏洞被评级为“危急”。金山卫士安全中心已经在第一时间升级了漏洞特征库,为用户提供相应的漏洞修复服务。
774 0