[FIX] unblock ls replay failed because of allocating memory failed

This commit is contained in:
ZenoWang 2024-06-21 13:23:17 +00:00 committed by ob-robot
parent 296e3d64ae
commit a238c1fbea
2 changed files with 20 additions and 14 deletions

View File

@ -1794,10 +1794,17 @@ ObFreezer::PendTenantReplayGuard::PendTenantReplayGuard()
STORAGE_LOG(WARN, "[ObFreezer] fail to get ls iterator", KR(ret)); STORAGE_LOG(WARN, "[ObFreezer] fail to get ls iterator", KR(ret));
} else { } else {
ObLS *ls = nullptr; ObLS *ls = nullptr;
ls_handle_array_.reuse();
while (OB_SUCC(iter->get_next(ls))) { while (OB_SUCC(iter->get_next(ls))) {
int tmp_ret = OB_SUCCESS; int tmp_ret = OB_SUCCESS;
if (OB_TMP_FAIL(ls->get_freezer()->pend_ls_replay())) { ObLSHandle ls_handle;
STORAGE_LOG(WARN, "[ObFreezer] pend replay failed", KR(ret), KPC(ls)); if (OB_TMP_FAIL(ls_srv->get_ls(ls->get_ls_id(), ls_handle, ObLSGetMod::STORAGE_MOD))) {
STORAGE_LOG(WARN, "[ObFreezer] get ls handle failed", KR(tmp_ret), KP(ls));
} else if (OB_TMP_FAIL(ls_handle_array_.push_back(ls_handle))) {
STORAGE_LOG(WARN, "[ObFreezer] push back ls handle failed", KR(tmp_ret), KP(ls));
} else if (OB_TMP_FAIL(ls->get_freezer()->pend_ls_replay())) {
STORAGE_LOG(WARN, "[ObFreezer] pend replay failed", KR(tmp_ret), KPC(ls));
(void)ls_handle_array_.pop_back();
} }
} }
} }
@ -1806,17 +1813,14 @@ ObFreezer::PendTenantReplayGuard::PendTenantReplayGuard()
ObFreezer::PendTenantReplayGuard::~PendTenantReplayGuard() ObFreezer::PendTenantReplayGuard::~PendTenantReplayGuard()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
common::ObSharedGuard<ObLSIterator> iter; for (int64_t i = 0; i < ls_handle_array_.count(); i++) {
ObLSService *ls_srv = MTL(ObLSService *); int tmp_ret = OB_SUCCESS;
if (OB_FAIL(ls_srv->get_ls_iter(iter, ObLSGetMod::STORAGE_MOD))) {
STORAGE_LOG(WARN, "[ObFreezer] fail to get ls iterator", KR(ret));
} else {
ObLS *ls = nullptr; ObLS *ls = nullptr;
while (OB_SUCC(iter->get_next(ls))) { if (OB_ISNULL(ls = ls_handle_array_.at(i).get_ls())) {
int tmp_ret = OB_SUCCESS; ret = OB_ERR_UNEXPECTED;
if (OB_TMP_FAIL(ls->get_freezer()->restore_ls_replay())) { STORAGE_LOG(ERROR, "[ObFreezer] invalid ls handle", KR(ret), KPC(ls));
STORAGE_LOG(WARN, "[ObFreezer] restore replay failed", KR(ret), KPC(ls)); } else if (OB_TMP_FAIL(ls->get_freezer()->restore_ls_replay())) {
} STORAGE_LOG(WARN, "[ObFreezer] restore replay failed", KR(ret), KPC(ls));
} }
} }
} }

View File

@ -282,12 +282,14 @@ private:
bool need_release_; bool need_release_;
ObFreezer &parent_; ObFreezer &parent_;
}; };
class PendTenantReplayGuard class PendTenantReplayGuard {
{
public: public:
PendTenantReplayGuard(); PendTenantReplayGuard();
~PendTenantReplayGuard(); ~PendTenantReplayGuard();
public:
ObSEArray<ObLSHandle, 16> ls_handle_array_;
}; };
private: private:
/* freeze_flag */ /* freeze_flag */
int set_freeze_flag(); int set_freeze_flag();