提交 e7671e92 编写于 作者: S simonjoylet 提交者: ob-robot

fix deadlock

上级 ddec7a83
......@@ -96,7 +96,8 @@ int ObTabletDDLKvMgr::ddl_start(const ObITable::TableKey &table_key,
{
int ret = OB_SUCCESS;
bool is_brand_new = false;
TCWLockGuard guard(lock_);
SCN saved_start_scn;
int64_t saved_snapshot_version = 0;
if (OB_UNLIKELY(!is_inited_)) {
ret = OB_NOT_INIT;
LOG_WARN("not init", K(ret), K(is_inited_));
......@@ -107,31 +108,39 @@ int ObTabletDDLKvMgr::ddl_start(const ObITable::TableKey &table_key,
} else if (table_key.get_tablet_id() != tablet_id_) {
ret = OB_ERR_SYS;
LOG_WARN("tablet id not same", K(ret), K(table_key), K(tablet_id_));
} else if (start_scn_.is_valid_and_not_min()) {
if (execution_id >= execution_id_ && start_scn >= start_scn_) {
LOG_INFO("execution id changed, need cleanup", K(ls_id_), K(tablet_id_), K(execution_id_), K(execution_id), K(start_scn_), K(start_scn));
cleanup_unlock();
is_brand_new = true;
} else {
if (!checkpoint_scn.is_valid_and_not_min()) {
// only return error code when not start from checkpoint.
ret = OB_TASK_EXPIRED;
} else {
TCWLockGuard guard(lock_);
if (start_scn_.is_valid_and_not_min()) {
if (execution_id >= execution_id_ && start_scn >= start_scn_) {
LOG_INFO("execution id changed, need cleanup", K(ls_id_), K(tablet_id_), K(execution_id_), K(execution_id), K(start_scn_), K(start_scn));
cleanup_unlock();
is_brand_new = true;
} else {
if (!checkpoint_scn.is_valid_and_not_min()) {
// only return error code when not start from checkpoint.
ret = OB_TASK_EXPIRED;
}
LOG_INFO("ddl start ignored", K(ls_id_), K(tablet_id_), K(execution_id_), K(execution_id), K(start_scn_), K(start_scn));
}
LOG_INFO("ddl start ignored", K(ls_id_), K(tablet_id_), K(execution_id_), K(execution_id), K(start_scn_), K(start_scn));
} else {
is_brand_new = true;
}
if (OB_SUCC(ret) && is_brand_new) {
table_key_ = table_key;
cluster_version_ = cluster_version;
execution_id_ = execution_id;
start_scn_ = start_scn;
max_freeze_scn_ = SCN::max(start_scn, checkpoint_scn);
}
if (OB_SUCC(ret)) {
// save variables under lock
saved_start_scn = start_scn_;
saved_snapshot_version = table_key_.get_snapshot_version();
}
} else {
is_brand_new = true;
}
if (OB_SUCC(ret) && is_brand_new) {
table_key_ = table_key;
cluster_version_ = cluster_version;
execution_id_ = execution_id;
start_scn_ = start_scn;
max_freeze_scn_ = SCN::max(start_scn, checkpoint_scn);
}
if (OB_SUCC(ret) && !checkpoint_scn.is_valid_and_not_min()) {
// remove ddl sstable if exists and flush ddl start log ts and snapshot version into tablet meta
if (OB_FAIL(update_tablet(start_scn_, table_key_.get_snapshot_version(), start_scn_))) {
if (OB_FAIL(update_tablet(saved_start_scn, saved_snapshot_version, saved_start_scn))) {
LOG_WARN("clean up ddl sstable failed", K(ret), K(ls_id_), K(tablet_id_));
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册