check invalid start_scn before appending commit log in palf

This commit is contained in:
obdev 2023-03-07 02:10:40 +00:00 committed by ob-robot
parent 01c567e8e1
commit 71a9cc0c6b
3 changed files with 31 additions and 34 deletions

View File

@ -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));
}
}
}
}

View File

@ -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));
}

View File

@ -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;