[FEAT MERGE] merge transfer

Co-authored-by: wxhwang <wxhwang@126.com>
Co-authored-by: godyangfight <godyangfight@gmail.com>
Co-authored-by: Tyshawn <tuyunshan@gmail.com>
This commit is contained in:
xuhuleon
2023-06-21 11:42:26 +00:00
committed by ob-robot
parent d06678002e
commit 9dae112952
1280 changed files with 149724 additions and 48813 deletions

View File

@ -18,6 +18,7 @@
#define private public
#include "share/scheduler/ob_dag_scheduler.h"
#include "lib/atomic/ob_atomic.h"
#include "lib/alloc/ob_malloc_allocator.h"
#include "observer/omt/ob_tenant_node_balancer.h"
#include "share/scheduler/ob_dag_warning_history_mgr.h"
#include "storage/meta_mem/ob_tenant_meta_mem_mgr.h"
@ -49,6 +50,7 @@ namespace oceanbase
using namespace common;
using namespace share;
using namespace omt;
using namespace lib;
namespace storage
{
@ -67,6 +69,7 @@ public:
TestDagScheduler()
: tenant_id_(500),
scheduler_(nullptr),
dag_history_mgr_(nullptr),
tenant_base_(500)
{}
~TestDagScheduler() {}
@ -84,9 +87,16 @@ public:
scheduler_ = OB_NEW(ObTenantDagScheduler, ObModIds::TEST);
tenant_base_.set(scheduler_);
dag_history_mgr_ = OB_NEW(ObDagWarningHistoryManager, ObModIds::TEST);
tenant_base_.set(dag_history_mgr_);
ObTenantEnv::set_tenant(&tenant_base_);
ASSERT_EQ(OB_SUCCESS, tenant_base_.init());
ObMallocAllocator *ma = ObMallocAllocator::get_instance();
ASSERT_EQ(OB_SUCCESS, ma->create_and_add_tenant_allocator(tenant_id_));
ASSERT_EQ(OB_SUCCESS, ma->set_tenant_limit(tenant_id_, 1LL << 30));
ASSERT_EQ(OB_SUCCESS, t3m->init());
ASSERT_EQ(OB_SUCCESS, scheduler_->init(tenant_id_, time_slice, check_waiting_list_period, MAX_DAG_CNT));
}
@ -94,6 +104,8 @@ public:
{
scheduler_->destroy();
scheduler_ = nullptr;
dag_history_mgr_->~ObDagWarningHistoryManager();
dag_history_mgr_ = nullptr;
tenant_base_.destroy();
ObTenantEnv::set_tenant(nullptr);
}
@ -101,6 +113,7 @@ private:
const static int64_t MAX_DAG_CNT = 64;
const uint64_t tenant_id_;
ObTenantDagScheduler *scheduler_;
ObDagWarningHistoryManager *dag_history_mgr_;
ObTenantBase tenant_base_;
DISALLOW_COPY_AND_ASSIGN(TestDagScheduler);
};
@ -131,7 +144,17 @@ public:
}
return bret;
}
virtual int fill_comment(char *buf,const int64_t size) const override { UNUSEDx(buf, size); return OB_SUCCESS; }
virtual int fill_info_param(compaction::ObIBasicInfoParam *&out_param,
ObIAllocator &allocator) const override
{
int ret = OB_SUCCESS;
if (!is_inited_) {
ret = OB_NOT_INIT;
} else if (OB_FAIL(ADD_DAG_WARN_INFO_PARAM(out_param, allocator, get_type(), id_, id_+1, "is_test", true))) {
COMMON_LOG(WARN, "fail to add dag warning info param", K(ret));
}
return ret;
}
virtual int fill_dag_key(char *buf,const int64_t size) const override { UNUSEDx(buf, size); return OB_SUCCESS; }
virtual lib::Worker::CompatMode get_compat_mode() const override
{ return lib::Worker::CompatMode::MYSQL; }
@ -193,7 +216,6 @@ public:
}
return common::OB_SUCCESS;
}
bool check_can_retry()
{
bool bret = true;
@ -229,13 +251,16 @@ TEST_F(TestDagScheduler, test_task_wait_to_schedule)
{
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
ASSERT_TRUE(nullptr != scheduler);
ObWaitDag *dag = NULL;
ObDagWarningHistoryManager* manager = MTL(ObDagWarningHistoryManager *);
ASSERT_TRUE(nullptr != manager);
EXPECT_EQ(OB_SUCCESS, MTL(ObDagWarningHistoryManager *)->init(true, MTL_ID(), "DagWarnHis"));
for (int i = 0; i < 10; ++i) {
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag(nullptr, dag));
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag<ObWaitDag>(nullptr));
}
wait_scheduler();
EXPECT_EQ(0, ObDagWarningHistoryManager::get_instance().size());
EXPECT_EQ(0, MTL(ObDagWarningHistoryManager *)->size());
}
/*
@ -313,14 +338,16 @@ TEST_F(TestDagScheduler, test_task_retry)
{
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
ASSERT_TRUE(nullptr != scheduler);
ObDagWarningHistoryManager* manager = MTL(ObDagWarningHistoryManager *);
ASSERT_TRUE(nullptr != manager);
EXPECT_EQ(OB_SUCCESS, MTL(ObDagWarningHistoryManager *)->init(true, MTL_ID(), "DagWarnHis"));
for (int i = 0; i < 2; ++i) {
ObTaskRetryDag *dag = NULL;
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag(nullptr, dag));
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag<ObTaskRetryDag>(nullptr));
}
wait_scheduler();
EXPECT_EQ(0, ObDagWarningHistoryManager::get_instance().size());
EXPECT_EQ(0, MTL(ObDagWarningHistoryManager *)->size());
}
class ObDagRetryTask : public ObITask
@ -432,6 +459,9 @@ TEST_F(TestDagScheduler, test_dag_retry)
{
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
ASSERT_TRUE(nullptr != scheduler);
ObDagWarningHistoryManager* manager = MTL(ObDagWarningHistoryManager *);
ASSERT_TRUE(nullptr != manager);
EXPECT_EQ(OB_SUCCESS, MTL(ObDagWarningHistoryManager *)->init(true, MTL_ID(), "DagWarnHis"));
int ret = OB_SUCCESS;
for (int i = 0; OB_SUCC(ret) && i < 5; ++i) {
@ -442,16 +472,17 @@ TEST_F(TestDagScheduler, test_dag_retry)
param.id_ = i + 1;
snprintf(str, str_len, "Hello OceanBase_%d", i);
param.str_ = ObString(str);
if (OB_FAIL(scheduler->create_and_add_dag(&param, dag))) {
COMMON_LOG(WARN, "failed to create first task", K(ret));
} else {
dag->set_max_retry_times(3);
if (OB_FAIL(scheduler->create_dag(&param, dag))) {
COMMON_LOG(WARN, "failed to create dag", K(ret));
} else if (FALSE_IT(dag->set_max_retry_times(3))) {
} else if (OB_FAIL(scheduler->add_dag(dag))) {
COMMON_LOG(WARN, "failed to add dag", K(ret));
}
EXPECT_EQ(OB_SUCCESS, ret);
}
wait_scheduler();
EXPECT_EQ(0, ObDagWarningHistoryManager::get_instance().size());
EXPECT_EQ(0, MTL(ObDagWarningHistoryManager *)->size());
}
class ObOperator
@ -751,14 +782,16 @@ TEST_F(TestDagScheduler, test_basic_dag_net)
{
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
ASSERT_TRUE(nullptr != scheduler);
ObDagWarningHistoryManager* manager = MTL(ObDagWarningHistoryManager *);
ASSERT_TRUE(nullptr != manager);
EXPECT_EQ(OB_SUCCESS, MTL(ObDagWarningHistoryManager *)->init(true, MTL_ID(), "DagWarnHis"));
ObFatherDagNet *dag_net = nullptr;
for (int i = 0; i < 2; ++i) {
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag_net(nullptr, dag_net));
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag_net<ObFatherDagNet>(nullptr));
}
wait_scheduler();
EXPECT_EQ(0, ObDagWarningHistoryManager::get_instance().size());
EXPECT_EQ(0, MTL(ObDagWarningHistoryManager *)->size());
}
class ObFatherWithRetryDagNet : public ObFatherDagNet
@ -822,14 +855,16 @@ TEST_F(TestDagScheduler, test_basic_dag_net_with_one_retry_dag)
{
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
ASSERT_TRUE(nullptr != scheduler);
ObDagWarningHistoryManager* manager = MTL(ObDagWarningHistoryManager *);
ASSERT_TRUE(nullptr != manager);
EXPECT_EQ(OB_SUCCESS, MTL(ObDagWarningHistoryManager *)->init(true, MTL_ID(), "DagWarnHis"));
ObFatherWithRetryDagNet *dag_net = nullptr;
for (int i = 0; i < 1; ++i) {
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag_net(nullptr, dag_net));
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag_net<ObFatherWithRetryDagNet>(nullptr));
}
wait_scheduler();
EXPECT_EQ(0, ObDagWarningHistoryManager::get_instance().size());
EXPECT_EQ(0, MTL(ObDagWarningHistoryManager *)->size());
}
/*
@ -902,15 +937,24 @@ TEST_F(TestDagScheduler, test_generage_task_failed)
{
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
ASSERT_TRUE(nullptr != scheduler);
ObDagWarningHistoryManager* manager = MTL(ObDagWarningHistoryManager *);
ASSERT_TRUE(nullptr != manager);
ASSERT_EQ(OB_SUCCESS, MTL(ObDagWarningHistoryManager *)->init(true, MTL_ID(), "DagWarnHis"));
int ret = OB_SUCCESS;
ObGenerateFailedDag *dag = nullptr;
for (int i = 0; i < 1; ++i) {
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag(nullptr, dag));
dag->set_max_retry_times(7);
if (OB_FAIL(scheduler->create_dag(nullptr, dag))) {
COMMON_LOG(WARN, "failed to create dag", K(ret));
} else if (FALSE_IT(dag->set_max_retry_times(7))) {
} else if (OB_FAIL(scheduler->add_dag(dag))) {
COMMON_LOG(WARN, "failed to add dag", K(ret));
}
EXPECT_EQ(OB_SUCCESS, ret);
}
wait_scheduler();
EXPECT_EQ(0, ObDagWarningHistoryManager::get_instance().size());
ASSERT_EQ(1, MTL(ObDagWarningHistoryManager *)->size());
}
//generate next dag
@ -1233,6 +1277,9 @@ TEST_F(TestDagScheduler, generate_next_dag)
{
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
ASSERT_TRUE(nullptr != scheduler);
ObDagWarningHistoryManager* manager = MTL(ObDagWarningHistoryManager *);
ASSERT_TRUE(nullptr != manager);
EXPECT_EQ(OB_SUCCESS, MTL(ObDagWarningHistoryManager *)->init(true, MTL_ID(), "DagWarnHis"));
ObStartGenerateNextDag *dag = nullptr;
EXPECT_EQ(OB_SUCCESS, scheduler->alloc_dag(dag));
@ -1241,7 +1288,7 @@ TEST_F(TestDagScheduler, generate_next_dag)
EXPECT_EQ(OB_SUCCESS, scheduler->add_dag(dag));
wait_scheduler();
EXPECT_EQ(0, ObDagWarningHistoryManager::get_instance().size());
EXPECT_EQ(0, MTL(ObDagWarningHistoryManager *)->size());
}
class ObCreateChildTask : public ObITask
@ -1377,11 +1424,14 @@ TEST_F(TestDagScheduler, test_add_dag_failed_in_generate_dag_net)
{
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
ASSERT_TRUE(nullptr != scheduler);
ObCreateDagNet *dag_net = nullptr;
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag_net(nullptr, dag_net));
ObDagWarningHistoryManager* manager = MTL(ObDagWarningHistoryManager *);
ASSERT_TRUE(nullptr != manager);
ASSERT_EQ(OB_SUCCESS, MTL(ObDagWarningHistoryManager *)->init(true, MTL_ID(), "DagWarnHis"));
ASSERT_EQ(OB_SUCCESS, scheduler->create_and_add_dag_net<ObCreateDagNet>(nullptr));
wait_scheduler();
EXPECT_EQ(0, ObDagWarningHistoryManager::get_instance().size());
ASSERT_EQ(1, MTL(ObDagWarningHistoryManager *)->size());
}
class ObFreeDagNet: public ObFatherDagNet
@ -1426,11 +1476,14 @@ TEST_F(TestDagScheduler, test_free_dag_func)
{
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
ASSERT_TRUE(nullptr != scheduler);
ObFreeDagNet *dag_net = nullptr;
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag_net(nullptr, dag_net));
ObDagWarningHistoryManager* manager = MTL(ObDagWarningHistoryManager *);
ASSERT_TRUE(nullptr != manager);
EXPECT_EQ(OB_SUCCESS, MTL(ObDagWarningHistoryManager *)->init(true, MTL_ID(), "DagWarnHis"));
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag_net<ObFreeDagNet>(nullptr));
wait_scheduler();
EXPECT_EQ(0, ObDagWarningHistoryManager::get_instance().size());
EXPECT_EQ(0, MTL(ObDagWarningHistoryManager *)->size());
}
class ObCancelDag : public ObBasicDag
@ -1493,8 +1546,16 @@ TEST_F(TestDagScheduler, test_cancel_dag_func)
{
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
ASSERT_TRUE(nullptr != scheduler);
ObCancelDagNet *dag_net = nullptr;
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag_net(nullptr, dag_net));
ObDagWarningHistoryManager* manager = MTL(ObDagWarningHistoryManager *);
ASSERT_TRUE(nullptr != manager);
EXPECT_EQ(OB_SUCCESS, MTL(ObDagWarningHistoryManager *)->init(true, MTL_ID(), "DagWarnHis"));
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag_net<ObCancelDagNet>(nullptr));
ObIDagNet *tmp_dag_net = nullptr;
EXPECT_EQ(OB_SUCCESS, scheduler->get_first_dag_net(tmp_dag_net));
EXPECT_NE(nullptr, tmp_dag_net);
ObCancelDagNet *dag_net = static_cast<ObCancelDagNet*>(tmp_dag_net);
while (scheduler->get_cur_dag_cnt() < 3) {
usleep(100);
@ -1508,7 +1569,7 @@ TEST_F(TestDagScheduler, test_cancel_dag_func)
}
EXPECT_EQ(true, scheduler->is_empty());
EXPECT_EQ(0, ObDagWarningHistoryManager::get_instance().size());
EXPECT_EQ(0, MTL(ObDagWarningHistoryManager *)->size());
}
@ -1518,8 +1579,12 @@ TEST_F(TestDagScheduler, test_cancel_dag_net_func)
int ret = OB_SUCCESS;
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
ASSERT_TRUE(nullptr != scheduler);
ObCancelDagNet *dag_net = nullptr;
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag_net(nullptr, dag_net));
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag_net<ObCancelDagNet>(nullptr));
ObIDagNet *tmp_dag_net = nullptr;
EXPECT_EQ(OB_SUCCESS, scheduler->get_first_dag_net(tmp_dag_net));
EXPECT_NE(nullptr, tmp_dag_net);
ObCancelDagNet *dag_net = static_cast<ObCancelDagNet*>(tmp_dag_net);
while (scheduler->get_cur_dag_cnt() < 3) {
usleep(100);
@ -1538,24 +1603,24 @@ TEST_F(TestDagScheduler, test_cancel_dag_net_func)
ob_usleep(5000 * 1000);
EXPECT_EQ(true, scheduler->is_empty());
EXPECT_EQ(0, ObDagWarningHistoryManager::get_instance().size());
EXPECT_EQ(0, MTL(ObDagWarningHistoryManager *)->size());
}
TEST_F(TestDagScheduler, test_destroy_when_running)
TEST_F(TestDagScheduler, test_destroy_when_running) //TODO(renju.rj): fix it
{
ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
ASSERT_TRUE(nullptr != scheduler);
#ifndef BUILD_COVERAGE
// not participate in coverage compilation to fix hang problem
ObCancelDagNet *dag_net = nullptr;
EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag_net(nullptr, dag_net));
while (scheduler->get_cur_dag_cnt() < 3) {
usleep(100);
}
#endif
// ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*);
// ASSERT_TRUE(nullptr != scheduler);
//
// #ifndef BUILD_COVERAGE
// // not participate in coverage compilation to fix hang problem
// ObCancelDagNet *dag_net = nullptr;
// EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag_net(nullptr));
//
// while (scheduler->get_cur_dag_cnt() < 3) {
// usleep(100);
// }
// #endif
}

View File

@ -424,10 +424,14 @@ public:
void set_id(int64_t id) { id_ = id; }
AtomicOperator &get_op() { return op_; }
void set_running() { running_ = true; }
int fill_comment(char *buf,const int64_t size) const {
virtual int fill_info_param(compaction::ObIBasicInfoParam *&out_param,
ObIAllocator &allocator) const override
{
int ret = OB_SUCCESS;
if (OB_ISNULL(buf) || size <0) {
COMMON_LOG(INFO,"buf is NULL",K(ret),K(size));
if (!is_inited_) {
ret = OB_NOT_INIT;
} else if (OB_FAIL(ADD_DAG_WARN_INFO_PARAM(out_param, allocator, get_type(), 1, 1, "table_id", 10))) {
COMMON_LOG(WARN, "fail to add dag warning info param", K(ret));
}
return ret;
}
@ -479,7 +483,7 @@ private:
class TestHALowDag : public TestDag
{
public:
TestHALowDag() : TestDag(ObDagType::DAG_TYPE_BACKUP) {}
TestHALowDag() : TestDag(ObDagType::DAG_TYPE_BACKUP_PREPARE) {}
private:
DISALLOW_COPY_AND_ASSIGN(TestHALowDag);
};
@ -800,6 +804,7 @@ public:
TestDagScheduler()
: tenant_id_(500),
scheduler_(nullptr),
dag_history_mgr_(nullptr),
tenant_base_(500),
allocator_("DagScheduler")
{ }
@ -809,18 +814,29 @@ public:
scheduler_ = OB_NEW(ObTenantDagScheduler, ObModIds::TEST);
tenant_base_.set(scheduler_);
dag_history_mgr_ = OB_NEW(ObDagWarningHistoryManager, ObModIds::TEST);
tenant_base_.set(dag_history_mgr_);
ObTenantEnv::set_tenant(&tenant_base_);
ASSERT_EQ(OB_SUCCESS, tenant_base_.init());
ObMallocAllocator *ma = ObMallocAllocator::get_instance();
ASSERT_EQ(OB_SUCCESS, ma->create_and_add_tenant_allocator(tenant_id_));
ASSERT_EQ(OB_SUCCESS, ma->set_tenant_limit(tenant_id_, 1LL << 30));
}
void TearDown()
{
scheduler_->destroy();
scheduler_ = nullptr;
dag_history_mgr_->~ObDagWarningHistoryManager();
dag_history_mgr_ = nullptr;
tenant_base_.destroy();
ObTenantEnv::set_tenant(nullptr);
}
private:
const uint64_t tenant_id_;
ObTenantDagScheduler *scheduler_;
ObDagWarningHistoryManager *dag_history_mgr_;
ObTenantBase tenant_base_;
ObArenaAllocator allocator_;
DISALLOW_COPY_AND_ASSIGN(TestDagScheduler);