BUGFIX: iter another ls if iter failed

This commit is contained in:
obdev
2022-11-04 08:36:50 +00:00
committed by wangzelin.wzl
parent a57c27ea23
commit 36e9ddef48
2 changed files with 32 additions and 14 deletions

View File

@ -64,27 +64,43 @@ bool ObAllVirtualLSInfo::is_need_process(uint64_t tenant_id)
return false; return false;
} }
int ObAllVirtualLSInfo::next_ls_info_(ObLSVTInfo &ls_info)
{
int ret = OB_SUCCESS;
ObLS *ls = nullptr;
do {
if (OB_FAIL(ls_iter_guard_->get_next(ls))) {
if (OB_ITER_END != ret) {
SERVER_LOG(WARN, "get_next_ls failed", K(ret));
}
} else if (NULL == ls) {
SERVER_LOG(WARN, "ls shouldn't NULL here", K(ls));
// try another ls
ret = OB_EAGAIN;
} else if (FALSE_IT(ls_id_ = ls->get_ls_id().id())) {
} else if (OB_FAIL(ls->get_ls_info(ls_info))) {
SERVER_LOG(WARN, "get ls info failed", K(ret), KPC(ls));
// try another ls
ret = OB_EAGAIN;
}
} while (OB_EAGAIN == ret);
return ret;
}
int ObAllVirtualLSInfo::process_curr_tenant(ObNewRow *&row) int ObAllVirtualLSInfo::process_curr_tenant(ObNewRow *&row)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
ObLSVTInfo ls_info; ObLSVTInfo ls_info;
ObLS *ls = nullptr;
if (NULL == allocator_) { if (NULL == allocator_) {
ret = OB_NOT_INIT; ret = OB_NOT_INIT;
SERVER_LOG(WARN, "allocator_ shouldn't be NULL", K(allocator_), K(ret)); SERVER_LOG(WARN, "allocator_ shouldn't be NULL", K(allocator_), K(ret));
} else if (FALSE_IT(start_to_read_ = true)) { } else if (FALSE_IT(start_to_read_ = true)) {
} else if (ls_iter_guard_.get_ptr() == nullptr && OB_FAIL(MTL(ObLSService*)->get_ls_iter(ls_iter_guard_, ObLSGetMod::OBSERVER_MOD))) { } else if (ls_iter_guard_.get_ptr() == nullptr && OB_FAIL(MTL(ObLSService*)->get_ls_iter(ls_iter_guard_, ObLSGetMod::OBSERVER_MOD))) {
SERVER_LOG(WARN, "get_ls_iter fail", K(ret)); SERVER_LOG(WARN, "get_ls_iter fail", K(ret));
} else if (OB_FAIL(ls_iter_guard_->get_next(ls))) { } else if (OB_FAIL(next_ls_info_(ls_info))) {
if (OB_ITER_END != ret) { if (OB_ITER_END != ret) {
SERVER_LOG(WARN, "get_next_ls failed", K(ret)); SERVER_LOG(WARN, "get next_ls_info failed", K(ret));
} }
} else if (NULL == ls) {
ret = OB_ERR_UNEXPECTED;
SERVER_LOG(WARN, "ls shouldn't NULL here", K(ret), K(ls));
} else if (FALSE_IT(ls_id_ = ls->get_ls_id().id())) {
} else if (OB_FAIL(ls->get_ls_info(ls_info))) {
SERVER_LOG(WARN, "get ls info failed", K(ret), KPC(ls));
} else { } else {
const int64_t col_count = output_column_ids_.count(); const int64_t col_count = output_column_ids_.count();
for (int64_t i = 0; OB_SUCC(ret) && i < col_count; ++i) { for (int64_t i = 0; OB_SUCC(ret) && i < col_count; ++i) {

View File

@ -25,24 +25,26 @@ namespace observer
class ObAllVirtualLSInfo : public common::ObVirtualTableScannerIterator, class ObAllVirtualLSInfo : public common::ObVirtualTableScannerIterator,
public omt::ObMultiTenantOperator public omt::ObMultiTenantOperator
{ {
public: public:
ObAllVirtualLSInfo(); ObAllVirtualLSInfo();
virtual ~ObAllVirtualLSInfo(); virtual ~ObAllVirtualLSInfo();
public: public:
virtual int inner_get_next_row(common::ObNewRow *&row); virtual int inner_get_next_row(common::ObNewRow *&row);
virtual void reset(); virtual void reset();
inline void set_addr(common::ObAddr &addr) inline void set_addr(common::ObAddr &addr)
{ {
addr_ = addr; addr_ = addr;
} }
private: private:
// 过滤得到需要处理的租户 // 过滤得到需要处理的租户
virtual bool is_need_process(uint64_t tenant_id) override; virtual bool is_need_process(uint64_t tenant_id) override;
// 处理当前迭代的租户 // 处理当前迭代的租户
virtual int process_curr_tenant(common::ObNewRow *&row) override; virtual int process_curr_tenant(common::ObNewRow *&row) override;
// 释放上一个租户的资源 // 释放上一个租户的资源
virtual void release_last_tenant() override; virtual void release_last_tenant() override;
private: private:
int next_ls_info_(ObLSVTInfo &ls_info);
private:
common::ObAddr addr_; common::ObAddr addr_;
char ip_buf_[common::OB_IP_STR_BUFF]; char ip_buf_[common::OB_IP_STR_BUFF];
char state_name_[common::MAX_LS_STATE_LENGTH]; char state_name_[common::MAX_LS_STATE_LENGTH];
@ -50,7 +52,7 @@ class ObAllVirtualLSInfo : public common::ObVirtualTableScannerIterator,
/* 跨租户访问的资源必须由ObMultiTenantOperator来处理释放*/ /* 跨租户访问的资源必须由ObMultiTenantOperator来处理释放*/
int64_t ls_id_; int64_t ls_id_;
ObSharedGuard<storage::ObLSIterator> ls_iter_guard_; ObSharedGuard<storage::ObLSIterator> ls_iter_guard_;
private: private:
DISALLOW_COPY_AND_ASSIGN(ObAllVirtualLSInfo); DISALLOW_COPY_AND_ASSIGN(ObAllVirtualLSInfo);
}; };