Skip to content

Commit bc987bb

Browse files
mergify[bot]wyb
andauthored
[BugFix] Fix invalid database id when recycling partition (backport #59653) (#59666)
Co-authored-by: wyb <[email protected]>
1 parent 9fe9a15 commit bc987bb

File tree

7 files changed

+28
-27
lines changed

7 files changed

+28
-27
lines changed

fe/fe-core/src/main/java/com/starrocks/alter/OnlineOptimizeJobV2.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -469,9 +469,9 @@ private void onTaskFinished(Database db, OlapTable targetTable, OptimizeTask rew
469469
PartitionInfo partitionInfo = targetTable.getPartitionInfo();
470470
if (partitionInfo.isRangePartition() || partitionInfo.getType() == PartitionType.LIST) {
471471
targetTable.replaceTempPartitions(
472-
Arrays.asList(sourcePartitionName), Arrays.asList(tmpPartitionName), true, false);
472+
db.getId(), Arrays.asList(sourcePartitionName), Arrays.asList(tmpPartitionName), true, false);
473473
} else if (partitionInfo instanceof SinglePartitionInfo) {
474-
targetTable.replacePartition(sourcePartitionName, tmpPartitionName);
474+
targetTable.replacePartition(db.getId(), sourcePartitionName, tmpPartitionName);
475475
} else {
476476
throw new AlterCancelException("partition type " + partitionInfo.getType() + " is not supported");
477477
}

fe/fe-core/src/main/java/com/starrocks/alter/OptimizeJobV2.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -482,10 +482,10 @@ private void onFinished(Database db, OlapTable targetTable) throws AlterCancelEx
482482

483483
PartitionInfo partitionInfo = targetTable.getPartitionInfo();
484484
if (partitionInfo.isRangePartition() || partitionInfo.getType() == PartitionType.LIST) {
485-
targetTable.replaceTempPartitions(sourcePartitionNames, tmpPartitionNames, true, false);
485+
targetTable.replaceTempPartitions(db.getId(), sourcePartitionNames, tmpPartitionNames, true, false);
486486
} else if (partitionInfo instanceof SinglePartitionInfo) {
487487
Preconditions.checkState(sourcePartitionNames.size() == 1 && tmpPartitionNames.size() == 1);
488-
targetTable.replacePartition(sourcePartitionNames.get(0), tmpPartitionNames.get(0));
488+
targetTable.replacePartition(db.getId(), sourcePartitionNames.get(0), tmpPartitionNames.get(0));
489489
} else {
490490
throw new AlterCancelException("partition type " + partitionInfo.getType() + " is not supported");
491491
}

fe/fe-core/src/main/java/com/starrocks/catalog/OlapTable.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1472,6 +1472,7 @@ protected RecyclePartitionInfo buildRecyclePartitionInfo(long dbId, Partition pa
14721472
}
14731473

14741474
public void dropPartitionAndReserveTablet(String partitionName) {
1475+
// reserveTablets is true and partition is not recycled, so dbId -1 is ok.
14751476
dropPartition(-1, partitionName, true, true);
14761477
}
14771478

@@ -2193,14 +2194,14 @@ protected OlapTable selectiveCopyInternal(OlapTable copied, Collection<String> r
21932194
*
21942195
* return the old partition.
21952196
*/
2196-
public Partition replacePartition(Partition newPartition) {
2197+
public Partition replacePartition(long dbId, Partition newPartition) {
21972198
Partition oldPartition = nameToPartition.remove(newPartition.getName());
21982199

21992200
// For cloud native table, add partition into recycle Bin after truncate table.
22002201
// It is no necessary for share nothing mode because file will be deleted throught
22012202
// tablet report in this case.
22022203
if (this.isCloudNativeTableOrMaterializedView()) {
2203-
RecyclePartitionInfo recyclePartitionInfo = buildRecyclePartitionInfo(-1, oldPartition);
2204+
RecyclePartitionInfo recyclePartitionInfo = buildRecyclePartitionInfo(dbId, oldPartition);
22042205
recyclePartitionInfo.setRecoverable(false);
22052206
GlobalStateMgr.getCurrentState().getRecycleBin().recyclePartition(recyclePartitionInfo);
22062207
}
@@ -2805,7 +2806,7 @@ public void dropTempPartition(String partitionName, boolean needDropTablet) {
28052806
}
28062807
}
28072808

2808-
public void replaceMatchPartitions(List<String> tempPartitionNames) {
2809+
public void replaceMatchPartitions(long dbId, List<String> tempPartitionNames) {
28092810
for (String partitionName : tempPartitionNames) {
28102811
Partition partition = tempPartitions.getPartition(partitionName);
28112812
if (partition != null) {
@@ -2814,7 +2815,7 @@ public void replaceMatchPartitions(List<String> tempPartitionNames) {
28142815
Partition oldPartition = nameToPartition.get(oldPartitionName);
28152816
if (oldPartition != null) {
28162817
// drop old partition
2817-
dropPartition(-1, oldPartitionName, true);
2818+
dropPartition(dbId, oldPartitionName, true);
28182819
}
28192820
// add new partition
28202821
addPartition(partition);
@@ -2850,7 +2851,7 @@ public void replaceMatchPartitions(List<String> tempPartitionNames) {
28502851
* names are still p1 and p2.
28512852
*
28522853
*/
2853-
public void replaceTempPartitions(List<String> partitionNames, List<String> tempPartitionNames,
2854+
public void replaceTempPartitions(long dbId, List<String> partitionNames, List<String> tempPartitionNames,
28542855
boolean strictRange, boolean useTempPartitionName) throws DdlException {
28552856
if (partitionInfo instanceof RangePartitionInfo) {
28562857
RangePartitionInfo rangeInfo = (RangePartitionInfo) partitionInfo;
@@ -2913,7 +2914,7 @@ public void replaceTempPartitions(List<String> partitionNames, List<String> temp
29132914
// 1. drop old partitions
29142915
for (String partitionName : partitionNames) {
29152916
// This will also drop all tablets of the partition from TabletInvertedIndex
2916-
dropPartition(-1, partitionName, true);
2917+
dropPartition(dbId, partitionName, true);
29172918
}
29182919

29192920
// 2. add temp partitions' range info to rangeInfo, and remove them from
@@ -2942,14 +2943,14 @@ public void replaceTempPartitions(List<String> partitionNames, List<String> temp
29422943

29432944
// used for unpartitioned table in insert overwrite
29442945
// replace partition with temp partition
2945-
public void replacePartition(String sourcePartitionName, String tempPartitionName) {
2946+
public void replacePartition(long dbId, String sourcePartitionName, String tempPartitionName) {
29462947
if (partitionInfo.getType() != PartitionType.UNPARTITIONED) {
29472948
return;
29482949
}
29492950
// drop source partition
29502951
Partition srcPartition = nameToPartition.get(sourcePartitionName);
29512952
if (srcPartition != null) {
2952-
dropPartition(-1, sourcePartitionName, true);
2953+
dropPartition(dbId, sourcePartitionName, true);
29532954
}
29542955

29552956
Partition partition = tempPartitions.getPartition(tempPartitionName);

fe/fe-core/src/main/java/com/starrocks/load/InsertOverwriteJobRunner.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -546,12 +546,12 @@ private void doCommit(boolean isReplay) {
546546
.collect(Collectors.toList()));
547547
}
548548
LOG.info("dynamic overwrite job {} replace tmpPartitionNames:{}", job.getJobId(), tmpPartitionNames);
549-
targetTable.replaceMatchPartitions(tmpPartitionNames);
549+
targetTable.replaceMatchPartitions(dbId, tmpPartitionNames);
550550
} else {
551-
targetTable.replaceTempPartitions(sourcePartitionNames, tmpPartitionNames, true, false);
551+
targetTable.replaceTempPartitions(dbId, sourcePartitionNames, tmpPartitionNames, true, false);
552552
}
553553
} else if (partitionInfo instanceof SinglePartitionInfo) {
554-
targetTable.replacePartition(sourcePartitionNames.get(0), tmpPartitionNames.get(0));
554+
targetTable.replacePartition(dbId, sourcePartitionNames.get(0), tmpPartitionNames.get(0));
555555
} else {
556556
throw new DdlException("partition type " + partitionInfo.getType() + " is not supported");
557557
}

fe/fe-core/src/main/java/com/starrocks/server/LocalMetastore.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4420,7 +4420,7 @@ public void truncateTable(TruncateTableStmt truncateTableStmt, ConnectContext co
44204420
}
44214421

44224422
// replace
4423-
truncateTableInternal(olapTable, newPartitions, truncateEntireTable, false);
4423+
truncateTableInternal(db.getId(), olapTable, newPartitions, truncateEntireTable, false);
44244424

44254425
try {
44264426
colocateTableIndex.updateLakeTableColocationInfo(olapTable, true /* isJoin */,
@@ -4469,12 +4469,12 @@ private void deleteUselessTablets(Set<Long> tabletIdSet) {
44694469
}
44704470
}
44714471

4472-
private void truncateTableInternal(OlapTable olapTable, List<Partition> newPartitions,
4472+
private void truncateTableInternal(long dbId, OlapTable olapTable, List<Partition> newPartitions,
44734473
boolean isEntireTable, boolean isReplay) {
44744474
// use new partitions to replace the old ones.
44754475
Set<Tablet> oldTablets = Sets.newHashSet();
44764476
for (Partition newPartition : newPartitions) {
4477-
Partition oldPartition = olapTable.replacePartition(newPartition);
4477+
Partition oldPartition = olapTable.replacePartition(dbId, newPartition);
44784478
for (PhysicalPartition physicalPartition : oldPartition.getSubPartitions()) {
44794479
// save old tablets to be removed
44804480
for (MaterializedIndex index : physicalPartition.getMaterializedIndices(MaterializedIndex.IndexExtState.ALL)) {
@@ -4509,7 +4509,7 @@ public void replayTruncateTable(TruncateTableInfo info) {
45094509
locker.lockDatabase(db.getId(), LockType.WRITE);
45104510
try {
45114511
OlapTable olapTable = (OlapTable) getTable(db.getId(), info.getTblId());
4512-
truncateTableInternal(olapTable, info.getPartitions(), info.isEntireTable(), true);
4512+
truncateTableInternal(info.getDbId(), olapTable, info.getPartitions(), info.isEntireTable(), true);
45134513

45144514
if (!GlobalStateMgr.isCheckpointThread()) {
45154515
// add tablet to inverted index
@@ -4658,7 +4658,7 @@ public void replaceTempPartition(Database db, String tableName, ReplacePartition
46584658

46594659
partitionNames.stream().forEach(e ->
46604660
GlobalStateMgr.getCurrentState().getAnalyzeMgr().recordDropPartition(olapTable.getPartition(e).getId()));
4661-
olapTable.replaceTempPartitions(partitionNames, tempPartitionNames, isStrictRange, useTempPartitionName);
4661+
olapTable.replaceTempPartitions(db.getId(), partitionNames, tempPartitionNames, isStrictRange, useTempPartitionName);
46624662

46634663
// write log
46644664
ReplacePartitionOperationLog info = new ReplacePartitionOperationLog(db.getId(), olapTable.getId(),
@@ -4684,11 +4684,11 @@ public void replayReplaceTempPartition(ReplacePartitionOperationLog replaceTempP
46844684
return;
46854685
}
46864686
if (replaceTempPartitionLog.isUnPartitionedTable()) {
4687-
olapTable.replacePartition(replaceTempPartitionLog.getPartitions().get(0),
4687+
olapTable.replacePartition(db.getId(), replaceTempPartitionLog.getPartitions().get(0),
46884688
replaceTempPartitionLog.getTempPartitions().get(0));
46894689
return;
46904690
}
4691-
olapTable.replaceTempPartitions(replaceTempPartitionLog.getPartitions(),
4691+
olapTable.replaceTempPartitions(db.getId(), replaceTempPartitionLog.getPartitions(),
46924692
replaceTempPartitionLog.getTempPartitions(),
46934693
replaceTempPartitionLog.isStrictRange(),
46944694
replaceTempPartitionLog.useTempPartitionName());

fe/fe-core/src/test/java/com/starrocks/catalog/ReplaceLakePartitionTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ private void erasePartitionOrTableAndUntilFinished(long id) {
170170
@Test
171171
public void testUnPartitionedLakeTableReplacePartition() {
172172
LakeTable tbl = buildLakeTableWithTempPartition(PartitionType.UNPARTITIONED);
173-
tbl.replacePartition(partitionName, tempPartitionName);
173+
tbl.replacePartition(dbId, partitionName, tempPartitionName);
174174
Assert.assertTrue(GlobalStateMgr.getCurrentState().getRecycleBin().getRecyclePartitionInfo(partitionId) != null);
175175
erasePartitionOrTableAndUntilFinished(partitionId);
176176
Assert.assertTrue(GlobalStateMgr.getCurrentState().getRecycleBin().getRecyclePartitionInfo(partitionId) == null);
@@ -180,7 +180,7 @@ public void testUnPartitionedLakeTableReplacePartition() {
180180
public void testUnPartitionedLakeTableReplacePartitionForTruncateTable() {
181181
LakeTable tbl = buildLakeTableWithTempPartition(PartitionType.UNPARTITIONED);
182182
Partition newPartition = buildPartitionForTruncateTable();
183-
tbl.replacePartition(newPartition);
183+
tbl.replacePartition(dbId, newPartition);
184184
Assert.assertTrue(GlobalStateMgr.getCurrentState().getRecycleBin().getRecyclePartitionInfo(partitionId) != null);
185185
erasePartitionOrTableAndUntilFinished(partitionId);
186186
Assert.assertTrue(GlobalStateMgr.getCurrentState().getRecycleBin().getRecyclePartitionInfo(partitionId) == null);
@@ -190,7 +190,7 @@ public void testUnPartitionedLakeTableReplacePartitionForTruncateTable() {
190190
public void testListPartitionedLakeTableReplacePartitionForTruncateTable() {
191191
LakeTable tbl = buildLakeTableWithTempPartition(PartitionType.LIST);
192192
Partition newPartition = buildPartitionForTruncateTable();
193-
tbl.replacePartition(newPartition);
193+
tbl.replacePartition(dbId, newPartition);
194194
Assert.assertTrue(GlobalStateMgr.getCurrentState().getRecycleBin().getRecyclePartitionInfo(partitionId) != null);
195195
erasePartitionOrTableAndUntilFinished(partitionId);
196196
Assert.assertTrue(GlobalStateMgr.getCurrentState().getRecycleBin().getRecyclePartitionInfo(partitionId) == null);
@@ -200,7 +200,7 @@ public void testListPartitionedLakeTableReplacePartitionForTruncateTable() {
200200
public void testRangePartitionedLakeTableReplacePartitionForTruncateTable() {
201201
LakeTable tbl = buildLakeTableWithTempPartition(PartitionType.RANGE);
202202
Partition newPartition = buildPartitionForTruncateTable();
203-
tbl.replacePartition(newPartition);
203+
tbl.replacePartition(dbId, newPartition);
204204
Assert.assertTrue(GlobalStateMgr.getCurrentState().getRecycleBin().getRecyclePartitionInfo(partitionId) != null);
205205
erasePartitionOrTableAndUntilFinished(partitionId);
206206
Assert.assertTrue(GlobalStateMgr.getCurrentState().getRecycleBin().getRecyclePartitionInfo(partitionId) == null);

fe/fe-core/src/test/java/com/starrocks/server/LocalMetaStoreTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public void testGetNewPartitionsFromPartitions() throws DdlException {
113113
partitionInfo.addPartition(newPartition.getId(), partitionInfo.getDataProperty(sourcePartition.getId()),
114114
partitionInfo.getReplicationNum(sourcePartition.getId()),
115115
partitionInfo.getIsInMemory(sourcePartition.getId()));
116-
olapTable.replacePartition("t1", "t1_100");
116+
olapTable.replacePartition(db.getId(), "t1", "t1_100");
117117

118118
Assert.assertEquals(newPartition.getId(), olapTable.getPartition("t1").getId());
119119
}

0 commit comments

Comments
 (0)