fix dup table new gc method core
This commit is contained in:
@ -404,7 +404,7 @@ int ObLSDupTabletsMgr::init_free_tablet_pool_()
|
|||||||
DUP_TABLE_LOG(WARN, "get free tablet set failed", K(ret));
|
DUP_TABLE_LOG(WARN, "get free tablet set failed", K(ret));
|
||||||
} else {
|
} else {
|
||||||
removing_old_set_->get_common_header().set_old();
|
removing_old_set_->get_common_header().set_old();
|
||||||
removing_old_set_->set_related_set_op_type(DupTableRelatedSetOpType::OLD_GC);
|
removing_old_set_->set_related_set_op_type(DupTableRelatedSetOpType::NEW_GC);
|
||||||
}
|
}
|
||||||
|
|
||||||
DUP_TABLE_LOG(INFO, "finish init tablet map", K(ret), KPC(removing_old_set_),
|
DUP_TABLE_LOG(INFO, "finish init tablet map", K(ret), KPC(removing_old_set_),
|
||||||
@ -835,14 +835,8 @@ DupTabletChangeMap *ObLSDupTabletsMgr::get_need_gc_set_(bool &new_round)
|
|||||||
KPC(removing_old_set_), KPC(readable_set_in_gc_));
|
KPC(removing_old_set_), KPC(readable_set_in_gc_));
|
||||||
readable_set_in_gc_ = nullptr;
|
readable_set_in_gc_ = nullptr;
|
||||||
} else {
|
} else {
|
||||||
while (OB_NOT_NULL(readable_set_in_gc_) && !readable_set_in_gc_->need_gc_scan(gc_start_time_)
|
READABLE_DLIST_FOREACH_X(readable_set_in_gc_, readable_tablets_list_,
|
||||||
&& readable_set_in_gc_ != readable_tablets_list_.get_header()) {
|
!readable_set_in_gc_->need_gc_scan(gc_start_time_));
|
||||||
readable_set_in_gc_ = readable_set_in_gc_->get_next();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (readable_set_in_gc_ == readable_tablets_list_.get_header()) {
|
|
||||||
readable_set_in_gc_ = nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -853,6 +847,12 @@ DupTabletChangeMap *ObLSDupTabletsMgr::get_need_gc_set_(bool &new_round)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (readable_set_in_gc_ == readable_tablets_list_.get_header()) {
|
||||||
|
readable_set_in_gc_ = nullptr;
|
||||||
|
DUP_TABLE_LOG(INFO, "readable_set_in_gc_ is null ptr, no need start gc", K(readable_tablets_list_.get_size()),
|
||||||
|
KP(removing_old_set_), KP(readable_set_in_gc_), KP(readable_tablets_list_.get_header()));
|
||||||
|
}
|
||||||
|
|
||||||
return readable_set_in_gc_;
|
return readable_set_in_gc_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2509,7 +2509,7 @@ int ObLSDupTabletsMgr::return_tablet_set_(DupTabletChangeMap *need_free_set)
|
|||||||
} else if (need_free_set->get_common_header().is_old_set()) {
|
} else if (need_free_set->get_common_header().is_old_set()) {
|
||||||
need_free_set->reuse();
|
need_free_set->reuse();
|
||||||
need_free_set->get_common_header().set_old();
|
need_free_set->get_common_header().set_old();
|
||||||
need_free_set->set_related_set_op_type(DupTableRelatedSetOpType::OLD_GC);
|
need_free_set->set_related_set_op_type(DupTableRelatedSetOpType::NEW_GC);
|
||||||
} else {
|
} else {
|
||||||
if (OB_FAIL(ret)) {
|
if (OB_FAIL(ret)) {
|
||||||
} else {
|
} else {
|
||||||
@ -2521,6 +2521,8 @@ int ObLSDupTabletsMgr::return_tablet_set_(DupTabletChangeMap *need_free_set)
|
|||||||
}
|
}
|
||||||
if (need_free_set == changing_new_set_) {
|
if (need_free_set == changing_new_set_) {
|
||||||
changing_new_set_ = nullptr;
|
changing_new_set_ = nullptr;
|
||||||
|
} else if (need_free_set == readable_set_in_gc_) {
|
||||||
|
readable_set_in_gc_ = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2547,9 +2549,6 @@ int ObLSDupTabletsMgr::check_and_recycle_empty_readable_set_(DupTabletChangeMap
|
|||||||
DUP_TABLE_LOG(WARN, "remove empty readable set from list failed", K(ret), KPC(readable_set));
|
DUP_TABLE_LOG(WARN, "remove empty readable set from list failed", K(ret), KPC(readable_set));
|
||||||
} else if (OB_FAIL(return_tablet_set_(readable_set))) {
|
} else if (OB_FAIL(return_tablet_set_(readable_set))) {
|
||||||
DUP_TABLE_LOG(WARN, "return empty readable set failed", K(ret), KPC(readable_set));
|
DUP_TABLE_LOG(WARN, "return empty readable set failed", K(ret), KPC(readable_set));
|
||||||
} else if (readable_set == readable_set_in_gc_) {
|
|
||||||
// readable_set recycled, restart scan readable list
|
|
||||||
readable_set_in_gc_ = nullptr;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,6 +20,11 @@
|
|||||||
#include "ob_dup_table_base.h"
|
#include "ob_dup_table_base.h"
|
||||||
#include "ob_dup_table_ts_sync.h"
|
#include "ob_dup_table_ts_sync.h"
|
||||||
|
|
||||||
|
#define READABLE_DLIST_FOREACH_X(curr, dlist, extra_condition) \
|
||||||
|
for (;OB_NOT_NULL(curr) && curr != (dlist).get_header() \
|
||||||
|
&& (extra_condition); \
|
||||||
|
curr = curr->get_next())
|
||||||
|
|
||||||
namespace oceanbase
|
namespace oceanbase
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -404,9 +409,17 @@ public:
|
|||||||
bool need_gc_scan(int64_t gc_start_time) {
|
bool need_gc_scan(int64_t gc_start_time) {
|
||||||
bool bool_ret = false;
|
bool bool_ret = false;
|
||||||
|
|
||||||
if (get_related_set_op_type() == DupTableRelatedSetOpType::INVALID) {
|
if (!get_common_header().is_readable_set()) {
|
||||||
|
DUP_TABLE_LOG_RET(WARN, OB_ERR_UNEXPECTED, "not readable set, not need gc",
|
||||||
|
K(gc_start_time), KPC(this));
|
||||||
|
bool_ret = false;
|
||||||
|
} else if (get_related_set_op_type() != DupTableRelatedSetOpType::INVALID) {
|
||||||
|
DUP_TABLE_LOG(INFO, "this readable set used for other operation, should skip gc", KPC(this));
|
||||||
|
bool_ret = false;
|
||||||
|
} else {
|
||||||
bool_ret = true;
|
bool_ret = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bool_ret) {
|
if (bool_ret) {
|
||||||
if (last_gc_scan_ts_ <= 0
|
if (last_gc_scan_ts_ <= 0
|
||||||
|| gc_start_time > last_gc_scan_ts_) {
|
|| gc_start_time > last_gc_scan_ts_) {
|
||||||
|
Reference in New Issue
Block a user