[MDS] add check_transfer_in_redo_written() interface on tablet
This commit is contained in:
@ -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':
|
||||
|
||||
Reference in New Issue
Block a user