reduce the memory of defensive check mgr

This commit is contained in:
obdev
2022-11-02 20:11:05 +00:00
committed by wangzelin.wzl
parent 4a9e45d350
commit 5077661704
9 changed files with 129 additions and 76 deletions

View File

@ -322,16 +322,17 @@ int ObSingleMerge::inner_get_next_row(ObDatumRow &row)
#ifdef ENABLE_DEBUG_LOG #ifdef ENABLE_DEBUG_LOG
if (OB_SUCC(ret)) { if (OB_SUCC(ret)) {
access_ctx_->defensive_check_record_.query_flag_ = access_ctx_->query_flag_; access_ctx_->defensive_check_record_.query_flag_ = access_ctx_->query_flag_;
if (NULL != access_ctx_->store_ctx_ transaction::ObTransService *trx = MTL(transaction::ObTransService *);
&& NULL != access_ctx_->store_ctx_->mvcc_acc_ctx_.get_mem_ctx() bool trx_id_valid = (NULL != access_ctx_->store_ctx_
&& NULL != access_ctx_->store_ctx_->mvcc_acc_ctx_.get_mem_ctx()->get_defensive_check_mgr()) { && access_ctx_->store_ctx_->mvcc_acc_ctx_.tx_id_.is_valid());
(void)access_ctx_->store_ctx_ if (OB_NOT_NULL(trx)
->mvcc_acc_ctx_ && trx_id_valid
.get_mem_ctx() && NULL != trx->get_defensive_check_mgr()) {
->get_defensive_check_mgr()->put(tablet_meta.tablet_id_, (void)trx->get_defensive_check_mgr()->put(tablet_meta.tablet_id_,
row, access_ctx_->store_ctx_->mvcc_acc_ctx_.tx_id_,
*rowkey_, row,
access_ctx_->defensive_check_record_); *rowkey_,
access_ctx_->defensive_check_record_);
} }
} }
access_ctx_->defensive_check_record_.reset(); access_ctx_->defensive_check_record_.reset();

View File

@ -4707,9 +4707,12 @@ void ObLSTabletService::dump_diag_info_for_old_row_loss(
} }
#ifdef ENABLE_DEBUG_LOG #ifdef ENABLE_DEBUG_LOG
// print single row check info // print single row check info
if (NULL != store_ctx.mvcc_acc_ctx_.get_mem_ctx() if (store_ctx.mvcc_acc_ctx_.tx_id_.is_valid()) {
&& NULL != store_ctx.mvcc_acc_ctx_.get_mem_ctx()->get_defensive_check_mgr()) { transaction::ObTransService *trx = MTL(transaction::ObTransService *);
(void)store_ctx.mvcc_acc_ctx_.get_mem_ctx()->get_defensive_check_mgr()->dump(access_param.iter_param_.tablet_id_); if (OB_NOT_NULL(trx)
&& NULL != trx->get_defensive_check_mgr()) {
(void)trx->get_defensive_check_mgr()->dump(store_ctx.mvcc_acc_ctx_.tx_id_);
}
} }
#endif #endif
} }

View File

