gc_tablet_direct_load in get_rec_scn
This commit is contained in:
		| @ -1762,6 +1762,19 @@ int ObDDLUtil::check_schema_version_refreshed( | |||||||
|   return ret; |   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         *************/ | /******************           ObCheckTabletDataComplementOp         *************/ | ||||||
|  |  | ||||||
| int ObCheckTabletDataComplementOp::check_task_inner_sql_session_status( | int ObCheckTabletDataComplementOp::check_task_inner_sql_session_status( | ||||||
|  | |||||||
| @ -576,6 +576,9 @@ public: | |||||||
|   static int check_schema_version_refreshed( |   static int check_schema_version_refreshed( | ||||||
|       const uint64_t tenant_id, |       const uint64_t tenant_id, | ||||||
|       const int64_t target_schema_version); |       const int64_t target_schema_version); | ||||||
|  |  | ||||||
|  |   static bool reach_time_interval(const int64_t i, volatile int64_t &last_time); | ||||||
|  |  | ||||||
| private: | private: | ||||||
|   static int generate_order_by_str( |   static int generate_order_by_str( | ||||||
|       const ObIArray<int64_t> &select_column_ids, |       const ObIArray<int64_t> &select_column_ids, | ||||||
|  | |||||||
| @ -45,7 +45,7 @@ int64_t ObTenantDirectLoadMgr::generate_context_id() | |||||||
| } | } | ||||||
|  |  | ||||||
| ObTenantDirectLoadMgr::ObTenantDirectLoadMgr() | 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; |   const ObTabletDirectLoadMgrKey &key = kv.first; | ||||||
|   ObTabletDirectLoadMgr *tablet_direct_load_mgr = kv.second; |   ObTabletDirectLoadMgr *tablet_direct_load_mgr = kv.second; | ||||||
|   if (1 == tablet_direct_load_mgr->get_ref()) { |   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)); |       LOG_WARN("failed to push back", K(ret)); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   return ret; |   return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
| int ObTenantDirectLoadMgr::gc_tablet_direct_load(ObLS &ls) | int ObTenantDirectLoadMgr::gc_tablet_direct_load() | ||||||
| { | { | ||||||
|   int ret = OB_SUCCESS; |   int ret = OB_SUCCESS; | ||||||
|   if (!tablet_mgr_map_.empty()) { |   if (!tablet_mgr_map_.empty() && ObDDLUtil::reach_time_interval(10 * 1000 * 1000, last_gc_time_)) { | ||||||
|     ObSEArray<ObTabletDirectLoadMgrKey, 8> candidate_mgrs; |     ObSEArray<std::pair<share::ObLSID, ObTabletDirectLoadMgrKey>, 8> candidate_mgrs; | ||||||
|     { |     { | ||||||
|       ObBucketTryRLockAllGuard guard(bucket_lock_); |       ObBucketTryRLockAllGuard guard(bucket_lock_); | ||||||
|       if (OB_SUCC(guard.get_ret())) { |       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++) { |     for (int64_t i = 0; i < candidate_mgrs.count(); i++) { // overwrite ret | ||||||
|       int tmp_ret = OB_SUCCESS; |       const share::ObLSID &ls_id = candidate_mgrs.at(i).first; | ||||||
|       ObTabletDirectLoadMgrKey mgr_key = candidate_mgrs.at(i); |       const ObTabletDirectLoadMgrKey &mgr_key = candidate_mgrs.at(i).second; | ||||||
|  |       ObLSService *ls_svr = MTL(ObLSService*); | ||||||
|  |       ObLS *ls = nullptr; | ||||||
|  |       ObLSHandle ls_handle; | ||||||
|       ObTabletHandle tablet_handle; |       ObTabletHandle tablet_handle; | ||||||
|       if (OB_TMP_FAIL(ls.get_tablet(mgr_key.tablet_id_, tablet_handle))) { |       if (OB_ISNULL(ls_svr)) { | ||||||
|         LOG_WARN("failed to get tablet", K(ret), K(mgr_key)); |         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) { |       } else if (tablet_handle.get_obj()->get_major_table_count() > 0) { | ||||||
|         (void)remove_tablet_direct_load(mgr_key); |         (void)remove_tablet_direct_load(mgr_key); | ||||||
|       } |       } | ||||||
| @ -2497,7 +2508,7 @@ int ObTabletFullDirectLoadMgr::commit( | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   if (OB_SUCC(ret) && lob_mgr_handle_.is_valid()) { |   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(); |     const ObTabletID &lob_tablet_id = lob_mgr_handle_.get_full_obj()->get_tablet_id(); | ||||||
|     ObLSHandle ls_handle; |     ObLSHandle ls_handle; | ||||||
|     ObLS *ls = nullptr; |     ObLS *ls = nullptr; | ||||||
|  | |||||||
| @ -189,7 +189,7 @@ public: | |||||||
|       const share::ObLSID &ls_id, |       const share::ObLSID &ls_id, | ||||||
|       const common::ObTabletID &tablet_id, |       const common::ObTabletID &tablet_id, | ||||||
|       const bool is_full_direct_load); |       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, |   // remove tablet direct load mgr from hashmap, | ||||||
|   // for full direct load, it will be called when physical major generates, |   // for full direct load, it will be called when physical major generates, | ||||||
|   // for incremental direct load, it will be called when all KVs dump. |   // for incremental direct load, it will be called when all KVs dump. | ||||||
| @ -198,12 +198,13 @@ public: | |||||||
| private: | private: | ||||||
|   struct GetGcCandidateOp final { |   struct GetGcCandidateOp final { | ||||||
|   public: |   public: | ||||||
|     GetGcCandidateOp(ObIArray<ObTabletDirectLoadMgrKey> &candidate_mgrs) : candidate_mgrs_(candidate_mgrs) {} |     GetGcCandidateOp(ObIArray<std::pair<share::ObLSID, ObTabletDirectLoadMgrKey>> &candidate_mgrs) | ||||||
|  |       : candidate_mgrs_(candidate_mgrs) {} | ||||||
|     ~GetGcCandidateOp() {} |     ~GetGcCandidateOp() {} | ||||||
|     int operator() (common::hash::HashMapPair<ObTabletDirectLoadMgrKey, ObTabletDirectLoadMgr *> &kv); |     int operator() (common::hash::HashMapPair<ObTabletDirectLoadMgrKey, ObTabletDirectLoadMgr *> &kv); | ||||||
|   private: |   private: | ||||||
|     DISALLOW_COPY_AND_ASSIGN(GetGcCandidateOp); |     DISALLOW_COPY_AND_ASSIGN(GetGcCandidateOp); | ||||||
|     ObIArray<ObTabletDirectLoadMgrKey> &candidate_mgrs_; |     ObIArray<std::pair<share::ObLSID, ObTabletDirectLoadMgrKey>> &candidate_mgrs_; | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   int try_create_tablet_direct_load_mgr( |   int try_create_tablet_direct_load_mgr( | ||||||
| @ -246,6 +247,7 @@ private: | |||||||
|   TABLET_EXEC_CONTEXT_MAP tablet_exec_context_map_; |   TABLET_EXEC_CONTEXT_MAP tablet_exec_context_map_; | ||||||
|   int64_t slice_id_generator_; |   int64_t slice_id_generator_; | ||||||
|   int64_t context_id_generator_; |   int64_t context_id_generator_; | ||||||
|  |   volatile int64_t last_gc_time_; | ||||||
| DISALLOW_COPY_AND_ASSIGN(ObTenantDirectLoadMgr); | 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; |   return OB_SUCCESS; | ||||||
| @ -460,6 +459,13 @@ SCN ObLSDDLLogHandler::get_rec_scn() | |||||||
|   } else if (!rec_scn.is_max()) { |   } else if (!rec_scn.is_max()) { | ||||||
|     last_rec_scn_ = SCN::max(last_rec_scn_, rec_scn); |     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), |   LOG_INFO("[CHECKPOINT] ObLSDDLLogHandler::get_rec_scn", K(ret), | ||||||
|       "ls_id", OB_ISNULL(ls_) ? ObLSID() : ls_->get_ls_id(), |       "ls_id", OB_ISNULL(ls_) ? ObLSID() : ls_->get_ls_id(), | ||||||
|       K(barrier_tablet_id), K(rec_scn), K_(last_rec_scn)); |       K(barrier_tablet_id), K(rec_scn), K_(last_rec_scn)); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Hongqin-Li
					Hongqin-Li