leveldb:TableCache以及BlockCache

来源:互联网 发布:日本古城建篵坉典 淘宝 编辑:程序博客网 时间:2024/06/03 01:31

TableCache

class TableCache {    ...    Cache* cache_;}TableCache::TableCache(const std::string& dbname,                       const Options* options,                       int entries)    : env_(options->env),      dbname_(dbname),      options_(options),      cache_(NewLRUCache(entries)) {      //创建一个容量为entries的ShardedLRUCacheShardedLRUCache请参见前面cache的分析}Status TableCache::FindTable(uint64_t file_number, uint64_t file_size,                             Cache::Handle** handle) {  char buf[sizeof(file_number)];  EncodeFixed64(buf, file_number);  Slice key(buf, sizeof(buf));  *handle = cache_->Lookup(key);//可以看出tablecache的key就是文件的编号  if (*handle == NULL) {  //cache中没找到该文件对应的table  //先打开该文件,涉及系统调用,挺费时间的    std::string fname = TableFileName(dbname_, file_number);    RandomAccessFile* file = NULL;    Table* table = NULL;    s = env_->NewRandomAccessFile(fname, &file);    if (s.ok()) {    //打开文件成功,则创建该文件对应的table      s = Table::Open(*options_, file, file_size, &table);    }      TableAndFile* tf = new TableAndFile;      tf->file = file;      tf->table = table;       //tablecache中的value值就是TableAndFile,它包含一个已经打开的文件描述       符,以及创建好的table,加入cache中      *handle = cache_->Insert(key, tf, 1, &DeleteEntry);  }  return s;}