186 lines
4.8 KiB
C++
186 lines
4.8 KiB
C++
/**
|
|
* Copyright (c) 2021 OceanBase
|
|
* OceanBase CE is licensed under Mulan PubL v2.
|
|
* You can use this software according to the terms and conditions of the Mulan PubL v2.
|
|
* You may obtain a copy of Mulan PubL v2 at:
|
|
* http://license.coscl.org.cn/MulanPubL-2.0
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
* See the Mulan PubL v2 for more details.
|
|
*/
|
|
|
|
#ifndef __OB_SQL_END_TRANS_CALLBACK_H__
|
|
#define __OB_SQL_END_TRANS_CALLBACK_H__
|
|
|
|
#include "share/ob_define.h"
|
|
#include "lib/utility/utility.h"
|
|
#include "lib/allocator/ob_allocator.h"
|
|
#include "lib/objectpool/ob_tc_factory.h"
|
|
#include "lib/allocator/ob_mod_define.h"
|
|
#include "sql/ob_i_end_trans_callback.h"
|
|
#include "storage/transaction/ob_trans_result.h"
|
|
#include "storage/transaction/ob_trans_define.h"
|
|
#include "observer/mysql/ob_mysql_end_trans_cb.h"
|
|
|
|
namespace oceanbase {
|
|
namespace sql {
|
|
class ObSharedEndTransCallback : public ObIEndTransCallback {
|
|
public:
|
|
ObSharedEndTransCallback();
|
|
virtual ~ObSharedEndTransCallback();
|
|
|
|
virtual bool is_shared() const override final
|
|
{
|
|
return true;
|
|
}
|
|
};
|
|
|
|
class ObExclusiveEndTransCallback : public ObIEndTransCallback {
|
|
public:
|
|
enum EndTransType {
|
|
END_TRANS_TYPE_INVALID,
|
|
END_TRANS_TYPE_EXPLICIT, // Explicit commit
|
|
END_TRANS_TYPE_IMPLICIT, // Implicit commit
|
|
};
|
|
|
|
public:
|
|
ObExclusiveEndTransCallback();
|
|
virtual ~ObExclusiveEndTransCallback();
|
|
|
|
virtual bool is_shared() const override final
|
|
{
|
|
return false;
|
|
}
|
|
|
|
void set_is_need_rollback(bool is_need_rollback)
|
|
{
|
|
has_set_need_rollback_ = true;
|
|
is_need_rollback_ = is_need_rollback;
|
|
}
|
|
void set_end_trans_type(ObExclusiveEndTransCallback::EndTransType end_trans_type)
|
|
{
|
|
end_trans_type_ = end_trans_type;
|
|
}
|
|
void set_is_txs_end_trans_called(bool is_txs_end_trans_called)
|
|
{
|
|
is_txs_end_trans_called_ = is_txs_end_trans_called;
|
|
}
|
|
bool is_txs_end_trans_called() const
|
|
{
|
|
return is_txs_end_trans_called_;
|
|
}
|
|
void reset()
|
|
{
|
|
ObIEndTransCallback::reset();
|
|
end_trans_type_ = END_TRANS_TYPE_INVALID;
|
|
has_set_need_rollback_ = false;
|
|
is_need_rollback_ = false;
|
|
is_txs_end_trans_called_ = false;
|
|
}
|
|
|
|
protected:
|
|
ObExclusiveEndTransCallback::EndTransType end_trans_type_;
|
|
bool has_set_need_rollback_;
|
|
bool is_need_rollback_;
|
|
bool is_txs_end_trans_called_;
|
|
};
|
|
|
|
class ObEndTransSyncCallback : public ObExclusiveEndTransCallback {
|
|
public:
|
|
ObEndTransSyncCallback();
|
|
virtual ~ObEndTransSyncCallback();
|
|
virtual void callback(int cb_param);
|
|
virtual void callback(int cb_param, const transaction::ObTransID& trans_id);
|
|
virtual const char* get_type() const
|
|
{
|
|
return "ObEndTransSyncCallback";
|
|
}
|
|
virtual ObEndTransCallbackType get_callback_type() const
|
|
{
|
|
return SYNC_CALLBACK_TYPE;
|
|
}
|
|
int wait();
|
|
int init(const transaction::ObTransDesc* trans_desc, ObSQLSessionInfo* session);
|
|
void reset();
|
|
|
|
private:
|
|
/* functions */
|
|
|
|
/* variables */
|
|
static const int64_t PUSH_POP_TIMEOUT = 1000 * 1000 * 10L;
|
|
transaction::ObTransCond queue_;
|
|
const transaction::ObTransDesc* trans_desc_;
|
|
ObSQLSessionInfo* session_;
|
|
/* macro */
|
|
DISALLOW_COPY_AND_ASSIGN(ObEndTransSyncCallback);
|
|
};
|
|
|
|
class ObEndTransAsyncCallback : public ObExclusiveEndTransCallback {
|
|
public:
|
|
ObEndTransAsyncCallback();
|
|
virtual ~ObEndTransAsyncCallback();
|
|
virtual void callback(int cb_param);
|
|
virtual void callback(int cb_param, const transaction::ObTransID& trans_id);
|
|
virtual const char* get_type() const
|
|
{
|
|
return "ObEndTransAsyncCallback";
|
|
}
|
|
virtual ObEndTransCallbackType get_callback_type() const
|
|
{
|
|
return ASYNC_CALLBACK_TYPE;
|
|
}
|
|
observer::ObSqlEndTransCb& get_mysql_end_trans_cb()
|
|
{
|
|
return mysql_end_trans_cb_;
|
|
}
|
|
void reset()
|
|
{
|
|
ObExclusiveEndTransCallback::reset();
|
|
mysql_end_trans_cb_.reset();
|
|
}
|
|
|
|
private:
|
|
/* macro */
|
|
observer::ObSqlEndTransCb mysql_end_trans_cb_;
|
|
DISALLOW_COPY_AND_ASSIGN(ObEndTransAsyncCallback);
|
|
};
|
|
|
|
class ObNullEndTransCallback : public ObSharedEndTransCallback {
|
|
public:
|
|
ObNullEndTransCallback() : ObSharedEndTransCallback()
|
|
{}
|
|
virtual ~ObNullEndTransCallback()
|
|
{}
|
|
virtual void callback(int cb_param)
|
|
{
|
|
UNUSED(cb_param);
|
|
}
|
|
virtual void callback(int cb_param, const transaction::ObTransID& trans_id)
|
|
{
|
|
UNUSED(cb_param);
|
|
UNUSED(trans_id);
|
|
}
|
|
virtual const char* get_type() const
|
|
{
|
|
return "ObNullEndTransCallback";
|
|
}
|
|
virtual ObEndTransCallbackType get_callback_type() const
|
|
{
|
|
return NULL_CALLBACK_TYPE;
|
|
}
|
|
virtual int init(const transaction::ObTransID& trans_id);
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(ObNullEndTransCallback);
|
|
|
|
private:
|
|
transaction::ObTransID trans_id_;
|
|
};
|
|
|
|
} // namespace sql
|
|
} // namespace oceanbase
|
|
|
|
#endif /* __OB_SQL_END_TRANS_CALLBACK_H__ */
|
|
//// end of header file
|