patch 4.0

This commit is contained in:
wangzelin.wzl
2022-10-24 10:34:53 +08:00
parent 4ad6e00ec3
commit 93a1074b0c
10533 changed files with 2588271 additions and 2299373 deletions

View File

@ -16,17 +16,20 @@
#include "lib/ob_name_id_def.h"
#include "lib/profile/ob_perf_event.h"
#include "sql/ob_sql_utils.h"
#include "storage/transaction/ob_trans_part_ctx.h"
#include "sql/session/ob_sql_session_info.h"
using namespace oceanbase::transaction;
using namespace oceanbase::common;
namespace oceanbase {
namespace sql {
namespace oceanbase
{
namespace sql
{
ObSharedEndTransCallback::ObSharedEndTransCallback()
{}
{
}
ObSharedEndTransCallback::~ObSharedEndTransCallback()
{}
{
}
ObExclusiveEndTransCallback::ObExclusiveEndTransCallback()
{
@ -34,107 +37,22 @@ ObExclusiveEndTransCallback::ObExclusiveEndTransCallback()
}
ObExclusiveEndTransCallback::~ObExclusiveEndTransCallback()
{}
ObEndTransSyncCallback::ObEndTransSyncCallback() : ObExclusiveEndTransCallback(), queue_(), trans_desc_(NULL)
{}
ObEndTransSyncCallback::~ObEndTransSyncCallback()
{}
int ObEndTransSyncCallback::wait()
{
int ret = OB_SUCCESS;
int result = OB_SUCCESS;
int retry = 0;
if (NULL == trans_desc_) {
SQL_LOG(ERROR, "transaction desc is null, unexpected error", KP_(trans_desc));
ret = OB_ERR_UNEXPECTED;
} else {
const int64_t trans_expired_time = trans_desc_->get_trans_expired_time();
do {
ret = queue_.wait(PUSH_POP_TIMEOUT, result);
if (ObTimeUtility::current_time() > trans_expired_time + 1000 * 1000) {
++retry;
// log every 1000s
if (4 == retry || 0 == retry % 100) {
SQL_LOG(ERROR,
"ObEndTransSyncCallback wait() takes too long",
K(retry),
"trans_desc",
*trans_desc_,
K(lbt()),
K(result),
K_(call_counter),
K_(callback_counter),
K(ret));
}
}
} while (OB_TIMEOUT == ret);
if (OB_LIKELY(OB_SUCCESS == this->last_err_)) {
ret = (OB_SUCCESS == ret) ? result : ret;
} else {
ret = this->last_err_;
}
// cleanup after transaction is committed
if (NULL != session_ && trans_desc_->is_trx_level_temporary_table_involved()) {
int temp_ret = session_->drop_temp_tables(false);
if (OB_SUCCESS != temp_ret) {
LOG_WARN("trx level temporary table clean failed", KR(temp_ret));
}
}
}
return ret;
}
void ObEndTransSyncCallback::callback(int cb_param, const transaction::ObTransID& trans_id)
{
UNUSED(trans_id);
callback(cb_param);
}
void ObEndTransSyncCallback::callback(int cb_param)
{
this->handin();
CHECK_BALANCE("[sync callback]");
queue_.notify(cb_param);
}
int ObEndTransSyncCallback::init(const transaction::ObTransDesc* trans_desc, ObSQLSessionInfo* session)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(trans_desc)) {
SQL_LOG(WARN, "invalid argument", KP(trans_desc));
ret = OB_INVALID_ARGUMENT;
} else {
queue_.reset();
trans_desc_ = trans_desc;
session_ = session;
}
return ret;
}
void ObEndTransSyncCallback::reset()
{
queue_.reset();
trans_desc_ = NULL;
last_err_ = OB_SUCCESS;
}
///////////////// Async Callback Impl /////////////
ObEndTransAsyncCallback::ObEndTransAsyncCallback() : ObExclusiveEndTransCallback(), mysql_end_trans_cb_()
{}
ObEndTransAsyncCallback::ObEndTransAsyncCallback() :
ObExclusiveEndTransCallback(),
mysql_end_trans_cb_()
{
}
ObEndTransAsyncCallback::~ObEndTransAsyncCallback()
{}
{
}
void ObEndTransAsyncCallback::callback(int cb_param, const transaction::ObTransID& trans_id)
void ObEndTransAsyncCallback::callback(int cb_param, const transaction::ObTransID &trans_id)
{
UNUSED(trans_id);
callback(cb_param);
@ -144,22 +62,14 @@ void ObEndTransAsyncCallback::callback(int cb_param)
{
bool need_disconnect = false;
if (OB_UNLIKELY(!has_set_need_rollback_)) {
LOG_ERROR("is_need_rollback_ has not been set", K(has_set_need_rollback_), K(is_need_rollback_));
LOG_ERROR("is_need_rollback_ has not been set",
K(has_set_need_rollback_),
K(is_need_rollback_));
} else if (OB_UNLIKELY(ObExclusiveEndTransCallback::END_TRANS_TYPE_INVALID == end_trans_type_)) {
LOG_ERROR("end trans type is invalid", K(cb_param), K(end_trans_type_));
} else if (!is_txs_end_trans_called_) {
// connection disconnect
need_disconnect = true;
LOG_WARN("fail before trans service end trans, disconnct", K(cb_param));
if (OB_UNLIKELY(OB_SUCCESS == cb_param)) {
LOG_ERROR("callback before trans service end trans, but ret is OB_SUCCESS, it is BUG!!!",
K(cb_param),
K(end_trans_type_),
K(need_disconnect));
}
} else {
ObSQLUtils::check_if_need_disconnect_after_end_trans(cb_param,
is_need_rollback_,
ObSQLUtils::check_if_need_disconnect_after_end_trans(
cb_param, is_need_rollback_,
ObExclusiveEndTransCallback::END_TRANS_TYPE_EXPLICIT == end_trans_type_,
need_disconnect);
}
@ -175,18 +85,5 @@ void ObEndTransAsyncCallback::callback(int cb_param)
}
}
int ObNullEndTransCallback::init(const transaction::ObTransID& trans_id)
{
int ret = OB_SUCCESS;
if (!trans_id.is_valid()) {
SQL_LOG(WARN, "invalid argument", K(trans_id));
ret = OB_INVALID_ARGUMENT;
} else {
trans_id_ = trans_id;
}
return ret;
}
} // namespace sql
} // namespace oceanbase
}/* ns sql*/
}/* ns oceanbase */