[MDS] add check_transfer_in_redo_written() interface on tablet

This commit is contained in:
fengdeyiji
2024-04-10 11:21:48 +00:00
committed by ob-robot
parent 078371afbd
commit 04dc1917c7
10 changed files with 253 additions and 17 deletions

View File

@ -13,6 +13,9 @@
#ifndef DEBUG_FOR_MDS
#define DEBUG_FOR_MDS
#include "lib/ob_errno.h"
#include "storage/multi_data_source/test/common_define.h"
#include "storage/tablet/ob_tablet_create_delete_mds_user_data.h"
#include "storage/tablet/ob_tablet_status.h"
#include <chrono>
#include <thread>
#define TEST_MDS_TRANSACTION
@ -84,6 +87,14 @@ class TestMdsTransactionTest : public ObSimpleClusterTestBase
public:
// 指定case运行目录前缀 test_ob_simple_cluster_
TestMdsTransactionTest() : ObSimpleClusterTestBase("test_mds_transaction_") {}
virtual void SetUp() override {
ObSimpleClusterTestBase::SetUp();
OB_LOGGER.set_log_level("TRACE");
}
virtual void TearDown() override {
OB_LOGGER.set_log_level("WDIAG");
ObSimpleClusterTestBase::TearDown();
}
};
TEST_F(TestMdsTransactionTest, simple_test)
@ -136,9 +147,6 @@ TEST_F(TestMdsTransactionTest, test_for_each_kv_in_unit_in_tablet)
data_2.data_version_ = 2;
data_3.data_version_ = 3;
data_11.data_version_ = 11;
auto mock_equal = [](const ObMediumCompactionInfo &lhs, const ObMediumCompactionInfo &rhs) -> bool {
return lhs.data_version_ == rhs.data_version_;
};
MTL_SWITCH(OB_SYS_TENANT_ID)
{
int64_t _;
@ -180,17 +188,15 @@ TEST_F(TestMdsTransactionTest, test_for_each_kv_in_unit_in_tablet)
TEST_F(TestMdsTransactionTest, test_mds_table_gc_and_recycle)
{
MDS_LOG(INFO, "test_mds_table_gc_and_recycle");
int ret = OB_SUCCESS;
ObTabletBindingMdsUserData data_to_write;
data_to_write.schema_version_ = 1;
data_to_write.snapshot_version_ = 1;
data_to_write.data_tablet_id_ = ObTabletID(2);
data_to_write.hidden_tablet_id_ = ObTabletID(3);
data_to_write.lob_meta_tablet_id_ = ObTabletID(4);
data_to_write.lob_piece_tablet_id_ = ObTabletID(5);
auto mock_equal = [](const ObMediumCompactionInfo &lhs,
const ObMediumCompactionInfo &rhs) -> bool {
return lhs.data_version_ == rhs.data_version_;
};
MTL_SWITCH(OB_SYS_TENANT_ID)
{
int64_t _;
@ -214,7 +220,7 @@ TEST_F(TestMdsTransactionTest, test_mds_table_gc_and_recycle)
// 4. 从ls_id找到ls
storage::ObLSHandle ls_handle;
ASSERT_EQ(OB_SUCCESS, MTL(storage::ObLSService *)->get_ls(ls_id, ls_handle, ObLSGetMod::TRANS_MOD));
// 5. 从LS找到tablet结构
// 5. 从LS找到tablet结构1
storage::ObTabletHandle tablet_handle;
ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tablet(tablet_id, tablet_handle));
// 6. 调用tablet接口写入多源数据,提交
@ -228,13 +234,15 @@ TEST_F(TestMdsTransactionTest, test_mds_table_gc_and_recycle)
// ASSERT_EQ(OB_SUCCESS, static_cast<ObTabletPointer*>(tablet_handle.get_obj()->pointer_hdl_.get_resource_ptr())->mds_table_handler_.mds_table_handle_.get_rec_scn(rec_scn));
// ASSERT_EQ(mock_scn(10), rec_scn);
std::this_thread::sleep_for(std::chrono::seconds(5));
ASSERT_EQ(OB_SUCCESS, tablet_handle.get_obj()->mds_table_flush(share::SCN::max_scn()));
share::SCN max_decided_scn;
ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_max_decided_scn(max_decided_scn));
ASSERT_EQ(OB_SUCCESS, tablet_handle.get_obj()->mds_table_flush(max_decided_scn));
// 7. 检查mds table的存在情况
std::this_thread::sleep_for(std::chrono::seconds(5));
ASSERT_EQ(true, static_cast<ObTabletPointer*>(tablet_handle.get_obj()->pointer_hdl_.get_resource_ptr())->mds_table_handler_.mds_table_handle_.is_valid());
ASSERT_EQ(OB_SUCCESS, static_cast<ObTabletPointer*>(tablet_handle.get_obj()->pointer_hdl_.get_resource_ptr())->mds_table_handler_.mds_table_handle_.get_rec_scn(rec_scn));
ASSERT_EQ(share::SCN::max_scn(), rec_scn);
MDS_LOG(ERROR, "change mock_tablet_oldest_scn", K(tablet_id));
MDS_LOG(INFO, "change mock_tablet_oldest_scn", K(tablet_id));
mock_tablet_oldest_scn = unittest::mock_scn(2074916885902668817);
std::this_thread::sleep_for(std::chrono::seconds(15));
ASSERT_EQ(false, static_cast<ObTabletPointer*>(tablet_handle.get_obj()->pointer_hdl_.get_resource_ptr())->mds_table_handler_.mds_table_handle_.is_valid());
@ -243,6 +251,76 @@ TEST_F(TestMdsTransactionTest, test_mds_table_gc_and_recycle)
OB_ASSERT(data_to_write.schema_version_ == data_to_read.schema_version_);
return OB_SUCCESS;
}));
mock_tablet_oldest_scn = unittest::mock_scn(1000);
}
}
TEST_F(TestMdsTransactionTest, test_mds_table_get_tablet_status_transfer_in_written_state)
{
MDS_LOG(INFO, "test_mds_table_get_tablet_status_transfer_in_written_state");
int ret = OB_SUCCESS;
bool written = false;
ObTabletCreateDeleteMdsUserData data_to_write;
data_to_write.tablet_status_ = ObTabletStatus::TRANSFER_IN;
data_to_write.create_commit_scn_ = mock_scn(10);
data_to_write.create_commit_version_ = 10;
data_to_write.transfer_ls_id_ = ObLSID(10);
data_to_write.transfer_scn_ = mock_scn(10);
MTL_SWITCH(OB_SYS_TENANT_ID)
{
int64_t _;
// 1. 新建一个tablet
ASSERT_EQ(OB_SUCCESS, GCTX.ddl_sql_proxy_->write(OB_SYS_TENANT_ID, "create table test_mds_table3(a int)", _));
// 2. 从表名拿到它的tablet_id
ASSERT_EQ(OB_SUCCESS, ObTableAccessHelper::read_single_row(OB_SYS_TENANT_ID,
{"tablet_id"},
OB_ALL_TABLE_TNAME,
"where table_name = 'test_mds_table3'",
tablet_id));
// 3. 从tablet_id拿到它的ls_id
ObLSID ls_id;
char where_condition[512] = { 0 };
databuff_printf(where_condition, 512, "where tablet_id = %ld", tablet_id.id());
ASSERT_EQ(OB_SUCCESS, ObTableAccessHelper::read_single_row(OB_SYS_TENANT_ID,
{"ls_id"},
OB_ALL_TABLET_TO_LS_TNAME,
where_condition,
ls_id));
// 4. 从ls_id找到ls
storage::ObLSHandle ls_handle;
ASSERT_EQ(OB_SUCCESS, MTL(storage::ObLSService *)->get_ls(ls_id, ls_handle, ObLSGetMod::TRANS_MOD));
// 5. 从LS找到tablet结构
storage::ObTabletHandle tablet_handle;
ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tablet(tablet_id, tablet_handle));
// 6. 调用tablet接口写入多源数据,提交
MdsCtx ctx1(mds::MdsWriter(ObTransID(1)));
share::SCN rec_scn;
ASSERT_EQ(OB_STATE_NOT_MATCH, tablet_handle.get_obj()->check_transfer_in_redo_written(written));// 这个时候因为tablet status不是TRANSFER IN所以查不出来
ASSERT_EQ(OB_SUCCESS, tablet_handle.get_obj()->set(data_to_write, ctx1));
ASSERT_EQ(OB_SUCCESS, tablet_handle.get_obj()->check_transfer_in_redo_written(written));// 这个时候tablet status是TRANSFER IN, 但事务还没写日志,所以可以查出结果,但结果是false
ASSERT_EQ(false, written);
ctx1.single_log_commit(mock_scn(10), mock_scn(10000000));
ASSERT_EQ(OB_SUCCESS, tablet_handle.get_obj()->check_transfer_in_redo_written(written));// 这个时候tablet status是TRANSFER IN, 并且事务已经提交,所以可以查出结果,并且结果是true
ASSERT_EQ(true, written);
ASSERT_EQ(true, static_cast<ObTabletPointer*>(tablet_handle.get_obj()->pointer_hdl_.get_resource_ptr())->mds_table_handler_.mds_table_handle_.is_valid());
std::this_thread::sleep_for(std::chrono::seconds(5));
share::SCN max_decided_scn;
ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_max_decided_scn(max_decided_scn));
ASSERT_EQ(OB_SUCCESS, tablet_handle.get_obj()->mds_table_flush(max_decided_scn));
// 7. 检查mds table的存在情况
std::this_thread::sleep_for(std::chrono::seconds(5));
MDS_LOG(INFO, "print tablet id", K(tablet_id));
ASSERT_EQ(true, static_cast<ObTabletPointer*>(tablet_handle.get_obj()->pointer_hdl_.get_resource_ptr())->mds_table_handler_.mds_table_handle_.is_valid());
ASSERT_EQ(OB_SUCCESS, static_cast<ObTabletPointer*>(tablet_handle.get_obj()->pointer_hdl_.get_resource_ptr())->mds_table_handler_.mds_table_handle_.get_rec_scn(rec_scn));
ASSERT_EQ(share::SCN::max_scn(), rec_scn);
MDS_LOG(INFO, "change mock_tablet_oldest_scn", K(tablet_id));
mock_tablet_oldest_scn = unittest::mock_scn(2074916885902668817);
std::this_thread::sleep_for(std::chrono::seconds(15));
ASSERT_EQ(false, static_cast<ObTabletPointer*>(tablet_handle.get_obj()->pointer_hdl_.get_resource_ptr())->mds_table_handler_.mds_table_handle_.is_valid());// mds table已经释放
ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tablet(tablet_id, tablet_handle));// 重新获取一下tablet handle
ASSERT_EQ(OB_SUCCESS, tablet_handle.get_obj()->check_transfer_in_redo_written(written));// 这个时候tablet status是TRANSFER IN, 并且事务已经提交,所以可以查出结果,并且结果是true
ASSERT_EQ(true, written);
mock_tablet_oldest_scn = unittest::mock_scn(1000);
}
}
@ -261,7 +339,7 @@ int main(int argc, char **argv)
{
int c = 0;
int time_sec = 0;
char *log_level = (char*)"INFO";
char *log_level = (char*)"WDIAG";
while(EOF != (c = getopt(argc,argv,"t:l:"))) {
switch(c) {
case 't':