莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

              今年在閱讀某個項目源碼的時候看到DelayQueue的使用,xmemcached 1.2.6.1的重連任務(wù)也是采用DelayQueue管理,ReconnectRequest實現(xiàn)Delayed接口,我突然想起去review下xmc的源碼,發(fā)現(xiàn)一個嚴(yán)重的BUG,原始代碼如下:
          public final class ReconnectRequest implements Delayed {
                
          public long getDelay(TimeUnit unit) {
                  
          return  nextReconnectTimestamp - System.currentTimeMillis();
              }
          }

              getDelay返回該任務(wù)還剩下多少時間可以被執(zhí)行,將下次執(zhí)行的時間戳減去當(dāng)前時間即可,問題在于這里返回的是毫秒,而沒有調(diào)用getDelay傳入的TimeUnit做轉(zhuǎn)換,在DelayQueue內(nèi)部其實是用納秒做單位交給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;

                              }
                          }
                      }
            
               最終導(dǎo)致的問題是,awaitNanos很快返回(awaitNanos接受的是納秒,這里卻傳入毫秒),循環(huán)執(zhí)行發(fā)現(xiàn)重新計算的delay仍然大于0,循環(huán)等到getDelay返回的越來越小直到0才執(zhí)行相應(yīng)的Task,,造成的現(xiàn)象是在重連的時候cpu占用率很高。

               單元測試的時候沒有發(fā)現(xiàn)這個問題,主要是因為功能正常,沒有關(guān)注資源消耗情況,因此慚愧地忽略了。

                解決的辦法很簡單,修改getDelay方法即可:
              public long getDelay(TimeUnit unit) {
                  
          return unit.convert(
                          nextReconnectTimestamp 
          - System.currentTimeMillis(),
                          TimeUnit.MILLISECONDS);
              }

                這個BUG比較嚴(yán)重,已經(jīng)升級1.2.6.1的朋友建議馬上升級到1.2.6.2,使用maven的朋友只要修改版本即可,沒有使用maven的請到這里下載。


          評論

          # re: xmemcached 1.2.6.2緊急發(fā)布(升級到1.2.6.1的朋友注意)  回復(fù)  更多評論   

          2010-10-23 15:27 by nmb
          粗心呀!

          # re: xmemcached 1.2.6.2緊急發(fā)布(升級到1.2.6.1的朋友注意)  回復(fù)  更多評論   

          2010-10-23 22:25 by nbm
          我使用maven構(gòu)建項目,請問xmemcached放在google的maven倉庫地址是多少?

          還想問一下xmemcached的包組織結(jié)構(gòu)為什么不是com.googlecode而是net.rubyeye.?
          和ruby語言有關(guān)嗎

          最后想知道像Clojure這類的腳本語言主要用在什么地方?

          # re: xmemcached 1.2.6.2緊急發(fā)布(升級到1.2.6.1的朋友注意)  回復(fù)  更多評論   

          2010-10-23 23:22 by nmb
          我使用maven構(gòu)建項目,請問xmemcached放在google的maven倉庫地址是多少?
          這個我已經(jīng)知道了。

          還想問一下,怎么樣把artifact提交到maven的中心倉庫?需要注冊什么的嗎?

          # re: xmemcached 1.2.6.2緊急發(fā)布(升級到1.2.6.1的朋友注意)  回復(fù)  更多評論   

          2010-10-25 09:51 by denniis
          @nmb
          xmc是放入maven中心倉庫的,怎么放入?yún)⒖歼@個文檔
          https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide#SonatypeOSSMavenRepositoryUsageGuide-10.ReleaseIt
          主站蜘蛛池模板: 平定县| 长宁区| 新河县| 长岛县| 缙云县| 铜川市| 衢州市| 新津县| 陇川县| 罗山县| 澄迈县| 金秀| 蒙城县| 宜兰市| 迁安市| 大同市| 永昌县| 金秀| 墨江| 同德县| 会东县| 色达县| 遂宁市| 瑞安市| 永宁县| 嘉祥县| 隆化县| 陆川县| 益阳市| 乐清市| 清镇市| 伊春市| 镇康县| 宁波市| 佛山市| 澜沧| 营口市| 新田县| 渝北区| 新河县| 文水县|