@ -28,7 +28,6 @@
#include "storage/tablelock/ob_table_lock_callback.h" #include "storage/tablelock/ob_table_lock_callback.h"
#include "storage/tablelock/ob_table_lock_common.h" #include "storage/tablelock/ob_table_lock_common.h"
#include "storage/tx/ob_trans_deadlock_adapter.h" #include "storage/tx/ob_trans_deadlock_adapter.h"
#include "storage/tx/ob_defensive_check_mgr.h"
namespace oceanbase namespace oceanbase
{ {
@ -64,9 +63,6 @@ ObMemtableCtx::ObMemtableCtx()
is_master_(true), is_master_(true),
read_elr_data_(false), read_elr_data_(false),
lock_mem_ctx_(ctx_cb_allocator_), lock_mem_ctx_(ctx_cb_allocator_),
#ifdef ENABLE_DEBUG_LOG
defensive_check_mgr_(NULL),
#endif
is_inited_(false) is_inited_(false)
{ {
} }
@ -93,17 +89,6 @@ int ObMemtableCtx::init(const uint64_t tenant_id)
TRANS_LOG(ERROR, "ctx_allocator_ init error", K(ret)); TRANS_LOG(ERROR, "ctx_allocator_ init error", K(ret));
} else if (OB_FAIL(reset_log_generator_())) { } else if (OB_FAIL(reset_log_generator_())) {
TRANS_LOG(ERROR, "fail to reset log generator", K(ret)); TRANS_LOG(ERROR, "fail to reset log generator", K(ret));
#ifdef ENABLE_DEBUG_LOG
} else if (!GCONF.enable_defensive_check()) {
// do nothing
} else if (NULL == (defensive_check_mgr_ = op_alloc(ObDefensiveCheckMgr))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
TRANS_LOG(ERROR, "memory alloc failed", K(ret), KP(defensive_check_mgr_));
} else if (OB_FAIL(defensive_check_mgr_->init(lib::ObMemAttr(tenant_id, "MemtableCtx")))) {
TRANS_LOG(ERROR, "defensive check mgr init failed", K(ret), KP(defensive_check_mgr_));
op_free(defensive_check_mgr_);
defensive_check_mgr_ = NULL;
#endif
} else { } else {
// do nothing // do nothing
} }
@ -173,12 +158,6 @@ void ObMemtableCtx::reset()
tx_table_guard_.reset(); tx_table_guard_.reset();
//FIXME: ObIMemtableCtx don't have resetfunction, //FIXME: ObIMemtableCtx don't have resetfunction,
//thus ObIMvccCtx::reset is called, so resource_link_is not reset //thus ObIMvccCtx::reset is called, so resource_link_is not reset
#ifdef ENABLE_DEBUG_LOG
if (NULL != defensive_check_mgr_) {
op_free(defensive_check_mgr_);
defensive_check_mgr_ = NULL;
}
#endif
ObIMemtableCtx::reset(); ObIMemtableCtx::reset();
} }
} }

View File

@ -484,9 +484,6 @@ public:
// for deadlock detect. // for deadlock detect.
void set_table_lock_killed() { lock_mem_ctx_.set_killed(); } void set_table_lock_killed() { lock_mem_ctx_.set_killed(); }
bool is_table_lock_killed() const { return lock_mem_ctx_.is_killed(); } bool is_table_lock_killed() const { return lock_mem_ctx_.is_killed(); }
#ifdef ENABLE_DEBUG_LOG
transaction::ObDefensiveCheckMgr *get_defensive_check_mgr() { return defensive_check_mgr_; }
#endif
private: private:
int do_trans_end( int do_trans_end(
const bool commit, const bool commit,
@ -559,9 +556,6 @@ private:
common::ObArray<transaction::ObTransID> conflict_trans_ids_; common::ObArray<transaction::ObTransID> conflict_trans_ids_;
// table lock mem ctx. // table lock mem ctx.
transaction::tablelock::ObLockMemCtx lock_mem_ctx_; transaction::tablelock::ObLockMemCtx lock_mem_ctx_;
#ifdef ENABLE_DEBUG_LOG
transaction::ObDefensiveCheckMgr *defensive_check_mgr_;
#endif
bool is_inited_; bool is_inited_;
}; };

View File

