From fb029944a466b0af4fd3af4e79538fe4c567c9aa Mon Sep 17 00:00:00 2001 From: kailixu Date: Wed, 4 Dec 2024 15:46:42 +0800 Subject: [PATCH] feat: auto compact options for db --- include/libs/nodes/cmdnodes.h | 6 +++--- source/dnode/mnode/impl/src/mndDb.c | 8 ++++++++ source/libs/command/src/command.c | 14 ++++++++++---- source/libs/parser/src/parAstCreater.c | 6 +++++- source/libs/parser/src/parTranslater.c | 20 ++++++++++++-------- 5 files changed, 38 insertions(+), 16 deletions(-) diff --git a/include/libs/nodes/cmdnodes.h b/include/libs/nodes/cmdnodes.h index 4f76d00f9b..3f23de8c7d 100644 --- a/include/libs/nodes/cmdnodes.h +++ b/include/libs/nodes/cmdnodes.h @@ -111,13 +111,13 @@ typedef struct SDatabaseOptions { int8_t s3Compact; int8_t withArbitrator; // for auto-compact - SValueNode* pCompactIntervalNode; + int8_t compactTimeOffset; // hours int32_t compactInterval; // minutes - SNodeList* pCompactTimeRangeList; int32_t compactStartTime; // minutes int32_t compactEndTime; // minutes SValueNode* pCompactTimeOffsetNode; - int32_t compactTimeOffset; // hours + SValueNode* pCompactIntervalNode; + SNodeList* pCompactTimeRangeList; } SDatabaseOptions; typedef struct SCreateDatabaseStmt { diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 1c6c54de95..f28de3f11a 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -1416,6 +1416,14 @@ static void mndDumpDbCfgInfo(SDbCfgRsp *cfgRsp, SDbObj *pDb) { cfgRsp->compactInterval = pDb->cfg.compactInterval; cfgRsp->compactStartTime = pDb->cfg.compactStartTime; cfgRsp->compactEndTime = pDb->cfg.compactEndTime; + if (cfgRsp->compactInterval > 0) { + if (cfgRsp->compactStartTime == 0) { + cfgRsp->compactStartTime = -cfgRsp->daysToKeep2; + } + if (cfgRsp->compactEndTime == 0) { + cfgRsp->compactEndTime = -cfgRsp->daysPerFile; + } + } cfgRsp->compactTimeOffset = pDb->cfg.compactTimeOffset; } diff --git a/source/libs/command/src/command.c b/source/libs/command/src/command.c index ae1bcb461e..33c0a2abee 100644 --- a/source/libs/command/src/command.c +++ b/source/libs/command/src/command.c @@ -411,11 +411,17 @@ static int32_t setCreateDBResultIntoDataBlock(SSDataBlock* pBlock, char* dbName, char keep0Str[128] = {0}; char keep1Str[128] = {0}; char keep2Str[128] = {0}; + char compactIntervalStr[13] = {0}; + char compactStartTimeStr[13] = {0}; + char compactEndTimeStr[13] = {0}; int32_t lenDuration = formatDurationOrKeep(durationStr, sizeof(durationStr), pCfg->daysPerFile); int32_t lenKeep0 = formatDurationOrKeep(keep0Str, sizeof(keep0Str), pCfg->daysToKeep0); int32_t lenKeep1 = formatDurationOrKeep(keep1Str, sizeof(keep1Str), pCfg->daysToKeep1); int32_t lenKeep2 = formatDurationOrKeep(keep2Str, sizeof(keep2Str), pCfg->daysToKeep2); + UNUSED(formatDurationOrKeep(compactIntervalStr, sizeof(compactIntervalStr), pCfg->compactInterval)); + UNUSED(formatDurationOrKeep(compactStartTimeStr, sizeof(compactStartTimeStr), pCfg->compactStartTime)); + UNUSED(formatDurationOrKeep(compactEndTimeStr, sizeof(compactEndTimeStr), pCfg->compactEndTime)); if (IS_SYS_DBNAME(dbName)) { len += tsnprintf(buf2 + VARSTR_HEADER_SIZE, SHOW_CREATE_DB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE, @@ -428,15 +434,15 @@ static int32_t setCreateDBResultIntoDataBlock(SSDataBlock* pBlock, char* dbName, "PRECISION '%s' REPLICA %d " "WAL_LEVEL %d VGROUPS %d SINGLE_STABLE %d TABLE_PREFIX %d TABLE_SUFFIX %d TSDB_PAGESIZE %d " "WAL_RETENTION_PERIOD %d WAL_RETENTION_SIZE %" PRId64 - " KEEP_TIME_OFFSET %d ENCRYPT_ALGORITHM '%s' S3_CHUNKPAGES %d S3_KEEPLOCAL %dm S3_COMPACT %d " - "COMPACT_INTERVAL %d COMPACT_TIME_RANGE %d,%d COMPACT_TIME_OFFSET %"PRIi8, + " KEEP_TIME_OFFSET %dh ENCRYPT_ALGORITHM '%s' S3_CHUNKPAGES %d S3_KEEPLOCAL %dm S3_COMPACT %d " + "COMPACT_INTERVAL %s COMPACT_TIME_RANGE %s,%s COMPACT_TIME_OFFSET %"PRIi8 "h", dbName, pCfg->buffer, pCfg->cacheSize, cacheModelStr(pCfg->cacheLast), pCfg->compression, durationStr, pCfg->walFsyncPeriod, pCfg->maxRows, pCfg->minRows, pCfg->sstTrigger, keep0Str, keep1Str, keep2Str, pCfg->pages, pCfg->pageSize, prec, pCfg->replications, pCfg->walLevel, pCfg->numOfVgroups, 1 == pCfg->numOfStables, hashPrefix, pCfg->hashSuffix, pCfg->tsdbPageSize, pCfg->walRetentionPeriod, pCfg->walRetentionSize, pCfg->keepTimeOffset, encryptAlgorithmStr(pCfg->encryptAlgorithm), - pCfg->s3ChunkSize, pCfg->s3KeepLocal, pCfg->s3Compact, pCfg->compactInterval, pCfg->compactStartTime, - pCfg->compactEndTime, pCfg->compactTimeOffset); + pCfg->s3ChunkSize, pCfg->s3KeepLocal, pCfg->s3Compact, compactIntervalStr, compactStartTimeStr, + compactEndTimeStr, pCfg->compactTimeOffset); if (pRetentions) { len += tsnprintf(buf2 + VARSTR_HEADER_SIZE + len, SHOW_CREATE_DB_RESULT_FIELD2_LEN - VARSTR_HEADER_SIZE, diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index 75c3dcf2c4..ffcabca37f 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -2034,7 +2034,11 @@ static SNode* setDatabaseOptionImpl(SAstCreateContext* pCxt, SNode* pOptions, ED pDbOptions->pCompactTimeRangeList = pVal; break; case DB_OPTION_COMPACT_TIME_OFFSET: - pDbOptions->compactTimeOffset = taosStr2Int32(((SToken*)pVal)->z, NULL, 10); + if (TK_NK_INTEGER == ((SToken*)pVal)->type) { + pDbOptions->compactTimeOffset = taosStr2Int32(((SToken*)pVal)->z, NULL, 10); + } else { + pDbOptions->pCompactTimeOffsetNode = (SValueNode*)createDurationValueNode(pCxt, (SToken*)pVal); + } break; default: break; diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 6ebc720aa3..750b80835c 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -8172,15 +8172,19 @@ static int32_t checkDbCompactTimeRangeOption(STranslateContext* pCxt, SDatabaseO } static int32_t checkDbCompactTimeOffsetOption(STranslateContext* pCxt, SDatabaseOptions* pOptions) { - if (pOptions->compactTimeOffset < TSDB_MIN_COMPACT_TIME_OFFSET || - pOptions->compactTimeOffset > TSDB_MAX_COMPACT_TIME_OFFSET) { - return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION, - "Invalid option compact_time_offset: %d" - ", valid range: [%d, %d]", - pOptions->compactTimeOffset, TSDB_MIN_COMPACT_TIME_OFFSET, - TSDB_MAX_COMPACT_TIME_OFFSET); + if (pOptions->pCompactTimeOffsetNode) { + if (DEAL_RES_ERROR == translateValue(pCxt, pOptions->pCompactTimeOffsetNode)) { + return pCxt->errCode; + } + if (TIME_UNIT_HOUR != pOptions->pCompactTimeOffsetNode->unit) { + return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION, + "Invalid option compact_time_offset unit: %c, only %c allowed", + pOptions->pCompactTimeOffsetNode->unit, TIME_UNIT_HOUR); + } + pOptions->compactTimeOffset = getBigintFromValueNode(pOptions->pCompactTimeOffsetNode) / 60; } - return TSDB_CODE_SUCCESS; + return checkDbRangeOption(pCxt, "compact_time_offset", pOptions->compactTimeOffset, TSDB_MIN_COMPACT_TIME_OFFSET, + TSDB_MAX_COMPACT_TIME_OFFSET); } static int32_t checkDatabaseOptions(STranslateContext* pCxt, const char* pDbName, SDatabaseOptions* pOptions) {