From 23ea96d0d25ffc4f84865e6485b2c784de0b8801 Mon Sep 17 00:00:00 2001 From: chinaxing Date: Wed, 17 May 2023 11:41:38 +0000 Subject: [PATCH] [master] deduplicate when merge txExecResult --- src/storage/tx/ob_trans_define_v4.cpp | 34 +++++++++++++++++---------- src/storage/tx/ob_trans_define_v4.h | 4 ++-- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/storage/tx/ob_trans_define_v4.cpp b/src/storage/tx/ob_trans_define_v4.cpp index 14b442464..00723247c 100644 --- a/src/storage/tx/ob_trans_define_v4.cpp +++ b/src/storage/tx/ob_trans_define_v4.cpp @@ -698,8 +698,9 @@ int ObTxDesc::get_inc_exec_info(ObTxExecResult &exec_info) } exec_info_reap_ts_ += 1; } - (void) exec_info.merge_cflict_txs(cflict_txs_); - cflict_txs_.reset(); + if (OB_SUCC(ret) && OB_SUCC(exec_info.merge_cflict_txs(cflict_txs_))) { + cflict_txs_.reset(); + } DETECT_LOG(TRACE, "merge conflict txs to exec result", K(cflict_txs_), K(exec_info)); return ret; } @@ -1155,19 +1156,31 @@ int ObTxExecResult::add_touched_ls(const ObIArray &ls_list) return ret; } +template +static int append_dedup(ObIArray &a, const ObIArray &b) +{ + int ret = OB_SUCCESS; + ARRAY_FOREACH(b, i) { + if (!is_contain(a, b.at(i))) { ret = a.push_back(b.at(i)); } + } + return ret; +} + int ObTxExecResult::merge_result(const ObTxExecResult &r) { int ret = OB_SUCCESS; TRANS_LOG(TRACE, "txExecResult.merge with.start", K(r), KPC(this), K(lbt())); incomplete_ |= r.incomplete_; - if (OB_FAIL(append(parts_, r.parts_))) { + if (OB_FAIL(append_dedup(parts_, r.parts_))) { incomplete_ = true; TRANS_LOG(WARN, "merge fail, set incomplete", K(ret), KPC(this)); - } else if (OB_FAIL(append(touched_ls_list_, r.touched_ls_list_))) { + } else if (OB_FAIL(append_dedup(touched_ls_list_, r.touched_ls_list_))) { incomplete_ = true; TRANS_LOG(WARN, "merge touched_ls_list fail, set incomplete", K(ret), KPC(this)); } - merge_cflict_txs(r.cflict_txs_); + if (OB_SUCC(ret)) { + ret = merge_cflict_txs(r.cflict_txs_); + } if (incomplete_) { TRANS_LOG(TRACE, "tx result incomplete:", KP(this)); } @@ -1176,16 +1189,13 @@ int ObTxExecResult::merge_result(const ObTxExecResult &r) return ret; } -void ObTxExecResult::merge_cflict_txs(const common::ObIArray &txs) +int ObTxExecResult::merge_cflict_txs(const common::ObIArray &txs) { int ret = OB_SUCCESS; - for (int64_t idx = 0; idx < txs.count() && OB_SUCC(ret); ++idx) { - if (!is_contain(cflict_txs_, txs.at(idx))) { - if (OB_FAIL(cflict_txs_.push_back(txs.at(idx)))) { - DETECT_LOG(WARN, "push fail", KR(ret), KPC(this), K(txs)); - } - } + if (OB_FAIL(append_dedup(cflict_txs_, txs))) { + DETECT_LOG(WARN, "append fail", KR(ret), KPC(this), K(txs)); } + return ret; } int ObTxExecResult::assign(const ObTxExecResult &r) diff --git a/src/storage/tx/ob_trans_define_v4.h b/src/storage/tx/ob_trans_define_v4.h index 4f4c4b814..e779151ca 100644 --- a/src/storage/tx/ob_trans_define_v4.h +++ b/src/storage/tx/ob_trans_define_v4.h @@ -314,8 +314,8 @@ public: TRANS_LOG(TRACE, "tx result incomplete:", KP(this)); incomplete_ = true; } - void merge_cflict_txs(const common::ObIArray &txs); - inline bool is_incomplete() const { return incomplete_; } + int merge_cflict_txs(const common::ObIArray &txs); + bool is_incomplete() const { return incomplete_; } int add_touched_ls(const share::ObLSID ls); int add_touched_ls(const ObIArray &ls_list); const share::ObLSArray &get_touched_ls() const { return touched_ls_list_; }