diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index b4f80fa37c..2db148ec98 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -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->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; 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->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; TAOS_RETURN(code); } @@ -1150,20 +1178,24 @@ static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) { code = 0; } + bool compactTimeRangeChanged = false; if (pAlter->compactStartTime != pDb->cfg.compactStartTime && (pAlter->compactStartTime == TSDB_DEFAULT_COMPACT_START_TIME || pAlter->compactStartTime <= -pDb->cfg.daysPerFile)) { pDb->cfg.compactStartTime = pAlter->compactStartTime; - pDb->vgVersion++; + compactTimeRangeChanged = true; code = 0; } if (pAlter->compactEndTime != pDb->cfg.compactEndTime && (pAlter->compactEndTime == TSDB_DEFAULT_COMPACT_END_TIME || pAlter->compactEndTime <= -pDb->cfg.daysPerFile)) { pDb->cfg.compactEndTime = pAlter->compactEndTime; - pDb->vgVersion++; + compactTimeRangeChanged = true; code = 0; } + if(compactTimeRangeChanged) { + pDb->vgVersion++; + } if (pAlter->compactTimeOffset >= TSDB_MIN_COMPACT_TIME_OFFSET && pAlter->compactTimeOffset != pDb->cfg.compactTimeOffset) { diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 2c43059ba0..c4d6571adc 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -8178,7 +8178,6 @@ static int32_t checkOptionsDependency(STranslateContext* pCxt, const char* pDbNa static int32_t checkDbCompactIntervalOption(STranslateContext* pCxt, const char* pDbName, SDatabaseOptions* pOptions) { int32_t code = 0; - int64_t interval = 0; int32_t keep2 = pOptions->keep[2]; 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, TIME_UNIT_DAY); } - interval = getBigintFromValueNode(pOptions->pCompactIntervalNode); + int64_t interval = getBigintFromValueNode(pOptions->pCompactIntervalNode); if (interval != 0) { if (keep2 == -1) { // alter db TAOS_CHECK_RETURN(translateGetDbCfg(pCxt, pDbName, &pOptions->pDbCfg)); keep2 = pOptions->pDbCfg->daysToKeep2; } 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) { - interval = pOptions->compactInterval * 1440; // convert to minutes - if (keep2 == -1) { // alter db + int64_t interval = (int64_t)pOptions->compactInterval * 1440; // convert to minutes + if (keep2 == -1) { // alter db TAOS_CHECK_RETURN(translateGetDbCfg(pCxt, pDbName, &pOptions->pDbCfg)); keep2 = pOptions->pDbCfg->daysToKeep2; } 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; } diff --git a/tests/system-test/0-others/compact_auto.py b/tests/system-test/0-others/compact_auto.py index ea812b3ab7..4cfeec5b62 100644 --- a/tests/system-test/0-others/compact_auto.py +++ b/tests/system-test/0-others/compact_auto.py @@ -19,15 +19,17 @@ class TDTestCase: tdSql.init(conn.cursor(), logSql) self.default_compact_options = [ "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"], - ["db02", "48h", "-87840m,-60", "1h", "2d", "-61d,-60d", "1h"], - ["db03", "2d", "-87840m,-1440h", "12", "2d", "-61d,-60d", "12h"], - ["db04", "2", "-61,-1440h", "23h", "2d", "-61d,-60d", "23h"], + ["db01", "0m", "-2d,-1", "0", "0d", "-2d,-1d", "0h"], + ["db02", "2880m", "-61d,-1", "0", "2d", "-61d,-1d", "0h"], + ["db03", "48h", "-87840m,-60", "1h", "2d", "-61d,-60d", "1h"], + ["db04", "2d", "-87840m,-1440h", "12", "2d", "-61d,-60d", "12h"], + ["db05", "2", "-61,-1440h", "23h", "2d", "-61d,-60d", "23h"], ] def create_db_compact(self): + tdLog.info("create db 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.checkEqual(tdSql.queryResult[0][34], item[4]) tdSql.checkEqual(tdSql.queryResult[0][35], item[5]) @@ -47,11 +49,12 @@ class TDTestCase: break time.sleep(1) 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): + tdLog.info("alter db compact options together") 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.checkEqual(tdSql.queryResult[0][34], self.default_compact_options[0]) tdSql.checkEqual(tdSql.queryResult[0][35], self.default_compact_options[1]) @@ -67,6 +70,51 @@ class TDTestCase: 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]}') 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): compact_err_list = [["compact_time_range 86400m,61d", "Invalid option compact_time_range: 86400m, start time should be in range: [-5256000m, -14400m]"],