青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

那誰的技術博客

感興趣領域:高性能服務器編程,存儲,算法,Linux內核
隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
數據加載中……

這是tokyo cabinet的一個BUG么

最近在研讀tokyo cabinet的代碼,但是發現一個問題。
目前在跟進的是使用hash table實現的數據庫文件,在項目的examples目錄下面有一些作者寫的demo文件演示如何使用的。我使用這里的tchdbex.c文件跟蹤代碼的運行情況,不過在里面加入了下面兩行代碼:
/* store records */
  
if(!tchdbput2(hdb, "foo""hop"||
     
!tchdbput2(hdb, "bar""step"||
     
!tchdbput2(hdb, "baz""jump")){
    ecode 
= tchdbecode(hdb);
    fprintf(stderr, 
"put error: %s\n", tchdberrmsg(ecode));
  }

+  tchdbout2(hdb, "foo");
+  tchdbput2(hdb, "foo""hop");

(代碼前面加上+號的是我加上的兩行代碼)

可以看到,我在加入了記錄(“foo”, “hop”)之后,對它進行了刪除操作,在這之后緊跟著再次插入相同的記錄。
tokyo cabinet的hash-table實現中,刪除一條記錄時會將塌存放到一個free pool類型的數組中,這里面保存了這條刪除記錄的大小和在文件中的偏移量。

問題在于,在加入記錄時,記錄的大小是32byte,刪除記錄時理所當然的也是刪除一條大小為32byte的記錄了,但是呢,緊跟著再次插入同樣的記錄時,代碼中(tchdb.c):
3417      rec.rsiz = HDBMAXHSIZ + ksiz + vsiz;
3418      if(!tchdbfbpsearch(hdb, &re
3417行算出這條新插入的記錄應該是38byte,于是走入下面的函數tchdbfbpsearch 查找能滿足這個大小的freepool,之前返回的freepool是32,于是這個查找失敗了,不得不重新分配空間來存放這個新的記錄,而不是復用已經返回的空間---盡管前后兩次插入的數據大小是一樣的。
其實,在上面的代碼中,第二次插入記錄的時候,查找可用的freepool失敗之后繼續往下走,最后真正插入到文件中的數據記錄大小還是32的。

我給作者發去郵件,咨詢這個問題,作者的回答大意是說我描述的這個現象確實存在,不過是有一定的考慮在里面的,后期會進行一些改進。我沒有完全的把這部分代碼閱讀完畢,所以也就不好多說什么了,下面附上郵件內容,做一個記錄,也為可能會發現這個問題的朋友提個醒吧。

我使用的版本是1.4.19。
chuang
 發送至 hirarin
    
顯示詳細信息 
15:10 (6 小時前)
    
Hi, hirarin,recently, I 
try to read and trace the tokyocabinet source.
when I use the examples
/tchdbex.c to trace hash-table, I find a problem.

In the file tchdbex.c, I add two lines:
  
/* store records */
  
if(!tchdbput2(hdb, "foo""hop"||
     
!tchdbput2(hdb, "bar""step"||
     
!tchdbput2(hdb, "baz""jump")){
    ecode 
= tchdbecode(hdb);
    fprintf(stderr, 
"put error: %s\n", tchdberrmsg(ecode));
  }

+  tchdbout2(hdb, "foo");
+  tchdbput2(hdb, "foo""hop");

so, you can see that after insert key 
"foo","bar" and "baz", I try to remove the record with the key "foo", and then insert record ("foo","hop") again.

But, when i use gdb to trace the program, i find that, when i first insert the record (
"foo""hop"), the record size is 32.
and then, when i remove the record (
"foo""hop"), the record size is 32, it is ok, then a free block with size 32 is inserted into the free block arrays.
But, when I insert record (
"foo""hop") once again, in the file tchdb.c:3417:
3417      rec.rsiz = HDBMAXHSIZ + ksiz + vsiz;
then the record size 
is 38
and then the next line it tries to find a free block fix to 
this size, but there is only free block with size 32, so it is falied to find a free block.

I mean that, 
if I remove the record ("foo""hop") and then try to insert it again, seems that it should use the free block with size 32.Otherwise, there will be missing retrieval of the free block.

So, 
is it a bug??

BTW: the version 
is 1.4.19
 
|
Mikio Hirabayashi
 發送至 我
    
顯示詳細信息 
16:37 (5 小時前)
    
Hi,

Thanks 
for the report.
It
's not a bug but on purpose.
The header size is not calcurated at the line, I estimate it the
maximum size 
in theory.
However, I hit on an idia thanks to you.  I
'll change the logic to
reduce the file size.

Regards.



posted on 2009-12-03 22:09 那誰 閱讀(4899) 評論(0)  編輯 收藏 引用 所屬分類: tokyo cabinet

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美福利专区| 亚洲精品偷拍| 久久久久国产精品午夜一区| 国产亚洲欧美日韩美女| 久久久精彩视频| 久久久久国产一区二区三区| 在线观看视频一区| 亚洲成色777777女色窝| 一区二区三区不卡视频在线观看 | 日韩小视频在线观看| 亚洲激情视频网站| 欧美性开放视频| 久久成人人人人精品欧| 久久一区二区三区超碰国产精品| 亚洲精品久久久久久一区二区| 亚洲狼人精品一区二区三区| 国产精品一区二区三区成人| 久久精品国产免费| 欧美国产先锋| 性欧美在线看片a免费观看| 久久精品一区二区国产| 亚洲久久在线| 性欧美超级视频| 亚洲欧洲日韩在线| 亚洲午夜在线| 亚洲人久久久| 亚洲欧美综合精品久久成人| 亚洲人成高清| 欧美在线视屏| 在线一区日本视频| 久久久精品一品道一区| 亚洲一级免费视频| 美女精品国产| 欧美在线网址| 欧美三级黄美女| 欧美国产日本韩| 国内精品视频在线播放| 99日韩精品| 91久久综合| 久久国产精品毛片| 亚洲欧美精品一区| 欧美另类视频在线| 嫩草国产精品入口| 国产亚洲午夜高清国产拍精品| 日韩视频在线一区| 亚洲另类视频| 久久综合给合| 浪潮色综合久久天堂| 国产欧美日韩伦理| 亚洲视频一二区| 中日韩美女免费视频网址在线观看| 久久久www成人免费精品| 欧美在线不卡| 国产精品午夜国产小视频| 99热精品在线| 一区二区三区视频在线播放| 欧美不卡激情三级在线观看| 久热精品在线视频| 韩国av一区二区三区| 午夜精品影院| 久久不见久久见免费视频1| 国产精品久久久久久av下载红粉| 亚洲精品亚洲人成人网| 亚洲美女免费精品视频在线观看| 免费一区二区三区| 亚洲激情视频在线| 99综合在线| 欧美午夜一区二区| 亚洲色诱最新| 久久激情中文| 国产视频久久久久| 久久久久成人精品| 免费在线观看成人av| 亚洲黄色免费网站| 欧美精品v日韩精品v国产精品| 亚洲国产色一区| 中文久久乱码一区二区| 国产精品免费看| 性色av一区二区三区| 免费久久99精品国产自在现线 | 欧美精品激情在线观看| 亚洲精品一区二区在线观看| 亚洲一区二区三区视频| 国产乱码精品一区二区三区av| 亚洲欧美日韩一区二区| 久久综合电影一区| 亚洲免费高清| 国产毛片久久| 猫咪成人在线观看| 一本久道久久综合中文字幕| 久久精品国产亚洲一区二区| 亚洲福利久久| 国产精品高潮呻吟久久| 欧美亚洲系列| 亚洲精品视频二区| 久久久久久久成人| 日韩亚洲在线观看| 国产欧美精品一区aⅴ影院| 久久午夜电影网| 99视频在线观看一区三区| 久久久国产精品亚洲一区| 亚洲欧洲在线观看| 国产三级欧美三级日产三级99| 鲁大师成人一区二区三区| 亚洲视频在线一区| 欧美国产欧美亚州国产日韩mv天天看完整 | 午夜国产精品视频免费体验区| 欧美福利电影在线观看| 亚洲女性喷水在线观看一区| 影音先锋日韩资源| 国产精品视频最多的网站| 美女精品在线观看| 亚洲综合首页| 亚洲另类在线一区| 嫩草伊人久久精品少妇av杨幂| 亚洲欧美国产77777| 亚洲激情在线观看视频免费| 国产日韩欧美一二三区| 欧美四级在线观看| 欧美jjzz| 久久亚洲高清| 性高湖久久久久久久久| 一区二区三区四区国产| 亚洲黄色av| 欧美激情免费观看| 麻豆精品视频在线| 欧美一区亚洲二区| 午夜精品福利电影| 9色精品在线| 亚洲精品久久久久中文字幕欢迎你| 国产一区二区久久精品| 国产精品视频观看| 国产精品高潮呻吟视频| 欧美日韩免费观看一区=区三区| 美女在线一区二区| 久久夜色精品亚洲噜噜国产mv| 久久riav二区三区| 欧美专区在线观看| 欧美影院午夜播放| 久久大逼视频| 久久国产精品黑丝| 久久精品盗摄| 久久伊伊香蕉| 蜜桃视频一区| 欧美激情亚洲| 欧美午夜久久| 国产精品美女一区二区在线观看| 国产精品久久久久9999高清| 国产精品久久国产三级国电话系列| 欧美视频一区二区三区…| 欧美午夜不卡在线观看免费 | 国产精品高清在线| 国产精品乱看| 国产综合香蕉五月婷在线| 国产亚洲欧美一区| 亚洲第一天堂av| 亚洲日本成人| 亚洲视频欧洲视频| 欧美一区二区三区四区高清| 久久精品国产99| 免费一级欧美在线大片| 亚洲国产高清高潮精品美女| 亚洲精品系列| 欧美一区二区三区免费视频| 久久久久网站| 欧美日韩成人在线播放| 国产精品免费看久久久香蕉| 国模精品一区二区三区色天香| 亚洲国产精品久久久久秋霞蜜臀| 日韩视频二区| 久久成人在线| 亚洲国产精品高清久久久| 99pao成人国产永久免费视频| 亚洲一区影院| 免费在线欧美视频| 国产精品欧美一区喷水| 亚洲成色精品| 亚洲一区精彩视频| 麻豆精品网站| 中文无字幕一区二区三区| 久久久久国产精品一区| 欧美日韩成人在线| 国内精品久久久久影院薰衣草| 亚洲麻豆国产自偷在线| 欧美影院在线| 亚洲剧情一区二区| 久久久久久免费| 国产精品久久久久久福利一牛影视| 加勒比av一区二区| 亚洲欧美成人精品| 亚洲第一在线综合网站| 性欧美办公室18xxxxhd| 欧美日韩一区二区精品| 在线日本高清免费不卡| 性感少妇一区| 中日韩午夜理伦电影免费| 欧美mv日韩mv国产网站| 狠狠狠色丁香婷婷综合激情| 亚洲欧美精品一区| 亚洲精品日韩激情在线电影|