test: add test case for auto compact

This commit is contained in:
kailixu 2024-12-29 12:24:15 +08:00
parent 078367d29f
commit 104f37337f
3 changed files with 96 additions and 14 deletions

View File

@ -499,6 +499,19 @@ static int32_t mndCheckDbCfg(SMnode *pMnode, SDbCfg *pCfg) {
if (pCfg->s3KeepLocal < TSDB_MIN_S3_KEEP_LOCAL || pCfg->s3KeepLocal > TSDB_MAX_S3_KEEP_LOCAL) return code; if (pCfg->s3KeepLocal < TSDB_MIN_S3_KEEP_LOCAL || pCfg->s3KeepLocal > TSDB_MAX_S3_KEEP_LOCAL) return code;
if (pCfg->s3Compact < TSDB_MIN_S3_COMPACT || pCfg->s3Compact > TSDB_MAX_S3_COMPACT) return code; if (pCfg->s3Compact < TSDB_MIN_S3_COMPACT || pCfg->s3Compact > TSDB_MAX_S3_COMPACT) return code;
if (pCfg->compactInterval != 0 &&
(pCfg->compactInterval < TSDB_MIN_COMPACT_INTERVAL || pCfg->compactInterval > pCfg->daysToKeep2))
return code;
if (pCfg->compactStartTime != 0 &&
(pCfg->compactStartTime < -pCfg->daysToKeep2 || pCfg->compactStartTime > -pCfg->daysPerFile))
return code;
if (pCfg->compactEndTime != 0 &&
(pCfg->compactEndTime < -pCfg->daysToKeep2 || pCfg->compactEndTime > -pCfg->daysPerFile))
if (pCfg->compactStartTime != 0 && pCfg->compactEndTime != 0 && pCfg->compactStartTime > pCfg->compactEndTime)
return code;
if (pCfg->compactTimeOffset < TSDB_MIN_COMPACT_TIME_OFFSET || pCfg->compactTimeOffset > TSDB_MAX_COMPACT_TIME_OFFSET)
return code;
code = 0; code = 0;
TAOS_RETURN(code); TAOS_RETURN(code);
} }
@ -564,6 +577,21 @@ static int32_t mndCheckInChangeDbCfg(SMnode *pMnode, SDbCfg *pOldCfg, SDbCfg *pN
if (pNewCfg->s3KeepLocal < TSDB_MIN_S3_KEEP_LOCAL || pNewCfg->s3KeepLocal > TSDB_MAX_S3_KEEP_LOCAL) return code; if (pNewCfg->s3KeepLocal < TSDB_MIN_S3_KEEP_LOCAL || pNewCfg->s3KeepLocal > TSDB_MAX_S3_KEEP_LOCAL) return code;
if (pNewCfg->s3Compact < TSDB_MIN_S3_COMPACT || pNewCfg->s3Compact > TSDB_MAX_S3_COMPACT) return code; if (pNewCfg->s3Compact < TSDB_MIN_S3_COMPACT || pNewCfg->s3Compact > TSDB_MAX_S3_COMPACT) return code;
if (pNewCfg->compactInterval != 0 &&
(pNewCfg->compactInterval < TSDB_MIN_COMPACT_INTERVAL || pNewCfg->compactInterval > pNewCfg->daysToKeep2))
return code;
if (pNewCfg->compactStartTime != 0 &&
(pNewCfg->compactStartTime < -pNewCfg->daysToKeep2 || pNewCfg->compactStartTime > -pNewCfg->daysPerFile))
return code;
if (pNewCfg->compactEndTime != 0 &&
(pNewCfg->compactEndTime < -pNewCfg->daysToKeep2 || pNewCfg->compactEndTime > -pNewCfg->daysPerFile))
if (pNewCfg->compactStartTime != 0 && pNewCfg->compactEndTime != 0 &&
pNewCfg->compactStartTime > pNewCfg->compactEndTime)
return code;
if (pNewCfg->compactTimeOffset < TSDB_MIN_COMPACT_TIME_OFFSET ||
pNewCfg->compactTimeOffset > TSDB_MAX_COMPACT_TIME_OFFSET)
return code;
code = 0; code = 0;
TAOS_RETURN(code); TAOS_RETURN(code);
} }
@ -1150,20 +1178,24 @@ static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) {
code = 0; code = 0;
} }
bool compactTimeRangeChanged = false;
if (pAlter->compactStartTime != pDb->cfg.compactStartTime && if (pAlter->compactStartTime != pDb->cfg.compactStartTime &&
(pAlter->compactStartTime == TSDB_DEFAULT_COMPACT_START_TIME || (pAlter->compactStartTime == TSDB_DEFAULT_COMPACT_START_TIME ||
pAlter->compactStartTime <= -pDb->cfg.daysPerFile)) { pAlter->compactStartTime <= -pDb->cfg.daysPerFile)) {
pDb->cfg.compactStartTime = pAlter->compactStartTime; pDb->cfg.compactStartTime = pAlter->compactStartTime;
pDb->vgVersion++; compactTimeRangeChanged = true;
code = 0; code = 0;
} }
if (pAlter->compactEndTime != pDb->cfg.compactEndTime && if (pAlter->compactEndTime != pDb->cfg.compactEndTime &&
(pAlter->compactEndTime == TSDB_DEFAULT_COMPACT_END_TIME || pAlter->compactEndTime <= -pDb->cfg.daysPerFile)) { (pAlter->compactEndTime == TSDB_DEFAULT_COMPACT_END_TIME || pAlter->compactEndTime <= -pDb->cfg.daysPerFile)) {
pDb->cfg.compactEndTime = pAlter->compactEndTime; pDb->cfg.compactEndTime = pAlter->compactEndTime;
pDb->vgVersion++; compactTimeRangeChanged = true;
code = 0; code = 0;
} }
if(compactTimeRangeChanged) {
pDb->vgVersion++;
}
if (pAlter->compactTimeOffset >= TSDB_MIN_COMPACT_TIME_OFFSET && if (pAlter->compactTimeOffset >= TSDB_MIN_COMPACT_TIME_OFFSET &&
pAlter->compactTimeOffset != pDb->cfg.compactTimeOffset) { pAlter->compactTimeOffset != pDb->cfg.compactTimeOffset) {

View File

@ -8178,7 +8178,6 @@ static int32_t checkOptionsDependency(STranslateContext* pCxt, const char* pDbNa
static int32_t checkDbCompactIntervalOption(STranslateContext* pCxt, const char* pDbName, SDatabaseOptions* pOptions) { static int32_t checkDbCompactIntervalOption(STranslateContext* pCxt, const char* pDbName, SDatabaseOptions* pOptions) {
int32_t code = 0; int32_t code = 0;
int64_t interval = 0;
int32_t keep2 = pOptions->keep[2]; int32_t keep2 = pOptions->keep[2];
if (NULL != pOptions->pCompactIntervalNode) { if (NULL != pOptions->pCompactIntervalNode) {
@ -8193,23 +8192,26 @@ static int32_t checkDbCompactIntervalOption(STranslateContext* pCxt, const char*
pOptions->pCompactIntervalNode->unit, TIME_UNIT_MINUTE, TIME_UNIT_HOUR, pOptions->pCompactIntervalNode->unit, TIME_UNIT_MINUTE, TIME_UNIT_HOUR,
TIME_UNIT_DAY); TIME_UNIT_DAY);
} }
interval = getBigintFromValueNode(pOptions->pCompactIntervalNode); int64_t interval = getBigintFromValueNode(pOptions->pCompactIntervalNode);
if (interval != 0) { if (interval != 0) {
if (keep2 == -1) { // alter db if (keep2 == -1) { // alter db
TAOS_CHECK_RETURN(translateGetDbCfg(pCxt, pDbName, &pOptions->pDbCfg)); TAOS_CHECK_RETURN(translateGetDbCfg(pCxt, pDbName, &pOptions->pDbCfg));
keep2 = pOptions->pDbCfg->daysToKeep2; keep2 = pOptions->pDbCfg->daysToKeep2;
} }
code = checkDbRangeOption(pCxt, "compact_interval", interval, TSDB_MIN_COMPACT_INTERVAL, keep2, TIME_UNIT_MINUTE); code = checkDbRangeOption(pCxt, "compact_interval", interval, TSDB_MIN_COMPACT_INTERVAL, keep2, TIME_UNIT_MINUTE);
TAOS_CHECK_RETURN(code);
} }
pOptions->compactInterval = (int32_t)interval;
} else if (pOptions->compactInterval > 0) { } else if (pOptions->compactInterval > 0) {
interval = pOptions->compactInterval * 1440; // convert to minutes int64_t interval = (int64_t)pOptions->compactInterval * 1440; // convert to minutes
if (keep2 == -1) { // alter db if (keep2 == -1) { // alter db
TAOS_CHECK_RETURN(translateGetDbCfg(pCxt, pDbName, &pOptions->pDbCfg)); TAOS_CHECK_RETURN(translateGetDbCfg(pCxt, pDbName, &pOptions->pDbCfg));
keep2 = pOptions->pDbCfg->daysToKeep2; keep2 = pOptions->pDbCfg->daysToKeep2;
} }
code = checkDbRangeOption(pCxt, "compact_interval", interval, TSDB_MIN_COMPACT_INTERVAL, keep2, TIME_UNIT_MINUTE); code = checkDbRangeOption(pCxt, "compact_interval", interval, TSDB_MIN_COMPACT_INTERVAL, keep2, TIME_UNIT_MINUTE);
TAOS_CHECK_RETURN(code);
pOptions->compactInterval = (int32_t)interval;
} }
if (code == 0) pOptions->compactInterval = interval;
return code; return code;
} }

