BUGFIX: add ls state from stop to offline
This commit is contained in:
@ -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
|
||||
|
||||
|
||||
@ -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_())) {
|
||||
|
||||
@ -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))) {
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user