@ -27,12 +27,14 @@ void SingleRowDefensiveRecord::reset()
generate_ts_ = 0; generate_ts_ = 0;
rowkey_.reset(); rowkey_.reset();
row_.reset(); row_.reset();
tablet_id_.reset();
allocator_.reset(); allocator_.reset();
} }
int SingleRowDefensiveRecord::deep_copy(const blocksstable::ObDatumRow &row, int SingleRowDefensiveRecord::deep_copy(const blocksstable::ObDatumRow &row,
const blocksstable::ObDatumRowkey &rowkey, const blocksstable::ObDatumRowkey &rowkey,
const ObDefensiveCheckRecordExtend &extend_info) const ObDefensiveCheckRecordExtend &extend_info,
const ObTabletID &tablet_id)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
@ -44,6 +46,7 @@ int SingleRowDefensiveRecord::deep_copy(const blocksstable::ObDatumRow &row,
TRANS_LOG(WARN, "datum row deep copy error", K(ret), K(row)); TRANS_LOG(WARN, "datum row deep copy error", K(ret), K(row));
} else { } else {
extend_info_ = extend_info; extend_info_ = extend_info;
tablet_id_ = tablet_id;
generate_ts_ = ObTimeUtility::current_time(); generate_ts_ = ObTimeUtility::current_time();
} }
@ -52,7 +55,7 @@ int SingleRowDefensiveRecord::deep_copy(const blocksstable::ObDatumRow &row,
void ObSingleTabletDefensiveCheckInfo::reset() void ObSingleTabletDefensiveCheckInfo::reset()
{ {
tablet_id_.reset(); tx_id_.reset();
for (int64_t i = 0; i < record_arr_.count(); ++i) { for (int64_t i = 0; i < record_arr_.count(); ++i) {
if (NULL != record_arr_.at(i)) { if (NULL != record_arr_.at(i)) {
op_free(record_arr_.at(i)); op_free(record_arr_.at(i));
@ -61,15 +64,15 @@ void ObSingleTabletDefensiveCheckInfo::reset()
} }
} }
int ObSingleTabletDefensiveCheckInfo::init(const ObTabletID &tablet_id) int ObSingleTabletDefensiveCheckInfo::init(const ObTransID &tx_id)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
if (!tablet_id.is_valid()) { if (!tx_id.is_valid()) {
ret = OB_INVALID_ARGUMENT; ret = OB_INVALID_ARGUMENT;
TRANS_LOG(WARN, "invalid argument", K(ret), K(tablet_id)); TRANS_LOG(WARN, "invalid argument", K(ret), K(tx_id));
} else { } else {
tablet_id_ = tablet_id; tx_id_ = tx_id;
} }
return ret; return ret;
@ -117,6 +120,7 @@ void ObDefensiveCheckMgr::reset()
} }
int ObDefensiveCheckMgr::put(const ObTabletID &tablet_id, int ObDefensiveCheckMgr::put(const ObTabletID &tablet_id,
const ObTransID &tx_id,
const blocksstable::ObDatumRow &row, const blocksstable::ObDatumRow &row,
const blocksstable::ObDatumRowkey &rowkey, const blocksstable::ObDatumRowkey &rowkey,
const ObDefensiveCheckRecordExtend &extend_info) const ObDefensiveCheckRecordExtend &extend_info)
@ -130,27 +134,31 @@ int ObDefensiveCheckMgr::put(const ObTabletID &tablet_id,
SingleRowDefensiveRecord *r = NULL; SingleRowDefensiveRecord *r = NULL;
if (NULL == (r = op_alloc(SingleRowDefensiveRecord))) { if (NULL == (r = op_alloc(SingleRowDefensiveRecord))) {
ret = OB_ALLOCATE_MEMORY_FAILED; ret = OB_ALLOCATE_MEMORY_FAILED;
TRANS_LOG(WARN, "alloc memory fail", K(ret), K(tablet_id)); TRANS_LOG(WARN, "alloc memory fail", K(ret), K(tablet_id), K(tx_id));
} else if (OB_FAIL(r->deep_copy(row, rowkey, extend_info))) { } else if (OB_FAIL(r->deep_copy(row, rowkey, extend_info, tablet_id))) {
TRANS_LOG(WARN, "Defensive reocrd deep copy error", K(ret), K(row), K(rowkey)); TRANS_LOG(WARN, "Defensive reocrd deep copy error", K(ret),
K(row),
K(rowkey),
K(extend_info),
K(tablet_id));
} else { } else {
Guard spin_guard(lock_); Guard spin_guard(lock_);
ObSingleTabletDefensiveCheckInfo *info = NULL; ObSingleTabletDefensiveCheckInfo *info = NULL;
if (OB_FAIL(map_.get(tablet_id, info))) { if (OB_FAIL(map_.get(tx_id, info))) {
if (OB_ENTRY_NOT_EXIST != ret) { if (OB_ENTRY_NOT_EXIST != ret) {
TRANS_LOG(WARN, "map get error", K(ret), K(tablet_id)); TRANS_LOG(WARN, "map get error", K(ret), K(tx_id), K(tablet_id));
} else if (NULL == (info = op_alloc(ObSingleTabletDefensiveCheckInfo)) } else if (NULL == (info = op_alloc(ObSingleTabletDefensiveCheckInfo))
|| OB_FAIL(info->init(tablet_id))) { || OB_FAIL(info->init(tx_id))) {
ret = OB_ALLOCATE_MEMORY_FAILED; ret = OB_ALLOCATE_MEMORY_FAILED;
TRANS_LOG(WARN, "Defensive info alloc or init error", K(tablet_id)); TRANS_LOG(WARN, "Defensive info alloc or init error", K(tx_id), K(tablet_id));
} else if (OB_FAIL(info->add_record(r))) { } else if (OB_FAIL(info->add_record(r))) {
TRANS_LOG(WARN, "add defensive record error", K(ret)); TRANS_LOG(WARN, "add defensive record error", K(ret));
} else if (OB_FAIL(map_.insert_and_get(tablet_id, info, NULL))) { } else if (OB_FAIL(map_.insert_and_get(tx_id, info, NULL))) {
TRANS_LOG(WARN, "defensive check info insert map error", K(ret), K(tablet_id), KP(info)); TRANS_LOG(WARN, "defensive check info insert map error", K(ret), K(tx_id), K(tablet_id), KP(info));
} else { } else {
TRANS_LOG(DEBUG, "add record", K(tablet_id), K(row), K(rowkey), K(extend_info)); TRANS_LOG(DEBUG, "add record", K(tx_id), K(tablet_id), K(row), K(rowkey), K(extend_info));
// do nothing // do nothing
} }
if (OB_FAIL(ret)) { if (OB_FAIL(ret)) {
@ -165,7 +173,7 @@ int ObDefensiveCheckMgr::put(const ObTabletID &tablet_id,
} else if (OB_FAIL(info->add_record(r))) { } else if (OB_FAIL(info->add_record(r))) {
TRANS_LOG(WARN, "add defensive record error", K(ret)); TRANS_LOG(WARN, "add defensive record error", K(ret));
} else { } else {
TRANS_LOG(DEBUG, "add record", K(tablet_id), K(row), K(rowkey), K(extend_info)); TRANS_LOG(DEBUG, "add record", K(tx_id), K(tablet_id), K(row), K(rowkey), K(extend_info));
// do nothing // do nothing
} }
if (OB_SUCC(ret) && NULL != info) { if (OB_SUCC(ret) && NULL != info) {
@ -181,7 +189,7 @@ int ObDefensiveCheckMgr::put(const ObTabletID &tablet_id,
return ret; return ret;
} }
void ObDefensiveCheckMgr::dump(const ObTabletID &tablet_id) void ObDefensiveCheckMgr::del(const ObTransID &tx_id)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
@ -193,23 +201,43 @@ void ObDefensiveCheckMgr::dump(const ObTabletID &tablet_id)
Guard spin_guard(lock_); Guard spin_guard(lock_);
ObSingleTabletDefensiveCheckInfo *info = NULL; ObSingleTabletDefensiveCheckInfo *info = NULL;
if (OB_FAIL(map_.get(tablet_id, info))) { if (OB_FAIL(map_.get(tx_id, info))) {
if (OB_ENTRY_NOT_EXIST != ret) { if (OB_ENTRY_NOT_EXIST != ret) {
TRANS_LOG(WARN, "map get error", K(ret), K(tablet_id)); TRANS_LOG(WARN, "map get error", K(ret), K(tx_id));
}
} else {
(void)map_.del(tx_id, info);
(void)map_.revert(info);
}
}
UNUSED(ret);
}
void ObDefensiveCheckMgr::dump(const ObTransID &tx_id)
{
int ret = OB_SUCCESS;
if (!is_inited_) {
ret = OB_NOT_INIT;
TRANS_LOG(WARN, "ObDefensiveCheckMgr not init ", K(ret));
} else {
Guard spin_guard(lock_);
ObSingleTabletDefensiveCheckInfo *info = NULL;
if (OB_FAIL(map_.get(tx_id, info))) {
if (OB_ENTRY_NOT_EXIST != ret) {
TRANS_LOG(WARN, "map get error", K(ret), K(tx_id));
} }
} else { } else {
const int64_t max_count = std::min(max_record_cnt_, info->get_record_arr().count()); const int64_t max_count = std::min(max_record_cnt_, info->get_record_arr().count());
TRANS_LOG(INFO, "###################### start to print defensice check info##########################", TRANS_LOG(INFO, "###################### start to print defensice check info##########################",
K(max_count), "tablet_id", info->get_tablet_id()); K(max_count), K(tx_id), K(max_count));
for (int64_t i = 0; i < max_count; ++i) { for (int64_t i = 0; i < max_count; ++i) {
TRANS_LOG(INFO, "print single row defensive check info", TRANS_LOG(INFO, "print single row defensive check info", "record", *(info->get_record_arr().at(i)));
"rowkey", info->get_record_arr().at(i)->rowkey_,
"row", info->get_record_arr().at(i)->row_,
"extend_info", info->get_record_arr().at(i)->extend_info_);
} }
TRANS_LOG(INFO, "##################### print defensice check info finished #########################", TRANS_LOG(INFO, "##################### print defensice check info finished #########################",
K(max_count), K(max_count), K(tx_id), K(max_count));
"tablet_id", info->get_tablet_id());
map_.revert(info); map_.revert(info);
} }

View File

@ -59,14 +59,16 @@ public:
void destroy() { reset(); } void destroy() { reset(); }
int deep_copy(const blocksstable::ObDatumRow &row, int deep_copy(const blocksstable::ObDatumRow &row,
const blocksstable::ObDatumRowkey &rowkey, const blocksstable::ObDatumRowkey &rowkey,
const ObDefensiveCheckRecordExtend &extend_info); const ObDefensiveCheckRecordExtend &extend_info,
const ObTabletID &tablet_id);
TO_STRING_KV(K_(row), K_(generate_ts), K_(rowkey), K_(extend_info)); TO_STRING_KV(K_(row), K_(generate_ts), K_(rowkey), K_(tablet_id), K_(extend_info));
blocksstable::ObDatumRow row_; blocksstable::ObDatumRow row_;
int64_t generate_ts_; int64_t generate_ts_;
ObArenaAllocator allocator_; ObArenaAllocator allocator_;
blocksstable::ObDatumRowkey rowkey_; blocksstable::ObDatumRowkey rowkey_;
ObTabletID tablet_id_;
ObDefensiveCheckRecordExtend extend_info_; ObDefensiveCheckRecordExtend extend_info_;
}; };
@ -77,15 +79,15 @@ class ObSingleTabletDefensiveCheckInfo : public ObTransHashLink<ObSingleTabletDe
public: public:
ObSingleTabletDefensiveCheckInfo() { } ObSingleTabletDefensiveCheckInfo() { }
~ObSingleTabletDefensiveCheckInfo() { reset(); } ~ObSingleTabletDefensiveCheckInfo() { reset(); }
int init(const ObTabletID &tablet_id); int init(const ObTransID &tx_id);
void reset(); void reset();
void destroy() { reset(); } void destroy() { reset(); }
bool contain(const ObTabletID &tablet_id) { return tablet_id_ == tablet_id; } bool contain(const ObTransID &tx_id) { return tx_id_ == tx_id; }
int add_record(SingleRowDefensiveRecord *record); int add_record(SingleRowDefensiveRecord *record);
ObSingleRowDefensiveRecordArray &get_record_arr() { return record_arr_; } ObSingleRowDefensiveRecordArray &get_record_arr() { return record_arr_; }
const ObTabletID &get_tablet_id() const { return tablet_id_; } const ObTransID &get_tx_id() const { return tx_id_; }
private: private:
ObTabletID tablet_id_; ObTransID tx_id_;
ObSingleRowDefensiveRecordArray record_arr_; ObSingleRowDefensiveRecordArray record_arr_;
private: private:
DISALLOW_COPY_AND_ASSIGN(ObSingleTabletDefensiveCheckInfo); DISALLOW_COPY_AND_ASSIGN(ObSingleTabletDefensiveCheckInfo);
@ -109,10 +111,10 @@ public:
} }
}; };
typedef ObTransHashMap<ObTabletID, typedef ObTransHashMap<ObTransID,
ObSingleTabletDefensiveCheckInfo, ObSingleTabletDefensiveCheckInfo,
ObSingleTabletDefensiveCheckInfoAlloc, ObSingleTabletDefensiveCheckInfoAlloc,
common::SpinRWLock, 64 /*bucket_num*/> ObTxDefensiveCheckInfoMap; common::SpinRWLock, 2 << 16 /*bucket_num*/> ObTxDefensiveCheckInfoMap;
class ObDefensiveCheckMgr class ObDefensiveCheckMgr
{ {
@ -123,10 +125,12 @@ public:
void reset(); void reset();
void destroy() { reset(); } void destroy() { reset(); }
int put(const ObTabletID &tablet_id, int put(const ObTabletID &tablet_id,
const ObTransID &tx_id,
const blocksstable::ObDatumRow &row, const blocksstable::ObDatumRow &row,
const blocksstable::ObDatumRowkey &rowkey, const blocksstable::ObDatumRowkey &rowkey,
const ObDefensiveCheckRecordExtend &extend_info); const ObDefensiveCheckRecordExtend &extend_info);
void dump(const ObTabletID &tablet_id); void del(const ObTransID &tx_id);
void dump(const ObTransID &tx_id);
private: private:
static int64_t max_record_cnt_; static int64_t max_record_cnt_;
typedef ObSmallSpinLockGuard<common::ObByteLock> Guard; typedef ObSmallSpinLockGuard<common::ObByteLock> Guard;

View File

@ -184,6 +184,12 @@ void ObPartTransCtx::destroy()
if (OB_LIKELY(is_inited_)) { if (OB_LIKELY(is_inited_)) {
TRANS_LOG(DEBUG, "part_ctx_destroy", K(*this)); TRANS_LOG(DEBUG, "part_ctx_destroy", K(*this));
#ifdef ENABLE_DEBUG_LOG
if (NULL != trans_service_->get_defensive_check_mgr()) {
trans_service_->get_defensive_check_mgr()->del(trans_id_);
}
#endif
// Defensive Check 1 : earse ctx id descriptor // Defensive Check 1 : earse ctx id descriptor
mt_ctx_.reset(); mt_ctx_.reset();

View File

@ -61,6 +61,9 @@ ObTransService::ObTransService()
server_tracer_(NULL), server_tracer_(NULL),
input_queue_count_(0), input_queue_count_(0),
output_queue_count_(0), output_queue_count_(0),
#ifdef ENABLE_DEBUG_LOG
defensive_check_mgr_(NULL),
#endif
tx_desc_mgr_(*this) tx_desc_mgr_(*this)
{ {
check_env_(); check_env_();
@ -159,6 +162,28 @@ int ObTransService::init(const ObAddr &self,
is_inited_ = true; is_inited_ = true;
TRANS_LOG(INFO, "transaction service inited success", KP(this)); TRANS_LOG(INFO, "transaction service inited success", KP(this));
} }
if (OB_SUCC(ret)) {
#ifdef ENABLE_DEBUG_LOG
void *p = NULL;
if (!GCONF.enable_defensive_check()) {
// do nothing
} else if (NULL == (p = ob_malloc(sizeof(ObDefensiveCheckMgr),
lib::ObMemAttr(tenant_id, "ObDefenCheckMgr")))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
TRANS_LOG(WARN, "memory alloc failed", KR(ret));
} else {
defensive_check_mgr_ = new(p) ObDefensiveCheckMgr();
if (OB_FAIL(defensive_check_mgr_->init(lib::ObMemAttr(tenant_id, "ObDefenCheckMgr")))) {
TRANS_LOG(ERROR, "defensive check mgr init failed", K(ret), KP(defensive_check_mgr_));
defensive_check_mgr_->destroy();
ob_free(defensive_check_mgr_);
defensive_check_mgr_ = NULL;
} else {
// do nothing
}
}
#endif
}
return ret; return ret;
} }
@ -267,6 +292,13 @@ void ObTransService::destroy()
tx_ctx_mgr_.destroy(); tx_ctx_mgr_.destroy();
tx_desc_mgr_.destroy(); tx_desc_mgr_.destroy();
dup_table_rpc_->destroy(); dup_table_rpc_->destroy();
#ifdef ENABLE_DEBUG_LOG
if (NULL != defensive_check_mgr_) {
defensive_check_mgr_->destroy();
ob_free(defensive_check_mgr_);
defensive_check_mgr_ = NULL;
}
#endif
is_inited_ = false; is_inited_ = false;
TRANS_LOG(INFO, "transaction service destroyed", KPC(this)); TRANS_LOG(INFO, "transaction service destroyed", KPC(this));
} }

View File

@ -198,6 +198,9 @@ public:
const char *buf, const char *buf,
const int64_t buf_len); const int64_t buf_len);
ObTxELRUtil &get_tx_elr_util() { return elr_util_; } ObTxELRUtil &get_tx_elr_util() { return elr_util_; }
#ifdef ENABLE_DEBUG_LOG
transaction::ObDefensiveCheckMgr *get_defensive_check_mgr() { return defensive_check_mgr_; }
#endif
private: private:
void check_env_(); void check_env_();
bool can_create_ctx_(const int64_t trx_start_ts, const common::ObTsWindows &changing_leader_windows); bool can_create_ctx_(const int64_t trx_start_ts, const common::ObTsWindows &changing_leader_windows);
@ -266,6 +269,9 @@ private:
// account task qeuue's inqueue and dequeue // account task qeuue's inqueue and dequeue
uint32_t input_queue_count_; uint32_t input_queue_count_;
uint32_t output_queue_count_; uint32_t output_queue_count_;
#ifdef ENABLE_DEBUG_LOG
transaction::ObDefensiveCheckMgr *defensive_check_mgr_;
#endif
// txDesc's manager // txDesc's manager
ObTxDescMgr tx_desc_mgr_; ObTxDescMgr tx_desc_mgr_;