View File

@ -19,15 +19,17 @@ class TDTestCase:
tdSql.init(conn.cursor(), logSql) tdSql.init(conn.cursor(), logSql)
self.default_compact_options = [ "0d", "0d,0d", "0h"] self.default_compact_options = [ "0d", "0d,0d", "0h"]
self.compact_options = [["db00", "0m", "-0d,0", "0", "0d", "0d,0d", "0h"], self.compact_options = [["db00", "0m", "-0d,0", "0", "0d", "0d,0d", "0h"],
["db01", "2880m", "-61d,-60", "0", "2d", "-61d,-60d", "0h"], ["db01", "0m", "-2d,-1", "0", "0d", "-2d,-1d", "0h"],
["db02", "48h", "-87840m,-60", "1h", "2d", "-61d,-60d", "1h"], ["db02", "2880m", "-61d,-1", "0", "2d", "-61d,-1d", "0h"],
["db03", "2d", "-87840m,-1440h", "12", "2d", "-61d,-60d", "12h"], ["db03", "48h", "-87840m,-60", "1h", "2d", "-61d,-60d", "1h"],
["db04", "2", "-61,-1440h", "23h", "2d", "-61d,-60d", "23h"], ["db04", "2d", "-87840m,-1440h", "12", "2d", "-61d,-60d", "12h"],
["db05", "2", "-61,-1440h", "23h", "2d", "-61d,-60d", "23h"],
] ]
def create_db_compact(self): def create_db_compact(self):
tdLog.info("create db compact options")
for item in self.compact_options: for item in self.compact_options:
tdSql.execute(f'create database {item[0]} compact_interval {item[1]} compact_time_range {item[2]} compact_time_offset {item[3]}') tdSql.execute(f'create database {item[0]} compact_interval {item[1]} compact_time_range {item[2]} compact_time_offset {item[3]} duration 1d')
tdSql.query(f'select * from information_schema.ins_databases where name = "{item[0]}"') tdSql.query(f'select * from information_schema.ins_databases where name = "{item[0]}"')
tdSql.checkEqual(tdSql.queryResult[0][34], item[4]) tdSql.checkEqual(tdSql.queryResult[0][34], item[4])
tdSql.checkEqual(tdSql.queryResult[0][35], item[5]) tdSql.checkEqual(tdSql.queryResult[0][35], item[5])
@ -47,11 +49,12 @@ class TDTestCase:
break break
time.sleep(1) time.sleep(1)
if result == False: if result == False:
raise Exception(f"Unexpected result of 'show create database `{db}`':{tdSql.queryResult[0][1]}") raise Exception(f"Unexpected result of 'show create database `{db}`':{tdSql.queryResult[0][1]}, expect:{expectResult}")
def alter_db_compact(self): def alter_db_compact(self):
tdLog.info("alter db compact options together")
for item in self.compact_options: for item in self.compact_options:
tdSql.execute(f'create database {item[0]}') tdSql.execute(f'create database {item[0]} duration 1d')
tdSql.query(f'select * from information_schema.ins_databases where name = "{item[0]}"') tdSql.query(f'select * from information_schema.ins_databases where name = "{item[0]}"')
tdSql.checkEqual(tdSql.queryResult[0][34], self.default_compact_options[0]) tdSql.checkEqual(tdSql.queryResult[0][34], self.default_compact_options[0])
tdSql.checkEqual(tdSql.queryResult[0][35], self.default_compact_options[1]) tdSql.checkEqual(tdSql.queryResult[0][35], self.default_compact_options[1])
@ -67,6 +70,51 @@ class TDTestCase:
for item in self.compact_options: for item in self.compact_options:
self.checkShowCreateWithTimeout(item[0], f'COMPACT_INTERVAL {item[4]} COMPACT_TIME_RANGE {item[5]} COMPACT_TIME_OFFSET {item[6]}') self.checkShowCreateWithTimeout(item[0], f'COMPACT_INTERVAL {item[4]} COMPACT_TIME_RANGE {item[5]} COMPACT_TIME_OFFSET {item[6]}')
tdSql.execute(f'drop database {item[0]}') tdSql.execute(f'drop database {item[0]}')
tdLog.info("alter db compact options separately")
compact_separate_options = [["db100", "0m", "-0d,0", "0", "0d", "0d,0d", "0h"],
["db101", "10m", "-2d,-1", "1", "10m", "-2d,-1d", "1h"]]
index = 0
for item in compact_separate_options:
tdSql.execute(f'create database {item[0]} duration 1d')
tdSql.query(f'select * from information_schema.ins_databases where name = "{item[0]}"')
tdSql.checkEqual(tdSql.queryResult[0][34], self.default_compact_options[0])
tdSql.checkEqual(tdSql.queryResult[0][35], self.default_compact_options[1])
tdSql.checkEqual(tdSql.queryResult[0][36], self.default_compact_options[2])
tdSql.query(f'show create database {item[0]}')
tdSql.checkEqual(tdSql.queryResult[0][0], item[0])
tdSql.checkEqual(True, f'COMPACT_INTERVAL {self.default_compact_options[0]} COMPACT_TIME_RANGE {self.default_compact_options[1]} COMPACT_TIME_OFFSET {self.default_compact_options[2]}' in tdSql.queryResult[0][1])
tdSql.execute(f'alter database {item[0]} compact_time_offset {item[3]}', queryTimes=10)
tdSql.query(f'select * from information_schema.ins_databases where name = "{item[0]}"')
tdSql.checkEqual(tdSql.queryResult[0][34], self.default_compact_options[0])
tdSql.checkEqual(tdSql.queryResult[0][35], self.default_compact_options[1])
tdSql.checkEqual(tdSql.queryResult[0][36], item[6])
self.checkShowCreateWithTimeout(item[0], f'COMPACT_INTERVAL {self.default_compact_options[0]} COMPACT_TIME_RANGE {self.default_compact_options[1]} COMPACT_TIME_OFFSET {item[6]}')
tdSql.execute(f'alter database {item[0]} compact_interval {item[1]}', queryTimes=10)
tdSql.query(f'select * from information_schema.ins_databases where name = "{item[0]}"')
tdSql.checkEqual(tdSql.queryResult[0][34], item[4])
tdSql.checkEqual(tdSql.queryResult[0][35], self.default_compact_options[1])
tdSql.checkEqual(tdSql.queryResult[0][36], item[6])
if index == 0:
self.checkShowCreateWithTimeout(item[0], f'COMPACT_INTERVAL {item[4]} COMPACT_TIME_RANGE {self.default_compact_options[1]} COMPACT_TIME_OFFSET {item[6]}')
else:
self.checkShowCreateWithTimeout(item[0], f'COMPACT_INTERVAL {item[4]} COMPACT_TIME_RANGE -3650d,-1d COMPACT_TIME_OFFSET {item[6]}')
tdSql.execute(f'alter database {item[0]} compact_time_range {item[2]}', queryTimes=10)
tdSql.query(f'select * from information_schema.ins_databases where name = "{item[0]}"')
tdSql.checkEqual(tdSql.queryResult[0][34], item[4])
tdSql.checkEqual(tdSql.queryResult[0][35], item[5])
tdSql.checkEqual(tdSql.queryResult[0][36], item[6])
self.checkShowCreateWithTimeout(item[0], f'COMPACT_INTERVAL {item[4]} COMPACT_TIME_RANGE {item[5]} COMPACT_TIME_OFFSET {item[6]}')
tdSql.execute(f'alter database {item[0]} compact_time_offset {item[3]}', queryTimes=10)
tdSql.query(f'select * from information_schema.ins_databases where name = "{item[0]}"')
tdSql.checkEqual(tdSql.queryResult[0][34], item[4])
tdSql.checkEqual(tdSql.queryResult[0][35], item[5])
tdSql.checkEqual(tdSql.queryResult[0][36], item[6])
self.checkShowCreateWithTimeout(item[0], f'COMPACT_INTERVAL {item[4]} COMPACT_TIME_RANGE {item[5]} COMPACT_TIME_OFFSET {item[6]}')
index += 1
for item in compact_separate_options:
tdSql.execute(f'drop database {item[0]}', queryTimes=10)
def compact_error(self): def compact_error(self):
compact_err_list = [["compact_time_range 86400m,61d", "Invalid option compact_time_range: 86400m, start time should be in range: [-5256000m, -14400m]"], compact_err_list = [["compact_time_range 86400m,61d", "Invalid option compact_time_range: 86400m, start time should be in range: [-5256000m, -14400m]"],