berkeley db 源碼分析2!!

來源:互聯網
上載者:User

隨便亂寫的 上班沒事情,很多地方都是猜測或者不準。

1)bdb 編譯 在build_windows 和build_unix 目錄下 進行編譯。vc 直接點VC6的dsw轉換VC9。記得編譯時間把編譯選項設定為DEBUG X86.

2)最近兩天研究主要是Btree部分,bt開頭部分代碼是Btree操作部分,包括put,open,delete,search,split部分,其中split為page的分頁。

 

我感覺BDB的文檔不算太多,尤其是中文帶圖的,可以參考SQLITE的BTREE,反正大家做的也差不多,知道原理後仔細分析代碼。

 

隨便說一個函數吧:

/*
 * __bam_split --
 * Split a page.
 *
 * PUBLIC: int __bam_split __P((DBC *, void *, db_pgno_t *));
 */
int
__bam_split(dbc, arg, root_pgnop)
 DBC *dbc;
 void *arg;
 db_pgno_t *root_pgnop;
{

 for (dir = UP, level = LEAFLEVEL;; dir == UP ? ++level : --level) {
  /*
   * Acquire a page and its parent, locked.
   */
  if ((ret = (dbc->dbtype == DB_BTREE ?
      __bam_search(dbc, PGNO_INVALID,
   arg, SR_WRPAIR, level, NULL, &exact) :
      __bam_rsearch(dbc,
   (db_recno_t *)arg, SR_WRPAIR, level, &exact))) != 0)
   break;

 

。。。

BDB的注釋非常的好,好多地方直接看注釋就知道啥意思了。下面是翻譯

 

在leaf 節點空間佔滿後,就會出發split.既回new出一個新的leaf node.

這時要根據要插入的key來search到底要split那個leaf node.這時要鎖住leaf 節點以及它的parent page。

然後就可以split這個leaf page. 這時要檢查下新的internal key(internal key 是internal節點?)是否適合parent page.

 

如果不適合,丟棄現在的鎖重新做,這次鎖的是這個leaf page的parent和 parent parent. 這樣一直迭代,直到成功的split.

大概的意思實際也是BTREE的SPLIT的過程,下班了,明天仔細理解下。

 

 

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.