Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ddl: Fix rename partitioned table is not atomic #9133

Merged
merged 15 commits into from
Jul 12, 2024
Prev Previous commit
Next Next commit
Add ut
JaySon-Huang committed Jul 11, 2024
commit 01a64e87a0555f059cd006c75167ceaa11baaca1
2 changes: 2 additions & 0 deletions dbms/src/TiDB/Schema/TableIDMap.h
Original file line number Diff line number Diff line change
@@ -76,6 +76,8 @@ struct TableIDMap
return tables;
}

// Return all partition_ids' belonging to the database.
// Note that the normal table or the logical table of partitioned table is excluded.
std::map<TableID, DatabaseID> getAllPartitionsBelongDatabase() const;

bool tableIDInTwoMaps(TableID table_id) const
22 changes: 22 additions & 0 deletions dbms/src/TiDB/Schema/tests/gtest_name_mapper.cpp
Original file line number Diff line number Diff line change
@@ -13,6 +13,7 @@
// limitations under the License.

#include <TiDB/Schema/SchemaNameMapper.h>
#include <TiDB/Schema/TiDB.h>
#include <gtest/gtest.h>

namespace DB::tests
@@ -25,6 +26,27 @@ TEST(SchemaNameMapperTest, ParseDatabaseID)
ASSERT_EQ(10086, *mapper.tryGetDatabaseID("ks_100_db_10086"));
ASSERT_EQ(10086, *mapper.tryGetDatabaseID(mapper.mapDatabaseName(10086, 100)));
ASSERT_FALSE(mapper.tryGetDatabaseID("abcdefg"));
ASSERT_FALSE(mapper.tryGetDatabaseID("db_"));
ASSERT_FALSE(mapper.tryGetDatabaseID("db_abcd"));
ASSERT_FALSE(mapper.tryGetDatabaseID("ks_100_db_"));
ASSERT_FALSE(mapper.tryGetDatabaseID("ks_100_db_abcd"));
}

TEST(SchemaNameMapperTest, ParseTableID)
{
SchemaNameMapper mapper;
ASSERT_EQ(10086, *mapper.tryGetTableID("t_10086"));
ASSERT_EQ(10086, *mapper.tryGetTableID("ks_100_t_10086"));
{
TiDB::TableInfo tbl_info;
tbl_info.id = 10086;
tbl_info.keyspace_id = 100;
ASSERT_EQ(10086, *mapper.tryGetTableID(mapper.mapTableName(tbl_info)));
}
ASSERT_FALSE(mapper.tryGetTableID("abcdefg"));
ASSERT_FALSE(mapper.tryGetTableID("t_"));
ASSERT_FALSE(mapper.tryGetTableID("t_abcd"));
ASSERT_FALSE(mapper.tryGetTableID("ks_100_t_"));
ASSERT_FALSE(mapper.tryGetTableID("ks_100_t_abcd"));
}
} // namespace DB::tests
42 changes: 42 additions & 0 deletions dbms/src/TiDB/Schema/tests/gtest_table_id_map.cpp
Original file line number Diff line number Diff line change
@@ -81,6 +81,12 @@ TEST_F(TableIDMapTest, Basic)
// broken state, physical_table_id -> logical_table_id, but no logical_table_id -> database_id
mapping.emplacePartitionTableID(901, 900);
ASSERT_MAPPING_EQ(std::make_tuple(false, 0, 0), mapping.findDatabaseIDAndLogicalTableID(901));

const auto p_to_db = mapping.getAllPartitionsBelongDatabase();
EXPECT_EQ(p_to_db.size(), 3);
EXPECT_EQ(p_to_db.at(101), 2);
EXPECT_EQ(p_to_db.at(102), 2);
EXPECT_EQ(p_to_db.at(103), 2);
}

TEST_F(TableIDMapTest, ExchangePartition)
@@ -108,6 +114,15 @@ TEST_F(TableIDMapTest, ExchangePartition)
ASSERT_MAPPING_EQ(std::make_tuple(true, 2, 100), mapping.findDatabaseIDAndLogicalTableID(103));
ASSERT_MAPPING_EQ(std::make_tuple(true, 2, 200), mapping.findDatabaseIDAndLogicalTableID(200));

{
// the mapping of partition_id to database before exchange
const auto p_to_db = mapping.getAllPartitionsBelongDatabase();
EXPECT_EQ(p_to_db.size(), 3);
EXPECT_EQ(p_to_db.at(101), 2);
EXPECT_EQ(p_to_db.at(102), 2);
EXPECT_EQ(p_to_db.at(103), 2);
}

// exchange
mapping.exchangeTablePartition(2, non_partition_table_id, 2, partition_logical_table_id, 101);

@@ -121,6 +136,15 @@ TEST_F(TableIDMapTest, ExchangePartition)
ASSERT_MAPPING_EQ(std::make_tuple(true, 2, 100), mapping.findDatabaseIDAndLogicalTableID(102));
ASSERT_MAPPING_EQ(std::make_tuple(true, 2, 100), mapping.findDatabaseIDAndLogicalTableID(103));
ASSERT_MAPPING_EQ(std::make_tuple(true, 2, 100), mapping.findDatabaseIDAndLogicalTableID(200)); // changed

{
// the mapping of partition_id to database before exchange
const auto p_to_db = mapping.getAllPartitionsBelongDatabase();
EXPECT_EQ(p_to_db.size(), 3);
EXPECT_EQ(p_to_db.at(non_partition_table_id), 2);
EXPECT_EQ(p_to_db.at(102), 2);
EXPECT_EQ(p_to_db.at(103), 2);
}
}

TEST_F(TableIDMapTest, ExchangePartitionCrossDatabase)
@@ -148,6 +172,15 @@ TEST_F(TableIDMapTest, ExchangePartitionCrossDatabase)
ASSERT_MAPPING_EQ(std::make_tuple(true, 2, 100), mapping.findDatabaseIDAndLogicalTableID(103));
ASSERT_MAPPING_EQ(std::make_tuple(true, 7, 200), mapping.findDatabaseIDAndLogicalTableID(200));

{
// the mapping of partition_id to database before exchange
const auto p_to_db = mapping.getAllPartitionsBelongDatabase();
EXPECT_EQ(p_to_db.size(), 3);
EXPECT_EQ(p_to_db.at(101), 2);
EXPECT_EQ(p_to_db.at(102), 2);
EXPECT_EQ(p_to_db.at(103), 2);
}

// exchange
mapping.exchangeTablePartition(7, non_partition_table_id, 2, partition_logical_table_id, 101);

@@ -161,6 +194,15 @@ TEST_F(TableIDMapTest, ExchangePartitionCrossDatabase)
ASSERT_MAPPING_EQ(std::make_tuple(true, 2, 100), mapping.findDatabaseIDAndLogicalTableID(102));
ASSERT_MAPPING_EQ(std::make_tuple(true, 2, 100), mapping.findDatabaseIDAndLogicalTableID(103));
ASSERT_MAPPING_EQ(std::make_tuple(true, 2, 100), mapping.findDatabaseIDAndLogicalTableID(200)); // changed

{
// the mapping of partition_id to database before exchange
const auto p_to_db = mapping.getAllPartitionsBelongDatabase();
EXPECT_EQ(p_to_db.size(), 3);
EXPECT_EQ(p_to_db.at(non_partition_table_id), 2);
EXPECT_EQ(p_to_db.at(102), 2);
EXPECT_EQ(p_to_db.at(103), 2);
}
}

} // namespace DB::tests