[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
	 ZenoWang
					ZenoWang