[master] fix concurrent callback sql with tx-participant callback scheduler
This commit is contained in:
		@ -710,6 +710,11 @@ inline bool ObTxDesc::acq_commit_cb_lock_if_need_()
 | 
			
		||||
bool ObTxDesc::execute_commit_cb()
 | 
			
		||||
{
 | 
			
		||||
  bool executed = false;
 | 
			
		||||
  /*
 | 
			
		||||
   * load_acquire state_ and commit_out_
 | 
			
		||||
   * pair with ObTransService::handle_tx_commit_result_
 | 
			
		||||
   */
 | 
			
		||||
  ATOMIC_LOAD_ACQ((int*)&state_);
 | 
			
		||||
  if (is_tx_end() || is_xa_terminate_state_()) {
 | 
			
		||||
    auto tx_id = tx_id_;
 | 
			
		||||
    auto cb = commit_cb_;
 | 
			
		||||
 | 
			
		||||
@ -344,7 +344,7 @@ protected:
 | 
			
		||||
 | 
			
		||||
  uint64_t op_sn_;                     // Tx level operation sequence No
 | 
			
		||||
 | 
			
		||||
  enum class State                     // State of Tx
 | 
			
		||||
  enum class State : int               // State of Tx
 | 
			
		||||
  {
 | 
			
		||||
    INVL,
 | 
			
		||||
    IDLE,               // created
 | 
			
		||||
 | 
			
		||||
@ -429,6 +429,7 @@ int ObTransService::handle_tx_commit_result_(ObTxDesc &tx,
 | 
			
		||||
{
 | 
			
		||||
  int ret = OB_SUCCESS;
 | 
			
		||||
  bool commit_fin = true;
 | 
			
		||||
  ObTxDesc::State state = ObTxDesc::State::INVL;
 | 
			
		||||
  int commit_out = OB_SUCCESS;
 | 
			
		||||
  switch (result) {
 | 
			
		||||
  case OB_EAGAIN:
 | 
			
		||||
@ -465,23 +466,23 @@ int ObTransService::handle_tx_commit_result_(ObTxDesc &tx,
 | 
			
		||||
    break;
 | 
			
		||||
  case OB_TRANS_COMMITED:
 | 
			
		||||
  case OB_SUCCESS:
 | 
			
		||||
    tx.state_ = ObTxDesc::State::COMMITTED;
 | 
			
		||||
    state = ObTxDesc::State::COMMITTED;
 | 
			
		||||
    tx.commit_version_ = commit_version;
 | 
			
		||||
    commit_out = OB_SUCCESS;
 | 
			
		||||
    break;
 | 
			
		||||
  case OB_TRANS_KILLED:
 | 
			
		||||
  case OB_TRANS_ROLLBACKED:
 | 
			
		||||
    tx.state_ = ObTxDesc::State::ROLLED_BACK;
 | 
			
		||||
    state = ObTxDesc::State::ROLLED_BACK;
 | 
			
		||||
    commit_out = result;
 | 
			
		||||
    break;
 | 
			
		||||
  case OB_TRANS_TIMEOUT:
 | 
			
		||||
    TX_STAT_TIMEOUT_INC
 | 
			
		||||
  case OB_TRANS_STMT_TIMEOUT:
 | 
			
		||||
    tx.state_ = ObTxDesc::State::COMMIT_TIMEOUT;
 | 
			
		||||
    state = ObTxDesc::State::COMMIT_TIMEOUT;
 | 
			
		||||
    commit_out = result;
 | 
			
		||||
    break;
 | 
			
		||||
  case OB_TRANS_UNKNOWN:
 | 
			
		||||
    tx.state_ = ObTxDesc::State::COMMIT_UNKNOWN;
 | 
			
		||||
    state = ObTxDesc::State::COMMIT_UNKNOWN;
 | 
			
		||||
    commit_out = result;
 | 
			
		||||
    break;
 | 
			
		||||
  default:
 | 
			
		||||
@ -494,7 +495,12 @@ int ObTransService::handle_tx_commit_result_(ObTxDesc &tx,
 | 
			
		||||
    if (tx.finish_ts_ <= 0) { // maybe aborted early
 | 
			
		||||
      tx.finish_ts_ = ObClockGenerator::getClock();
 | 
			
		||||
    }
 | 
			
		||||
    /*
 | 
			
		||||
     * store_release ObTxDesc::{commit_out_, state_}
 | 
			
		||||
     * pair with ObTxDesc::execute_commit_cb
 | 
			
		||||
     */
 | 
			
		||||
    tx.commit_out_ = commit_out;
 | 
			
		||||
    ATOMIC_STORE_REL((int*)&tx.state_, (int)state);
 | 
			
		||||
    if (tx.commit_task_.is_registered()) {
 | 
			
		||||
      if (OB_FAIL(unregister_commit_retry_task_(tx))) {
 | 
			
		||||
        TRANS_LOG(ERROR, "deregister timeout task fail", K(tx));
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user