gc_tablet_direct_load in get_rec_scn
This commit is contained in:
parent
6978c0280b
commit
30505c86d2
@ -1762,6 +1762,19 @@ int ObDDLUtil::check_schema_version_refreshed(
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool ObDDLUtil::reach_time_interval(const int64_t i, volatile int64_t &last_time)
|
||||
{
|
||||
bool bret = false;
|
||||
const int64_t old_time = last_time;
|
||||
const int64_t cur_time = common::ObTimeUtility::fast_current_time();
|
||||
if (OB_UNLIKELY((i + last_time) < cur_time)
|
||||
&& old_time == ATOMIC_CAS(&last_time, old_time, cur_time))
|
||||
{
|
||||
bret = true;
|
||||
}
|
||||
return bret;
|
||||
}
|
||||
|
||||
/****************** ObCheckTabletDataComplementOp *************/
|
||||
|
||||
int ObCheckTabletDataComplementOp::check_task_inner_sql_session_status(
|
||||
|
@ -576,6 +576,9 @@ public:
|
||||
static int check_schema_version_refreshed(
|
||||
const uint64_t tenant_id,
|
||||
const int64_t target_schema_version);
|
||||
|
||||
static bool reach_time_interval(const int64_t i, volatile int64_t &last_time);
|
||||
|
||||
private:
|
||||
static int generate_order_by_str(
|
||||
const ObIArray<int64_t> &select_column_ids,
|
||||
|
@ -45,7 +45,7 @@ int64_t ObTenantDirectLoadMgr::generate_context_id()
|
||||
}
|
||||
|
||||
ObTenantDirectLoadMgr::ObTenantDirectLoadMgr()
|
||||
: is_inited_(false), slice_id_generator_(0), context_id_generator_(0)
|
||||
: is_inited_(false), slice_id_generator_(0), context_id_generator_(0), last_gc_time_(0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -960,18 +960,18 @@ int ObTenantDirectLoadMgr::GetGcCandidateOp::operator() (common::hash::HashMapPa
|
||||
const ObTabletDirectLoadMgrKey &key = kv.first;
|
||||
ObTabletDirectLoadMgr *tablet_direct_load_mgr = kv.second;
|
||||
if (1 == tablet_direct_load_mgr->get_ref()) {
|
||||
if (OB_FAIL(candidate_mgrs_.push_back(key))) {
|
||||
if (OB_FAIL(candidate_mgrs_.push_back(std::make_pair(tablet_direct_load_mgr->get_ls_id(), key)))) {
|
||||
LOG_WARN("failed to push back", K(ret));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObTenantDirectLoadMgr::gc_tablet_direct_load(ObLS &ls)
|
||||
int ObTenantDirectLoadMgr::gc_tablet_direct_load()
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (!tablet_mgr_map_.empty()) {
|
||||
ObSEArray<ObTabletDirectLoadMgrKey, 8> candidate_mgrs;
|
||||
if (!tablet_mgr_map_.empty() && ObDDLUtil::reach_time_interval(10 * 1000 * 1000, last_gc_time_)) {
|
||||
ObSEArray<std::pair<share::ObLSID, ObTabletDirectLoadMgrKey>, 8> candidate_mgrs;
|
||||
{
|
||||
ObBucketTryRLockAllGuard guard(bucket_lock_);
|
||||
if (OB_SUCC(guard.get_ret())) {
|
||||
@ -980,12 +980,23 @@ int ObTenantDirectLoadMgr::gc_tablet_direct_load(ObLS &ls)
|
||||
}
|
||||
}
|
||||
|
||||
for (int64_t i = 0; i < candidate_mgrs.count(); i++) {
|
||||
int tmp_ret = OB_SUCCESS;
|
||||
ObTabletDirectLoadMgrKey mgr_key = candidate_mgrs.at(i);
|
||||
for (int64_t i = 0; i < candidate_mgrs.count(); i++) { // overwrite ret
|
||||
const share::ObLSID &ls_id = candidate_mgrs.at(i).first;
|
||||
const ObTabletDirectLoadMgrKey &mgr_key = candidate_mgrs.at(i).second;
|
||||
ObLSService *ls_svr = MTL(ObLSService*);
|
||||
ObLS *ls = nullptr;
|
||||
ObLSHandle ls_handle;
|
||||
ObTabletHandle tablet_handle;
|
||||
if (OB_TMP_FAIL(ls.get_tablet(mgr_key.tablet_id_, tablet_handle))) {
|
||||
LOG_WARN("failed to get tablet", K(ret), K(mgr_key));
|
||||
if (OB_ISNULL(ls_svr)) {
|
||||
LOG_WARN("invalid mtl ObLSService", K(ret));
|
||||
} else if (OB_FAIL(ls_svr->get_ls(ls_id, ls_handle, ObLSGetMod::DDL_MOD))) {
|
||||
LOG_WARN("get log stream failed", K(ret), K(ls_id));
|
||||
} else if (OB_ISNULL(ls = ls_handle.get_ls())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("log stream not exist", K(ret));
|
||||
} else if (OB_FAIL(ls->get_tablet(mgr_key.tablet_id_, tablet_handle,
|
||||
ObTabletCommon::DEFAULT_GET_TABLET_DURATION_US, ObMDSGetTabletMode::READ_ALL_COMMITED))) {
|
||||
LOG_WARN("failed to get tablet", K(ret), K(ls_id), K(mgr_key));
|
||||
} else if (tablet_handle.get_obj()->get_major_table_count() > 0) {
|
||||
(void)remove_tablet_direct_load(mgr_key);
|
||||
}
|
||||
@ -2497,7 +2508,7 @@ int ObTabletFullDirectLoadMgr::commit(
|
||||
}
|
||||
}
|
||||
if (OB_SUCC(ret) && lob_mgr_handle_.is_valid()) {
|
||||
const ObLSID &ls_id = lob_mgr_handle_.get_full_obj()->get_ls_id();
|
||||
const share::ObLSID &ls_id = lob_mgr_handle_.get_full_obj()->get_ls_id();
|
||||
const ObTabletID &lob_tablet_id = lob_mgr_handle_.get_full_obj()->get_tablet_id();
|
||||
ObLSHandle ls_handle;
|
||||
ObLS *ls = nullptr;
|
||||
|
@ -189,7 +189,7 @@ public:
|
||||
const share::ObLSID &ls_id,
|
||||
const common::ObTabletID &tablet_id,
|
||||
const bool is_full_direct_load);
|
||||
int gc_tablet_direct_load(ObLS &ls);
|
||||
int gc_tablet_direct_load();
|
||||
// remove tablet direct load mgr from hashmap,
|
||||
// for full direct load, it will be called when physical major generates,
|
||||
// for incremental direct load, it will be called when all KVs dump.
|
||||
@ -198,12 +198,13 @@ public:
|
||||
private:
|
||||
struct GetGcCandidateOp final {
|
||||
public:
|
||||
GetGcCandidateOp(ObIArray<ObTabletDirectLoadMgrKey> &candidate_mgrs) : candidate_mgrs_(candidate_mgrs) {}
|
||||
GetGcCandidateOp(ObIArray<std::pair<share::ObLSID, ObTabletDirectLoadMgrKey>> &candidate_mgrs)
|
||||
: candidate_mgrs_(candidate_mgrs) {}
|
||||
~GetGcCandidateOp() {}
|
||||
int operator() (common::hash::HashMapPair<ObTabletDirectLoadMgrKey, ObTabletDirectLoadMgr *> &kv);
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(GetGcCandidateOp);
|
||||
ObIArray<ObTabletDirectLoadMgrKey> &candidate_mgrs_;
|
||||
ObIArray<std::pair<share::ObLSID, ObTabletDirectLoadMgrKey>> &candidate_mgrs_;
|
||||
};
|
||||
|
||||
int try_create_tablet_direct_load_mgr(
|
||||
@ -246,6 +247,7 @@ private:
|
||||
TABLET_EXEC_CONTEXT_MAP tablet_exec_context_map_;
|
||||
int64_t slice_id_generator_;
|
||||
int64_t context_id_generator_;
|
||||
volatile int64_t last_gc_time_;
|
||||
DISALLOW_COPY_AND_ASSIGN(ObTenantDirectLoadMgr);
|
||||
};
|
||||
|
||||
|
@ -418,7 +418,6 @@ int ObLSDDLLogHandler::flush(SCN &rec_scn)
|
||||
}
|
||||
}
|
||||
}
|
||||
(void)tenant_direct_load_mgr->gc_tablet_direct_load(*ls_);
|
||||
}
|
||||
}
|
||||
return OB_SUCCESS;
|
||||
@ -460,6 +459,13 @@ SCN ObLSDDLLogHandler::get_rec_scn()
|
||||
} else if (!rec_scn.is_max()) {
|
||||
last_rec_scn_ = SCN::max(last_rec_scn_, rec_scn);
|
||||
}
|
||||
|
||||
// gc tablet direct load periodically
|
||||
ObTenantDirectLoadMgr *tenant_direct_load_mgr = MTL(ObTenantDirectLoadMgr *);
|
||||
if (OB_NOT_NULL(tenant_direct_load_mgr)) {
|
||||
(void)tenant_direct_load_mgr->gc_tablet_direct_load();
|
||||
}
|
||||
|
||||
LOG_INFO("[CHECKPOINT] ObLSDDLLogHandler::get_rec_scn", K(ret),
|
||||
"ls_id", OB_ISNULL(ls_) ? ObLSID() : ls_->get_ls_id(),
|
||||
K(barrier_tablet_id), K(rec_scn), K_(last_rec_scn));
|
||||
|
Loading…
x
Reference in New Issue
Block a user