BUGFIX: add ls state from stop to offline

This commit is contained in:
obdev
2024-04-02 12:39:13 +00:00
committed by ob-robot
parent f3c6e65b01
commit f3aa96144c
4 changed files with 66 additions and 9 deletions

View File

@ -328,6 +328,7 @@ TEST_F(TestLSService, create_and_clean)
LOG_WARN("create failed but not break by test", K(ret), K(id_105));
} else {
// create success and finish the break test
ls_svr->break_point = 0;
ASSERT_EQ(OB_SUCCESS, ls_svr->check_ls_exist(id_105, exist));
ASSERT_TRUE(exist);
ASSERT_EQ(OB_SUCCESS, ls_svr->remove_ls(id_105));
@ -348,6 +349,56 @@ TEST_F(TestLSService, create_and_clean)
ASSERT_FALSE(waiting);
}
TEST_F(TestLSService, test_remove_ls)
{
int ret = OB_SUCCESS;
uint64_t tenant_id = MTL_ID();
ObCreateLSArg arg;
ObLSService* ls_svr = MTL(ObLSService*);
bool exist = false;
bool waiting = false;
bool need_break = false;
ObLSID id_105(105);
int64_t MAX_CREATE_STEP = 100;
int cnt = 0;
LOG_INFO("TestLSService::test_remove_ls");
ASSERT_EQ(OB_SUCCESS, gen_create_ls_arg(tenant_id, id_105, arg));
for (int64_t i = 1; i < MAX_CREATE_STEP; i++) {
ls_svr->break_point = 0;
ASSERT_EQ(OB_SUCCESS, ls_svr->create_ls(arg));
// create success and remove ls break test
LOG_INFO("remove ls break point", K(i));
ls_svr->break_point = i;
ASSERT_EQ(OB_SUCCESS, ls_svr->check_ls_exist(id_105, exist));
ASSERT_TRUE(exist);
cnt = 0;
while (OB_FAIL(ls_svr->remove_ls(id_105)) && OB_BREAK_BY_TEST == ret) {
ls_svr->break_point = 0;
cnt++;
LOG_WARN("remove_ls failed, retry", K(ret), K(cnt));
}
// remove ls does not failed, the test should break
if (cnt == 0) {
need_break = true;
}
// wait safe destroy
cnt = 0;
while (cnt++ < 20) {
ASSERT_EQ(OB_SUCCESS, ls_svr->check_ls_waiting_safe_destroy(id_105, waiting));
if (waiting) {
::sleep(1);
} else {
break;
}
}
ASSERT_FALSE(waiting);
if (need_break) {
break;
}
}
}
TEST_F(TestLSService, check_ls_iter_cnt)
{
int ret = OB_SUCCESS;
@ -423,6 +474,7 @@ TEST_F(TestLSService, check_ls_iter_cnt)
ASSERT_TRUE(end_time - start_time <= 60 * 1000 * 1000);
}
} // namespace storage
} // namespace oceanbase

View File

@ -760,6 +760,8 @@ int ObLS::offline_(const int64_t start_ts)
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
LOG_WARN("ls is not inited", K(ret));
} else if (running_state_.is_stopped()) {
LOG_INFO("ls is stopped state, do nothing", K(ret), K(ls_meta_));
} else if (OB_FAIL(running_state_.pre_offline(ls_meta_.ls_id_))) {
LOG_WARN("ls pre offline failed", K(ret), K(ls_meta_));
} else if (FALSE_IT(update_state_seq_())) {

View File

@ -28,7 +28,7 @@ namespace storage
//RUNNING N RUNNING OFFLINING N N
//OFFLINING N N OFFLINING OFFLINED N
//OFFLINED N RUNNING OFFLINED OFFLINED STOPPED
//STOPPED N N N N STOPPED
//STOPPED N N STOPPED STOPPED STOPPED
int ObLSRunningState::StateHelper::switch_state(const int64_t op)
{
int ret = OB_SUCCESS;
@ -45,7 +45,7 @@ int ObLSRunningState::StateHelper::switch_state(const int64_t op)
/* RUNNING */ {N, LS_RUNNING, LS_OFFLINING, N, N},
/* OFFLINING */ {N, N, LS_OFFLINING, LS_OFFLINED, N},
/* OFFLINED */ {N, LS_RUNNING, LS_OFFLINED, LS_OFFLINED, LS_STOPPED},
/* STOPPED */ {N, N, N, N, LS_STOPPED},
/* STOPPED */ {N, N, LS_STOPPED, LS_STOPPED, LS_STOPPED},
};
if (OB_UNLIKELY(!Ops::is_valid(op))) {

View File

@ -959,12 +959,13 @@ int ObLSService::safe_remove_ls_(ObLSHandle handle, const bool remove_from_disk)
{
int ret = OB_SUCCESS;
ObLS *ls = NULL;
int64_t process_point = 0; // for test
if (OB_ISNULL(ls = handle.get_ls())) {
ret = OB_ERR_UNEXPECTED;
LOG_ERROR("log stream is null, unexpected error");
} else if (OB_FAIL(ls->offline())) {
} else if (OB_BREAK_FAIL(ls->offline())) {
LOG_WARN("ls offline failed", K(ret), KP(ls));
} else if (OB_FAIL(ls->stop())) {
} else if (OB_BREAK_FAIL(ls->stop())) {
LOG_WARN("stop ls failed", K(ret), KP(ls));
} else if (FALSE_IT(ls->wait())) {
} else {
@ -979,16 +980,18 @@ int ObLSService::safe_remove_ls_(ObLSHandle handle, const bool remove_from_disk)
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("alloc memory failed", K(ret));
} else if (FALSE_IT(task = new(task) ObLSSafeDestroyTask())) {
} else if (remove_from_disk && OB_FAIL(ls->set_remove_state())) {
} else if (OB_BREAK_FAIL(ret)) {
LOG_WARN("break fail for malloc", K(ret));
} else if (remove_from_disk && OB_BREAK_FAIL(ls->set_remove_state())) {
LOG_WARN("ls set remove state failed", KR(ret), K(ls_id));
} else if (OB_FAIL(task->init(MTL_ID(),
} else if (OB_BREAK_FAIL(task->init(MTL_ID(),
handle,
this))) {
LOG_WARN("init safe destroy task failed", K(ret));
} else {
remove_ls_(ls, remove_from_disk, write_slog);
// try until success.
while (OB_FAIL(gc_service->add_safe_destroy_task(*task))) {
while (OB_BREAK_FAIL(gc_service->add_safe_destroy_task(*task))) {
if (REACH_TIME_INTERVAL(1_min)) { // every minute
LOG_WARN("add safe destroy task failed, retry", K(ret), KPC(task));
}