WEB开发网
开发学院软件开发Java ydb的内存模型 阅读

ydb的内存模型

 2009-09-10 00:00:00 来源:WEB开发网   
核心提示: Java代码charbuf[256];snprintf(buf,sizeof(buf),"%s%s%s",top_dir,PATH_DELIMITER,"index.ydb");intlogno=0;u64record_offset=0;if(tree_o

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; 
 }

上一页  1 2 3 4 5 6 7  下一页

Tags:ydb 内存 模型

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接