From 1dea62d1f6864b30348f5c039206ff2e7ae20c27 Mon Sep 17 00:00:00 2001 From: "sunny.xl" Date: Thu, 19 Dec 2024 17:36:38 +0800 Subject: [PATCH] add ut Signed-off-by: drake_wang --- .../starrocks/lake/StarMgrMetaSyncerTest.java | 118 ++++++++++++++---- 1 file changed, 91 insertions(+), 27 deletions(-) diff --git a/fe/fe-core/src/test/java/com/starrocks/lake/StarMgrMetaSyncerTest.java b/fe/fe-core/src/test/java/com/starrocks/lake/StarMgrMetaSyncerTest.java index 3c4e9a51906588..539d67e785124e 100644 --- a/fe/fe-core/src/test/java/com/starrocks/lake/StarMgrMetaSyncerTest.java +++ b/fe/fe-core/src/test/java/com/starrocks/lake/StarMgrMetaSyncerTest.java @@ -564,14 +564,13 @@ Future deleteTablet(DeleteTabletRequest request) { } @Test - public void testDeleteShardAndShardGroupWithForce() { + public void testDeleteShardAndShardGroupWithForceAndGetShardException() { boolean oldValue = Config.meta_sync_force_delete_shard_meta; Config.meta_sync_force_delete_shard_meta = true; Config.shard_group_clean_threshold_sec = 0; long groupIdToClear = shardGroupId + 1; // build shardGroupInfos List allShardIds = Stream.of(1000L, 1001L, 1002L, 1003L).collect(Collectors.toList()); - int numOfShards = allShardIds.size(); List shardGroupInfos = new ArrayList<>(); ShardGroupInfo info = ShardGroupInfo.newBuilder() .setGroupId(groupIdToClear) @@ -580,7 +579,7 @@ public void testDeleteShardAndShardGroupWithForce() { .build(); shardGroupInfos.add(info); - // iterate 0: get shard info failed, should also delete shards + // case get shard info failed, should also delete shards { new MockUp() { @Mock @@ -607,8 +606,24 @@ public ShardInfo getShardInfo(long shardId, long workerGroupId) throws StarClien Deencapsulation.invoke(starMgrMetaSyncer, "deleteUnusedShardAndShardGroup"); Assert.assertEquals(0, allShardIds.size()); } + } - // iterate 1: delete all shards + @Test + public void testDeleteShardAndShardGroupWithForceAndDeleteException() { + boolean oldValue = Config.meta_sync_force_delete_shard_meta; + Config.meta_sync_force_delete_shard_meta = true; + Config.shard_group_clean_threshold_sec = 0; + long groupIdToClear = shardGroupId + 1; + // build shardGroupInfos + List allShardIds = Stream.of(1000L, 1001L, 1002L, 1003L).collect(Collectors.toList()); + List shardGroupInfos = new ArrayList<>(); + ShardGroupInfo info = ShardGroupInfo.newBuilder() + .setGroupId(groupIdToClear) + .putProperties("createTime", String.valueOf(System.currentTimeMillis() - 86400 * 1000)) + .addAllShardIds(allShardIds) + .build(); + shardGroupInfos.add(info); + // case: delete shards failed, should also delete shards { new MockUp() { @Mock @@ -622,8 +637,8 @@ public List listShard(long groupId) { } @Mock - public void deleteShards(Set shardIds) { - allShardIds.removeAll(shardIds); + public void deleteShards(Set shardIds) throws DdlException { + throw new DdlException("delete shard failed.."); } @Mock @@ -654,32 +669,81 @@ public ShardInfo getShardInfo(long shardId, long workerGroupId) throws StarClien Deencapsulation.invoke(starMgrMetaSyncer, "deleteUnusedShardAndShardGroup"); Assert.assertEquals(0, allShardIds.size()); } + Config.meta_sync_force_delete_shard_meta = oldValue; + } - // iterate 2: delete empty group - { - new MockUp() { + @Test + public void testDeleteShardAndShardGroupWithForce() { + boolean oldValue = Config.meta_sync_force_delete_shard_meta; + Config.meta_sync_force_delete_shard_meta = true; + Config.shard_group_clean_threshold_sec = 0; + long groupIdToClear = shardGroupId + 1; + // build shardGroupInfos + List allShardIds = Stream.of(1000L, 1001L, 1002L, 1003L).collect(Collectors.toList()); + List shardGroupInfos = new ArrayList<>(); + ShardGroupInfo info = ShardGroupInfo.newBuilder() + .setGroupId(groupIdToClear) + .putProperties("createTime", String.valueOf(System.currentTimeMillis() - 86400 * 1000)) + .addAllShardIds(allShardIds) + .build(); + shardGroupInfos.add(info); + // iterate 1: delete all shards + new MockUp() { + @Mock + public List listShardGroup() { + return shardGroupInfos; + } - @Mock - public List listShardGroup() { - return shardGroupInfos; - } + @Mock + public List listShard(long groupId) { + return allShardIds; + } - @Mock - public List listShard(long groupId) { - return Lists.newArrayList(); - } + @Mock + public void deleteShards(Set shardIds) { + allShardIds.removeAll(shardIds); + } - @Mock - public void deleteShardGroup(List groupIds) { - for (long groupId : groupIds) { - shardGroupInfos.removeIf(item -> item.getGroupId() == groupId); - } - } - }; + @Mock + public ShardInfo getShardInfo(long shardId, long workerGroupId) throws StarClientException { + ShardInfo.Builder builder = ShardInfo.newBuilder(); + builder.setShardId(1000L); - Deencapsulation.invoke(starMgrMetaSyncer, "deleteUnusedShardAndShardGroup"); - Assert.assertEquals(0, shardGroupInfos.size()); - } + FilePathInfo.Builder filePathBuilder = FilePathInfo.newBuilder(); + FileStoreInfo.Builder fsBuilder = filePathBuilder.getFsInfoBuilder(); + + S3FileStoreInfo.Builder s3FsBuilder = fsBuilder.getS3FsInfoBuilder(); + s3FsBuilder.setBucket("test-bucket"); + s3FsBuilder.setRegion("test-region"); + + fsBuilder.setFsType(FileStoreType.S3); + fsBuilder.setFsKey("test-bucket"); + fsBuilder.setS3FsInfo(s3FsBuilder.build()); + FileStoreInfo fsInfo = fsBuilder.build(); + + filePathBuilder.setFsInfo(fsInfo); + filePathBuilder.setFullPath("s3://test-bucket/1/"); + + builder.setFilePath(filePathBuilder); + return builder.build(); + } + }; + + Deencapsulation.invoke(starMgrMetaSyncer, "deleteUnusedShardAndShardGroup"); + Assert.assertEquals(0, allShardIds.size()); + + + // iterate 2: delete empty group (shards has been deleted by iterate 1) + new MockUp() { + @Mock + public void deleteShardGroup(List groupIds) throws StarClientException { + for (long groupId : groupIds) { + shardGroupInfos.removeIf(item -> item.getGroupId() == groupId); + } + } + }; + Deencapsulation.invoke(starMgrMetaSyncer, "deleteUnusedShardAndShardGroup"); + Assert.assertEquals(0, shardGroupInfos.size()); Config.meta_sync_force_delete_shard_meta = oldValue; }