|
|
@ -89,6 +89,13 @@ void VlogGC::gc_counter_decrement() { |
|
|
|
|
|
|
|
|
|
|
|
void VlogGC::do_gc(size_t old_vlog_num, size_t new_vlog_num) { |
|
|
|
// 判断old_vlog_num是否正在进行gc,如果是,直接返回
|
|
|
|
if (vlog_in_gc(old_vlog_num)) { |
|
|
|
return ; |
|
|
|
} |
|
|
|
// 否则将当前old_vlog_num设置为正在gc
|
|
|
|
add_vlog_in_gc(old_vlog_num); |
|
|
|
|
|
|
|
gc_counter_increment(); |
|
|
|
size_t _gc_num_ = get_gc_num(); |
|
|
|
|
|
|
@ -96,12 +103,15 @@ void VlogGC::do_gc(size_t old_vlog_num, size_t new_vlog_num) { |
|
|
|
add_executor_params(_gc_num_, ep); |
|
|
|
add_vlog_gc(_gc_num_, this); |
|
|
|
|
|
|
|
// FIXME: 线程的信息必须被保存在函数栈之外,否则函数栈销毁之后,线程会报错exc_bad_access, 这里需要有一个gc_hanlder线程一直运行并处理各个gc请求
|
|
|
|
std::thread gc_thread([_gc_num_]() mutable { |
|
|
|
auto _vlog_gc_ = get_vlog_gc(_gc_num_); |
|
|
|
assert(_vlog_gc_ != nullptr); |
|
|
|
_vlog_gc_->exec_gc(_gc_num_); |
|
|
|
}); |
|
|
|
|
|
|
|
gc_thread.detach(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -117,8 +127,8 @@ void VlogGC::exec_gc(size_t gc_num_) { |
|
|
|
|
|
|
|
// start gc process
|
|
|
|
auto ep = get_executor_params(gc_num_); |
|
|
|
gc_executor::exec_gc(ep.vg, ep.old_vlog_num, ep.new_vlog_num); |
|
|
|
// test_func();
|
|
|
|
// gc_executor::exec_gc(ep.vg, ep.old_vlog_num, ep.new_vlog_num);
|
|
|
|
test_func(); |
|
|
|
|
|
|
|
curr_thread_nums_latch_.lock(); |
|
|
|
if (curr_thread_nums_ >= max_thread_nums_) { |
|
|
@ -128,8 +138,13 @@ void VlogGC::exec_gc(size_t gc_num_) { |
|
|
|
curr_thread_nums_latch_.unlock(); |
|
|
|
|
|
|
|
gc_counter_decrement(); |
|
|
|
std::cout << "vlog_gc.cpp line 138" << std::endl; |
|
|
|
del_executor_params(gc_num_); |
|
|
|
std::cout << "vlog_gc.cpp line 140" << std::endl; |
|
|
|
del_vlog_gc(gc_num_); |
|
|
|
std::cout << "vlog_gc.cpp line 142" << std::endl; |
|
|
|
|
|
|
|
del_vlog_in_gc(ep.old_vlog_num); |
|
|
|
} |
|
|
|
|
|
|
|
// vlog: || curr_size(size_t) | value_nums(size_t) || value1 | value2 | ... |
|
|
|
|