|
|
@ -22,7 +22,12 @@ VlogSet::VlogSet(std::string dbname, VlogGC *vlog_gc) : dbname(dbname), vlog_gc( |
|
|
|
delete this->config_file_; |
|
|
|
// 重新以读写模式打开
|
|
|
|
this->config_file_ = new std::fstream(cfname, std::ios::in | std::ios::out); |
|
|
|
this->config_file_->seekp(0); |
|
|
|
size_t tmp = 0; |
|
|
|
this->config_file_->write(reinterpret_cast<const char*>(&tmp), sizeof(size_t)); |
|
|
|
this->config_file_->flush(); |
|
|
|
this->vlog_nums_ = 0; |
|
|
|
register_new_vlog(); |
|
|
|
} else { |
|
|
|
// config 文件存在
|
|
|
|
size_t _vlog_nums_; |
|
|
@ -43,7 +48,7 @@ VlogSet::VlogSet(std::string dbname, VlogGC *vlog_gc) : dbname(dbname), vlog_gc( |
|
|
|
curr_vlog.read(reinterpret_cast<char*>(curr_vlog_header), 2*sizeof(size_t)); |
|
|
|
curr_vlog.close(); |
|
|
|
|
|
|
|
restore_vlog_inmaps(new vlog_info(curr_vlog_num, tmp[1], tmp[0])); |
|
|
|
restore_vlog_inmaps(new vlog_info(curr_vlog_num, curr_vlog_header[1], curr_vlog_header[0])); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -162,7 +167,7 @@ size_t VlogSet::register_new_vlog() { |
|
|
|
size_t vn = vlog_nums_; |
|
|
|
std::string vlog_name = get_vlog_name(vn); |
|
|
|
register_inconfig_file(vn); |
|
|
|
create_vlog(vlog_name); |
|
|
|
create_vlog(vn); |
|
|
|
// auto vlog_new = new std::fstream(vlog_name, std::ios::in | std::ios::out);
|
|
|
|
// if (!vlog_new->is_open()) {
|
|
|
|
// std::cerr << "Failed to open or create the vlog file: " << vlog_new << std::endl;
|
|
|
@ -190,8 +195,12 @@ void VlogSet::remove_old_vlog(size_t old_vlog_num) { |
|
|
|
} |
|
|
|
|
|
|
|
bool VlogSet::vlog_need_gc(size_t vlog_num) { |
|
|
|
// FIXME: vlog应该已经满了才行
|
|
|
|
std::string vlog_name = get_vlog_name(vlog_num); |
|
|
|
auto vi = vlog_info_map_[vlog_name]; |
|
|
|
if ((double)vi->curr_size/VLOG_SIZE < VLOG_GC_THREHOLD) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
bool retval = vi->vlog_valid_ && (vi->discard/vi->value_nums >= GC_THREDHOLD); |
|
|
|
return retval; |
|
|
|
} |
|
|
@ -223,13 +232,23 @@ void VlogSet::remove_from_config_file(size_t vlog_num) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void VlogSet::create_vlog(std::string &vlog_name) { |
|
|
|
void VlogSet::create_vlog(size_t vlog_num) { |
|
|
|
auto vlog_name = get_vlog_name(vlog_num); |
|
|
|
std::fstream *vlog_new = new std::fstream(vlog_name, std::ios::out); |
|
|
|
char tmp[2*sizeof(size_t)]; |
|
|
|
memset(tmp, 0, sizeof(tmp)); |
|
|
|
vlog_new->write(tmp, sizeof(tmp)); |
|
|
|
vlog_new->close(); |
|
|
|
delete vlog_new; |
|
|
|
// 重新以读写模式打开
|
|
|
|
vlog_new = new std::fstream(vlog_name, std::ios::in | std::ios::out); |
|
|
|
if (!vlog_new->is_open()) { |
|
|
|
std::cerr << "Failed to open or create the vlog file: " << vlog_name << std::endl; |
|
|
|
std::exit(EXIT_FAILURE); |
|
|
|
} |
|
|
|
size_t tmp[2] = {2*sizeof(size_t), vlog_num}; |
|
|
|
vlog_new->seekp(0); |
|
|
|
vlog_new->write(reinterpret_cast<const char*>(tmp), sizeof(tmp)); |
|
|
|
vlog_new->flush(); |
|
|
|
vlog_new->close(); |
|
|
|
delete vlog_new; |
|
|
|
} |
|
|
|
|
|
|
|
inline void VlogSet::restore_vlog_inmaps(struct vlog_info *vi) { |
|
|
@ -239,8 +258,10 @@ inline void VlogSet::restore_vlog_inmaps(struct vlog_info *vi) { |
|
|
|
} |
|
|
|
|
|
|
|
inline void VlogSet::register_vlog_inmaps(size_t vlog_num, std::string &vlog_name) { |
|
|
|
vlog_info_map_[vlog_name] = new vlog_info(vlog_num); |
|
|
|
vlog_handler_map_[vlog_name] = new vlog_handler(); |
|
|
|
auto vinfo = new vlog_info(vlog_num); |
|
|
|
auto vhandler = new vlog_handler(); |
|
|
|
vlog_info_map_[vlog_name] = vinfo; |
|
|
|
vlog_handler_map_[vlog_name] = vhandler; |
|
|
|
} |
|
|
|
|
|
|
|
inline void VlogSet::remove_vlog_from_maps(std::string &vlog_name) { |
|
|
@ -277,10 +298,12 @@ void VlogSet::read_vlog_value(uint32_t vlog_num, uint32_t value_offset, std::str |
|
|
|
char value_buff[VALUE_BUFF_SIZE]; |
|
|
|
handler.read(value_buff, VALUE_BUFF_SIZE); |
|
|
|
|
|
|
|
// FIXME: remove value size
|
|
|
|
uint16_t value_size; |
|
|
|
memcpy(&value_size, value_buff, sizeof(uint16_t)); |
|
|
|
value_size &= VALUE_SIZE_MASK; |
|
|
|
value->assign(&value_buff[sizeof(uint16_t)], value_size); |
|
|
|
*value = std::string(value_buff); |
|
|
|
// value->assign(&value_buff[sizeof(uint16_t)], value_size);
|
|
|
|
handler.close(); |
|
|
|
} |
|
|
|
|
|
|
@ -292,8 +315,6 @@ void VlogSet::write_vlog_value(uint32_t vlog_num, uint32_t value_offset, const l |
|
|
|
handler.write(value_buff, value.size()); |
|
|
|
|
|
|
|
auto vinfo = get_vlog_info(vlog_num); |
|
|
|
vinfo->value_nums ++; |
|
|
|
vinfo->curr_size += value.size(); |
|
|
|
|
|
|
|
handler.flush(); |
|
|
|
handler.close(); |
|
|
@ -315,7 +336,7 @@ void VlogSet::mark_del_value(uint32_t vlog_num, uint32_t value_offset) { |
|
|
|
return ; |
|
|
|
} |
|
|
|
assert(!(value_size & VALUE_DELE_MASK)); |
|
|
|
uint16_t masked_value_size = value_size & 0xffff; |
|
|
|
uint16_t masked_value_size = value_size | VALUE_DELE_MASK; |
|
|
|
memcpy(value_buff, &masked_value_size, sizeof(uint16_t)); |
|
|
|
handler.write(value_buff, value_size); |
|
|
|
handler.flush(); |
|
|
|