[FIX] Deadlock when read tx data
This commit is contained in:
@ -485,15 +485,38 @@ int ObTxDataTable::check_tx_data_with_cache_once_(const transaction::ObTransID t
|
|||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
|
|
||||||
ObTxDataMemtable *tx_data_memtable = nullptr;
|
|
||||||
ObTxDataGuard tx_data_guard;
|
ObTxDataGuard tx_data_guard;
|
||||||
bool find = false;
|
bool find = false;
|
||||||
|
|
||||||
|
if (OB_FAIL(get_tx_data_from_cache_(tx_id, tx_data_guard, find))) {
|
||||||
|
STORAGE_LOG(WARN, "get memtable range failed", KR(ret));
|
||||||
|
} else {
|
||||||
|
if (find) {
|
||||||
|
ret = fn(*tx_data_guard.tx_data());
|
||||||
|
} else {
|
||||||
|
int64_t memtable_head = -1;
|
||||||
|
int64_t memtable_tail = -1;
|
||||||
|
if (OB_FAIL(get_memtable_mgr_()->get_memtable_range(memtable_head, memtable_tail))) {
|
||||||
|
STORAGE_LOG(WARN, "get memtable range failed", KR(ret));
|
||||||
|
} else if (memtable_head != memtables_cache_.memtable_head_ || memtable_tail != memtables_cache_.memtable_tail_) {
|
||||||
|
ret = OB_EAGAIN;
|
||||||
|
} else {
|
||||||
|
ret = OB_TRANS_CTX_NOT_EXIST;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ObTxDataTable::get_tx_data_from_cache_(const transaction::ObTransID tx_id, ObTxDataGuard &tx_data_guard, bool &find)
|
||||||
|
{
|
||||||
|
int ret = OB_SUCCESS;
|
||||||
|
|
||||||
TCRLockGuard guard(memtables_cache_.lock_);
|
TCRLockGuard guard(memtables_cache_.lock_);
|
||||||
ObTableHdlArray &memtable_handles = memtables_cache_.memtable_handles_;
|
ObTableHdlArray &memtable_handles = memtables_cache_.memtable_handles_;
|
||||||
|
|
||||||
for (int i = memtable_handles.count() - 1; OB_SUCC(ret) && !find && i >= 0; i--) {
|
for (int i = memtable_handles.count() - 1; OB_SUCC(ret) && !find && i >= 0; i--) {
|
||||||
tx_data_memtable = nullptr;
|
ObTxDataMemtable *tx_data_memtable = nullptr;
|
||||||
if (OB_FAIL(memtable_handles.at(i).get_tx_data_memtable(tx_data_memtable))) {
|
if (OB_FAIL(memtable_handles.at(i).get_tx_data_memtable(tx_data_memtable))) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
STORAGE_LOG(ERROR, "get tx data memtable from table handles fail.", KR(ret), K(tx_id), K(memtable_handles.at(i)));
|
STORAGE_LOG(ERROR, "get tx data memtable from table handles fail.", KR(ret), K(tx_id), K(memtable_handles.at(i)));
|
||||||
@ -518,21 +541,6 @@ int ObTxDataTable::check_tx_data_with_cache_once_(const transaction::ObTransID t
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OB_SUCC(ret)) {
|
|
||||||
if (find) {
|
|
||||||
ret = fn(*tx_data_guard.tx_data());
|
|
||||||
} else {
|
|
||||||
int64_t memtable_head = -1;
|
|
||||||
int64_t memtable_tail = -1;
|
|
||||||
if (OB_FAIL(get_memtable_mgr_()->get_memtable_range(memtable_head, memtable_tail))) {
|
|
||||||
STORAGE_LOG(WARN, "get memtable range failed", KR(ret));
|
|
||||||
} else if (memtable_head != memtables_cache_.memtable_head_ || memtable_tail != memtables_cache_.memtable_tail_) {
|
|
||||||
ret = OB_EAGAIN;
|
|
||||||
} else {
|
|
||||||
ret = OB_TRANS_CTX_NOT_EXIST;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -254,6 +254,7 @@ private:
|
|||||||
|
|
||||||
int check_tx_data_in_memtable_(const transaction::ObTransID tx_id, ObITxDataCheckFunctor &fn);
|
int check_tx_data_in_memtable_(const transaction::ObTransID tx_id, ObITxDataCheckFunctor &fn);
|
||||||
int check_tx_data_with_cache_once_(const transaction::ObTransID tx_id, ObITxDataCheckFunctor &fn);
|
int check_tx_data_with_cache_once_(const transaction::ObTransID tx_id, ObITxDataCheckFunctor &fn);
|
||||||
|
int get_tx_data_from_cache_(const transaction::ObTransID tx_id, ObTxDataGuard &tx_data_guard, bool &find);
|
||||||
|
|
||||||
int check_tx_data_in_sstable_(const transaction::ObTransID tx_id, ObITxDataCheckFunctor &fn);
|
int check_tx_data_in_sstable_(const transaction::ObTransID tx_id, ObITxDataCheckFunctor &fn);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user