patch 4.0

This commit is contained in:
wangzelin.wzl
2022-10-24 10:34:53 +08:00
parent 4ad6e00ec3
commit 93a1074b0c
10533 changed files with 2588271 additions and 2299373 deletions

View File

@ -14,21 +14,31 @@
#define OB_UNCOMMITTED_TRANS_TEST_H_
#include "lib/hash/ob_hashmap.h"
#include "storage/transaction/ob_trans_service.h"
#include "storage/transaction/ob_trans_part_ctx.h"
#include "storage/tx/ob_trans_service.h"
#include "storage/tx/ob_trans_part_ctx.h"
#include "mockcontainer/mock_ob_iterator.h"
namespace oceanbase {
namespace unittest {
namespace oceanbase
{
namespace unittest
{
class TestUncommittedMinorMergeScan : public transaction::ObPartitionTransCtxMgr {
class TestUncommittedMinorMergeScan : public transaction::ObPartitionTransCtxMgr
{
public:
struct TestTransStatus {
TestTransStatus() : status_(transaction::ObTransTableStatusType::RUNNING), commit_trans_version_(INT64_MAX)
{}
TestTransStatus(transaction::ObTransTableStatusType status, int64_t commit_trans_version)
struct TestTransStatus
{
TestTransStatus()
: status_(transaction::ObTransTableStatusType::RUNNING), commit_trans_version_(INT64_MAX)
{
}
TestTransStatus(
transaction::ObTransTableStatusType status,
int64_t commit_trans_version)
: status_(status), commit_trans_version_(commit_trans_version)
{}
{
}
transaction::ObTransTableStatusType status_;
int64_t commit_trans_version_;
TO_STRING_KV(K_(status), K_(commit_trans_version));
@ -36,9 +46,11 @@ public:
const static int64_t ROLLBACK_SQL_SEQUENCE = 38;
const static int64_t ROLLBACK_SQL_SEQUENCE_2 = 48;
const static int64_t ROLLBACK_SQL_SEQUENCE_3 = 58;
public:
TestUncommittedMinorMergeScan() : peek_flag_(false), input_idx_(0), default_trans_id_(ObAddr(999, 999))
TestUncommittedMinorMergeScan()
: peek_flag_(false),
input_idx_(0),
default_trans_id_(999)
{
int ret = OB_SUCCESS;
if (OB_FAIL(trans_status_map_.create(10, ObModIds::OB_HASH_BUCKET_DAG_MAP))) {
@ -54,68 +66,70 @@ public:
trans_status_map_.destroy();
}
void set_partition_key(const common::ObPartitionKey& partition)
{
partition_ = partition;
}
int get_transaction_status_with_log_ts(const transaction::ObTransID& data_trans_id, const int64_t log_ts,
transaction::ObTransTableStatusType& status, int64_t& trans_version)
int get_transaction_status_with_log_ts(
const transaction::ObTransID &data_trans_id,
const int64_t log_ts,
transaction::ObTransTableStatusType &status,
int64_t &trans_version,
uint64_t &cluster_version) override
{
UNUSEDx(log_ts);
int ret = OB_SUCCESS;
const transaction::ObTransID* trans_id_ptr = &data_trans_id;
const transaction::ObTransID *trans_id_ptr = &data_trans_id;
cluster_version = CLUSTER_VERSION_3200;
if (peek_flag_) {
trans_id_ptr = &default_trans_id_;
}
TestTransStatus* trans_status = nullptr;
if (trans_status_map_.get_refactored(*trans_id_ptr, trans_status)) {
STORAGE_LOG(
WARN, "status is not exists", K(ret), K(data_trans_id), K(trans_status_map_.size()), K(peek_flag_), K(this));
TestTransStatus *trans_status = nullptr;
if (trans_status_map_.get_refactored(*trans_id_ptr, trans_status)){
STORAGE_LOG(WARN, "status is not exists", K(ret), K(data_trans_id),
K(trans_status_map_.size()), K(peek_flag_), K(this));
} else {
status = trans_status->status_;
if (transaction::ObTransTableStatusType::COMMIT == status ||
transaction::ObTransTableStatusType::RUNNING == status) {
if (transaction::ObTransTableStatusType::COMMIT == status
|| transaction::ObTransTableStatusType::RUNNING == status) {
trans_version = trans_status->commit_trans_version_;
} else {
trans_version = INT64_MAX;
}
STORAGE_LOG(INFO, "get trans status", K(data_trans_id), KPC(trans_status), K(this));
STORAGE_LOG(INFO, "get trans status", K(data_trans_id), KPC(trans_status), K(cluster_version), K(this));
}
return ret;
}
// add status for one transaction (transaction rows connot cross micro block)
int add_transaction_status(transaction::ObTransTableStatusType status, int64_t trans_version = INT64_MAX)
int add_transaction_status(
transaction::ObTransTableStatusType status,
int64_t trans_version = INT64_MAX)
{
int ret = OB_SUCCESS;
peek_flag_ = false;
TestTransStatus* trans_status = OB_NEW(TestTransStatus, ObModIds::TEST);
TestTransStatus *trans_status = OB_NEW(TestTransStatus, ObModIds::TEST);
trans_status->status_ = status;
trans_status->commit_trans_version_ = trans_version;
if (OB_FAIL(trans_status_map_.set_refactored(ObMockIteratorBuilder::trans_id_list_[input_idx_], trans_status))) {
STORAGE_LOG(WARN, "push error", K(status), K(trans_version));
if (OB_FAIL(trans_status_map_.set_refactored(
ObMockIteratorBuilder::trans_id_list_[input_idx_], trans_status))) {
STORAGE_LOG(WARN, "push error", K(ret), K(status), K(trans_version));
} else {
STORAGE_LOG(INFO,
"push success",
K(ObMockIteratorBuilder::trans_id_list_[input_idx_]),
K(status),
K(trans_version),
K(this));
STORAGE_LOG(INFO, "push success", K(ObMockIteratorBuilder::trans_id_list_[input_idx_]),
K(status), K(trans_version), K(this));
++input_idx_;
}
return ret;
}
// set status for all transactions
int set_all_transaction_status(transaction::ObTransTableStatusType status, int64_t trans_version = INT64_MAX)
int set_all_transaction_status(
transaction::ObTransTableStatusType status,
int64_t trans_version = INT64_MAX)
{
int ret = OB_SUCCESS;
peek_flag_ = true;
TestTransStatus* trans_status = OB_NEW(TestTransStatus, ObModIds::TEST);
TestTransStatus *trans_status = OB_NEW(TestTransStatus, ObModIds::TEST);
trans_status->status_ = status;
trans_status->commit_trans_version_ = trans_version;
if (OB_FAIL(trans_status_map_.set_refactored(default_trans_id_, trans_status, 1 /*over write*/))) {
if (OB_FAIL(trans_status_map_.set_refactored(
default_trans_id_, trans_status, 1/*over write*/))) {
STORAGE_LOG(WARN, "push error", K(status), K(trans_version));
} else {
STORAGE_LOG(INFO, "push success", K(default_trans_id_), K(status), K(trans_version), K(this));
@ -124,12 +138,15 @@ public:
}
int check_sql_sequence_can_read(
const transaction::ObTransID& data_trans_id, const int64_t sql_sequence, bool& can_read)
const transaction::ObTransID &data_trans_id,
const int64_t sql_sequence,
bool &can_read)
{
int ret = OB_SUCCESS;
UNUSED(data_trans_id);
if (ROLLBACK_SQL_SEQUENCE != sql_sequence && ROLLBACK_SQL_SEQUENCE_2 != sql_sequence &&
ROLLBACK_SQL_SEQUENCE_3 != sql_sequence) {
if (ROLLBACK_SQL_SEQUENCE != sql_sequence
&& ROLLBACK_SQL_SEQUENCE_2 != sql_sequence
&& ROLLBACK_SQL_SEQUENCE_3 != sql_sequence) {
can_read = true;
} else {
can_read = false;
@ -137,17 +154,22 @@ public:
return ret;
}
virtual int lock_for_read(const transaction::ObLockForReadArg& lock_for_read_arg, bool& can_read,
int64_t& trans_version, bool& is_determined_state) override
virtual int lock_for_read(
const transaction::ObLockForReadArg &lock_for_read_arg,
bool &can_read,
int64_t &trans_version,
bool &is_determined_state) override
{
int ret = OB_SUCCESS;
transaction::ObTransTableStatusType status;
uint64_t cluster_version = 0;
transaction::ObTransID data_trans_id = lock_for_read_arg.data_trans_id_;
int32_t data_sql_sequence = lock_for_read_arg.data_sql_sequence_;
if (OB_FAIL(get_transaction_status_with_log_ts(data_trans_id, 0, status, trans_version))) {
if (OB_FAIL(get_transaction_status_with_log_ts(data_trans_id, 0, status, trans_version, cluster_version))) {
STORAGE_LOG(WARN, "failed to clear trans status map", K(ret));
} else if (ROLLBACK_SQL_SEQUENCE != data_sql_sequence && ROLLBACK_SQL_SEQUENCE_2 != data_sql_sequence &&
ROLLBACK_SQL_SEQUENCE_3 != data_sql_sequence) {
} else if (ROLLBACK_SQL_SEQUENCE != data_sql_sequence
&& ROLLBACK_SQL_SEQUENCE_2 != data_sql_sequence
&& ROLLBACK_SQL_SEQUENCE_3 != data_sql_sequence) {
can_read = true;
} else {
can_read = false;
@ -156,6 +178,7 @@ public:
return ret;
}
void clear_all()
{
int ret = OB_SUCCESS;
@ -165,7 +188,6 @@ public:
input_idx_ = 0;
peek_flag_ = false;
}
private:
static const int TRANS_ID_NUM = 10;
typedef common::hash::ObHashMap<transaction::ObTransID, TestTransStatus*> TransStatusMap;
@ -176,6 +198,7 @@ private:
transaction::ObTransID default_trans_id_;
};
} // namespace unittest
} // namespace oceanbase
}
}
#endif