Merge pull request #23464 from taosdata/enh/TD-26638-3.0
enh: use placeholder '-' for interval of 1st retention level
This commit is contained in:
commit
d40cc27abc
|
@ -451,7 +451,7 @@ typedef struct SRetention {
|
||||||
int8_t keepUnit;
|
int8_t keepUnit;
|
||||||
} SRetention;
|
} SRetention;
|
||||||
|
|
||||||
#define RETENTION_VALID(r) (((r)->freq > 0) && ((r)->keep > 0))
|
#define RETENTION_VALID(l, r) ((((l) == 0 && (r)->freq >= 0) || ((r)->freq > 0)) && ((r)->keep > 0))
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
|
|
||||||
|
@ -1568,9 +1568,7 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t id;
|
int32_t id;
|
||||||
int8_t isMnode;
|
int8_t isMnode;
|
||||||
#ifdef TD_GRANT_HB_OPTIMIZE
|
|
||||||
int8_t offlineReason;
|
int8_t offlineReason;
|
||||||
#endif
|
|
||||||
SEp ep;
|
SEp ep;
|
||||||
char active[TSDB_ACTIVE_KEY_LEN];
|
char active[TSDB_ACTIVE_KEY_LEN];
|
||||||
char connActive[TSDB_CONN_ACTIVE_KEY_LEN];
|
char connActive[TSDB_CONN_ACTIVE_KEY_LEN];
|
||||||
|
|
|
@ -327,7 +327,7 @@ typedef enum ELogicConditionType {
|
||||||
#define TSDB_MAX_DAYS_PER_FILE (3650 * 1440)
|
#define TSDB_MAX_DAYS_PER_FILE (3650 * 1440)
|
||||||
#define TSDB_DEFAULT_DAYS_PER_FILE (10 * 1440)
|
#define TSDB_DEFAULT_DAYS_PER_FILE (10 * 1440)
|
||||||
#define TSDB_MIN_DURATION_PER_FILE 60 // unit minute
|
#define TSDB_MIN_DURATION_PER_FILE 60 // unit minute
|
||||||
#define TSDB_MAX_DURATION_PER_FILE (3650 * 1440)
|
#define TSDB_MAX_DURATION_PER_FILE (90 * 1440)
|
||||||
#define TSDB_DEFAULT_DURATION_PER_FILE (10 * 1440)
|
#define TSDB_DEFAULT_DURATION_PER_FILE (10 * 1440)
|
||||||
#define TSDB_MIN_KEEP (1 * 1440) // data in db to be reserved. unit minute
|
#define TSDB_MIN_KEEP (1 * 1440) // data in db to be reserved. unit minute
|
||||||
#define TSDB_MAX_KEEP (365000 * 1440) // data in db to be reserved.
|
#define TSDB_MAX_KEEP (365000 * 1440) // data in db to be reserved.
|
||||||
|
|
|
@ -137,7 +137,7 @@ static void vmGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) {
|
||||||
SRetention *pRetention = &pCfg->tsdbCfg.retentions[i];
|
SRetention *pRetention = &pCfg->tsdbCfg.retentions[i];
|
||||||
memcpy(pRetention, taosArrayGet(pCreate->pRetensions, i), sizeof(SRetention));
|
memcpy(pRetention, taosArrayGet(pCreate->pRetensions, i), sizeof(SRetention));
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
if ((pRetention->freq > 0 && pRetention->keep > 0)) pCfg->isRsma = 1;
|
if ((pRetention->freq >= 0 && pRetention->keep > 0)) pCfg->isRsma = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -97,11 +97,7 @@ int32_t dmMarkWrapper(SMgmtWrapper *pWrapper);
|
||||||
void dmReleaseWrapper(SMgmtWrapper *pWrapper);
|
void dmReleaseWrapper(SMgmtWrapper *pWrapper);
|
||||||
int32_t dmInitVars(SDnode *pDnode);
|
int32_t dmInitVars(SDnode *pDnode);
|
||||||
void dmClearVars(SDnode *pDnode);
|
void dmClearVars(SDnode *pDnode);
|
||||||
#if defined(TD_MODULE_OPTIMIZE) || !defined(TD_ENTERPRISE)
|
|
||||||
int32_t dmInitModule(SDnode *pDnode, SMgmtWrapper *wrappers);
|
int32_t dmInitModule(SDnode *pDnode, SMgmtWrapper *wrappers);
|
||||||
#else
|
|
||||||
int32_t dmInitModule(SDnode *pDnode);
|
|
||||||
#endif
|
|
||||||
bool dmRequireNode(SDnode *pDnode, SMgmtWrapper *pWrapper);
|
bool dmRequireNode(SDnode *pDnode, SMgmtWrapper *pWrapper);
|
||||||
SMgmtInputOpt dmBuildMgmtInputOpt(SMgmtWrapper *pWrapper);
|
SMgmtInputOpt dmBuildMgmtInputOpt(SMgmtWrapper *pWrapper);
|
||||||
void dmSetStatus(SDnode *pDnode, EDndRunStatus stype);
|
void dmSetStatus(SDnode *pDnode, EDndRunStatus stype);
|
||||||
|
@ -123,11 +119,7 @@ int32_t dmInitStatusClient(SDnode *pDnode);
|
||||||
void dmCleanupClient(SDnode *pDnode);
|
void dmCleanupClient(SDnode *pDnode);
|
||||||
void dmCleanupStatusClient(SDnode *pDnode);
|
void dmCleanupStatusClient(SDnode *pDnode);
|
||||||
SMsgCb dmGetMsgcb(SDnode *pDnode);
|
SMsgCb dmGetMsgcb(SDnode *pDnode);
|
||||||
#if defined(TD_MODULE_OPTIMIZE) || !defined(TD_ENTERPRISE)
|
|
||||||
int32_t dmInitMsgHandle(SDnode *pDnode, SMgmtWrapper *wrappers);
|
int32_t dmInitMsgHandle(SDnode *pDnode, SMgmtWrapper *wrappers);
|
||||||
#else
|
|
||||||
int32_t dmInitMsgHandle(SDnode *pDnode);
|
|
||||||
#endif
|
|
||||||
int32_t dmProcessNodeMsg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg);
|
int32_t dmProcessNodeMsg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg);
|
||||||
|
|
||||||
// dmMonitor.c
|
// dmMonitor.c
|
||||||
|
|
|
@ -66,15 +66,9 @@ int32_t dmInitDnode(SDnode *pDnode) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(TD_MODULE_OPTIMIZE) || !defined(TD_ENTERPRISE)
|
|
||||||
if (dmInitModule(pDnode, pDnode->wrappers) != 0) {
|
if (dmInitModule(pDnode, pDnode->wrappers) != 0) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
if (dmInitModule(pDnode) != 0) {
|
|
||||||
goto _OVER;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
indexInit(tsNumOfCommitThreads);
|
indexInit(tsNumOfCommitThreads);
|
||||||
streamMetaInit();
|
streamMetaInit();
|
||||||
|
@ -113,7 +107,6 @@ void dmCleanupDnode(SDnode *pDnode) {
|
||||||
dDebug("dnode is closed, ptr:%p", pDnode);
|
dDebug("dnode is closed, ptr:%p", pDnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(TD_MODULE_OPTIMIZE) || !defined(TD_ENTERPRISE)
|
|
||||||
int32_t dmInitVars(SDnode *pDnode) {
|
int32_t dmInitVars(SDnode *pDnode) {
|
||||||
SDnodeData *pData = &pDnode->data;
|
SDnodeData *pData = &pDnode->data;
|
||||||
pData->dnodeId = 0;
|
pData->dnodeId = 0;
|
||||||
|
@ -182,7 +175,6 @@ void dmClearVars(SDnode *pDnode) {
|
||||||
taosThreadMutexDestroy(&pDnode->mutex);
|
taosThreadMutexDestroy(&pDnode->mutex);
|
||||||
memset(&pDnode->mutex, 0, sizeof(pDnode->mutex));
|
memset(&pDnode->mutex, 0, sizeof(pDnode->mutex));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
void dmSetStatus(SDnode *pDnode, EDndRunStatus status) {
|
void dmSetStatus(SDnode *pDnode, EDndRunStatus status) {
|
||||||
if (pDnode->status != status) {
|
if (pDnode->status != status) {
|
||||||
|
|
|
@ -251,7 +251,6 @@ _OVER:
|
||||||
dmReleaseWrapper(pWrapper);
|
dmReleaseWrapper(pWrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(TD_MODULE_OPTIMIZE) || !defined(TD_ENTERPRISE)
|
|
||||||
int32_t dmInitMsgHandle(SDnode *pDnode, SMgmtWrapper *wrappers) {
|
int32_t dmInitMsgHandle(SDnode *pDnode, SMgmtWrapper *wrappers) {
|
||||||
SDnodeTrans *pTrans = &pDnode->trans;
|
SDnodeTrans *pTrans = &pDnode->trans;
|
||||||
|
|
||||||
|
@ -277,33 +276,6 @@ int32_t dmInitMsgHandle(SDnode *pDnode, SMgmtWrapper *wrappers) {
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
int32_t dmInitMsgHandle(SDnode *pDnode) {
|
|
||||||
SDnodeTrans *pTrans = &pDnode->trans;
|
|
||||||
|
|
||||||
for (EDndNodeType ntype = DNODE; ntype < NODE_END; ++ntype) {
|
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype];
|
|
||||||
SArray *pArray = (*pWrapper->func.getHandlesFp)();
|
|
||||||
if (pArray == NULL) return -1;
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) {
|
|
||||||
SMgmtHandle *pMgmt = taosArrayGet(pArray, i);
|
|
||||||
SDnodeHandle *pHandle = &pTrans->msgHandles[TMSG_INDEX(pMgmt->msgType)];
|
|
||||||
if (pMgmt->needCheckVgId) {
|
|
||||||
pHandle->needCheckVgId = pMgmt->needCheckVgId;
|
|
||||||
}
|
|
||||||
if (!pMgmt->needCheckVgId) {
|
|
||||||
pHandle->defaultNtype = ntype;
|
|
||||||
}
|
|
||||||
pWrapper->msgFps[TMSG_INDEX(pMgmt->msgType)] = pMgmt->msgFp;
|
|
||||||
}
|
|
||||||
|
|
||||||
taosArrayDestroy(pArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline int32_t dmSendReq(const SEpSet *pEpSet, SRpcMsg *pMsg) {
|
static inline int32_t dmSendReq(const SEpSet *pEpSet, SRpcMsg *pMsg) {
|
||||||
SDnode *pDnode = dmInstance();
|
SDnode *pDnode = dmInstance();
|
||||||
|
|
|
@ -397,9 +397,7 @@ void mndGetDnodeData(SMnode *pMnode, SArray *pDnodeInfo) {
|
||||||
SDnodeInfo dInfo;
|
SDnodeInfo dInfo;
|
||||||
dInfo.id = pDnode->id;
|
dInfo.id = pDnode->id;
|
||||||
dInfo.ep.port = pDnode->port;
|
dInfo.ep.port = pDnode->port;
|
||||||
#ifdef TD_GRANT_HB_OPTIMIZE
|
|
||||||
dInfo.offlineReason = pDnode->offlineReason;
|
dInfo.offlineReason = pDnode->offlineReason;
|
||||||
#endif
|
|
||||||
tstrncpy(dInfo.ep.fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
|
tstrncpy(dInfo.ep.fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
|
||||||
tstrncpy(dInfo.active, pDnode->active, TSDB_ACTIVE_KEY_LEN);
|
tstrncpy(dInfo.active, pDnode->active, TSDB_ACTIVE_KEY_LEN);
|
||||||
tstrncpy(dInfo.connActive, pDnode->connActive, TSDB_CONN_ACTIVE_KEY_LEN);
|
tstrncpy(dInfo.connActive, pDnode->connActive, TSDB_CONN_ACTIVE_KEY_LEN);
|
||||||
|
|
|
@ -31,21 +31,21 @@ static int32_t rsmaRestore(SSma *pSma);
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define SMA_OPEN_RSMA_IMPL(v, l, force) \
|
#define SMA_OPEN_RSMA_IMPL(v, l, force) \
|
||||||
do { \
|
do { \
|
||||||
SRetention *r = (SRetention *)VND_RETENTIONS(v) + l; \
|
SRetention *r = (SRetention *)VND_RETENTIONS(v) + l; \
|
||||||
if (!RETENTION_VALID(r)) { \
|
if (!RETENTION_VALID(l, r)) { \
|
||||||
if (l == 0) { \
|
if (l == 0) { \
|
||||||
code = TSDB_CODE_INVALID_PARA; \
|
code = TSDB_CODE_INVALID_PARA; \
|
||||||
TSDB_CHECK_CODE(code, lino, _exit); \
|
TSDB_CHECK_CODE(code, lino, _exit); \
|
||||||
} \
|
} \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
code = smaSetKeepCfg(v, &keepCfg, pCfg, TSDB_TYPE_RSMA_L##l); \
|
code = smaSetKeepCfg(v, &keepCfg, pCfg, TSDB_TYPE_RSMA_L##l); \
|
||||||
TSDB_CHECK_CODE(code, lino, _exit); \
|
TSDB_CHECK_CODE(code, lino, _exit); \
|
||||||
if (tsdbOpen(v, &SMA_RSMA_TSDB##l(pSma), VNODE_RSMA##l##_DIR, &keepCfg, rollback, force) < 0) { \
|
if (tsdbOpen(v, &SMA_RSMA_TSDB##l(pSma), VNODE_RSMA##l##_DIR, &keepCfg, rollback, force) < 0) { \
|
||||||
code = terrno; \
|
code = terrno; \
|
||||||
TSDB_CHECK_CODE(code, lino, _exit); \
|
TSDB_CHECK_CODE(code, lino, _exit); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -79,20 +79,18 @@ static int32_t smaEvalDays(SVnode *pVnode, SRetention *r, int8_t level, int8_t p
|
||||||
freqDuration = convertTimeFromPrecisionToUnit((r + level)->freq, precision, TIME_UNIT_MINUTE);
|
freqDuration = convertTimeFromPrecisionToUnit((r + level)->freq, precision, TIME_UNIT_MINUTE);
|
||||||
keepDuration = convertTimeFromPrecisionToUnit((r + level)->keep, precision, TIME_UNIT_MINUTE);
|
keepDuration = convertTimeFromPrecisionToUnit((r + level)->keep, precision, TIME_UNIT_MINUTE);
|
||||||
|
|
||||||
int32_t nFreqTimes = (r + level)->freq / (r + TSDB_RETENTION_L0)->freq;
|
int32_t nFreqTimes = (r + level)->freq / (60 * 1000); // use 60s for freq of 1st level
|
||||||
days *= (nFreqTimes > 1 ? nFreqTimes : 1);
|
days *= (nFreqTimes > 1 ? nFreqTimes : 1);
|
||||||
|
|
||||||
if (days > keepDuration) {
|
|
||||||
days = keepDuration;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (days > TSDB_MAX_DURATION_PER_FILE) {
|
|
||||||
days = TSDB_MAX_DURATION_PER_FILE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (days < freqDuration) {
|
if (days < freqDuration) {
|
||||||
days = freqDuration;
|
days = freqDuration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t maxKeepDuration = TMIN(keepDuration, TSDB_MAX_DURATION_PER_FILE);
|
||||||
|
if (days > maxKeepDuration) {
|
||||||
|
days = maxKeepDuration;
|
||||||
|
}
|
||||||
|
|
||||||
_exit:
|
_exit:
|
||||||
smaInfo("vgId:%d, evaluated duration for level %d is %d, raw val:%d", TD_VID(pVnode), level + 1, days, duration);
|
smaInfo("vgId:%d, evaluated duration for level %d is %d, raw val:%d", TD_VID(pVnode), level + 1, days, duration);
|
||||||
return days;
|
return days;
|
||||||
|
@ -157,6 +155,7 @@ int32_t smaOpen(SVnode *pVnode, int8_t rollback, bool force) {
|
||||||
_exit:
|
_exit:
|
||||||
if (code) {
|
if (code) {
|
||||||
smaError("vgId:%d, %s failed at line %d since %s", TD_VID(pVnode), __func__, lino, tstrerror(code));
|
smaError("vgId:%d, %s failed at line %d since %s", TD_VID(pVnode), __func__, lino, tstrerror(code));
|
||||||
|
terrno = code;
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,7 +106,7 @@ int vnodeEncodeConfig(const void *pObj, SJson *pJson) {
|
||||||
if (tjsonAddIntegerToObject(pJson, "keep1", pCfg->tsdbCfg.keep1) < 0) return -1;
|
if (tjsonAddIntegerToObject(pJson, "keep1", pCfg->tsdbCfg.keep1) < 0) return -1;
|
||||||
if (tjsonAddIntegerToObject(pJson, "keep2", pCfg->tsdbCfg.keep2) < 0) return -1;
|
if (tjsonAddIntegerToObject(pJson, "keep2", pCfg->tsdbCfg.keep2) < 0) return -1;
|
||||||
if (tjsonAddIntegerToObject(pJson, "keepTimeOffset", pCfg->tsdbCfg.keepTimeOffset) < 0) return -1;
|
if (tjsonAddIntegerToObject(pJson, "keepTimeOffset", pCfg->tsdbCfg.keepTimeOffset) < 0) return -1;
|
||||||
if (pCfg->tsdbCfg.retentions[0].freq > 0) {
|
if (pCfg->tsdbCfg.retentions[0].keep > 0) {
|
||||||
int32_t nRetention = 1;
|
int32_t nRetention = 1;
|
||||||
if (pCfg->tsdbCfg.retentions[1].freq > 0) {
|
if (pCfg->tsdbCfg.retentions[1].freq > 0) {
|
||||||
++nRetention;
|
++nRetention;
|
||||||
|
|
|
@ -215,37 +215,28 @@ int64_t getValOfDiffPrecision(int8_t unit, int64_t val) {
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* buildRetension(SArray* pRetension) {
|
static char* buildRetension(SArray* pRetension) {
|
||||||
size_t size = taosArrayGetSize(pRetension);
|
size_t size = taosArrayGetSize(pRetension);
|
||||||
if (size == 0) {
|
if (size == 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* p1 = taosMemoryCalloc(1, 100);
|
char* p1 = taosMemoryCalloc(1, 100);
|
||||||
SRetention* p = taosArrayGet(pRetension, 0);
|
|
||||||
|
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
|
|
||||||
int64_t v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
|
for (int32_t i = 0; i < size; ++i) {
|
||||||
int64_t v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
|
SRetention* p = TARRAY_GET_ELEM(pRetension, i);
|
||||||
len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
|
int64_t v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
|
||||||
|
int64_t v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
|
||||||
|
if (i == 0) {
|
||||||
|
len += sprintf(p1 + len, "-:%" PRId64 "%c", v2, p->keepUnit);
|
||||||
|
} else {
|
||||||
|
len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
|
||||||
|
}
|
||||||
|
|
||||||
if (size > 1) {
|
if (i < size - 1) {
|
||||||
len += sprintf(p1 + len, ",");
|
len += sprintf(p1 + len, ",");
|
||||||
p = taosArrayGet(pRetension, 1);
|
}
|
||||||
|
|
||||||
v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
|
|
||||||
v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
|
|
||||||
len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (size > 2) {
|
|
||||||
len += sprintf(p1 + len, ",");
|
|
||||||
p = taosArrayGet(pRetension, 2);
|
|
||||||
|
|
||||||
v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
|
|
||||||
v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
|
|
||||||
len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return p1;
|
return p1;
|
||||||
|
|
|
@ -304,6 +304,7 @@ retention_list(A) ::= retention(B).
|
||||||
retention_list(A) ::= retention_list(B) NK_COMMA retention(C). { A = addNodeToList(pCxt, B, C); }
|
retention_list(A) ::= retention_list(B) NK_COMMA retention(C). { A = addNodeToList(pCxt, B, C); }
|
||||||
|
|
||||||
retention(A) ::= NK_VARIABLE(B) NK_COLON NK_VARIABLE(C). { A = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &B), createDurationValueNode(pCxt, &C)); }
|
retention(A) ::= NK_VARIABLE(B) NK_COLON NK_VARIABLE(C). { A = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &B), createDurationValueNode(pCxt, &C)); }
|
||||||
|
retention(A) ::= NK_MINUS(B) NK_COLON NK_VARIABLE(C). { A = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &B), createDurationValueNode(pCxt, &C)); }
|
||||||
|
|
||||||
%type speed_opt { int32_t }
|
%type speed_opt { int32_t }
|
||||||
%destructor speed_opt { }
|
%destructor speed_opt { }
|
||||||
|
|
|
@ -4605,10 +4605,22 @@ static int32_t checkDbRetentionsOption(STranslateContext* pCxt, SNodeList* pRete
|
||||||
SValueNode* pPrevFreq = NULL;
|
SValueNode* pPrevFreq = NULL;
|
||||||
SValueNode* pPrevKeep = NULL;
|
SValueNode* pPrevKeep = NULL;
|
||||||
SNode* pRetention = NULL;
|
SNode* pRetention = NULL;
|
||||||
|
bool firstFreq = true;
|
||||||
FOREACH(pRetention, pRetentions) {
|
FOREACH(pRetention, pRetentions) {
|
||||||
SNode* pNode = NULL;
|
SNode* pNode = NULL;
|
||||||
FOREACH(pNode, ((SNodeListNode*)pRetention)->pNodeList) {
|
FOREACH(pNode, ((SNodeListNode*)pRetention)->pNodeList) {
|
||||||
SValueNode* pVal = (SValueNode*)pNode;
|
SValueNode* pVal = (SValueNode*)pNode;
|
||||||
|
if (firstFreq) {
|
||||||
|
firstFreq = false;
|
||||||
|
if (pVal->literal[0] != '-' || strlen(pVal->literal) != 1) {
|
||||||
|
return generateSyntaxErrMsgExt(
|
||||||
|
&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION,
|
||||||
|
"Invalid option retentions(freq): %s, the interval of 1st retention level should be '-'", pVal->literal);
|
||||||
|
}
|
||||||
|
pVal->unit = TIME_UNIT_SECOND; // assign minimum unit
|
||||||
|
pVal->datum.i = 0; // assign minimum value
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (DEAL_RES_ERROR == translateValue(pCxt, pVal)) {
|
if (DEAL_RES_ERROR == translateValue(pCxt, pVal)) {
|
||||||
return pCxt->errCode;
|
return pCxt->errCode;
|
||||||
}
|
}
|
||||||
|
@ -4633,7 +4645,7 @@ static int32_t checkDbRetentionsOption(STranslateContext* pCxt, SNodeList* pRete
|
||||||
}
|
}
|
||||||
|
|
||||||
// check value range
|
// check value range
|
||||||
if (pFreq->datum.i <= 0) {
|
if (pPrevFreq != NULL && pFreq->datum.i <= 0) {
|
||||||
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION,
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION,
|
||||||
"Invalid option retentions(freq): %s should larger than 0", pFreq->literal);
|
"Invalid option retentions(freq): %s should larger than 0", pFreq->literal);
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -247,7 +247,11 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
for (int32_t i = 0; i < expect.numOfRetensions; ++i) {
|
for (int32_t i = 0; i < expect.numOfRetensions; ++i) {
|
||||||
SRetention* pReten = (SRetention*)taosArrayGet(req.pRetensions, i);
|
SRetention* pReten = (SRetention*)taosArrayGet(req.pRetensions, i);
|
||||||
SRetention* pExpectReten = (SRetention*)taosArrayGet(expect.pRetensions, i);
|
SRetention* pExpectReten = (SRetention*)taosArrayGet(expect.pRetensions, i);
|
||||||
ASSERT_EQ(pReten->freq, pExpectReten->freq);
|
if(i == 0) {
|
||||||
|
ASSERT_EQ(pReten->freq, 0);
|
||||||
|
} else {
|
||||||
|
ASSERT_EQ(pReten->freq, pExpectReten->freq);
|
||||||
|
}
|
||||||
ASSERT_EQ(pReten->keep, pExpectReten->keep);
|
ASSERT_EQ(pReten->keep, pExpectReten->keep);
|
||||||
ASSERT_EQ(pReten->freqUnit, pExpectReten->freqUnit);
|
ASSERT_EQ(pReten->freqUnit, pExpectReten->freqUnit);
|
||||||
ASSERT_EQ(pReten->keepUnit, pExpectReten->keepUnit);
|
ASSERT_EQ(pReten->keepUnit, pExpectReten->keepUnit);
|
||||||
|
@ -304,7 +308,7 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
"PAGESIZE 8 "
|
"PAGESIZE 8 "
|
||||||
"PRECISION 'ns' "
|
"PRECISION 'ns' "
|
||||||
"REPLICA 3 "
|
"REPLICA 3 "
|
||||||
"RETENTIONS 15s:7d,1m:21d,15m:500d "
|
"RETENTIONS -:7d,1m:21d,15m:500d "
|
||||||
// "STRICT 'on' "
|
// "STRICT 'on' "
|
||||||
"WAL_LEVEL 2 "
|
"WAL_LEVEL 2 "
|
||||||
"VGROUPS 100 "
|
"VGROUPS 100 "
|
||||||
|
@ -340,12 +344,12 @@ TEST_F(ParserInitialCTest, createDatabase) {
|
||||||
TEST_F(ParserInitialCTest, createDatabaseSemanticCheck) {
|
TEST_F(ParserInitialCTest, createDatabaseSemanticCheck) {
|
||||||
useDb("root", "test");
|
useDb("root", "test");
|
||||||
|
|
||||||
run("create database db2 retentions 0s:1d", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("create database db2 retentions -:1d,0s:1d", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
run("create database db2 retentions 10s:0d", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("create database db2 retentions -:0d", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
run("create database db2 retentions 1w:1d", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("create database db2 retentions -:1d,1w:1d", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
run("create database db2 retentions 1w:1n", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("create database db2 retentions -:1n,1w:1d", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
run("create database db2 retentions 15s:7d,15m:21d,10m:500d", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("create database db2 retentions -:7d,15m:21d,10m:500d", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
run("create database db2 retentions 15s:7d,5m:21d,10m:10d", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
run("create database db2 retentions -:7d,5m:21d,10m:10d", TSDB_CODE_PAR_INVALID_DB_OPTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -5,7 +5,7 @@ sleep 50
|
||||||
sql connect
|
sql connect
|
||||||
|
|
||||||
print =============== create database with retentions
|
print =============== create database with retentions
|
||||||
sql create database d0 retentions 5s:7d,10s:21d,15s:365d;
|
sql create database d0 retentions -:7d,10s:21d,15s:365d;
|
||||||
sql use d0
|
sql use d0
|
||||||
|
|
||||||
print =============== create super table and register rsma
|
print =============== create super table and register rsma
|
||||||
|
|
|
@ -8,7 +8,7 @@ sql connect
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
print =============== create database with retentions
|
print =============== create database with retentions
|
||||||
sql create database d0 retentions 5s:7d,5m:21d,15m:365d;
|
sql create database d0 retentions -:7d,5m:21d,15m:365d;
|
||||||
sql use d0
|
sql use d0
|
||||||
|
|
||||||
print =============== create super table and register rsma
|
print =============== create super table and register rsma
|
||||||
|
|
|
@ -47,7 +47,7 @@ endi
|
||||||
|
|
||||||
$replica = 3
|
$replica = 3
|
||||||
$vgroups = 1
|
$vgroups = 1
|
||||||
$retentions = 5s:7d,15s:21d,1m:365d
|
$retentions = -:7d,15s:21d,1m:365d
|
||||||
|
|
||||||
print ============= create database
|
print ============= create database
|
||||||
sql create database db replica $replica vgroups $vgroups retentions $retentions
|
sql create database db replica $replica vgroups $vgroups retentions $retentions
|
||||||
|
|
|
@ -417,7 +417,7 @@ class TDTestCase:
|
||||||
self.all_test()
|
self.all_test()
|
||||||
|
|
||||||
tdLog.printNoPrefix("==========step2:create table in rollup database")
|
tdLog.printNoPrefix("==========step2:create table in rollup database")
|
||||||
tdSql.execute("create database db3 retentions 1s:4m,2s:8m,3s:12m")
|
tdSql.execute("create database db3 retentions -:4m,2s:8m,3s:12m")
|
||||||
tdSql.execute("use db3")
|
tdSql.execute("use db3")
|
||||||
tdSql.query(f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(first) watermark 5s max_delay 1m sma({INT_COL})")
|
tdSql.query(f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(first) watermark 5s max_delay 1m sma({INT_COL})")
|
||||||
|
|
||||||
|
@ -438,7 +438,7 @@ class TDTestCase:
|
||||||
tdSql.execute("drop database if exists db_s20 ")
|
tdSql.execute("drop database if exists db_s20 ")
|
||||||
|
|
||||||
tdLog.printNoPrefix("==========step4:insert and flush in rollup database")
|
tdLog.printNoPrefix("==========step4:insert and flush in rollup database")
|
||||||
tdSql.execute("create database db4 retentions 1s:4m,2s:8m,3s:12m")
|
tdSql.execute("create database db4 retentions -:4m,2s:8m,3s:12m")
|
||||||
tdSql.execute("use db4")
|
tdSql.execute("use db4")
|
||||||
self.__create_tb(rollup="first")
|
self.__create_tb(rollup="first")
|
||||||
self.__insert_data(rollup="first")
|
self.__insert_data(rollup="first")
|
||||||
|
|
|
@ -54,53 +54,63 @@ class TDTestCase:
|
||||||
return [
|
return [
|
||||||
# check grammar
|
# check grammar
|
||||||
"create database db1 retentions",
|
"create database db1 retentions",
|
||||||
"create database db1 retentions 1s:1d,2s:2d,3s:3d,4s:4d",
|
"create database db1 retentions 1s:1d",
|
||||||
|
"create database db1 retentions 1s:1d,2s:2d",
|
||||||
|
"create database db1 retentions 1s:1d,2s:2d,3s:3d",
|
||||||
|
"create database db1 retentions -:1d,2s:2d,3s:3d,4s:4d",
|
||||||
|
"create database db1 retentions -:-",
|
||||||
|
"create database db1 retentions --:1d",
|
||||||
|
"create database db1 retentions +:1d",
|
||||||
|
"create database db1 retentions :1d",
|
||||||
|
"create database db1 retentions -:1d,-:2d",
|
||||||
|
"create database db1 retentions -:1d,1s:-",
|
||||||
|
"create database db1 retentions -:1d,15s:2d,-:3d",
|
||||||
|
|
||||||
# check unit
|
# check unit
|
||||||
"create database db1 retentions 1b:1d",
|
"create database db1 retentions -:1d,1b:1d",
|
||||||
"create database db1 retentions 1u:1d",
|
"create database db1 retentions -:1d,1u:1d",
|
||||||
"create database db1 retentions 1a:1d",
|
"create database db1 retentions -:1d,1a:1d",
|
||||||
"create database db1 retentions 1n:1d",
|
"create database db1 retentions -:1d,1n:1d",
|
||||||
"create database db1 retentions 1y:1d",
|
"create database db1 retentions -:1d,1y:1d",
|
||||||
"create database db1 retentions 1s:86400s",
|
"create database db1 retentions -:1d,1s:86400s",
|
||||||
"create database db1 retentions 1s:86400000a",
|
"create database db1 retentions -:1d,1s:86400000a",
|
||||||
"create database db1 retentions 1s:86400000000u",
|
"create database db1 retentions -:1d,1s:86400000000u",
|
||||||
"create database db1 retentions 1s:86400000000000b",
|
"create database db1 retentions -:1d,1s:86400000000000b",
|
||||||
"create database db1 retentions 1s:1w",
|
"create database db1 retentions -:1d,1s:1w",
|
||||||
"create database db1 retentions 1s:1n",
|
"create database db1 retentions -:1d,1s:1n",
|
||||||
"create database db1 retentions 1s:1y",
|
"create database db1 retentions -:1d,1s:1y",
|
||||||
|
|
||||||
# check value range
|
# check value range
|
||||||
"create database db1 retentions -1s:1d",
|
"create database db3 retentions -:-1d",
|
||||||
"create database db1 retentions 0s:1d",
|
"create database db3 retentions -:0d",
|
||||||
"create database db3 retentions 1s:-1d",
|
"create database db3 retentions -:1439m",
|
||||||
"create database db3 retentions 1s:0d",
|
"create database db3 retentions -:365001d",
|
||||||
"create database db3 retentions 1s:1439m",
|
"create database db3 retentions -:8760001h",
|
||||||
"create database db3 retentions 1s:365001d",
|
"create database db3 retentions -:525600001m",
|
||||||
"create database db3 retentions 1s:8760001h",
|
"create database db3 retentions -:106581d precision 'ns'",
|
||||||
"create database db3 retentions 1s:525600001m",
|
"create database db3 retentions -:2557921h precision 'ns'",
|
||||||
"create database db3 retentions 1s:106581d precision 'ns'",
|
"create database db3 retentions -:153475201m precision 'ns'",
|
||||||
"create database db3 retentions 1s:2557921h precision 'ns'",
|
|
||||||
"create database db3 retentions 1s:153475201m precision 'ns'",
|
|
||||||
# check relationships
|
# check relationships
|
||||||
"create database db5 retentions 1441m:1440m,2d:3d",
|
"create database db5 retentions -:1440m,1441m:1440m,2d:3d",
|
||||||
"create database db5 retentions 2m:1d,1s:2d",
|
"create database db5 retentions -:1d,2m:1d,1s:2d",
|
||||||
"create database db5 retentions 1s:2880m,2s:2879m",
|
"create database db5 retentions -:1440m,1s:2880m,2s:2879m",
|
||||||
"create database db5 retentions 1s:1d,2s:2d,2s:3d",
|
"create database db5 retentions -:1d,2s:2d,2s:3d",
|
||||||
"create database db5 retentions 1s:1d,3s:2d,2s:3d",
|
"create database db5 retentions -:1d,3s:2d,2s:3d",
|
||||||
"create database db1 retentions 1s:1d,2s:3d,3s:2d",
|
"create database db1 retentions -:1d,2s:3d,3s:2d",
|
||||||
]
|
]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def create_databases_sql_current(self):
|
def create_databases_sql_current(self):
|
||||||
return [
|
return [
|
||||||
f"create database {DB1} retentions 1s:1d",
|
f"create database {DB1} retentions -:1d",
|
||||||
f"create database {DB2} retentions 1s:1d,2m:2d,3h:3d",
|
f"create database {DB2} retentions -:1d,2m:2d,3h:3d",
|
||||||
]
|
]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def alter_database_sql(self):
|
def alter_database_sql(self):
|
||||||
return [
|
return [
|
||||||
"alter database db1 retentions 99h:99d",
|
"alter database db1 retentions -:99d",
|
||||||
"alter database db2 retentions 97h:97d,98h:98d,99h:99d,",
|
"alter database db2 retentions -:97d,98h:98d,99h:99d,",
|
||||||
]
|
]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -172,9 +182,17 @@ class TDTestCase:
|
||||||
def test_create_databases(self):
|
def test_create_databases(self):
|
||||||
for err_sql in self.create_databases_sql_err:
|
for err_sql in self.create_databases_sql_err:
|
||||||
tdSql.error(err_sql)
|
tdSql.error(err_sql)
|
||||||
|
index = 0
|
||||||
for cur_sql in self.create_databases_sql_current:
|
for cur_sql in self.create_databases_sql_current:
|
||||||
tdSql.execute(cur_sql)
|
tdSql.execute(cur_sql)
|
||||||
# tdSql.query("select * from information_schema.ins_databases")
|
if(index == 0):
|
||||||
|
tdSql.query(f"show create database {DB1}")
|
||||||
|
else:
|
||||||
|
tdSql.query(f"show create database {DB2}")
|
||||||
|
tdSql.checkEqual(len(tdSql.queryResult),1)
|
||||||
|
tdLog.info("%s" % (tdSql.queryResult[0][1]))
|
||||||
|
tdSql.checkEqual(tdSql.queryResult[0][1].find("RETENTIONS -:") > 0, True)
|
||||||
|
index += 1
|
||||||
for alter_sql in self.alter_database_sql:
|
for alter_sql in self.alter_database_sql:
|
||||||
tdSql.error(alter_sql)
|
tdSql.error(alter_sql)
|
||||||
|
|
||||||
|
@ -281,7 +299,7 @@ class TDTestCase:
|
||||||
|
|
||||||
tdLog.printNoPrefix("==========step2:create table in rollup database")
|
tdLog.printNoPrefix("==========step2:create table in rollup database")
|
||||||
tdLog.printNoPrefix("==========step2.1 : rolluo func is not last/first")
|
tdLog.printNoPrefix("==========step2.1 : rolluo func is not last/first")
|
||||||
tdSql.prepare(dbname=DB3, **{"retentions": "1s:1d, 3s:3d, 5s:5d"})
|
tdSql.prepare(dbname=DB3, **{"retentions": "-:1d, 3s:3d, 5s:5d"})
|
||||||
|
|
||||||
db3_ctb_num = 10
|
db3_ctb_num = 10
|
||||||
self.__create_tb(rsma=True, dbname=DB3, ctb_num=db3_ctb_num, stb=STBNAME)
|
self.__create_tb(rsma=True, dbname=DB3, ctb_num=db3_ctb_num, stb=STBNAME)
|
||||||
|
@ -338,7 +356,7 @@ class TDTestCase:
|
||||||
|
|
||||||
|
|
||||||
tdLog.printNoPrefix("==========step2.2 : rolluo func is last/first")
|
tdLog.printNoPrefix("==========step2.2 : rolluo func is last/first")
|
||||||
tdSql.prepare(dbname=DB4, **{"retentions": "1s:1d, 2m:3d, 3m:5d"})
|
tdSql.prepare(dbname=DB4, **{"retentions": "-:1d, 2m:3d, 3m:5d"})
|
||||||
|
|
||||||
db4_ctb_num = 10
|
db4_ctb_num = 10
|
||||||
tdSql.execute(f"use {DB4}")
|
tdSql.execute(f"use {DB4}")
|
||||||
|
|
|
@ -584,7 +584,7 @@ class TDTestCase:
|
||||||
self.all_test()
|
self.all_test()
|
||||||
|
|
||||||
tdLog.printNoPrefix("==========step2:create table in rollup database")
|
tdLog.printNoPrefix("==========step2:create table in rollup database")
|
||||||
tdSql.execute("create database db3 retentions 1s:4m,2s:8m,3s:12m")
|
tdSql.execute("create database db3 retentions -:4m,2s:8m,3s:12m")
|
||||||
tdSql.execute("use db3")
|
tdSql.execute("use db3")
|
||||||
tdSql.execute(f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(first) watermark 5s max_delay 1m sma({INT_COL}) ")
|
tdSql.execute(f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(first) watermark 5s max_delay 1m sma({INT_COL}) ")
|
||||||
self.all_test()
|
self.all_test()
|
||||||
|
@ -603,7 +603,7 @@ class TDTestCase:
|
||||||
# add for TS-2440
|
# add for TS-2440
|
||||||
for i in range(self.rows):
|
for i in range(self.rows):
|
||||||
tdSql.execute("drop database if exists db3 ")
|
tdSql.execute("drop database if exists db3 ")
|
||||||
tdSql.execute("create database db3 retentions 1s:4m,2s:8m,3s:12m")
|
tdSql.execute("create database db3 retentions -:4m,2s:8m,3s:12m")
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
|
|
Loading…
Reference in New Issue