From 71a9cc0c6b84d25abde3f068a67c13dc51e14d38 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 7 Mar 2023 02:10:40 +0000 Subject: [PATCH] check invalid start_scn before appending commit log in palf --- src/storage/tx/ob_trans_part_ctx.cpp | 26 +++++++++++++++----------- src/storage/tx/ob_tx_log.cpp | 28 ++++++++-------------------- src/storage/tx/ob_tx_log.h | 11 ++++++++--- 3 files changed, 31 insertions(+), 34 deletions(-) diff --git a/src/storage/tx/ob_trans_part_ctx.cpp b/src/storage/tx/ob_trans_part_ctx.cpp index f3267bad2..3c7328d20 100644 --- a/src/storage/tx/ob_trans_part_ctx.cpp +++ b/src/storage/tx/ob_trans_part_ctx.cpp @@ -2910,12 +2910,13 @@ int ObPartTransCtx::submit_commit_log_() bool redo_log_submitted = false; if (OB_SUCC(ret)) { - const ObTxData *tx_data = NULL; - auto guard = ctx_tx_data_.get_tx_data(); - if (OB_FAIL(guard.get_tx_data(tx_data))) { - TRANS_LOG(WARN, "get tx data failed", K(ret)); - } else if (OB_FAIL(commit_log.init_tx_data_backup(tx_data))) { + if (OB_FAIL(commit_log.init_tx_data_backup(ctx_tx_data_.get_start_log_ts()))) { TRANS_LOG(WARN, "init tx data backup failed", K(ret)); + } else if (exec_info_.redo_lsns_.count() > 0 || exec_info_.max_applying_log_ts_.is_valid()) { + if (!commit_log.get_backup_start_scn().is_valid()) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(WARN, "unexpected start scn in commit log", K(ret), K(commit_log), KPC(this)); + } } } @@ -3054,12 +3055,15 @@ int ObPartTransCtx::submit_abort_log_() ObTxAbortLog abort_log(tmp_array); if (OB_SUCC(ret)) { - const ObTxData *tx_data = NULL; - auto guard = ctx_tx_data_.get_tx_data(); - if (OB_FAIL(guard.get_tx_data(tx_data))) { - TRANS_LOG(WARN, "get tx data failed", K(ret)); - } else if (OB_FAIL(abort_log.init_tx_data_backup(tx_data))) { - TRANS_LOG(WARN, "init tx data backup failed", K(ret)); + if (OB_SUCC(ret)) { + if (OB_FAIL(abort_log.init_tx_data_backup(ctx_tx_data_.get_start_log_ts()))) { + TRANS_LOG(WARN, "init tx data backup failed", K(ret)); + } else if (exec_info_.redo_lsns_.count() > 0 || exec_info_.max_applying_log_ts_.is_valid()) { + if (!abort_log.get_backup_start_scn().is_valid()) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(WARN, "unexpected start scn in commit log", K(ret), K(abort_log), KPC(this)); + } + } } } diff --git a/src/storage/tx/ob_tx_log.cpp b/src/storage/tx/ob_tx_log.cpp index 736552fed..93d0c54fb 100644 --- a/src/storage/tx/ob_tx_log.cpp +++ b/src/storage/tx/ob_tx_log.cpp @@ -937,34 +937,22 @@ int ObTxMultiDataSourceLog::ob_admin_dump(ObAdminMutatorStringArg &arg) return ret; } -ObTxDataBackup::ObTxDataBackup() -{ - reset(); -} +ObTxDataBackup::ObTxDataBackup() { reset(); } -int ObTxDataBackup::init(const storage::ObTxData *const tx_data) +int ObTxDataBackup::init(const share::SCN &start_scn) { int ret = OB_SUCCESS; - if (OB_ISNULL(tx_data)) { - ret = OB_INVALID_ARGUMENT; - TRANS_LOG(WARN, "invalid argument", KP(tx_data)); - } else { - start_log_ts_ = tx_data->start_scn_; - } + start_log_ts_ = start_scn; return ret; } -void ObTxDataBackup::reset() -{ - start_log_ts_.reset(); -} +void ObTxDataBackup::reset() { start_log_ts_.reset(); } - -int ObTxCommitLog::init_tx_data_backup(const storage::ObTxData * const tx_data) +int ObTxCommitLog::init_tx_data_backup(const share::SCN &start_scn) { int ret = OB_SUCCESS; - if (OB_FAIL(tx_data_backup_.init(tx_data))) { + if (OB_FAIL(tx_data_backup_.init(start_scn))) { TRANS_LOG(WARN, "init tx_data_backup_ failed", K(ret)); } @@ -972,11 +960,11 @@ int ObTxCommitLog::init_tx_data_backup(const storage::ObTxData * const tx_data) return ret; } -int ObTxAbortLog::init_tx_data_backup(const storage::ObTxData * const tx_data) +int ObTxAbortLog::init_tx_data_backup(const share::SCN &start_scn) { int ret = OB_SUCCESS; - if (OB_FAIL(tx_data_backup_.init(tx_data))) { + if (OB_FAIL(tx_data_backup_.init(start_scn))) { TRANS_LOG(WARN, "init tx_data_backup_ failed", K(ret)); } diff --git a/src/storage/tx/ob_tx_log.h b/src/storage/tx/ob_tx_log.h index 9f27a8908..465d53c2d 100644 --- a/src/storage/tx/ob_tx_log.h +++ b/src/storage/tx/ob_tx_log.h @@ -602,12 +602,13 @@ class ObTxDataBackup public: ObTxDataBackup(); - int init(const storage::ObTxData * const tx_data); + int init(const share::SCN &start_scn); void reset(); share::SCN get_start_log_ts() const { return start_log_ts_; } TO_STRING_KV(K(start_log_ts_)); + private: share::SCN start_log_ts_; }; @@ -653,7 +654,7 @@ public: commit_version_ = commit_version; before_serialize(); } - int init_tx_data_backup(const storage::ObTxData *const tx_data); + int init_tx_data_backup(const share::SCN &start_scn); const ObTxDataBackup &get_tx_data_backup() const { return tx_data_backup_; } share::SCN get_commit_version() const { return commit_version_; } uint64_t get_checksum() const { return checksum_; } @@ -664,6 +665,8 @@ public: const LogOffSet &get_prev_lsn() const { return prev_lsn_; } void set_prev_lsn(const LogOffSet &lsn) { prev_lsn_ = lsn; } + const share::SCN get_backup_start_scn() { return tx_data_backup_.get_start_log_ts(); } + int ob_admin_dump(share::ObAdminMutatorStringArg &arg); static const ObTxLogType LOG_TYPE; @@ -762,10 +765,12 @@ public: } const ObTxBufferNodeArray &get_multi_source_data() const { return multi_source_data_; } - int init_tx_data_backup(const storage::ObTxData *const tx_data); + int init_tx_data_backup(const share::SCN &start_scn); const ObTxDataBackup &get_tx_data_backup() const { return tx_data_backup_; } + const share::SCN get_backup_start_scn() { return tx_data_backup_.get_start_log_ts(); } + int ob_admin_dump(share::ObAdminMutatorStringArg &arg); static const ObTxLogType LOG_TYPE;