ydb的内存模型
2009-09-10 00:00:00 来源:WEB开发网最后一步,也是一个校验,为了防止索引文件中的key所对应的数据文件没有被加载到loglist中。
Java代码 int start = MIN(rarr_min(db->tree.refcnt), rarr_min(db->loglist.logs));
int stop = MAX(rarr_max(db->tree.refcnt), rarr_max(db->loglist.logs));
for(logno=start; logno<stop; logno++) {
///得到当前数据的引用计数
uint refcnt = refcnt_get(&db->tree, logno);
///表示当前的数据文件。
struct log *log = slot_get(&db->loglist, logno);
if(refcnt == 0 && log == NULL)
continue;
if(refcnt && log)
continue;
if(refcnt) {
log_error("Log %i(0x%x) used, but file is not loaded!", logno, logno);
log_error("Sorry to say but you'd lost %i key-values.", refcnt);
log_error("Closing db");
/* we're in inconsistent state */
db_close(db, 0);
return(NULL);
}
if(log)
continue;
}
return db;
}
然后来看下tree_open和log_listopen的实现:
treeopen主要任务就是初始化红黑树,然后加载索引文件到内存,其中加载索引文件到内存是通过tree_load_index来实现的
tree_load_index就不分析了,只大概说下它的步骤。
1 首先通过mmap映射index。db到内存。
更多精彩
赞助商链接