Skip to content

Commit bc8e660

Browse files
[fix](dynamic partition) drop partition exclude history_partition_num (apache#37539)
FIX: When dropping dynamic partition, PR apache#35778 will use math.max(start, -history_partition_num) as the first partition, but it may delete users' partitions if they specify both start and history_partition_num inappropriately. For safety reason, revert this behavious changed, only use start as the first partition when dropping partitions. For those who had specified a very small start value, drop partitions will catch an exception , and stop dropping this table's partition and then record this error in dynamic info. Users can use command `SHOW DYNAMIC PARTITION TABLES FROM DBXXX` to know this error. From this error, it will give user hint to modify start if they really specify a error start. --------- Co-authored-by: Yongqiang YANG <98214048+dataroaring@users.noreply.github.com>
1 parent d325b43 commit bc8e660

File tree

3 files changed

+29
-13
lines changed

3 files changed

+29
-13
lines changed

fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java

+15-8
Original file line numberDiff line numberDiff line change
@@ -448,8 +448,10 @@ private ArrayList<DropPartitionClause> getDropPartitionClause(Database db, OlapT
448448
return dropPartitionClauses;
449449
}
450450

451-
int realStart = DynamicPartitionUtil.getRealStart(dynamicPartitionProperty.getStart(),
452-
dynamicPartitionProperty.getHistoryPartitionNum());
451+
// drop partition only considering start, not considering history_partition_num.
452+
// int realStart = DynamicPartitionUtil.getRealStart(dynamicPartitionProperty.getStart(),
453+
// dynamicPartitionProperty.getHistoryPartitionNum());
454+
int realStart = dynamicPartitionProperty.getStart();
453455
ZonedDateTime now = ZonedDateTime.now(dynamicPartitionProperty.getTimeZone().toZoneId());
454456
String lowerBorder = DynamicPartitionUtil.getPartitionRangeString(dynamicPartitionProperty,
455457
now, realStart, partitionFormat);
@@ -464,9 +466,12 @@ private ArrayList<DropPartitionClause> getDropPartitionClause(Database db, OlapT
464466
} catch (Exception e) {
465467
// AnalysisException: keys.size is always equal to column.size, cannot reach this exception
466468
// IllegalArgumentException: lb is greater than ub
467-
LOG.warn("Error in gen reservePartitionKeyRange. db: {}, table: {}",
468-
db.getFullName(), olapTable.getName(), e);
469-
recordDropPartitionFailedMsg(db.getFullName(), olapTable.getName(), e.getMessage(), olapTable.getId());
469+
String hint = "'dynamic_partition.start' = " + dynamicPartitionProperty.getStart()
470+
+ ", maybe it's too small, can use alter table sql to increase it. ";
471+
LOG.warn("Error in gen reservePartitionKeyRange. db: {}, table: {}. {}",
472+
db.getFullName(), olapTable.getName(), hint, e);
473+
recordDropPartitionFailedMsg(db.getFullName(), olapTable.getName(), hint + e.getMessage(),
474+
olapTable.getId());
470475
return dropPartitionClauses;
471476
}
472477

@@ -585,10 +590,12 @@ public void executeDynamicPartition(Collection<Pair<Long, Long>> dynamicPartitio
585590
addPartitionClauses = getAddPartitionClause(db, olapTable, partitionColumn, partitionFormat,
586591
executeFirstTime);
587592
}
593+
clearDropPartitionFailedMsg(olapTable.getId());
588594
dropPartitionClauses = getDropPartitionClause(db, olapTable, partitionColumn, partitionFormat);
589595
tableName = olapTable.getName();
590596
} catch (Exception e) {
591-
LOG.warn("has error", e);
597+
LOG.warn("db [{}-{}], table [{}-{}]'s dynamic partition has error",
598+
db.getId(), db.getName(), olapTable.getId(), olapTable.getName(), e);
592599
if (executeFirstTime) {
593600
throw new DdlException(e.getMessage());
594601
}
@@ -602,10 +609,10 @@ public void executeDynamicPartition(Collection<Pair<Long, Long>> dynamicPartitio
602609
}
603610
try {
604611
Env.getCurrentEnv().dropPartition(db, olapTable, dropPartitionClause);
605-
clearDropPartitionFailedMsg(olapTable.getId());
606612
} catch (Exception e) {
607613
recordDropPartitionFailedMsg(db.getFullName(), tableName, e.getMessage(), olapTable.getId());
608-
LOG.warn("has error", e);
614+
LOG.warn("db [{}-{}], table [{}-{}]'s dynamic partition has error",
615+
db.getId(), db.getName(), olapTable.getId(), olapTable.getName(), e);
609616
if (executeFirstTime) {
610617
throw new DdlException(e.getMessage());
611618
}

fe/fe-core/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -744,7 +744,11 @@ public void testFillHistoryDynamicPartition3() throws Exception {
744744
String alter5 = "alter table test.dynamic_partition4 set ('dynamic_partition.history_partition_num' = '3')";
745745
ExceptionChecker.expectThrowsNoException(() -> alterTable(alter5));
746746
Env.getCurrentEnv().getDynamicPartitionScheduler().executeDynamicPartitionFirstTime(db.getId(), tbl4.getId());
747-
Assert.assertEquals(7, tbl4.getPartitionNames().size());
747+
Assert.assertEquals(9, tbl4.getPartitionNames().size());
748+
String dropPartitionErr = Env.getCurrentEnv().getDynamicPartitionScheduler()
749+
.getRuntimeInfo(tbl4.getId(), DynamicPartitionScheduler.DROP_PARTITION_MSG);
750+
Assert.assertTrue(dropPartitionErr.contains("'dynamic_partition.start' = -99999999, maybe it's too small, "
751+
+ "can use alter table sql to increase it."));
748752
}
749753

750754
@Test

regression-test/suites/partition_p0/dynamic_partition/test_dynamic_partition_failed.groovy

+9-4
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
suite('test_dynamic_partition_failed', 'nonConcurrent') {
1919
def old_max_dynamic_partition_num = getFeConfig('max_dynamic_partition_num')
2020
try {
21-
sql 'DROP TABLE IF EXISTS test_dynamic_partition_failed_1'
22-
sql '''CREATE TABLE test_dynamic_partition_failed_1
21+
sql 'DROP TABLE IF EXISTS test_dynamic_partition_failed_ok1 FORCE'
22+
sql '''CREATE TABLE test_dynamic_partition_failed_ok1
2323
( `k1` datetime NULL )
2424
PARTITION BY RANGE (k1)()
2525
DISTRIBUTED BY HASH(`k1`) BUCKETS 1
@@ -36,8 +36,13 @@ suite('test_dynamic_partition_failed', 'nonConcurrent') {
3636
"dynamic_partition.create_history_partition" = "true"
3737
)'''
3838

39-
def partitions = sql_return_maparray "SHOW PARTITIONS FROM test_dynamic_partition_failed_1"
39+
def partitions = sql_return_maparray "SHOW PARTITIONS FROM test_dynamic_partition_failed_ok1"
4040
assertEquals(9, partitions.size());
41+
def dynamicInfo = sql_return_maparray("SHOW DYNAMIC PARTITION TABLES").find { it.TableName == 'test_dynamic_partition_failed_ok1' }
42+
logger.info("table dynamic info: " + dynamicInfo)
43+
assertNotNull(dynamicInfo)
44+
assertTrue(dynamicInfo.LastDropPartitionMsg.contains("'dynamic_partition.start' = -99999999, maybe it's too small, "
45+
+ "can use alter table sql to increase it."))
4146

4247
setFeConfig('max_dynamic_partition_num', Integer.MAX_VALUE)
4348

@@ -96,7 +101,7 @@ suite('test_dynamic_partition_failed', 'nonConcurrent') {
96101
}
97102
} finally {
98103
setFeConfig('max_dynamic_partition_num', old_max_dynamic_partition_num)
99-
sql 'DROP TABLE IF EXISTS test_dynamic_partition_failed_1'
104+
sql 'DROP TABLE IF EXISTS test_dynamic_partition_failed_ok1 FORCE'
100105
sql 'DROP TABLE IF EXISTS test_dynamic_partition_failed_2'
101106
sql 'DROP TABLE IF EXISTS test_dynamic_partition_failed_3'
102107
}

0 commit comments

Comments
 (0)