[master] XA resume and then Query free routed will failed with NOT_SUPPORTED error

This commit is contained in:
chinaxing 2023-02-10 07:40:55 +00:00 committed by ob-robot
parent f41110ff1b
commit 8d8c7bd53d
3 changed files with 6 additions and 2 deletions

View File

@ -344,6 +344,7 @@ void ObTxDesc::reset()
state_ = State::INVL;
flags_.v_ = 0;
flags_.SHADOW_ = true;
state_change_flags_.reset();
alloc_ts_ = -1;
@ -1284,6 +1285,7 @@ int ObTxDescMgr::add(ObTxDesc &tx_desc)
if (OB_FAIL(ret) && tx_id.is_valid()) {
tx_desc.reset_tx_id();
}
OX(tx_desc.flags_.SHADOW_ = false);
TRANS_LOG(TRACE, "txDescMgr.register trans", K(ret), K(tx_id), K(tx_desc));
return ret;
}
@ -1313,6 +1315,7 @@ int ObTxDescMgr::add_with_txid(const ObTransID &tx_id, ObTxDesc &tx_desc)
}
// if fail revert tx_desc.tx_id_ member
if (OB_FAIL(ret) && !desc_tx_id.is_valid()) { tx_desc.reset_tx_id(); }
if (OB_SUCC(ret) && tx_desc.flags_.SHADOW_) { tx_desc.flags_.SHADOW_ = false; }
}
TRANS_LOG(INFO, "txDescMgr.register trans with txid", K(ret), K(tx_id),
K(map_.alloc_cnt()));
@ -1349,6 +1352,7 @@ int ObTxDescMgr::remove(ObTxDesc &tx)
TRANS_LOG(TRACE, "txDescMgr.unregister trans:", K(tx_id));
OV(inited_, OB_NOT_INIT);
OX(map_.del(tx_id, &tx));
OX(tx.flags_.SHADOW_ = true);
return ret;
}

View File

@ -371,7 +371,7 @@ protected:
struct
{
bool EXPLICIT_:1; // txn is explicted start
bool SHADOW_:1; // this tx desc is a shadow copy
bool SHADOW_:1; // this tx desc is a shadow copy, is not registered with tx_desc_mgr
bool REPLICA_:1; // a replica of primary/original, its state is transient, without whole lifecyle
bool TRACING_:1; // tracing the Tx
bool INTERRUPTED_: 1; // a single for blocking operation

View File

@ -837,7 +837,7 @@ int ObTransService::create_implicit_savepoint(ObTxDesc &tx,
} else if (tx.state_ >= ObTxDesc::State::IN_TERMINATE) {
ret = OB_TRANS_INVALID_STATE;
TRANS_LOG(WARN, "create implicit savepoint but tx terminated", K(ret), K(tx));
} else if (tx.flags_.SHADOW_) {
} else if (tx.flags_.SHADOW_ && tx.get_tx_id().is_valid()) {
ret = create_local_implicit_savepoint_(tx, savepoint);
} else {
ret = create_global_implicit_savepoint_(tx, tx_param, savepoint, release);