fix deadlock
This commit is contained in:
@ -96,7 +96,8 @@ int ObTabletDDLKvMgr::ddl_start(const ObITable::TableKey &table_key,
|
|||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
bool is_brand_new = false;
|
bool is_brand_new = false;
|
||||||
TCWLockGuard guard(lock_);
|
SCN saved_start_scn;
|
||||||
|
int64_t saved_snapshot_version = 0;
|
||||||
if (OB_UNLIKELY(!is_inited_)) {
|
if (OB_UNLIKELY(!is_inited_)) {
|
||||||
ret = OB_NOT_INIT;
|
ret = OB_NOT_INIT;
|
||||||
LOG_WARN("not init", K(ret), K(is_inited_));
|
LOG_WARN("not init", K(ret), K(is_inited_));
|
||||||
@ -107,7 +108,9 @@ int ObTabletDDLKvMgr::ddl_start(const ObITable::TableKey &table_key,
|
|||||||
} else if (table_key.get_tablet_id() != tablet_id_) {
|
} else if (table_key.get_tablet_id() != tablet_id_) {
|
||||||
ret = OB_ERR_SYS;
|
ret = OB_ERR_SYS;
|
||||||
LOG_WARN("tablet id not same", K(ret), K(table_key), K(tablet_id_));
|
LOG_WARN("tablet id not same", K(ret), K(table_key), K(tablet_id_));
|
||||||
} else if (start_scn_.is_valid_and_not_min()) {
|
} else {
|
||||||
|
TCWLockGuard guard(lock_);
|
||||||
|
if (start_scn_.is_valid_and_not_min()) {
|
||||||
if (execution_id >= execution_id_ && start_scn >= start_scn_) {
|
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));
|
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();
|
cleanup_unlock();
|
||||||
@ -129,9 +132,15 @@ int ObTabletDDLKvMgr::ddl_start(const ObITable::TableKey &table_key,
|
|||||||
start_scn_ = start_scn;
|
start_scn_ = start_scn;
|
||||||
max_freeze_scn_ = SCN::max(start_scn, checkpoint_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();
|
||||||
|
}
|
||||||
|
}
|
||||||
if (OB_SUCC(ret) && !checkpoint_scn.is_valid_and_not_min()) {
|
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
|
// 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_));
|
LOG_WARN("clean up ddl sstable failed", K(ret), K(ls_id_), K(tablet_id_));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user