小明思考

          Just a software engineer
          posts - 124, comments - 36, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          leveldb研究5- Snapshot

          Posted on 2012-03-13 16:54 小明 閱讀(4494) 評論(0)  編輯  收藏 所屬分類: 分布式計算
          所謂snapshot就是一個快照,我們可以從快照中讀到舊的數據。

          先寫一個測試程序來看看snapshot的使用:

          #include <iostream>
          #include 
          "leveldb/db.h"

          using namespace std;
          using namespace leveldb;


          int main() {
              DB 
          *db ;
              Options op;
              op.create_if_missing 
          = true;
              Status s 
          = DB::Open(op,"/tmp/testdb",&db);

              
          if(s.ok()){
                  cout 
          << "create successfully" << endl;
                  s 
          = db->Put(WriteOptions(),"abcd","1234");
                  
          if(s.ok()){
                      cout 
          << "put successfully" << endl;
                      
          string value;
                      s 
          = db->Get(ReadOptions(),"abcd",&value);
                      
          if(s.ok()){
                          cout 
          << "get successfully,value:" << value << endl;
                      }
                  }
                  
          if(s.ok()){
                      
          string value;
                      
          const Snapshot * ss =db->GetSnapshot();
                      ReadOptions rop;
                      db
          ->Put(WriteOptions(),"abcd","123456");
                      db
          ->Get(rop,"abcd",&value);
                      
          if(s.ok()){
                              cout 
          << "get successfully,value:" << value << endl;
                      }
                      rop.snapshot 
          = ss;
                      db
          ->Get(rop,"abcd",&value);
                      
          if(s.ok()){
                              cout 
          << "get from snapshot successfully,value:" << value << endl;
                      }
                      db
          ->ReleaseSnapshot(ss);
                  }
              }
              delete db;
              
          return 0;
          }

          程序運行的輸出結果是:
          create successfully
          put successfully
          get successfully,value:1234
          get successfully,value:123456
          get from snapshot successfully,value:1234

          可以看出,即使在數據更新后,我們仍然可以從snapshot中讀到舊的數據。

          下面我們來分析leveldb中snapshot的實現。

          SequenceNumber(db/dbformat.h)
          SequenceNumber是leveldb很重要的東西,每次對數據庫進行更新操作,都會生成一個新的SequenceNumber,64bits,其中高8位為0,可以跟key的類型(8bits)進行合并成64bits。
          typedef uint64_t SequenceNumber;

          // We leave eight bits empty at the bottom so a type and sequence#
          // can be packed together into 64-bits.
          static const SequenceNumber kMaxSequenceNumber =
              ((0x1ull << 56) - 1);

          SnapShot(db/snapshot.h),,可以看出snapshot其實就是一個sequence number
          class SnapshotImpl : public Snapshot {
           
          public:
            
          //創建后保持不變
            SequenceNumber number_;  

           
          private:
            friend 
          class SnapshotList; 

            
          //雙向循環鏈表
            SnapshotImpl* prev_;
            SnapshotImpl
          * next_;

            SnapshotList
          * list_;                 // just for sanity checks
          };

          創建snapshot:
          const Snapshot* DBImpl::GetSnapshot() {
            MutexLock l(
          &mutex_);
            
          return snapshots_.New(versions_->LastSequence());
          }

          刪除snapshot:
          void DBImpl::ReleaseSnapshot(const Snapshot* s) {
            MutexLock l(
          &mutex_);
            snapshots_.Delete(reinterpret_cast
          <const SnapshotImpl*>(s));
          }




          主站蜘蛛池模板: 福建省| 陕西省| 仪征市| 元朗区| 安新县| 乌什县| 肇源县| 无锡市| 鹤壁市| 凯里市| 江城| 大洼县| 兴业县| 临高县| 高雄县| 海淀区| 崇礼县| 社会| 宝坻区| 安塞县| 康乐县| 南京市| 古交市| 佛学| 小金县| 临高县| 南陵县| 阜新| 云浮市| 佳木斯市| 乌拉特前旗| 绥宁县| 车致| 湄潭县| 巴林右旗| 黔西县| 高陵县| 临泽县| 张家口市| 东山县| 焦作市|