ydb的内存模型
2009-09-10 00:00:00 来源:WEB开发网Java代码
char buf[256];
snprintf(buf, sizeof(buf), "%s%s%s", top_dir, PATH_DELIMITER, "index.ydb");
int logno = 0;
u64 record_offset = 0;
if(tree_open(&db->tree, buf, &logno, &record_offset, flags) < 0) {
if(!(flags & YDB_CREAT)) {
log_error("Failed to load index file from %s", top_dir);
/* TODO: memleaks here */
return(NULL);
}
}
int r = loglist_open(&db->loglist, top_dir, min_log_size, max_descriptors());
if(r < 0){
/* TODO: memleaks here */
return(NULL);
}
之所以需要同步索引,是为了防止ydb异常关闭而导致的数据和索引文件的不匹配。(因为这里索引文件是通过内存映射来操作的)
接下来比对索引树和数据文件,其实也就是根据数据文件链表来重新构造索引树,它是用来防止数据文件和索引树不同步。
它是通过遍历loglist,并读取每个数据文件的元数据然后来同步index树。
Java代码
int record_sz = END_OF_FILE;
while(1) {
if(record_sz == END_OF_FILE) {
/* find an edge */
///得到当前的数据文件。
struct log *log = slot_get(&db->loglist, logno);
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
char key[MAX_KEY_SIZE];
u16 key_sz = MAX_KEY_SIZE-1;
int flags;
u64 value_offset;
u32 value_sz;
///其中flags是元数据的属性,因为在ydb中的删除是标记删除的,因此当flags为FLAG_DELETE时,我们需要从索引树中删除这条索引。
record_sz = loglist_get_record(&db->loglist,
logno, record_offset,
key, &key_sz,
&value_offset, &value_sz,
&flags);
///这个表示一个数据文件已经遍历结束,该遍历下一个文件。
if(record_sz == END_OF_FILE) {
logno++;
record_offset = 0;
continue;
}
///文件遍历完毕。
if(record_sz == NO_MORE_DATA)
break;
if(FLAG_DELETE & flags) {
///删除索引
tree_del(&db->tree, key, key_sz, logno, record_offset);
}else{
tree_add(&db->tree, key, key_sz, logno, value_offset, value_sz, record_offset);
}
record_offset += record_sz;
}
更多精彩
赞助商链接